mirror of git://gcc.gnu.org/git/gcc.git
Andreas Tobler <a.tobler@schweiz.ch>
* src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. From-SVN: r64106
This commit is contained in:
parent
b405370260
commit
70144e9c6c
|
@ -1,3 +1,7 @@
|
|||
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>
|
||||
|
||||
* libffi/src/powerpc/darwin_closure.S:
|
||||
|
|
|
@ -25,21 +25,19 @@
|
|||
----------------------------------------------------------------------- */
|
||||
|
||||
#define LIBFFI_ASM
|
||||
#define JUMPTARGET(name) name
|
||||
#define L(x) x
|
||||
.text
|
||||
.globl _ffi_closure_helper_DARWIN
|
||||
|
||||
.file "darwin_closure.S"
|
||||
.text
|
||||
.align 2
|
||||
.align 2
|
||||
.globl _ffi_closure_ASM
|
||||
|
||||
|
||||
.text
|
||||
.align 2
|
||||
_ffi_closure_ASM:
|
||||
LFB1:
|
||||
mflr r0 /* extract return address */
|
||||
stw r0, 8(r1) /* save the return address */
|
||||
mflr r0 /* extract return address */
|
||||
stw r0, 8(r1) /* save the return address */
|
||||
LCFI0:
|
||||
/* 24 Bytes (Linkage Area)
|
||||
32 Bytes (outgoing parameter area, always reserved)
|
||||
|
@ -47,7 +45,7 @@ LCFI0:
|
|||
8 Bytes (result)
|
||||
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 */
|
||||
LCFI1:
|
||||
/* we want to build up an area for the parameters passed
|
||||
|
@ -97,98 +95,147 @@ LCFI1:
|
|||
addi r7,r1,232
|
||||
|
||||
/* make the call */
|
||||
bl L(_ffi_closure_helper_DARWIN)
|
||||
|
||||
bl Lffi_closure_helper_DARWIN$stub
|
||||
|
||||
/* now r3 contains the return type */
|
||||
/* so use it to look up in a table */
|
||||
/* so we know how to deal with each type */
|
||||
|
||||
/* look up the proper starting point in table */
|
||||
/* by using return type as offset */
|
||||
addi r5,r1,160 /* get pointer to results area */
|
||||
addis r4,0,ha16(.L60) /* get address of jump table */
|
||||
addi r4,r4,lo16(.L60)
|
||||
slwi r3,r3,2 /* now multiply return type by 4 */
|
||||
lwzx r3,r4,r3 /* get the contents of that table value */
|
||||
add r3,r3,r4 /* add contents of table to table address */
|
||||
addi r5,r1,160 /* get pointer to results area */
|
||||
bl Lget_ret_type0_addr /* get pointer to Lret_type0 into LR */
|
||||
mflr r4 /* move to r4 */
|
||||
slwi r3,r3,4 /* now multiply return type by 16 */
|
||||
add r3,r3,r4 /* add contents of table to table address */
|
||||
mtctr r3
|
||||
bctr /* jump to it */
|
||||
bctr /* jump to it */
|
||||
LFE1:
|
||||
.align 2
|
||||
|
||||
.L60:
|
||||
.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
|
||||
/* 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 */
|
||||
/* first. */
|
||||
|
||||
/* case long long */
|
||||
.L48:
|
||||
lwz r3,0(r5)
|
||||
lwz r4,4(r5)
|
||||
b .L44
|
||||
|
||||
/* case default / int32 / pointer */
|
||||
.L50:
|
||||
lwz r3,0(r5)
|
||||
b .L44
|
||||
|
||||
/* case signed int8 */
|
||||
.L55:
|
||||
addi r5,r5,3
|
||||
lbz r3,0(r5)
|
||||
extsb r3,r3
|
||||
b .L44
|
||||
.align 4
|
||||
|
||||
/* case unsigned int8 */
|
||||
.L56:
|
||||
addi r5,r5,3
|
||||
lbz r3,0(r5)
|
||||
b .L44
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
Lget_ret_type0_addr:
|
||||
blrl
|
||||
|
||||
/* case signed int16 */
|
||||
.L57:
|
||||
addi r5,r5,2
|
||||
lhz r3,0(r5)
|
||||
extsh r3,r3
|
||||
b .L44
|
||||
/* case FFI_TYPE_VOID */
|
||||
Lret_type0:
|
||||
b Lfinish
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
/* case unsigned int16 */
|
||||
.L58:
|
||||
addi r5,r5,2
|
||||
lhz r3,0(r5)
|
||||
/* case FFI_TYPE_INT */
|
||||
Lret_type1:
|
||||
lwz r3,0(r5)
|
||||
b Lfinish
|
||||
nop
|
||||
nop
|
||||
|
||||
/* case void / done */
|
||||
.L44:
|
||||
|
||||
addi r1,r1,176 /* restore stack pointer */
|
||||
lwz r0,8(r1) /* get return address */
|
||||
mtlr r0 /* reset link register */
|
||||
/* case FFI_TYPE_FLOAT */
|
||||
Lret_type2:
|
||||
lfs f1,0(r5)
|
||||
b Lfinish
|
||||
nop
|
||||
nop
|
||||
|
||||
/* case FFI_TYPE_DOUBLE */
|
||||
Lret_type3:
|
||||
lfd f1,0(r5)
|
||||
b Lfinish
|
||||
nop
|
||||
nop
|
||||
|
||||
/* 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
|
||||
|
||||
/* END(ffi_closure_ASM) */
|
||||
|
||||
/* END(ffi_closure_ASM) */
|
||||
|
||||
.data
|
||||
.section __TEXT,__eh_frame
|
||||
|
@ -233,4 +280,24 @@ LASFDE1:
|
|||
.byte 0x7e ; sleb128 -2
|
||||
.align 2
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue