aboutsummaryrefslogtreecommitdiff
path: root/libffi/src/powerpc
diff options
context:
space:
mode:
authorAndreas Tobler <a.tobler@schweiz.ch>2003-03-10 19:10:26 +0000
committerAndreas Tobler <a.tobler@schweiz.ch>2003-03-10 19:10:26 +0000
commitcfe72dcb321205967798bc4857b5199a8a35a0a5 (patch)
tree40e4332e44b402603848f7bd75701c8af56e13e4 /libffi/src/powerpc
parente2a53f2aa9f3f4e631f136c0517e13069d46bc93 (diff)
Andreas Tobler <a.tobler@schweiz.ch>
* src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@64106 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libffi/src/powerpc')
-rw-r--r--libffi/src/powerpc/darwin_closure.S249
1 files changed, 158 insertions, 91 deletions
diff --git a/libffi/src/powerpc/darwin_closure.S b/libffi/src/powerpc/darwin_closure.S
index 9ae17d8cce8..9f721de8a61 100644
--- a/libffi/src/powerpc/darwin_closure.S
+++ b/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
-
-/* case long long */
-.L48:
- lwz r3,0(r5)
- lwz r4,4(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 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 */
-.L56:
- addi r5,r5,3
- lbz r3,0(r5)
- b .L44
-
-/* case signed int16 */
-.L57:
- addi r5,r5,2
- lhz r3,0(r5)
- extsh r3,r3
- b .L44
-
-/* case unsigned int16 */
-.L58:
- addi r5,r5,2
- lhz r3,0(r5)
-
-/* case void / done */
-.L44:
-
- addi r1,r1,176 /* restore stack pointer */
- lwz r0,8(r1) /* get return address */
- mtlr r0 /* reset link register */
+ .align 4
+
+ nop
+ nop
+ nop
+Lget_ret_type0_addr:
+ blrl
+
+/* case FFI_TYPE_VOID */
+Lret_type0:
+ b Lfinish
+ nop
+ nop
+ nop
+
+/* case FFI_TYPE_INT */
+Lret_type1:
+ lwz r3,0(r5)
+ b Lfinish
+ nop
+ nop
+
+/* 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