Split the implementation of the function loongarch_cpu_cpp_builtins into two parts: 1. Macro definitions that do not change (only considering 64-bit architecture) 2. Macro definitions that change with different compilation options.
gcc/ChangeLog: * config/loongarch/loongarch-c.cc (builtin_undef): New macro. (loongarch_cpu_cpp_builtins): Split to loongarch_update_cpp_builtins and loongarch_define_unconditional_macros. (loongarch_def_or_undef): New functions. (loongarch_define_unconditional_macros): Likewise. (loongarch_update_cpp_builtins): Likewise. Change-Id: Ifae73ffa2a07a595ed2a7f6ab7b82d8f51328a2a --- gcc/config/loongarch/loongarch-c.cc | 122 ++++++++++++++++++---------- 1 file changed, 77 insertions(+), 45 deletions(-) diff --git a/gcc/config/loongarch/loongarch-c.cc b/gcc/config/loongarch/loongarch-c.cc index 5d8c02e094b..9a8de1ec381 100644 --- a/gcc/config/loongarch/loongarch-c.cc +++ b/gcc/config/loongarch/loongarch-c.cc @@ -31,26 +31,22 @@ along with GCC; see the file COPYING3. If not see #define preprocessing_asm_p() (cpp_get_options (pfile)->lang == CLK_ASM) #define builtin_define(TXT) cpp_define (pfile, TXT) +#define builtin_undef(TXT) cpp_undef (pfile, TXT) #define builtin_assert(TXT) cpp_assert (pfile, TXT) -void -loongarch_cpu_cpp_builtins (cpp_reader *pfile) +static void +loongarch_def_or_undef (bool def_p, const char *macro, cpp_reader *pfile) { - builtin_assert ("machine=loongarch"); - builtin_assert ("cpu=loongarch"); - builtin_define ("__loongarch__"); - - builtin_define_with_value ("__loongarch_arch", - loongarch_arch_strings[la_target.cpu_arch], 1); - - builtin_define_with_value ("__loongarch_tune", - loongarch_tune_strings[la_target.cpu_tune], 1); - - builtin_define_with_value ("_LOONGARCH_ARCH", - loongarch_arch_strings[la_target.cpu_arch], 1); + if (def_p) + cpp_define (pfile, macro); + else + cpp_undef (pfile, macro); +} - builtin_define_with_value ("_LOONGARCH_TUNE", - loongarch_tune_strings[la_target.cpu_tune], 1); +static void +loongarch_define_unconditional_macros (cpp_reader *pfile) +{ + builtin_define ("__loongarch__"); /* Base architecture / ABI. */ if (TARGET_64BIT) @@ -66,6 +62,48 @@ loongarch_cpu_cpp_builtins (cpp_reader *pfile) builtin_define ("__loongarch_lp64"); } + /* Add support for FLOAT128_TYPE on the LoongArch architecture. */ + builtin_define ("__FLOAT128_TYPE__"); + + /* Map the old _Float128 'q' builtins into the new 'f128' builtins. */ + builtin_define ("__builtin_fabsq=__builtin_fabsf128"); + builtin_define ("__builtin_copysignq=__builtin_copysignf128"); + builtin_define ("__builtin_nanq=__builtin_nanf128"); + builtin_define ("__builtin_nansq=__builtin_nansf128"); + builtin_define ("__builtin_infq=__builtin_inff128"); + builtin_define ("__builtin_huge_valq=__builtin_huge_valf128"); + + /* Native Data Sizes. */ + builtin_define_with_int_value ("_LOONGARCH_SZINT", INT_TYPE_SIZE); + builtin_define_with_int_value ("_LOONGARCH_SZLONG", LONG_TYPE_SIZE); + builtin_define_with_int_value ("_LOONGARCH_SZPTR", POINTER_SIZE); + builtin_define_with_int_value ("_LOONGARCH_FPSET", 32); + builtin_define_with_int_value ("_LOONGARCH_SPFPSET", 32); +} + +static void +loongarch_update_cpp_builtins (cpp_reader *pfile) +{ + /* Since the macros in this function might be redefined, it's necessary to + undef them first.*/ + builtin_undef ("__loongarch_arch"); + builtin_define_with_value ("__loongarch_arch", + loongarch_arch_strings[la_target.cpu_arch], 1); + + builtin_undef ("__loongarch_tune"); + builtin_define_with_value ("__loongarch_tune", + loongarch_tune_strings[la_target.cpu_tune], 1); + + builtin_undef ("_LOONGARCH_ARCH"); + builtin_define_with_value ("_LOONGARCH_ARCH", + loongarch_arch_strings[la_target.cpu_arch], 1); + + builtin_undef ("_LOONGARCH_TUNE"); + builtin_define_with_value ("_LOONGARCH_TUNE", + loongarch_tune_strings[la_target.cpu_tune], 1); + + builtin_undef ("__loongarch_double_float"); + builtin_undef ("__loongarch_single_float"); /* These defines reflect the ABI in use, not whether the FPU is directly accessible. */ if (TARGET_DOUBLE_FLOAT_ABI) @@ -73,6 +111,8 @@ loongarch_cpu_cpp_builtins (cpp_reader *pfile) else if (TARGET_SINGLE_FLOAT_ABI) builtin_define ("__loongarch_single_float=1"); + builtin_undef ("__loongarch_soft_float"); + builtin_undef ("__loongarch_hard_float"); if (TARGET_DOUBLE_FLOAT_ABI || TARGET_SINGLE_FLOAT_ABI) builtin_define ("__loongarch_hard_float=1"); else @@ -80,6 +120,7 @@ loongarch_cpu_cpp_builtins (cpp_reader *pfile) /* ISA Extensions. */ + builtin_undef ("__loongarch_frlen"); if (TARGET_DOUBLE_FLOAT) builtin_define ("__loongarch_frlen=64"); else if (TARGET_SINGLE_FLOAT) @@ -87,24 +128,22 @@ loongarch_cpu_cpp_builtins (cpp_reader *pfile) else builtin_define ("__loongarch_frlen=0"); - if (TARGET_HARD_FLOAT && ISA_HAS_FRECIPE) - builtin_define ("__loongarch_frecipe"); + loongarch_def_or_undef (TARGET_HARD_FLOAT && ISA_HAS_FRECIPE, + "__loongarch_frecipe", pfile); + + loongarch_def_or_undef (ISA_HAS_LSX, "__loongarch_simd", pfile); + loongarch_def_or_undef (ISA_HAS_LSX, "__loongarch_sx", pfile); + loongarch_def_or_undef (ISA_HAS_LASX, "__loongarch_asx", pfile); + builtin_undef ("__loongarch_simd_width"); if (ISA_HAS_LSX) { - builtin_define ("__loongarch_simd"); - builtin_define ("__loongarch_sx"); - - if (!ISA_HAS_LASX) + if (ISA_HAS_LASX) + builtin_define ("__loongarch_simd_width=256"); + else builtin_define ("__loongarch_simd_width=128"); } - if (ISA_HAS_LASX) - { - builtin_define ("__loongarch_asx"); - builtin_define ("__loongarch_simd_width=256"); - } - /* ISA evolution features */ int max_v_major = 1, max_v_minor = 0; @@ -122,30 +161,23 @@ loongarch_cpu_cpp_builtins (cpp_reader *pfile) } /* Find the minimum ISA version required to run the target program. */ + builtin_undef ("__loongarch_version_major"); + builtin_undef ("__loongarch_version_minor"); if (!(max_v_major == 1 && max_v_minor <= 1 && ISA_HAS_LASX)) { builtin_define_with_int_value ("__loongarch_version_major", max_v_major); builtin_define_with_int_value ("__loongarch_version_minor", max_v_minor); } +} - /* Add support for FLOAT128_TYPE on the LoongArch architecture. */ - builtin_define ("__FLOAT128_TYPE__"); - - /* Map the old _Float128 'q' builtins into the new 'f128' builtins. */ - builtin_define ("__builtin_fabsq=__builtin_fabsf128"); - builtin_define ("__builtin_copysignq=__builtin_copysignf128"); - builtin_define ("__builtin_nanq=__builtin_nanf128"); - builtin_define ("__builtin_nansq=__builtin_nansf128"); - builtin_define ("__builtin_infq=__builtin_inff128"); - builtin_define ("__builtin_huge_valq=__builtin_huge_valf128"); - - /* Native Data Sizes. */ - builtin_define_with_int_value ("_LOONGARCH_SZINT", INT_TYPE_SIZE); - builtin_define_with_int_value ("_LOONGARCH_SZLONG", LONG_TYPE_SIZE); - builtin_define_with_int_value ("_LOONGARCH_SZPTR", POINTER_SIZE); - builtin_define_with_int_value ("_LOONGARCH_FPSET", 32); - builtin_define_with_int_value ("_LOONGARCH_SPFPSET", 32); +void +loongarch_cpu_cpp_builtins (cpp_reader *pfile) +{ + builtin_assert ("machine=loongarch"); + builtin_assert ("cpu=loongarch"); + loongarch_define_unconditional_macros (pfile); + loongarch_update_cpp_builtins (pfile); } /* Hook to validate the current #pragma GCC target and set the state, and -- 2.34.1