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:
parent
cf0347ae4c
commit
af344a30f8
|
@ -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>
|
||||
|
||||
|
|
|
@ -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)"
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue