]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
S/390: Clobber r1 in patterns resulting in pfpo instruction.
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Nov 2015 07:36:07 +0000 (07:36 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Nov 2015 07:36:07 +0000 (07:36 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230642 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/s390/s390.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/pfpo.c [new file with mode: 0644]

index 949e12e580efe52eeab9282c9e994e7a39993b3c..0a04eaa2d583efd5ebad2a020ce36406cb6da51a 100644 (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>
 
index ea65c746fca0f6394cfba6821303fa606d5e1dd9..f2bb24c24318b521612ab3db9a1c10aa4f17bc05 100644 (file)
   [
    ; General purpose registers
    (GPR0_REGNUM                  0)
+   (GPR1_REGNUM                  1)
    ; Floating point registers.
    (FPR0_REGNUM                 16)
    (FPR1_REGNUM                 20)
   [(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")
 
   [(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")
 
     [(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
    (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)"
 (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")
 
     [(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
    (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)"
index c8a7238f977a72c32aaa0aca680afb220a7c8f23..247aa3accf141048df0c295b20fafd2646356e5f 100644 (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.
diff --git a/gcc/testsuite/gcc.target/s390/pfpo.c b/gcc/testsuite/gcc.target/s390/pfpo.c
new file mode 100644 (file)
index 0000000..32725c9
--- /dev/null
@@ -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;
+}