/
/ File: ithread.s
/ Author: John van Groningen
/ Machine: Intel 386
#define d0 %eax
#define d1 %ebx
#define a0 %ecx
#define a1 %edx
#define a2 %ebp
#define a3 %esi
#define a4 %edi
#define sp %esp
#define d0w %ax
#define d1w %bx
#define a0w %cx
#define a1w %dx
#define a2w %bp
#define a3w %si
#define a4w %di
#define d0b %al
#define d1b %bl
#define a0b %cl
#define a1b %dl
#define d0lb %al
#define d0hb %ah
#define d1lb %bl
#define d1hb %bh
.text
.globl @GetProcessHeap?0
.globl @HeapAlloc?12
.globl @clean_new_thread
@clean_new_thread:
call @GetProcessHeap?0
pushl $256
pushl $0
push d0
call @HeapAlloc?12
movl d0,a4
movl tlsp_tls_index,d0
movl a4,%fs:0x0e10(,d0,4)
movl 4(sp),a0
movl 4(a0),d1
test d1,d1
jne clean_new_thread_1
movl main_thread_local_storage+heap_size_offset,d1
clean_new_thread_1:
movl d1,heap_size_offset(a4)
movl 8(a0),d1
test d1,d1
jne clean_new_thread_2
movl main_thread_local_storage+a_stack_size_offset,d1
clean_new_thread_2:
movl d1,a_stack_size_offset(a4)
call init_thread
movl a3,saved_a_stack_p_offset(a4)
movl sp,halt_sp_offset (a4)
movl 4(sp),d0
push d0
call *(d0)
addl $4,sp
movl tlsp_tls_index,a4
movl %fs:0x0e10(,a4,4),a4
jmp exit_thread
init_thread:
movl heap_size_offset(a4),d0
#ifdef PREFETCH2
sub $63,d0
#else
sub $3,d0
#endif
xorl a1,a1
mov $33,d1
div d1
movl d0,heap_size_33_offset(a4)
movl heap_size_offset(a4),d0
sub $3,d0
xorl a1,a1
mov $129,d1
div d1
mov d0,heap_size_129_offset(a4)
add $3,d0
andl $-4,d0
movl d0,heap_copied_vector_size_offset(a4)
movl $0,heap_end_after_copy_gc_offset(a4)
movl heap_size_offset(a4),d0
add $7,d0
push d0
#ifdef USE_CLIB
call @malloc
#else
call @allocate_memory
#endif
add $4,sp
test d0,d0
je init_thread_no_memory_2
mov d0,heap_mbp_offset(a4)
addl $3,d0
and $-4,d0
mov d0,free_heap_offset(a4)
mov d0,heap_p_offset(a4)
movl a_stack_size_offset(a4),a2
add $3,a2
push a2
#ifdef STACK_OVERFLOW_EXCEPTION_HANDLER
call @allocate_memory_with_guard_page_at_end
#else
# ifdef USE_CLIB
call @malloc
# else
call @allocate_memory
# endif
#endif
add $4,sp
test d0,d0
je init_thread_no_memory_3
mov d0,stack_mbp_offset(a4)
#ifdef STACK_OVERFLOW_EXCEPTION_HANDLER
addl a_stack_size_offset(a4),d0
addl $3+4095,d0
andl $-4096,d0
movl d0,a_stack_guard_page
subl a_stack_size_offset(a4),d0
#endif
add $3,d0
andl $-4,d0
mov d0,a3
mov d0,stack_p_offset(a4)
/ lea caf_list+4,a0
/ movl a0,caf_listp
/ #ifdef FINALIZERS
/ movl $__Nil-4,finalizer_list
/ movl $__Nil-4,free_finalizer_list
/ #endif
mov free_heap_offset(a4),a1
mov a1,heap_p1_offset(a4)
movl heap_size_129_offset(a4),a2
shl $4,a2
lea (a1,a2,4),d0
mov d0,heap_copied_vector_offset(a4)
add heap_copied_vector_size_offset(a4),d0
mov d0,heap_p2_offset(a4)
movb $0,garbage_collect_flag_offset(a4)
# ifdef MARK_AND_COPY_GC
testb $64,@flags
je init_thread_no_mark1
# endif
# if defined (MARK_GC) || defined (COMPACT_GC_ONLY)
movl heap_size_33_offset(a4),d0
movl a1,heap_vector_offset(a4)
addl d0,a1
# ifdef PREFETCH2
addl $63,a1
andl $-64,a1
# else
addl $3,a1
andl $-4,a1
# endif
movl a1,free_heap_offset(a4)
movl a1,heap_p3_offset(a4)
lea (,d0,8),a2
movb $-1,garbage_collect_flag_offset(a4)
# endif
# ifdef MARK_AND_COPY_GC
init_thread_no_mark1:
# endif
# ifdef ADJUST_HEAP_SIZE
movl @initial_heap_size,d0
# ifdef MARK_AND_COPY_GC
movl $(MINIMUM_HEAP_SIZE_2),d1
testb $64,@flags
jne init_thread_no_mark9
addl d1,d1
init_thread_no_mark9:
# else
# if defined (MARK_GC) || defined (COMPACT_GC_ONLY)
movl $(MINIMUM_HEAP_SIZE),d1
# else
movl $(MINIMUM_HEAP_SIZE_2),d1
# endif
# endif
cmpl d1,d0
jle init_thread_too_large_or_too_small
shr $2,d0
cmpl a2,d0
jge init_thread_too_large_or_too_small
movl d0,a2
init_thread_too_large_or_too_small:
# endif
lea (a1,a2,4),d0
mov d0,heap_end_after_gc_offset(a4)
subl $32,d0
movl d0,end_heap_offset(a4)
# ifdef MARK_AND_COPY_GC
testb $64,@flags
je init_thread_no_mark2
# endif
# if defined (MARK_GC) && defined (ADJUST_HEAP_SIZE)
movl a2,bit_vector_size_offset(a4)
# endif
# ifdef MARK_AND_COPY_GC
init_thread_no_mark2:
# endif
movl $0,bit_counter_offset(a4)
movl $0,zero_bits_before_mark_offset(a4)
xor %eax,%eax
ret
init_thread_no_memory_2:
movl $1,%eax
ret
init_thread_no_memory_3:
push heap_mbp_offset(a4)
#ifdef USE_CLIB
call @free
#else
call @free_memory
#endif
add $4,sp
movl $1,%eax
ret
exit_thread:
call add_execute_time
push stack_mbp_offset(a4)
#ifdef USE_CLIB
call @free
#else
call @free_memory
#endif
add $4,sp
push heap_mbp_offset(a4)
#ifdef USE_CLIB
call @free
#else
call @free_memory
#endif
add $4,sp
call @GetProcessHeap?0
pushl a4
pushl $0
push d0
call @HeapFree?12
ret