Commit 70144e9c by Andreas Tobler Committed by Andreas Tobler

Andreas Tobler <a.tobler@schweiz.ch>

        * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries.

From-SVN: r64106
parent b4053702
2003-03-03 Andreas Tobler <a.tobler@schweiz.ch>
* src/powerpc/darwin_closure.S: Recode to fit dynamic libraries.
2003-02-06 Andreas Tobler <a.tobler@schweiz.ch> 2003-02-06 Andreas Tobler <a.tobler@schweiz.ch>
* libffi/src/powerpc/darwin_closure.S: * libffi/src/powerpc/darwin_closure.S:
......
...@@ -25,21 +25,19 @@ ...@@ -25,21 +25,19 @@
----------------------------------------------------------------------- */ ----------------------------------------------------------------------- */
#define LIBFFI_ASM #define LIBFFI_ASM
#define JUMPTARGET(name) name
#define L(x) x #define L(x) x
.text
.globl _ffi_closure_helper_DARWIN
.file "darwin_closure.S"
.text .text
.align 2 .align 2
.globl _ffi_closure_ASM .globl _ffi_closure_ASM
.text .text
.align 2 .align 2
_ffi_closure_ASM: _ffi_closure_ASM:
LFB1: LFB1:
mflr r0 /* extract return address */ mflr r0 /* extract return address */
stw r0, 8(r1) /* save the return address */ stw r0, 8(r1) /* save the return address */
LCFI0: LCFI0:
/* 24 Bytes (Linkage Area) /* 24 Bytes (Linkage Area)
32 Bytes (outgoing parameter area, always reserved) 32 Bytes (outgoing parameter area, always reserved)
...@@ -47,7 +45,7 @@ LCFI0: ...@@ -47,7 +45,7 @@ LCFI0:
8 Bytes (result) 8 Bytes (result)
168 Bytes */ 168 Bytes */
stwu r1,-176(r1) /* skip over caller save area stwu r1,-176(r1) /* skip over caller save area
keep stack aligned to 16 */ keep stack aligned to 16 */
LCFI1: LCFI1:
/* we want to build up an area for the parameters passed /* we want to build up an area for the parameters passed
...@@ -97,98 +95,147 @@ LCFI1: ...@@ -97,98 +95,147 @@ LCFI1:
addi r7,r1,232 addi r7,r1,232
/* make the call */ /* make the call */
bl L(_ffi_closure_helper_DARWIN) bl Lffi_closure_helper_DARWIN$stub
/* now r3 contains the return type */ /* now r3 contains the return type */
/* so use it to look up in a table */ /* so use it to look up in a table */
/* so we know how to deal with each type */ /* so we know how to deal with each type */
/* look up the proper starting point in table */ /* look up the proper starting point in table */
/* by using return type as offset */ /* by using return type as offset */
addi r5,r1,160 /* get pointer to results area */ addi r5,r1,160 /* get pointer to results area */
addis r4,0,ha16(.L60) /* get address of jump table */ bl Lget_ret_type0_addr /* get pointer to Lret_type0 into LR */
addi r4,r4,lo16(.L60) mflr r4 /* move to r4 */
slwi r3,r3,2 /* now multiply return type by 4 */ slwi r3,r3,4 /* now multiply return type by 16 */
lwzx r3,r4,r3 /* get the contents of that table value */ add r3,r3,r4 /* add contents of table to table address */
add r3,r3,r4 /* add contents of table to table address */
mtctr r3 mtctr r3
bctr /* jump to it */ bctr /* jump to it */
LFE1: LFE1:
.align 2 /* Each of the ret_typeX code fragments has to be exactly 16 bytes long */
/* (4 instructions). For cache effectiveness we align to a 16 byte boundary */
.L60: /* first. */
.long .L44-.L60 /* FFI_TYPE_VOID */
.long .L50-.L60 /* FFI_TYPE_INT */
.long .L47-.L60 /* FFI_TYPE_FLOAT */
.long .L46-.L60 /* FFI_TYPE_DOUBLE */
.long .L46-.L60 /* FFI_TYPE_LONGDOUBLE */
.long .L56-.L60 /* FFI_TYPE_UINT8 */
.long .L55-.L60 /* FFI_TYPE_SINT8 */
.long .L58-.L60 /* FFI_TYPE_UINT16 */
.long .L57-.L60 /* FFI_TYPE_SINT16 */
.long .L50-.L60 /* FFI_TYPE_UINT32 */
.long .L50-.L60 /* FFI_TYPE_SINT32 */
.long .L48-.L60 /* FFI_TYPE_UINT64 */
.long .L48-.L60 /* FFI_TYPE_SINT64 */
.long .L44-.L60 /* FFI_TYPE_STRUCT */
.long .L50-.L60 /* FFI_TYPE_POINTER */
/* case double */
.L46:
lfd f1,0(r5)
b .L44
/* case float */
.L47:
lfs f1,0(r5)
b .L44
/* case long long */
.L48:
lwz r3,0(r5)
lwz r4,4(r5)
b .L44
/* case default / int32 / pointer */ .align 4
.L50:
lwz r3,0(r5) nop
b .L44 nop
nop
/* case signed int8 */ Lget_ret_type0_addr:
.L55: blrl
addi r5,r5,3
lbz r3,0(r5) /* case FFI_TYPE_VOID */
extsb r3,r3 Lret_type0:
b .L44 b Lfinish
nop
/* case unsigned int8 */ nop
.L56: nop
addi r5,r5,3
lbz r3,0(r5) /* case FFI_TYPE_INT */
b .L44 Lret_type1:
lwz r3,0(r5)
/* case signed int16 */ b Lfinish
.L57: nop
addi r5,r5,2 nop
lhz r3,0(r5)
extsh r3,r3 /* case FFI_TYPE_FLOAT */
b .L44 Lret_type2:
lfs f1,0(r5)
/* case unsigned int16 */ b Lfinish
.L58: nop
addi r5,r5,2 nop
lhz r3,0(r5)
/* case FFI_TYPE_DOUBLE */
/* case void / done */ Lret_type3:
.L44: lfd f1,0(r5)
b Lfinish
addi r1,r1,176 /* restore stack pointer */ nop
lwz r0,8(r1) /* get return address */ nop
mtlr r0 /* reset link register */
/* case FFI_TYPE_LONGDOUBLE */
Lret_type4:
lfd f1,0(r5)
b Lfinish
nop
nop
/* case FFI_TYPE_UINT8 */
Lret_type5:
lbz r3,3(r5)
b Lfinish
nop
nop
/* case FFI_TYPE_SINT8 */
Lret_type6:
lbz r3,3(r5)
extsb r3,r3
b Lfinish
nop
/* case FFI_TYPE_UINT16 */
Lret_type7:
lhz r3,2(r5)
b Lfinish
nop
nop
/* case FFI_TYPE_SINT16 */
Lret_type8:
lha r3,2(r5)
b Lfinish
nop
nop
/* case FFI_TYPE_UINT32 */
Lret_type9:
lwz r3,0(r5)
b Lfinish
nop
nop
/* case FFI_TYPE_SINT32 */
Lret_type10:
lwz r3,0(r5)
b Lfinish
nop
nop
/* case FFI_TYPE_UINT64 */
Lret_type11:
lwz r3,0(r5)
lwz r4,4(r5)
b Lfinish
nop
/* case FFI_TYPE_SINT64 */
Lret_type12:
lwz r3,0(r5)
lwz r4,4(r5)
b Lfinish
nop
/* case FFI_TYPE_STRUCT */
Lret_type13:
b Lfinish
nop
nop
nop
/* case FFI_TYPE_POINTER */
Lret_type14:
lwz r3,0(r5)
b Lfinish
nop
nop
/* case done */
Lfinish:
addi r1,r1,176 /* restore stack pointer */
lwz r0,8(r1) /* get return address */
mtlr r0 /* reset link register */
blr blr
/* END(ffi_closure_ASM) */ /* END(ffi_closure_ASM) */
.data .data
.section __TEXT,__eh_frame .section __TEXT,__eh_frame
...@@ -233,4 +280,24 @@ LASFDE1: ...@@ -233,4 +280,24 @@ LASFDE1:
.byte 0x7e ; sleb128 -2 .byte 0x7e ; sleb128 -2
.align 2 .align 2
LEFDE1: LEFDE1:
.data
.align 2
LDFCM0:
.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
.align 2
Lffi_closure_helper_DARWIN$stub:
.indirect_symbol _ffi_closure_helper_DARWIN
mflr r0
bcl 20,31,LO$ffi_closure_helper_DARWIN
LO$ffi_closure_helper_DARWIN:
mflr r11
addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)
mtlr r0
lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11)
mtctr r12
bctr
.data
.lazy_symbol_pointer
L_ffi_closure_helper_DARWIN$lazy_ptr:
.indirect_symbol _ffi_closure_helper_DARWIN
.long dyld_stub_binding_helper
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment