diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 0e43e51..bed6b79 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -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)