This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] S/390: Add loc patterns for QImode and HImode
- From: Robin Dapp <rdapp at linux dot ibm dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Andreas Krebbel <krebbel at linux dot ibm dot com>
- Date: Thu, 18 Oct 2018 11:04:11 +0200
- Subject: [PATCH] S/390: Add loc patterns for QImode and HImode
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 <rdapp@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")