factor/vm/run.s

1118 lines
23 KiB
ArmAsm

.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"