https://gcc.gnu.org/g:efa1fb693996e446653aab32344923dfb9aa756f
commit efa1fb693996e446653aab32344923dfb9aa756f Author: Michael Meissner <[email protected]> Date: Tue Sep 15 19:53:45 2026 -0400 Do BF to SF converts on p9; Remove int conversions; Add BF debug switches. 2026-09-15 Michael Meissner <[email protected]> gcc/ * config/rs6000/rs6000-c.cc (rs6000_target_modify_macros): Don't define __BF16__. If -mfloat16-gpr-convert, define __FLOAT16_GPR_CONVERT__. * config/rs6000/rs6000-call.cc (POWERPC_MASKS): Add OPTION_MASK_FLOAT16_GPR_CONVERT. * config/rs6000/rs6000.cc (rs6000_init_libfuncs): Change TARGET_FLOAT16_CONVERT_IN_GPRS to TARGET_FLOAT16_GPR_CONVERT. (rs6000_opt_masks): Add -mfloat16-gpr-convert. (rs6000_opt_vars): Drop TARGET_FLOAT16_CONVERT_IN_GPRS. * config/rs6000/rs6000.opt (-mfloat16-gpr-convert): Rename from -mfloat16-convert-in-gprs. gcc/testsuite/ * gcc.target/powerpc/float16-2.c: Drop power8 support. Diff: --- gcc/config/rs6000/rs6000-c.cc | 6 ++++-- gcc/config/rs6000/rs6000-call.cc | 2 +- gcc/config/rs6000/rs6000-cpus.def | 1 + gcc/config/rs6000/rs6000.cc | 6 ++---- gcc/config/rs6000/rs6000.opt | 4 ++-- gcc/testsuite/gcc.target/powerpc/float16-2.c | 23 +++++++++++------------ 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/gcc/config/rs6000/rs6000-c.cc b/gcc/config/rs6000/rs6000-c.cc index 9142fb632fe9..2c0f6a58773d 100644 --- a/gcc/config/rs6000/rs6000-c.cc +++ b/gcc/config/rs6000/rs6000-c.cc @@ -587,19 +587,21 @@ rs6000_target_modify_macros (bool define_p, HOST_WIDE_INT flags) if ((flags & OPTION_MASK_FLOAT16) != 0) { rs6000_define_or_undefine_macro (define_p, "__FLOAT16__"); - rs6000_define_or_undefine_macro (define_p, "__BF16__"); + rs6000_define_or_undefine_macro (define_p, "__BFLOAT16__"); /* Older versions of the PowerPC __bf16 patches used __bfloat16 as the keyword instead of __bf16. Support using __bfloat16 as an alternative to __bf16. */ rs6000_define_or_undefine_macro (define_p, "__bfloat16=__bf16"); - rs6000_define_or_undefine_macro (define_p, "__BFLOAT16__"); if ((flags & OPTION_MASK_P9_VECTOR) != 0) rs6000_define_or_undefine_macro (define_p, "__FLOAT16_HW__"); if ((flags & OPTION_MASK_POWER10) != 0) rs6000_define_or_undefine_macro (define_p, "__BFLOAT16_HW__"); + + if ((flags & OPTION_MASK_FLOAT16_GPR_CONVERT) != 0) + rs6000_define_or_undefine_macro (define_p, "__FLOAT16_GPR_CONVERT__"); } /* Tell the user if we are targeting CELL. */ if (rs6000_cpu == PROCESSOR_CELL) diff --git a/gcc/config/rs6000/rs6000-call.cc b/gcc/config/rs6000/rs6000-call.cc index c613304036ff..94f6f398d60c 100644 --- a/gcc/config/rs6000/rs6000-call.cc +++ b/gcc/config/rs6000/rs6000-call.cc @@ -638,7 +638,7 @@ init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, if (incoming || cum->prototype) cum->nargs_prototype = n_named_args; - if (TARGET_FLOAT16 && TARGET_FLOAT16_CONVERT_IN_GPRS && libname + if (TARGET_FLOAT16 && TARGET_FLOAT16_GPR_CONVERT && libname && SYMBOL_REF_P (libname)) { const char *name = XSTR (libname, 0); diff --git a/gcc/config/rs6000/rs6000-cpus.def b/gcc/config/rs6000/rs6000-cpus.def index f06019c2d499..636feffa2df5 100644 --- a/gcc/config/rs6000/rs6000-cpus.def +++ b/gcc/config/rs6000/rs6000-cpus.def @@ -142,6 +142,7 @@ | OPTION_MASK_FLOAT128_HW \ | OPTION_MASK_FLOAT128_KEYWORD \ | OPTION_MASK_FLOAT16 \ + | OPTION_MASK_FLOAT16_GPR_CONVERT \ | OPTION_MASK_FPRND \ | OPTION_MASK_POWER10 \ | OPTION_MASK_POWER11 \ diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 917cb401f718..efdb2b42d3ae 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -11947,7 +11947,7 @@ rs6000_init_libfuncs (void) } /* 16-bit float support functions. */ - if (TARGET_FLOAT16 && TARGET_FLOAT16_CONVERT_IN_GPRS) + if (TARGET_FLOAT16 && TARGET_FLOAT16_GPR_CONVERT) init_float16 (); } @@ -25036,6 +25036,7 @@ static struct rs6000_opt_mask const rs6000_opt_masks[] = { "hard-dfp", OPTION_MASK_DFP, false, true }, { "htm", OPTION_MASK_HTM, false, true }, { "float16", OPTION_MASK_FLOAT16, false, true }, + { "float16-gpr-convert", OPTION_MASK_FLOAT16_GPR_CONVERT, false, true }, { "isel", OPTION_MASK_ISEL, false, true }, { "mfcrf", OPTION_MASK_MFCRF, false, true }, { "mfpgpr", 0, false, true }, @@ -25134,9 +25135,6 @@ static struct rs6000_opt_var const rs6000_opt_vars[] = { "speculate-indirect-jumps", offsetof (struct gcc_options, x_rs6000_speculate_indirect_jumps), offsetof (struct cl_target_option, x_rs6000_speculate_indirect_jumps), }, - { "float16-convert-in-gprs", - offsetof (struct gcc_options, x_TARGET_FLOAT16_CONVERT_IN_GPRS), - offsetof (struct cl_target_option, x_TARGET_FLOAT16_CONVERT_IN_GPRS), }, }; /* Inner function to handle attribute((target("..."))) and #pragma GCC target diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt index f28dd3e6f1f1..88d32f72b5a9 100644 --- a/gcc/config/rs6000/rs6000.opt +++ b/gcc/config/rs6000/rs6000.opt @@ -654,8 +654,8 @@ mbfloat16-p10-convert Target Undocumented Var(TARGET_BFLOAT16_P10_CONVERT) Init(1) Save Generate (do not generate) xvcvbf16spn to do __bf16 to float/double conversions. -mfloat16-convert-in-gprs -Target Undocumented Var(TARGET_FLOAT16_CONVERT_IN_GPRS) Init(0) Save +mfloat16-gpr-convert +Target Undocumented Mask(FLOAT16_GPR_CONVERT) Var(rs6000_isa_flags) Pass/return (do not pass/return) 16-it float conversions in GPR registers. ; Documented parameters diff --git a/gcc/testsuite/gcc.target/powerpc/float16-2.c b/gcc/testsuite/gcc.target/powerpc/float16-2.c index 9e773821f627..b2a334158c44 100644 --- a/gcc/testsuite/gcc.target/powerpc/float16-2.c +++ b/gcc/testsuite/gcc.target/powerpc/float16-2.c @@ -13,20 +13,19 @@ a scalar _Float16 and a scalar double. */ extern void do_power9 (void) __attribute__ ((noinline,target("cpu=power9"))); -extern void do_power8 (void) __attribute__ ((noinline,target("cpu=power8"))); volatile _Float16 two = 2.0; volatile _Float16 three = 3.0; -volatile _Float16 p8_add, p8_sub, p8_mul, p8_div; +volatile _Float16 p9_add, p9_sub, p9_mul, p9_div; volatile _Float16 p10_add, p10_sub, p10_mul, p10_div; void -do_power8 (void) +do_power9 (void) { - p8_add = three + two; - p8_sub = three - two; - p8_mul = three * two; - p8_div = three / two; + p9_add = three + two; + p9_sub = three - two; + p9_mul = three * two; + p9_div = three / two; } void @@ -41,18 +40,18 @@ do_power10 (void) int main (int argc, char *argv[]) { - do_power8 (); + do_power9 (); - if (((double)p8_add) != 5.0) + if (((double)p9_add) != 5.0) abort (); - if (((double)p8_sub) != 1.0) + if (((double)p9_sub) != 1.0) abort (); - if (((double)p8_mul) != 6.0) + if (((double)p9_mul) != 6.0) abort (); - if (((double)p8_div) != 1.5) + if (((double)p9_div) != 1.5) abort (); do_power10 ();
