ocaml/asmrun/m68k.S

260 lines
7.9 KiB
ArmAsm
Raw Normal View History

|***********************************************************************
|* *
|* Objective Caml *
|* *
|* Xavier Leroy, projet Cristal, INRIA Rocquencourt *
|* *
|* Copyright 1996 Institut National de Recherche en Informatique et *
|* Automatique. Distributed only by permission. *
|* *
|***********************************************************************
| $Id$
| Asm part of the runtime system, Motorola 68k processor
.comm _young_limit, 4
.comm _young_ptr, 4
.comm _gc_entry_regs, 48
.comm _caml_bottom_of_stack, 4
.comm _caml_top_of_stack, 4
.comm _caml_last_return_address, 4
.comm _caml_exception_pointer, 4
.comm _caml_requested_size, 4
| Allocation
.text
.globl _caml_call_gc
.globl _caml_alloc1
.globl _caml_alloc2
.globl _caml_alloc3
.globl _caml_alloc
_caml_call_gc:
| Save desired size
movel d5, _caml_requested_size
| Record lowest stack address and return address
movel a7@, _caml_last_return_address
movel a7, d5
addql #4, d5
movel d5, _caml_bottom_of_stack
| Record current allocation pointer (for debugging)
movel d6, _young_ptr
| Save all regs used by the code generator
movel a0, _gc_entry_regs
movel a1, _gc_entry_regs + 4
movel a2, _gc_entry_regs + 8
movel a3, _gc_entry_regs + 12
movel a4, _gc_entry_regs + 16
movel a5, _gc_entry_regs + 20
movel a6, _gc_entry_regs + 24
movel d0, _gc_entry_regs + 28
movel d1, _gc_entry_regs + 32
movel d2, _gc_entry_regs + 36
movel d3, _gc_entry_regs + 40
movel d4, _gc_entry_regs + 44
fmovem fp0-fp7, a7@-
| Call the garbage collector
jbsr _garbage_collection
| Restore all regs used by the code generator
fmovem a7@+, fp0-fp7
movel _gc_entry_regs, a0
movel _gc_entry_regs + 4, a1
movel _gc_entry_regs + 8, a2
movel _gc_entry_regs + 12, a3
movel _gc_entry_regs + 16, a4
movel _gc_entry_regs + 20, a5
movel _gc_entry_regs + 24, a6
movel _gc_entry_regs + 28, d0
movel _gc_entry_regs + 32, d1
movel _gc_entry_regs + 36, d2
movel _gc_entry_regs + 40, d3
movel _gc_entry_regs + 44, d4
| Reload allocation pointer and allocate block
movel _young_ptr, d6
subl _caml_requested_size, d6
| Return to caller
rts
_caml_alloc1:
subql #8, d6
cmpl _young_limit, d6
bcs L100
rts
L100: moveq #8, d5
bra _caml_call_gc
_caml_alloc2:
subl #12, d6
cmpl _young_limit, d6
bcs L101
rts
L101: moveq #12, d5
bra _caml_call_gc
_caml_alloc3:
subl #16, d6
cmpl _young_limit, d6
bcs L102
rts
L102: moveq #16, d5
bra _caml_call_gc
_caml_alloc:
subl d5, d6
cmpl _young_limit, d6
bcs _caml_call_gc
rts
| Call a C function from Caml
.globl _caml_c_call
_caml_c_call:
| Record lowest stack address and return address
movel a7@+, _caml_last_return_address
movel a7, _caml_bottom_of_stack
| Save allocation pointer and exception pointer
movel d6, _young_ptr
movel d7, _caml_exception_pointer
| Call the function (address in a0)
jbsr a0@
| Reload allocation pointer
movel _young_ptr, d6
| Return to caller
movel _caml_last_return_address, a1
jmp a1@
| Start the Caml program
.globl _caml_start_program
_caml_start_program:
| Save callee-save registers
moveml a2-a6/d2-d7, a7@-
fmovem fp2-fp7, a7@-
| Build an exception handler
pea L103
pea 0
movel a7, d7
| Record highest stack address
movel a7, _caml_top_of_stack
| Load allocation pointer
movel _young_ptr, d6
| Go for it
jbsr _caml_program
| Pop handler
addql #8, a7
| Zero return code
clrl d0
bra L104
L103:
| Return exception bucket
movel a0, d0
L104:
| Restore registers and return
fmovem a7@+, fp2-fp7
moveml a7@+, a2-a6/d2-d7
rts
| Raise an exception from C
.globl _raise_caml_exception
_raise_caml_exception:
movel a7@(4), a0 | exception bucket
movel _young_ptr, d6
movel _caml_exception_pointer, a7
movel a7@+, d7
rts
| Callback from C to Caml
.globl _callback
_callback:
link a6, #0
| Save callee-save registers
moveml a2-a6/d2-d7, a7@-
fmovem fp2-fp7, a7@-
| Initial loading of arguments
movel a6@(8), a1 | closure
movel a6@(12), a0 | argument
movel a1@(0), a5 | code pointer
L106:
| Build a callback link
movel _caml_last_return_address, a7@-
movel _caml_bottom_of_stack, a7@-
| Build an exception handler
pea L108
movel _caml_exception_pointer, a7@-
movel a7, d7
| Load allocation pointer
movel _young_ptr, d6
| Call the Caml code
jbsr a5@
L107:
| Move result where C code expects it
movel a0, d0
| Save allocation pointer
movel d6, _young_ptr
| Pop the exception handler
movel a7@+, _caml_exception_pointer
addql #4, a7
| Pop the callback link, restoring the global variables
| used by caml_c_call
movel a7@+, _caml_bottom_of_stack
movel a7@+, _caml_last_return_address
| Restore callee-save registers and return
fmovem a7@+, fp2-fp7
moveml a7@+, a2-a6/d2-d7
unlk a6
rts
L108:
| Exception handler
| Save allocation pointer and exception pointer
movel d6, _young_ptr
movel d7, _caml_exception_pointer
| Pop the callback link, restoring the global variables
| used by caml_c_call
movel a7@+, _caml_bottom_of_stack
movel a7@+, _caml_last_return_address
| Re-raise the exception through mlraise,
| so that local C roots are cleaned up correctly.
movel a0, a7@- | exn bucket is the argument
jbsr _mlraise | never returns
.globl _callback2
_callback2:
link a6, #0
| Save callee-save registers
moveml a2-a6/d2-d7, a7@-
fmovem fp2-fp7, a7@-
| Initial loading of arguments
movel a6@(8), a2 | closure
movel a6@(12), a0 | first argument
movel a6@(16), a1 | second argument
lea _caml_apply2, a5 | code pointer
bra L106
.globl _callback3
_callback3:
link a6, #0
| Save callee-save registers
moveml a2-a6/d2-d7, a7@-
fmovem fp2-fp7, a7@-
| Initial loading of arguments
movel a6@(8), a3 | closure
movel a6@(12), a0 | first argument
movel a6@(16), a1 | second argument
movel a6@(20), a2 | third argument
lea _caml_apply3, a5 | code pointer
bra L106
.data
.globl _system_frametable
_system_frametable:
.long 1 | one descriptor
.long L107 | return address into callback
.word -1 | negative frame size => use callback link
.word 0 | no roots here