diff --git a/asmrun/Makefile b/asmrun/Makefile index eea6422ba..ac75b24cf 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -1,22 +1,19 @@ include ../config/Makefile.h include ../Makefile.config +VPATH=.:../byterun + CFLAGS=-I../byterun -DTARGET_$(ARCH) -O $(CCCOMPOPTS) DFLAGS=-I../../byterun -DTARGET_$(ARCH) -g -DDEBUG $(CCCOMPOPTS) -COBJS=fail.o main.o roots.o signals.o +COBJS=misc.o main.o fail.o signals.o \ + freelist.o major_gc.o minor_gc.o memory.o alloc.o roots.o \ + compare.o ints.o floats.o str.o array.o io.o extern.o intern.o \ + hash.o sys.o parsing.o gc_ctrl.o terminfo.o crc.o obj.o ASMOBJS=$(ARCH).o -OTHEROBJS=../byterun/misc.o ../byterun/freelist.o \ - ../byterun/major_gc.o ../byterun/minor_gc.o ../byterun/memory.o \ - ../byterun/alloc.o ../byterun/compare.o \ - ../byterun/ints.o ../byterun/floats.o ../byterun/str.o \ - ../byterun/array.o ../byterun/io.o ../byterun/extern.o \ - ../byterun/intern.o ../byterun/hash.o ../byterun/sys.o \ - ../byterun/parsing.o ../byterun/gc_ctrl.o \ - ../byterun/terminfo.o ../byterun/crc.o ../byterun/obj.o -OBJS=$(COBJS) $(ASMOBJS) $(OTHEROBJS) -DOBJS=$(COBJS:.o=.d.o) $(ASMOBJS) $(OTHEROBJS:.o=.d.o) +OBJS=$(COBJS) $(ASMOBJS) +DOBJS=$(COBJS:.o=.d.o) $(ASMOBJS) all: libasmrun.a libasmrund.a diff --git a/asmrun/alpha.asm b/asmrun/alpha.asm index b840e2b76..8c6dbcef4 100644 --- a/asmrun/alpha.asm +++ b/asmrun/alpha.asm @@ -294,6 +294,6 @@ raise_caml_exception: ldq $15, 0($sp) ldq $27, 8($sp) lda $sp, 16($sp) - jmp $26, ($27) /* Keep retaddr in $26 to help debugging */ + jmp $25, ($27) /* Keep retaddr in $25 to help debugging */ .end raise_caml_exception diff --git a/asmrun/mips.asm b/asmrun/mips.asm new file mode 100644 index 000000000..db18d3cfe --- /dev/null +++ b/asmrun/mips.asm @@ -0,0 +1,255 @@ +/* Asm part of the runtime system, Mips processor */ + + .comm young_start, 4 + .comm young_end, 4 + .comm young_ptr, 4 + .comm gc_entry_regs, 4 * 32 + .comm gc_entry_float_regs, 8 * 16 + .comm caml_top_of_stack, 4 + .comm caml_bottom_of_stack, 4 + .comm caml_last_return_address, 4 + .comm caml_exception_pointer, 4 + .comm remembered_ptr, 4 + .comm remembered_end, 4 + +#define SAVE(r) sw $/**/r, gc_entry_regs + r * 4 +#define LOAD(r) lw $/**/r, gc_entry_regs + r * 4 +#define FSAVE(r) s.d $f/**/r, gc_entry_float_regs + r * 4 +#define FLOAD(r) l.d $f/**/r, gc_entry_float_regs + r * 4 + +/* Allocation */ + + .text + .globl caml_alloc1 + .globl caml_alloc2 + .globl caml_alloc3 + .globl caml_alloc + .globl caml_call_gc + .ent caml_alloc1 + +/* caml_alloc* : all code generator registers preserved. */ + +caml_alloc1: + subu $22, $22, 8 + bltu $22, $23, $100 + j $31 +$100: li $25, 8 + b caml_call_gc + +caml_alloc2: + subu $22, $22, 12 + bltu $22, $23, $101 + j $31 +$101: li $25, 12 + b caml_call_gc + +caml_alloc3: + subu $22, $22, 16 + bltu $22, $23, $102 + j $31 +$102: li $25, 16 + b caml_call_gc + +caml_alloc: + subu $22, $22, $25 + bltu $22, $23, caml_call_gc + j $31 + +caml_call_gc: + /* Record lowest stack address and return address */ + sw $31, caml_last_return_address + sw $sp, caml_bottom_of_stack + /* Save requested size */ + subu $sp, $sp, 8 + sw $31, 4($sp) + sw $25, 0($sp) + /* Save current allocation pointer for debugging purposes */ + sw $22, young_ptr + /* Save all regs used by the code generator in the arrays + /* gc_entry_regs and gc_entry_float_regs. */ + SAVE(2) + SAVE(3) + SAVE(4) + SAVE(5) + SAVE(6) + SAVE(7) + SAVE(8) + SAVE(9) + SAVE(10) + SAVE(11) + SAVE(12) + SAVE(13) + SAVE(14) + SAVE(15) + SAVE(16) + SAVE(17) + SAVE(18) + SAVE(19) + SAVE(20) + SAVE(21) + FSAVE(0) + FSAVE(2) + FSAVE(4) + FSAVE(6) + FSAVE(8) + FSAVE(12) + FSAVE(14) + FSAVE(16) + FSAVE(18) + FSAVE(20) + FSAVE(22) + FSAVE(24) + FSAVE(26) + FSAVE(28) + FSAVE(30) + /* Call the garbage collector */ + jal minor_collection + /* Restore all regs used by the code generator */ + LOAD(2) + LOAD(3) + LOAD(4) + LOAD(5) + LOAD(6) + LOAD(7) + LOAD(8) + LOAD(9) + LOAD(10) + LOAD(11) + LOAD(12) + LOAD(13) + LOAD(14) + LOAD(15) + LOAD(16) + LOAD(17) + LOAD(18) + LOAD(19) + LOAD(20) + LOAD(21) + FLOAD(0) + FLOAD(2) + FLOAD(4) + FLOAD(6) + FLOAD(8) + FLOAD(12) + FLOAD(14) + FLOAD(16) + FLOAD(18) + FLOAD(20) + FLOAD(22) + FLOAD(24) + FLOAD(26) + FLOAD(28) + FLOAD(30) + /* Reload new allocation pointer and allocation limit */ + lw $22, young_ptr + lw $23, young_start + /* Allocate space for the block */ + lw $25, 0($sp) + subu $22, $22, $25 + /* Return to caller */ + lw $31, 4($sp) + addu $sp, $sp, 8 + j $31 + + .end caml_alloc1 + +/* Call a C function from Caml */ + + .globl caml_c_call + .ent caml_c_call + +caml_c_call: + /* Function to call is in $25 */ + /* Record lowest stack address and return address */ + sw $31, caml_last_return_address + sw $sp, caml_bottom_of_stack + /* Make the exception handler and alloc ptr available to the C code */ + sw $22, young_ptr + sw $30, caml_exception_pointer + /* Call the function */ + jal $25 + /* Reload alloc ptr */ + lw $22, young_ptr + /* Return */ + lw $31, caml_last_return_address + j $31 + + .end caml_c_call + +/* Start the Caml program */ + + .globl caml_start_program + .globl stray_exn_handler + .ent caml_start_program +caml_start_program: + subu $sp, $sp, 88 + sw $31, 84($sp) + /* Save all callee-save registers */ + sw $16, 0($sp) + sw $17, 4($sp) + sw $18, 8($sp) + sw $19, 12($sp) + sw $20, 16($sp) + sw $21, 20($sp) + sw $22, 24($sp) + sw $23, 28($sp) + sw $30, 32($sp) + s.d $f20, 36($sp) + s.d $f22, 44($sp) + s.d $f24, 52($sp) + s.d $f26, 60($sp) + s.d $f28, 68($sp) + s.d $f30, 76($sp) + /* Build an exception handler */ + subu $sp, $sp, 8 + la $2, stray_exn_handler + sw $2, 4($sp) + move $30, $sp + sw $sp, caml_top_of_stack + /* Initialize allocation registers */ + lw $22, young_ptr + lw $23, young_start + /* Go for it */ + jal caml_program + /* Pop handler */ + addu $sp, $sp, 8 + /* Return with zero code */ + li $2, 0 + /* Restore registers */ +stray_exn_handler: + lw $31, 84($sp) + lw $16, 0($sp) + lw $17, 4($sp) + lw $18, 8($sp) + lw $19, 12($sp) + lw $20, 16($sp) + lw $21, 20($sp) + lw $22, 24($sp) + lw $23, 28($sp) + lw $30, 32($sp) + l.d $f20, 36($sp) + l.d $f22, 44($sp) + l.d $f24, 52($sp) + l.d $f26, 60($sp) + l.d $f28, 68($sp) + l.d $f30, 76($sp) + addu $sp, $sp, 88 + j $31 + + .end caml_start_program + +/* Raise an exception from C */ + + .globl raise_caml_exception + .ent raise_caml_exception +raise_caml_exception: + move $2, $4 + lw $22, young_ptr + lw $23, young_start + lw $sp, caml_exception_pointer + lw $30, 0($sp) + lw $2, 8($sp) + addu $sp, $sp, 8 + jal $2 /* Keep retaddr in $31 to help debugging */ + + .end raise_caml_exception diff --git a/asmrun/roots.c b/asmrun/roots.c index 95c2949df..cb8aae538 100644 --- a/asmrun/roots.c +++ b/asmrun/roots.c @@ -17,6 +17,13 @@ #define Mask_already_scanned(retaddr) (retaddr & ~1) #endif +#ifdef TARGET_mips +#define Saved_return_address(sp) *((long *)(sp - 4)) +/** #define Already_scanned(sp, retaddr) (retaddr & 1) + #define Mark_scanned(sp, retaddr) (*((long *)(sp - 8)) = retaddr | 1) + #define Mask_already_scanned(retaddr) (retaddr & ~1) **/ +#endif + #ifdef TARGET_i386 #define Saved_return_address(sp) *((long *)(sp - 4)) #endif