Bootstrapped and regression tested powerpc64-linux.  OK to apply?

        * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Support
        little-endian.
        * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Likewise.

Index: libffi/src/powerpc/linux64_closure.S
===================================================================
--- libffi/src/powerpc/linux64_closure.S        (revision 199718)
+++ libffi/src/powerpc/linux64_closure.S        (working copy)
@@ -132,7 +132,11 @@
        blr
        nop
 # case FFI_TYPE_INT
+#ifdef __LITTLE_ENDIAN__
+       lwa %r3, 112+0(%r1)
+#else
        lwa %r3, 112+4(%r1)
+#endif
        mtlr %r0
        addi %r1, %r1, 240
        blr
@@ -152,33 +156,57 @@
        lfd %f2, 112+8(%r1)
        b .Lfinish
 # case FFI_TYPE_UINT8
+#ifdef __LITTLE_ENDIAN__
+       lbz %r3, 112+0(%r1)
+#else
        lbz %r3, 112+7(%r1)
+#endif
        mtlr %r0
        addi %r1, %r1, 240
        blr
 # case FFI_TYPE_SINT8
+#ifdef __LITTLE_ENDIAN__
+       lbz %r3, 112+0(%r1)
+#else
        lbz %r3, 112+7(%r1)
+#endif
        extsb %r3,%r3
        mtlr %r0
        b .Lfinish
 # case FFI_TYPE_UINT16
+#ifdef __LITTLE_ENDIAN__
+       lhz %r3, 112+0(%r1)
+#else
        lhz %r3, 112+6(%r1)
+#endif
        mtlr %r0
 .Lfinish:
        addi %r1, %r1, 240
        blr
 # case FFI_TYPE_SINT16
+#ifdef __LITTLE_ENDIAN__
+       lha %r3, 112+0(%r1)
+#else
        lha %r3, 112+6(%r1)
+#endif
        mtlr %r0
        addi %r1, %r1, 240
        blr
 # case FFI_TYPE_UINT32
+#ifdef __LITTLE_ENDIAN__
+       lwz %r3, 112+0(%r1)
+#else
        lwz %r3, 112+4(%r1)
+#endif
        mtlr %r0
        addi %r1, %r1, 240
        blr
 # case FFI_TYPE_SINT32
+#ifdef __LITTLE_ENDIAN__
+       lwa %r3, 112+0(%r1)
+#else
        lwa %r3, 112+4(%r1)
+#endif
        mtlr %r0
        addi %r1, %r1, 240
        blr
Index: libffi/src/powerpc/ppc_closure.S
===================================================================
--- libffi/src/powerpc/ppc_closure.S    (revision 199718)
+++ libffi/src/powerpc/ppc_closure.S    (working copy)
@@ -159,25 +159,41 @@
 #endif
 
 # case FFI_TYPE_UINT8
+#ifdef __LITTLE_ENDIAN__
+       lbz %r3,112+0(%r1)
+#else
        lbz %r3,112+3(%r1)
+#endif
        mtlr %r0
        addi %r1,%r1,144
        blr
 
 # case FFI_TYPE_SINT8
+#ifdef __LITTLE_ENDIAN__
+       lbz %r3,112+0(%r1)
+#else
        lbz %r3,112+3(%r1)
+#endif
        extsb %r3,%r3
        mtlr %r0
        b .Lfinish
 
 # case FFI_TYPE_UINT16
+#ifdef __LITTLE_ENDIAN__
+       lhz %r3,112+0(%r1)
+#else
        lhz %r3,112+2(%r1)
+#endif
        mtlr %r0
        addi %r1,%r1,144
        blr
 
 # case FFI_TYPE_SINT16
+#ifdef __LITTLE_ENDIAN__
+       lha %r3,112+0(%r1)
+#else
        lha %r3,112+2(%r1)
+#endif
        mtlr %r0
        addi %r1,%r1,144
        blr
@@ -239,9 +255,15 @@
 
 # case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct.
        lwz %r3,112+0(%r1)
+#ifdef __LITTLE_ENDIAN__
+       mtlr %r0
+       addi %r1,%r1,144
+       blr
+#else
        srwi %r3,%r3,8
        mtlr %r0
        b .Lfinish
+#endif
 
 # case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct.
        lwz %r3,112+0(%r1)
@@ -252,20 +274,35 @@
 # case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct.
        lwz %r3,112+0(%r1)
        lwz %r4,112+4(%r1)
+#ifdef __LITTLE_ENDIAN__
+       mtlr %r0
+       b .Lfinish
+#else
        li %r5,24
        b .Lstruct567
+#endif
 
 # case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct.
        lwz %r3,112+0(%r1)
        lwz %r4,112+4(%r1)
+#ifdef __LITTLE_ENDIAN__
+       mtlr %r0
+       b .Lfinish
+#else
        li %r5,16
        b .Lstruct567
+#endif
 
 # case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct.
        lwz %r3,112+0(%r1)
        lwz %r4,112+4(%r1)
+#ifdef __LITTLE_ENDIAN__
+       mtlr %r0
+       b .Lfinish
+#else
        li %r5,8
        b .Lstruct567
+#endif
 
 # case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct.
        lwz %r3,112+0(%r1)
@@ -273,6 +310,7 @@
        mtlr %r0
        b .Lfinish
 
+#ifndef __LITTLE_ENDIAN__
 .Lstruct567:
        subfic %r6,%r5,32
        srw %r4,%r4,%r5
@@ -282,6 +320,7 @@
        mtlr %r0
        addi %r1,%r1,144
        blr
+#endif
 
 .Luint128:
        lwz %r6,112+12(%r1)

-- 
Alan Modra
Australia Development Lab, IBM

Reply via email to