Commit af344a30 by Dominik Vogt Committed by Andreas Krebbel

S/390: Clobber r1 in patterns resulting in pfpo instruction.

gcc/ChangeLog

	* config/s390/s390.md (GPR1_REGNUM): New constant.
	("*trunc<BFP:mode><DFP_ALL:mode>2")
	("*trunc<DFP_ALL:mode><BFP:mode>2")
	("trunc<BFP:mode><DFP_ALL:mode>2")
	("trunc<DFP_ALL:mode><BFP:mode>2")
	("*extend<BFP:mode><DFP_ALL:mode>2")
	("*extend<DFP_ALL:mode><BFP:mode>2")
	("extend<BFP:mode><DFP_ALL:mode>2")
	("extend<DFP_ALL:mode><BFP:mode>2"): Clobber r1.

gcc/testsuite/ChangeLog

	* gcc.target/s390/pfpo.c: New test.

From-SVN: r230642
parent cf0347ae
2015-11-20 Dominik Vogt <vogt@linux.vnet.ibm.com>
* config/s390/s390.md (GPR1_REGNUM): New constant.
("*trunc<BFP:mode><DFP_ALL:mode>2")
("*trunc<DFP_ALL:mode><BFP:mode>2")
("trunc<BFP:mode><DFP_ALL:mode>2")
("trunc<DFP_ALL:mode><BFP:mode>2")
("*extend<BFP:mode><DFP_ALL:mode>2")
("*extend<DFP_ALL:mode><BFP:mode>2")
("extend<BFP:mode><DFP_ALL:mode>2")
("extend<DFP_ALL:mode><BFP:mode>2"): Clobber r1.
2015-11-19 Aditya Kumar <aditya.k7@samsung.com> 2015-11-19 Aditya Kumar <aditya.k7@samsung.com>
Sebastian Pop <s.pop@samsung.com> Sebastian Pop <s.pop@samsung.com>
...@@ -301,6 +301,7 @@ ...@@ -301,6 +301,7 @@
[ [
; General purpose registers ; General purpose registers
(GPR0_REGNUM 0) (GPR0_REGNUM 0)
(GPR1_REGNUM 1)
; Floating point registers. ; Floating point registers.
(FPR0_REGNUM 16) (FPR0_REGNUM 16)
(FPR1_REGNUM 20) (FPR1_REGNUM 20)
...@@ -4895,7 +4896,8 @@ ...@@ -4895,7 +4896,8 @@
[(set (reg:DFP_ALL FPR0_REGNUM) [(set (reg:DFP_ALL FPR0_REGNUM)
(float_truncate:DFP_ALL (reg:BFP FPR4_REGNUM))) (float_truncate:DFP_ALL (reg:BFP FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM)) (use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))]
"TARGET_HARD_DFP" "TARGET_HARD_DFP"
"pfpo") "pfpo")
...@@ -4903,7 +4905,8 @@ ...@@ -4903,7 +4905,8 @@
[(set (reg:BFP FPR0_REGNUM) [(set (reg:BFP FPR0_REGNUM)
(float_truncate:BFP (reg:DFP_ALL FPR4_REGNUM))) (float_truncate:BFP (reg:DFP_ALL FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM)) (use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))]
"TARGET_HARD_DFP" "TARGET_HARD_DFP"
"pfpo") "pfpo")
...@@ -4914,7 +4917,8 @@ ...@@ -4914,7 +4917,8 @@
[(set (reg:DFP_ALL FPR0_REGNUM) [(set (reg:DFP_ALL FPR0_REGNUM)
(float_truncate:DFP_ALL (reg:BFP FPR4_REGNUM))) (float_truncate:DFP_ALL (reg:BFP FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM)) (use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))]) (clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))])
(set (match_operand:DFP_ALL 0 "nonimmediate_operand" "") (set (match_operand:DFP_ALL 0 "nonimmediate_operand" "")
(reg:DFP_ALL FPR0_REGNUM))] (reg:DFP_ALL FPR0_REGNUM))]
"TARGET_HARD_DFP "TARGET_HARD_DFP
...@@ -4936,7 +4940,8 @@ ...@@ -4936,7 +4940,8 @@
(parallel (parallel
[(set (reg:BFP FPR0_REGNUM) (float_truncate:BFP (reg:DFP_ALL FPR4_REGNUM))) [(set (reg:BFP FPR0_REGNUM) (float_truncate:BFP (reg:DFP_ALL FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM)) (use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))]) (clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))])
(set (match_operand:BFP 0 "nonimmediate_operand" "") (reg:BFP FPR0_REGNUM))] (set (match_operand:BFP 0 "nonimmediate_operand" "") (reg:BFP FPR0_REGNUM))]
"TARGET_HARD_DFP "TARGET_HARD_DFP
&& GET_MODE_SIZE (<DFP_ALL:MODE>mode) >= GET_MODE_SIZE (<BFP:MODE>mode)" && GET_MODE_SIZE (<DFP_ALL:MODE>mode) >= GET_MODE_SIZE (<BFP:MODE>mode)"
...@@ -4957,14 +4962,16 @@ ...@@ -4957,14 +4962,16 @@
(define_insn "*extend<BFP:mode><DFP_ALL:mode>2" (define_insn "*extend<BFP:mode><DFP_ALL:mode>2"
[(set (reg:DFP_ALL FPR0_REGNUM) (float_extend:DFP_ALL (reg:BFP FPR4_REGNUM))) [(set (reg:DFP_ALL FPR0_REGNUM) (float_extend:DFP_ALL (reg:BFP FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM)) (use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))]
"TARGET_HARD_DFP" "TARGET_HARD_DFP"
"pfpo") "pfpo")
(define_insn "*extend<DFP_ALL:mode><BFP:mode>2" (define_insn "*extend<DFP_ALL:mode><BFP:mode>2"
[(set (reg:BFP FPR0_REGNUM) (float_extend:BFP (reg:DFP_ALL FPR4_REGNUM))) [(set (reg:BFP FPR0_REGNUM) (float_extend:BFP (reg:DFP_ALL FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM)) (use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))]
"TARGET_HARD_DFP" "TARGET_HARD_DFP"
"pfpo") "pfpo")
...@@ -4975,7 +4982,8 @@ ...@@ -4975,7 +4982,8 @@
[(set (reg:DFP_ALL FPR0_REGNUM) [(set (reg:DFP_ALL FPR0_REGNUM)
(float_extend:DFP_ALL (reg:BFP FPR4_REGNUM))) (float_extend:DFP_ALL (reg:BFP FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM)) (use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))]) (clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))])
(set (match_operand:DFP_ALL 0 "nonimmediate_operand" "") (set (match_operand:DFP_ALL 0 "nonimmediate_operand" "")
(reg:DFP_ALL FPR0_REGNUM))] (reg:DFP_ALL FPR0_REGNUM))]
"TARGET_HARD_DFP "TARGET_HARD_DFP
...@@ -4997,7 +5005,8 @@ ...@@ -4997,7 +5005,8 @@
(parallel (parallel
[(set (reg:BFP FPR0_REGNUM) (float_extend:BFP (reg:DFP_ALL FPR4_REGNUM))) [(set (reg:BFP FPR0_REGNUM) (float_extend:BFP (reg:DFP_ALL FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM)) (use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))]) (clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))])
(set (match_operand:BFP 0 "nonimmediate_operand" "") (reg:BFP FPR0_REGNUM))] (set (match_operand:BFP 0 "nonimmediate_operand" "") (reg:BFP FPR0_REGNUM))]
"TARGET_HARD_DFP "TARGET_HARD_DFP
&& GET_MODE_SIZE (<DFP_ALL:MODE>mode) < GET_MODE_SIZE (<BFP:MODE>mode)" && GET_MODE_SIZE (<DFP_ALL:MODE>mode) < GET_MODE_SIZE (<BFP:MODE>mode)"
......
2015-11-20 Dominik Vogt <vogt@linux.vnet.ibm.com>
* gcc.target/s390/pfpo.c: New test.
2015-11-20 Kirill Yukhin <kirill.yukhin@intel.com> 2015-11-20 Kirill Yukhin <kirill.yukhin@intel.com>
* c-c++-common/attr-simd-3.c: Put xfail (PR68158) on dg-error. * c-c++-common/attr-simd-3.c: Put xfail (PR68158) on dg-error.
......
/* The pfpo instruction generated by this code clobbers the r1 register while
it was still in use. */
/* { dg-do run } */
/* { dg-options "-O0 -march=z10 -mzarch" } */
int foo(int x)
{
return x;
}
int bar(int i, float f)
{
return i;
}
int main()
{
_Decimal32 d = 7;
return bar(foo(0x10203040), (float)d) == 0x10203040 ? 0 : 1;
}
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