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