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
This commit is contained in:
Dominik Vogt 2015-11-20 07:36:07 +00:00 committed by Andreas Krebbel
parent cf0347ae4c
commit af344a30f8
4 changed files with 54 additions and 8 deletions

View File

@ -1,3 +1,15 @@
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>
Sebastian Pop <s.pop@samsung.com>

View File

@ -301,6 +301,7 @@
[
; General purpose registers
(GPR0_REGNUM 0)
(GPR1_REGNUM 1)
; Floating point registers.
(FPR0_REGNUM 16)
(FPR1_REGNUM 20)
@ -4895,7 +4896,8 @@
[(set (reg:DFP_ALL FPR0_REGNUM)
(float_truncate:DFP_ALL (reg:BFP FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))]
(clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))]
"TARGET_HARD_DFP"
"pfpo")
@ -4903,7 +4905,8 @@
[(set (reg:BFP FPR0_REGNUM)
(float_truncate:BFP (reg:DFP_ALL FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))]
(clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))]
"TARGET_HARD_DFP"
"pfpo")
@ -4914,7 +4917,8 @@
[(set (reg:DFP_ALL FPR0_REGNUM)
(float_truncate:DFP_ALL (reg:BFP FPR4_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" "")
(reg:DFP_ALL FPR0_REGNUM))]
"TARGET_HARD_DFP
@ -4936,7 +4940,8 @@
(parallel
[(set (reg:BFP FPR0_REGNUM) (float_truncate:BFP (reg:DFP_ALL FPR4_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))]
"TARGET_HARD_DFP
&& GET_MODE_SIZE (<DFP_ALL:MODE>mode) >= GET_MODE_SIZE (<BFP:MODE>mode)"
@ -4957,14 +4962,16 @@
(define_insn "*extend<BFP:mode><DFP_ALL:mode>2"
[(set (reg:DFP_ALL FPR0_REGNUM) (float_extend:DFP_ALL (reg:BFP FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))]
(clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))]
"TARGET_HARD_DFP"
"pfpo")
(define_insn "*extend<DFP_ALL:mode><BFP:mode>2"
[(set (reg:BFP FPR0_REGNUM) (float_extend:BFP (reg:DFP_ALL FPR4_REGNUM)))
(use (reg:SI GPR0_REGNUM))
(clobber (reg:CC CC_REGNUM))]
(clobber (reg:CC CC_REGNUM))
(clobber (reg:SI GPR1_REGNUM))]
"TARGET_HARD_DFP"
"pfpo")
@ -4975,7 +4982,8 @@
[(set (reg:DFP_ALL FPR0_REGNUM)
(float_extend:DFP_ALL (reg:BFP FPR4_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" "")
(reg:DFP_ALL FPR0_REGNUM))]
"TARGET_HARD_DFP
@ -4997,7 +5005,8 @@
(parallel
[(set (reg:BFP FPR0_REGNUM) (float_extend:BFP (reg:DFP_ALL FPR4_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))]
"TARGET_HARD_DFP
&& GET_MODE_SIZE (<DFP_ALL:MODE>mode) < GET_MODE_SIZE (<BFP:MODE>mode)"

View File

@ -1,3 +1,7 @@
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>
* c-c++-common/attr-simd-3.c: Put xfail (PR68158) on dg-error.

View File

@ -0,0 +1,21 @@
/* 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;
}