OSDN Git Service

PR target/26109
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 7 Feb 2006 22:09:52 +0000 (22:09 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 7 Feb 2006 22:09:52 +0000 (22:09 +0000)
* pa.c (attr_length_indirect_call): Don't return length 8 for distances
>= 240000 when generating code for SOM runtime.
(output_indirect_call): Don't use "b,l" instruction for indirect calls
to $$dyncall when generating code for SOM runtime..

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

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

index 6149afe..053e26d 100644 (file)
@@ -1,3 +1,11 @@
+2006-02-07  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       PR target/26109
+       * pa.c (attr_length_indirect_call): Don't return length 8 for distances
+       >= 240000 when generating code for SOM runtime.
+       (output_indirect_call): Don't use "b,l" instruction for indirect calls
+       to $$dyncall when generating code for SOM runtime..
+
 2006-02-07  Dirk Mueller  <dmueller@suse.com>
 
        PR c++/18150
index 1b90e6b..b6b1ef7 100644 (file)
@@ -7447,7 +7447,8 @@ attr_length_indirect_call (rtx insn)
 
   if (TARGET_FAST_INDIRECT_CALLS
       || (!TARGET_PORTABLE_RUNTIME
-         && ((TARGET_PA_20 && distance < 7600000) || distance < 240000)))
+         && ((TARGET_PA_20 && !TARGET_SOM && distance < 7600000)
+             || distance < 240000)))
     return 8;
 
   if (flag_pic)
@@ -7484,10 +7485,10 @@ output_indirect_call (rtx insn, rtx call_dest)
      the remaining cases.  */
   if (attr_length_indirect_call (insn) == 8)
     {
-      /* The HP linker substitutes a BLE for millicode calls using
-        the short PIC PCREL form.  Thus, we must use %r31 as the
-        link register when generating PA 1.x code.  */
-      if (TARGET_PA_20)
+      /* The HP linker sometimes substitutes a BLE for BL/B,L calls to
+        $$dyncall.  Since BLE uses %r31 as the link register, the 22-bit
+        variant of the B,L instruction can't be used on the SOM target.  */
+      if (TARGET_PA_20 && !TARGET_SOM)
        return ".CALL\tARGW0=GR\n\tb,l $$dyncall,%%r2\n\tcopy %%r2,%%r31";
       else
        return ".CALL\tARGW0=GR\n\tbl $$dyncall,%%r31\n\tcopy %%r31,%%r2";