mark_stack_nodes3: pop a2 movl a0,-4(a2) jmp mark_stack_nodes mark_stack_nodes2: pop a2 mark_stack_nodes1: movl (a0),d1 leal 1-4(a2),d0 movl d1,-4(a2) movl d0,(a0) mark_stack_nodes: cmpl end_vector,a2 je end_mark_nodes movl (a2),a0 addl $4,a2 movl neg_heap_p3,d0 addl a0,d0 #ifdef SHARE_CHAR_INT cmpl heap_size_32_33,d0 jnc mark_stack_nodes #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),a3 test d0,a3 jne mark_stack_nodes1 orl d0,a3 push a2 movl a3,(a4,d1,4) #else shrl $2,d0 bts d0,(a4) jc mark_stack_nodes1 push a2 #endif movl $1,a3 mark_arguments: movl (a0),d0 testb $2,d0b je mark_lazy_node movzwl -2(d0),a2 test a2,a2 je mark_hnf_0 addl $4,a0 cmp $256,a2 jae mark_record subl $2,a2 je mark_hnf_2 jc mark_hnf_1 mark_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 shared_argument_part orl d0,(a4,d1,4) #else shrl $2,d0 bts d0,(a4) jc shared_argument_part #endif 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 mark_node shared_argument_part: cmpl a0,a1 ja mark_hnf_1 movl (a1),d1 leal 4+2+1(a0),d0 movl d0,(a1) movl d1,4(a0) jmp mark_hnf_1 mark_record: subl $258,a2 je mark_record_2 jb mark_record_1 mark_record_3: movzwl -2+2(d0),a2 subl $1,a2 jb mark_record_3_bb je mark_record_3_ab dec a2 je mark_record_3_aab jmp mark_hnf_3 mark_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 mark_next_node #ifdef NO_BIT_INSTRUCTIONS add d0,d0 jne bit_in_same_word1 inc a2 mov $1,d0 bit_in_same_word1: testl (a4,a2,4),d0 je not_yet_linked_bb #else inc d0 bts d0,(a4) jnc 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) not_yet_linked_bb: #endif movl (a1),a2 lea 8+2+1(a0),d0 movl a2,8(a0) movl d0,(a1) jmp mark_next_node #ifdef NO_BIT_INSTRUCTIONS 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 mark_next_node #endif mark_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 mark_hnf_1 #ifdef NO_BIT_INSTRUCTIONS add d0,d0 jne bit_in_same_word2 inc a2 mov $1,d0 bit_in_same_word2: testl (a4,a2,4),d0 je not_yet_linked_ab #else inc d0 bts d0,(a4) jnc 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) not_yet_linked_ab: #endif movl (a1),a2 lea 4+2+1(a0),d0 movl a2,4(a0) movl d0,(a1) jmp mark_hnf_1 #ifdef NO_BIT_INSTRUCTIONS 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 mark_hnf_1 #endif mark_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 shared_argument_part orl d0,(a4,a2,4) #else shr $2,d0 bts d0,(a4) jc 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 mark_node mark_record_2: cmpw $1,-2+2(d0) ja mark_hnf_2 je mark_hnf_1 subl $4,a0 jmp mark_next_node mark_record_1: cmpw $0,-2+2(d0) jne mark_hnf_1 subl $4,a0 jmp mark_next_node mark_lazy_node_1: / selectors: jne mark_selector_node_1 mark_hnf_1: movl (a0),a2 movl a3,(a0) leal 2(a0),a3 movl a2,a0 jmp mark_node / selectors mark_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 mark_node mark_selector_node_1: addl $3,a2 je mark_indirection_node movl (a0),a1 movl neg_heap_p3,d1 addl a1,d1 shrl $2,d1 addl $1,a2 jle mark_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 mark_hnf_1 #else bt d1,(a4) jc mark_hnf_1 #endif movl (a1),d1 testb $2,d1b je mark_hnf_1 cmpw $2,-2(d1) jbe small_tuple_or_record 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 mark_hnf_1 #else bt d1,(a4) jc mark_hnf_1 #endif small_tuple_or_record: movl neg_heap_p3,d1 lea -4(a0,d1),d1 pushl 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 mark_node mark_record_selector_node_1: je mark_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 mark_hnf_1 #else bt d1,(a4) jc mark_hnf_1 #endif movl (a1),d1 testb $2,d1b je mark_hnf_1 cmpw $258,-2(d1) jbe small_tuple_or_record jmp large_tuple_or_record mark_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 mark_hnf_1 #else bt d1,(a4) jc mark_hnf_1 #endif movl (a1),d1 testb $2,d1b je mark_hnf_1 cmpw $258,-2(d1) jbe 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 mark_hnf_1 #else shrl $2,d1 bt d1,(a4) jc mark_hnf_1 #endif select_from_small_record: / changed 24-1-97 movl -8(d0),d0 subl $4,a0 call *4(d0) jmp mark_next_node mark_hnf_2: orl $2,(a0) movl 4(a0),a2 movl a3,4(a0) leal 4(a0),a3 movl a2,a0 mark_node: movl neg_heap_p3,d0 addl a0,d0 #ifdef SHARE_CHAR_INT cmpl heap_size_32_33,d0 jnc mark_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 mark_next_node orl d0,a2 movl a2,(a4,d1,4) jmp mark_arguments #else shrl $2,d0 bts d0,(a4) jnc mark_arguments #endif / a2,d1: free mark_next_node: test $3,a3 jne mark_parent movl -4(a3),a2 movl $3,d1 andl a2,d1 subl $4,a3 cmpl $3,d1 je argument_part_cycle1 movl 4(a3),a1 movl a1,K6_0(a3) c_argument_part_cycle1: cmpl a3,a0 ja 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 mark_node no_reverse_1: movl a0,4(a3) movl a2,a0 orl d1,a3 xorl d1,a0 jmp mark_node mark_lazy_node: movl -4(d0),a2 test a2,a2 je mark_next_node addl $4,a0 subl $1,a2 jle mark_lazy_node_1 cmpl $255,a2 jge mark_closure_with_unboxed_arguments mark_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 mark_node mark_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 mark_closure_with_unboxed_arguments_ je mark_hnf_1 subl $4,a0 jmp mark_next_node mark_hnf_0: #ifdef SHARE_CHAR_INT cmpl $INT+2,d0 je mark_int_3 cmpl $CHAR+2,d0 je mark_char_3 jb 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 mark_next_node_after_static mark_int_3: movl 4(a0),a2 cmpl $33,a2 jnc mark_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 mark_next_node_after_static mark_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 mark_next_node_after_static no_normal_hnf_0: #endif cmpl $__ARRAY__+2,d0 jne mark_next_node movl 8(a0),d0 test d0,d0 je mark_lazy_array movzwl -2+2(d0),d1 test d1,d1 je mark_b_record_array movzwl -2(d0),d0 test d0,d0 je mark_b_record_array subl $256,d0 cmpl d0,d1 je mark_a_record_array mark_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 mark_lr_array mark_b_record_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 mark_next_node mark_a_record_array: movl 4(a0),d0 addl $8,a0 cmpl $2,d1 jb mark_lr_array imull d1,d0 jmp mark_lr_array mark_lazy_array: movl 4(a0),d0 addl $8,a0 mark_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 mark_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 mark_node mark_array_length_0_1: lea -8(a0),a0 jb mark_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 mark_hnf_1 / a2: free mark_parent: movl a3,d1 andl $3,d1 andl $-4,a3 je mark_stack_nodes2 subl $1,d1 je argument_part_parent movl K6_0(a3),a2 cmpl a3,a0 ja no_reverse_2 movl a0,a1 leal 1(a3),d0 movl (a1),a0 movl d0,(a1) no_reverse_2: movl a0,K6_0(a3) leal -4(a3),a0 movl a2,a3 jmp mark_next_node argument_part_parent: movl K6_0(a3),a2 movl a3,a1 movl a0,a3 movl a1,a0 skip_upward_pointers: movl a2,d0 andl $3,d0 cmpl $3,d0 jne no_upward_pointer leal -3(a2),a1 movl -3(a2),a2 jmp skip_upward_pointers no_upward_pointer: cmpl a0,a3 ja no_reverse_3 movl a3,d1 movl K6_0(a3),a3 leal 1(a0),d0 movl d0,(d1) 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 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 mark_node no_reverse_4: movl a0,4(a1) movl a2,a0 andl $-4,a0 jmp mark_node argument_part_cycle1: movl 4(a3),d0 push a1 skip_pointer_list1: movl a2,a1 andl $-4,a1 movl (a1),a2 movl $3,d1 andl a2,d1 cmpl $3,d1 je skip_pointer_list1 movl d0,(a1) pop a1 jmp c_argument_part_cycle1 #ifdef SHARE_CHAR_INT mark_next_node_after_static: test $3,a3 jne mark_parent_after_static movl -4(a3),a2 movl $3,d1 andl a2,d1 subl $4,a3 cmpl $3,d1 je argument_part_cycle2 movl 4(a3),d0 movl d0,K6_0(a3) c_argument_part_cycle2: movl a0,4(a3) movl a2,a0 orl d1,a3 xorl d1,a0 jmp mark_node mark_parent_after_static: movl a3,d1 andl $3,d1 andl $-4,a3 je mark_stack_nodes3 subl $1,d1 je argument_part_parent_after_static movl K6_0(a3),a2 movl a0,K6_0(a3) leal -4(a3),a0 movl a2,a3 jmp mark_next_node argument_part_parent_after_static: movl K6_0(a3),a2 movl a3,a1 movl a0,a3 movl a1,a0 / movl (a1),a2 skip_upward_pointers_2: movl a2,d0 andl $3,d0 cmpl $3,d0 jne no_reverse_3 / movl a2,a1 / andl $-4,a1 / movl (a1),a2 lea -3(a2),a1 movl -3(a2),a2 jmp skip_upward_pointers_2 argument_part_cycle2: movl 4(a3),d0 push a1 skip_pointer_list2: movl a2,a1 andl $-4,a1 movl (a1),a2 movl $3,d1 andl a2,d1 cmpl $3,d1 je skip_pointer_list2 movl d0,(a1) pop a1 jmp c_argument_part_cycle2 #endif end_mark_nodes: ret