RISC-V: Fix splitter for 32-bit AND on 64-bit target.
authorJim Wilson <wilson@gcc.gnu.org>
Mon, 8 Jul 2019 10:47:42 +0000 (03:47 -0700)
committerJim Wilson <wilson@gcc.gnu.org>
Mon, 8 Jul 2019 10:47:42 +0000 (03:47 -0700)
Fixes github.com/riscv/riscv-gcc issue #161.  We were accidentally using
BITS_PER_WORD to compute shift counts when we should have been using the
bitsize of the operand modes.  This was wrong when we had an SImode shift
and a 64-bit target.

Andrew Waterman  <andrew@sifive.com>
gcc/
* config/riscv/riscv.md (lshrsi3_zero_extend_3+1): Use operands[1]
bitsize instead of BITS_PER_WORD.
gcc/testsuite/
* gcc.target/riscv/shift-shift-2.c: Add one more test.

From-SVN: r273230

gcc/ChangeLog
gcc/config/riscv/riscv.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/riscv/shift-shift-2.c

index 31ad4e5208ea4d37790a1fd92d8f46870e0b0a72..6429407bc4b3d9437291e5d644e2ce39819a4a13 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-08  Andrew Waterman  <andrew@sifive.com>
+           Jim Wilson  <jimw@sifive.com>
+
+       * config/riscv/riscv.md (lshrsi3_zero_extend_3+1): Use operands[1]
+       bitsize instead of BITS_PER_WORD.
+       gcc/testsuite/
+
 2019-07-08  Martin Liska  <mliska@suse.cz>
 
        * collect2.c (defined): Revert to before r254460.
index 0f4626656d60c1c9be76e8f56e09ac538dd445ad..78260fcf6fdb6d8954404008ece8cf5edc7d126f 100644 (file)
   (set (match_dup 0)
        (lshiftrt:GPR (match_dup 0) (match_dup 2)))]
 {
-  operands[2] = GEN_INT (BITS_PER_WORD
+  /* Op2 is a VOIDmode constant, so get the mode size from op1.  */
+  operands[2] = GEN_INT (GET_MODE_BITSIZE (GET_MODE (operands[1]))
                         - exact_log2 (INTVAL (operands[2]) + 1));
 })
-  
+
 ;; Handle AND with 0xF...F0...0 where there are 32 to 63 zeros.  This can be
 ;; split into two shifts.  Otherwise it requires 3 instructions: li, sll, and.
 (define_split
index 61150ea17ba7b5b313f39fa05916c1402d3226c3..56f2f2c596463a96cc8aee0bd177994fc18f3fc7 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-08  Jim Wilson  <jimw@sifive.com>
+
+       * gcc.target/riscv/shift-shift-2.c: Add one more test.
+
 2019-07-08  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/65143
index 3f07e7776e73ce53a68398b86cba35705077b434..10a5bb728bec22e5a7c28ac488dcc3ec58ee69a0 100644 (file)
@@ -25,5 +25,17 @@ sub4 (unsigned long i)
 {
   return (i << 52) >> 52;
 }
-/* { dg-final { scan-assembler-times "slli" 4 } } */
-/* { dg-final { scan-assembler-times "srli" 4 } } */
+
+unsigned int
+sub5 (unsigned int i)
+{
+  unsigned int j;
+  j = i >> 24;
+  j = j * (1 << 24);
+  j = i - j;
+  return j;
+}
+/* { dg-final { scan-assembler-times "slli" 5 } } */
+/* { dg-final { scan-assembler-times "srli" 5 } } */
+/* { dg-final { scan-assembler-times "slliw" 1 } } */
+/* { dg-final { scan-assembler-times "srliw" 1 } } */