Hi, this enables QImode and HImode for load on condition. For SPEC2006 this reduces code size overall, performance impact is negligible.
Regtested on s390x. Regards Robin -- gcc/ChangeLog: 2018-10-18 Robin Dapp <rd...@linux.ibm.com> * config/s390/s390.md: Add mov<mode>cc for QImode and HImode.
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 70a619f06f5..6c687a1416b 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -614,6 +614,9 @@ (define_mode_iterator DD_DF [DF DD]) (define_mode_iterator TD_TF [TF TD]) +(define_mode_iterator QHI [QI HI]) +(define_mode_attr qhi_si_offset [(QI "3") (HI "2")]) + ;; These mode iterators allow 31-bit and 64-bit GPR patterns to be generated ;; from the same template. (define_mode_iterator GPR [(DI "TARGET_ZARCH") SI]) @@ -6593,6 +6596,49 @@ XEXP (operands[1], 1)); }) +;; +;; - Allow QImode and HImode +(define_expand "mov<mode>cc" + [(set (match_dup 4) (match_operand:QHI 2 "nonimmediate_operand" "")) + (set (match_dup 5) (match_operand:QHI 3 "loc_operand" "")) + (set (match_dup 6) (if_then_else:SI (match_operand 1 "comparison_operator" "") + (match_dup 4) (match_dup 5))) + (set (match_operand:QHI 0 "nonimmediate_operand" "") (subreg:QHI (match_dup 6) <QHI:qhi_si_offset>))] + "TARGET_Z196" +{ + operands[4] = gen_reg_rtx (E_SImode); + operands[5] = gen_reg_rtx (E_SImode); + operands[6] = gen_reg_rtx (E_SImode); + + if (!CONSTANT_P (operands[2]) && !MEM_P (operands[2])) + { + operands[2] = simplify_gen_subreg (E_SImode, operands[2], <MODE>mode, 0); + } + else if (MEM_P (operands[2])) + { + rtx tmp = gen_reg_rtx (E_SImode); + if (<MODE>mode == E_QImode) + emit_insn (gen_zero_extendqisi2 (tmp, operands[2])); + else if (<MODE>mode == E_HImode) + emit_insn (gen_zero_extendhisi2 (tmp, operands[2])); + operands[2] = tmp; + } + + if (!CONSTANT_P (operands[3]) && !MEM_P (operands[3])) + { + operands[3] = simplify_gen_subreg (E_SImode, operands[3], <MODE>mode, 0); + } + + /* Emit the comparison insn in case we do not already have a comparison + result. */ + if (!s390_comparison (operands[1], VOIDmode)) + operands[1] = s390_emit_compare (GET_CODE (operands[1]), + XEXP (operands[1], 0), + XEXP (operands[1], 1)); +}) + + + ; locr, loc, stoc, locgr, locg, stocg, lochi, locghi (define_insn "*mov<mode>cc" [(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d,d,d,d,d,S,S")