On 18/02/2025 08:37, Christophe Lyon wrote: > As discussed in the PR, removing the inner 'fix:HF/SD/DF' fixes the > problem, like other targets do. >
The double-'fix' idiom was introduced in https://gcc.gnu.org/pipermail/gcc-patches/2003-March/098380.html to address target/5985. Certainly at the time it seems that FIX had two meanings depending on the mode. If the target was a floating point mode it did a truncation operation with rounding. If it was an integer mode it did trucation with unspecified rounding. But the manual doesn't seem to mention FIX:<int_mode> (at least not now), so I'm wondering if something has been lost somewhere along the line. Anyway, I'm not sure this is right yet. R. > gcc/ChangeLog: > > PR rtl-optimization/117712 > * config/arm/arm.md (fix_trunchfsi2): Remove inner fix:HF. > (fix_trunchfdi2): Likewise. > (fix_truncsfsi2): Remove inner fix:SF. > (fix_truncdfsi2): Remove inner fix:DF. > * config/arm/vfp.md (truncsisf2_vfp): remove inner fix:SF. > (truncsidf2_vfp): Remove inner fix:DF. > (fixuns_truncsfsi2): Remove inner fix:SF. > (fixuns_truncdfsi2): Remove inner fix:DF. > > gcc/testsuite/ChangeLog: > > PR rtl-optimization/117712 > * gcc.target/arm/pr117712-df.c: New test. > * gcc.target/arm/pr117712-hf-di.c: New test. > * gcc.target/arm/pr117712-hf.c: New test. > * gcc.target/arm/pr117712-sf.c: New test. > --- > gcc/config/arm/arm.md | 8 ++++---- > gcc/config/arm/vfp.md | 8 ++++---- > gcc/testsuite/gcc.target/arm/pr117712-df.c | 10 ++++++++++ > gcc/testsuite/gcc.target/arm/pr117712-hf-di.c | 10 ++++++++++ > gcc/testsuite/gcc.target/arm/pr117712-hf.c | 10 ++++++++++ > gcc/testsuite/gcc.target/arm/pr117712-sf.c | 10 ++++++++++ > 6 files changed, 48 insertions(+), 8 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/arm/pr117712-df.c > create mode 100644 gcc/testsuite/gcc.target/arm/pr117712-hf-di.c > create mode 100644 gcc/testsuite/gcc.target/arm/pr117712-hf.c > create mode 100644 gcc/testsuite/gcc.target/arm/pr117712-sf.c > > diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md > index 442d86b9329..ed0d0da2e63 100644 > --- a/gcc/config/arm/arm.md > +++ b/gcc/config/arm/arm.md > @@ -5477,7 +5477,7 @@ (define_expand "floatsidf2" > > (define_expand "fix_trunchfsi2" > [(set (match_operand:SI 0 "general_operand") > - (fix:SI (fix:HF (match_operand:HF 1 "general_operand"))))] > + (fix:SI (match_operand:HF 1 "general_operand")))] > "TARGET_EITHER" > " > { > @@ -5489,7 +5489,7 @@ (define_expand "fix_trunchfsi2" > > (define_expand "fix_trunchfdi2" > [(set (match_operand:DI 0 "general_operand") > - (fix:DI (fix:HF (match_operand:HF 1 "general_operand"))))] > + (fix:DI (match_operand:HF 1 "general_operand")))] > "TARGET_EITHER" > " > { > @@ -5501,14 +5501,14 @@ (define_expand "fix_trunchfdi2" > > (define_expand "fix_truncsfsi2" > [(set (match_operand:SI 0 "s_register_operand") > - (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand"))))] > + (fix:SI (match_operand:SF 1 "s_register_operand")))] > "TARGET_32BIT && TARGET_HARD_FLOAT" > " > ") > > (define_expand "fix_truncdfsi2" > [(set (match_operand:SI 0 "s_register_operand") > - (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand"))))] > + (fix:SI (match_operand:DF 1 "s_register_operand")))] > "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE" > " > ") > diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md > index 379f5f7b3dc..0ef019b1727 100644 > --- a/gcc/config/arm/vfp.md > +++ b/gcc/config/arm/vfp.md > @@ -1508,7 +1508,7 @@ (define_insn "truncsfhf2" > > (define_insn "*truncsisf2_vfp" > [(set (match_operand:SI 0 "s_register_operand" "=t") > - (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" "t"))))] > + (fix:SI (match_operand:SF 1 "s_register_operand" "t")))] > "TARGET_32BIT && TARGET_HARD_FLOAT" > "vcvt%?.s32.f32\\t%0, %1" > [(set_attr "predicable" "yes") > @@ -1517,7 +1517,7 @@ (define_insn "*truncsisf2_vfp" > > (define_insn "*truncsidf2_vfp" > [(set (match_operand:SI 0 "s_register_operand" "=t") > - (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "w"))))] > + (fix:SI (match_operand:DF 1 "s_register_operand" "w")))] > "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" > "vcvt%?.s32.f64\\t%0, %P1" > [(set_attr "predicable" "yes") > @@ -1527,7 +1527,7 @@ (define_insn "*truncsidf2_vfp" > > (define_insn "fixuns_truncsfsi2" > [(set (match_operand:SI 0 "s_register_operand" "=t") > - (unsigned_fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" > "t"))))] > + (unsigned_fix:SI (match_operand:SF 1 "s_register_operand" "t")))] > "TARGET_32BIT && TARGET_HARD_FLOAT" > "vcvt%?.u32.f32\\t%0, %1" > [(set_attr "predicable" "yes") > @@ -1536,7 +1536,7 @@ (define_insn "fixuns_truncsfsi2" > > (define_insn "fixuns_truncdfsi2" > [(set (match_operand:SI 0 "s_register_operand" "=t") > - (unsigned_fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" > "t"))))] > + (unsigned_fix:SI (match_operand:DF 1 "s_register_operand" "t")))] > "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" > "vcvt%?.u32.f64\\t%0, %P1" > [(set_attr "predicable" "yes") > diff --git a/gcc/testsuite/gcc.target/arm/pr117712-df.c > b/gcc/testsuite/gcc.target/arm/pr117712-df.c > new file mode 100644 > index 00000000000..534f2e4ed1d > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/pr117712-df.c > @@ -0,0 +1,10 @@ > +/* { dg-do assemble } */ > +/* { dg-options "-O2 -ffast-math" } */ > + > +int bCTUInfo; > +void compressInterCU_rd5_6(int qp) { > + if (bCTUInfo) > + qp = 0.96 * qp; > + for (;;) > + compressInterCU_rd5_6(qp); > +} > diff --git a/gcc/testsuite/gcc.target/arm/pr117712-hf-di.c > b/gcc/testsuite/gcc.target/arm/pr117712-hf-di.c > new file mode 100644 > index 00000000000..ea5ee0c8342 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/pr117712-hf-di.c > @@ -0,0 +1,10 @@ > +/* { dg-do assemble } */ > +/* { dg-options "-O2 -ffast-math -mfp16-format=ieee" } */ > + > +long long bCTUInfo; > +void compressInterCU_rd5_6(long long qp) { > + if (bCTUInfo) > + qp = 0.96f16 * qp; > + for (;;) > + compressInterCU_rd5_6(qp); > +} > diff --git a/gcc/testsuite/gcc.target/arm/pr117712-hf.c > b/gcc/testsuite/gcc.target/arm/pr117712-hf.c > new file mode 100644 > index 00000000000..d11c2cf749c > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/pr117712-hf.c > @@ -0,0 +1,10 @@ > +/* { dg-do assemble } */ > +/* { dg-options "-O2 -ffast-math -mfp16-format=ieee" } */ > + > +int bCTUInfo; > +void compressInterCU_rd5_6(int qp) { > + if (bCTUInfo) > + qp = 0.96f16 * qp; > + for (;;) > + compressInterCU_rd5_6(qp); > +} > diff --git a/gcc/testsuite/gcc.target/arm/pr117712-sf.c > b/gcc/testsuite/gcc.target/arm/pr117712-sf.c > new file mode 100644 > index 00000000000..744bad5de75 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/pr117712-sf.c > @@ -0,0 +1,10 @@ > +/* { dg-do assemble } */ > +/* { dg-options "-O2 -ffast-math" } */ > + > +int bCTUInfo; > +void compressInterCU_rd5_6(int qp) { > + if (bCTUInfo) > + qp = 0.96f * qp; > + for (;;) > + compressInterCU_rd5_6(qp); > +}