diff options
-rw-r--r-- | icompact.s | 1425 | ||||
-rw-r--r-- | icompact_mark.s | 974 | ||||
-rw-r--r-- | icompact_rmark.s | 938 | ||||
-rw-r--r-- | icompact_rmarkr.s | 982 |
4 files changed, 3119 insertions, 1200 deletions
@@ -1,1056 +1,73 @@ + +#define COMPACT_MARK_WITH_STACK + / mark used nodes and pointers in argument parts and link backward pointers movl heap_size_33,d0 shl $5,d0 movl d0,heap_size_32_33 +#ifdef COMPACT_MARK_WITH_STACK + lea -8000(sp),a3 +#endif movl caf_list,d0 +#ifdef COMPACT_MARK_WITH_STACK + movl a3,end_stack +#endif test d0,d0 je end_mark_cafs mark_cafs_lp: pushl -4(d0) +#ifdef COMPACT_MARK_WITH_STACK + lea 4(d0),a3 + movl (d0),d0 + lea (a3,d0,4),a0 +#else lea 4(d0),a2 movl (d0),d0 lea (a2,d0,4),a0 +#endif movl a0,end_vector +#ifdef COMPACT_MARK_WITH_STACK + call rmark_stack_nodes +#else call mark_stack_nodes +#endif popl d0 test d0,d0 jne mark_cafs_lp end_mark_cafs: +#ifdef COMPACT_MARK_WITH_STACK + movl stack_p,a3 +#else movl stack_p,a2 +#endif movl stack_top,a0 movl a0,end_vector +#ifdef COMPACT_MARK_WITH_STACK + call rmark_stack_nodes +#else call mark_stack_nodes - +#endif + #ifdef MEASURE_GC call add_mark_compact_garbage_collect_time #endif jmp compact_heap -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: -/ movzwl -2+2(d0),a2 -/ cmp $1,a2 - cmpw $1,-2+2(d0) - ja mark_hnf_2 - je mark_hnf_1 - subl $4,a0 - jmp mark_next_node - -mark_record_1: -/ movzwl -2+2(d0),a2 -/ test a2,a2 - cmpw $0,-2+2(d0) - jne mark_hnf_1 - subl $4,a0 - jmp mark_next_node - -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_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 - - 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 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) +#ifdef COMPACT_MARK_WITH_STACK +# include "icompact_rmark.s" +# include "icompact_rmarkr.s" #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 - -/ xorl d1,a3 -/ test a3,a3 - - 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 +# include "icompact_mark.s" #endif -end_mark_nodes: - ret - / compact the heap compact_heap: @@ -1125,13 +142,21 @@ end_finalizers_after_compact1: finalizer_list_already_reversed: finalizer_list_empty: +# ifdef COMPACT_MARK_WITH_STACK + movl $free_finalizer_list,a3 + cmpl $__Nil-8,(a3) +# else movl $free_finalizer_list,a2 cmpl $__Nil-8,(a2) +# endif je free_finalizer_list_empty movl $free_finalizer_list+4,end_vector +# ifdef COMPACT_MARK_WITH_STACK + call rmark_stack_nodes +# else call mark_stack_nodes - +# endif free_finalizer_list_empty: #endif @@ -1156,190 +181,6 @@ free_finalizer_list_empty: xorl a3,a3 jmp skip_zeros -move_record: - subl $258,d1 - jb move_record_1 - je move_record_2 - -move_record_3: - movzwl -2+2(d0),d1 - subl $1,d1 - ja move_hnf_3 - - movl (a0),a1 - lea 4(a0),a0 - jb move_record_3_1b - -move_record_3_1a: - cmpl a0,a1 - jb move_record_3_1b -#ifdef SHARE_CHAR_INT - cmpl end_heap_p3,a1 - jae move_record_3_1b -#endif - lea 1(a4),d0 - movl (a1),d1 - movl d0,(a1) - movl d1,a1 -move_record_3_1b: - movl a1,(a4) - addl $4,a4 - - movl (a0),a1 - addl $4,a0 - cmpl a0,a1 - jb move_record_3_2 -#ifdef SHARE_CHAR_INT - cmpl end_heap_p3,a1 - jae move_record_3_2 -#endif - movl neg_heap_p3,d0 -#ifdef NO_BIT_INSTRUCTIONS - pushl a2 -#endif - addl a1,d0 - -#ifdef NO_BIT_INSTRUCTIONS - movl heap_vector,d1 - addl $4,d0 - movl d0,a2 - andl $31*4,a2 - shrl $7,d0 - movl bit_set_table(a2),a2 - testl (d1,d0,4),a2 - je not_linked_record_argument_part_3_b -#else - shr $2,d0 - inc d0 - - movl heap_vector,d1 - bts d0,(d1) - jnc not_linked_record_argument_part_3_b -#endif - - movl neg_heap_p3,d0 - addl a4,d0 - -#ifdef NO_BIT_INSTRUCTIONS - movl d0,a2 - andl $31*4,a2 - shrl $7,d0 - movl bit_set_table(a2),a2 - orl a2,(d1,d0,4) - popl a2 -#else - shr $2,d0 - bts d0,(d1) -#endif - jmp linked_record_argument_part_3_b - -not_linked_record_argument_part_3_b: -#ifdef NO_BIT_INSTRUCTIONS - orl a2,(d1,d0,4) -#endif - movl neg_heap_p3,d0 - addl a4,d0 - -#ifdef NO_BIT_INSTRUCTIONS - movl d0,a2 - andl $31*4,a2 - shrl $7,d0 - movl bit_clear_table(a2),a2 - andl a2,(d1,d0,4) - popl a2 -#else - shr $2,d0 - btr d0,(d1) -#endif - -linked_record_argument_part_3_b: - movl (a1),d1 - lea 2+1(a4),d0 - movl d0,(a1) - movl d1,a1 -move_record_3_2: - movl a1,(a4) - addl $4,a4 - - movl neg_heap_p3,d1 - addl a0,d1 - shr $2,d1 - dec d1 - andl $31,d1 - cmp $2,d1 - jb bit_in_next_word - -#ifdef NO_BIT_INSTRUCTIONS - andl bit_clear_table(,d1,4),a3 -#else - btr d1,a3 -#endif - -#ifdef NO_BIT_INSTRUCTIONS - test a3,a3 - jne bsf_and_copy_nodes -#else - bsf a3,d1 - jne copy_nodes -#endif - jmp find_non_zero_long - -bit_in_next_word: - movl vector_counter,d0 - movl vector_p,a0 - dec d0 - movl (a0),a3 - addl $4,a0 - -#ifdef NO_BIT_INSTRUCTIONS - andl bit_clear_table(,d1,4),a3 -#else - btr d1,a3 -#endif - testl a3,a3 - je skip_zeros - jmp end_skip_zeros - -move_record_2: - cmpw $1,-2+2(d0) - ja move_hnf_2 - jb move_real_or_file - -move_record_2_ab: - movl (a0),a1 - addl $4,a0 - cmpl a0,a1 - jb move_record_2_1 -#ifdef SHARE_CHAR_INT - cmpl end_heap_p3,a1 - jae move_record_2_1 -#endif - lea 1(a4),d0 - movl (a1),d1 - movl d0,(a1) - movl d1,a1 -move_record_2_1: - movl a1,(a4) - movl (a0),d1 - addl $4,a0 - movl d1,4(a4) - addl $8,a4 - -#ifdef NO_BIT_INSTRUCTIONS - test a3,a3 - jne bsf_and_copy_nodes -#else - bsf a3,d1 - jne copy_nodes -#endif - jmp find_non_zero_long - -move_record_1: - movzwl -2+2(d0),d1 - test d1,d1 - jne move_hnf_1 - jmp move_int_bool_or_char - / d0,a0,a2: free find_non_zero_long: movl vector_counter,d0 @@ -1805,6 +646,190 @@ move_hnf_1_: #endif jmp find_non_zero_long +move_record: + subl $258,d1 + jb move_record_1 + je move_record_2 + +move_record_3: + movzwl -2+2(d0),d1 + subl $1,d1 + ja move_hnf_3 + + movl (a0),a1 + lea 4(a0),a0 + jb move_record_3_1b + +move_record_3_1a: + cmpl a0,a1 + jb move_record_3_1b +#ifdef SHARE_CHAR_INT + cmpl end_heap_p3,a1 + jae move_record_3_1b +#endif + lea 1(a4),d0 + movl (a1),d1 + movl d0,(a1) + movl d1,a1 +move_record_3_1b: + movl a1,(a4) + addl $4,a4 + + movl (a0),a1 + addl $4,a0 + cmpl a0,a1 + jb move_record_3_2 +#ifdef SHARE_CHAR_INT + cmpl end_heap_p3,a1 + jae move_record_3_2 +#endif + movl neg_heap_p3,d0 +#ifdef NO_BIT_INSTRUCTIONS + pushl a2 +#endif + addl a1,d0 + +#ifdef NO_BIT_INSTRUCTIONS + movl heap_vector,d1 + addl $4,d0 + movl d0,a2 + andl $31*4,a2 + shrl $7,d0 + movl bit_set_table(a2),a2 + testl (d1,d0,4),a2 + je not_linked_record_argument_part_3_b +#else + shr $2,d0 + inc d0 + + movl heap_vector,d1 + bts d0,(d1) + jnc not_linked_record_argument_part_3_b +#endif + + movl neg_heap_p3,d0 + addl a4,d0 + +#ifdef NO_BIT_INSTRUCTIONS + movl d0,a2 + andl $31*4,a2 + shrl $7,d0 + movl bit_set_table(a2),a2 + orl a2,(d1,d0,4) + popl a2 +#else + shr $2,d0 + bts d0,(d1) +#endif + jmp linked_record_argument_part_3_b + +not_linked_record_argument_part_3_b: +#ifdef NO_BIT_INSTRUCTIONS + orl a2,(d1,d0,4) +#endif + movl neg_heap_p3,d0 + addl a4,d0 + +#ifdef NO_BIT_INSTRUCTIONS + movl d0,a2 + andl $31*4,a2 + shrl $7,d0 + movl bit_clear_table(a2),a2 + andl a2,(d1,d0,4) + popl a2 +#else + shr $2,d0 + btr d0,(d1) +#endif + +linked_record_argument_part_3_b: + movl (a1),d1 + lea 2+1(a4),d0 + movl d0,(a1) + movl d1,a1 +move_record_3_2: + movl a1,(a4) + addl $4,a4 + + movl neg_heap_p3,d1 + addl a0,d1 + shr $2,d1 + dec d1 + andl $31,d1 + cmp $2,d1 + jb bit_in_next_word + +#ifdef NO_BIT_INSTRUCTIONS + andl bit_clear_table(,d1,4),a3 +#else + btr d1,a3 +#endif + +#ifdef NO_BIT_INSTRUCTIONS + test a3,a3 + jne bsf_and_copy_nodes +#else + bsf a3,d1 + jne copy_nodes +#endif + jmp find_non_zero_long + +bit_in_next_word: + movl vector_counter,d0 + movl vector_p,a0 + dec d0 + movl (a0),a3 + addl $4,a0 + +#ifdef NO_BIT_INSTRUCTIONS + andl bit_clear_table(,d1,4),a3 +#else + btr d1,a3 +#endif + testl a3,a3 + je skip_zeros + jmp end_skip_zeros + +move_record_2: + cmpw $1,-2+2(d0) + ja move_hnf_2 + jb move_real_or_file + +move_record_2_ab: + movl (a0),a1 + addl $4,a0 + cmpl a0,a1 + jb move_record_2_1 +#ifdef SHARE_CHAR_INT + cmpl end_heap_p3,a1 + jae move_record_2_1 +#endif + lea 1(a4),d0 + movl (a1),d1 + movl d0,(a1) + movl d1,a1 +move_record_2_1: + movl a1,(a4) + movl (a0),d1 + addl $4,a0 + movl d1,4(a4) + addl $8,a4 + +#ifdef NO_BIT_INSTRUCTIONS + test a3,a3 + jne bsf_and_copy_nodes +#else + bsf a3,d1 + jne copy_nodes +#endif + jmp find_non_zero_long + +move_record_1: + movzwl -2+2(d0),d1 + test d1,d1 + jne move_hnf_1 + jmp move_int_bool_or_char + move_real_or_file: movl (a0),d0 addl $4,a0 diff --git a/icompact_mark.s b/icompact_mark.s new file mode 100644 index 0000000..db209a9 --- /dev/null +++ b/icompact_mark.s @@ -0,0 +1,974 @@ + +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 diff --git a/icompact_rmark.s b/icompact_rmark.s new file mode 100644 index 0000000..443bc5c --- /dev/null +++ b/icompact_rmark.s @@ -0,0 +1,938 @@ + +rmark_stack_nodes1: + movl (a0),d1 + leal 1(a3),d0 + movl d1,(a3) + movl d0,(a0) + +rmark_next_stack_node: + addl $4,a3 + cmpl end_vector,a3 + je end_rmark_nodes + +rmark_stack_nodes: + movl (a3),a0 + + movl neg_heap_p3,d0 + addl a0,d0 +#ifdef SHARE_CHAR_INT + cmpl heap_size_32_33,d0 + jnc rmark_next_stack_node +#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 rmark_stack_nodes1 + + orl d0,a2 + movl a2,(a4,d1,4) +#else + shrl $2,d0 + bts d0,(a4) + jc rmark_stack_nodes1 +#endif + + movl (a0),d0 + call rmark_stack_node + + addl $4,a3 + cmpl end_vector,a3 + jne rmark_stack_nodes + ret + +rmark_stack_node: + subl $8,sp + movl d0,(a3) + lea 1(a3),a2 + movl a3,4(sp) + movl $-1,d1 + movl $0,(sp) + movl a2,(a0) + jmp rmark_no_reverse + +rmark_node_d1: + movl neg_heap_p3,d0 + addl a0,d0 +#ifdef SHARE_CHAR_INT + cmpl heap_size_32_33,d0 + jnc rmark_next_node +#endif + jmp rmark_node_ + +rmark_hnf_2: + leal 4(a0),d1 + movl 4(a0),d0 + subl $8,sp + + movl a0,a3 + movl (a0),a0 + + movl d1,4(sp) + movl d0,(sp) + + cmpl end_stack,sp + jb rmark_using_reversal + +rmark_node: + movl neg_heap_p3,d0 + addl a0,d0 +#ifdef SHARE_CHAR_INT + cmpl heap_size_32_33,d0 + jnc rmark_next_node +#endif + movl a3,d1 + +rmark_node_: +#ifdef NO_BIT_INSTRUCTIONS + movl d0,a1 + andl $31*4,d0 + shrl $7,a1 + movl bit_set_table(d0),d0 + movl (a4,a1,4),a2 + test d0,a2 + jne rmark_reverse_and_mark_next_node + + orl d0,a2 + movl a2,(a4,a1,4) +#else + shrl $2,d0 + bts d0,(a4) + jc rmark_reverse_and_mark_next_node +#endif + + movl (a0),d0 +rmark_arguments: + cmpl d1,a0 + ja rmark_no_reverse + + lea 1(a3),a2 + movl d0,(a3) + movl a2,(a0) + +rmark_no_reverse: + testb $2,d0b + je rmark_lazy_node + + movzwl -2(d0),a2 + test a2,a2 + je rmark_hnf_0 + + addl $4,a0 + + cmp $256,a2 + jae rmark_record + + subl $2,a2 + je rmark_hnf_2 + jc rmark_hnf_1 + +rmark_hnf_3: + movl 4(a0),a1 +rmark_hnf_3_: + cmpl end_stack,sp + jb rmark_using_reversal_ + + 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 rmark_shared_argument_part + + orl d0,(a4,d1,4) +#else + shrl $2,d0 + bts d0,(a4) + jc rmark_shared_argument_part +#endif + +rmark_no_shared_argument_part: + subl $8,sp + movl a0,4(sp) + lea 4(a0),a3 + movl (a0),a0 + lea (a1,a2,4),a1 + movl a0,(sp) + +rmark_push_hnf_args: + movl (a1),d1 + subl $8,sp + movl a1,4(sp) + subl $4,a1 + movl d1,(sp) + + subl $1,a2 + jg rmark_push_hnf_args + + movl (a1),a0 + + cmpl a3,a1 + ja rmark_no_reverse_argument_pointer + + lea 3(a3),a2 + movl a0,(a3) + movl a2,(a1) + + movl neg_heap_p3,d0 + addl a0,d0 +#ifdef SHARE_CHAR_INT + cmpl heap_size_32_33,d0 + jnc rmark_next_node +#endif + movl a1,d1 + jmp rmark_node_ + +rmark_no_reverse_argument_pointer: + movl a1,a3 + jmp rmark_node + +rmark_shared_argument_part: + cmpl a0,a1 + ja rmark_hnf_1 + + movl (a1),d1 + leal 4+2+1(a0),d0 + movl d0,(a1) + movl d1,4(a0) + jmp rmark_hnf_1 + +rmark_record: + subl $258,a2 + je rmark_record_2 + jb rmark_record_1 + +rmark_record_3: + movzwl -2+2(d0),a2 + movl 4(a0),a1 + subl $1,a2 + jb rmark_record_3_bb + je rmark_record_3_ab + subl $1,a2 + je rmark_record_3_aab + jmp rmark_hnf_3_ + +rmark_record_3_bb: + 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 rmark_next_node + +#ifdef NO_BIT_INSTRUCTIONS + add d0,d0 + jne rmark_bit_in_same_word1 + inc a2 + mov $1,d0 +rmark_bit_in_same_word1: + testl (a4,a2,4),d0 + je rmark_not_yet_linked_bb +#else + inc d0 + bts d0,(a4) + jnc rmark_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) +rmark_not_yet_linked_bb: +#endif + movl (a1),a2 + lea 8+2+1(a0),d0 + movl a2,8(a0) + movl d0,(a1) + jmp rmark_next_node + +#ifdef NO_BIT_INSTRUCTIONS +rmark_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 rmark_next_node +#endif + +rmark_record_3_ab: + 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 rmark_hnf_1 + +#ifdef NO_BIT_INSTRUCTIONS + add d0,d0 + jne rmark_bit_in_same_word2 + inc a2 + mov $1,d0 +rmark_bit_in_same_word2: + testl (a4,a2,4),d0 + je rmark_not_yet_linked_ab +#else + inc d0 + bts d0,(a4) + jnc rmark_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) +rmark_not_yet_linked_ab: +#endif + + movl (a1),a2 + lea 4+2+1(a0),d0 + movl a2,4(a0) + movl d0,(a1) + jmp rmark_hnf_1 + +#ifdef NO_BIT_INSTRUCTIONS +rmark_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 rmark_hnf_1 +#endif + +rmark_record_3_aab: + cmpl end_stack,sp + jb rmark_using_reversal_ + + 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 rmark_shared_argument_part + + orl d0,(a4,a2,4) +#else + shr $2,d0 + bts d0,(a4) + jc rmark_shared_argument_part +#endif + + subl $8,sp + movl a0,4(sp) + lea 4(a0),a3 + movl (a0),a0 + movl a0,(sp) + + movl (a1),a0 + + cmpl a3,a1 + ja rmark_no_reverse_argument_pointer + + lea 3(a3),a2 + movl a0,(a3) + movl a2,(a1) + + movl neg_heap_p3,d0 + addl a0,d0 +#ifdef SHARE_CHAR_INT + cmpl heap_size_32_33,d0 + jnc rmark_next_node +#endif + movl a1,d1 + jmp rmark_node_ + +rmark_record_2: + cmpw $1,-2+2(d0) + ja rmark_hnf_2 + je rmark_hnf_1 + jmp rmark_next_node + +rmark_record_1: + cmpw $0,-2+2(d0) + jne rmark_hnf_1 + jmp rmark_next_node + +rmark_lazy_node_1: +/ selectors: + jne rmark_selector_node_1 + +rmark_hnf_1: + movl a0,a3 + movl (a0),a0 + jmp rmark_node + +/ selectors +rmark_indirection_node: + movl neg_heap_p3,a1 + subl $4,a0 + addl a0,a1 + +#ifdef NO_BIT_INSTRUCTIONS + movl a1,a2 + andl $31*4,a2 + shrl $7,a1 + movl bit_clear_table(a2),a2 + andl a2,(a4,a1,4) +#else + shrl $2,a1 + btr a1,(a4) +#endif + movl a0,a1 + cmpl d1,a0 + movl 4(a0),a0 + movl a0,(a3) + ja rmark_node_d1 + movl d0,(a1) + jmp rmark_node_d1 + +rmark_selector_node_1: + addl $3,a2 + je rmark_indirection_node + + movl (a0),a1 + movl d1,pointer_compare_address + + movl neg_heap_p3,d1 + addl a1,d1 + shrl $2,d1 + + addl $1,a2 + jle rmark_record_selector_node_1 + +#ifdef NO_BIT_INSTRUCTIONS + movl d1,a2 + shrl $5,d1 + andl $31,a2 + movl bit_set_table(,a2,4),a2 + movl (a4,d1,4),d1 + andl a2,d1 + jne rmark_hnf_1 +#else + bt d1,(a4) + jc rmark_hnf_1 +#endif + movl (a1),d1 + testb $2,d1b + je rmark_hnf_1 + + cmpw $2,-2(d1) + jbe rmark_small_tuple_or_record + +rmark_large_tuple_or_record: + movl 8(a1),d1 + addl neg_heap_p3,d1 + shrl $2,d1 + +#ifdef NO_BIT_INSTRUCTIONS + movl d1,a2 + shrl $5,d1 + andl $31,a2 + movl bit_set_table(,a2,4),a2 + movl (a4,d1,4),d1 + andl a2,d1 + jne rmark_hnf_1 +#else + bt d1,(a4) + jc rmark_hnf_1 +#endif +rmark_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 + pushl a3 + call *4(d0) + pop a3 + pop a1 + + movl a0,(a3) + + movl pointer_compare_address,d1 + + movl $__indirection,-4(a1) + movl a0,(a1) + jmp rmark_node_d1 + +rmark_record_selector_node_1: + je rmark_strict_record_selector_node_1 + +#ifdef NO_BIT_INSTRUCTIONS + movl d1,a2 + shrl $5,d1 + andl $31,a2 + movl bit_set_table(,a2,4),a2 + movl (a4,d1,4),d1 + andl a2,d1 + jne rmark_hnf_1 +#else + bt d1,(a4) + jc rmark_hnf_1 +#endif + movl (a1),d1 + testb $2,d1b + je rmark_hnf_1 + + cmpw $258,-2(d1) + jbe rmark_small_tuple_or_record + jmp rmark_large_tuple_or_record + +rmark_strict_record_selector_node_1: +#ifdef NO_BIT_INSTRUCTIONS + movl d1,a2 + shrl $5,d1 + andl $31,a2 + movl bit_set_table(,a2,4),a2 + movl (a4,d1,4),d1 + andl a2,d1 + jne rmark_hnf_1 +#else + bt d1,(a4) + jc rmark_hnf_1 +#endif + movl (a1),d1 + testb $2,d1b + je rmark_hnf_1 + + cmpw $258,-2(d1) + jbe rmark_select_from_small_record + + movl 8(a1),d1 + addl neg_heap_p3,d1 +#ifdef NO_BIT_INSTRUCTIONS + movl d1,a2 + shrl $7,d1 + andl $31*4,a2 + movl bit_set_table(a2),a2 + movl (a4,d1,4),d1 + andl a2,d1 + jne rmark_hnf_1 +#else + shrl $2,d1 + bt d1,(a4) + jc rmark_hnf_1 +#endif + +rmark_select_from_small_record: + movl -8(d0),d1 + subl $4,a0 + + cmpl pointer_compare_address,a0 + ja rmark_selector_pointer_not_reversed + + movl d0,(a0) + movl a0,(a3) + + pushl a3 + call *4(d1) + popl a3 + + movl (a0),d0 + addl $1,a3 + movl a3,(a0) + movl d0,-1(a3) + jmp rmark_next_node + +rmark_selector_pointer_not_reversed: + call *4(d1) + jmp rmark_next_node + +rmark_reverse_and_mark_next_node: + cmpl d1,a0 + ja rmark_next_node + + movl (a0),d0 + movl d0,(a3) + addl $1,a3 + movl a3,(a0) + +/ a2,d1: free + +rmark_next_node: + movl (sp),a0 + movl 4(sp),a3 + addl $8,sp + + cmpl $1,a0 + ja rmark_node + +rmark_next_node_: +end_rmark_nodes: + ret + +rmark_lazy_node: + movl -4(d0),a2 + test a2,a2 + je rmark_next_node + + addl $4,a0 + + subl $1,a2 + jle rmark_lazy_node_1 + + cmpl $255,a2 + jge rmark_closure_with_unboxed_arguments + +rmark_closure_with_unboxed_arguments_: + lea (a0,a2,4),a0 + +rmark_push_lazy_args: + movl (a0),d1 + subl $8,sp + movl a0,4(sp) + subl $4,a0 + movl d1,(sp) + subl $1,a2 + jg rmark_push_lazy_args + + movl a0,a3 + movl (a0),a0 + cmpl end_stack,sp + jae rmark_node + + jmp rmark_using_reversal + +rmark_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 rmark_closure_with_unboxed_arguments_ + je rmark_hnf_1 + jmp rmark_next_node + +rmark_hnf_0: +#ifdef SHARE_CHAR_INT + cmpl $INT+2,d0 + je rmark_int_3 + + cmpl $CHAR+2,d0 + je rmark_char_3 + + jb rmark_no_normal_hnf_0 + + movl neg_heap_p3,a2 + addl a0,a2 +#ifdef NO_BIT_INSTRUCTIONS + movl a2,a1 + andl $31*4,a1 + shrl $7,a2 + movl bit_clear_table(a1),a1 + andl a1,(a4,a2,4) +#else + shrl $2,a2 + btr a2,(a4) +#endif + lea ZERO_ARITY_DESCRIPTOR_OFFSET-2(d0),a1 + movl a1,(a3) + cmpl d1,a0 + ja rmark_next_node + movl d0,(a0) + jmp rmark_next_node + +rmark_int_3: + movl 4(a0),a2 + cmpl $33,a2 + jnc rmark_next_node + + lea small_integers(,a2,8),a1 + movl neg_heap_p3,a2 + movl a1,(a3) + addl a0,a2 + +#ifdef NO_BIT_INSTRUCTIONS + movl a2,a1 + andl $31*4,a1 + shrl $7,a2 + movl bit_clear_table(a1),a1 + andl a1,(a4,a2,4) +#else + shrl $2,a2 + btr a2,(a4) +#endif + cmpl d1,a0 + ja rmark_next_node + movl d0,(a0) + jmp rmark_next_node + +rmark_char_3: + movzbl 4(a0),a1 + movl neg_heap_p3,a2 + + lea static_characters(,a1,8),a1 + addl a0,a2 + + movl a1,(a3) + +#ifdef NO_BIT_INSTRUCTIONS + movl a2,a1 + andl $31*4,a1 + shrl $7,a2 + movl bit_clear_table(a1),a1 + andl a1,(a4,a2,4) +#else + shrl $2,a2 + btr a2,(a4) +#endif + cmpl d1,a0 + ja rmark_next_node + movl d0,(a0) + jmp rmark_next_node + +rmark_no_normal_hnf_0: +#endif + + cmpl $__ARRAY__+2,d0 + jne rmark_next_node + + movl 8(a0),d0 + test d0,d0 + je rmark_lazy_array + + movzwl -2+2(d0),a1 + test a1,a1 + je rmark_b_array + + movzwl -2(d0),d0 + test d0,d0 + je rmark_b_array + + cmpl end_stack,sp + jb rmark_array_using_reversal + + subl $256,d0 + cmpl d0,a1 + movl a1,d1 + je rmark_a_record_array + +rmark_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 rmark_lr_array + +rmark_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 rmark_next_node + +rmark_a_record_array: + movl 4(a0),d0 + addl $8,a0 + cmpl $2,d1 + jb rmark_lr_array + + imull d1,d0 + jmp rmark_lr_array + +rmark_lazy_array: + cmpl end_stack,sp + jb rmark_array_using_reversal + + movl 4(a0),d0 + addl $8,a0 + +rmark_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 rmark_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 + movl -4(a1),d1 + subl $4,a1 + movl d1,(a0) + movl d0,(a1) + pushl a0 + movl a1,a3 + jmp rmark_array_nodes + +rmark_array_nodes1: + cmpl a3,a0 + ja rmark_next_array_node + + movl (a0),d1 + leal 1(a3),d0 + movl d1,(a3) + movl d0,(a0) + +rmark_next_array_node: + addl $4,a3 + cmpl (sp),a3 + je end_rmark_array_node + +rmark_array_nodes: + movl (a3),a0 + + movl neg_heap_p3,d0 + addl a0,d0 +#ifdef SHARE_CHAR_INT + cmpl heap_size_32_33,d0 + jnc rmark_next_array_node +#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 rmark_array_nodes1 + + orl d0,a2 + movl a2,(a4,d1,4) +#else + shrl $2,d0 + bts d0,(a4) + jc rmark_array_nodes1 +#endif + + movl (a0),d0 + call rmark_array_node + + addl $4,a3 + cmpl (sp),a3 + jne rmark_array_nodes + +end_rmark_array_node: + addl $4,sp + jmp rmark_next_node + +rmark_array_node: + subl $8,sp + movl a3,4(sp) + movl a3,d1 + movl $1,(sp) + jmp rmark_arguments + +rmark_array_length_0_1: + lea -8(a0),a0 + jb rmark_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 rmark_hnf_1 + + .data +pointer_compare_address: .long 0 + .text diff --git a/icompact_rmarkr.s b/icompact_rmarkr.s new file mode 100644 index 0000000..972fcac --- /dev/null +++ b/icompact_rmarkr.s @@ -0,0 +1,982 @@ + +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 +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 + +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) + jbe rmarkr_small_tuple_or_record + jmp rmarkr_large_tuple_or_record + +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: +/ changed 24-1-97 + movl -8(d0),d0 + subl $4,a0 + + call *4(d0) + + 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_ |