factor/vm/run.s

1512 lines
29 KiB
ArmAsm

.file "run.c"
.text
.globl _reset_datastack
.def _reset_datastack; .scl 2; .type 32; .endef
_reset_datastack:
pushl %ebp
movl %esp, %ebp
movl _stack_chain, %eax
movl 24(%eax), %eax
movl (%eax), %esi
subl $4, %esi
popl %ebp
ret
.globl _reset_retainstack
.def _reset_retainstack; .scl 2; .type 32; .endef
_reset_retainstack:
pushl %ebp
movl %esp, %ebp
movl _stack_chain, %eax
movl 28(%eax), %eax
movl (%eax), %edi
subl $4, %edi
popl %ebp
ret
.globl _fix_stacks
.def _fix_stacks; .scl 2; .type 32; .endef
_fix_stacks:
pushl %ebp
movl %esp, %ebp
leal 4(%esi), %eax
movl _stack_chain, %edx
movl 24(%edx), %edx
cmpl (%edx), %eax
jb L5
leal 256(%esi), %eax
movl _stack_chain, %edx
movl 24(%edx), %edx
cmpl 8(%edx), %eax
jae L5
jmp L4
L5:
call _reset_datastack
L4:
leal 4(%edi), %eax
movl _stack_chain, %edx
movl 28(%edx), %edx
cmpl (%edx), %eax
jb L7
leal 256(%edi), %eax
movl _stack_chain, %edx
movl 28(%edx), %edx
cmpl 8(%edx), %eax
jae L7
jmp L3
L7:
call _reset_retainstack
L3:
popl %ebp
ret
.globl _save_stacks
.def _save_stacks; .scl 2; .type 32; .endef
_save_stacks:
pushl %ebp
movl %esp, %ebp
cmpl $0, _stack_chain
je L8
movl _stack_chain, %eax
movl %esi, 8(%eax)
movl _stack_chain, %eax
movl %edi, 12(%eax)
L8:
popl %ebp
ret
.globl _nest_stacks
.def _nest_stacks; .scl 2; .type 32; .endef
_nest_stacks:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $20, %esp
movl $44, (%esp)
call _safe_malloc
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
movl $-1, 4(%eax)
movl -8(%ebp), %eax
movl $-1, (%eax)
movl -8(%ebp), %eax
movl %esi, 16(%eax)
movl -8(%ebp), %eax
movl %edi, 20(%eax)
movl -8(%ebp), %edx
movl _userenv+8, %eax
movl %eax, 36(%edx)
movl -8(%ebp), %edx
movl _userenv+4, %eax
movl %eax, 32(%edx)
movl -8(%ebp), %ebx
movl _ds_size, %eax
movl %eax, (%esp)
call _alloc_segment
movl %eax, 24(%ebx)
movl -8(%ebp), %ebx
movl _rs_size, %eax
movl %eax, (%esp)
call _alloc_segment
movl %eax, 28(%ebx)
movl -8(%ebp), %edx
movl _stack_chain, %eax
movl %eax, 40(%edx)
movl -8(%ebp), %eax
movl %eax, _stack_chain
call _reset_datastack
call _reset_retainstack
addl $20, %esp
popl %ebx
popl %ebp
ret
.globl _unnest_stacks
.def _unnest_stacks; .scl 2; .type 32; .endef
_unnest_stacks:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl _stack_chain, %eax
movl 24(%eax), %eax
movl %eax, (%esp)
call _dealloc_segment
movl _stack_chain, %eax
movl 28(%eax), %eax
movl %eax, (%esp)
call _dealloc_segment
movl _stack_chain, %eax
movl 16(%eax), %esi
movl _stack_chain, %eax
movl 20(%eax), %edi
movl _stack_chain, %eax
movl 36(%eax), %eax
movl %eax, _userenv+8
movl _stack_chain, %eax
movl 32(%eax), %eax
movl %eax, _userenv+4
movl _stack_chain, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
movl 40(%eax), %eax
movl %eax, _stack_chain
movl -4(%ebp), %eax
movl %eax, (%esp)
call _free
leave
ret
.globl _init_stacks
.def _init_stacks; .scl 2; .type 32; .endef
_init_stacks:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl %eax, _ds_size
movl 12(%ebp), %eax
movl %eax, _rs_size
movl $0, _stack_chain
popl %ebp
ret
.globl _primitive_drop
.def _primitive_drop; .scl 2; .type 32; .endef
_primitive_drop:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_drop_impl
leave
ret
.def _primitive_drop_impl; .scl 3; .type 32; .endef
_primitive_drop_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpop
leave
ret
.def _dpop; .scl 3; .type 32; .endef
_dpop:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %esi, (%esp)
call _get
movl %eax, -4(%ebp)
subl $4, %esi
movl -4(%ebp), %eax
leave
ret
.def _get; .scl 3; .type 32; .endef
_get:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl (%eax), %eax
popl %ebp
ret
.globl _primitive_2drop
.def _primitive_2drop; .scl 2; .type 32; .endef
_primitive_2drop:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_2drop_impl
leave
ret
.def _primitive_2drop_impl; .scl 3; .type 32; .endef
_primitive_2drop_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esi
popl %ebp
ret
.globl _primitive_3drop
.def _primitive_3drop; .scl 2; .type 32; .endef
_primitive_3drop:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_3drop_impl
leave
ret
.def _primitive_3drop_impl; .scl 3; .type 32; .endef
_primitive_3drop_impl:
pushl %ebp
movl %esp, %ebp
subl $12, %esi
popl %ebp
ret
.globl _primitive_dup
.def _primitive_dup; .scl 2; .type 32; .endef
_primitive_dup:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_dup_impl
leave
ret
.def _primitive_dup_impl; .scl 3; .type 32; .endef
_primitive_dup_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpeek
movl %eax, (%esp)
call _dpush
leave
ret
.def _dpush; .scl 3; .type 32; .endef
_dpush:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
addl $4, %esi
movl 8(%ebp), %eax
movl %eax, 4(%esp)
movl %esi, (%esp)
call _put
leave
ret
.def _put; .scl 3; .type 32; .endef
_put:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 12(%ebp), %eax
movl %eax, (%edx)
popl %ebp
ret
.def _dpeek; .scl 3; .type 32; .endef
_dpeek:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl %esi, (%esp)
call _get
leave
ret
.globl _primitive_2dup
.def _primitive_2dup; .scl 2; .type 32; .endef
_primitive_2dup:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_2dup_impl
leave
ret
.def _primitive_2dup_impl; .scl 3; .type 32; .endef
_primitive_2dup_impl:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
call _dpeek
movl %eax, -4(%ebp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -8(%ebp)
addl $8, %esi
movl -8(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _put
movl -4(%ebp), %eax
movl %eax, 4(%esp)
movl %esi, (%esp)
call _put
leave
ret
.globl _primitive_3dup
.def _primitive_3dup; .scl 2; .type 32; .endef
_primitive_3dup:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_3dup_impl
leave
ret
.def _primitive_3dup_impl; .scl 3; .type 32; .endef
_primitive_3dup_impl:
pushl %ebp
movl %esp, %ebp
subl $20, %esp
call _dpeek
movl %eax, -4(%ebp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -8(%ebp)
leal -8(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -12(%ebp)
addl $12, %esi
movl -4(%ebp), %eax
movl %eax, 4(%esp)
movl %esi, (%esp)
call _put
movl -8(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _put
movl -12(%ebp), %eax
movl %eax, 4(%esp)
leal -8(%esi), %eax
movl %eax, (%esp)
call _put
leave
ret
.globl _primitive_rot
.def _primitive_rot; .scl 2; .type 32; .endef
_primitive_rot:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_rot_impl
leave
ret
.def _primitive_rot_impl; .scl 3; .type 32; .endef
_primitive_rot_impl:
pushl %ebp
movl %esp, %ebp
subl $20, %esp
call _dpeek
movl %eax, -4(%ebp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -8(%ebp)
leal -8(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
movl %eax, 4(%esp)
movl %esi, (%esp)
call _put
movl -4(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _put
movl -8(%ebp), %eax
movl %eax, 4(%esp)
leal -8(%esi), %eax
movl %eax, (%esp)
call _put
leave
ret
.globl _primitive__rot
.def _primitive__rot; .scl 2; .type 32; .endef
_primitive__rot:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive__rot_impl
leave
ret
.def _primitive__rot_impl; .scl 3; .type 32; .endef
_primitive__rot_impl:
pushl %ebp
movl %esp, %ebp
subl $20, %esp
call _dpeek
movl %eax, -4(%ebp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -8(%ebp)
leal -8(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -12(%ebp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl %esi, (%esp)
call _put
movl -12(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _put
movl -4(%ebp), %eax
movl %eax, 4(%esp)
leal -8(%esi), %eax
movl %eax, (%esp)
call _put
leave
ret
.globl _primitive_dupd
.def _primitive_dupd; .scl 2; .type 32; .endef
_primitive_dupd:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_dupd_impl
leave
ret
.def _primitive_dupd_impl; .scl 3; .type 32; .endef
_primitive_dupd_impl:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call _dpeek
movl %eax, -4(%ebp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl %esi, (%esp)
call _put
movl -8(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _put
movl -4(%ebp), %eax
movl %eax, (%esp)
call _dpush
leave
ret
.globl _primitive_swapd
.def _primitive_swapd; .scl 2; .type 32; .endef
_primitive_swapd:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_swapd_impl
leave
ret
.def _primitive_swapd_impl; .scl 3; .type 32; .endef
_primitive_swapd_impl:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
leal -4(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -4(%ebp)
leal -8(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _put
movl -4(%ebp), %eax
movl %eax, 4(%esp)
leal -8(%esi), %eax
movl %eax, (%esp)
call _put
leave
ret
.globl _primitive_nip
.def _primitive_nip; .scl 2; .type 32; .endef
_primitive_nip:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_nip_impl
leave
ret
.def _primitive_nip_impl; .scl 3; .type 32; .endef
_primitive_nip_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpop
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, (%esp)
call _drepl
leave
ret
.def _drepl; .scl 3; .type 32; .endef
_drepl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
movl %eax, 4(%esp)
movl %esi, (%esp)
call _put
leave
ret
.globl _primitive_2nip
.def _primitive_2nip; .scl 2; .type 32; .endef
_primitive_2nip:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_2nip_impl
leave
ret
.def _primitive_2nip_impl; .scl 3; .type 32; .endef
_primitive_2nip_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpeek
movl %eax, -4(%ebp)
subl $8, %esi
movl -4(%ebp), %eax
movl %eax, (%esp)
call _drepl
leave
ret
.globl _primitive_tuck
.def _primitive_tuck; .scl 2; .type 32; .endef
_primitive_tuck:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_tuck_impl
leave
ret
.def _primitive_tuck_impl; .scl 3; .type 32; .endef
_primitive_tuck_impl:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call _dpeek
movl %eax, -4(%ebp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl %esi, (%esp)
call _put
movl -4(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _put
movl -4(%ebp), %eax
movl %eax, (%esp)
call _dpush
leave
ret
.globl _primitive_over
.def _primitive_over; .scl 2; .type 32; .endef
_primitive_over:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_over_impl
leave
ret
.def _primitive_over_impl; .scl 3; .type 32; .endef
_primitive_over_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
leal -4(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, (%esp)
call _dpush
leave
ret
.globl _primitive_pick
.def _primitive_pick; .scl 2; .type 32; .endef
_primitive_pick:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_pick_impl
leave
ret
.def _primitive_pick_impl; .scl 3; .type 32; .endef
_primitive_pick_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
leal -8(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, (%esp)
call _dpush
leave
ret
.globl _primitive_swap
.def _primitive_swap; .scl 2; .type 32; .endef
_primitive_swap:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_swap_impl
leave
ret
.def _primitive_swap_impl; .scl 3; .type 32; .endef
_primitive_swap_impl:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
call _dpeek
movl %eax, -4(%ebp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _get
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl %esi, (%esp)
call _put
movl -4(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%esi), %eax
movl %eax, (%esp)
call _put
leave
ret
.globl _primitive_to_r
.def _primitive_to_r; .scl 2; .type 32; .endef
_primitive_to_r:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_to_r_impl
leave
ret
.def _primitive_to_r_impl; .scl 3; .type 32; .endef
_primitive_to_r_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpop
movl %eax, (%esp)
call _rpush
leave
ret
.def _rpush; .scl 3; .type 32; .endef
_rpush:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
addl $4, %edi
movl 8(%ebp), %eax
movl %eax, 4(%esp)
movl %edi, (%esp)
call _put
leave
ret
.globl _primitive_from_r
.def _primitive_from_r; .scl 2; .type 32; .endef
_primitive_from_r:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_from_r_impl
leave
ret
.def _primitive_from_r_impl; .scl 3; .type 32; .endef
_primitive_from_r_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _rpop
movl %eax, (%esp)
call _dpush
leave
ret
.def _rpop; .scl 3; .type 32; .endef
_rpop:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %edi, (%esp)
call _get
movl %eax, -4(%ebp)
subl $4, %edi
movl -4(%ebp), %eax
leave
ret
.globl _stack_to_array
.def _stack_to_array; .scl 2; .type 32; .endef
_stack_to_array:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
movl 8(%ebp), %edx
movl 12(%ebp), %eax
subl %edx, %eax
addl $4, %eax
movl %eax, -4(%ebp)
cmpl $0, -4(%ebp)
jns L58
movl $0, -12(%ebp)
jmp L57
L58:
movl -4(%ebp), %eax
movl %eax, -16(%ebp)
cmpl $0, -16(%ebp)
jns L60
addl $3, -16(%ebp)
L60:
movl -16(%ebp), %eax
sarl $2, %eax
movl %eax, 4(%esp)
movl $8, (%esp)
call _allot_array_internal
movl %eax, -8(%ebp)
movl -4(%ebp), %eax
movl %eax, 8(%esp)
movl 8(%ebp), %eax
movl %eax, 4(%esp)
movl -8(%ebp), %eax
addl $8, %eax
movl %eax, (%esp)
call _memcpy
movl -8(%ebp), %eax
movl %eax, (%esp)
call _tag_object
movl %eax, (%esp)
call _dpush
movl $1, -12(%ebp)
L57:
movl -12(%ebp), %eax
leave
ret
.def _tag_object; .scl 3; .type 32; .endef
_tag_object:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
andl $-8, %eax
orl $3, %eax
popl %ebp
ret
.globl _primitive_datastack
.def _primitive_datastack; .scl 2; .type 32; .endef
_primitive_datastack:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_datastack_impl
leave
ret
.def _primitive_datastack_impl; .scl 3; .type 32; .endef
_primitive_datastack_impl:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl %esi, 4(%esp)
movl _stack_chain, %eax
movl 24(%eax), %eax
movl (%eax), %eax
movl %eax, (%esp)
call _stack_to_array
testb %al, %al
jne L63
movl $0, 12(%esp)
movl $7, 8(%esp)
movl $7, 4(%esp)
movl $11, (%esp)
call _general_error
L63:
leave
ret
.globl _primitive_retainstack
.def _primitive_retainstack; .scl 2; .type 32; .endef
_primitive_retainstack:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_retainstack_impl
leave
ret
.def _primitive_retainstack_impl; .scl 3; .type 32; .endef
_primitive_retainstack_impl:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl %edi, 4(%esp)
movl _stack_chain, %eax
movl 28(%eax), %eax
movl (%eax), %eax
movl %eax, (%esp)
call _stack_to_array
testb %al, %al
jne L66
movl $0, 12(%esp)
movl $7, 8(%esp)
movl $7, 4(%esp)
movl $13, (%esp)
call _general_error
L66:
leave
ret
.globl _array_to_stack
.def _array_to_stack; .scl 2; .type 32; .endef
_array_to_stack:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call _array_capacity
sall $2, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, 8(%esp)
movl 8(%ebp), %eax
addl $8, %eax
movl %eax, 4(%esp)
movl 12(%ebp), %eax
movl %eax, (%esp)
call _memcpy
movl -4(%ebp), %eax
addl 12(%ebp), %eax
subl $4, %eax
leave
ret
.def _array_capacity; .scl 3; .type 32; .endef
_array_capacity:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 4(%eax), %eax
shrl $3, %eax
popl %ebp
ret
.globl _primitive_set_datastack
.def _primitive_set_datastack; .scl 2; .type 32; .endef
_primitive_set_datastack:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_set_datastack_impl
leave
ret
.def _primitive_set_datastack_impl; .scl 3; .type 32; .endef
_primitive_set_datastack_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpop
movl %eax, (%esp)
call _untag_array
movl %eax, %edx
movl _stack_chain, %eax
movl 24(%eax), %eax
movl (%eax), %eax
movl %eax, 4(%esp)
movl %edx, (%esp)
call _array_to_stack
movl %eax, %esi
leave
ret
.def _untag_array; .scl 3; .type 32; .endef
_untag_array:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
movl %eax, 4(%esp)
movl $8, (%esp)
call _type_check
movl 8(%ebp), %eax
movl %eax, (%esp)
call _untag_object
leave
ret
.def _untag_object; .scl 3; .type 32; .endef
_untag_object:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
andl $-8, %eax
popl %ebp
ret
.def _type_check; .scl 3; .type 32; .endef
_type_check:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 12(%ebp), %eax
movl %eax, (%esp)
call _type_of
cmpl 8(%ebp), %eax
je L74
movl 12(%ebp), %eax
movl %eax, 4(%esp)
movl 8(%ebp), %eax
movl %eax, (%esp)
call _type_error
L74:
leave
ret
.def _type_of; .scl 3; .type 32; .endef
_type_of:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl 8(%ebp), %eax
andl $7, %eax
movl %eax, -4(%ebp)
cmpl $3, -4(%ebp)
jne L77
movl 8(%ebp), %eax
movl %eax, (%esp)
call _object_type
movl %eax, -8(%ebp)
jmp L76
L77:
movl -4(%ebp), %eax
movl %eax, -8(%ebp)
L76:
movl -8(%ebp), %eax
leave
ret
.def _object_type; .scl 3; .type 32; .endef
_object_type:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
andl $-8, %eax
movl %eax, (%esp)
call _get
movl %eax, (%esp)
call _untag_header
leave
ret
.def _untag_header; .scl 3; .type 32; .endef
_untag_header:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
shrl $3, %eax
popl %ebp
ret
.globl _primitive_set_retainstack
.def _primitive_set_retainstack; .scl 2; .type 32; .endef
_primitive_set_retainstack:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_set_retainstack_impl
leave
ret
.def _primitive_set_retainstack_impl; .scl 3; .type 32; .endef
_primitive_set_retainstack_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpop
movl %eax, (%esp)
call _untag_array
movl %eax, %edx
movl _stack_chain, %eax
movl 28(%eax), %eax
movl (%eax), %eax
movl %eax, 4(%esp)
movl %edx, (%esp)
call _array_to_stack
movl %eax, %edi
leave
ret
.globl _primitive_getenv
.def _primitive_getenv; .scl 2; .type 32; .endef
_primitive_getenv:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_getenv_impl
leave
ret
.def _primitive_getenv_impl; .scl 3; .type 32; .endef
_primitive_getenv_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpeek
movl %eax, (%esp)
call _untag_fixnum_fast
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
movl _userenv(,%eax,4), %eax
movl %eax, (%esp)
call _drepl
leave
ret
.def _untag_fixnum_fast; .scl 3; .type 32; .endef
_untag_fixnum_fast:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
sarl $3, %eax
popl %ebp
ret
.globl _primitive_setenv
.def _primitive_setenv; .scl 2; .type 32; .endef
_primitive_setenv:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_setenv_impl
leave
ret
.def _primitive_setenv_impl; .scl 3; .type 32; .endef
_primitive_setenv_impl:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call _dpop
movl %eax, (%esp)
call _untag_fixnum_fast
movl %eax, -4(%ebp)
call _dpop
movl %eax, -8(%ebp)
movl -4(%ebp), %edx
movl -8(%ebp), %eax
movl %eax, _userenv(,%edx,4)
leave
ret
.globl _primitive_exit
.def _primitive_exit; .scl 2; .type 32; .endef
_primitive_exit:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_exit_impl
leave
ret
.def _primitive_exit_impl; .scl 3; .type 32; .endef
_primitive_exit_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpop
movl %eax, (%esp)
call _to_fixnum
movl %eax, (%esp)
call _exit
.globl _primitive_os_env
.def _primitive_os_env; .scl 2; .type 32; .endef
_primitive_os_env:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_os_env_impl
leave
ret
.def _primitive_os_env_impl; .scl 3; .type 32; .endef
_primitive_os_env_impl:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call _unbox_char_string
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, (%esp)
call _getenv
movl %eax, -8(%ebp)
cmpl $0, -8(%ebp)
jne L92
movl $7, (%esp)
call _dpush
jmp L91
L92:
movl -8(%ebp), %eax
movl %eax, (%esp)
call _box_char_string
L91:
leave
ret
.globl _primitive_eq
.def _primitive_eq; .scl 2; .type 32; .endef
_primitive_eq:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_eq_impl
leave
ret
.def _primitive_eq_impl; .scl 3; .type 32; .endef
_primitive_eq_impl:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call _dpop
movl %eax, -4(%ebp)
call _dpeek
movl %eax, -8(%ebp)
movl -4(%ebp), %eax
cmpl -8(%ebp), %eax
jne L96
movl _T, %eax
movl %eax, -12(%ebp)
jmp L97
L96:
movl $7, -12(%ebp)
L97:
movl -12(%ebp), %eax
movl %eax, (%esp)
call _drepl
leave
ret
.globl _primitive_millis
.def _primitive_millis; .scl 2; .type 32; .endef
_primitive_millis:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_millis_impl
leave
ret
.def _primitive_millis_impl; .scl 3; .type 32; .endef
_primitive_millis_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _current_millis
movl %eax, (%esp)
movl %edx, 4(%esp)
call _box_unsigned_8
leave
ret
.globl _primitive_sleep
.def _primitive_sleep; .scl 2; .type 32; .endef
_primitive_sleep:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_sleep_impl
leave
ret
.def _primitive_sleep_impl; .scl 3; .type 32; .endef
_primitive_sleep_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpop
movl %eax, (%esp)
call _to_cell
movl %eax, (%esp)
call _sleep_millis
leave
ret
.globl _primitive_tag
.def _primitive_tag; .scl 2; .type 32; .endef
_primitive_tag:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_tag_impl
leave
ret
.def _primitive_tag_impl; .scl 3; .type 32; .endef
_primitive_tag_impl:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _dpeek
andl $7, %eax
movl %eax, (%esp)
call _tag_fixnum
movl %eax, (%esp)
call _drepl
leave
ret
.def _tag_fixnum; .scl 3; .type 32; .endef
_tag_fixnum:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
sall $3, %eax
andl $-8, %eax
popl %ebp
ret
.globl _primitive_slot
.def _primitive_slot; .scl 2; .type 32; .endef
_primitive_slot:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_slot_impl
leave
ret
.def _primitive_slot_impl; .scl 3; .type 32; .endef
_primitive_slot_impl:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call _dpop
movl %eax, (%esp)
call _untag_fixnum_fast
movl %eax, -4(%ebp)
call _dpop
movl %eax, -8(%ebp)
movl -8(%ebp), %edx
andl $-8, %edx
movl -4(%ebp), %eax
sall $2, %eax
leal (%edx,%eax), %eax
movl %eax, (%esp)
call _get
movl %eax, (%esp)
call _dpush
leave
ret
.globl _primitive_set_slot
.def _primitive_set_slot; .scl 2; .type 32; .endef
_primitive_set_slot:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)
movl -8(%ebp), %eax
call _save_callstack_top
call _primitive_set_slot_impl
leave
ret
.def _primitive_set_slot_impl; .scl 3; .type 32; .endef
_primitive_set_slot_impl:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call _dpop
movl %eax, (%esp)
call _untag_fixnum_fast
movl %eax, -4(%ebp)
call _dpop
movl %eax, -8(%ebp)
call _dpop
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
movl %eax, 8(%esp)
movl -4(%ebp), %eax
movl %eax, 4(%esp)
movl -8(%ebp), %eax
movl %eax, (%esp)
call _set_slot
leave
ret
.def _set_slot; .scl 3; .type 32; .endef
_set_slot:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 16(%ebp), %eax
movl %eax, 4(%esp)
movl 8(%ebp), %edx
andl $-8, %edx
movl 12(%ebp), %eax
sall $2, %eax
leal (%edx,%eax), %eax
movl %eax, (%esp)
call _put
movl 8(%ebp), %eax
movl %eax, (%esp)
call _write_barrier
leave
ret
.def _write_barrier; .scl 3; .type 32; .endef
_write_barrier:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
shrl $6, %eax
addl _cards_offset, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %edx
movl -4(%ebp), %eax
movzbl (%eax), %eax
orb $-64, %al
movb %al, (%edx)
leave
ret
.comm _console_open, 16 # 1
.comm _userenv, 256 # 256
.comm _T, 16 # 4
.comm _stack_chain, 16 # 4
.comm _ds_size, 16 # 4
.comm _rs_size, 16 # 4
.comm _stage2, 16 # 1
.comm _profiling_p, 16 # 1
.comm _signal_number, 16 # 4
.comm _signal_fault_addr, 16 # 4
.comm _signal_callstack_top, 16 # 4
.comm _secure_gc, 16 # 1
.comm _data_heap, 16 # 4
.comm _cards_offset, 16 # 4
.comm _newspace, 16 # 4
.comm _nursery, 16 # 4
.comm _gc_time, 16 # 8
.comm _nursery_collections, 16 # 4
.comm _aging_collections, 16 # 4
.comm _cards_scanned, 16 # 4
.comm _performing_gc, 16 # 1
.comm _collecting_gen, 16 # 4
.comm _collecting_aging_again, 16 # 1
.comm _last_code_heap_scan, 16 # 4
.comm _growing_data_heap, 16 # 1
.comm _old_data_heap, 16 # 4
.comm _gc_jmp, 208 # 208
.comm _heap_scan_ptr, 16 # 4
.comm _gc_off, 16 # 1
.comm _gc_locals_region, 16 # 4
.comm _gc_locals, 16 # 4
.comm _extra_roots_region, 16 # 4
.comm _extra_roots, 16 # 4
.comm _bignum_zero, 16 # 4
.comm _bignum_pos_one, 16 # 4
.comm _bignum_neg_one, 16 # 4
.comm _code_heap, 16 # 8
.comm _data_relocation_base, 16 # 4
.comm _code_relocation_base, 16 # 4
.comm _posix_argc, 16 # 4
.comm _posix_argv, 16 # 4
.def _sleep_millis; .scl 3; .type 32; .endef
.def _current_millis; .scl 3; .type 32; .endef
.def _getenv; .scl 3; .type 32; .endef
.def _exit; .scl 3; .type 32; .endef
.def _general_error; .scl 3; .type 32; .endef
.def _memcpy; .scl 3; .type 32; .endef
.def _allot_array_internal; .scl 3; .type 32; .endef
.def _save_callstack_top; .scl 3; .type 32; .endef
.def _free; .scl 3; .type 32; .endef
.def _dealloc_segment; .scl 3; .type 32; .endef
.def _alloc_segment; .scl 3; .type 32; .endef
.def _safe_malloc; .scl 3; .type 32; .endef
.def _type_error; .scl 3; .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:unnest_stacks"
.ascii " -export:nest_stacks"
.ascii " -export:save_stacks"