summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/asmrun/alpha.S
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/asmrun/alpha.S')
-rw-r--r--ocaml-binary-annot/asmrun/alpha.S440
1 files changed, 440 insertions, 0 deletions
diff --git a/ocaml-binary-annot/asmrun/alpha.S b/ocaml-binary-annot/asmrun/alpha.S
new file mode 100644
index 0000000000..c5251b73a5
--- /dev/null
+++ b/ocaml-binary-annot/asmrun/alpha.S
@@ -0,0 +1,440 @@
+/***********************************************************************/
+/* */
+/* 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 GNU Library General Public License, with */
+/* the special exception on linking described in file ../LICENSE. */
+/* */
+/***********************************************************************/
+
+/* $Id$ */
+
+/* Asm part of the runtime system, Alpha processor */
+
+/* Allocation */
+
+ .text
+ .globl caml_alloc2
+ .globl caml_alloc3
+ .globl caml_allocN
+ .globl caml_call_gc
+
+/* Note: the profiling code sets $27 to the address of the "normal" entrypoint.
+ So don't pass parameters to those routines in $27. */
+
+/* caml_alloc* : all code generator registers preserved,
+ $gp preserved, $27 not necessarily valid on entry */
+
+ .globl caml_alloc1
+ .ent caml_alloc1
+ .align 3
+caml_alloc1:
+ .prologue 0
+ subq $13, 16, $13
+ cmpult $13, $14, $25
+ bne $25, $100
+ ret ($26)
+$100: ldiq $25, 16
+ br $110
+ .end caml_alloc1
+
+ .globl caml_alloc2
+ .ent caml_alloc2
+ .align 3
+caml_alloc2:
+ .prologue 0
+ subq $13, 24, $13
+ cmpult $13, $14, $25
+ bne $25, $101
+ ret ($26)
+$101: ldiq $25, 24
+ br $110
+ .end caml_alloc2
+
+ .globl caml_alloc3
+ .ent caml_alloc3
+ .align 3
+caml_alloc3:
+ .prologue 0
+ subq $13, 32, $13
+ cmpult $13, $14, $25
+ bne $25, $102
+ ret ($26)
+$102: ldiq $25, 32
+ br $110
+ .end caml_alloc3
+
+ .globl caml_allocN
+ .ent caml_allocN
+ .align 3
+caml_allocN:
+ .prologue 0
+ subq $13, $25, $13
+ .set noat
+ cmpult $13, $14, $at
+ bne $at, $110
+ .set at
+ ret ($26)
+ .end caml_allocN
+
+ .globl caml_call_gc
+ .ent caml_call_gc
+ .align 3
+caml_call_gc:
+ .prologue 0
+ ldiq $25, 0
+$110: lda $sp, -0x200($sp)
+ /* 0x200 = 32*8 (ints) + 32*8 (floats) */
+ stq $26, 0x1F8($sp) /* return address */
+ stq $gp, 0x1F0($sp) /* caller's $gp */
+ stq $25, 0x1E8($sp) /* desired size */
+ /* Rebuild $gp */
+ br $27, $103
+$103: ldgp $gp, 0($27)
+ /* Record lowest stack address, return address, GC regs */
+ stq $26, caml_last_return_address
+ lda $24, 0x200($sp)
+ stq $24, caml_bottom_of_stack
+ lda $24, 0x100($sp)
+ stq $24, caml_gc_regs
+ /* Save current allocation pointer for debugging purposes */
+$113: stq $13, caml_young_ptr
+ /* Save trap pointer in case an exception is raised (e.g. sighandler) */
+ stq $15, caml_exception_pointer
+ /* Save all integer regs used by the code generator in the context */
+ stq $0, 0 * 8 ($24)
+ stq $1, 1 * 8 ($24)
+ stq $2, 2 * 8 ($24)
+ stq $3, 3 * 8 ($24)
+ stq $4, 4 * 8 ($24)
+ stq $5, 5 * 8 ($24)
+ stq $6, 6 * 8 ($24)
+ stq $7, 7 * 8 ($24)
+ stq $8, 8 * 8 ($24)
+ stq $9, 9 * 8 ($24)
+ stq $10, 10 * 8 ($24)
+ stq $11, 11 * 8 ($24)
+ stq $12, 12 * 8 ($24)
+ stq $16, 16 * 8 ($24)
+ stq $17, 17 * 8 ($24)
+ stq $18, 18 * 8 ($24)
+ stq $19, 19 * 8 ($24)
+ stq $20, 20 * 8 ($24)
+ stq $21, 21 * 8 ($24)
+ stq $22, 22 * 8 ($24)
+ /* Save all float regs that are not callee-save on the stack */
+ stt $f0, 0 * 8 ($sp)
+ stt $f1, 1 * 8 ($sp)
+ stt $f10, 10 * 8 ($sp)
+ stt $f11, 11 * 8 ($sp)
+ stt $f12, 12 * 8 ($sp)
+ stt $f13, 13 * 8 ($sp)
+ stt $f14, 14 * 8 ($sp)
+ stt $f15, 15 * 8 ($sp)
+ stt $f16, 16 * 8 ($sp)
+ stt $f17, 17 * 8 ($sp)
+ stt $f18, 18 * 8 ($sp)
+ stt $f19, 19 * 8 ($sp)
+ stt $f20, 20 * 8 ($sp)
+ stt $f21, 21 * 8 ($sp)
+ stt $f22, 22 * 8 ($sp)
+ stt $f23, 23 * 8 ($sp)
+ stt $f24, 24 * 8 ($sp)
+ stt $f25, 25 * 8 ($sp)
+ stt $f26, 26 * 8 ($sp)
+ stt $f27, 27 * 8 ($sp)
+ stt $f29, 29 * 8 ($sp)
+ stt $f30, 30 * 8 ($sp)
+ /* Call the garbage collector */
+ jsr caml_garbage_collection
+ ldgp $gp, 0($26)
+ /* Restore all regs used by the code generator */
+ lda $24, 0x100($sp)
+ ldq $0, 0 * 8 ($24)
+ ldq $1, 1 * 8 ($24)
+ ldq $2, 2 * 8 ($24)
+ ldq $3, 3 * 8 ($24)
+ ldq $4, 4 * 8 ($24)
+ ldq $5, 5 * 8 ($24)
+ ldq $6, 6 * 8 ($24)
+ ldq $7, 7 * 8 ($24)
+ ldq $8, 8 * 8 ($24)
+ ldq $9, 9 * 8 ($24)
+ ldq $10, 10 * 8 ($24)
+ ldq $11, 11 * 8 ($24)
+ ldq $12, 12 * 8 ($24)
+ ldq $16, 16 * 8 ($24)
+ ldq $17, 17 * 8 ($24)
+ ldq $18, 18 * 8 ($24)
+ ldq $19, 19 * 8 ($24)
+ ldq $20, 20 * 8 ($24)
+ ldq $21, 21 * 8 ($24)
+ ldq $22, 22 * 8 ($24)
+ ldt $f0, 0 * 8 ($sp)
+ ldt $f1, 1 * 8 ($sp)
+ ldt $f10, 10 * 8 ($sp)
+ ldt $f11, 11 * 8 ($sp)
+ ldt $f12, 12 * 8 ($sp)
+ ldt $f13, 13 * 8 ($sp)
+ ldt $f14, 14 * 8 ($sp)
+ ldt $f15, 15 * 8 ($sp)
+ ldt $f16, 16 * 8 ($sp)
+ ldt $f17, 17 * 8 ($sp)
+ ldt $f18, 18 * 8 ($sp)
+ ldt $f19, 19 * 8 ($sp)
+ ldt $f20, 20 * 8 ($sp)
+ ldt $f21, 21 * 8 ($sp)
+ ldt $f22, 22 * 8 ($sp)
+ ldt $f23, 23 * 8 ($sp)
+ ldt $f24, 24 * 8 ($sp)
+ ldt $f25, 25 * 8 ($sp)
+ ldt $f26, 26 * 8 ($sp)
+ ldt $f27, 27 * 8 ($sp)
+ ldt $f29, 29 * 8 ($sp)
+ ldt $f30, 30 * 8 ($sp)
+ /* Reload new allocation pointer and allocation limit */
+ ldq $13, caml_young_ptr
+ ldq $14, caml_young_limit
+ /* Allocate space for the block */
+ ldq $25, 0x1E8($sp)
+ subq $13, $25, $13
+ cmpult $13, $14, $25 /* Check that we have enough free space */
+ bne $25, $113 /* If not, call GC again */
+ /* Say that we are back into Caml code */
+ stq $31, caml_last_return_address
+ /* Return to caller */
+ ldq $26, 0x1F8($sp)
+ ldq $gp, 0x1F0($sp)
+ lda $sp, 0x200($sp)
+ ret ($26)
+
+ .end caml_call_gc
+
+/* Call a C function from Caml */
+/* Function to call is in $25 */
+
+ .globl caml_c_call
+ .ent caml_c_call
+ .align 3
+caml_c_call:
+ .prologue 0
+ /* Preserve return address and caller's $gp in callee-save registers */
+ mov $26, $9
+ mov $gp, $10
+ /* Rebuild $gp */
+ br $27, $104
+$104: ldgp $gp, 0($27)
+ /* Record lowest stack address and return address */
+ lda $11, caml_last_return_address
+ stq $26, 0($11)
+ stq $sp, caml_bottom_of_stack
+ /* Make the exception handler and alloc ptr available to the C code */
+ lda $12, caml_young_ptr
+ stq $13, 0($12)
+ lda $14, caml_young_limit
+ stq $15, caml_exception_pointer
+ /* Call the function */
+ mov $25, $27
+ jsr ($25)
+ /* Reload alloc ptr and alloc limit */
+ ldq $13, 0($12) /* $12 still points to caml_young_ptr */
+ ldq $14, 0($14) /* $14 still points to caml_young_limit */
+ /* Say that we are back into Caml code */
+ stq $31, 0($11) /* $11 still points to caml_last_return_address */
+ /* Restore $gp */
+ mov $10, $gp
+ /* Return */
+ ret ($9)
+
+ .end caml_c_call
+
+/* Start the Caml program */
+
+ .globl caml_start_program
+ .ent caml_start_program
+ .align 3
+caml_start_program:
+ ldgp $gp, 0($27)
+ lda $25, caml_program
+
+/* Code shared with caml_callback* */
+$107:
+ /* Save return address */
+ lda $sp, -128($sp)
+ stq $26, 0($sp)
+ /* Save all callee-save registers */
+ stq $9, 8($sp)
+ stq $10, 16($sp)
+ stq $11, 24($sp)
+ stq $12, 32($sp)
+ stq $13, 40($sp)
+ stq $14, 48($sp)
+ stq $15, 56($sp)
+ stt $f2, 64($sp)
+ stt $f3, 72($sp)
+ stt $f4, 80($sp)
+ stt $f5, 88($sp)
+ stt $f6, 96($sp)
+ stt $f7, 104($sp)
+ stt $f8, 112($sp)
+ stt $f9, 120($sp)
+ /* Set up a callback link on the stack. */
+ lda $sp, -32($sp)
+ ldq $0, caml_bottom_of_stack
+ stq $0, 0($sp)
+ ldq $1, caml_last_return_address
+ stq $1, 8($sp)
+ ldq $1, caml_gc_regs
+ stq $1, 16($sp)
+ /* Set up a trap frame to catch exceptions escaping the Caml code */
+ lda $sp, -16($sp)
+ ldq $15, caml_exception_pointer
+ stq $15, 0($sp)
+ lda $0, $109
+ stq $0, 8($sp)
+ mov $sp, $15
+ /* Reload allocation pointers */
+ ldq $13, caml_young_ptr
+ ldq $14, caml_young_limit
+ /* We are back into Caml code */
+ stq $31, caml_last_return_address
+ /* Call the Caml code */
+ mov $25, $27
+$108: jsr ($25)
+ /* Reload $gp, masking off low bit in retaddr (might have been marked) */
+ bic $26, 1, $26
+ ldgp $gp, 4($26)
+ /* Pop the trap frame, restoring caml_exception_pointer */
+ ldq $15, 0($sp)
+ stq $15, caml_exception_pointer
+ lda $sp, 16($sp)
+ /* Pop the callback link, restoring the global variables */
+$112: ldq $24, 0($sp)
+ stq $24, caml_bottom_of_stack
+ ldq $25, 8($sp)
+ stq $25, caml_last_return_address
+ ldq $24, 16($sp)
+ stq $24, caml_gc_regs
+ lda $sp, 32($sp)
+ /* Update allocation pointer */
+ stq $13, caml_young_ptr
+ /* Reload callee-save registers */
+ ldq $9, 8($sp)
+ ldq $10, 16($sp)
+ ldq $11, 24($sp)
+ ldq $12, 32($sp)
+ ldq $13, 40($sp)
+ ldq $14, 48($sp)
+ ldq $15, 56($sp)
+ ldt $f2, 64($sp)
+ ldt $f3, 72($sp)
+ ldt $f4, 80($sp)
+ ldt $f5, 88($sp)
+ ldt $f6, 96($sp)
+ ldt $f7, 104($sp)
+ ldt $f8, 112($sp)
+ ldt $f9, 120($sp)
+ /* Return to caller */
+ ldq $26, 0($sp)
+ lda $sp, 128($sp)
+ ret ($26)
+
+ /* The trap handler */
+$109: ldgp $gp, 0($26)
+ /* Save exception pointer */
+ stq $15, caml_exception_pointer
+ /* Encode exception bucket as an exception result */
+ or $0, 2, $0
+ /* Return it */
+ br $112
+
+ .end caml_start_program
+
+/* Raise an exception from C */
+
+ .globl caml_raise_exception
+ .ent caml_raise_exception
+ .align 3
+caml_raise_exception:
+ ldgp $gp, 0($27)
+ mov $16, $0 /* Move exn bucket */
+ ldq $13, caml_young_ptr
+ ldq $14, caml_young_limit
+ stq $31, caml_last_return_address /* We're back into Caml */
+ ldq $sp, caml_exception_pointer
+ ldq $15, 0($sp)
+ ldq $26, 8($sp)
+ lda $sp, 16($sp)
+ jmp $25, ($26) /* Keep retaddr in $25 to help debugging */
+ .end caml_raise_exception
+
+/* Callback from C to Caml */
+
+ .globl caml_callback_exn
+ .ent caml_callback_exn
+ .align 3
+caml_callback_exn:
+ /* Initial shuffling of arguments */
+ ldgp $gp, 0($27)
+ mov $16, $25
+ mov $17, $16 /* first arg */
+ mov $25, $17 /* environment */
+ ldq $25, 0($25) /* code pointer */
+ br $107
+ .end caml_callback_exn
+
+ .globl caml_callback2_exn
+ .ent caml_callback2_exn
+ .align 3
+caml_callback2_exn:
+ ldgp $gp, 0($27)
+ mov $16, $25
+ mov $17, $16 /* first arg */
+ mov $18, $17 /* second arg */
+ mov $25, $18 /* environment */
+ lda $25, caml_apply2
+ br $107
+ .end caml_callback2_exn
+
+ .globl caml_callback3_exn
+ .ent caml_callback3_exn
+ .align 3
+caml_callback3_exn:
+ ldgp $gp, 0($27)
+ mov $16, $25
+ mov $17, $16 /* first arg */
+ mov $18, $17 /* second arg */
+ mov $19, $18 /* third arg */
+ mov $25, $19 /* environment */
+ lda $25, caml_apply3
+ br $107
+ .end caml_callback3_exn
+
+/* Glue code to call [caml_array_bound_error] */
+
+ .globl caml_ml_array_bound_error
+ .ent caml_ml_array_bound_error
+ .align 3
+caml_ml_array_bound_error:
+ br $27, $111
+$111: ldgp $gp, 0($27)
+ lda $25, caml_array_bound_error
+ br caml_c_call /* never returns */
+ .end caml_ml_array_bound_error
+
+#if defined(SYS_digital)
+ .rdata
+#else
+ .section .rodata
+#endif
+ .globl caml_system__frametable
+caml_system__frametable:
+ .quad 1 /* one descriptor */
+ .quad $108 + 4 /* return address into callback */
+ .word -1 /* negative frame size => use callback link */
+ .word 0 /* no roots here */
+ .align 3