if (arm_reg_or_long_shift_imm (operands[2], GET_MODE (operands[2]))
&& (REG_P (operands[2]) || INTVAL(operands[2]) != 32))
{
- if (!reg_overlap_mentioned_p(operands[0], operands[1]))
- emit_insn (gen_movdi (operands[0], operands[1]));
-
- emit_insn (gen_thumb2_lsll (operands[0], operands[2]));
+ emit_insn (gen_mve_lsll (operands[0], operands[1], operands[2]));
DONE;
}
}
if (TARGET_HAVE_MVE && !BYTES_BIG_ENDIAN
&& arm_reg_or_long_shift_imm (operands[2], GET_MODE (operands[2])))
{
- if (!reg_overlap_mentioned_p(operands[0], operands[1]))
- emit_insn (gen_movdi (operands[0], operands[1]));
-
- emit_insn (gen_thumb2_asrl (operands[0], operands[2]));
+ emit_insn (gen_mve_asrl (operands[0], operands[1], operands[2]));
DONE;
}
if (TARGET_HAVE_MVE && !BYTES_BIG_ENDIAN
&& long_shift_imm (operands[2], GET_MODE (operands[2])))
{
- if (!reg_overlap_mentioned_p(operands[0], operands[1]))
- emit_insn (gen_movdi (operands[0], operands[1]));
-
- emit_insn (gen_thumb2_lsrl (operands[0], operands[2]));
+ emit_insn (gen_mve_lsrl (operands[0], operands[1], operands[2]));
DONE;
}
"TARGET_HAVE_MVE"
"dlstp.<dlstp_elemsize>\t%|lr, %0"
[(set_attr "type" "mve_misc")])
+
+;; Scalar shifts
+(define_insn "mve_asrl"
+ [(set (match_operand:DI 0 "arm_general_register_operand" "=r")
+ (ashiftrt:DI (match_operand:DI 1 "arm_general_register_operand" "0")
+ (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")))]
+ "TARGET_HAVE_MVE"
+ "asrl%?\\t%Q0, %R1, %2"
+ [(set_attr "predicable" "yes")])
+
+(define_insn "mve_lsll"
+ [(set (match_operand:DI 0 "arm_general_register_operand" "=r")
+ (ashift:DI (match_operand:DI 1 "arm_general_register_operand" "0")
+ (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")))]
+ "TARGET_HAVE_MVE"
+ "lsll%?\\t%Q0, %R1, %2"
+ [(set_attr "predicable" "yes")])
+
+(define_insn "mve_lsrl"
+ [(set (match_operand:DI 0 "arm_general_register_operand" "=r")
+ (lshiftrt:DI (match_operand:DI 1 "arm_general_register_operand" "0")
+ (match_operand:SI 2 "long_shift_imm" "Pg")))]
+ "TARGET_HAVE_MVE"
+ "lsrl%?\\t%Q0, %R1, %2"
+ [(set_attr "predicable" "yes")])
[(set_attr "predicable" "yes")]
)
-(define_insn "thumb2_asrl"
- [(set (match_operand:DI 0 "arm_general_register_operand" "+r")
- (ashiftrt:DI (match_dup 0)
- (match_operand:SI 1 "arm_reg_or_long_shift_imm" "rPg")))]
- "TARGET_HAVE_MVE"
- "asrl%?\\t%Q0, %R0, %1"
- [(set_attr "predicable" "yes")])
-
-(define_insn "thumb2_lsll"
- [(set (match_operand:DI 0 "arm_general_register_operand" "+r")
- (ashift:DI (match_dup 0)
- (match_operand:SI 1 "arm_reg_or_long_shift_imm" "rPg")))]
- "TARGET_HAVE_MVE"
- "lsll%?\\t%Q0, %R0, %1"
- [(set_attr "predicable" "yes")])
-
-(define_insn "thumb2_lsrl"
- [(set (match_operand:DI 0 "arm_general_register_operand" "+r")
- (lshiftrt:DI (match_dup 0)
- (match_operand:SI 1 "long_shift_imm" "Pg")))]
- "TARGET_HAVE_MVE"
- "lsrl%?\\t%Q0, %R0, %1"
- [(set_attr "predicable" "yes")])
-
;; Originally expanded by 'doloop_end'.
(define_insn "*doloop_end_internal"
[(set (pc)