aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/s390
diff options
context:
space:
mode:
authorDominik Vogt <vogt@linux.vnet.ibm.com>2016-07-04 14:25:22 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2016-07-04 14:25:22 +0000
commitbf7499197fbb065123257c374064f6bb715c951b (patch)
tree92b00ae746adb67fef8e83316aacddbee9caf653 /gcc/config/s390
parent4fc0c9c844bcc61de8642f9a31c0144c15d9f822 (diff)
downloadgcc-bf7499197fbb065123257c374064f6bb715c951b.zip
gcc-bf7499197fbb065123257c374064f6bb715c951b.tar.gz
gcc-bf7499197fbb065123257c374064f6bb715c951b.tar.bz2
S/390: Add support for z13 instructions lochi and locghi.
The attached patch adds patterns to make use of the z13 LOCHI and LOCGHI instructions. gcc/ChangeLog: 2016-07-04 Dominik Vogt <vogt@linux.vnet.ibm.com> * config/s390/s390.md: Add "z13" cpu_facility. ("*mov<mode>cc"): Add support for z13 instructions lochi and locghi. * config/s390/predicates.md ("loc_operand"): New predicate for "load on condition" type instructions. gcc/testsuite/ChangeLog: 2016-07-04 Dominik Vogt <vogt@linux.vnet.ibm.com> * gcc.target/s390/vector/vec-scalar-cmp-1.c: Expect lochi instead of locr. * gcc.target/s390/loc-1.c: New test. From-SVN: r237984
Diffstat (limited to 'gcc/config/s390')
-rw-r--r--gcc/config/s390/predicates.md7
-rw-r--r--gcc/config/s390/s390.md24
2 files changed, 23 insertions, 8 deletions
diff --git a/gcc/config/s390/predicates.md b/gcc/config/s390/predicates.md
index e66f4a4..75e4cb8 100644
--- a/gcc/config/s390/predicates.md
+++ b/gcc/config/s390/predicates.md
@@ -182,6 +182,13 @@
return s390_contiguous_bitmask_p (INTVAL (op), GET_MODE_BITSIZE (mode), NULL, NULL);
})
+;; Return true if OP is ligitimate for any LOC instruction.
+
+(define_predicate "loc_operand"
+ (ior (match_operand 0 "nonimmediate_operand")
+ (and (match_code "const_int")
+ (match_test "INTVAL (op) <= 32767 && INTVAL (op) >= -32768"))))
+
;; operators --------------------------------------------------------------
;; Return nonzero if OP is a valid comparison operator
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index f8c61a8..6d8d041 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -483,7 +483,7 @@
(const (symbol_ref "s390_tune_attr")))
(define_attr "cpu_facility"
- "standard,ieee,zarch,cpu_zarch,longdisp,extimm,dfp,z10,z196,zEC12,vec"
+ "standard,ieee,zarch,cpu_zarch,longdisp,extimm,dfp,z10,z196,zEC12,vec,z13"
(const_string "standard"))
(define_attr "enabled" ""
@@ -528,7 +528,12 @@
(and (eq_attr "cpu_facility" "vec")
(match_test "TARGET_VX"))
- (const_int 1)]
+ (const_int 1)
+
+ (and (eq_attr "cpu_facility" "z13")
+ (match_test "TARGET_Z13"))
+ (const_int 1)
+ ]
(const_int 0)))
;; Pipeline description for z900. For lack of anything better,
@@ -6309,21 +6314,23 @@
XEXP (operands[1], 1));
})
-; locr, loc, stoc, locgr, locg, stocg
+; locr, loc, stoc, locgr, locg, stocg, lochi, locghi
(define_insn_and_split "*mov<mode>cc"
- [(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d,d,d,S,S,&d")
+ [(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d,d,d,d,d,S,S,&d")
(if_then_else:GPR
(match_operator 1 "s390_comparison"
- [(match_operand 2 "cc_reg_operand" " c,c,c,c,c,c,c")
+ [(match_operand 2 "cc_reg_operand" " c,c,c,c,c,c,c,c,c")
(match_operand 5 "const_int_operand" "")])
- (match_operand:GPR 3 "nonimmediate_operand" " d,0,S,0,d,0,S")
- (match_operand:GPR 4 "nonimmediate_operand" " 0,d,0,S,0,d,S")))]
+ (match_operand:GPR 3 "loc_operand" " d,0,S,0,K,0,d,0,S")
+ (match_operand:GPR 4 "loc_operand" " 0,d,0,S,0,K,0,d,S")))]
"TARGET_Z196"
"@
loc<g>r%C1\t%0,%3
loc<g>r%D1\t%0,%4
loc<g>%C1\t%0,%3
loc<g>%D1\t%0,%4
+ loc<g>hi%C1\t%0,%h3
+ loc<g>hi%D1\t%0,%h4
stoc<g>%C1\t%3,%0
stoc<g>%D1\t%4,%0
#"
@@ -6340,7 +6347,8 @@
(match_dup 0)
(match_dup 4)))]
""
- [(set_attr "op_type" "RRF,RRF,RSY,RSY,RSY,RSY,*")])
+ [(set_attr "op_type" "RRF,RRF,RSY,RSY,RIE,RIE,RSY,RSY,*")
+ (set_attr "cpu_facility" "*,*,*,*,z13,z13,*,*,*")])
;;
;;- Multiply instructions.