Commit 3cb9ee2f by Andreas Krebbel Committed by Andreas Krebbel

S/390: PR79895: Fix TImode constant handling

The P constraint letter is supposed to match every constant which is
acceptable during reload.  However, constraints do not appear to be
able to handle const_wide_int yet.  It works with predicates so the
alternative is modelled with a new predicate now.

gcc/ChangeLog:

2017-04-25  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>

	PR target/79895
	* config/s390/predicates.md (reload_const_wide_int_operand): New
	predicate.
	* config/s390/s390.md ("movti"): Remove d/P alternative.
	("movti_bigconst"): New pattern definition.

gcc/testsuite/ChangeLog:

2017-04-25  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>

	PR target/79895
	* gcc.target/s390/pr79895.c: New test.

From-SVN: r247133
parent 03db9ab5
2017-04-25 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
PR target/79895
* config/s390/predicates.md (reload_const_wide_int_operand): New
predicate.
* config/s390/s390.md ("movti"): Remove d/P alternative.
("movti_bigconst"): New pattern definition.
2017-04-25 Dominik Vogt <vogt@linux.vnet.ibm.com> 2017-04-25 Dominik Vogt <vogt@linux.vnet.ibm.com>
PR target/80080 PR target/80080
......
...@@ -199,6 +199,11 @@ ...@@ -199,6 +199,11 @@
(and (match_code "const_int") (and (match_code "const_int")
(match_test "INTVAL (op) <= 32767 && INTVAL (op) >= -32768")))) (match_test "INTVAL (op) <= 32767 && INTVAL (op) >= -32768"))))
(define_predicate "reload_const_wide_int_operand"
(and (match_code "const_wide_int")
(match_test "legitimate_reload_constant_p (op)")))
;; operators -------------------------------------------------------------- ;; operators --------------------------------------------------------------
;; Return nonzero if OP is a valid comparison operator ;; Return nonzero if OP is a valid comparison operator
......
...@@ -1494,11 +1494,20 @@ ...@@ -1494,11 +1494,20 @@
; movti instruction pattern(s). ; movti instruction pattern(s).
; ;
; Separate out the register pair alternative since constraints (P) are
; not able to deal with const_wide_int's. But predicates do.
(define_insn "*movti_bigconst"
[(set (match_operand:TI 0 "register_operand" "=d")
(match_operand:TI 1 "reload_const_wide_int_operand" ""))]
"TARGET_ZARCH"
"#")
; FIXME: More constants are possible by enabling jxx, jyy constraints ; FIXME: More constants are possible by enabling jxx, jyy constraints
; for TImode (use double-int for the calculations) ; for TImode (use double-int for the calculations)
(define_insn "movti" (define_insn "movti"
[(set (match_operand:TI 0 "nonimmediate_operand" "=d,S,v, v, v,v,d,v,R, d,o") [(set (match_operand:TI 0 "nonimmediate_operand" "=d,S,v, v, v,v,d,v,R, d,o")
(match_operand:TI 1 "general_operand" " S,d,v,j00,jm1,d,v,R,v,dPT,d"))] (match_operand:TI 1 "general_operand" " S,d,v,j00,jm1,d,v,R,v,dT,d"))]
"TARGET_ZARCH" "TARGET_ZARCH"
"@ "@
lmg\t%0,%N0,%S1 lmg\t%0,%N0,%S1
......
2017-04-25 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
PR target/79895
* gcc.target/s390/pr79895.c: New test.
2017-04-25 Dominik Vogt <vogt@linux.vnet.ibm.com> 2017-04-25 Dominik Vogt <vogt@linux.vnet.ibm.com>
PR target/80080 PR target/80080
......
/* { dg-do compile { target int128 } } */
/* { dg-options "-O1 -mno-lra" } */
unsigned __int128 g;
void
foo ()
{
g = (unsigned __int128)1 << 127;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment