From d906c9156f2a6f877311a01f0f9338fbb8d35f6d Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Wed, 14 Mar 2012 12:08:46 +0000 Subject: add thread safe version for 32 bit windows --- thread/imark.s | 1927 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1927 insertions(+) create mode 100644 thread/imark.s (limited to 'thread/imark.s') diff --git a/thread/imark.s b/thread/imark.s new file mode 100644 index 0000000..5db23ec --- /dev/null +++ b/thread/imark.s @@ -0,0 +1,1927 @@ + +#define d0 %eax +#define d1 %ebx +#define a0 %ecx +#define a1 %edx +#define a2 %ebp +#define a3 %esi +#define a4 %edi +#define sp %esp + + movl heap_vector_offset(a4),d0 + shrl $2,d0 + movl d0,heap_vector_d4_offset(a4) + +#undef MARK_USING_REVERSAL + + movl heap_size_33_offset(a4),d0 + xorl d1,d1 + + movl d1,n_marked_words_offset(a4) + shl $5,d0 + + movl d0,heap_size_32_33_offset(a4) + movl d1,lazy_array_list_offset(a4) + + lea -2000(sp),a3 + + movl caf_list,d0 + + movl a3,end_stack_offset(a4) + + test d0,d0 + je _end_mark_cafs + +_mark_cafs_lp: + movl (d0),d1 + movl -4(d0),a2 + + pushl a2 + lea 4(d0),a2 + lea 4(d0,d1,4),d0 + movl d0,end_vector_offset(a4) + + call _mark_stack_nodes + + popl d0 + test d0,d0 + jne _mark_cafs_lp + +_end_mark_cafs: + movl stack_top_offset(a4),a3 + movl stack_p_offset(a4),a2 + + movl a3,end_vector_offset(a4) + call _mark_stack_nodes + + movl lazy_array_list_offset(a4),a0 + + test a0,a0 + je no_restore_arrays + + push a4 + +restore_arrays: + movl (a0),d1 + movl $__ARRAY__+2,(a0) + + cmpl $1,d1 + je restore_array_size_1 + + lea (a0,d1,4),a1 + movl 8(a1),d0 + test d0,d0 + je restore_lazy_array + + movl d0,a2 + push a1 + + xorl a1,a1 + movl d1,d0 + movzwl -2+2(a2),d1 + + div d1 + movl d0,d1 + + pop a1 + movl a2,d0 + +restore_lazy_array: + movl 8(a0),a4 + movl 4(a0),a2 + movl d1,4(a0) + movl 4(a1),a3 + movl d0,8(a0) + movl a2,4(a1) + movl a4,8(a1) + + test d0,d0 + je no_reorder_array + + movzwl -2(d0),a1 + subl $256,a1 + movzwl -2+2(d0),a2 + cmpl a1,a2 + je no_reorder_array + + addl $12,a0 + imull a1,d1 + movl a1,d0 + lea (a0,d1,4),a1 + movl a2,d1 + subl a2,d0 + + call reorder + +no_reorder_array: + movl a3,a0 + testl a0,a0 + jne restore_arrays + + jmp end_restore_arrays + +restore_array_size_1: + movl 4(a0),a2 + movl 8(a0),a1 + movl d1,4(a0) + movl 12(a0),d0 + movl a2,12(a0) + movl d0,8(a0) + + movl a1,a0 + testl a0,a0 + jne restore_arrays + +end_restore_arrays: + pop a4 + +no_restore_arrays: + +#ifdef FINALIZERS + movl $finalizer_list,a0 + movl $free_finalizer_list,a1 + + movl (a0),a2 +determine_free_finalizers_after_mark: + cmpl $__Nil-4,a2 + je end_finalizers_after_mark + + movl neg_heap_p3_offset(a4),d1 + addl a2,d1 + movl $31*4,d0 + andl d1,d0 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + movl bit_set_table(d0),a3 + testl (,d1,4),a3 + je finalizer_not_used_after_mark + + lea 4(a2),a0 + movl 4(a2),a2 + jmp determine_free_finalizers_after_mark + +finalizer_not_used_after_mark: + movl a2,(a1) + lea 4(a2),a1 + + movl 4(a2),a2 + movl a2,(a0) + jmp determine_free_finalizers_after_mark + +end_finalizers_after_mark: + movl a2,(a1) +#endif + + call add_garbage_collect_time + +#ifndef ADJUST_HEAP_SIZE + movl heap_size_33_offset(a4),d0 + shl $3,d0 +#else + movl bit_vector_size_offset(a4),d0 + movl d0,a3 + shl $2,a3 + + push a1 + push d0 + + movl n_allocated_words_offset(a4),d0 + addl n_marked_words_offset(a4),d0 + shl $2,d0 + + mull @heap_size_multiple + shrd $8,a1,d0 + shrl $8,a1 + + movl d0,d1 + testl a1,a1 + + pop d0 + pop a1 + + je not_largest_heap + + movl heap_size_33_offset(a4),d1 + shl $5,d1 + +not_largest_heap: + cmpl a3,d1 + jbe no_larger_heap + + movl heap_size_33_offset(a4),a3 + shl $5,a3 + cmpl a3,d1 + jbe not_larger_then_heap + movl a3,d1 +not_larger_then_heap: + movl d1,d0 + shr $2,d0 + movl d0,bit_vector_size_offset(a4) +no_larger_heap: +#endif + movl d0,a2 + + movl heap_vector_offset(a4),a3 + + shrl $5,a2 + + testb $31,d0b + je no_extra_word + movl $0,(a3,a2,4) +no_extra_word: + + subl n_marked_words_offset(a4),d0 + shl $2,d0 + movl d0,n_last_heap_free_bytes_offset(a4) + + testl $2,@flags + je _no_heap_use_message2 + + pushl $marked_gc_string_1 + call @ew_print_string + addl $4,sp + + movl n_marked_words_offset(a4),d0 + shll $2,d0 + pushl d0 + call @ew_print_int + addl $4,sp + + pushl $heap_use_after_gc_string_2 + call @ew_print_string + addl $4,sp + +_no_heap_use_message2: + +#ifdef FINALIZERS + call call_finalizers +#endif + + movl n_allocated_words_offset(a4),a3 + xorl d1,d1 + + movl heap_vector_offset(a4),a0 + movl d1,n_free_words_after_mark_offset(a4) + +_scan_bits: + cmpl (a0),d1 + je _zero_bits + movl d1,(a0) + addl $4,a0 + subl $1,a2 + jne _scan_bits + + jmp _end_scan + +_zero_bits: + lea 4(a0),a1 + addl $4,a0 + subl $1,a2 + jne _skip_zero_bits_lp1 + jmp _end_bits + +_skip_zero_bits_lp: + test d0,d0 + jne _end_zero_bits +_skip_zero_bits_lp1: + movl (a0),d0 + addl $4,a0 + subl $1,a2 + jne _skip_zero_bits_lp + + test d0,d0 + je _end_bits + movl a0,d0 + movl d1,-4(a0) + subl a1,d0 + jmp _end_bits2 + +_end_zero_bits: + movl a0,d0 + subl a1,d0 + shl $3,d0 + addl d0,n_free_words_after_mark_offset(a4) + movl d1,-4(a0) + + cmpl a3,d0 + jb _scan_bits + +_found_free_memory: + movl a2,bit_counter_offset(a4) + movl a0,bit_vector_p_offset(a4) + + lea -4(a1),d1 + subl heap_vector_offset(a4),d1 + shl $5,d1 + + movl heap_p3_offset(a4),a2 + addl d1,a2 + movl a2,free_heap_offset(a4) + + movl stack_top_offset(a4),a3 + + lea (a2,d0,4),d1 + movl d1,heap_end_after_gc_offset(a4) + subl $32,d1 + movl d1,end_heap_offset(a4) + + pop d1 + pop d0 + ret + +_end_bits: + movl a0,d0 + subl a1,d0 + addl $4,d0 +_end_bits2: + shl $3,d0 + addl d0,n_free_words_after_mark_offset(a4) + cmpl a3,d0 + jae _found_free_memory + +_end_scan: + movl a2,bit_counter_offset(a4) + jmp compact_gc + +/ a2: pointer to stack element +/ a4: heap_vector +/ d0,d1,a0,a1,a3: free + +_mark_stack_nodes: + cmpl end_vector_offset(a4),a2 + je _end_mark_nodes + +_mark_stack_nodes_: + movl (a2),a0 + movl neg_heap_p3_offset(a4),d1 + movl heap_vector_d4_offset(a4),d0 + + addl $4,a2 + + addl a0,d1 + cmpl heap_size_32_33_offset(a4),d1 + jnc _mark_stack_nodes + + movl $31*4,a1 + andl d1,a1 + shrl $7,d1 + addl d0,d1 + + movl bit_set_table(a1),a3 + testl (,d1,4),a3 + jne _mark_stack_nodes + + pushl a2 + +#ifdef MARK_USING_REVERSAL + movl $1,a3 + jmp __mark_node + +__end_mark_using_reversal: + popl a2 + movl a0,-4(a2) + jmp _mark_stack_nodes +#else + pushl $0 + + jmp _mark_arguments + +_mark_hnf_2: + cmpl $0x20000000,a3 + jbe fits_in_word_6 + orl $1,4(,d1,4) +fits_in_word_6: + addl $3,n_marked_words_offset(a4) + +_mark_record_2_c: + movl 4(a0),d1 + push d1 + + cmpl end_stack_offset(a4),sp + jb __mark_using_reversal + +_mark_node2: +_shared_argument_part: + movl (a0),a0 + +_mark_node: + movl neg_heap_p3_offset(a4),d1 + movl heap_vector_d4_offset(a4),d0 + + addl a0,d1 + cmpl heap_size_32_33_offset(a4),d1 + jnc _mark_next_node + + movl $31*4,a1 + andl d1,a1 + shrl $7,d1 + addl d0,d1 + movl bit_set_table(a1),a3 + testl (,d1,4),a3 + jne _mark_next_node + +_mark_arguments: + movl (a0),d0 + test $2,d0 + je _mark_lazy_node + + movzwl -2(d0),a2 + test a2,a2 + je _mark_hnf_0 + + orl a3,(,d1,4) + addl $4,a0 + + cmpl $256,a2 + jae _mark_record + + subl $2,a2 + je _mark_hnf_2 + jb _mark_hnf_1 + +_mark_hnf_3: + movl 4(a0),a1 + + cmpl $0x20000000,a3 + jbe fits_in_word_1 + orl $1,4(,d1,4) +fits_in_word_1: + + movl neg_heap_p3_offset(a4),d1 + movl heap_vector_d4_offset(a4),a3 + addl a1,d1 + + addl $3,n_marked_words_offset(a4) + + movl $31*4,d0 + andl d1,d0 + shrl $7,d1 + addl a3,d1 + + movl bit_set_table(d0),a3 + testl (,d1,4),a3 + jne _shared_argument_part + +_no_shared_argument_part: + orl a3,(,d1,4) + addl $1,a2 + + addl a2,n_marked_words_offset(a4) + lea (d0,a2,4),d0 + lea -4(a1,a2,4),a1 + + cmpl $32*4,d0 + jbe fits_in_word_2 + orl $1,4(,d1,4) +fits_in_word_2: + + movl (a1),d1 + subl $2,a2 + pushl d1 + +_push_hnf_args: + movl -4(a1),d1 + subl $4,a1 + pushl d1 + subl $1,a2 + jge _push_hnf_args + + cmpl end_stack_offset(a4),sp + jae _mark_node2 + + jmp __mark_using_reversal + +_mark_hnf_1: + cmpl $0x40000000,a3 + jbe fits_in_word_4 + orl $1,4(,d1,4) +fits_in_word_4: + addl $2,n_marked_words_offset(a4) + movl (a0),a0 + jmp _mark_node + +_mark_lazy_node_1: + addl $4,a0 + orl a3,(,d1,4) + cmpl $0x20000000,a3 + jbe fits_in_word_3 + orl $1,4(,d1,4) +fits_in_word_3: + addl $3,n_marked_words_offset(a4) + + cmpl $1,a2 + je _mark_node2 + +_mark_selector_node_1: + cmpl $-2,a2 + movl (a0),a1 + je _mark_indirection_node + + movl neg_heap_p3_offset(a4),d1 + addl a1,d1 + + movl $31*4,a3 + andl d1,a3 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + + cmpl $-3,a2 + + movl bit_set_table(a3),a3 + jle _mark_record_selector_node_1 + + testl (,d1,4),a3 + jne _mark_node3 + + movl (a1),a2 + testl $2,a2 + je _mark_node3 + + cmpw $2,-2(a2) + jbe _small_tuple_or_record + +_large_tuple_or_record: + movl 8(a1),d1 + addl neg_heap_p3_offset(a4),d1 + + movl $31*4,a2 + andl d1,a2 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + + movl bit_set_table(a2),a2 + testl (,d1,4),a2 + jne _mark_node3 + + movl -8(d0),d0 + movl $__indirection,-4(a0) + movl a0,a2 + + movzwl 4(d0),d0 + cmpl $8,d0 + jl _mark_tuple_selector_node_1 + movl 8(a1),a1 + je _mark_tuple_selector_node_2 + movl -12(a1,d0),a0 + movl a0,(a2) + jmp _mark_node + +_mark_tuple_selector_node_2: + movl (a1),a0 + movl a0,(a2) + jmp _mark_node + +_small_tuple_or_record: + movl -8(d0),d0 + movl $__indirection,-4(a0) + movl a0,a2 + + movzwl 4(d0),d0 +_mark_tuple_selector_node_1: + movl (a1,d0),a0 + movl a0,(a2) + jmp _mark_node + +_mark_record_selector_node_1: + je _mark_strict_record_selector_node_1 + + testl (,d1,4),a3 + jne _mark_node3 + + movl (a1),a2 + testl $2,a2 + je _mark_node3 + + cmpw $258,-2(a2) + jbe _small_tuple_or_record + + movl 8(a1),d1 + addl neg_heap_p3_offset(a4),d1 + + movl $31*4,a2 + andl d1,a2 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + + movl bit_set_table(a2),a2 + testl (,d1,4),a2 + jne _mark_node3 + + movl -8(d0),d0 + movl $__indirection,-4(a0) + movl a0,a2 + + movzwl 4(d0),d0 + cmpl $8,d0 + jle _mark_record_selector_node_2 + movl 8(a1),a1 + subl $12,d0 +_mark_record_selector_node_2: + movl (a1,d0),a0 + + movl a0,(a2) + jmp _mark_node + +_mark_strict_record_selector_node_1: + testl (,d1,4),a3 + jne _mark_node3 + + movl (a1),a2 + testl $2,a2 + je _mark_node3 + + cmpw $258,-2(a2) + jbe _select_from_small_record + + movl 8(a1),d1 + addl neg_heap_p3_offset(a4),d1 + + movl $31*4,a2 + andl d1,a2 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + + movl bit_set_table(a2),a2 + testl (,d1,4),a2 + jne _mark_node3 + +_select_from_small_record: + movl -8(d0),d0 + + subl $4,a0 + + movzwl 4(d0),d1 + cmpl $8,d1 + jle _mark_strict_record_selector_node_2 + addl 8(a1),d1 + movl -12(d1),d1 + jmp _mark_strict_record_selector_node_3 +_mark_strict_record_selector_node_2: + movl (a1,d1),d1 +_mark_strict_record_selector_node_3: + movl d1,4(a0) + + movzwl 6(d0),d1 + testl d1,d1 + je _mark_strict_record_selector_node_5 + cmpl $8,d1 + jle _mark_strict_record_selector_node_4 + movl 8(a1),a1 + subl $12,d1 +_mark_strict_record_selector_node_4: + movl (a1,d1),d1 + movl d1,8(a0) +_mark_strict_record_selector_node_5: + + movl -4(d0),d0 + movl d0,(a0) + jmp _mark_next_node + +_mark_indirection_node: +_mark_node3: + movl a1,a0 + jmp _mark_node + +_mark_next_node: + popl a0 + test a0,a0 + jne _mark_node + + popl a2 + cmpl end_vector_offset(a4),a2 + jne _mark_stack_nodes_ + +_end_mark_nodes: + ret + +_mark_lazy_node: + movl -4(d0),a2 + test a2,a2 + je _mark_real_or_file + + cmpl $1,a2 + jle _mark_lazy_node_1 + + cmpl $257,a2 + jge _mark_closure_with_unboxed_arguments + incl a2 + orl a3,(,d1,4) + + addl a2,n_marked_words_offset(a4) + lea (a1,a2,4),a1 + lea (a0,a2,4),a0 + + cmpl $32*4,a1 + jbe fits_in_word_7 + orl $1,4(,d1,4) +fits_in_word_7: + subl $3,a2 +_push_lazy_args: + movl -4(a0),d1 + subl $4,a0 + push d1 + subl $1,a2 + jge _push_lazy_args + + subl $4,a0 + + cmpl end_stack_offset(a4),sp + jae _mark_node2 + + jmp __mark_using_reversal + +_mark_closure_with_unboxed_arguments: + je _mark_real_or_file + + movl a2,d0 + andl $255,a2 + + shrl $8,d0 + addl $1,a2 + + orl a3,(,d1,4) + addl a2,n_marked_words_offset(a4) + lea (a1,a2,4),a1 + + subl d0,a2 + + cmpl $32*4,a1 + jbe fits_in_word_7_ + orl $1,4(,d1,4) +fits_in_word_7_: + subl $2,a2 + jl _mark_next_node + + lea 8(a0,a2,4),a0 + jne _push_lazy_args + +_mark_closure_with_one_boxed_argument: + movl -4(a0),a0 + jmp _mark_node + +_mark_hnf_0: + cmpl $INT+2,d0 + jb _mark_real_file_or_string + + orl a3,(,d1,4) + + cmpl $CHAR+2,d0 + ja _mark_normal_hnf_0 + +_mark_bool: + addl $2,n_marked_words_offset(a4) + + cmpl $0x40000000,a3 + jbe _mark_next_node + + orl $1,4(,d1,4) + jmp _mark_next_node + +_mark_normal_hnf_0: + incl n_marked_words_offset(a4) + jmp _mark_next_node + +_mark_real_file_or_string: + cmpl $__STRING__+2,d0 + jbe _mark_string_or_array + +_mark_real_or_file: + orl a3,(,d1,4) + addl $3,n_marked_words_offset(a4) + + cmpl $0x20000000,a3 + jbe _mark_next_node + + orl $1,4(,d1,4) + jmp _mark_next_node + +_mark_record: + subl $258,a2 + je _mark_record_2 + jl _mark_record_1 + +_mark_record_3: + addl $3,n_marked_words_offset(a4) + + cmpl $0x20000000,a3 + jbe fits_in_word_13 + orl $1,4(,d1,4) +fits_in_word_13: + movl 4(a0),a1 + movzwl -2+2(d0),d1 + + movl neg_heap_p3_offset(a4),d0 + addl a1,d0 + + movl $31*4,a3 + andl d0,a3 + shrl $7,d0 + addl heap_vector_d4_offset(a4),d0 + + subl $1,d1 + + movl bit_set_table(a3),a1 + jb _mark_record_3_bb + + testl (,d0,4),a1 + jne _mark_node2 + + addl $1,a2 + orl a1,(,d0,4) + addl a2,n_marked_words_offset(a4) + lea (a3,a2,4),a3 + + cmpl $32*4,a3 + jbe _push_record_arguments + orl $1,4(,d0,4) +_push_record_arguments: + movl 4(a0),a1 + movl d1,a2 + shl $2,d1 + addl d1,a1 + subl $1,a2 + jge _push_hnf_args + + jmp _mark_node2 + +_mark_record_3_bb: + testl (,d0,4),a1 + jne _mark_next_node + + addl $1,a2 + orl a1,(,d0,4) + addl a2,n_marked_words_offset(a4) + lea (a3,a2,4),a3 + + cmpl $32*4,a3 + jbe _mark_next_node + + orl $1,4(,d0,4) + jmp _mark_next_node + +_mark_record_2: + cmpl $0x20000000,a3 + jbe fits_in_word_12 + orl $1,4(,d1,4) +fits_in_word_12: + addl $3,n_marked_words_offset(a4) + + cmpw $1,-2+2(d0) + ja _mark_record_2_c + je _mark_node2 + jmp _mark_next_node + +_mark_record_1: + cmpw $0,-2+2(d0) + jne _mark_hnf_1 + + jmp _mark_bool + +_mark_string_or_array: + je _mark_string_ + +_mark_array: + movl 8(a0),a2 + test a2,a2 + je _mark_lazy_array + + movzwl -2(a2),d0 + + testl d0,d0 + je _mark_strict_basic_array + + movzwl -2+2(a2),a2 + testl a2,a2 + je _mark_b_record_array + + cmpl end_stack_offset(a4),sp + jb _mark_array_using_reversal + + subl $256,d0 + cmpl a2,d0 + je _mark_a_record_array + +_mark_ab_record_array: + orl a3,(,d1,4) + movl 4(a0),a2 + + imull a2,d0 + addl $3,d0 + + addl d0,n_marked_words_offset(a4) + lea -4(a0,d0,4),d0 + + addl neg_heap_p3_offset(a4),d0 + shrl $7,d0 + addl heap_vector_d4_offset(a4),d0 + + cmpl d0,d1 + jae _end_set_ab_array_bits + + incl d1 + movl $1,a2 + cmpl d0,d1 + jae _last_ab_array_bits + +_mark_ab_array_lp: + orl a2,(,d1,4) + incl d1 + cmpl d0,d1 + jb _mark_ab_array_lp + +_last_ab_array_bits: + orl a2,(,d1,4) + +_end_set_ab_array_bits: + movl 4(a0),d0 + movl 8(a0),a1 + movzwl -2+2(a1),d1 + movzwl -2(a1),a1 + shll $2,d1 + lea -1024(,a1,4),a1 + pushl d1 + pushl a1 + lea 12(a0),a2 + pushl end_vector_offset(a4) + jmp _mark_ab_array_begin + +_mark_ab_array: + movl 8(sp),d1 + pushl d0 + pushl a2 + lea (a2,d1),d0 + + movl d0,end_vector_offset(a4) + call _mark_stack_nodes + + movl 4+8(sp),d1 + popl a2 + popl d0 + addl d1,a2 +_mark_ab_array_begin: + subl $1,d0 + jnc _mark_ab_array + + popl end_vector_offset(a4) + addl $8,sp + jmp _mark_next_node + +_mark_a_record_array: + orl a3,(,d1,4) + movl 4(a0),a2 + + imull a2,d0 + movl d0,a1 + + addl $3,d0 + + addl d0,n_marked_words_offset(a4) + lea -4(a0,d0,4),d0 + + addl neg_heap_p3_offset(a4),d0 + shrl $7,d0 + addl heap_vector_d4_offset(a4),d0 + + cmpl d0,d1 + jae _end_set_a_array_bits + + incl d1 + movl $1,a2 + cmpl d0,d1 + jae _last_a_array_bits + +_mark_a_array_lp: + orl a2,(,d1,4) + incl d1 + cmpl d0,d1 + jb _mark_a_array_lp + +_last_a_array_bits: + orl a2,(,d1,4) + +_end_set_a_array_bits: + lea 12(a0),a2 + lea 12(a0,a1,4),d0 + + pushl end_vector_offset(a4) + movl d0,end_vector_offset(a4) + call _mark_stack_nodes + popl end_vector_offset(a4) + + jmp _mark_next_node + +_mark_lazy_array: + cmpl end_stack_offset(a4),sp + jb _mark_array_using_reversal + + orl a3,(,d1,4) + movl 4(a0),d0 + + movl d0,a1 + addl $3,d0 + + addl d0,n_marked_words_offset(a4) + lea -4(a0,d0,4),d0 + + addl neg_heap_p3_offset(a4),d0 + shrl $7,d0 + addl heap_vector_d4_offset(a4),d0 + + cmpl d0,d1 + jae _end_set_lazy_array_bits + + incl d1 + movl $1,a2 + cmpl d0,d1 + jae _last_lazy_array_bits + +_mark_lazy_array_lp: + orl a2,(,d1,4) + incl d1 + cmpl d0,d1 + jb _mark_lazy_array_lp + +_last_lazy_array_bits: + orl a2,(,d1,4) + +_end_set_lazy_array_bits: + lea 12(a0),a2 + lea 12(a0,a1,4),d0 + + pushl end_vector_offset(a4) + movl d0,end_vector_offset(a4) + call _mark_stack_nodes + popl end_vector_offset(a4) + + jmp _mark_next_node + +_mark_array_using_reversal: + pushl $0 + movl $1,a3 + jmp __mark_node + +_mark_strict_basic_array: + movl 4(a0),d0 + cmpl $INT+2,a2 + je _mark_strict_int_array + cmpl $BOOL+2,a2 + je _mark_strict_bool_array +_mark_strict_real_array: + addl d0,d0 +_mark_strict_int_array: + addl $3,d0 + jmp _mark_basic_array_ +_mark_strict_bool_array: + addl $12+3,d0 + shrl $2,d0 + jmp _mark_basic_array_ + +_mark_b_record_array: + movl 4(a0),a2 + subl $256,d0 + imull a2,d0 + addl $3,d0 + jmp _mark_basic_array_ + +_mark_string_: + movl 4(a0),d0 + addl $8+3,d0 + shrl $2,d0 + +_mark_basic_array_: + orl a3,(,d1,4) + + addl d0,n_marked_words_offset(a4) + lea -4(a0,d0,4),d0 + + addl neg_heap_p3_offset(a4),d0 + shrl $7,d0 + addl heap_vector_d4_offset(a4),d0 + + cmpl d0,d1 + jae _mark_next_node + + incl d1 + movl $1,a2 + cmpl d0,d1 + jae _last_string_bits + +_mark_string_lp: + orl a2,(,d1,4) + incl d1 + cmpl d0,d1 + jb _mark_string_lp + +_last_string_bits: + orl a2,(,d1,4) + jmp _mark_next_node + +__end_mark_using_reversal: + popl a1 + test a1,a1 + je _mark_next_node + movl a0,(a1) + jmp _mark_next_node +#endif + +__mark_using_reversal: + pushl a0 + movl $1,a3 + movl (a0),a0 + jmp __mark_node + +__mark_arguments: + movl (a0),d0 + test $2,d0 + je __mark_lazy_node + + movzwl -2(d0),a2 + testl a2,a2 + je __mark_hnf_0 + + addl $4,a0 + + cmpl $256,a2 + jae __mark__record + + subl $2,a2 + je __mark_hnf_2 + jb __mark_hnf_1 + +__mark_hnf_3: + movl bit_set_table(a1),a1 + addl $3,n_marked_words_offset(a4) + + orl a1,(,d1,4) + + cmpl $0x20000000,a1 + + movl heap_vector_d4_offset(a4),a1 + + jbe fits__in__word__1 + orl $1,4(,d1,4) +fits__in__word__1: + movl 4(a0),d1 + addl neg_heap_p3_offset(a4),d1 + + movl $31*4,d0 + andl d1,d0 + shrl $7,d1 + addl a1,d1 + + movl bit_set_table(d0),a1 + testl (,d1,4),a1 + jne __shared_argument_part + +__no_shared_argument_part: + orl a1,(,d1,4) + movl 4(a0),a1 + + addl $1,a2 + movl a3,4(a0) + + addl a2,n_marked_words_offset(a4) + addl $4,a0 + + shl $2,a2 + orl $1,(a1) + + addl a2,d0 + addl a2,a1 + + cmpl $32*4,d0 + jbe fits__in__word__2 + orl $1,4(,d1,4) +fits__in__word__2: + + movl -4(a1),a2 + movl a0,-4(a1) + lea -4(a1),a3 + movl a2,a0 + jmp __mark_node + +__mark_hnf_1: + movl bit_set_table(a1),a1 + addl $2,n_marked_words_offset(a4) + orl a1,(,d1,4) + cmpl $0x40000000,a1 + jbe __shared_argument_part + orl $1,4(,d1,4) +__shared_argument_part: + movl (a0),a2 + movl a3,(a0) + lea 2(a0),a3 + movl a2,a0 + jmp __mark_node + +__mark_no_selector_2: + popl d1 +__mark_no_selector_1: + movl bit_set_table(a1),a1 + addl $3,n_marked_words_offset(a4) + orl a1,(,d1,4) + cmpl $0x20000000,a1 + jbe __shared_argument_part + + orl $1,4(,d1,4) + jmp __shared_argument_part + +__mark_lazy_node_1: + je __mark_no_selector_1 + +__mark_selector_node_1: + cmpl $-2,a2 + je __mark_indirection_node + + cmpl $-3,a2 + + pushl d1 + movl (a0),a2 + pushl d0 + movl neg_heap_p3_offset(a4),d0 + + jle __mark_record_selector_node_1 + + addl a2,d0 + + movl d0,d1 + andl $31*4,d0 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + + movl bit_set_table(d0),d0 + testl (,d1,4),d0 + popl d0 + jne __mark_no_selector_2 + + movl (a2),d1 + testb $2,d1b + je __mark_no_selector_2 + + cmpw $2,-2(d1) + jbe __small_tuple_or_record + +__large_tuple_or_record: + movl 8(a2),d1 + addl neg_heap_p3_offset(a4),d1 + + movl $31*4,a2 + andl d1,a2 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + + movl bit_set_table(a2),a2 + testl (,d1,4),a2 + jne __mark_no_selector_2 + + movl -8(d0),d0 + movl (a0),a1 + movl $__indirection,-4(a0) + movl a0,a2 + + popl d1 + + movzwl 4(d0),d0 + cmpl $8,d0 + jl __mark_tuple_selector_node_1 + movl 8(a1),a1 + je __mark_tuple_selector_node_2 + subl $12,d0 + movl (a1,d0),a0 + movl a0,(a2) + jmp __mark_node + +__mark_tuple_selector_node_2: + movl (a1),a0 + movl a0,(a2) + jmp __mark_node + +__small_tuple_or_record: + movl -8(d0),d0 + movl (a0),a1 + movl $__indirection,-4(a0) + movl a0,a2 + + popl d1 + + movzwl 4(d0),d0 +__mark_tuple_selector_node_1: + movl (a1,d0),a0 + movl a0,(a2) + jmp __mark_node + +__mark_record_selector_node_1: + je __mark_strict_record_selector_node_1 + + addl a2,d0 + + movl d0,d1 + andl $31*4,d0 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + + movl bit_set_table(d0),d0 + testl (,d1,4),d0 + popl d0 + jne __mark_no_selector_2 + + movl (a2),d1 + testb $2,d1b + je __mark_no_selector_2 + + cmpw $258,-2(d1) + jbe __small_record + + movl 8(a2),d1 + addl neg_heap_p3_offset(a4),d1 + + movl $31*4,a2 + andl d1,a2 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + + movl bit_set_table(a2),a2 + testl (,d1,4),a2 + jne __mark_no_selector_2 + +__small_record: + movl -8(d0),d0 + movl (a0),a1 + movl $__indirection,-4(a0) + movl a0,a2 + + popl d1 + + movzwl 4(d0),d0 + cmpl $8,d0 + jle __mark_record_selector_node_2 + movl 8(a1),a1 + subl $12,d0 +__mark_record_selector_node_2: + movl (a1,d0),a0 + + movl a0,(a2) + jmp __mark_node + +__mark_strict_record_selector_node_1: + addl a2,d0 + + movl d0,d1 + andl $31*4,d0 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + + movl bit_set_table(d0),d0 + testl (,d1,4),d0 + popl d0 + jne __mark_no_selector_2 + + movl (a2),d1 + testb $2,d1b + je __mark_no_selector_2 + + cmpw $258,-2(d1) + jle __select_from_small_record + + movl 8(a2),d1 + addl neg_heap_p3_offset(a4),d1 + + movl $31*4,a2 + andl d1,a2 + shrl $7,d1 + addl heap_vector_d4_offset(a4),d1 + + movl bit_set_table(a2),a2 + testl (,d1,4),a2 + jne __mark_no_selector_2 + +__select_from_small_record: + movl -8(d0),d0 + movl (a0),a1 + popl d1 + subl $4,a0 + + movzwl 4(d0),d1 + cmpl $8,d1 + jle __mark_strict_record_selector_node_2 + addl 8(a1),d1 + movl -12(d1),d1 + jmp __mark_strict_record_selector_node_3 +__mark_strict_record_selector_node_2: + movl (a1,d1),d1 +__mark_strict_record_selector_node_3: + movl d1,4(a0) + + movzwl 6(d0),d1 + testl d1,d1 + je __mark_strict_record_selector_node_5 + cmpl $8,d1 + jle __mark_strict_record_selector_node_4 + movl 8(a1),a1 + subl $12,d1 +__mark_strict_record_selector_node_4: + movl (a1,d1),d1 + movl d1,8(a0) +__mark_strict_record_selector_node_5: + + movl -4(d0),d0 + movl d0,(a0) + jmp __mark_node + +__mark_indirection_node: + movl (a0),a0 + jmp __mark_node + +__mark_hnf_2: + movl bit_set_table(a1),a1 + addl $3,n_marked_words_offset(a4) + orl a1,(,d1,4) + cmpl $0x20000000,a1 + jbe fits__in__word__6 + orl $1,4(,d1,4) +fits__in__word__6: + +__mark_record_2_c: + movl (a0),d0 + movl 4(a0),a2 + orl $2,d0 + movl a3,4(a0) + movl d0,(a0) + lea 4(a0),a3 + movl a2,a0 + +__mark_node: + movl neg_heap_p3_offset(a4),d1 + movl heap_vector_d4_offset(a4),d0 + + addl a0,d1 + cmpl heap_size_32_33_offset(a4),d1 + jae __mark_next_node + + movl $31*4,a1 + andl d1,a1 + shrl $7,d1 + addl d0,d1 + movl bit_set_table(a1),a2 + testl (,d1,4),a2 + je __mark_arguments + +__mark_next_node: + testl $3,a3 + jne __mark_parent + + movl -4(a3),a2 + movl (a3),a1 + movl a0,(a3) + movl a1,-4(a3) + subl $4,a3 + + movl a2,a0 + andl $3,a2 + andl $-4,a0 + orl a2,a3 + jmp __mark_node + +__mark_parent: + movl a3,d1 + andl $-4,a3 + je __end_mark_using_reversal + + andl $3,d1 + movl (a3),a2 + movl a0,(a3) + + subl $1,d1 + je __argument_part_parent + + lea -4(a3),a0 + movl a2,a3 + jmp __mark_next_node + +__argument_part_parent: + andl $-4,a2 + movl a3,a1 + movl -4(a2),a0 + movl (a2),d1 + movl d1,-4(a2) + movl a1,(a2) + lea 2-4(a2),a3 + jmp __mark_node + +__mark_lazy_node: + movl -4(d0),a2 + testl a2,a2 + je __mark_real_or_file + + addl $4,a0 + cmpl $1,a2 + jle __mark_lazy_node_1 + cmpl $257,a2 + jge __mark_closure_with_unboxed_arguments + + addl $1,a2 + movl a1,d0 + movl bit_set_table(a1),a1 + addl a2,n_marked_words_offset(a4) + + lea (d0,a2,4),d0 + subl $2,a2 + + orl a1,(,d1,4) + + cmpl $32*4,d0 + jbe fits__in__word__7 + orl $1,4(,d1,4) +fits__in__word__7: +__mark_closure_with_unboxed_arguments__2: + lea (a0,a2,4),a1 + movl (a0),d0 + orl $2,d0 + movl d0,(a0) + movl (a1),a0 + movl a3,(a1) + movl a1,a3 + jmp __mark_node + +__mark_closure_with_unboxed_arguments: + je __mark_closure_1_with_unboxed_argument + + movl bit_set_table(a1),d0 + orl d0,(,d1,4) + + movl a2,d0 + andl $255,a2 + + addl $1,a2 + shrl $8,d0 + addl a2,n_marked_words_offset(a4) + + lea (a1,a2,4),a1 + subl d0,a2 + + cmpl $32*4,a1 + jbe fits__in_word_7_ + orl $1,4(,d1,4) +fits__in_word_7_: + subl $2,a2 + jg __mark_closure_with_unboxed_arguments__2 + je __shared_argument_part + subl $4,a0 + jmp __mark_next_node + +__mark_closure_1_with_unboxed_argument: + subl $4,a0 + jmp __mark_real_or_file + +__mark_hnf_0: + cmpl $INT+2,d0 + jne __no_int_3 + + movl 4(a0),a2 + cmpl $33,a2 + jb ____small_int + +__mark_bool_or_small_string: + movl bit_set_table(a1),a1 + addl $2,n_marked_words_offset(a4) + orl a1,(,d1,4) + cmpl $0x40000000,a1 + jbe __mark_next_node + orl $1,4(,d1,4) + jmp __mark_next_node + +____small_int: + lea small_integers(,a2,8),a0 + jmp __mark_next_node + +__no_int_3: + jb __mark_real_file_or_string + + cmpl $CHAR+2,d0 + jne __no_char_3 + movzbl 4(a0),a2 + lea static_characters(,a2,8),a0 + jmp __mark_next_node + +__no_char_3: + jb __mark_bool_or_small_string + + lea ZERO_ARITY_DESCRIPTOR_OFFSET-2(d0),a0 + jmp __mark_next_node + +__mark_real_file_or_string: + cmpl $__STRING__+2,d0 + jbe __mark_string_or_array + +__mark_real_or_file: + movl bit_set_table(a1),a1 + addl $3,n_marked_words_offset(a4) + + orl a1,(,d1,4) + + cmpl $0x20000000,a1 + jbe __mark_next_node + + orl $1,4(,d1,4) + jmp __mark_next_node + +__mark__record: + subl $258,a2 + je __mark_record_2 + jl __mark_record_1 + +__mark_record_3: + movl bit_set_table(a1),a1 + addl $3,n_marked_words_offset(a4) + orl a1,(,d1,4) + cmpl $0x20000000,a1 + jbe fits__in__word__13 + orl $1,4(,d1,4) +fits__in__word__13: + movzwl -2+2(d0),d1 + + movl 4(a0),d0 + addl neg_heap_p3_offset(a4),d0 + + movl $31*4,a1 + andl d0,a1 + shrl $7,d0 + addl heap_vector_d4_offset(a4),d0 + + pushl a3 + + movl bit_set_table(a1),a3 + testl (,d0,4),a3 + jne __shared_record_argument_part + + addl $1,a2 + orl a3,(,d0,4) + + lea (a1,a2,4),a1 + addl a2,n_marked_words_offset(a4) + + popl a3 + + cmpl $32*4,a1 + jbe fits__in__word__14 + orl $1,4(,d0,4) +fits__in__word__14: + subl $1,d1 + movl 4(a0),a1 + jl __mark_record_3_bb + je __shared_argument_part + + movl a3,4(a0) + addl $4,a0 + + subl $1,d1 + je __mark_record_3_aab + + lea (a1,d1,4),a3 + movl (a1),d0 + orl $1,d0 + movl (a3),a2 + movl d0,(a1) + movl a0,(a3) + movl a2,a0 + jmp __mark_node + +__mark_record_3_bb: + subl $4,a0 + jmp __mark_next_node + +__mark_record_3_aab: + movl (a1),a2 + movl a0,(a1) + lea 1(a1),a3 + movl a2,a0 + jmp __mark_node + +__shared_record_argument_part: + movl 4(a0),a1 + + popl a3 + + test d1,d1 + jne __shared_argument_part + subl $4,a0 + jmp __mark_next_node + +__mark_record_2: + movl bit_set_table(a1),a1 + addl $3,n_marked_words_offset(a4) + orl a1,(,d1,4) + cmpl $0x20000000,a1 + jbe fits__in__word_12 + orl $1,4(,d1,4) +fits__in__word_12: + cmpw $1,-2+2(d0) + ja __mark_record_2_c + je __shared_argument_part + subl $4,a0 + jmp __mark_next_node + +__mark_record_1: + cmpw $0,-2+2(d0) + jne __mark_hnf_1 + subl $4,a0 + jmp __mark_bool_or_small_string + +__mark_string_or_array: + je __mark_string_ + +__mark_array: + movl 8(a0),a2 + test a2,a2 + je __mark_lazy_array + + movzwl -2(a2),d0 + test d0,d0 + je __mark_strict_basic_array + + movzwl -2+2(a2),a2 + test a2,a2 + je __mark_b_record_array + + subl $256,d0 + cmpl a2,d0 + je __mark_a_record_array + +__mark__ab__record__array: + pushl a1 + pushl d1 + movl a2,d1 + + movl 4(a0),a2 + addl $8,a0 + pushl a0 + + shl $2,a2 + movl d0,a1 + imull a2,a1 + + subl d1,d0 + addl $4,a0 + addl a0,a1 + + call reorder + + popl a0 + + xchg d1,d0 + movl -4(a0),a2 + imull a2,d0 + imull a2,d1 + addl d1,n_marked_words_offset(a4) + addl d0,d1 + + movl neg_heap_p3_offset(a4),a2 + shl $2,d1 + addl a0,a2 + addl d1,a2 + + popl d1 + popl a1 + + movl bit_set_table(a1),a1 + orl a1,(,d1,4) + + lea (a0,d0,4),a1 + jmp __mark_r_array + +__mark_a_record_array: + imull 4(a0),d0 + addl $8,a0 + jmp __mark_lr_array + +__mark_lazy_array: + movl 4(a0),d0 + addl $8,a0 + +__mark_lr_array: + movl bit_set_table(a1),a1 + movl neg_heap_p3_offset(a4),a2 + orl a1,(,d1,4) + lea (a0,d0,4),a1 + addl a1,a2 +__mark_r_array: + shrl $7,a2 + addl heap_vector_d4_offset(a4),a2 + + cmpl a2,d1 + jae __skip_mark_lazy_array_bits + + inc d1 + +__mark_lazy_array_bits: + orl $1,(,d1,4) + inc d1 + cmpl a2,d1 + jbe __mark_lazy_array_bits + +__skip_mark_lazy_array_bits: + movl n_marked_words_offset(a4),a2 + addl $3,a2 + addl d0,a2 + + cmpl $1,d0 + movl a2,n_marked_words_offset(a4) + jbe __mark_array_length_0_1 + + movl (a1),a2 + movl (a0),d1 + movl d1,(a1) + movl a2,(a0) + + movl -4(a1),a2 + subl $4,a1 + movl lazy_array_list_offset(a4),d1 + addl $2,a2 + movl d1,(a1) + movl a2,-4(a0) + movl d0,-8(a0) + subl $8,a0 + movl a0,lazy_array_list_offset(a4) + + movl -4(a1),a0 + movl a3,-4(a1) + lea -4(a1),a3 + jmp __mark_node + +__mark_array_length_0_1: + lea -8(a0),a0 + jb __mark_next_node + + movl 12(a0),d1 + movl 8(a0),a2 + movl lazy_array_list_offset(a4),a1 + movl a2,12(a0) + movl a1,8(a0) + movl d0,(a0) + movl a0,lazy_array_list_offset(a4) + movl d1,4(a0) + addl $4,a0 + + movl (a0),a2 + movl a3,(a0) + lea 2(a0),a3 + movl a2,a0 + jmp __mark_node + +__mark_b_record_array: + movl 4(a0),a2 + subl $256,d0 + imull a2,d0 + addl $3,d0 + jmp __mark_basic_array + +__mark_strict_basic_array: + movl 4(a0),d0 + cmpl $INT+2,a2 + je __mark__strict__int__array + cmpl $BOOL+2,a2 + je __mark__strict__bool__array +__mark__strict__real__array: + addl d0,d0 +__mark__strict__int__array: + addl $3,d0 + jmp __mark_basic_array +__mark__strict__bool__array: + addl $12+3,d0 + shrl $2,d0 + jmp __mark_basic_array + +__mark_string_: + movl 4(a0),d0 + addl $8+3,d0 + shr $2,d0 + +__mark_basic_array: + movl bit_set_table(a1),a1 + addl d0,n_marked_words_offset(a4) + + orl a1,(,d1,4) + lea -4(a0,d0,4),d0 + + addl neg_heap_p3_offset(a4),d0 + shrl $7,d0 + addl heap_vector_d4_offset(a4),d0 + + cmpl d0,d1 + jae __mark_next_node + + incl d1 + movl $1,a2 + + cmpl d0,d1 + jae __last__string__bits + +__mark_string_lp: + orl a2,(,d1,4) + incl d1 + cmpl d0,d1 + jb __mark_string_lp + +__last__string__bits: + orl a2,(,d1,4) + jmp __mark_next_node -- cgit v1.2.3