blob: af08f55e3b2eb43c9291cc8bdc6ab5f38c12cdbb [file] [log] [blame]
# Copyright (C) 2016-2021 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
# GCC is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 3, or (at your option) any later
# version.
#
# GCC is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
##################################################################
#
# This file is using AVR's genmultilib.awk idea.
# Transform CPU Information from arc-cpu.def to a
# Representation that is understood by GCC's multilib Machinery.
#
# The Script works as a Filter from STDIN to STDOUT.
#
# FORMAT = "Makefile": Generate Makefile Snipet that sets some
# MULTILIB_* Variables as needed.
#
##################################################################
BEGIN {
FS ="[(, \t)]+"
comment = 1
n_cores = 0
n_reuse = 0
}
##################################################################
# Add some Comments to the generated Files and copy-paste
# Copyright Notice from above.
##################################################################
/^#/ {
if (!comment)
next
else if (comment == 1)
{
if (FORMAT == "Makefile")
{
print "# Auto-generated Makefile Snip"
print "# Generated by : ./gcc/config/arc/genmultilib.awk"
print "# Generated from : ./gcc/config/arc/arc-cpu.def"
print "# Used by : tmake_file from Makefile and genmultilib"
print ""
}
}
comment = 2;
print
}
/^$/ {
# The first empty line stops copy-pasting the GPL comments
# from this file to the generated file.
comment = 0
}
/^ARC_CPU/ {
name = $2
# gsub ("\"", "", name)
if ($4 != "0")
{
arch = $3
if (arch == "6xx")
arch = 601
n = split ($4, cpu_flg, "|")
line = "mcpu." arch
for (i = 1; i <= n; i++)
{
if (cpu_flg[i] == "FL_MPYOPT_0")
line = line "/mmpy-option.0"
else if (cpu_flg[i] == "FL_MPYOPT_1")
line = line "/mmpy-option.1"
else if (cpu_flg[i] == "FL_MPYOPT_2")
line = line "/mmpy-option.2"
else if (cpu_flg[i] == "FL_MPYOPT_3")
line = line "/mmpy-option.3"
else if (cpu_flg[i] == "FL_MPYOPT_4")
line = line "/mmpy-option.4"
else if (cpu_flg[i] == "FL_MPYOPT_5")
line = line "/mmpy-option.5"
else if (cpu_flg[i] == "FL_MPYOPT_6")
line = line "/mmpy-option.6"
else if (cpu_flg[i] == "FL_MPYOPT_7")
line = line "/mmpy-option.7"
else if (cpu_flg[i] == "FL_MPYOPT_8")
line = line "/mmpy-option.8"
else if (cpu_flg[i] == "FL_MPYOPT_9")
line = line "/mmpy-option.9"
else if (cpu_flg[i] == "FL_CD")
line = line "/mcode-density"
else if (cpu_flg[i] == "FL_BS")
line = line "/mbarrel-shifter"
else if (cpu_flg[i] == "FL_DIVREM")
line = line "/mdiv-rem"
else if (cpu_flg[i] == "FL_NORM" \
|| cpu_flg[i] == "FL_SWAP")
line = line "/mnorm"
else if (cpu_flg[i] == "FL_FPU_FPUS")
line = line "/mfpu.fpus"
else if (cpu_flg[i] == "FL_FPU_FPUDA")
line = line "/mfpu.fpuda"
else if (cpu_flg[i] == "FL_FPU_FPUD_ALL")
line = line "/mfpu.fpud_all"
else if (cpu_flg[i] == "FL_LL64")
line = line "/mll64"
else if (cpu_flg[i] == "FL_MUL64")
line = line "/mmul64"
else if (cpu_flg[i] == "FL_MUL32x16")
line = line "/mmul32x16"
else if (cpu_flg[i] == "FL_FPX_QUARK")
line = line "/quark"
else if (cpu_flg[i] == "FL_SPFP")
line = line "/spfp"
else if (cpu_flg[i] == "FL_DPFP")
line = line "/dpfp"
else if (cpu_flg[i] == "FL_RF16")
line = line "/mrf16"
else
{
print "Don't know the flag " cpu_flg[i] > "/dev/stderr"
exit 1
}
}
line = "mcpu." name "=" line
reuse[n_reuse] = line
n_reuse++
}
core = name
cores[n_cores] = core
n_cores++
}
##################################################################
#
# We gathered all the Information, now build/output the following:
#
# awk Variable target Variable FORMAT
# -----------------------------------------------------------
# m_options <-> MULTILIB_OPTIONS Makefile
# m_dirnames <-> MULTILIB_DIRNAMES "
#
##################################################################
END {
m_options = "\nMULTILIB_OPTIONS = "
m_dirnames = "\nMULTILIB_DIRNAMES ="
m_reuse = "\nMULTILIB_REUSE ="
sep = ""
for (c = 0; c < n_cores; c++)
{
m_options = m_options sep "mcpu=" cores[c]
m_dirnames = m_dirnames " " cores[c]
sep = "/"
}
sep = ""
for (c = 0; c < n_reuse; c++)
{
m_reuse = m_reuse sep reuse[c]
sep = "\nMULTILIB_REUSE +="
}
############################################################
# Output that Stuff
############################################################
if (FORMAT == "Makefile")
{
# Intended Target: ./gcc/config/arc/t-multilib
print m_options
print m_dirnames
############################################################
# Legacy Aliases
############################################################
print ""
print "# Aliases:"
print "MULTILIB_MATCHES = mcpu?arc600=mcpu?ARC600"
print "MULTILIB_MATCHES += mcpu?arc600=mARC600"
print "MULTILIB_MATCHES += mcpu?arc600=mA6"
print "MULTILIB_MATCHES += mcpu?arc601=mcpu?ARC601"
print "MULTILIB_MATCHES += mcpu?arc700=mA7"
print "MULTILIB_MATCHES += mcpu?arc700=mARC700"
}
}