]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
amdgcn: Fix instruction generation for exp2 and log2 operations
authorKwok Cheung Yeung <kcy@codesourcery.com>
Thu, 3 Nov 2022 17:19:11 +0000 (17:19 +0000)
committerKwok Cheung Yeung <kcy@codesourcery.com>
Thu, 3 Nov 2022 18:33:09 +0000 (18:33 +0000)
The GCN instructions for the exp2 and log2 operations are v_exp_* and v_log_*
respectively, which unfortunately do not line up with the RTL naming
convention.  To deal with this, a new set of int attributes is now used when
generating the assembly for these instructions.

2022-11-03  Kwok Cheung Yeung  <kcy@codesourcery.com>

gcc/
* config/gcn/gcn-valu.md (math_unop_insn): New attribute.
(<math_unop><mode>2, <math_unop><mode>2<exec>, <math_unop><mode>2,
<math_unop><mode>2<exec>, *<math_unop><mode>2_insn,
*<math_unop><mode>2<exec>_insn): Use math_unop_insn to generate
assembler output.

gcc/testsuite/
* gcc.target/gcn/unsafe-math-1.c: New.

gcc/config/gcn/gcn-valu.md
gcc/testsuite/gcc.target/gcn/unsafe-math-1.c [new file with mode: 0644]

index 3b619512e13fbbb078795c6467ee002bf9f3b4b8..9f4353831bd3df3e98e0fbd39d9a9c5f3554da54 100644 (file)
    (UNSPEC_SIN "sin")
    (UNSPEC_COS "cos")])
 
+(define_int_attr math_unop_insn
+  [(UNSPEC_FLOOR "floor")
+   (UNSPEC_CEIL "ceil")
+   (UNSPEC_EXP2 "exp")
+   (UNSPEC_LOG2 "log")
+   (UNSPEC_SIN "sin")
+   (UNSPEC_COS "cos")])
+
 (define_insn "<math_unop><mode>2"
   [(set (match_operand:FP 0 "register_operand"  "=  v")
        (unspec:FP
          [(match_operand:FP 1 "gcn_alu_operand" "vSvB")]
          MATH_UNOP_1OR2REG))]
   ""
-  "v_<math_unop>%i0\t%0, %1"
+  "v_<math_unop_insn>%i0\t%0, %1"
   [(set_attr "type" "vop1")
    (set_attr "length" "8")])
 
          [(match_operand:V_FP 1 "gcn_alu_operand" "vSvB")]
          MATH_UNOP_1OR2REG))]
   ""
-  "v_<math_unop>%i0\t%0, %1"
+  "v_<math_unop_insn>%i0\t%0, %1"
   [(set_attr "type" "vop1")
    (set_attr "length" "8")])
 
          [(match_operand:FP_1REG 1 "gcn_alu_operand" "vSvB")]
          MATH_UNOP_1REG))]
   "flag_unsafe_math_optimizations"
-  "v_<math_unop>%i0\t%0, %1"
+  "v_<math_unop_insn>%i0\t%0, %1"
   [(set_attr "type" "vop1")
    (set_attr "length" "8")])
 
          [(match_operand:V_FP_1REG 1 "gcn_alu_operand" "vSvB")]
          MATH_UNOP_1REG))]
   "flag_unsafe_math_optimizations"
-  "v_<math_unop>%i0\t%0, %1"
+  "v_<math_unop_insn>%i0\t%0, %1"
   [(set_attr "type" "vop1")
    (set_attr "length" "8")])
 
          [(match_operand:FP_1REG 1 "gcn_alu_operand" "vSvB")]
          MATH_UNOP_TRIG))]
   "flag_unsafe_math_optimizations"
-  "v_<math_unop>%i0\t%0, %1"
+  "v_<math_unop_insn>%i0\t%0, %1"
   [(set_attr "type" "vop1")
    (set_attr "length" "8")])
 
          [(match_operand:V_FP_1REG 1 "gcn_alu_operand" "vSvB")]
          MATH_UNOP_TRIG))]
   "flag_unsafe_math_optimizations"
-  "v_<math_unop>%i0\t%0, %1"
+  "v_<math_unop_insn>%i0\t%0, %1"
   [(set_attr "type" "vop1")
    (set_attr "length" "8")])
 
diff --git a/gcc/testsuite/gcc.target/gcn/unsafe-math-1.c b/gcc/testsuite/gcc.target/gcn/unsafe-math-1.c
new file mode 100644 (file)
index 0000000..2b54fa2
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do link } */
+/* { dg-options "-O0 -ffast-math" } */
+
+int main (void)
+{
+  float x = 0.123456f;
+
+  float r1 = __builtin_exp2f (x);
+  float r2 = __builtin_log2f (x);
+}