rmark_using_reversal: pushl a3 pushl a3 movl $1,a3 jmp rmarkr_node rmark_using_reversal_: subl $4,a0 pushl d1 pushl a3 cmpl d1,a0 ja rmark_no_undo_reverse_1 movl a0,(a3) movl d0,(a0) rmark_no_undo_reverse_1: movl $1,a3 jmp rmarkr_arguments rmark_array_using_reversal: pushl d1 pushl a3 cmpl d1,a0 ja rmark_no_undo_reverse_2 movl a0,(a3) movl $__ARRAY__+2,(a0) rmark_no_undo_reverse_2: movl $1,a3 jmp rmarkr_arguments rmarkr_hnf_2: orl $2,(a0) movl 4(a0),a2 movl a3,4(a0) leal 4(a0),a3 movl a2,a0 rmarkr_node: movl neg_heap_p3,d0 addl a0,d0 #ifdef SHARE_CHAR_INT cmpl heap_size_32_33,d0 jnc rmarkr_next_node_after_static #endif #ifdef NO_BIT_INSTRUCTIONS movl d0,d1 andl $31*4,d0 shrl $7,d1 movl bit_set_table(d0),d0 movl (a4,d1,4),a2 test d0,a2 jne rmarkr_next_node orl d0,a2 movl a2,(a4,d1,4) #else shrl $2,d0 bts d0,(a4) jc rmarkr_next_node #endif rmarkr_arguments: movl (a0),d0 testb $2,d0b je rmarkr_lazy_node movzwl -2(d0),a2 test a2,a2 je rmarkr_hnf_0 addl $4,a0 cmp $256,a2 jae rmarkr_record subl $2,a2 je rmarkr_hnf_2 jc rmarkr_hnf_1 rmarkr_hnf_3: movl 4(a0),a1 movl neg_heap_p3,d0 addl a1,d0 #ifdef NO_BIT_INSTRUCTIONS movl d0,d1 andl $31*4,d0 shrl $7,d1 movl bit_set_table(d0),d0 test (a4,d1,4),d0 jne rmarkr_shared_argument_part orl d0,(a4,d1,4) #else shrl $2,d0 bts d0,(a4) jc rmarkr_shared_argument_part #endif rmarkr_no_shared_argument_part: orl $2,(a0) movl a3,4(a0) addl $4,a0 orl $1,(a1) leal (a1,a2,4),a1 movl (a1),a2 movl a0,(a1) movl a1,a3 movl a2,a0 jmp rmarkr_node rmarkr_shared_argument_part: cmpl a0,a1 ja rmarkr_hnf_1 movl (a1),d1 leal 4+2+1(a0),d0 movl d0,(a1) movl d1,4(a0) jmp rmarkr_hnf_1 rmarkr_record: subl $258,a2 je rmarkr_record_2 jb rmarkr_record_1 rmarkr_record_3: movzwl -2+2(d0),a2 subl $1,a2 jb rmarkr_record_3_bb je rmarkr_record_3_ab dec a2 je rmarkr_record_3_aab jmp rmarkr_hnf_3 rmarkr_record_3_bb: movl 8-4(a0),a1 subl $4,a0 movl neg_heap_p3,d0 addl a1,d0 #ifdef NO_BIT_INSTRUCTIONS movl d0,a2 andl $31*4,d0 shrl $7,a2 movl bit_set_table(d0),d0 orl d0,(a4,a2,4) #else shrl $2,d0 bts d0,(a4) #endif cmpl a0,a1 ja rmarkr_next_node #ifdef NO_BIT_INSTRUCTIONS add d0,d0 jne rmarkr_bit_in_same_word1 inc a2 mov $1,d0 rmarkr_bit_in_same_word1: testl (a4,a2,4),d0 je rmarkr_not_yet_linked_bb #else inc d0 bts d0,(a4) jnc rmarkr_not_yet_linked_bb #endif movl neg_heap_p3,d0 addl a0,d0 #ifdef NO_BIT_INSTRUCTIONS addl $2*4,d0 movl d0,a2 andl $31*4,d0 shrl $7,a2 movl bit_set_table(d0),d0 orl d0,(a4,a2,4) #else shrl $2,d0 addl $2,d0 bts d0,(a4) rmarkr_not_yet_linked_bb: #endif movl (a1),a2 lea 8+2+1(a0),d0 movl a2,8(a0) movl d0,(a1) jmp rmarkr_next_node #ifdef NO_BIT_INSTRUCTIONS rmarkr_not_yet_linked_bb: orl d0,(a4,a2,4) movl (a1),a2 lea 8+2+1(a0),d0 movl a2,8(a0) movl d0,(a1) jmp rmarkr_next_node #endif rmarkr_record_3_ab: movl 4(a0),a1 movl neg_heap_p3,d0 addl a1,d0 #ifdef NO_BIT_INSTRUCTIONS movl d0,a2 andl $31*4,d0 shrl $7,a2 movl bit_set_table(d0),d0 orl d0,(a4,a2,4) #else shr $2,d0 bts d0,(a4) #endif cmpl a0,a1 ja rmarkr_hnf_1 #ifdef NO_BIT_INSTRUCTIONS add d0,d0 jne rmarkr_bit_in_same_word2 inc a2 mov $1,d0 rmarkr_bit_in_same_word2: testl (a4,a2,4),d0 je rmarkr_not_yet_linked_ab #else inc d0 bts d0,(a4) jnc rmarkr_not_yet_linked_ab #endif movl neg_heap_p3,d0 addl a0,d0 #ifdef NO_BIT_INSTRUCTIONS addl $4,d0 movl d0,a2 andl $31*4,d0 shrl $7,a2 movl bit_set_table(d0),d0 orl d0,(a4,a2,4) #else shr $2,d0 inc d0 bts d0,(a4) rmarkr_not_yet_linked_ab: #endif movl (a1),a2 lea 4+2+1(a0),d0 movl a2,4(a0) movl d0,(a1) jmp rmarkr_hnf_1 #ifdef NO_BIT_INSTRUCTIONS rmarkr_not_yet_linked_ab: orl d0,(a4,a2,4) movl (a1),a2 lea 4+2+1(a0),d0 movl a2,4(a0) movl d0,(a1) jmp rmarkr_hnf_1 #endif rmarkr_record_3_aab: movl 4(a0),a1 movl neg_heap_p3,d0 addl a1,d0 #ifdef NO_BIT_INSTRUCTIONS movl d0,a2 andl $31*4,d0 shrl $7,a2 movl bit_set_table(d0),d0 testl (a4,a2,4),d0 jne rmarkr_shared_argument_part orl d0,(a4,a2,4) #else shr $2,d0 bts d0,(a4) jc rmarkr_shared_argument_part #endif addl $2,(a0) movl a3,4(a0) addl $4,a0 movl (a1),a3 movl a0,(a1) movl a3,a0 lea 1(a1),a3 jmp rmarkr_node rmarkr_record_2: cmpw $1,-2+2(d0) ja rmarkr_hnf_2 je rmarkr_hnf_1 subl $4,a0 jmp rmarkr_next_node rmarkr_record_1: cmpw $0,-2+2(d0) jne rmarkr_hnf_1 subl $4,a0 jmp rmarkr_next_node rmarkr_lazy_node_1: / selectors: jne rmarkr_selector_node_1 rmarkr_hnf_1: movl (a0),a2 movl a3,(a0) leal 2(a0),a3 movl a2,a0 jmp rmarkr_node / selectors rmarkr_indirection_node: movl neg_heap_p3,d1 leal -4(a0,d1),d1 #ifdef NO_BIT_INSTRUCTIONS movl d1,d0 andl $31*4,d0 shrl $7,d1 movl bit_clear_table(d0),d0 andl d0,(a4,d1,4) #else shrl $2,d1 btr d1,(a4) #endif movl (a0),a0 jmp rmarkr_node rmarkr_selector_node_1: addl $3,a2 je rmarkr_indirection_node movl (a0),a1 movl neg_heap_p3,d1 addl a1,d1 shrl $2,d1 addl $1,a2 jle rmarkr_record_selector_node_1 #ifdef NO_BIT_INSTRUCTIONS push d0 movl d1,d0 shrl $5,d1 andl $31,d0 movl bit_set_table(,d0,4),d0 movl (a4,d1,4),d1 andl d0,d1 pop d0 jne rmarkr_hnf_1 #else bt d1,(a4) jc rmarkr_hnf_1 #endif movl (a1),d1 testb $2,d1b je rmarkr_hnf_1 cmpw $2,-2(d1) jbe rmarkr_small_tuple_or_record rmarkr_large_tuple_or_record: movl 8(a1),d1 addl neg_heap_p3,d1 shrl $2,d1 #ifdef NO_BIT_INSTRUCTIONS push d0 movl d1,d0 shrl $5,d1 andl $31,d0 movl bit_set_table(,d0,4),d0 movl (a4,d1,4),d1 andl d0,d1 pop d0 jne rmarkr_hnf_1 #else bt d1,(a4) jc rmarkr_hnf_1 #endif #ifdef NEW_DESCRIPTORS movl neg_heap_p3,d1 lea -4(a0,d1),d1 push a0 movl -8(d0),d0 movl d1,a0 andl $31*4,a0 shrl $7,d1 movl bit_clear_table(a0),a0 andl a0,(a4,d1,4) movzwl 4(d0),d0 cmpl $8,d0 jl rmarkr_tuple_or_record_selector_node_2 movl 8(a1),a1 je rmarkr_tuple_selector_node_2 movl -12(a1,d0),a0 pop a1 movl $__indirection,-4(a1) movl a0,(a1) jmp rmarkr_node rmarkr_tuple_selector_node_2: movl (a1),a0 pop a1 movl $__indirection,-4(a1) movl a0,(a1) jmp rmarkr_node #else rmarkr_small_tuple_or_record: movl neg_heap_p3,d1 lea -4(a0,d1),d1 push a0 #ifdef NO_BIT_INSTRUCTIONS movl d1,a0 andl $31*4,a0 shrl $7,d1 movl bit_clear_table(a0),a0 andl a0,(a4,d1,4) #else shrl $2,d1 btr d1,(a4) #endif movl -8(d0),d0 movl a1,a0 push a2 call *4(d0) pop a2 pop a1 movl $__indirection,-4(a1) movl a0,(a1) jmp rmarkr_node #endif rmarkr_record_selector_node_1: je rmarkr_strict_record_selector_node_1 #ifdef NO_BIT_INSTRUCTIONS push d0 movl d1,d0 shrl $5,d1 andl $31,d0 movl bit_set_table(,d0,4),d0 movl (a4,d1,4),d1 andl d0,d1 pop d0 jne rmarkr_hnf_1 #else bt d1,(a4) jc rmarkr_hnf_1 #endif movl (a1),d1 testb $2,d1b je rmarkr_hnf_1 cmpw $258,-2(d1) #ifdef NEW_DESCRIPTORS jbe rmarkr_small_tuple_or_record movl 8(a1),d1 addl neg_heap_p3,d1 shrl $2,d1 push d0 movl d1,d0 shrl $5,d1 andl $31,d0 movl bit_set_table(,d0,4),d0 movl (a4,d1,4),d1 andl d0,d1 pop d0 jne rmarkr_hnf_1 rmarkr_small_tuple_or_record: movl neg_heap_p3,d1 lea -4(a0,d1),d1 push a0 movl -8(d0),d0 movl d1,a0 andl $31*4,a0 shrl $7,d1 movl bit_clear_table(a0),a0 andl a0,(a4,d1,4) movzwl 4(d0),d0 cmpl $8,d0 jle rmarkr_tuple_or_record_selector_node_2 movl 8(a1),a1 subl $12,d0 rmarkr_tuple_or_record_selector_node_2: movl (a1,d0),a0 pop a1 movl $__indirection,-4(a1) movl a0,(a1) jmp rmarkr_node #else jbe rmarkr_small_tuple_or_record jmp rmarkr_large_tuple_or_record #endif rmarkr_strict_record_selector_node_1: #ifdef NO_BIT_INSTRUCTIONS push d0 movl d1,d0 shrl $5,d1 andl $31,d0 movl bit_set_table(,d0,4),d0 movl (a4,d1,4),d1 andl d0,d1 pop d0 jne rmarkr_hnf_1 #else bt d1,(a4) jc rmarkr_hnf_1 #endif movl (a1),d1 testb $2,d1b je rmarkr_hnf_1 cmpw $258,-2(d1) jbe rmarkr_select_from_small_record movl 8(a1),d1 addl neg_heap_p3,d1 #ifdef NO_BIT_INSTRUCTIONS push d0 movl d1,d0 shrl $7,d1 andl $31*4,d0 movl bit_set_table(d0),d0 movl (a4,d1,4),d1 andl d0,d1 pop d0 jne rmarkr_hnf_1 #else shrl $2,d1 bt d1,(a4) jc rmarkr_hnf_1 #endif rmarkr_select_from_small_record: movl -8(d0),d0 subl $4,a0 #ifdef NEW_DESCRIPTORS movzwl 4(d0),d1 cmpl $8,d1 jle rmarkr_strict_record_selector_node_2 addl 8(a1),d1 movl -12(d1),d1 jmp rmarkr_strict_record_selector_node_3 rmarkr_strict_record_selector_node_2: movl (a1,d1),d1 rmarkr_strict_record_selector_node_3: movl d1,4(a0) movzwl 6(d0),d1 testl d1,d1 je rmarkr_strict_record_selector_node_5 cmpl $8,d1 jle rmarkr_strict_record_selector_node_4 movl 8(a1),a1 subl $12,d1 rmarkr_strict_record_selector_node_4: movl (a1,d1),d1 movl d1,8(a0) rmarkr_strict_record_selector_node_5: movl -4(d0),d0 movl d0,(a0) #else call *4(d0) #endif jmp rmarkr_next_node / a2,d1: free rmarkr_next_node: test $3,a3 jne rmarkr_parent movl -4(a3),a2 movl $3,d1 andl a2,d1 subl $4,a3 cmpl $3,d1 je rmarkr_argument_part_cycle1 movl 4(a3),a1 movl a1,K6_0(a3) rmarkr_c_argument_part_cycle1: cmpl a3,a0 ja rmarkr_no_reverse_1 movl (a0),a1 leal 4+1(a3),d0 movl a1,4(a3) movl d0,(a0) orl d1,a3 movl a2,a0 xorl d1,a0 jmp rmarkr_node rmarkr_no_reverse_1: movl a0,4(a3) movl a2,a0 orl d1,a3 xorl d1,a0 jmp rmarkr_node rmarkr_lazy_node: movl -4(d0),a2 test a2,a2 je rmarkr_next_node addl $4,a0 subl $1,a2 jle rmarkr_lazy_node_1 cmpl $255,a2 jge rmarkr_closure_with_unboxed_arguments rmarkr_closure_with_unboxed_arguments_: orl $2,(a0) leal (a0,a2,4),a0 movl (a0),a2 movl a3,(a0) movl a0,a3 movl a2,a0 jmp rmarkr_node rmarkr_closure_with_unboxed_arguments: / (a_size+b_size)+(b_size<<8) / addl $1,a2 movl a2,d0 andl $255,a2 shrl $8,d0 subl d0,a2 / subl $1,a2 jg rmarkr_closure_with_unboxed_arguments_ je rmarkr_hnf_1 subl $4,a0 jmp rmarkr_next_node rmarkr_hnf_0: #ifdef SHARE_CHAR_INT cmpl $INT+2,d0 je rmarkr_int_3 cmpl $CHAR+2,d0 je rmarkr_char_3 jb rmarkr_no_normal_hnf_0 movl neg_heap_p3,d1 addl a0,d1 #ifdef NO_BIT_INSTRUCTIONS movl d1,a0 andl $31*4,a0 shrl $7,d1 movl bit_clear_table(a0),a0 andl a0,(a4,d1,4) #else shrl $2,d1 btr d1,(a4) #endif lea ZERO_ARITY_DESCRIPTOR_OFFSET-2(d0),a0 jmp rmarkr_next_node_after_static rmarkr_int_3: movl 4(a0),a2 cmpl $33,a2 jnc rmarkr_next_node movl neg_heap_p3,d1 addl a0,d1 #ifdef NO_BIT_INSTRUCTIONS movl d1,a0 andl $31*4,a0 shrl $7,d1 movl bit_clear_table(a0),a0 andl a0,(a4,d1,4) #else shrl $2,d1 btr d1,(a4) #endif lea small_integers(,a2,8),a0 jmp rmarkr_next_node_after_static rmarkr_char_3: movl neg_heap_p3,d1 movzbl 4(a0),d0 addl a0,d1 #ifdef NO_BIT_INSTRUCTIONS movl d1,a2 andl $31*4,a2 shrl $7,d1 movl bit_clear_table(a2),a2 andl a2,(a4,d1,4) #else shrl $2,d1 btr d1,(a4) #endif lea static_characters(,d0,8),a0 jmp rmarkr_next_node_after_static rmarkr_no_normal_hnf_0: #endif cmpl $__ARRAY__+2,d0 jne rmarkr_next_node movl 8(a0),d0 test d0,d0 je rmarkr_lazy_array movzwl -2+2(d0),d1 test d1,d1 je rmarkr_b_array movzwl -2(d0),d0 test d0,d0 je rmarkr_b_array subl $256,d0 cmpl d0,d1 je rmarkr_a_record_array rmarkr_ab_record_array: movl 4(a0),a1 addl $8,a0 pushl a0 imull d0,a1 shl $2,a1 subl d1,d0 addl $4,a0 addl a0,a1 call reorder popl a0 movl d1,d0 imull -4(a0),d0 jmp rmarkr_lr_array rmarkr_b_array: movl neg_heap_p3,d0 addl a0,d0 #ifdef NO_BIT_INSTRUCTIONS addl $4,d0 movl d0,a2 andl $31*4,d0 shrl $7,a2 movl bit_set_table(d0),d0 orl d0,(a4,a2,4) #else shrl $2,d0 inc d0 bts d0,(a4) #endif jmp rmarkr_next_node rmarkr_a_record_array: movl 4(a0),d0 addl $8,a0 cmpl $2,d1 jb rmarkr_lr_array imull d1,d0 jmp rmarkr_lr_array rmarkr_lazy_array: movl 4(a0),d0 addl $8,a0 rmarkr_lr_array: movl neg_heap_p3,d1 addl a0,d1 shrl $2,d1 addl d0,d1 #ifdef NO_BIT_INSTRUCTIONS movl d1,a1 andl $31,d1 shrl $5,a1 movl bit_set_table(,d1,4),d1 orl d1,(a4,a1,4) #else bts d1,(a4) #endif cmpl $1,d0 jbe rmarkr_array_length_0_1 movl a0,a1 lea (a0,d0,4),a0 movl (a0),d0 movl (a1),d1 movl d0,(a1) movl d1,(a0) movl -4(a0),d0 subl $4,a0 addl $2,d0 movl -4(a1),d1 subl $4,a1 movl d1,(a0) movl d0,(a1) movl -4(a0),d0 subl $4,a0 movl a3,(a0) movl a0,a3 movl d0,a0 jmp rmarkr_node rmarkr_array_length_0_1: lea -8(a0),a0 jb rmarkr_next_node movl 12(a0),d1 movl 8(a0),a2 movl a2,12(a0) movl 4(a0),a2 movl a2,8(a0) movl d1,4(a0) addl $4,a0 jmp rmarkr_hnf_1 / a2: free rmarkr_parent: movl a3,d1 andl $3,d1 andl $-4,a3 je end_rmarkr subl $1,d1 je rmarkr_argument_part_parent movl K6_0(a3),a2 cmpl a3,a0 ja rmarkr_no_reverse_2 movl a0,a1 leal 1(a3),d0 movl (a1),a0 movl d0,(a1) rmarkr_no_reverse_2: movl a0,K6_0(a3) leal -4(a3),a0 movl a2,a3 jmp rmarkr_next_node rmarkr_argument_part_parent: movl K6_0(a3),a2 movl a3,a1 movl a0,a3 movl a1,a0 rmarkr_skip_upward_pointers: movl a2,d0 andl $3,d0 cmpl $3,d0 jne rmarkr_no_upward_pointer leal -3(a2),a1 movl -3(a2),a2 jmp rmarkr_skip_upward_pointers rmarkr_no_upward_pointer: cmpl a0,a3 ja rmarkr_no_reverse_3 movl a3,d1 movl K6_0(a3),a3 leal 1(a0),d0 movl d0,(d1) rmarkr_no_reverse_3: movl a3,(a1) lea -4(a2),a3 andl $-4,a3 movl a3,a1 movl $3,d1 movl K6_0(a3),a2 andl a2,d1 movl 4(a1),d0 orl d1,a3 movl d0,(a1) cmpl a1,a0 ja rmarkr_no_reverse_4 movl (a0),d0 movl d0,4(a1) leal 4+2+1(a1),d0 movl d0,(a0) movl a2,a0 andl $-4,a0 jmp rmarkr_node rmarkr_no_reverse_4: movl a0,4(a1) movl a2,a0 andl $-4,a0 jmp rmarkr_node rmarkr_argument_part_cycle1: movl 4(a3),d0 push a1 rmarkr_skip_pointer_list1: movl a2,a1 andl $-4,a1 movl (a1),a2 movl $3,d1 andl a2,d1 cmpl $3,d1 je rmarkr_skip_pointer_list1 movl d0,(a1) pop a1 jmp rmarkr_c_argument_part_cycle1 #ifdef SHARE_CHAR_INT rmarkr_next_node_after_static: test $3,a3 jne rmarkr_parent_after_static movl -4(a3),a2 movl $3,d1 andl a2,d1 subl $4,a3 cmpl $3,d1 je rmarkr_argument_part_cycle2 movl 4(a3),d0 movl d0,K6_0(a3) rmarkr_c_argument_part_cycle2: movl a0,4(a3) movl a2,a0 orl d1,a3 xorl d1,a0 jmp rmarkr_node rmarkr_parent_after_static: movl a3,d1 andl $3,d1 andl $-4,a3 je end_rmarkr_after_static subl $1,d1 je rmarkr_argument_part_parent_after_static movl K6_0(a3),a2 movl a0,K6_0(a3) leal -4(a3),a0 movl a2,a3 jmp rmarkr_next_node rmarkr_argument_part_parent_after_static: movl K6_0(a3),a2 movl a3,a1 movl a0,a3 movl a1,a0 / movl (a1),a2 rmarkr_skip_upward_pointers_2: movl a2,d0 andl $3,d0 cmpl $3,d0 jne rmarkr_no_reverse_3 / movl a2,a1 / andl $-4,a1 / movl (a1),a2 lea -3(a2),a1 movl -3(a2),a2 jmp rmarkr_skip_upward_pointers_2 rmarkr_argument_part_cycle2: movl 4(a3),d0 push a1 rmarkr_skip_pointer_list2: movl a2,a1 andl $-4,a1 movl (a1),a2 movl $3,d1 andl a2,d1 cmpl $3,d1 je rmarkr_skip_pointer_list2 movl d0,(a1) pop a1 jmp rmarkr_c_argument_part_cycle2 #endif end_rmarkr_after_static: movl (sp),a3 addl $8,sp movl a0,K6_0(a3) jmp rmarkr_next_stack_node end_rmarkr: popl a3 popl d1 cmpl d1,a0 ja rmark_no_reverse_4 movl a0,a1 leal 1(a3),d0 movl (a0),a0 movl d0,(a1) rmark_no_reverse_4: movl a0,K6_0(a3) rmarkr_next_stack_node: cmpl end_stack,sp jae rmark_next_node movl (sp),a0 movl 4(sp),a3 addl $8,sp cmpl $1,a0 ja rmark_using_reversal jmp rmark_next_node_