This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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")

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]