# 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 # . ################################################################## # # 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" } }