[(set_attr "type" "neon_shift_acc<q>")]
)
+;; After all the combinations and propagations of ROTATE have been
+;; attempted split any remaining vector rotates into SHL + USRA sequences.
+(define_insn_and_split "*aarch64_simd_rotate_imm<mode>"
+ [(set (match_operand:VDQ_I 0 "register_operand" "=&w")
+ (rotate:VDQ_I (match_operand:VDQ_I 1 "register_operand" "w")
+ (match_operand:VDQ_I 2 "aarch64_simd_lshift_imm")))]
+ "TARGET_SIMD"
+ "#"
+ "&& 1"
+ [(set (match_dup 3)
+ (ashift:VDQ_I (match_dup 1)
+ (match_dup 2)))
+ (set (match_dup 0)
+ (plus:VDQ_I
+ (lshiftrt:VDQ_I
+ (match_dup 1)
+ (match_dup 4))
+ (match_dup 3)))]
+ {
+ operands[3] = reload_completed ? operands[0] : gen_reg_rtx (<MODE>mode);
+ rtx shft_amnt = unwrap_const_vec_duplicate (operands[2]);
+ int bitwidth = GET_MODE_UNIT_SIZE (<MODE>mode) * BITS_PER_UNIT;
+ operands[4]
+ = aarch64_simd_gen_const_vector_dup (<MODE>mode,
+ bitwidth - INTVAL (shft_amnt));
+ }
+ [(set_attr "length" "8")]
+)
+
(define_insn "aarch64_<sra_op>rsra_n<mode>_insn"
[(set (match_operand:VSDQ_I_DI 0 "register_operand" "=w")
(plus:VSDQ_I_DI
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+#include <arm_neon.h>
+
+#pragma GCC target "+sha3"
+
+/*
+** func_shl_eor:
+** xar v0\.2d, v([0-9]+)\.2d, v([0-9]+)\.2d, 63
+** ret
+*/
+uint64x2_t
+func_shl_eor (uint64x2_t a, uint64x2_t b) {
+ uint64x2_t c = veorq_u64 (a, b);
+ return veorq_u64(vshlq_n_u64(c, 1), vshrq_n_u64(c, 63));
+}
+
+/*
+** func_add_eor:
+** xar v0\.2d, v([0-9]+)\.2d, v([0-9]+)\.2d, 63
+** ret
+*/
+uint64x2_t
+func_add_eor (uint64x2_t a, uint64x2_t b) {
+ uint64x2_t c = veorq_u64 (a, b);
+ return veorq_u64(vaddq_u64(c, c), vshrq_n_u64(c, 63));
+}
+
+/*
+** func_shl_orr:
+** xar v0\.2d, v([0-9]+)\.2d, v([0-9]+)\.2d, 63
+** ret
+*/
+uint64x2_t
+func_shl_orr (uint64x2_t a, uint64x2_t b) {
+ uint64x2_t c = veorq_u64 (a, b);
+ return vorrq_u64(vshlq_n_u64(c, 1), vshrq_n_u64(c, 63));
+}
+
+/*
+** func_add_orr:
+** xar v0\.2d, v([0-9]+)\.2d, v([0-9]+)\.2d, 63
+** ret
+*/
+uint64x2_t
+func_add_orr (uint64x2_t a, uint64x2_t b) {
+ uint64x2_t c = veorq_u64 (a, b);
+ return vorrq_u64(vaddq_u64(c, c), vshrq_n_u64(c, 63));
+}
+
+/*
+** func_shl_add:
+** xar v0\.2d, v([0-9]+)\.2d, v([0-9]+)\.2d, 63
+** ret
+*/
+uint64x2_t
+func_shl_add (uint64x2_t a, uint64x2_t b) {
+ uint64x2_t c = veorq_u64 (a, b);
+ return vaddq_u64(vshlq_n_u64(c, 1), vshrq_n_u64(c, 63));
+}
+
+/*
+** func_add_add:
+** xar v0\.2d, v([0-9]+)\.2d, v([0-9]+)\.2d, 63
+** ret
+*/
+uint64x2_t
+func_add_add (uint64x2_t a, uint64x2_t b) {
+ uint64x2_t c = veorq_u64 (a, b);
+ return vaddq_u64(vaddq_u64(c, c), vshrq_n_u64(c, 63));
+}