ocaml/testasmcomp/power-rhapsody.S

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