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>
|
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 @@
|
||||||
----------------------------------------------------------------------- */
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
#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:
|
||||||
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:
|
||||||
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 */
|
.align 4
|
||||||
.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
|
|
||||||
|
|
||||||
/* case unsigned int8 */
|
nop
|
||||||
.L56:
|
nop
|
||||||
addi r5,r5,3
|
nop
|
||||||
lbz r3,0(r5)
|
Lget_ret_type0_addr:
|
||||||
b .L44
|
blrl
|
||||||
|
|
||||||
/* case signed int16 */
|
/* case FFI_TYPE_VOID */
|
||||||
.L57:
|
Lret_type0:
|
||||||
addi r5,r5,2
|
b Lfinish
|
||||||
lhz r3,0(r5)
|
nop
|
||||||
extsh r3,r3
|
nop
|
||||||
b .L44
|
nop
|
||||||
|
|
||||||
/* case unsigned int16 */
|
/* case FFI_TYPE_INT */
|
||||||
.L58:
|
Lret_type1:
|
||||||
addi r5,r5,2
|
lwz r3,0(r5)
|
||||||
lhz r3,0(r5)
|
b Lfinish
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
|
||||||
/* case void / done */
|
/* case FFI_TYPE_FLOAT */
|
||||||
.L44:
|
Lret_type2:
|
||||||
|
lfs f1,0(r5)
|
||||||
addi r1,r1,176 /* restore stack pointer */
|
b Lfinish
|
||||||
lwz r0,8(r1) /* get return address */
|
nop
|
||||||
mtlr r0 /* reset link register */
|
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
|
blr
|
||||||
|
|
||||||
/* END(ffi_closure_ASM) */
|
/* END(ffi_closure_ASM) */
|
||||||
|
|
||||||
.data
|
.data
|
||||||
.section __TEXT,__eh_frame
|
.section __TEXT,__eh_frame
|
||||||
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue