130 lines
4.0 KiB
ArmAsm
130 lines
4.0 KiB
ArmAsm
/*********************************************************************/
|
|
/* */
|
|
/* Objective Caml */
|
|
/* */
|
|
/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */
|
|
/* */
|
|
/* Copyright 1996 Institut National de Recherche en Informatique et */
|
|
/* en Automatique. All rights reserved. This file is distributed */
|
|
/* under the terms of the Q Public License version 1.0. */
|
|
/* */
|
|
/*********************************************************************/
|
|
|
|
/* $Id$ */
|
|
|
|
/* Save and restore all callee-save registers */
|
|
/* GPR 14 at sp+16 ... GPR 31 at sp+84
|
|
FPR 14 at sp+92 ... FPR 31 at sp+228 */
|
|
|
|
#define Save_callee_save \
|
|
addic r11, r1, 16-4; \
|
|
stwu r14, 4(r11); \
|
|
stwu r15, 4(r11); \
|
|
stwu r16, 4(r11); \
|
|
stwu r17, 4(r11); \
|
|
stwu r18, 4(r11); \
|
|
stwu r19, 4(r11); \
|
|
stwu r20, 4(r11); \
|
|
stwu r21, 4(r11); \
|
|
stwu r22, 4(r11); \
|
|
stwu r23, 4(r11); \
|
|
stwu r24, 4(r11); \
|
|
stwu r25, 4(r11); \
|
|
stwu r26, 4(r11); \
|
|
stwu r27, 4(r11); \
|
|
stwu r28, 4(r11); \
|
|
stwu r29, 4(r11); \
|
|
stwu r30, 4(r11); \
|
|
stwu r31, 4(r11); \
|
|
stfdu f14, 8(r11); \
|
|
stfdu f15, 8(r11); \
|
|
stfdu f16, 8(r11); \
|
|
stfdu f17, 8(r11); \
|
|
stfdu f18, 8(r11); \
|
|
stfdu f19, 8(r11); \
|
|
stfdu f20, 8(r11); \
|
|
stfdu f21, 8(r11); \
|
|
stfdu f22, 8(r11); \
|
|
stfdu f23, 8(r11); \
|
|
stfdu f24, 8(r11); \
|
|
stfdu f25, 8(r11); \
|
|
stfdu f26, 8(r11); \
|
|
stfdu f27, 8(r11); \
|
|
stfdu f28, 8(r11); \
|
|
stfdu f29, 8(r11); \
|
|
stfdu f30, 8(r11); \
|
|
stfdu f31, 8(r11)
|
|
|
|
#define Restore_callee_save \
|
|
addic r11, r1, 16-4; \
|
|
lwzu r14, 4(r11); \
|
|
lwzu r15, 4(r11); \
|
|
lwzu r16, 4(r11); \
|
|
lwzu r17, 4(r11); \
|
|
lwzu r18, 4(r11); \
|
|
lwzu r19, 4(r11); \
|
|
lwzu r20, 4(r11); \
|
|
lwzu r21, 4(r11); \
|
|
lwzu r22, 4(r11); \
|
|
lwzu r23, 4(r11); \
|
|
lwzu r24, 4(r11); \
|
|
lwzu r25, 4(r11); \
|
|
lwzu r26, 4(r11); \
|
|
lwzu r27, 4(r11); \
|
|
lwzu r28, 4(r11); \
|
|
lwzu r29, 4(r11); \
|
|
lwzu r30, 4(r11); \
|
|
lwzu r31, 4(r11); \
|
|
lfdu f14, 8(r11); \
|
|
lfdu f15, 8(r11); \
|
|
lfdu f16, 8(r11); \
|
|
lfdu f17, 8(r11); \
|
|
lfdu f18, 8(r11); \
|
|
lfdu f19, 8(r11); \
|
|
lfdu f20, 8(r11); \
|
|
lfdu f21, 8(r11); \
|
|
lfdu f22, 8(r11); \
|
|
lfdu f23, 8(r11); \
|
|
lfdu f24, 8(r11); \
|
|
lfdu f25, 8(r11); \
|
|
lfdu f26, 8(r11); \
|
|
lfdu f27, 8(r11); \
|
|
lfdu f28, 8(r11); \
|
|
lfdu f29, 8(r11); \
|
|
lfdu f30, 8(r11); \
|
|
lfdu f31, 8(r11)
|
|
|
|
.text
|
|
|
|
.globl _call_gen_code
|
|
_call_gen_code:
|
|
/* Allocate and link stack frame */
|
|
stwu r1, -256(r1)
|
|
/* Save return address */
|
|
mflr r0
|
|
stw r0, 256+4(r1)
|
|
/* Save all callee-save registers */
|
|
Save_callee_save
|
|
/* Shuffle arguments */
|
|
mtlr r3
|
|
mr r3, r4
|
|
mr r4, r5
|
|
mr r5, r6
|
|
mr r6, r7
|
|
/* Call the function */
|
|
blrl
|
|
/* Restore callee-save registers */
|
|
Restore_callee_save
|
|
/* Reload return address */
|
|
lwz r0, 256+4(r1)
|
|
mtlr r0
|
|
/* Return */
|
|
addi r1, r1, 256
|
|
blr
|
|
|
|
.globl _caml_c_call
|
|
_caml_c_call:
|
|
/* Jump to C function (address in 11) */
|
|
mtctr r11
|
|
bctr
|