diff --git a/core/cpu/arm/architecture/architecture.factor b/core/cpu/arm/architecture/architecture.factor old mode 100644 new mode 100755 index 5a4a2bda3f..411d8047c0 --- a/core/cpu/arm/architecture/architecture.factor +++ b/core/cpu/arm/architecture/architecture.factor @@ -22,7 +22,7 @@ M: temp-reg v>operand drop R12 ; M: int-regs return-reg drop R0 ; M: int-regs param-regs drop { R0 R1 R2 R3 } ; -M: int-regs vregs drop { R0 R1 R2 R3 } ; +M: int-regs vregs drop { R0 R1 R2 R3 R4 R7 R8 R9 R10 R11 } ; ! No FPU support yet M: float-regs param-regs drop { } ; diff --git a/core/cpu/arm/bootstrap.factor b/core/cpu/arm/bootstrap.factor old mode 100644 new mode 100755 index 3ef3ffcee5..c124de8162 --- a/core/cpu/arm/bootstrap.factor +++ b/core/cpu/arm/bootstrap.factor @@ -1,4 +1,118 @@ -USING: bootstrap.image.private kernel namespaces system ; +! Copyright (C) 2007 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: bootstrap.image.private kernel namespaces system +cpu.arm.assembler math math.functions layouts words vocabs ; +IN: bootstrap.arm 4 \ cell set big-endian off + +4 jit-code-format set + +: ds-reg R5 ; + +: word-reg R0 ; +: quot-reg R0 ; +: scan-reg R2 ; +: temp-reg R3 ; +: xt-reg R12 ; + +: lr-save bootstrap-cell ; + +: stack-frame 8 bootstrap-cells ; + +: next-save stack-frame bootstrap-cell - ; +: xt-save stack-frame 2 bootstrap-cells - ; +: array-save stack-frame 3 bootstrap-cells - ; +: scan-save stack-frame 4 bootstrap-cells - ; + +[ + temp-reg quot-reg quot-array@ <+> LDR ! load array + scan-reg temp-reg scan@ ADD ! initialize scan pointer +] { } make jit-setup set + +[ + SP SP stack-frame SUB + xt-reg SP xt-save <+> STR ! save XT + xt-reg stack-frame MOV + xt-reg SP next-save <+> STR ! save frame size + temp-reg SP array-save <+> STR ! save array + LR SP lr-save stack-frame + <+> STR ! save return address +] { } make jit-prolog set + +[ + temp-reg scan-reg 4 LDR ! load literal and advance + temp-reg ds-reg 4 STR ! push literal +] { } make jit-push-literal set + +[ + temp-reg scan-reg 4 LDR ! load wrapper and advance + temp-reg dup wrapper@ <+> LDR ! load wrapped object + temp-reg ds-reg 4 STR ! push wrapped object +] { } make jit-push-wrapper set + +[ + R1 SP MOV ! pass stack pointer to primitive +] { } make jit-word-primitive-jump set + +[ + R1 SP MOV ! pass stack pointer to primitive +] { } make jit-word-primitive-call set + +: load-word-xt ( -- ) + word-reg scan-reg 4 LDR ! load word and advance + xt-reg word-reg word-xt@ <+> LDR ; + +: jit-call + scan-reg SP scan-save <+> STR ! save scan pointer + LR PC MOV ! save return address + PC xt-reg MOV ! call + scan-reg SP scan-save <+> LDR ! restore scan pointer + ; + +: jit-jump + PC xt-reg MOV ; + +[ load-word-xt jit-call ] { } make jit-word-call set + +[ load-word-xt jit-jump ] { } make jit-word-jump set + +: load-quot-xt + xt-reg quot-reg quot-xt@ <+> LDR ; + +: load-branch + temp-reg ds-reg -4 <-!> LDR ! pop boolean + temp-reg \ f tag-number CMP ! compare it with f + scan-reg quot-reg MOV ! point quot-reg at false branch + quot-reg dup 4 NE ADD ! point quot-reg at true branch + quot-reg dup 4 <+> LDR ! load the branch + scan-reg dup 12 ADD ! advance scan pointer + load-quot-xt + ; + +[ + load-branch jit-jump +] { } make jit-if-jump set + +[ + load-branch jit-call +] { } make jit-if-call set + +[ + temp-reg ds-reg 4 <-!> LDR ! pop index + temp-reg dup 1 MOV ! turn it into an array offset + scan-reg dup 4 <+> LDR ! load array + temp-reg dup scan-reg ADD ! compute quotation location + quot-reg temp-reg array-start <+> LDR ! load quotation + load-quot-xt + jit-jump +] { } make jit-dispatch set + +[ + SP SP stack-frame ADD ! pop stack frame + LR SP lr-save stack-frame + <+> LDR ! load return address +] { } make jit-epilog set + +[ PC LR MOV ] { } make jit-return set + +"bootstrap.arm" forget-vocab diff --git a/vm/cpu-arm.S b/vm/cpu-arm.S old mode 100644 new mode 100755 index f609b1f40c..86255dd96b --- a/vm/cpu-arm.S +++ b/vm/cpu-arm.S @@ -1,8 +1,125 @@ #include "asm.h" -/* Callable from C as -void *native_stack_pointer(void) */ - .globl MANGLE(native_stack_pointer) -MANGLE(native_stack_pointer): - mov r0,sp - mov pc,lr +/* Note that the XT is passed to the quotation in r12 */ +#define CALL_QUOT \ + ldr r12,[r0, #9] /* load quotation-xt slot */ ; \ + mov pc,lr ; \ + mov r11,pc + +#define JUMP_QUOT \ + ldr pc,[r0, #9] /* load quotation-xt slot */ + +#define SAVED_REGS_SIZE 32 + +#define FRAME (RESERVED_SIZE + SAVED_REGS_SIZE + 8) + +#define LR_SAVE [sp, #4] +#define RESERVED_SIZE 8 + +#define SAVE_LR str lr,LR_SAVE + +#define LOAD_LR ldr lr,LR_SAVE + +#define SAVE_AT(offset) (RESERVED_SIZE + 4 * offset) + +#define SAVE(register,offset) str register,[sp, #SAVE_AT(offset)] + +#define RESTORE(register,offset) ldr register,[sp, #SAVE_AT(offset)] + +#define PROLOGUE \ + sub sp,sp,#FRAME ; \ + SAVE_LR + +#define EPILOGUE \ + LOAD_LR ; \ + sub sp,sp,#FRAME + +DEF(void,c_to_factor,(CELL quot)): + PROLOGUE + + SAVE(r4,0) /* save GPRs */ + /* don't save ds pointer */ + /* don't save rs pointer */ + SAVE(r7,3) + SAVE(r8,4) + SAVE(r9,5) + SAVE(r10,6) + SAVE(r11,7) + SAVE(r0,8) /* save quotation since we're about to mangle it */ + + mov sp,r1 /* pass call stack pointer as an argument */ + bl MANGLE(save_callstack_bottom) + + RESTORE(r0,8) /* restore quotation */ + CALL_QUOT + + RESTORE(r11,7) /* restore GPRs */ + RESTORE(r10,6) + RESTORE(r9,5) + RESTORE(r8,4) + RESTORE(r7,3) + /* don't restore rs pointer */ + /* don't restore ds pointer */ + RESTORE(r4,0) + + EPILOGUE + mov lr,pc + +/* The JIT compiles an 'mov sp,r1' in front of every primitive call, since a +word which was defined as a primitive will not change its definition for the +lifetime of the image -- adding new primitives requires a bootstrap. However, +an undefined word can certainly become defined, + +DEFER: foo +... +: foo ... ; + +And calls to non-primitives do not have this one-instruction prologue, so we +set the XT of undefined words to this symbol. */ +DEF(void,undefined,(CELL word)): + mov sp,r1 + b MANGLE(undefined_error) + +DEF(void,dosym,(CELL word)): + str r0,[r5], #4 /* push word to stack */ + mov lr,pc /* return */ + +/* Here we have two entry points. The first one is taken when profiling is +enabled */ +DEF(void,docol_profiling,(CELL word)): + ldr r1,[r0, #25] /* load profile-count slot */ + add r1,r1,#8 /* increment count */ + str r1,[r0, #25] /* store profile-count slot */ +DEF(void,docol,(CELL word)): + ldr r0,[r0, #13] /* load word-def slot */ + JUMP_QUOT + +/* We must pass the XT to the quotation in r11. */ +DEF(void,primitive_call,(void)): + ldr r0,[r5, #-4]! /* load quotation from data stack */ + JUMP_QUOT + +/* We must preserve r1 here in case we're calling a primitive */ +DEF(void,primitive_execute,(void)): + ldr r0,[r5, #-4]! /* load word from data stack */ + ldr pc,[r0, #29] /* jump to word-xt */ + +DEF(void,set_callstack,(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length)): + sub sp,r0,r2 /* compute new stack pointer */ + mov r0,r1 /* start of destination of memcpy() */ + str sp,[sp, #-64] /* setup fake stack frame for memcpy() */ + bl MANGLE(memcpy) /* go */ + ldr sp,[sp] /* tear down fake stack frame */ + ldr pc,LR_SAVE /* return */ + +DEF(void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to)): + mov r1,sp /* compute new stack pointer */ + ldr lr,LR_SAVE /* we have rewound the stack; load return address */ + JUMP_QUOT /* call the quotation */ + +DEF(void,lazy_jit_compile,(CELL quot)): + mov sp,r1 /* save stack pointer */ + PROLOGUE + bl MANGLE(primitive_jit_compile) + EPILOGUE + JUMP_QUOT /* call the quotation */ diff --git a/vm/cpu-arm.h b/vm/cpu-arm.h old mode 100644 new mode 100755 index ae8b4e5a8d..cdb66ff0ef --- a/vm/cpu-arm.h +++ b/vm/cpu-arm.h @@ -2,16 +2,17 @@ register CELL ds asm("r5"); register CELL rs asm("r6"); -register void **primitives asm("r7"); -void *native_stack_pointer(void); +#define F_FASTCALL -typedef CELL F_COMPILED_FRAME; +void c_to_factor(CELL quot); +void dosym(CELL word); +void docol_profiling(CELL word); +void docol(CELL word); +void undefined(CELL word); +void set_callstack(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length, void *memcpy); +void throw_impl(CELL quot, F_STACK_FRAME *rewind); +void lazy_jit_compile(CELL quot); +void flush_icache(CELL start, CELL len); -#define PREVIOUS_FRAME(frame) (frame + 1) -#define RETURN_ADDRESS(frame) (*(frame)) - -INLINE void execute(CELL word) -{ - untag_object(word)->xt(word); -} +#define FRAME_RETURN_ADDRESS(frame) *((XT *)(frame_successor(frame) + 1) + 1) diff --git a/vm/errors.h b/vm/errors.h old mode 100644 new mode 100755 index 5295197f40..cbb8bed016 --- a/vm/errors.h +++ b/vm/errors.h @@ -41,3 +41,9 @@ INLINE void type_check(CELL type, CELL tagged) { if(type_of(tagged) != type) type_error(type,tagged); } + +/* Global variables used to pass fault handler state from signal handler to +user-space */ +CELL signal_number; +CELL signal_fault_addr; +void *signal_callstack_top; diff --git a/vm/os-unix.h b/vm/os-unix.h old mode 100644 new mode 100755 index c1239bb83c..f5dcf8dda5 --- a/vm/os-unix.h +++ b/vm/os-unix.h @@ -40,11 +40,5 @@ void sleep_millis(CELL msec); void reset_stdio(void); -/* Global variables used to pass fault handler state from signal handler to -user-space */ -CELL signal_number; -CELL signal_fault_addr; -void *signal_callstack_top; - void memory_signal_handler_impl(void); void misc_signal_handler_impl(void); diff --git a/vm/os-windows-ce-arm.S b/vm/os-windows-ce-arm.S old mode 100644 new mode 100755 index 9e9ed2ae37..b8b1d41d6c --- a/vm/os-windows-ce-arm.S +++ b/vm/os-windows-ce-arm.S @@ -2,17 +2,18 @@ .globl run_toplevel - .word exception_handler + .word exception_handler .word 0 -run_toplevel: - ldr pc, _Prun +c_to_factor_toplevel: + ldr pc, _Pc_to_factor -_Prun: .word run +_Pc_to_factor: + .word c_to_factor .section .pdata - .word run_toplevel + .word c_to_factor_toplevel .word 0xc0000002 | (0xFFFFF << 8) diff --git a/vm/os-windows-ce.c b/vm/os-windows-ce.c old mode 100644 new mode 100755 index 1d6547dc4b..9ebbd8fe7a --- a/vm/os-windows-ce.c +++ b/vm/os-windows-ce.c @@ -23,10 +23,10 @@ DEFINE_PRIMITIVE(cd) char *strerror(int err) { /* strerror() is not defined on WinCE */ - return "strerror() is not defined on WinCE. Use native io"; + return "strerror() is not defined on WinCE. Use native I/O."; } -void flush_icache() +void flush_icache(CELL start, CELL end) { FlushInstructionCache(GetCurrentProcess(), 0, 0); } @@ -37,10 +37,14 @@ char *getenv(char *name) return 0; /* unreachable */ } + + long exception_handler(PEXCEPTION_RECORD rec, void *frame, void *ctx, void *dispatch) { - memory_protection_error( - rec->ExceptionInformation[1] & 0x1ffffff, - native_stack_pointer()); - return -1; /* unreachable */ + return 0; +} + +void c_to_factor_toplevel(CELL quot) +{ + c_to_factor(quot); } diff --git a/vm/os-windows-ce.h b/vm/os-windows-ce.h old mode 100644 new mode 100755 index 10103593f8..f73fb0a08c --- a/vm/os-windows-ce.h +++ b/vm/os-windows-ce.h @@ -2,6 +2,7 @@ #define UNICODE #endif +#include #include typedef wchar_t F_SYMBOL; @@ -23,7 +24,4 @@ char *getenv(char *name); #define EINTR 0 s64 current_millis(void); - -DECLARE_PRIMITIVE(cwd); -DECLARE_PRIMITIVE(cd); - +void c_to_factor_toplevel(CELL quot); diff --git a/vm/os-windows-nt.h b/vm/os-windows-nt.h old mode 100644 new mode 100755 index f3017b0cbe..452e42448b --- a/vm/os-windows-nt.h +++ b/vm/os-windows-nt.h @@ -5,6 +5,8 @@ #define UNICODE #endif +#include + typedef char F_SYMBOL; #define unbox_symbol_string unbox_char_string @@ -16,10 +18,8 @@ typedef char F_SYMBOL; void c_to_factor_toplevel(CELL quot); -CELL signal_number; -CELL signal_fault_addr; -void *signal_callstack_top; - void memory_signal_handler_impl(void); void divide_by_zero_signal_handler_impl(void); void misc_signal_handler_impl(void); + +long exception_handler(PEXCEPTION_POINTERS pe); diff --git a/vm/os-windows.c b/vm/os-windows.c old mode 100644 new mode 100755 index 1be3e2a2af..6e39422134 --- a/vm/os-windows.c +++ b/vm/os-windows.c @@ -1,6 +1,6 @@ #include "master.h" -F_STRING *get_error_message() +F_STRING *get_error_message(void) { DWORD id = GetLastError(); F_CHAR *msg = error_message(id); @@ -36,7 +36,7 @@ F_CHAR *error_message(DWORD id) HMODULE hFactorDll; -void init_ffi() +void init_ffi(void) { hFactorDll = GetModuleHandle(FACTOR_DLL); if(!hFactorDll) @@ -120,8 +120,12 @@ DEFINE_PRIMITIVE(stat) dpush(tag_fixnum(0)); box_unsigned_8( (u64)st.nFileSizeLow | (u64)st.nFileSizeHigh << 32); - box_unsigned_8( - ((*(u64*)&st.ftLastWriteTime - EPOCH_OFFSET) / 10000000)); + + u64 lo = st.ftLastWriteTime.dwLowDateTime; + u64 hi = st.ftLastWriteTime.dwHighDateTime; + u64 modTime = (hi << 32) + lo; + + box_unsigned_8((modTime - EPOCH_OFFSET) / 10000000); FindClose(h); } } diff --git a/vm/os-windows.h b/vm/os-windows.h old mode 100644 new mode 100755 index ed9b87aa93..f252c214af --- a/vm/os-windows.h +++ b/vm/os-windows.h @@ -1,4 +1,3 @@ -#include #include #ifndef wcslen @@ -49,5 +48,3 @@ s64 current_millis(void); INLINE void reset_stdio(void) {} -long exception_handler(PEXCEPTION_POINTERS pe); - diff --git a/vm/run.s b/vm/run.s new file mode 100644 index 0000000000..8700b6cce8 --- /dev/null +++ b/vm/run.s @@ -0,0 +1,1117 @@ + .file "run.c" + .text + .align 0 + .global reset_datastack + .def reset_datastack; .scl 2; .type 32; .endef +reset_datastack: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + @ link register save eliminated. + ldr r3, .L3 + @ lr needed for prologue + ldr r2, [r3, #0] + ldr r1, [r2, #24] + ldr r3, [r1, #0] + sub r5, r3, #4 + mov pc, lr +.L4: + .align 0 +.L3: + .word stack_chain + .align 0 + .global reset_retainstack + .def reset_retainstack; .scl 2; .type 32; .endef +reset_retainstack: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + @ link register save eliminated. + ldr r3, .L7 + @ lr needed for prologue + ldr r2, [r3, #0] + ldr r1, [r2, #28] + ldr r3, [r1, #0] + sub r6, r3, #4 + mov pc, lr +.L8: + .align 0 +.L7: + .word stack_chain + .align 0 + .global save_stacks + .def save_stacks; .scl 2; .type 32; .endef +save_stacks: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + @ link register save eliminated. + ldr r3, .L11 + @ lr needed for prologue + ldr r2, [r3, #0] + str r6, [r2, #12] + str r5, [r2, #8] + mov pc, lr +.L12: + .align 0 +.L11: + .word stack_chain + .align 0 + .global init_stacks + .def init_stacks; .scl 2; .type 32; .endef +init_stacks: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + @ link register save eliminated. + ldr r3, .L15 + ldr r2, .L15+4 + str r0, [r3, #0] + ldr r3, .L15+8 + str r1, [r2, #0] + mov r1, #0 + @ lr needed for prologue + str r1, [r3, #0] + mov pc, lr +.L16: + .align 0 +.L15: + .word ds_size + .word rs_size + .word stack_chain + .align 0 + .global enable_word_profiling + .def enable_word_profiling; .scl 2; .type 32; .endef +enable_word_profiling: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + @ link register save eliminated. + ldr r3, .L21 + ldr r2, [r0, #32] + @ lr needed for prologue + cmp r2, r3 + ldreq r3, .L21+4 + streq r3, [r0, #32] + mov pc, lr +.L22: + .align 0 +.L21: + .word docol + .word docol_profiling + .align 0 + .global disable_word_profiling + .def disable_word_profiling; .scl 2; .type 32; .endef +disable_word_profiling: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + @ link register save eliminated. + ldr r3, .L27 + ldr r2, [r0, #32] + @ lr needed for prologue + cmp r2, r3 + ldreq r3, .L27+4 + streq r3, [r0, #32] + mov pc, lr +.L28: + .align 0 +.L27: + .word docol_profiling + .word docol + .align 0 + .global primitive_3drop + .def primitive_3drop; .scl 2; .type 32; .endef +primitive_3drop: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + str lr, [sp, #-4]! + mov r0, r1 + bl save_callstack_top + sub r5, r5, #12 + ldr pc, [sp], #4 + .align 0 + .global primitive_2drop + .def primitive_2drop; .scl 2; .type 32; .endef +primitive_2drop: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + str lr, [sp, #-4]! + mov r0, r1 + bl save_callstack_top + sub r5, r5, #8 + ldr pc, [sp], #4 + .align 0 + .global primitive_millis + .def primitive_millis; .scl 2; .type 32; .endef +primitive_millis: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + str lr, [sp, #-4]! + mov r0, r1 + bl save_callstack_top + bl current_millis + ldr lr, [sp], #4 + b box_unsigned_8 + .align 0 + .global array_to_stack + .def array_to_stack; .scl 2; .type 32; .endef +array_to_stack: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + stmfd sp!, {r4, r7, lr} + ldr r4, [r0, #4] + mov r7, r1 + mov r4, r4, lsr #3 + mov r4, r4, asl #2 + add r1, r0, #8 + mov r2, r4 + mov r0, r7 + bl memcpy + add r4, r4, r7 + sub r0, r4, #4 + ldmfd sp!, {r4, r7, pc} + .align 0 + .global unnest_stacks + .def unnest_stacks; .scl 2; .type 32; .endef +unnest_stacks: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + stmfd sp!, {r4, lr} + ldr r4, .L39 + ldr r3, [r4, #0] + ldr r0, [r3, #24] + bl dealloc_segment + ldr r3, [r4, #0] + ldr r0, [r3, #28] + bl dealloc_segment + ldr r0, [r4, #0] + ldr r1, .L39+4 + ldr r2, [r0, #36] + ldr r5, [r0, #16] + ldr r6, [r0, #20] + str r2, [r1, #8] + ldr r3, [r0, #32] + str r3, [r1, #4] + ldr r2, [r0, #40] + ldr r1, [r0, #44] + ldr r3, .L39+8 + str r1, [r4, #0] + str r2, [r3, #0] + ldmfd sp!, {r4, lr} + b free +.L40: + .align 0 +.L39: + .word stack_chain + .word userenv + .word extra_roots + .align 0 + .global primitive_drop + .def primitive_drop; .scl 2; .type 32; .endef +primitive_drop: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + str lr, [sp, #-4]! + mov r0, r1 + bl save_callstack_top + sub r5, r5, #4 + ldr pc, [sp], #4 + .align 0 + .global primitive_swapd + .def primitive_swapd; .scl 2; .type 32; .endef +primitive_swapd: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldr r1, [r5, #-4] + ldr r2, [r5, #-8] + stmdb r5, {r1, r2} @ phole stm + ldr pc, [sp], #4 + .align 0 + .global primitive_swap + .def primitive_swap; .scl 2; .type 32; .endef +primitive_swap: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldr r1, [r5, #0] + ldr r2, [r5, #-4] + stmda r5, {r1, r2} @ phole stm + ldr pc, [sp], #4 + .align 0 + .global primitive__rot + .def primitive__rot; .scl 2; .type 32; .endef +primitive__rot: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldr r0, [r5, #0] + ldmdb r5, {r1, r2} @ phole ldm + stmda r5, {r0, r1, r2} @ phole stm + ldr pc, [sp], #4 + .align 0 + .global primitive_rot + .def primitive_rot; .scl 2; .type 32; .endef +primitive_rot: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldr r0, [r5, #0] + ldr r2, [r5, #-8] + ldr r1, [r5, #-4] + stmda r5, {r0, r2} @ phole stm + str r1, [r5, #-8] + ldr pc, [sp], #4 + .align 0 + .global primitive_3dup + .def primitive_3dup; .scl 2; .type 32; .endef +primitive_3dup: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldmda r5, {r0, r1, r2} @ phole ldm + mov r3, r5 + add r5, r5, #12 + str r2, [r3, #12] + stmdb r5, {r0, r1} @ phole stm + ldr pc, [sp], #4 + .align 0 + .global primitive_2dup + .def primitive_2dup; .scl 2; .type 32; .endef +primitive_2dup: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldr r0, [r5, #0] + ldr r2, [r5, #-4] + add r1, r5, #8 + mov r5, r1 + str r2, [r5, #-4] + str r0, [r5, #0] + ldr pc, [sp], #4 + .align 0 + .global primitive_sleep + .def primitive_sleep; .scl 2; .type 32; .endef +primitive_sleep: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + mov r3, r5 + ldr r0, [r3], #-4 + mov r5, r3 + bl to_cell + ldr lr, [sp], #4 + b sleep_millis + .align 0 + .global primitive_exit + .def primitive_exit; .scl 2; .type 32; .endef +primitive_exit: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + mov r3, r5 + ldr r0, [r3], #-4 + mov r5, r3 + bl to_fixnum + bl exit + .align 0 + .global primitive_to_r + .def primitive_to_r; .scl 2; .type 32; .endef +primitive_to_r: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + mov r3, r5 + ldr r1, [r3], #-4 + add r2, r6, #4 + mov r6, r2 + mov r5, r3 + str r1, [r6, #0] + ldr pc, [sp], #4 + .align 0 + .global primitive_eq + .def primitive_eq; .scl 2; .type 32; .endef +primitive_eq: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + mov r0, r5 + ldr r1, [r5, #-4] + ldr r2, [r0], #-4 + mov r3, #7 + cmp r2, r1 + ldreq r3, .L66 + mov r5, r0 + ldreq r3, [r3, #0] + str r3, [r0, #0] + ldr pc, [sp], #4 +.L67: + .align 0 +.L66: + .word T + .align 0 + .global primitive_getenv + .def primitive_getenv; .scl 2; .type 32; .endef +primitive_getenv: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldr r3, [r5, #0] + ldr r2, .L70 + mov r3, r3, asr #3 + ldr r1, [r2, r3, asl #2] + str r1, [r5, #0] + ldr pc, [sp], #4 +.L71: + .align 0 +.L70: + .word userenv + .align 0 + .global primitive_2nip + .def primitive_2nip; .scl 2; .type 32; .endef +primitive_2nip: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + str lr, [sp, #-4]! + mov r0, r1 + bl save_callstack_top + ldr r2, [r5, #0] + mov r3, r5 + sub r5, r5, #8 + str r2, [r3, #-8] + ldr pc, [sp], #4 + .align 0 + .global primitive_nip + .def primitive_nip; .scl 2; .type 32; .endef +primitive_nip: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + mov r2, r5 + ldr r1, [r2], #-4 + str r1, [r5, #-4] + mov r5, r2 + ldr pc, [sp], #4 + .align 0 + .global primitive_os_env + .def primitive_os_env; .scl 2; .type 32; .endef +primitive_os_env: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + str lr, [sp, #-4]! + mov r0, r1 + bl save_callstack_top + bl unbox_char_string + bl getenv + add r3, r5, #4 + cmp r0, #0 + moveq r5, r3 + moveq r3, #7 + streq r3, [r5, #0] + ldreq pc, [sp], #4 + ldr lr, [sp], #4 + b box_char_string + .align 0 + .global stack_to_array + .def stack_to_array; .scl 2; .type 32; .endef +stack_to_array: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + stmfd sp!, {r4, r7, r8, lr} + mov r8, r0 + rsb r1, r8, r1 + adds r7, r1, #4 + mov r0, #8 + mov r1, r7, asr #2 + mov r3, #0 + bmi .L85 + bl allot_array_internal + mov r1, r8 + mov r4, r0 + mov r2, r7 + add r0, r0, #8 + bl memcpy + bic r4, r4, #7 + add r3, r5, #4 + mov r5, r3 + orr r4, r4, #3 + str r4, [r5, #0] + mov r3, #1 +.L85: + mov r0, r3 + ldmfd sp!, {r4, r7, r8, pc} + .align 0 + .global primitive_from_r + .def primitive_from_r; .scl 2; .type 32; .endef +primitive_from_r: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + mov r3, r6 + ldr r1, [r3], #-4 + add r2, r5, #4 + mov r5, r2 + mov r6, r3 + str r1, [r5, #0] + ldr pc, [sp], #4 + .align 0 + .global primitive_pick + .def primitive_pick; .scl 2; .type 32; .endef +primitive_pick: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + str lr, [sp, #-4]! + mov r0, r1 + bl save_callstack_top + ldr r2, [r5, #-8] + mov r3, r5 + add r5, r5, #4 + str r2, [r3, #4] + ldr pc, [sp], #4 + .align 0 + .global primitive_over + .def primitive_over; .scl 2; .type 32; .endef +primitive_over: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + str lr, [sp, #-4]! + mov r0, r1 + bl save_callstack_top + ldr r2, [r5, #-4] + mov r3, r5 + add r5, r5, #4 + str r2, [r3, #4] + ldr pc, [sp], #4 + .align 0 + .global primitive_tuck + .def primitive_tuck; .scl 2; .type 32; .endef +primitive_tuck: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldr r0, [r5, #0] + ldr r2, [r5, #-4] + add r1, r5, #4 + mov r3, r5 + mov r5, r1 + stmda r3, {r0, r2} @ phole stm + str r0, [r5, #0] + ldr pc, [sp], #4 + .align 0 + .global primitive_dupd + .def primitive_dupd; .scl 2; .type 32; .endef +primitive_dupd: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldr r0, [r5, #0] + ldr r2, [r5, #-4] + add r1, r5, #4 + mov r3, r5 + mov r5, r1 + str r2, [r3, #0] + str r0, [r5, #0] + ldr pc, [sp], #4 + .align 0 + .global primitive_dup + .def primitive_dup; .scl 2; .type 32; .endef +primitive_dup: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + mov r2, r5 + ldr r1, [r2], #4 + str r1, [r5, #4] + mov r5, r2 + ldr pc, [sp], #4 + .align 0 + .global primitive_set_slot + .def primitive_set_slot; .scl 2; .type 32; .endef +primitive_set_slot: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + mov r0, r5 + ldr r1, [r0], #-4 + ldr ip, [r5, #-4] + ldr lr, [r0, #-4] + mov r1, r1, asr #3 + bic r3, ip, #7 + ldr r2, .L101 + str lr, [r3, r1, asl #2] + ldr r1, [r2, #0] + sub lr, r0, #4 + ldrb r3, [r1, ip, lsr #6] @ zero_extendqisi2 + mov r5, r0 + mvn r3, r3, asl #26 + mvn r3, r3, lsr #26 + mov r5, lr + sub r5, lr, #4 + strb r3, [r1, ip, lsr #6] + ldr pc, [sp], #4 +.L102: + .align 0 +.L101: + .word cards_offset + .align 0 + .global primitive_slot + .def primitive_slot; .scl 2; .type 32; .endef +primitive_slot: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + mov r1, r5 + ldr r2, [r1], #-4 + ldr r3, [r5, #-4] + mov r2, r2, asr #3 + bic r3, r3, #7 + ldr ip, [r3, r2, asl #2] + mov r0, r5 + mov r5, r1 + sub r5, r1, #4 + mov r5, r1 + str ip, [r0, #-4] + ldr pc, [sp], #4 + .align 0 + .global primitive_setenv + .def primitive_setenv; .scl 2; .type 32; .endef +primitive_setenv: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + mov r1, r5 + ldr r3, [r1], #-4 + ldr r0, [r5, #-4] + ldr r2, .L107 + mov r3, r3, asr #3 + mov r5, r1 + sub r5, r1, #4 + str r0, [r2, r3, asl #2] + ldr pc, [sp], #4 +.L108: + .align 0 +.L107: + .word userenv + .align 0 + .global primitive_class_hash + .def primitive_class_hash; .scl 2; .type 32; .endef +primitive_class_hash: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldr r3, [r5, #0] + and r2, r3, #7 + cmp r2, #2 + bic r0, r3, #7 + beq .L116 + cmp r2, #3 + bic r3, r3, #7 + ldreq r3, [r3, #0] + mov r0, r2, asl #3 + streq r3, [r5, #0] + strne r0, [r5, #0] + ldr pc, [sp], #4 +.L116: + ldr r3, [r0, #8] + bic r3, r3, #7 + ldr r2, [r3, #4] + str r2, [r5, #0] + ldr pc, [sp], #4 + .align 0 + .global primitive_tag + .def primitive_tag; .scl 2; .type 32; .endef +primitive_tag: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + str lr, [sp, #-4]! + mov r0, r1 + bl save_callstack_top + ldr r3, [r5, #0] + and r3, r3, #7 + mov r3, r3, asl #3 + str r3, [r5, #0] + ldr pc, [sp], #4 + .align 0 + .global nest_stacks + .def nest_stacks; .scl 2; .type 32; .endef +nest_stacks: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + stmfd sp!, {r4, lr} + mov r0, #48 + bl safe_malloc + mov r4, r0 + ldr r0, .L121 + str r5, [r4, #16] + str r6, [r4, #20] + ldr r3, [r0, #8] + mvn r2, #0 + str r3, [r4, #36] + ldr r1, [r0, #4] + ldr r3, .L121+4 + str r1, [r4, #32] + str r2, [r4, #0] + str r2, [r4, #4] + ldr r0, [r3, #0] + bl alloc_segment + ldr r3, .L121+8 + str r0, [r4, #24] + ldr r0, [r3, #0] + bl alloc_segment + ldr r3, .L121+12 + ldr ip, [r4, #24] + ldr r2, [r3, #0] + ldr r1, .L121+16 + str r2, [r4, #40] + ldr lr, [ip, #0] + ldr r2, [r0, #0] + ldr r3, [r1, #0] + sub r5, lr, #4 + sub r6, r2, #4 + str r3, [r4, #44] + str r0, [r4, #28] + str r4, [r1, #0] + ldmfd sp!, {r4, pc} +.L122: + .align 0 +.L121: + .word userenv + .word ds_size + .word rs_size + .word extra_roots + .word stack_chain + .align 0 + .global fix_stacks + .def fix_stacks; .scl 2; .type 32; .endef +fix_stacks: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + ldr r2, .L131 + add r3, r5, #4 + ldr r2, [r2, #0] + stmfd sp!, {r4, lr} + ldr r0, [r2, #24] + add r4, r6, #256 + ldr ip, [r0, #0] + add lr, r5, #256 + cmp r3, ip + add r1, r6, #4 + bcc .L124 + ldr r3, [r0, #8] + cmp lr, r3 + bcs .L124 +.L126: + ldr r2, [r2, #28] + ldr r0, [r2, #0] + cmp r1, r0 + bcc .L127 + ldr r3, [r2, #8] + cmp r4, r3 + ldmccfd sp!, {r4, pc} +.L127: + sub r6, r0, #4 + ldmfd sp!, {r4, pc} +.L124: + sub r5, ip, #4 + b .L126 +.L132: + .align 0 +.L131: + .word stack_chain + .align 0 + .global primitive_type + .def primitive_type; .scl 2; .type 32; .endef +primitive_type: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + str lr, [sp, #-4]! + bl save_callstack_top + ldr r3, [r5, #0] + bic r1, r3, #7 + and r3, r3, #7 + cmp r3, #3 + ldreq r3, [r1, #0] + moveq r3, r3, lsr #3 + mov r3, r3, asl #3 + str r3, [r5, #0] + ldr pc, [sp], #4 + .align 0 + .global default_word_xt + .def default_word_xt; .scl 2; .type 32; .endef +default_word_xt: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + ldr r3, .L154 + ldr r0, [r0, #16] + ldr r2, [r3, #0] + str lr, [sp, #-4]! + cmp r0, r2 + ldreq r0, .L154+4 + ldreq pc, [sp], #4 + and r1, r0, #7 + cmp r1, #3 + biceq r3, r0, #7 + ldreq r2, [r3, #0] + movne r2, r1 + moveq r2, r2, lsr #3 + cmp r2, #14 + beq .L153 + cmp r1, #3 + biceq r3, r0, #7 + ldreq r2, [r3, #0] + moveq r1, r2, lsr #3 + cmp r1, #0 + ldrne r0, .L154+8 + ldrne pc, [sp], #4 + bl to_fixnum + ldr r3, .L154+12 + ldr r0, [r3, r0, asl #2] + ldr pc, [sp], #4 +.L153: + ldr r3, .L154+16 + ldr r2, .L154+20 + ldrb r1, [r3, #0] @ zero_extendqisi2 + ldr r3, .L154+24 + cmp r1, #0 + moveq r0, r2 + movne r0, r3 + ldr pc, [sp], #4 +.L155: + .align 0 +.L154: + .word T + .word dosym + .word undefined + .word primitives + .word profiling + .word docol + .word docol_profiling + .align 0 + .global primitive_profiling + .def primitive_profiling; .scl 2; .type 32; .endef +primitive_profiling: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + stmfd sp!, {r4, r7, r8, lr} + mov r0, r1 + bl save_callstack_top + mov r3, r5 + ldr r0, [r3], #-4 + ldr r4, .L175 + mov r5, r3 + bl to_boolean + strb r0, [r4, #0] + bl begin_scan + ldr r8, .L175+4 + ldr r7, .L175+8 +.L173: + bl next_object + cmp r0, #7 + bic r2, r0, #7 + and r3, r0, #7 + beq .L174 +.L158: + cmp r3, #3 + ldreq r3, [r2, #0] + moveq r3, r3, lsr #3 + cmp r3, #17 + bne .L173 + ldrb r3, [r4, #0] @ zero_extendqisi2 + bic r2, r0, #7 + cmp r3, #0 + bic r0, r0, #7 + beq .L162 + ldr r3, [r2, #32] + cmp r3, r8 + streq r7, [r2, #32] + bl next_object + cmp r0, #7 + bic r2, r0, #7 + and r3, r0, #7 + bne .L158 +.L174: + ldr r3, .L175+12 + mov r2, #0 + strb r2, [r3, #0] + ldmfd sp!, {r4, r7, r8, pc} +.L162: + ldr r3, [r0, #32] + cmp r3, r7 + streq r8, [r0, #32] + b .L173 +.L176: + .align 0 +.L175: + .word profiling + .word docol + .word docol_profiling + .word gc_off + .align 0 + .global primitive_set_retainstack + .def primitive_set_retainstack; .scl 2; .type 32; .endef +primitive_set_retainstack: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + stmfd sp!, {r4, r7, lr} + bl save_callstack_top + mov r3, r5 + ldr r1, [r3], #-4 + mov r0, #8 + and r2, r1, #7 + cmp r2, #3 + bic r4, r1, #7 + mov r5, r3 + ldreq r3, [r4, #0] + moveq r2, r3, lsr #3 + cmp r2, #8 + blne type_error +.L181: + ldr r3, .L184 + ldr r7, [r4, #4] + ldr r2, [r3, #0] + add r1, r4, #8 + ldr r0, [r2, #28] + mov r7, r7, lsr #3 + ldr r4, [r0, #0] + mov r7, r7, asl #2 + mov r0, r4 + mov r2, r7 + bl memcpy + add r4, r4, r7 + sub r6, r4, #4 + ldmfd sp!, {r4, r7, pc} +.L185: + .align 0 +.L184: + .word stack_chain + .align 0 + .global primitive_set_datastack + .def primitive_set_datastack; .scl 2; .type 32; .endef +primitive_set_datastack: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + mov r0, r1 + stmfd sp!, {r4, r7, lr} + bl save_callstack_top + mov r3, r5 + ldr r1, [r3], #-4 + mov r0, #8 + and r2, r1, #7 + cmp r2, #3 + bic r4, r1, #7 + mov r5, r3 + ldreq r3, [r4, #0] + moveq r2, r3, lsr #3 + cmp r2, #8 + blne type_error +.L190: + ldr r3, .L193 + ldr r7, [r4, #4] + ldr r2, [r3, #0] + add r1, r4, #8 + ldr r0, [r2, #24] + mov r7, r7, lsr #3 + ldr r4, [r0, #0] + mov r7, r7, asl #2 + mov r0, r4 + mov r2, r7 + bl memcpy + add r4, r4, r7 + sub r5, r4, #4 + ldmfd sp!, {r4, r7, pc} +.L194: + .align 0 +.L193: + .word stack_chain + .align 0 + .global primitive_retainstack + .def primitive_retainstack; .scl 2; .type 32; .endef +primitive_retainstack: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + stmfd sp!, {r4, r7, r8, lr} + mov r0, r1 + bl save_callstack_top + ldr ip, .L200 + mov r1, #7 + ldr lr, [ip, #0] + mov r0, #8 + ldr r4, [lr, #28] + mov r2, r1 + ldr r8, [r4, #0] + mov r3, #0 + rsb ip, r8, r6 + adds r7, ip, #4 + bmi .L196 + mov r1, r7, asr #2 + bl allot_array_internal + mov r1, r8 + mov r4, r0 + mov r2, r7 + add r0, r0, #8 + bl memcpy + bic r4, r4, #7 + add r3, r5, #4 + mov r5, r3 + orr r4, r4, #3 + str r4, [r5, #0] + ldmfd sp!, {r4, r7, r8, pc} +.L196: + mov r0, #13 + ldmfd sp!, {r4, r7, r8, lr} + b general_error +.L201: + .align 0 +.L200: + .word stack_chain + .align 0 + .global primitive_datastack + .def primitive_datastack; .scl 2; .type 32; .endef +primitive_datastack: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + stmfd sp!, {r4, r7, r8, lr} + mov r0, r1 + bl save_callstack_top + ldr ip, .L207 + mov r1, #7 + ldr lr, [ip, #0] + mov r0, #8 + ldr r4, [lr, #24] + mov r2, r1 + ldr r8, [r4, #0] + mov r3, #0 + rsb ip, r8, r5 + adds r7, ip, #4 + bmi .L203 + mov r1, r7, asr #2 + bl allot_array_internal + mov r1, r8 + mov r4, r0 + mov r2, r7 + add r0, r0, #8 + bl memcpy + bic r4, r4, #7 + add r3, r5, #4 + mov r5, r3 + orr r4, r4, #3 + str r4, [r5, #0] + ldmfd sp!, {r4, r7, r8, pc} +.L203: + mov r0, #11 + ldmfd sp!, {r4, r7, r8, lr} + b general_error +.L208: + .align 0 +.L207: + .word stack_chain + .comm errno, 4 @ 4 + .comm profiling, 4 @ 1 + .comm userenv, 160 @ 160 + .comm T, 4 @ 4 + .comm stack_chain, 4 @ 4 + .comm ds_size, 4 @ 4 + .comm rs_size, 4 @ 4 + .comm signal_number, 4 @ 4 + .comm signal_fault_addr, 4 @ 4 + .comm signal_callstack_top, 4 @ 4 + .comm secure_gc, 4 @ 1 + .comm data_heap, 4 @ 4 + .comm cards_offset, 4 @ 4 + .comm newspace, 4 @ 4 + .comm nursery, 4 @ 4 + .comm gc_time, 8 @ 8 + .comm minor_collections, 4 @ 4 + .comm cards_scanned, 4 @ 4 + .comm performing_gc, 4 @ 1 + .comm collecting_gen, 4 @ 4 + .comm collecting_code, 4 @ 1 + .comm collecting_aging_again, 4 @ 1 + .comm last_code_heap_scan, 4 @ 4 + .comm growing_data_heap, 4 @ 1 + .comm old_data_heap, 4 @ 4 + .comm gc_jmp, 44 @ 44 + .comm heap_scan_ptr, 4 @ 4 + .comm gc_off, 4 @ 1 + .comm extra_roots_region, 4 @ 4 + .comm extra_roots, 4 @ 4 + .comm bignum_zero, 4 @ 4 + .comm bignum_pos_one, 4 @ 4 + .comm bignum_neg_one, 4 @ 4 + .comm code_heap, 8 @ 8 + .comm data_relocation_base, 4 @ 4 + .comm code_relocation_base, 4 @ 4 + .comm posix_argc, 4 @ 4 + .comm posix_argv, 4 @ 4 + .def memcpy; .scl 2; .type 32; .endef + .def type_error; .scl 2; .type 32; .endef + .def safe_malloc; .scl 2; .type 32; .endef + .def alloc_segment; .scl 2; .type 32; .endef + .def dealloc_segment; .scl 2; .type 32; .endef + .def free; .scl 2; .type 32; .endef + .def allot_array_internal; .scl 2; .type 32; .endef + .def general_error; .scl 2; .type 32; .endef + .def memcpy; .scl 2; .type 32; .endef + .def dosym; .scl 2; .type 32; .endef + .def undefined; .scl 2; .type 32; .endef + .def exit; .scl 2; .type 32; .endef + .def to_fixnum; .scl 2; .type 32; .endef + .def unbox_char_string; .scl 2; .type 32; .endef + .def getenv; .scl 2; .type 32; .endef + .def box_char_string; .scl 2; .type 32; .endef + .def box_unsigned_8; .scl 2; .type 32; .endef + .def current_millis; .scl 2; .type 32; .endef + .def sleep_millis; .scl 2; .type 32; .endef + .def to_cell; .scl 2; .type 32; .endef + .def docol_profiling; .scl 2; .type 32; .endef + .def docol; .scl 2; .type 32; .endef + .def save_callstack_top; .scl 2; .type 32; .endef + .def to_boolean; .scl 2; .type 32; .endef + .def begin_scan; .scl 2; .type 32; .endef + .def next_object; .scl 2; .type 32; .endef + .section .drectve + .ascii " -export:nursery,data" + .ascii " -export:cards_offset,data" + .ascii " -export:stack_chain,data" + .ascii " -export:userenv,data" + .ascii " -export:profiling,data" + .ascii " -export:nest_stacks" + .ascii " -export:unnest_stacks" + .ascii " -export:save_stacks"