@@ -5325,12 +5325,15 @@
(match_operand 3 "const0_operand")]))
(clobber (reg:CC CC_REGNUM))])]
""
- "emit_insn (gen_sne (operands[0], operands[2]));
- if (GET_CODE (operands[1]) == EQ)
- emit_insn (gen_xorsi3 (operands[0], operands[0], const1_rtx));
- DONE;")
+{
+ if (!TARGET_EXTIMM && GET_CODE (operands[1]) == EQ)
+ {
+ emit_insn (gen_seq_neimm (operands[0], operands[2]));
+ DONE;
+ }
+})
-(define_insn_and_split "sne"
+(define_insn_and_split "*sne"
[(set (match_operand:SI 0 "register_operand" "=d")
(ne:SI (match_operand:CCZ1 1 "register_operand" "0")
(const_int 0)))
@@ -5342,6 +5345,48 @@
[(set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 28)))
(clobber (reg:CC CC_REGNUM))])])
+(define_insn_and_split "*seq"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (eq:SI (match_operand:CCZ1 1 "register_operand" "0")
+ (const_int 0)))
+ (clobber (reg:CC CC_REGNUM))]
+ "TARGET_EXTIMM"
+ "#"
+ "&& reload_completed"
+ [(const_int 0)]
+{
+ rtx op0 = operands[0];
+ emit_insn (gen_lshrsi3 (op0, op0, GEN_INT (28)));
+ emit_insn (gen_xorsi3 (op0, op0, const1_rtx));
+ DONE;
+})
+
+;; ??? Ideally we'd USE a const1_rtx, properly reloaded, but that makes
+;; things more difficult for combine (which can only insert clobbers).
+;; But perhaps it would be better still to have simply used a branch around
+;; constant load instead of beginning with the IPM?
+;;
+;; What about LOCR for Z196? That's a more general question about cstore
+;; being decomposed into movcc...
+
+(define_insn_and_split "seq_neimm"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (eq:SI (match_operand:CCZ1 1 "register_operand" "0")
+ (const_int 0)))
+ (clobber (match_scratch:SI 2 "=&d"))
+ (clobber (reg:CC CC_REGNUM))]
+ "!TARGET_EXTIMM"
+ "#"
+ "&& reload_completed"
+ [(const_int 0)]
+{
+ rtx op0 = operands[0];
+ rtx op2 = operands[2];
+ emit_insn (gen_ashlsi3 (op0, op0, GEN_INT (28)));
+ emit_move_insn (op2, const1_rtx);
+ emit_insn (gen_xorsi3 (op0, op0, op2));
+ DONE;
+})
;;
;; - Conditional move instructions (introduced with z196)