aarch64: Add an extra sbfiz pattern [PR87763]
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 3 Feb 2020 21:12:35 +0000 (21:12 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Thu, 6 Feb 2020 17:26:59 +0000 (17:26 +0000)
This patch matches another form of sbfiz, in which the input
has DImode and the output has SImode.  It fixes a regression
in gcc.target/aarch64/lsl_asr_sbfiz.c from GCC 8.

2020-02-06  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
PR rtl-optimization/87763
* config/aarch64/aarch64.md (*ashiftsi_extvdi_bfiz): New pattern.

gcc/ChangeLog
gcc/config/aarch64/aarch64.md

index 1fe29d337cd455d8cfc89363e90852ce51294a2c..efbbbf082251ec8139e6a8a8c644416062067de4 100644 (file)
@@ -1,3 +1,8 @@
+2020-02-06  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR rtl-optimization/87763
+       * config/aarch64/aarch64.md (*ashiftsi_extvdi_bfiz): New pattern.
+
 2020-02-06  Delia Burduv  <delia.burduv@arm.com>
 
        * config/aarch64/aarch64-simd-builtins.def
index 4f5898185f52d0169ac08b9eb676db4c28da6c2b..90eebce85c046c6c11e2679e42f155adae45c9d5 100644 (file)
   [(set_attr "type" "bfx")]
 )
 
+(define_insn "*ashiftsi_extvdi_bfiz"
+  [(set (match_operand:SI 0 "register_operand" "=r")
+       (ashift:SI
+         (match_operator:SI 4 "subreg_lowpart_operator"
+           [(sign_extract:DI
+              (match_operand:DI 1 "register_operand" "r")
+              (match_operand 2 "aarch64_simd_shift_imm_offset_si")
+              (const_int 0))])
+         (match_operand 3 "aarch64_simd_shift_imm_si")))]
+  "IN_RANGE (INTVAL (operands[2]) + INTVAL (operands[3]),
+            1, GET_MODE_BITSIZE (SImode) - 1)"
+  "sbfiz\\t%w0, %w1, %3, %2"
+  [(set_attr "type" "bfx")]
+)
+
 ;; When the bit position and width of the equivalent extraction add up to 32
 ;; we can use a W-reg LSL instruction taking advantage of the implicit
 ;; zero-extension of the X-reg.