summaryrefslogtreecommitdiff
path: root/smark.s
diff options
context:
space:
mode:
authorJohn van Groningen2004-04-01 15:14:43 +0000
committerJohn van Groningen2004-04-01 15:14:43 +0000
commit851743b9490f161465fa2ea687459533c74da8f6 (patch)
tree57733997316a9deb12635e7f6d51371102895e3f /smark.s
parentset window title of the console window to 'press any key to exit' (diff)
enable marking collector
Diffstat (limited to 'smark.s')
-rw-r--r--smark.s1810
1 files changed, 1042 insertions, 768 deletions
diff --git a/smark.s b/smark.s
index da66f71..2859e8f 100644
--- a/smark.s
+++ b/smark.s
@@ -1,6 +1,4 @@
-! record selectors not yet implemented
-
ldg (heap_size_33,d0)
_fill_ones: btst 3,d0
@@ -14,10 +12,10 @@ _end_fill_ones:
clr d4
ldg (heap_size_33,d7)
-
+ stg (d4,lazy_array_list)
sethi %hi 0x80000000,%g3
- sub sp,2000,d3
+ sub sp,4000,a3
sll d7,5,d7
ldg (caf_list,d0)
@@ -28,10 +26,13 @@ _end_fill_ones:
be _end_mark_cafs
dec 4,sp
+ dec 4,sp
+
_mark_cafs_lp:
- ld [d0-4],%g5
+ ld [d0-4],%g1
add d0,4,a2
ld [d0],d0
+ st %g1,[sp]
sll d0,2,d0
add a2,d0,a4
@@ -39,10 +40,13 @@ _mark_cafs_lp:
call _mark_stack_nodes
st %o7,[sp]
- addcc %g5,0,d0
+ ld [sp],d0
+ addcc d0,0,d0
bne _mark_cafs_lp
nop
+ inc 4,sp
+
_end_mark_cafs:
ldg (stack_p,a2)
@@ -50,6 +54,85 @@ _end_mark_cafs:
call _mark_stack_nodes
st %o7,[sp]
+ ldg (lazy_array_list,a0)
+
+ tst a0
+ beq end_restore_arrays
+ nop
+
+restore_arrays:
+ ld [a0],d3 ! size
+ ld [a0+4],d1 ! second last element
+
+ set __ARRAY__+2,%o0
+ ld [a0+8],d2 ! last element
+
+ cmp d3,1
+ beq restore_array_size_1
+ st %o0,[a0]
+
+ sll d3,2,a1
+ add a0,a1,a1
+
+ ld [a1+8],d0 ! descriptor
+
+ tst d0
+ beq restore_lazy_array
+ nop
+
+ lduh [d0-2+2],%o0
+ udiv d3,%o0,d3
+
+restore_lazy_array:
+ st d3,[a0+4]
+ ld [a1+4],a3 ! next
+ st d0,[a0+8]
+
+ st d1,[a1+4]
+
+ tst d0
+ beq no_reorder_array
+ st d2,[a1+8]
+
+ lduh [d0-2],%o1
+ dec 256,%o1
+ cmp %o1,%o0
+ beq no_reorder_array
+ nop
+
+ mov %o1,d0
+ mov %o0,d1
+ sll d3,2,d3
+ umul d3,d0,d3
+ inc 12,a0
+ add a0,d3,a1
+ sub d0,d1,d0
+
+ call reorder
+ mov d4,%g1
+
+ mov %g1,d4
+
+no_reorder_array:
+ addcc a3,0,a0
+ bne restore_arrays
+ nop
+
+ b,a end_restore_arrays
+
+restore_array_size_1:
+ st d3,[a0+4]
+ ld [a0+12],a3 ! descriptor
+
+ st d1,[a0+12]
+ st a3,[a0+8]
+
+ addcc d2,0,a0
+ bne restore_arrays
+ nop
+
+end_restore_arrays:
+
#ifdef FINALIZERS
set finalizer_list,a0
set free_finalizer_list,a1
@@ -166,7 +249,7 @@ _zero_bits:
mov a0,a1
_skip_zero_bits_lp:
- ld [a0],d1 !
+ ld [a0],d1
inc 4,a0
tst d1
bne _end_zero_bits
@@ -178,7 +261,7 @@ _skip_zero_bits_lp:
sub a0,a1,d1
_end_zero_bits:
- clr [a0-4] !
+ clr [a0-4]
sub a0,a1,d1
sll d1,3,d1
@@ -244,109 +327,46 @@ _end_scan:
b,a compact_gc
+_mark_stack_nodes:
+ cmp a2,a4
+ be _end_mark_nodes
+ inc 4,a2
-_mark_record:
- deccc 258,d2
- be,a _mark_record_2
- lduh [d0-2+2],%g1
-
- blu,a _mark_record_1
- lduh [d0-2+2],%g1
-
-_mark_record_3:
- cmp %o3,4
- bgeu fits_in_word_13
- bset %o3,%o1
-
- st %o1,[%o4+%o0]
- inc 4,%o0
-
- ld [%o4+%o0],%o1
- bset %g3,%o1
-fits_in_word_13:
- st %o1,[%o4+%o0]
-
- lduh [d0-2+2],d1
- deccc 1,d1
- blu _mark_record_3_bb
- inc 3,d4
-
- ld [a0+4],a1
-
- sub a1,d6,d0
- srl d0,2,d0
-
- srl d0,3,%o0
- andn %o0,3,%o0
- ld [%o4+%o0],%o1
- srl %g3,d0,%o3
-
- btst %o3,%o1
- bne,a _mark_node
- ld [a0],a0
-
- inc 1,d2
- add d4,d2,d4
-
- and d0,31,%o2
- add %o2,d2,%o2
-
- cmp %o2,32
- bset %o3,%o1
- bleu _push_record_arguments
- st %o1,[%o4+%o0]
-
- inc 4,%o0
-
- ld [%o4+%o0],%o1
- bset %g3,%o1
- st %o1,[%o4+%o0]
-
-_push_record_arguments:
- subcc d1,1,d2
-
- sll d1,2,d1
- bgeu _push_hnf_args
- add a1,d1,a1
-
- ba _mark_node
- ld [a0],a0
-
-_mark_record_3_bb:
- ld [a0+4],a1
-
- sub a1,d6,d0
- srl d0,2,d0
+ ld [a2-4],a0
- srl d0,3,%o0
+ sub a0,d6,d1
+#ifdef SHARE_CHAR_INT
+ cmp d1,d7
+ bcc _mark_stack_nodes
+#endif
+ srl d1,5,%o0
+ srl d1,2,d1
andn %o0,3,%o0
ld [%o4+%o0],%o1
- srl %g3,d0,%o3
+ srl %g3,d1,%o3
btst %o3,%o1
- bne _mark_next_node
- inc 1,d2
-
- add d4,d2,d4
-
- and d0,31,%o2
- add %o2,d2,%o2
-
- cmp %o2,32
- bset %o3,%o1
- bleu _mark_next_node
- st %o1,[%o4+%o0]
+ bne _mark_stack_nodes
+ nop
- inc 4,%o0
+#if 0
+ add a2,-4,%o0
+ mov 0,d3
+ mov 1,d5
+ st %o0,[sp-4]
+ call __mark__node
+ dec 4,sp
- ld [%o4+%o0],%o1
- bset %g3,%o1
- ba _mark_next_node
- st %o1,[%o4+%o0]
+_mark_next_node:
+ b,a _mark_stack_nodes
+#else
+ clr [sp-4]
+ ba _mark_arguments
+ dec 4,sp
-_mark_record_2:
+_mark_hnf_2:
cmp %o3,4
- bgeu fits_in_word_12
+ bgeu fits_in_word_6
bset %o3,%o1
st %o1,[%o4+%o0]
@@ -354,39 +374,25 @@ _mark_record_2:
ld [%o4+%o0],%o1
bset %g3,%o1
-fits_in_word_12:
+fits_in_word_6:
st %o1,[%o4+%o0]
inc 3,d4
- cmp %g1,1
- bgu _mark_record_2_c
- nop
-
- be,a _mark_node
+_mark_record_2_c:
+ ld [a0+4],%o0
+ dec 4,sp
+ cmp sp,a3
+ blu __mark_using_reversal
+ st %o0,[sp]
+
ld [a0],a0
- ba _mark_next_node
- dec 4,a0
-
-_mark_record_1:
- tst %g1
- bne _mark_hnf_1
- nop
- b,a _mark_bool_or_small_string
-
-
-_mark_stack_nodes:
- cmp a2,a4
- be _end_mark_nodes
- inc 4,a2
-
- ld [a2-4],a0
-
+_mark_node:
sub a0,d6,d1
-#ifdef SHARE_CHAR_INT
+# ifdef SHARE_CHAR_INT
cmp d1,d7
- bcc _mark_stack_nodes
-#endif
+ bcc _mark_next_node
+# endif
srl d1,2,d1
srl d1,3,%o0
@@ -395,19 +401,15 @@ _mark_stack_nodes:
srl %g3,d1,%o3
btst %o3,%o1
- bne _mark_stack_nodes
+ bne _mark_next_node
nop
- clr [sp-4]
- dec 4,sp
-
_mark_arguments:
ld [a0],d0
btst 2,d0
be _mark_lazy_node
- nop
-
ldsh [d0-2],d2
+
tst d2
be _mark_hnf_0
cmp d2,256
@@ -436,9 +438,8 @@ fits_in_word_1:
ld [a0+4],a1
sub a1,d6,d0
+ srl d0,5,%o0
srl d0,2,d0
-
- srl d0,3,%o0
andn %o0,3,%o0
ld [%o4+%o0],%o1
srl %g3,d0,%o3
@@ -449,13 +450,14 @@ fits_in_word_1:
_no_shared_argument_part:
sll d2,2,%o2
- add a1,%o2,a1
-
inc 1,d2
- add d4,d2,d4
+ add a1,%o2,a1
and d0,31,%o2
+
add %o2,d2,%o2
+ add d4,d2,d4
+
cmp %o2,32
bleu fits_in_word_2
bset %o3,%o1
@@ -481,15 +483,15 @@ _push_hnf_args:
bcc _push_hnf_args
dec 4,sp
- cmp sp,d3
+ cmp sp,a3
bgeu,a _mark_node
ld [a0],a0
b,a __mark_using_reversal
-_mark_lazy_node_1:
- cmp %o3,4
- bgeu fits_in_word_3
+_mark_hnf_1:
+ cmp %o3,2
+ bgeu fits_in_word_4
bset %o3,%o1
st %o1,[%o4+%o0]
@@ -497,19 +499,17 @@ _mark_lazy_node_1:
ld [%o4+%o0],%o1
bset %g3,%o1
-fits_in_word_3:
+fits_in_word_4:
st %o1,[%o4+%o0]
+ inc 2,d4
- tst d2
- bne _mark_selector_node_1
- inc 3,d4
-
+_shared_argument_part:
ba _mark_node
ld [a0],a0
-_mark_hnf_1:
- cmp %o3,2
- bgeu fits_in_word_4
+_mark_lazy_node_1:
+ cmp %o3,4
+ bgeu fits_in_word_3
bset %o3,%o1
st %o1,[%o4+%o0]
@@ -517,28 +517,28 @@ _mark_hnf_1:
ld [%o4+%o0],%o1
bset %g3,%o1
-fits_in_word_4:
+fits_in_word_3:
st %o1,[%o4+%o0]
- inc 2,d4
-_shared_argument_part:
- ba _mark_node
- ld [a0],a0
+ cmp d2,1
+ bne _mark_selector_node_1
+ inc 3,d4
-! selectors
-_mark_indirection_node:
ba _mark_node
- mov a1,a0
+ ld [a0],a0
_mark_selector_node_1:
- cmp d2,-2
- bne _mark_indirection_node
+ inccc 2,d2
+ beq _mark_indirection_node
ld [a0],a1
sub a1,d6,d1
+ srl d1,5,%o0
+
+ inccc 1,d2
+ ble _mark_record_selector_node_1
srl d1,2,d1
- srl d1,3,%o0
andn %o0,3,%o0
ld [%o4+%o0],%o1
srl %g3,d1,%o3
@@ -554,14 +554,15 @@ _mark_selector_node_1:
ldsh [d2-2],%g1
cmp %g1,2
- bleu _small_tuple
+ bleu _small_tuple_or_record
nop
+_large_tuple_or_record:
ld [a1+8],d1
sub d1,d6,d1
+ srl d1,5,%o0
srl d1,2,d1
- srl d1,3,%o0
andn %o0,3,%o0
ld [%o4+%o0],%g1
srl %g3,d1,%o3
@@ -570,7 +571,7 @@ _mark_selector_node_1:
bne,a _mark_node
mov a1,a0
-_small_tuple:
+_small_tuple_or_record:
sub a0,4,d2
ld [d0-8],%g1
@@ -586,45 +587,74 @@ _small_tuple:
ba _mark_node
st a0,[d2+4]
-_mark_hnf_2:
- cmp %o3,4
- bgeu fits_in_word_6
- bset %o3,%o1
-
- st %o1,[%o4+%o0]
- inc 4,%o0
+_mark_record_selector_node_1:
+ beq _mark_strict_record_selector_node_1
+ andn %o0,3,%o0
ld [%o4+%o0],%o1
- bset %g3,%o1
-fits_in_word_6:
- st %o1,[%o4+%o0]
- inc 3,d4
+ srl %g3,d1,%o3
-_mark_record_2_c:
- ld [a0+4],%o0
- dec 4,sp
- cmp sp,d3
- blu __mark_using_reversal
- st %o0,[sp]
-
- ld [a0],a0
+ btst %o3,%o1
+ bne,a _mark_node
+ mov a1,a0
-_mark_node:
- sub a0,d6,d1
-#ifdef SHARE_CHAR_INT
- cmp d1,d7
- bcc _mark_next_node
-#endif
- srl d1,2,d1
+ ld [a1],d2
+ btst 2,d2
+ be,a _mark_node
+ mov a1,a0
- srl d1,3,%o0
- andn %o0,3,%o0
+ ldsh [d2-2],%g1
+ cmp %g1,258
+ bleu _small_tuple_or_record
+ nop
+
+ b,a _large_tuple_or_record
+
+_mark_strict_record_selector_node_1:
ld [%o4+%o0],%o1
srl %g3,d1,%o3
btst %o3,%o1
- be _mark_arguments
+ bne,a _mark_node
+ mov a1,a0
+
+ ld [a1],d2
+ btst 2,d2
+ be,a _mark_node
+ mov a1,a0
+
+ ldsh [d2-2],%g1
+ cmp %g1,258
+ bleu _select_from_small_record
nop
+
+ ld [a1+8],d1
+ sub d1,d6,d1
+ srl d1,5,%o0
+ srl d1,2,d1
+
+ andn %o0,3,%o0
+ ld [%o4+%o0],%g1
+ srl %g3,d1,%o3
+
+ btst %o3,%g1
+ bne,a _mark_node
+ mov a1,a0
+
+_select_from_small_record:
+ ld [d0-8],%g1
+ dec 4,a0
+ ld [%g1+4],%g1
+
+ dec 4,sp
+ call %g1
+ st %o7,[sp]
+
+ b,a _mark_next_node
+
+_mark_indirection_node:
+ ba _mark_node
+ mov a1,a0
_mark_next_node:
ld [sp],a0
@@ -635,20 +665,23 @@ _mark_next_node:
b,a _mark_stack_nodes
_mark_lazy_node:
- ldsh [d0-2],d2
tst d2
be _mark_real_or_file
add d0,-2,a1
- deccc d2
+ cmp d2,1
ble,a _mark_lazy_node_1
inc 4,a0
+
+ cmp d2,256
+ bge _mark_closure_with_unboxed_arguments
+ nop
- inc 2,d2
- add d4,d2,d4
-
+ inc 1,d2
and d1,31,%o2
+ add d4,d2,d4
add %o2,d2,%o2
+
cmp %o2,32
bleu fits_in_word_7
bset %o3,%o1
@@ -673,20 +706,56 @@ _push_lazy_args:
bcc _push_lazy_args
dec 4,sp
- cmp sp,d3
+ cmp sp,a3
bgeu,a _mark_node
ld [a0-4],a0
ba __mark_using_reversal
dec 4,a0
+_mark_closure_with_unboxed_arguments:
+ srl d2,8,%g2
+ and d2,255,d2
+ deccc 1,d2
+ beq _mark_real_or_file
+ inc 2,d2
+
+ and d1,31,%o2
+ add d4,d2,d4
+ add %o2,d2,%o2
+
+ cmp %o2,32
+ bleu fits_in_word_7_
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_7_:
+ st %o1,[%o4+%o0]
+
+ sub d2,%g2,d2
+ sll d2,2,%g2
+ deccc 2,d2
+ blt _mark_next_node
+ nop
+
+ bne _push_lazy_args
+ add a0,%g2,a0
+
+_mark_closure_with_one_boxed_argument:
+ ba _mark_node
+ ld [a0-4],a0
+
_mark_hnf_0:
set INT+2,%g1
cmp d0,%g1
blu _mark_real_file_or_string
- nop
+ seth (CHAR+2,%g1)
- set CHAR+2,%g1
+ setl (CHAR+2,%g1)
cmp d0,%g1
bgu _mark_normal_hnf_0
nop
@@ -714,411 +783,411 @@ _mark_normal_hnf_0:
inc 1,d4
_mark_real_file_or_string:
- set __ARRAY__+2,%g1
+ set __STRING__+2,%g1
cmp d0,%g1
- bne _no_mark_array
+ bleu _mark_string_or_array
nop
- ld [a0+8],d0
- tst d0
- be _mark_lazy_array
- nop
+_mark_real_or_file:
+ cmp %o3,4
+ bgeu fits_in_word_9
+ bset %o3,%o1
- lduh [d0-2+2],d1
- tst d1
- be _mark_b_record_array
- nop
+ st %o1,[%o4+%o0]
+ inc 4,%o0
- lduh [d0-2],d0
- dec 256,d0
- cmp d0,d1
- be _mark_a_record_array
- nop
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_9:
+ st %o1,[%o4+%o0]
+ ba _mark_next_node
+ inc 3,d4
-_mark_ab_record_array:
- mov d2,%o2
- mov d3,%o3
- mov d4,%g2
- mov d5,%o5
- mov d6,%g3
+_mark_record:
+ deccc 258,d2
+ be,a _mark_record_2
+ lduh [d0-2+2],%g1
- ld [a0+4],d2
- inc 8,a0
- mov a0,%g4
+ blu,a _mark_record_1
+ lduh [d0-2+2],%g1
- sll d2,2,d2
- sub d0,2,d3
- mov d2,a1
-_mul_array_length_ab1:
- deccc 1,d3
- bcc _mul_array_length_ab1
- add a1,d2,a1
+_mark_record_3:
+ cmp %o3,4
+ lduh [d0-2+2],d1
+ bgeu fits_in_word_13
+ bset %o3,%o1
- sub d0,d1,d0
- inc 4,a0
- call reorder
- add a1,a0,a1
+ st %o1,[%o4+%o0]
+ inc 4,%o0
- mov %g4,a0
- ld [a0-4],d2
- deccc 2,d1
- bcs _skip_mul_array_length_a1_
- mov d2,d0
-_mul_array_length_a1_:
- deccc 1,d1
- bcc _mul_array_length_a1_
- add d0,d2,d0
-_skip_mul_array_length_a1_:
-
- mov %g3,d6
- mov %o5,d5
- mov %g2,d4
- mov %o3,d3
- ba _mark_lr_array
- mov %o2,d2
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_13:
+ st %o1,[%o4+%o0]
-_mark_b_record_array:
- sub a0,d6,d0
- srl d0,2,d0
- inc 1,d0
- setmbit (%o4,d0,d1,%o0,%o1,%o2)
- b,a _mark_next_node
+ ld [a0+4],a1
+ inc 3,d4
-_mark_a_record_array:
- ld [a0+4],d0
- deccc 2,d1
- blu _mark_lr_array
- inc 8,a0
+ sub a1,d6,d0
+ srl d0,5,%o0
+ srl d0,2,d0
+ andn %o0,3,%o0
- mov d0,d2
-_mul_array_length:
deccc 1,d1
- bcc _mul_array_length
- add d0,d2,d0
+ ld [%o4+%o0],%o1
+ blu _mark_record_3_bb
+ srl %g3,d0,%o3
- b,a _mark_lr_array
+ btst %o3,%o1
+ bne,a _mark_node
+ ld [a0],a0
-_mark_lazy_array:
- ld [a0+4],d0
- inc 8,a0
-_mark_lr_array:
- sub a0,d6,d1
- srl d1,2,d1
- add d1,d0,d1
- setmbit (%o4,d1,d2,%o0,%o1,%o2)
+ inc 1,d2
+ and d0,31,%o2
+ add d4,d2,d4
+ add %o2,d2,%o2
- cmp d0,1
- bleu _mark_array_length_0_1
- nop
+ bset %o3,%o1
+ cmp %o2,32
+ bleu _push_record_arguments
+ st %o1,[%o4+%o0]
- mov a0,a1
- sll d0,2,d0
- add a0,d0,a0
+ inc 4,%o0
- ld [a0],d2
- ld [a1],%o0
- st d2,[a1]
- st %o0,[a0]
-
- ld [a0-4],d2
- dec 4,a0
- inc 2,d2
- ld [a1-4],%o0
- dec 4,a1
- st %o0,[a0]
- st d2,[a1]
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+ st %o1,[%o4+%o0]
+
+_push_record_arguments:
+ subcc d1,1,d2
+
+ sll d1,2,d1
+ bgeu _push_hnf_args
+ add a1,d1,a1
- ld [a0-4],d2
- dec 4,a0
- or d3,d5,d3
- st d3,[a0]
- mov a0,d3
- mov 0,d5
ba _mark_node
- mov d2,a0
+ ld [a0],a0
-_mark_array_length_0_1:
- blu _mark_next_node
- nop
-
- ld [a0+4],d1
- ld [a0],%o0
- ld [a0-4],%o1
- st %o0,[a0+4]
- st %o1,[a0]
- st d1,[a0-4]
- ba _mark_hnf_1
- dec 4,a0
+_mark_record_3_bb:
+ btst %o3,%o1
+ bne _mark_next_node
+ inc 1,d2
-_no_mark_array:
- set STRING+2,%g1
- cmp %g1,%l0
- beq _mark_string
- nop
+ and d0,31,%o2
+ add d4,d2,d4
+ add %o2,d2,%o2
-_mark_real_or_file:
- cmp %o3,4
- bgeu fits_in_word_9
bset %o3,%o1
-
+ cmp %o2,32
+ bleu _mark_next_node
st %o1,[%o4+%o0]
+
inc 4,%o0
ld [%o4+%o0],%o1
bset %g3,%o1
-fits_in_word_9:
- st %o1,[%o4+%o0]
ba _mark_next_node
- inc 3,d4
-
-_mark_string:
- sethi %hi 0xc0000000,%o3
- srl %o3,d1,%g1
+ st %o1,[%o4+%o0]
- cmp %g1,3
- bgeu fits_in_word_10
- bset %g1,%o1
+_mark_record_2:
+ cmp %o3,4
+ bgeu fits_in_word_12
+ bset %o3,%o1
st %o1,[%o4+%o0]
inc 4,%o0
- neg d1
ld [%o4+%o0],%o1
- sll %o3,d1,%o3
-
- bset %o3,%o1
-fits_in_word_10:
+ bset %g3,%o1
+fits_in_word_12:
st %o1,[%o4+%o0]
- inc 2,d4
- ld [a0+4],a1
+ cmp %g1,1
+ bgu _mark_record_2_c
+ inc 3,d4
- sub a1,d6,d0
- cmp d0,d7
- bcc _mark_next_node
- srl d0,2,d0
+ be,a _mark_node
+ ld [a0],a0
- ld [a1+4],d1
- inc 7,d1
- srl d1,2,d1
+ b,a _mark_next_node
- cmp d1,32
- bcc _mark_large_string
- add d4,d1,d4
+_mark_record_1:
+ tst %g1
+ bne _mark_hnf_1
+ nop
+ b,a _mark_bool_or_small_string
- srl d0,3,%o0
- andn %o0,3,%o0
- mov -1,%o3
- ld [%o4+%o0],%o1
- srl %o3,d1,%o3
- not %o3
+_mark_string_or_array:
+ beq,a _mark_string
+ ld [a0+4],d0
- srl %o3,d0,%g1
+_mark_array:
+ ld [a0+8],d1
+ tst d1
+ be _mark_lazy_array
+ nop
- and d0,31,%o2
- add %o2,d1,%o2
- cmp %o2,32
- bleu fits_in_word_11
- bset %g1,%o1
+ lduh [d1-2],d0
+ tst d0
+ be _mark_strict_basic_array
+ nop
- st %o1,[%o4+%o0]
- inc 4,%o0
+ lduh [d1-2+2],d1
+ tst d1
+ be _mark_b_record_array
+ nop
+ cmp sp,a3
+ blu __mark_array_using_reversal
+ nop
- neg d0
- ld [%o4+%o0],%o1
- sll %o3,d0,%o3
-
+ ld [a0+4],d2
+ sub d0,256,d3
bset %o3,%o1
-fits_in_word_11:
- ba _mark_next_node
+
st %o1,[%o4+%o0]
+ umul d2,d3,d0
-_mark_large_string:
- b,a _mark_large_string
+ cmp d1,d3
+ beq _mark_lazy_or_a_record_array
+ inc d4
-_end_mark_nodes:
- ld [sp],%o7
- retl
- inc 4,sp
+_mark_ab_record_array:
+ inc 3-1,d0
+ add d4,d0,d4
-__mark__record:
- deccc 258,d2
- be,a __mark__record__2
- lduh [d0-2+2],%g1
+ sll d0,2,d0
+ add a0,d0,d0
+
+ sub d0,d6,d0
+ srl d0,5,d0
+ andn d0,3,d0
+ cmp %o0,d0
+ bgeu _end_set_ab_array_bits
+ nop
+
+ inc 4,%o0
+ cmp %o0,d0
+ bgeu _last_ab_array_bits
+ nop
- blu,a __mark__record__1
- lduh [d0-2+2],%g1
+_mark_ab_array_lp:
+ st %g3,[%o4+%o0]
+ inc 4,%o0
+ cmp %o0,d0
+ bltu,a _mark_ab_array_lp+4
+ st %g3,[%o4+%o0]
-__mark__record__3:
- lduh [d0-2+2],d2
- deccc 1,d2
- blu,a __mark__record__3__bb
- dec 4,a0
+_last_ab_array_bits:
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+ st %o1,[%o4+%o0]
+
+_end_set_ab_array_bits:
+ st a2,[sp-8]
+ st a4,[sp-4]
- be __mark__record__3__ab
- nop
+ sll d3,2,d3
+ add a0,12,a2
- deccc 1,d2
- be __mark__record__3__aab
+ st d3,[sp-20]
+ sll d1,2,d1
+ st d1,[sp-16]
+ dec 28,sp
+
+ cmp d2,0
+ beq _mark_ab_array_0
nop
- b,a __mark__hnf__3
+_mark_ab_array:
+ ld [sp+12],d1
+ st d2,[sp+4]
+ st a2,[sp]
+
+ add a2,d1,a4
-__mark__record__3__bb:
- ld [a0+8],a1
+ dec 4,sp
+ call _mark_stack_nodes
+ st %o7,[sp]
- sub a1,d6,d0
- srl d0,2,d0
- setmbit (%o4,d0,d1,%o0,%o1,%o2)
+ ld [sp+4],d2
+ ld [sp],a2
+ ld [sp+8],d3
+
+ deccc d2
+ bne _mark_ab_array
+ add a2,d3,a2
+
+_mark_ab_array_0:
+ inc 28,sp
+ ld [sp-8],a2
+ ba _mark_next_node
+ ld [sp-4],a4
- cmp a1,a0
- bgu __mark__next__node
+_mark_lazy_array:
+ cmp sp,a3
+ blu __mark_array_using_reversal
nop
- cmp %o0,1
- bne __not__next__byte__1
- srl %o0,1,%o0
+ ld [a0+4],d0
+ bset %o3,%o1
+ inc d4
+ st %o1,[%o4+%o0]
- inc 1,d1
- ldub [%o4+d1],%o1
- mov 128,%o0
-__not__next__byte__1:
- btst %o0,%o1
- be __not__yet__linked__bb
- bset %o0,%o1
+_mark_lazy_or_a_record_array:
+ mov d0,d2
+
+ inc 3-1,d0
+ st a2,[sp-8]
+ add a0,12,a2
+
+ add d4,d0,d4
+ sll d0,2,d0
+ add a0,d0,d0
- sub a0,d6,d0
- srl d0,2,d0
- inc 2,d0
- setmbit (%o4,d0,d1,%o0,%o1,%o2)
+ sub d0,d6,d0
+ srl d0,5,d0
+ andn d0,3,d0
- ld [a1],%o0
- add a0,8+2+1,d0
- st %o0,[a0+8]
- ba __mark__next__node
- st d0,[a1]
+ cmp %o0,d0
+ bgeu _end_set_lazy_array_bits
+ sll d2,2,d2
-__not__yet__linked__bb:
- stb %o1,[%o4+d1]
- ld [a1],%o0
- add a0,8+2+1,d0
- st %o0,[a0+8]
- ba __mark__next__node
- st d0,[a1]
+ inc 4,%o0
+ cmp %o0,d0
+ bgeu _last_lazy_array_bits
+ nop
-__mark__record__3__ab:
- ld [a0+4],a1
+_mark_lazy_array_lp:
+ st %g3,[%o4+%o0]
+ inc 4,%o0
+ cmp %o0,d0
+ bltu,a _mark_lazy_array_lp+4
+ st %g3,[%o4+%o0]
- sub a1,d6,d0
- srl d0,2,d0
- setmbit (%o4,d0,d1,%o0,%o1,%o2)
+_last_lazy_array_bits:
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+ st %o1,[%o4+%o0]
+
+_end_set_lazy_array_bits:
+ st a4,[sp-4]
+ st d1,[sp-12]
+ add a2,d2,a4
- cmp a1,a0
- bgu __mark__hnf__1
- nop
+ dec 16,sp
+ call _mark_stack_nodes
+ st %o7,[sp]
- cmp %o0,1
- bne __not__next__byte__2
- srl %o0,1,%o0
+ ld [sp],d1
+ inc 12,sp
+ ld [sp-8],a2
+ ba _mark_next_node
+ ld [sp-4],a4
- inc 1,d1
- ldub [%o4+d1],%o1
- mov 128,%o0
-__not__next__byte__2:
- btst %o0,%o1
- be __not__yet__linked__ab
- bset %o0,%o1
+__mark_array_using_reversal:
+ mov 0,d3
+ st d3,[sp-4]
+ mov 1,d5
+ b __mark__node
+ dec 4,sp
- sub a0,d6,d0
+_mark_strict_basic_array:
+ ld [a0+4],d0
+ set INT+2,%g1
+ cmp d1,%g1
+ beq,a _mark_basic_array_
+ inc 3,d0
+ set BOOL+2,%g1
+ cmp d1,%g1
+ beq,a _mark_strict_bool_array
+ inc 12+3,d0
+_mark_strict_real_array:
+ add d0,d0,d0
+ ba _mark_basic_array_
+ inc 3,d0
+_mark_strict_bool_array:
+ ba _mark_basic_array_
srl d0,2,d0
- inc 1,d0
- setmbit (%o4,d0,d1,%o0,%o1,%o2)
- ld [a1],%o0
- add a0,4+2+1,d0
- st %o0,[a0+4]
- ba __mark__hnf__1
- st d0,[a1]
-
-__not__yet__linked__ab:
- stb %o1,[%o4+d1]
- ld [a1],%o0
- add a0,4+2+1,d0
- st %o0,[a0+4]
- ba __mark__hnf__1
- st d0,[a1]
+_mark_b_record_array:
+ ld [a0+4],d1
+ dec 256,d0
+ umul d1,d0,d0
-__mark__record__3__aab:
- ld [a0+4],a1
+ ba _mark_basic_array_
+ inc 3,d0
- sub a1,d6,d0
+_mark_string:
+ inc 8+3,d0
srl d0,2,d0
- tstmbit (%o4,d0,d1,%o0,%o1,%o2)
- bne __shared__argument__part
- bset %o0,%o1
-
- stb %o1,[%o4+d1]
+_mark_basic_array_:
+ bset %o3,%o1
+ st %o1,[%o4+%o0]
+ add d4,d0,d4
- ld [a0],%o0
- inc 4,a0
- or %o0,2,%o0
- st %o0,[a0-4]
- or d3,d5,d3
- st d3,[a0]
+ sll d0,2,d0
+ add a0,d0,a0
+ dec 4,a0
+ sub a0,d6,d0
+ srl d0,5,d0
+ andn d0,3,d0
- ld [a1],d2
- st a0,[a1]
- mov a1,d3
- mov 1,d5
- ba __mark__node
- mov d2,a0
+ cmp %o0,d0
+ bge _mark_next_node
+ inc 4,%o0
-__mark__record__2:
- cmp %g1,1
- bgu __mark__hnf__2
+ cmp %o0,d0
+ bge _last_string_bits
nop
- be __mark__hnf__1
- nop
- ba __mark__next__node
- dec 4,a0
+
+_mark_string_lp:
+ st %g3,[%o4+%o0]
+ inc 4,%o0
+ cmp %o0,d0
+ bltu,a _mark_string_lp+4
+ st %g3,[%o4+%o0]
-__mark__record__1:
- tst %g1
- bne __mark__hnf__1
- nop
- ba __mark__next__node
- dec 4,a0
+_last_string_bits:
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+ ba _mark_next_node
+ st %o1,[%o4+%o0]
+#endif
-__end_mark_using_reversal:
- ld [sp],d3
+_end_mark_nodes:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+__end__mark__using__reversal:
+ ld [sp],a1
+ tst a1
+ beq _mark_next_node
+ inc 4,sp
ba _mark_next_node
- inc 8,sp
+ st a0,[a1]
-__end_mark_using_reversal_after_static:
- ld [sp+4],a1
- ld [sp],d3
+__end__mark__using__reversal__after__static:
+ ld [sp],a1
st a0,[a1]
ba _mark_next_node
- inc 8,sp
+ inc 4,sp
__mark_using_reversal:
st a0,[sp-4]
- st d3,[sp-8]
-
mov 0,d3
- mov 1,d5
ld [a0],a0
+ mov 1,d5
ba __mark__node
- dec 8,sp
+ dec 4,sp
__mark__arguments:
ld [a0],d0
btst 2,d0
be __mark__lazy__node
- nop
-
ldsh [d0-2],d2
+
tst d2
be __mark__hnf__0
cmp d2,256
@@ -1133,8 +1202,9 @@ __mark__arguments:
__mark__hnf__3:
cmp %o3,4
- bgeu fits__in__word__1
bset %o3,%o1
+ bgeu fits__in__word__1
+ ld [a0+4],a1
st %o1,[%o4+%o0]
inc 4,%o0
@@ -1143,13 +1213,10 @@ __mark__hnf__3:
bset %g3,%o1
fits__in__word__1:
st %o1,[%o4+%o0]
-
- ld [a0+4],a1
sub a1,d6,d0
+ srl d0,5,%o0
srl d0,2,d0
-
- srl d0,3,%o0
andn %o0,3,%o0
ld [%o4+%o0],%o1
srl %g3,d0,%o3
@@ -1159,29 +1226,22 @@ fits__in__word__1:
inc 3,d4
__no__shared__argument__part:
-#if XXX
- ld [%i0],%g1
-#endif
bset d5,d3
-#if XXX
- bset 2,%g1
- st %g1,[%i0]
-#endif
- st d3,[%i0+4]
- inc 4,%i0
+ st d3,[a0+4]
+ inc 4,a0
ld [a1],%g1
- sll d2,2,d2
- bset 1,%g1
- st %g1,[a1]
- add a1,d2,a1
-
- srl d2,2,d2
+ sll d2,2,d1
inc 1,d2
+
+ bset 1,%g1
add d4,d2,d4
and d0,31,%o2
+ st %g1,[a1]
add %o2,d2,%o2
+ add a1,d1,a1
+
cmp %o2,32
bleu fits__in__word__2
bset %o3,%o1
@@ -1195,17 +1255,17 @@ fits__in__word__2:
st %o1,[%o4+%o0]
ld [a1],d2
+ clr d5
st a0,[a1]
mov a1,d3
- clr d5
ba __mark__node
mov d2,a0
__mark__lazy__node__1:
-! selectors:
bne __mark__selector__node__1
nop
+__mark__selector__1:
cmp %o3,4
bgeu fits__in__word__3
bset %o3,%o1
@@ -1235,45 +1295,28 @@ fits__in__word__4:
inc 2,d4
__shared__argument__part:
- ld [%i0],%l2
- bset %l5,%l3
- st %l3,[%i0]
- mov %i0,%l3
- mov 2,%l5
- ba __mark__node
- mov %l2,%i0
-
-! selectors
-__mark__indirection__node:
+ ld [a0],d2
+ bset d5,d3
+ st d3,[a0]
+ mov a0,d3
+ mov 2,d5
ba __mark__node
- mov a1,a0
-
-__mark__selector__1:
- cmp %o3,4
- bgeu fits__in__word__5
- bset %o3,%o1
-
- st %o1,[%o4+%o0]
- inc 4,%o0
-
- ld [%o4+%o0],%o1
- bset %g3,%o1
-fits__in__word__5:
- st %o1,[%o4+%o0]
- ba __shared__argument__part
- inc 3,d4
+ mov d2,a0
__mark__selector__node__1:
- cmp d2,-2
- bne __mark__indirection__node
+ inccc 2,d2
+ beq __mark__indirection__node
ld [a0],a1
+ inccc 1,d2
+
sub a1,d6,%o2
+ srl %o2,5,d2
srl %o2,2,%o2
-
- srl %o2,3,d2
andn d2,3,d2
ld [%o4+d2],%g1
+
+ ble __mark__record__selector__node__1
srl %g3,%o2,%g2
btst %g2,%g1
@@ -1287,14 +1330,14 @@ __mark__selector__node__1:
ldsh [d2-2],%g1
cmp %g1,2
- bleu __small__tuple
+ bleu __small__tuple__or__record
nop
-
+
+__large__tuple__or__record:
ld [a1+8],%o2
sub %o2,d6,%o2
+ srl %o2,5,d2
srl %o2,2,%o2
-
- srl %o2,3,d2
andn d2,3,d2
ld [%o4+d2],%g1
srl %g3,%o2,%g2
@@ -1303,7 +1346,7 @@ __mark__selector__node__1:
bne __mark__selector__1
nop
-__small__tuple:
+__small__tuple__or__record:
sub a0,4,d2
ld [d0-8],%g1
@@ -1319,6 +1362,64 @@ __small__tuple:
ba __mark__node
st a0,[d2+4]
+__mark__record__selector__node__1:
+ beq __mark__strict__record__selector__node__1
+ btst %g2,%g1
+ bne __mark__selector__1
+ nop
+
+ ld [a1],d2
+ btst 2,d2
+ be __mark__selector__1
+ nop
+
+ ldsh [d2-2],%g1
+ cmp %g1,258
+ bleu __small__tuple__or__record
+ nop
+ b,a __large__tuple__or__record
+
+__mark__strict__record__selector__node__1:
+ bne __mark__selector__1
+ nop
+
+ ld [a1],d2
+ btst 2,d2
+ be __mark__selector__1
+ nop
+
+ ldsh [d2-2],%g1
+ cmp %g1,258
+ ble __select__from__small__record
+ nop
+
+ ld [a1+8],%o2
+ sub %o2,d6,%o2
+ srl %o2,5,d2
+ srl %o2,2,%o2
+ andn d2,3,d2
+ ld [%o4+d2],%g1
+ srl %g3,%o2,%g2
+
+ btst %g2,%g1
+ bne __mark__selector__1
+ nop
+
+__select__from__small__record:
+ ld [d0-8],%g1
+ dec 4,a0
+ ld [%g1+4],%g1
+
+ dec 4,sp
+ call %g1
+ st %o7,[sp]
+
+ b,a __mark__node
+
+__mark__indirection__node:
+ ba __mark__node
+ mov a1,a0
+
__mark__hnf__2:
cmp %o3,4
bgeu fits__in__word__6
@@ -1333,16 +1434,16 @@ fits__in__word__6:
st %o1,[%o4+%o0]
inc 3,d4
- ld [%i0],%o0
+__mark__record__2__c:
+ ld [a0],%o0
+ bset d5,d3
bset 2,%o0
- st %o0,[%i0]
- inc 4,%i0
- ld [%i0],%l2
- bset %l5,%l3
- st %l3,[%i0]
- mov %i0,%l3
- clr %l5
- mov %l2,%i0
+ st %o0,[a0]
+ ld [a0+4],d2
+ st d3,[a0+4]
+ add a0,4,d3
+ clr d5
+ mov d2,a0
__mark__node:
sub a0,d6,d1
@@ -1350,47 +1451,47 @@ __mark__node:
cmp d1,d7
bcc __mark__next__node__after__static
#endif
+ srl d1,5,%o0
srl d1,2,d1
-
- srl d1,3,%o0
andn %o0,3,%o0
ld [%o4+%o0],%o1
srl %g3,d1,%o3
btst %o3,%o1
- be __mark__arguments
+ beq __mark__arguments
nop
__mark__next__node:
tst d5
bne __mark__parent
nop
+
__mark__next__node2:
- dec 4,%l3
- ld [%l3],%l2
- ld [%l3+4],%o0
- and %l2,3,%l5
+ ld [d3-4],d2
+ dec 4,d3
+ ld [d3+4],%o0
+ and d2,3,d5
- st %o0,[%l3]
+ st %o0,[d3]
- st %i0,[%l3+4]
+ st a0,[d3+4]
ba __mark__node
- andn %l2,3,%i0
+ andn d2,3,a0
__mark__lazy__node:
- ldsh [d0-2],d2
tst d2
- be __mark__real__or__file
- add d0,-2,a1
-
- deccc d2
+ beq __mark__real__or__file
+ cmp d2,1
ble __mark__lazy__node__1
inc 4,a0
- inc 2,d2
- add d4,d2,d4
+ cmp d2,256
+ bgeu __mark_closure_with_unboxed_arguments
+ nop
+ inc 1,d2
and d1,31,%o2
+ add d4,d2,d4
add %o2,d2,%o2
cmp %o2,32
bleu fits__in__word__7
@@ -1405,20 +1506,56 @@ fits__in__word__7:
st %o1,[%o4+%o0]
dec 2,d2
-
- ld [%i0],%o0
+__mark_closure_with_unboxed_arguments__2:
+ ld [a0],%o0
sll d2,2,d2
bset 2,%o0
- st %o0,[%i0]
- add %i0,d2,%i0
-
- ld [%i0],%l2
- bset %l5,%l3
- st %l3,[%i0]
- mov %i0,%l3
- clr %l5
+ st %o0,[a0]
+ add a0,d2,a0
+
+ ld [a0],d2
+ bset d5,d3
+ st d3,[a0]
+ mov a0,d3
+ clr d5
ba __mark__node
- mov %l2,%i0
+ mov d2,a0
+
+__mark_closure_with_unboxed_arguments:
+ srl d2,8,d0
+ and d2,255,d2
+ deccc 1,d2
+ beq __mark_closure_1_with_unboxed_argument
+ inc 2,d2
+
+ and d1,31,%o2
+ add d4,d2,d4
+ add %o2,d2,%o2
+
+ cmp %o2,32
+ bleu fits__in__word__7_
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__7_:
+ st %o1,[%o4+%o0]
+
+ sub d2,d0,d2
+ deccc 2,d2
+ bgt __mark_closure_with_unboxed_arguments__2
+ nop
+ beq __shared__argument__part
+ nop
+ ba __mark__next__node
+ dec 4,a0
+
+__mark_closure_1_with_unboxed_argument:
+ ba __mark__real__or__file
+ dec 4,a0
__mark__hnf__0:
set INT+2,%g1
@@ -1453,9 +1590,9 @@ ____small____int:
__no__int__3:
blu __mark__real__file__or__string
- seth ((CHAR+2),%g1)
+ seth (CHAR+2,%g1)
- setl ((CHAR+2),%g1)
+ setl (CHAR+2,%g1)
cmp d0,%g1
bne __no__char__3
nop
@@ -1472,248 +1609,385 @@ __no__char__3:
ba __mark__next__node__after__static
sub d0,12+2,a0
-
+
__mark__real__file__or__string:
- set __ARRAY__+2,%g1
+ set __STRING__+2,%g1
cmp d0,%g1
- bne __no__mark__array
+ bleu __mark__string__or__array
nop
- ld [a0+8],d0
- tst d0
- be __mark__lazy__array
- nop
+__mark__real__or__file:
+ cmp %o3,4
+ bgeu fits__in__word__9
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__9:
+ st %o1,[%o4+%o0]
+ ba __mark__next__node
+ inc 3,d4
+
+__mark__record:
+ deccc 258,d2
+ be,a __mark__record__2
+ lduh [d0-2+2],%g1
+
+ blu,a __mark__record__1
+ lduh [d0-2+2],%g1
+
+__mark__record__3:
+ cmp %o3,4
+ bset %o3,%o1
+ bgeu fits__in__word__13
+ ld [a0+4],a1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__13:
+ st %o1,[%o4+%o0]
lduh [d0-2+2],d1
+
+ sub a1,d6,d0
+ srl d0,5,%o0
+ srl d0,2,d0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%o1
+ srl %g3,d0,%o3
+
+ btst %o3,%o1
+ bne __shared__record__argument__part
+ inc 3,d4
+
+ inc 1,d2
+ and d0,31,%o2
+
+ add %o2,d2,%o2
+ add d4,d2,d4
+
+ cmp %o2,32
+ bleu fits__in__word__14
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__14:
+ st %o1,[%o4+%o0]
+
+ deccc 1,d1
+ blu,a __mark__next__node
+ dec 4,a0
+
+ be __shared__argument__part
+ nop
+
+ deccc 1,d1
+ bset d5,d3
+ st d3,[a0+4]
+ be __mark__record__3__aab
+ inc 4,a0
+
+ ld [a1],%g1
+ sll d1,2,d1
+ bset 1,%g1
+ st %g1,[a1]
+
+ add a1,d1,a1
+
+ ld [a1],d2
+ clr d5
+ st a0,[a1]
+ mov a1,d3
+ ba __mark__node
+ mov d2,a0
+
+__mark__record__3__aab:
+ ld [a1],d2
+ mov 1,d5
+ st a0,[a1]
+ mov a1,d3
+ ba __mark__node
+ mov d2,a0
+
+__shared__record__argument__part:
tst d1
- be __mark__b__record__array
+ bne __shared__argument__part
+ nop
+ ba __mark__next__node
+ dec 4,a0
+
+__mark__record__2:
+ cmp %o3,4
+ bgeu fits__in__word_12
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word_12:
+ st %o1,[%o4+%o0]
+ inc 3,d4
+
+ cmp %g1,1
+ bgu __mark__record__2__c
+ nop
+ be __shared__argument__part
nop
+ ba __mark__next__node
+ dec 4,a0
- lduh [d0-2],d0
+__mark__record__1:
+ tst %g1
+ bne __mark__hnf__1
+ nop
+ ba __mark__bool__or__small__string
+ dec 4,a0
+
+__mark__string__or__array:
+ beq __mark__string__
+ nop
+
+__mark__array:
+ ld [a0+8],d1
+ tst d1
+ be __mark__lazy__array
+ nop
+
+ lduh [d1-2],d0
+ tst d0
+ be,a __mark__strict__basic__array
+ ld [a0+4],d0
+
+ lduh [d1-2+2],d1
+ tst d1
+ beq __mark__b__record__array
dec 256,d0
+
cmp d0,d1
- be __mark__a__record__array
- nop
+ be,a __mark__a__record__array
+ ld [a0+4],%g1
__mark__ab__record__array:
mov d2,%o2
- mov d3,%o3
- mov d4,%g2
+ st d3,[sp-12]
+ mov d4,%g1
mov d5,%o5
- mov d6,%g3
+ mov d6,%g2
ld [a0+4],d2
inc 8,a0
- mov a0,%g4
sll d2,2,d2
- sub d0,2,d3
- mov d2,a1
-__mul__array__length__ab1:
- deccc 1,d3
- bcc __mul__array__length__ab1
- add a1,d2,a1
+ st a0,[sp-4]
+ umul d2,d0,a1
+ st %o0,[sp-8]
sub d0,d1,d0
inc 4,a0
call reorder
add a1,a0,a1
-
- mov %g4,a0
- ld [a0-4],d2
- deccc 2,d1
- bcs __skip_mul_array_length_a1_
- mov d2,d0
-__mul_array_length_a1_:
- deccc 1,d1
- bcc __mul_array_length_a1_
- add d0,d2,d0
-__skip_mul_array_length_a1_:
- mov %g3,d6
+ ld [sp-8],%o0
+ mov %g2,d6
mov %o5,d5
- mov %g2,d4
- mov %o3,d3
- ba __mark__lr__array
+ ld [sp-4],a0
+ mov %g1,d4
+ ld [sp-12],d3
mov %o2,d2
-__mark__b__record__array:
- sub a0,d6,d0
- srl d0,2,d0
- inc 1,d0
- setmbit (%o4,d0,d1,%o0,%o1,%o2)
- b,a __mark__next__node
+ ld [a0-4],%g1
+ mov d0,a1
+ umul %g1,d1,d0
+ umul %g1,a1,d1
+ add d4,d1,d4
+ add d1,d0,d1
+
+ sll d1,2,d1
+ add a0,d1,d1
+ sll d0,2,a1
+ add a0,a1,a1
+ ba __mark__r__array
+ sub d1,d6,d1
__mark__a__record__array:
- ld [a0+4],d0
- deccc 2,d1
- blu __mark__lr__array
+ umul %g1,d0,d0
inc 8,a0
-
- mov d0,d2
-__mul__array__length:
- deccc 1,d1
- bcc __mul__array__length
- add d0,d2,d0
-
b,a __mark__lr__array
__mark__lazy__array:
ld [a0+4],d0
inc 8,a0
+
__mark__lr__array:
- sub a0,d6,d1
- srl d1,2,d1
- add d1,d0,d1
- setmbit (%o4,d1,d2,%o0,%o1,%o2)
+ sll d0,2,a1
+ add a0,a1,a1
+ sub a1,d6,d1
+__mark__r__array:
+ srl d1,5,d1
+ inc 3,d4
+ bset %o3,%o1
+
+ andn d1,3,d1
+ cmp %o0,d1
+ bgeu __skip__mark__lazy__array__bits
+ st %o1,[%o4+%o0]
+
+__mark__lazy__array__bits:
+ inc 4,%o0
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+ cmp %o0,d1
+ bltu __mark__lazy__array__bits
+ st %o1,[%o4+%o0]
+
+__skip__mark__lazy__array__bits:
+ set lazy_array_list,%o2
cmp d0,1
bleu __mark__array__length__0__1
- nop
-
- mov a0,a1
- sll d0,2,d0
- add a0,d0,a0
+ add d4,d0,d4
- ld [a0],d2
- ld [a1],%o0
- st d2,[a1]
- st %o0,[a0]
+ ld [a1],d2
+ ld [a0],%o0
+ st d2,[a0]
+ st %o0,[a1]
- ld [a0-4],d2
- dec 4,a0
+ ld [a1-4],d2
+ dec 4,a1
+ ld [%o2],%o1
inc 2,d2
- ld [a1-4],%o0
+ st %o1,[a1]
+ st d2,[a0-4]
+ st d0,[a0-8]
+ dec 8,a0
+ st a0,[%o2]
+
+ ld [a1-4],a0
dec 4,a1
- st %o0,[a0]
- st d2,[a1]
- ld [a0-4],d2
- dec 4,a0
- or d3,d5,d3
- st d3,[a0]
- mov a0,d3
+ bset d5,d3
mov 0,d5
+ st d3,[a1]
ba __mark__node
- mov d2,a0
+ mov a1,d3
__mark__array__length__0__1:
blu __mark__next__node
- nop
-
- ld [a0+4],d1
- ld [a0],%o0
- ld [a0-4],%o1
- st %o0,[a0+4]
- st %o1,[a0]
- st d1,[a0-4]
- ba __mark__hnf__1
- dec 4,a0
+ dec 8,a0
-__no__mark__array:
- set STRING+2,%g1
- cmp %g1,%l0
- beq __mark__string
- nop
+ ld [a0+12],d1
+ ld [a0+8],%o0
+ ld [%o2],%o3
+ st %o0,[a0+12]
+ st %o3,[a0+8]
+ st d0,[a0]
-__mark__real__or__file:
- cmp %o3,4
- bgeu fits__in__word__9
- bset %o3,%o1
-
- st %o1,[%o4+%o0]
- inc 4,%o0
-
- neg d1
- ld [%o4+%o0],%o1
- bset %g3,%o1
-fits__in__word__9:
- st %o1,[%o4+%o0]
- ba __mark__next__node
- inc 3,d4
+ st a0,[%o2]
+ st d1,[a0+4]
-__mark__string:
- sethi %hi 0xc0000000,%o3
- srl %o3,d1,%g1
+ inc 4,a0
- cmp %g1,3
- bgeu fits__in__word__10
- bset %g1,%o1
+ ld [a0],d2
+ bset d5,d3
+ mov 2,d5
+ st d3,[a0]
+ mov a0,d3
+ ba __mark__node
+ mov d2,a0
- st %o1,[%o4+%o0]
- inc 4,%o0
+__mark__b__record__array:
+ ld [a0+4],d1
+ umul d1,d0,d0
+ ba __mark__basic__array
+ inc 3,d0
- neg d1
- ld [%o4+%o0],%o1
- sll %o3,d1,%o3
-
- bset %o3,%o1
-fits__in__word__10:
- st %o1,[%o4+%o0]
- inc 2,d4
+__mark__strict__basic__array:
+ set INT+2,%g1
+ cmp d1,%g1
+ beq,a __mark__basic__array
+ inc 3,d0
+ set BOOL+2,%g1
+ cmp d1,%g1
+ beq __mark__strict__bool__array
+ nop
+__mark__strict__real__array:
+ add d0,d0,d0
+ ba __mark__basic__array
+ inc 3,d0
+__mark__strict__bool__array:
+ inc 12+3,d0
+ b __mark__basic__array
+ srl d0,2,d0
- ld [a0+4],a1
+__mark__string__:
+ ld [a0+4],d0
+ inc 8+3,d0
- sub a1,d6,d0
- cmp d0,d7
- bcc __mark__next__node
srl d0,2,d0
- ld [a1+4],d1
- inc 7,d1
- srl d1,2,d1
-
- cmp d1,32
- bcc __mark__large__string
- add d4,d1,d4
+__mark__basic__array:
+ bset %o3,%o1
+ add d4,d0,d4
- srl d0,3,%o0
- andn %o0,3,%o0
- mov -1,%o3
- ld [%o4+%o0],%o1
- srl %o3,d1,%o3
- not %o3
+ st %o1,[%o4+%o0]
- srl %o3,d0,%g1
+ sll d0,2,d0
+ add a0,d0,d0
+ dec 4,d0
- and d0,31,%o2
- add %o2,d1,%o2
- cmp %o2,32
- bleu fits__in__word__11
- bset %g1,%o1
+ sub d0,d6,d0
+ srl d0,5,d0
+ andn d0,3,d0
+
+ cmp %o0,d0
+ bge __mark__next__node
+ inc 4,%o0
- st %o1,[%o4+%o0]
+ cmp %o0,d0
+ bge __last__string__bits
+ nop
+
+__mark__string__lp:
+ st %g3,[%o4+%o0]
inc 4,%o0
+ cmp %o0,d0
+ bltu,a __mark__string__lp+4
+ st %g3,[%o4+%o0]
- neg d0
+__last__string__bits:
ld [%o4+%o0],%o1
- sll %o3,d0,%o3
-
- bset %o3,%o1
-fits__in__word__11:
+ bset %g3,%o1
ba __mark__next__node
st %o1,[%o4+%o0]
-__mark__large__string:
- b,a __mark__large__string
-
__mark__parent:
tst d3
- be __end_mark_using_reversal
+ be __end__mark__using__reversal
deccc d5
- be __argument__part__parent
ld [d3],d2
+ be __argument__part__parent
+ st a0,[d3]
- st %i0,[%l3]
- sub %l3,4,%i0
- and %l2,3,%l5
+ sub d3,4,a0
+ and d2,3,d5
ba __mark__next__node
- andn %l2,3,%l3
+ andn d2,3,d3
__argument__part__parent:
mov d3,a1
- st a0,[a1]
andn d2,3,d3
dec 4,d3
@@ -1731,14 +2005,14 @@ __mark__next__node__after__static:
beq __mark__next__node2
tst d3
- be __end_mark_using_reversal_after_static
+ be __end__mark__using__reversal__after__static
deccc d5
- be __argument__part__parent
ld [d3],d2
+ be __argument__part__parent
+ st a0,[d3]
- st %i0,[%l3]
- sub %l3,4,%i0
- and %l2,3,%l5
+ sub d3,4,a0
+ and d2,3,d5
ba __mark__next__node
- andn %l2,3,%l3
+ andn d2,3,d3