* src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 2 Feb 2007 12:28:27 +0000 (12:28 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 2 Feb 2007 12:28:27 +0000 (12:28 +0000)
immediately after bctrl instruction.

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

libffi/ChangeLog
libffi/src/powerpc/linux64.S

index 879df49..4b3c509 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-02  Jakub Jelinek  <jakub@redhat.com>
+
+       * src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2
+       immediately after bctrl instruction.
+
 2007-01-18  Alexandre Oliva  <aoliva@redhat.com>
 
        * Makefile.am (all-recursive, install-recursive,
index d72912d..dbfcc7b 100644 (file)
@@ -47,8 +47,8 @@ ffi_call_LINUX64:
        std     %r0, 16(%r1)
 
        mr      %r28, %r1       /* our AP.  */
-       stdux   %r1, %r1, %r4
 .LCFI0:
+       stdux   %r1, %r1, %r4
        mr      %r31, %r5       /* flags, */
        mr      %r30, %r6       /* rvalue, */
        mr      %r29, %r7       /* function address.  */
@@ -100,6 +100,10 @@ ffi_call_LINUX64:
        /* Make the call.  */
        bctrl
 
+       /* This must follow the call immediately, the unwinder
+          uses this to find out if r2 has been saved or not.  */
+       ld      %r2, 40(%r1)
+
        /* Now, deal with the return value.  */
        mtcrf   0x01, %r31
        bt-     30, .Ldone_return_value
@@ -109,7 +113,6 @@ ffi_call_LINUX64:
 
 .Ldone_return_value:
        /* Restore the registers we used and return.  */
-       ld      %r2, 40(%r1)
        mr      %r1, %r28
        ld      %r0, 16(%r28)
        ld      %r28, -32(%r1)