lib2funcs.S (__gcc_plt_call): Load branch target to %r21.
authorJohn David Anglin <danglin@gcc.gnu.org>
Sat, 12 Oct 2019 19:40:42 +0000 (19:40 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Sat, 12 Oct 2019 19:40:42 +0000 (19:40 +0000)
* config/pa/lib2funcs.S (__gcc_plt_call): Load branch target to %r21.
Load PIC register after branch target.  Fix white space.
* config/pa/milli64.S ($$dyncall): Separate LINUX and non LINUX
implementations.  Load PIC register after branch target.  Don't
clobber function pointer when it points to function descriptor.
Use nullification instead of branch in LINUX implementation.

From-SVN: r276925

libgcc/ChangeLog
libgcc/config/pa/lib2funcs.S
libgcc/config/pa/milli64.S

index 815118dbf838dd394f44dcd0a5b28fb296f2c220..4d2a32ccb9731a4719ea7d33a4c151b1bfdf19fc 100644 (file)
@@ -1,3 +1,12 @@
+2019-10-12  John David Anglin  <danglin@gcc.gnu.org>
+
+       * config/pa/lib2funcs.S (__gcc_plt_call): Load branch target to %r21.
+       Load PIC register after branch target.  Fix white space.
+       * config/pa/milli64.S ($$dyncall): Separate LINUX and non LINUX
+       implementations.  Load PIC register after branch target.  Don't
+       clobber function pointer when it points to function descriptor.
+       Use nullification instead of branch in LINUX implementation.
+
 2019-10-03  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/fptr.c: Disable -Warray-bounds warning.
index b401b6157da640bf819063cbb6b6dc3ec0926644..a2db5b3d3ac7b4bd63a2af2263132a2557f40f70 100644 (file)
@@ -55,13 +55,13 @@ __gcc_plt_call
        ; An inline version of dyncall so we don't have to worry
        ; about long calls to millicode, PIC and other complexities.
        bb,>=,n %r22,30,L$foo
-        depi 0,31,2,%r22
-        ldw 4(%r22),%r19
-        ldw 0(%r22),%r22
+       depi 0,31,2,%r22
+       ldw 0(%r22),%r21
+       ldw 4(%r22),%r19
 L$foo
-        ldsid (%r22),%r1
-        mtsp %r1,%sr0
-        ble 0(%sr0,%r22)
+       ldsid (%r21),%r1
+       mtsp %r1,%sr0
+       ble 0(%sr0,%r21)
        copy %r31,%r2
        ldw -8(%r30),%r2
 
index 1e46f5018b96318bbcbf5e6048024db150136404..36040e9e78de12a735fa0c7a5abd412b14543687 100644 (file)
@@ -222,19 +222,26 @@ GSYM($$dyncall)
        .proc
        .callinfo       millicode
        .entry
-       bb,>=,n %r22,30,LREF(1)         ; branch if not plabel address
-       depi    0,31,2,%r22             ; clear the two least significant bits
-       ldw     4(%r22),%r19            ; load new LTP value
-       ldw     0(%r22),%r22            ; load address of target
-LSYM(1)
 #ifdef LINUX
-       bv      %r0(%r22)               ; branch to the real target
+       extru,<>        %r22,30,1,%r0   ; nullify if plabel bit set
+       bv,n    %r0(%r22)               ; branch to target
+       ldw     -2(%r22),%r21           ; load address of target
+       bv      %r0(%r21)               ; branch to the real target
+       ldw     2(%r22),%r19            ; load new LTP value
 #else
+       bb,>=,n %r22,30,LREF(1)         ; branch if not plabel address
+       ldw     -2(%r22),%r21           ; load address of target to r21
+       ldsid   (%sr0,%r21),%r1         ; get the "space ident" selected by r21
+       ldw     2(%r22),%r19            ; load new LTP value
+       mtsp    %r1,%sr0                ; move that space identifier into sr0
+       be      0(%sr0,%r21)            ; branch to the real target
+       stw     %r2,-24(%r30)           ; save return address into frame marker
+LSYM(1)
        ldsid   (%sr0,%r22),%r1         ; get the "space ident" selected by r22
        mtsp    %r1,%sr0                ; move that space identifier into sr0
-       be      0(%sr0,%r22)            ; branch to the real target
-#endif
+       be      0(%sr0,%r22)            ; branch to the target
        stw     %r2,-24(%r30)           ; save return address into frame marker
+#endif
        .exit
        .procend
 #endif