re PR target/51871 (FAIL: gcc.c-torture/execute/20010122-1.c execution)
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Sat, 28 Jan 2012 18:48:11 +0000 (18:48 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Sat, 28 Jan 2012 18:48:11 +0000 (18:48 +0000)
PR target/51871
* config/pa/pa.c (pa_return_addr_rtx): Add support for PA2.0 export
stubs.

From-SVN: r183669

gcc/ChangeLog
gcc/config/pa/pa.c

index 4b8a211f91d3a4bd82abfaa4944402dbc472e7e9..4b1578c762dee20a20ff489823e78e33b82c42e0 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-28  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       PR target/51871
+       * config/pa/pa.c (pa_return_addr_rtx): Add support for PA2.0 export
+       stubs.
+
 2012-01-28  Sandra Loosemore  <sandra@codesourcery.com>
 
        * doc/invoke.texi: Correct hyphenation of "floating point",
index 9b1a6578201504216f1c2fc4eb9479585d2d335a..bcf64ce82a5b82e1466f982f48a71c82f4c2d522 100644 (file)
@@ -4501,7 +4501,7 @@ pa_return_addr_rtx (int count, rtx frameaddr)
   rtx saved_rp;
   rtx ins;
 
-  /* Instruction stream at the normal return address for the export stub:
+  /* The instruction stream at the return address of a PA1.X export stub is:
 
        0x4bc23fd1 | stub+8:   ldw -18(sr0,sp),rp
        0x004010a1 | stub+12:  ldsid (sr0,rp),r1
@@ -4509,10 +4509,16 @@ pa_return_addr_rtx (int count, rtx frameaddr)
        0xe0400002 | stub+20:  be,n 0(sr0,rp)
 
      0xe0400002 must be specified as -532676606 so that it won't be
-     rejected as an invalid immediate operand on 64-bit hosts.  */
+     rejected as an invalid immediate operand on 64-bit hosts.
 
-  HOST_WIDE_INT insns[4] = {0x4bc23fd1, 0x004010a1, 0x00011820, -532676606};
-  int i;
+     The instruction stream at the return address of a PA2.0 export stub is:
+
+       0x4bc23fd1 | stub+8:   ldw -18(sr0,sp),rp
+       0xe840d002 | stub+12:  bve,n (rp)
+  */
+
+  HOST_WIDE_INT insns[4];
+  int i, len;
 
   if (count != 0)
     return NULL_RTX;
@@ -4535,11 +4541,26 @@ pa_return_addr_rtx (int count, rtx frameaddr)
   ins = copy_to_reg (gen_rtx_AND (Pmode, rp, MASK_RETURN_ADDR));
   label = gen_label_rtx ();
 
+  if (TARGET_PA_20)
+    {
+      insns[0] = 0x4bc23fd1;
+      insns[1] = -398405630;
+      len = 2;
+    }
+  else
+    {
+      insns[0] = 0x4bc23fd1;
+      insns[1] = 0x004010a1;
+      insns[2] = 0x00011820;
+      insns[3] = -532676606;
+      len = 4;
+    }
+
   /* Check the instruction stream at the normal return address for the
      export stub.  If it is an export stub, than our return address is
      really in -24[frameaddr].  */
 
-  for (i = 0; i < 3; i++)
+  for (i = 0; i < len; i++)
     {
       rtx op0 = gen_rtx_MEM (SImode, plus_constant (ins, i * 4)); 
       rtx op1 = GEN_INT (insns[i]);