Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

190 lines (155 sloc) 4.239 kB
#include "../includes/ghcconfig.h"
/* ******************************** PowerPC ******************************** */
#if defined(powerpc_HOST_ARCH) || defined(powerpc64_HOST_ARCH)
#if !(defined(powerpc_HOST_ARCH) && defined(linux_HOST_OS))
/* The following code applies, with some differences,
to all powerpc platforms except for powerpc32-linux,
whose calling convention is annoyingly complex.
*/
/* The code is "almost" the same for
32-bit and for 64-bit
*/
#if defined(powerpc64_HOST_ARCH)
#define WS 8
#define LOAD ld
#define STORE std
#else
#define WS 4
#define LOAD lwz
#define STORE stw
#endif
/* Some info about stack frame layout */
#define LINK_SLOT (2*WS)
#define LINKAGE_AREA_SIZE (6*WS)
/* The following defines mirror struct AdjustorStub
from Adjustor.c. Make sure to keep these in sync.
*/
#if defined(powerpc_HOST_ARCH) && defined(darwin_HOST_OS)
#define HEADER_WORDS 6
#elif defined(powerpc64_HOST_ARCH) && defined(darwin_HOST_OS)
#else
#define HEADER_WORDS 3
#endif
#define HPTR_OFF ((HEADER_WORDS )*WS)
#define WPTR_OFF ((HEADER_WORDS + 1)*WS)
#define FRAMESIZE_OFF ((HEADER_WORDS + 2)*WS)
#define EXTRA_WORDS_OFF ((HEADER_WORDS + 3)*WS)
/* Darwin insists on register names, everyone else prefers
to use numbers. */
#if !defined(darwin_HOST_OS)
#define r0 0
#define r1 1
#define r2 2
#define r3 3
#define r4 4
#define r5 5
#define r6 6
#define r7 7
#define r8 8
#define r9 9
#define r10 10
#define r11 11
#define r12 12
#define r30 30
#define r31 31
#endif
.text
#if LEADING_UNDERSCORE
.globl _adjustorCode
_adjustorCode:
#else
.globl adjustorCode
/* Note that we don't build a function descriptor
for AIX-derived ABIs here. This will happen at runtime
in createAdjustor().
*/
adjustorCode:
#endif
/* On entry, r2 will point to the AdjustorStub data structure. */
/* save the link */
mflr r0
STORE r0, LINK_SLOT(r1)
/* set up stack frame */
LOAD r12, FRAMESIZE_OFF(r2)
#ifdef powerpc64_HOST_ARCH
stdux r1, r1, r12
#else
stwux r1, r1, r12
#endif
/* Save some regs so that we can use them.
Note that we use the "Red Zone" below the stack pointer.
*/
STORE r31, -WS(r1)
STORE r30, -2*WS(r1)
mr r31, r1
subf r30, r12, r31
LOAD r12, EXTRA_WORDS_OFF(r2)
mtctr r12
b 2f
1:
LOAD r0, LINKAGE_AREA_SIZE + 8*WS(r30)
STORE r0, LINKAGE_AREA_SIZE + 10*WS(r31)
addi r30, r30, WS
addi r31, r31, WS
2:
bdnz 1b
/* Restore r30 and r31 now.
*/
LOAD r31, -WS(r1)
LOAD r30, -2*WS(r1)
STORE r10, LINKAGE_AREA_SIZE + 9*WS(r1)
STORE r9, LINKAGE_AREA_SIZE + 8*WS(r1)
mr r10, r8
mr r9, r7
mr r8, r6
mr r7, r5
mr r6, r4
mr r5, r3
LOAD r3, HPTR_OFF(r2)
LOAD r12, WPTR_OFF(r2)
#if defined(darwin_HOST_OS)
mtctr r12
#else
LOAD r0, 0(r12)
/* The function we're calling will never be a nested function,
so we don't load r11.
*/
mtctr r0
LOAD r2, WS(r12)
#endif
bctrl
LOAD r1, 0(r1)
LOAD r0, LINK_SLOT(r1)
mtlr r0
blr
#endif
/* ********************************* i386 ********************************** */
#elif defined(i386_HOST_ARCH) && defined(darwin_HOST_OS)
#define WS 4
#define RETVAL_OFF 5
#define HEADER_BYTES 8
#define HPTR_OFF HEADER_BYTES
#define WPTR_OFF (HEADER_BYTES + 1*WS)
#define FRAMESIZE_OFF (HEADER_BYTES + 2*WS)
#define ARGWORDS_OFF (HEADER_BYTES + 3*WS)
.globl _adjustorCode
_adjustorCode:
popl %eax
subl $RETVAL_OFF, %eax
pushl %ebp
movl %esp, %ebp
subl FRAMESIZE_OFF(%eax), %esp
pushl %esi
pushl %edi
leal 8(%ebp), %esi
leal 12(%esp), %edi
movl ARGWORDS_OFF(%eax), %ecx
rep
movsl
popl %edi
popl %esi
pushl HPTR_OFF(%eax)
call *WPTR_OFF(%eax)
leave
ret
#endif
Jump to Line
Something went wrong with that request. Please try again.