ocaml/testasmcomp/power-aix.S

153 lines
3.5 KiB
ArmAsm

#*********************************************************************
#* *
#* Objective Caml *
#* *
#* Xavier Leroy, projet Cristal, INRIA Rocquencourt *
#* *
#* Copyright 1996 Institut National de Recherche en Informatique et *
#* Automatique. Distributed only by permission. *
#* *
#*********************************************************************
# $Id$
.csect .text[PR]
.globl .call_gen_code
.call_gen_code:
# Save return address
mflr 0
stw 0, 8(1)
# Save all callee-save registers
stw 13,-76(1)
stw 14,-72(1)
stw 15,-68(1)
stw 16,-64(1)
stw 17,-60(1)
stw 18,-56(1)
stw 19,-52(1)
stw 20,-48(1)
stw 21,-44(1)
stw 22,-40(1)
stw 23,-36(1)
stw 24,-32(1)
stw 25,-28(1)
stw 26,-24(1)
stw 27,-20(1)
stw 28,-16(1)
stw 29,-12(1)
stw 30,-8(1)
stw 31,-4(1)
stfd 14, -224(1)
stfd 15, -216(1)
stfd 16, -208(1)
stfd 17, -200(1)
stfd 18, -192(1)
stfd 19, -184(1)
stfd 20, -176(1)
stfd 21, -168(1)
stfd 22, -160(1)
stfd 23, -152(1)
stfd 24, -144(1)
stfd 25, -136(1)
stfd 26, -128(1)
stfd 27, -120(1)
stfd 28, -112(1)
stfd 29, -104(1)
stfd 30, -96(1)
stfd 31, -88(1)
# Allocate and link stack frame
stwu 1, -280(1)
# Save global pointer
stw 2, 20(1)
# Load code to call
lwz 0, 0(3)
lwz 2, 4(3)
mtlr 0
# Shuffle arguments
mr 3, 4
mr 4, 5
mr 5, 6
mr 6, 7
# Call the function
blrl
# Restore global pointer
lwz 2, 20(1)
# Deallocate stack frame
addic 1, 1, 280
# Restore callee-save registers
lwz 13,-76(1)
lwz 14,-72(1)
lwz 15,-68(1)
lwz 16,-64(1)
lwz 17,-60(1)
lwz 18,-56(1)
lwz 19,-52(1)
lwz 20,-48(1)
lwz 21,-44(1)
lwz 22,-40(1)
lwz 23,-36(1)
lwz 24,-32(1)
lwz 25,-28(1)
lwz 26,-24(1)
lwz 27,-20(1)
lwz 28,-16(1)
lwz 29,-12(1)
lwz 30,-8(1)
lwz 31,-4(1)
lfd 14, -224(1)
lfd 15, -216(1)
lfd 16, -208(1)
lfd 17, -200(1)
lfd 18, -192(1)
lfd 19, -184(1)
lfd 20, -176(1)
lfd 21, -168(1)
lfd 22, -160(1)
lfd 23, -152(1)
lfd 24, -144(1)
lfd 25, -136(1)
lfd 26, -128(1)
lfd 27, -120(1)
lfd 28, -112(1)
lfd 29, -104(1)
lfd 30, -96(1)
lfd 31, -88(1)
# Reload return address
lwz 0, 8(1)
mtlr 0
# Return
blr
.globl .caml_c_call
.caml_c_call:
# Preserve RTOC and return address in callee-save registers
# The C function will preserve them, and the Caml code does not
# expect them to be preserved
# Return address is in 25, RTOC is in 26
mflr 25
mr 26, 2
# Call desired function (descriptor in r11)
lwz 0, 0(11)
lwz 2, 4(11)
mtlr 0
blrl
# Restore return address and RTOC
mtlr 25
mr 2, 26
# Return to caller
blr
# Function closures
.globl call_gen_code
.csect call_gen_code[DS]
call_gen_code:
.long .call_gen_code, TOC[tc0], 0
.globl caml_c_call
.csect caml_c_call[DS]
caml_c_call:
.long .caml_c_call, TOC[tc0], 0