#!/usr/bin/awk -f
#
# A simple script that generates loongarch-evolution.h
# from genopts/isa-evolution.in
#
# Copyright (C) 2021-2025 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
# .
BEGIN {
# isa_version_major[]
# isa_version_minor[]
# cpucfg_word[]
# cpucfg_bit_in_word[]
# name_capitalized[]
# comment[]
}
{
cpucfg_word[NR] = $1
cpucfg_bit_in_word[NR] = $2
name[NR] = $3
gsub("-", "_", name[NR])
name_capitalized[NR] = toupper(name[NR])
split($4, isa_ver, "\\.")
isa_version_major[NR] = isa_ver[1]
isa_version_minor[NR] = isa_ver[2]
$1 = $2 = $3 = $4 = ""
sub (/^\s*/, "")
comment[NR] = $0
}
function copyright_header(from_year,to_year)
{
print " Copyright (C) " from_year "-" to_year \
" Free Software Foundation, Inc."
print ""
print "This file is part of GCC."
print ""
print "GCC is free software; you can redistribute it and/or modify"
print "it under the terms of the GNU General Public License as published by"
print "the Free Software Foundation; either version 3, or (at your option)"
print "any later version."
print ""
print "GCC is distributed in the hope that it will be useful,"
print "but WITHOUT ANY WARRANTY; without even the implied warranty of"
print "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"
print "GNU General Public License for more details."
print ""
print "You should have received a copy of the GNU General Public License"
print "along with GCC; see the file COPYING3. If not see"
print "."
}
function gen_cpucfg_map()
{
print "static constexpr struct {"
print " int cpucfg_word;"
print " unsigned int cpucfg_bit;"
print " HOST_WIDE_INT isa_evolution_bit;"
print "} cpucfg_map[] = {"
for (i = 1; i <= NR; i++)
printf (" { %d, 1u << %d, OPTION_MASK_ISA_%s },\n",
cpucfg_word[i], cpucfg_bit_in_word[i], name_capitalized[i])
print "};"
}
function gen_cpucfg_useful_idx()
{
split("0 1 2 16 17 18 19", init_useful_idx)
delete idx_bucket
for (i in init_useful_idx)
idx_bucket[init_useful_idx[i]] = 1
delete init_useful_idx
for (i in cpucfg_word)
idx_bucket[cpucfg_word[i]] = 1
delete idx_list
j = 1
for (i in idx_bucket)
idx_list[j++] = i+0
delete idx_bucket
for (i = 1; i < j; i++) {
t = i
for (k = i + 1; k < j; k++)
t = idx_list[k] < idx_list[t] ? k : t
k = idx_list[t]
idx_list[t] = idx_list[i]
idx_list[i] = k
}
print "static constexpr int cpucfg_useful_idx[] = {"
for (i = 1; i < j; i++)
printf(" %d,\n", idx_list[i])
print "};"
print ""
printf ("static constexpr int N_CPUCFG_WORDS = %d;\n",
idx_list[j - 1] + 1)
delete idx_list
}
function gen_evolution_decl()
{
print "/* ISA evolution features */"
print "enum {"
for (i = 1; i <= NR; i++)
print " EVO_" name_capitalized[i] " = " i - 1 ","
print " N_EVO_FEATURES = " NR
print "};"
print ""
print "/* Condition macros */"
for (i = 1; i <= NR; i++)
printf ("#define ISA_HAS_%s \\\n" \
" (la_target.isa.evolution & OPTION_MASK_ISA_%s)\n",
name_capitalized[i], name_capitalized[i])
print ""
print "/* Bitmasks on la_target.isa.evolution. */"
print "extern int la_evo_feature_masks[N_EVO_FEATURES];"
print ""
print "/* Builtin macro names for the evolution features. */"
print "extern const char* la_evo_macro_name[N_EVO_FEATURES];"
print ""
print "/* The ISA version where a specific feature is introduced. */"
print "extern int la_evo_version_major[N_EVO_FEATURES];"
print "extern int la_evo_version_minor[N_EVO_FEATURES];"
}
function gen_full_header()
{
print "/* Generated automatically by \"genstr\" from \"isa-evolution.in\"."
print " Please do not edit this file directly."
print ""
copyright_header(2023, 2025)
print "*/"
print ""
print "#ifndef LOONGARCH_EVOLUTION_H"
print "#define LOONGARCH_EVOLUTION_H"
print ""
print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)"
print ""
print "#include \"options.h\""
print ""
gen_cpucfg_map()
print ""
gen_cpucfg_useful_idx()
print ""
gen_evolution_decl()
print ""
print "#endif"
print ""
print "#endif /* LOONGARCH_EVOLUTION_H */"
}
function gen_full_source()
{
print "/* Generated automatically by \"genstr\" from \"isa-evolution.in\"."
print " Please do not edit this file directly."
print ""
copyright_header(2023, 2025)
print "*/"
print ""
print "#include \"config.h\""
print "#include \"system.h\""
print "#include \"coretypes.h\""
print "#include \"options.h\""
print ""
print "#include \"loongarch-evolution.h\""
print ""
print "int la_evo_feature_masks[] = {";
for (i = 1; i <= NR; i++)
print " OPTION_MASK_ISA_" name_capitalized[i] ","
print "};"
print ""
print "const char* la_evo_macro_name[] = {";
for (i = 1; i <= NR; i++)
print " \"__loongarch_" name[i] "\","
print "};"
print ""
print "int la_evo_version_major[] = {"
for (i = 1; i <= NR; i++)
print " " isa_version_major[i] ", /* " name_capitalized[i] " */"
print "};"
print ""
print "int la_evo_version_minor[] = {"
for (i = 1; i <= NR; i++)
print " " isa_version_minor[i] ", /* " name_capitalized[i] " */"
print "};"
}
END {
if (header_p)
gen_full_header()
else
gen_full_source()
}