]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PATCH v3] RISC-V: Fixed incorrect semantic description in DF to DI pattern in the...
authorJin Ma <jinma@linux.alibaba.com>
Wed, 18 Sep 2024 14:56:23 +0000 (08:56 -0600)
committerJeff Law <jlaw@ventanamicro.com>
Wed, 18 Sep 2024 14:57:27 +0000 (08:57 -0600)
gcc/ChangeLog:

* config/riscv/riscv.md: Change "truncate" to unspec for the Zfa extension on rv32.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/zfa-fmovh-fmovp-bug.c: New test.

gcc/config/riscv/riscv.md
gcc/testsuite/gcc.target/riscv/zfa-fmovh-fmovp-bug.c [new file with mode: 0644]

index fd1cbebc435b9265d60226840060869dfc57e878..0410d990ec58617ccc4bdd1ee1d3f1463df42cef 100644 (file)
@@ -56,6 +56,8 @@
   UNSPEC_FLT_QUIET
   UNSPEC_FLE_QUIET
   UNSPEC_COPYSIGN
+  UNSPEC_FMV_X_W
+  UNSPEC_FMVH_X_D
   UNSPEC_RINT
   UNSPEC_ROUND
   UNSPEC_FLOOR
 
 (define_insn "movsidf2_low_rv32"
   [(set (match_operand:SI      0 "register_operand" "=  r")
-       (truncate:SI
-           (match_operand:DF 1 "register_operand"  "zmvf")))]
+       (unspec:SI
+           [(match_operand:DF 1 "register_operand" "zmvf")]
+       UNSPEC_FMV_X_W))]
   "TARGET_HARD_FLOAT && !TARGET_64BIT && TARGET_ZFA"
   "fmv.x.w\t%0,%1"
   [(set_attr "move_type" "fmove")
 
 
 (define_insn "movsidf2_high_rv32"
-  [(set (match_operand:SI      0 "register_operand"    "=  r")
-       (truncate:SI
-            (lshiftrt:DF
-                (match_operand:DF 1 "register_operand" "zmvf")
-                (const_int 32))))]
+  [(set (match_operand:SI      0 "register_operand" "=  r")
+       (unspec:SI
+           [(match_operand:DF 1 "register_operand" "zmvf")]
+       UNSPEC_FMVH_X_D))]
   "TARGET_HARD_FLOAT && !TARGET_64BIT && TARGET_ZFA"
   "fmvh.x.d\t%0,%1"
   [(set_attr "move_type" "fmove")
diff --git a/gcc/testsuite/gcc.target/riscv/zfa-fmovh-fmovp-bug.c b/gcc/testsuite/gcc.target/riscv/zfa-fmovh-fmovp-bug.c
new file mode 100644 (file)
index 0000000..e00047b
--- /dev/null
@@ -0,0 +1,9 @@
+/* Test that we do not have ice when compile */
+/* { dg-do compile } */
+/* { dg-options "-march=rv32gc_zfa -mabi=ilp32d -O2 -g" } */
+
+unsigned int
+foo (double a) {
+  unsigned int tt = *(unsigned long long *)&a & 0xffff;
+  return tt;
+}