summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--icompact.s1425
-rw-r--r--icompact_mark.s974
-rw-r--r--icompact_rmark.s938
-rw-r--r--icompact_rmarkr.s982
4 files changed, 3119 insertions, 1200 deletions
diff --git a/icompact.s b/icompact.s
index 7182013..5a16b4f 100644
--- a/icompact.s
+++ b/icompact.s
@@ -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_