)
(define_insn_and_split "ashldi3_neon"
- [(set (match_operand:DI 0 "s_register_operand" "= w, w,?&r,?r, ?w,w")
- (ashift:DI (match_operand:DI 1 "s_register_operand" " 0w, w, 0r, r, 0w,w")
- (match_operand:SI 2 "general_operand" "rUm, i, r, i,rUm,i")))
- (clobber (match_scratch:SI 3 "= X, X,?&r, X, X,X"))
- (clobber (match_scratch:SI 4 "= X, X,?&r, X, X,X"))
- (clobber (match_scratch:DI 5 "=&w, X, X, X, &w,X"))
+ [(set (match_operand:DI 0 "s_register_operand" "= w, w,?&r,?r,?&r, ?w,w")
+ (ashift:DI (match_operand:DI 1 "s_register_operand" " 0w, w, 0r, 0, r, 0w,w")
+ (match_operand:SI 2 "general_operand" "rUm, i, r, i, i,rUm,i")))
+ (clobber (match_scratch:SI 3 "= X, X,?&r, X, X, X,X"))
+ (clobber (match_scratch:SI 4 "= X, X,?&r, X, X, X,X"))
+ (clobber (match_scratch:DI 5 "=&w, X, X, X, X, &w,X"))
(clobber (reg:CC_C CC_REGNUM))]
"TARGET_NEON"
"#"
}
else
{
- if (operands[2] == CONST1_RTX (SImode)
- && (!reg_overlap_mentioned_p (operands[0], operands[1])
- || REGNO (operands[0]) == REGNO (operands[1])))
+ /* The shift expanders support either full overlap or no overlap. */
+ gcc_assert (!reg_overlap_mentioned_p (operands[0], operands[1])
+ || REGNO (operands[0]) == REGNO (operands[1]));
+
+ if (operands[2] == CONST1_RTX (SImode))
/* This clobbers CC. */
emit_insn (gen_arm_ashldi3_1bit (operands[0], operands[1]));
else
}
DONE;
}"
- [(set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits")
- (set_attr "opt" "*,*,speed,speed,*,*")
+ [(set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits")
+ (set_attr "opt" "*,*,speed,speed,speed,*,*")
(set_attr "type" "multiple")]
)
;; ashrdi3_neon
;; lshrdi3_neon
(define_insn_and_split "<shift>di3_neon"
- [(set (match_operand:DI 0 "s_register_operand" "= w, w,?&r,?r,?w,?w")
- (RSHIFTS:DI (match_operand:DI 1 "s_register_operand" " 0w, w, 0r, r,0w, w")
- (match_operand:SI 2 "reg_or_int_operand" " r, i, r, i, r, i")))
- (clobber (match_scratch:SI 3 "=2r, X, &r, X,2r, X"))
- (clobber (match_scratch:SI 4 "= X, X, &r, X, X, X"))
- (clobber (match_scratch:DI 5 "=&w, X, X, X,&w, X"))
+ [(set (match_operand:DI 0 "s_register_operand" "= w, w,?&r,?r,?&r,?w,?w")
+ (RSHIFTS:DI (match_operand:DI 1 "s_register_operand" " 0w, w, 0r, 0, r,0w, w")
+ (match_operand:SI 2 "reg_or_int_operand" " r, i, r, i, i, r, i")))
+ (clobber (match_scratch:SI 3 "=2r, X, &r, X, X,2r, X"))
+ (clobber (match_scratch:SI 4 "= X, X, &r, X, X, X, X"))
+ (clobber (match_scratch:DI 5 "=&w, X, X, X, X,&w, X"))
(clobber (reg:CC CC_REGNUM))]
"TARGET_NEON"
"#"
}
else
{
- if (operands[2] == CONST1_RTX (SImode)
- && (!reg_overlap_mentioned_p (operands[0], operands[1])
- || REGNO (operands[0]) == REGNO (operands[1])))
+ /* The shift expanders support either full overlap or no overlap. */
+ gcc_assert (!reg_overlap_mentioned_p (operands[0], operands[1])
+ || REGNO (operands[0]) == REGNO (operands[1]));
+
+ if (operands[2] == CONST1_RTX (SImode))
/* This clobbers CC. */
emit_insn (gen_arm_<shift>di3_1bit (operands[0], operands[1]));
else
DONE;
}"
- [(set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits")
- (set_attr "opt" "*,*,speed,speed,*,*")
+ [(set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits")
+ (set_attr "opt" "*,*,speed,speed,speed,*,*")
(set_attr "type" "multiple")]
)