summaryrefslogtreecommitdiff
path: root/scompact.s
diff options
context:
space:
mode:
Diffstat (limited to 'scompact.s')
-rw-r--r--scompact.s433
1 files changed, 237 insertions, 196 deletions
diff --git a/scompact.s b/scompact.s
index e0dfc54..773a8a2 100644
--- a/scompact.s
+++ b/scompact.s
@@ -12,22 +12,13 @@
be end_mark_cafs
dec 4,sp
-#ifdef SP_G5
dec 4,sp
-#endif
mark_cafs_lp:
-#ifdef SP_G5
ld [d0-4],%g1
-#else
- ld [d0-4],%g5
-#endif
add d0,4,a2
ld [d0],d0
-
-#ifdef SP_G5
st %g1,[sp]
-#endif
sll d0,2,d0
add a2,d0,a4
@@ -35,18 +26,12 @@ mark_cafs_lp:
call mark_stack_nodes
st %o7,[sp]
-#ifdef SP_G5
ld [sp],d0
addcc d0,0,d0
-#else
- addcc %g5,0,d0
-#endif
bne mark_cafs_lp
nop
-#ifdef SP_G5
inc 4,sp
-#endif
end_mark_cafs:
ldg (stack_p,a2)
@@ -272,7 +257,7 @@ mark_hnf_3:
mov 128,%o3
- sub a1,%l6,d0
+ sub a1,d6,d0
srl d0,2,d0
srl d0,3,%o0
@@ -332,7 +317,7 @@ mark_hnf_1:
mark_indirection_node:
sub a0,4,%o1
- sub %o1,%l6,%o1
+ sub %o1,d6,%o1
srl %o1,2,%o1
srl %o1,3,d2
@@ -357,9 +342,8 @@ mark_selector_node_1:
inccc d2
ble mark_record_selector_node_1
- nop
-
srl %o1,3,d2
+
ldub [%o4+d2],%g1
and %o1,7,%g2
mov 128,%g3
@@ -420,10 +404,8 @@ small_tuple_or_record:
mark_record_selector_node_1:
beq mark_strict_record_selector_node_1
- nop
-
- srl %o1,3,d2
ldub [%o4+d2],%g1
+
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
@@ -443,8 +425,6 @@ mark_record_selector_node_1:
b,a large_tuple_or_record
mark_strict_record_selector_node_1:
- srl %o1,3,d2
- ldub [%o4+d2],%g1
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
@@ -476,9 +456,8 @@ mark_strict_record_selector_node_1:
nop
select_from_small_record:
- dec 4,a0
-
ld [d0-8],%g1
+ dec 4,a0
ld [%g1+4],%g1
dec 4,sp
@@ -499,7 +478,7 @@ mark_hnf_2:
mov d2,a0
mark_node:
- sub a0,%l6,d0
+ sub a0,d6,d0
#ifdef SHARE_CHAR_INT
cmp d0,%l7
bcc mark_next_node_after_static
@@ -603,7 +582,7 @@ mark_hnf_0:
bcc mark_next_node
nop
- sub a0,%l6,d1
+ sub a0,d6,d1
srl d1,2,d1
srl d1,3,d0
@@ -662,24 +641,23 @@ no_char_3:
no_normal_hnf_0:
#endif
-
set __ARRAY__+2,%o0
cmp d0,%o0
bne,a mark_next_node+4
tst d5
- ld [a0+8],d0
- tst d0
+ ld [a0+8],d1
+ tst d1
be,a mark_lazy_array
ld [a0+4],d0
- lduh [d0-2+2],d1
- tst d1
+ lduh [d1-2],d0
+ tst d0
be,a mark_b_record_array
sub a0,d6,d0
- lduh [d0-2],d0
- tst d0
+ lduh [d1-2+2],d1
+ tst d1
be,a mark_b_record_array
sub a0,d6,d0
@@ -697,6 +675,7 @@ mark_ab_record_array:
ld [a0+4],d2
inc 8,a0
+
mov a0,%g4
sll d2,2,d2
@@ -758,6 +737,7 @@ mul_array_length:
mark_lazy_array:
inc 8,a0
+
mark_lr_array:
sub a0,d6,d1
srl d1,2,d1
@@ -806,11 +786,9 @@ mark_array_length_0_1:
st d1,[a0-4]
ba mark_hnf_1
dec 4,a0
-!
+
mark_parent:
tst d3
-! selectors:
-! be mark_stack_nodes
be mark_stack_nodes2
nop
@@ -1101,142 +1079,14 @@ free_finalizer_list_empty:
ba find_non_zero_long_2
clr d4
-move_record:
- deccc 258,d1
- blu,a move_record_1
- lduh [d0-2+2],%g1
- be,a move_record_2
- lduh [d0-2+2],%g1
-
-move_record_3:
- lduh [d0-2+2],d1
- deccc 1,d1
- bgu copy_hnf_3
- nop
-
- ld [a0],a1
- blu move_record_3_1b
- inc 4,a0
-
-move_record_3_1a:
- cmp a1,a0
- blu move_record_3_1b
-#ifdef SHARE_CHAR_INT
- cmp a1,d2
- bgeu move_record_3_1b
-#endif
- add a6,1,d0
- ld [a1],d1
- st d0,[a1]
- mov d1,a1
-move_record_3_1b:
- st a1,[a6]
- inc 4,a6
-
- ld [a0],a1
- cmp a1,a0
- blu move_record_3_2
- inc 4,a0
-#ifdef SHARE_CHAR_INT
- cmp a1,d2
- bgeu move_record_3_2
-#endif
- sub a1,d6,d0
- srl d0,2,d0
- inc 1,d0
-
- tstmbit (%o4,d0,d1,%o0,%o1,%o2)
- be not_linked_record_argument_part_3_b
- bset %o0,%o1
-
- sub a6,d6,d0
- srl d0,2,d0
- setmbit (%o4,d0,d1,%o0,%o1,%o2)
- b,a linked_record_argument_part_3_b
-
-not_linked_record_argument_part_3_b:
- stb %o1,[%o4+d1]
-
- sub a6,d6,d0
- srl d0,2,d0
- clrmbit (%o4,d0,d1,%o0,%o1,%o2)
-
-linked_record_argument_part_3_b:
- ld [a1],d1
- add a6,2+1,d0
- st d0,[a1]
- mov d1,a1
-move_record_3_2:
- st a1,[a6]
- inc 4,a6
-
- sub %i2,%o4,%o0
- sll %o0,5,%o0
- add %o0,%l6,%o0
-
- cmp %o0,d7
- be,a bit_in_next_long
- sethi %hi 0xc0000000,%o1
-
- inc 4,d7
- cmp %o0,d7
- inc 4,d7
- bne skip_zero_bits
- sll d4,2,d4
-
- sethi %hi 0x80000000,%o1
-
-bit_in_next_long:
- deccc %l5
- bneg end_compact_heap
- nop
-
- ld [%i2],d4
- ba skip_zeros_2
- bclr %o1,d4
-
-move_record_2:
- cmp %g1,1
- bgu copy_hnf_2
- nop
- blu move_real_or_file
- nop
-move_record_2_ab:
- ld [a0],a1
- cmp a1,a0
- blu move_record_2_1
- inc 4,a0
-#ifdef SHARE_CHAR_INT
- cmp a1,d2
- bgeu move_record_2_1
- add a6,1,d0
-#endif
- ld [a1],d1
- st d0,[a1]
- mov d1,a1
-move_record_2_1:
- st a1,[a6]
- ld [a0],%o0
- inc 4,a0
- st %o0,[a6+4]
- ba skip_zero_bits
- inc 8,a6
-
-move_record_1:
- tst %g1
- bne copy_hnf_1
- nop
- ba move_int_bool_or_char
- nop
-
skip_zeros_2:
tst d4
bne end_skip_zeros
- inc 4,%i2
+ inc 4,a2
find_non_zero_long_2:
- deccc %l5
+ deccc d5
bpos,a skip_zeros_2
- ld [%i2],d4
+ ld [a2],d4
b,a end_compact_heap
@@ -1247,8 +1097,9 @@ end_skip_zeros:
add %l7,%l6,%l7
skip_zero_bits:
- set first_one_bit_table,%o0
+ seth (first_one_bit_table,%o0) !
srl d4,24,%o1
+ setl (first_one_bit_table,%o0)
ldsb [%o0+%o1],d1
tst d1
bpos,a copy_nodes
@@ -1262,7 +1113,7 @@ more_than_7:
sll d4,8,d4
btst d4,%o2
beq more_than_7
- inc 8<<2,%l7
+ inc 8<<2,d7
less_than_8:
srl d4,24,%o1
@@ -1270,25 +1121,17 @@ less_than_8:
sll d4,d1,d4
copy_nodes:
-! sethi %hi 0x80000000,%o0
-! bclr %o0,d4
- sll d4,1,d4
-
sll d1,2,d1
- add %l7,d1,%l7
-
-! mov %l7,a0
-! ld [a0],d0
-! inc 4,a0
- ld [d7],d0
- inc 4,d7
- mov d7,a0
+ sll d4,1,d4
- bclr 1,d0
+ ld [d7+d1],d0
+ add d7,d1,a0
+ add a0,4,d7
+ inc 4,a0
btst 2,d0
beq begin_update_list_2
- bclr 2,d0
+ bclr 3,d0
ld [d0-8],d3
mov d0,a1
@@ -1659,8 +1502,9 @@ move_hnf_0:
set INT+2,%l3
cmp d0,%l3
blu move_real_file_or_string
- nop
- set CHAR+2,%o0
+ seth (CHAR+2,%o0)
+
+ setl (CHAR+2,%o0)
cmp d0,%o0
bleu move_int_bool_or_char
nop
@@ -1691,6 +1535,200 @@ cp_s_arg_lp3:
b,a skip_zero_bits
+move_record:
+ deccc 258,d1
+ blu,a move_record_1
+ lduh [d0-2+2],%g1
+ be,a move_record_2
+ lduh [d0-2+2],%g1
+
+move_record_3:
+ lduh [d0-2+2],d1
+ deccc 1,d1
+ bgu copy_hnf_3
+ nop
+
+ ld [a0],a1
+ blu move_record_3_1b
+ inc 4,a0
+
+move_record_3_1a:
+ cmp a1,a0
+ blu move_record_3_1b
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bgeu move_record_3_1b
+#endif
+ add a6,1,d0
+ ld [a1],d1
+ st d0,[a1]
+ mov d1,a1
+move_record_3_1b:
+ st a1,[a6]
+ inc 4,a6
+
+ ld [a0],a1
+ cmp a1,a0
+ blu move_record_3_2
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bgeu move_record_3_2
+#endif
+ sub a1,d6,d0
+ srl d0,2,d0
+ inc 1,d0
+
+ tstmbit (%o4,d0,d1,%o0,%o1,%o2)
+ be not_linked_record_argument_part_3_b
+ bset %o0,%o1
+
+ sub a6,d6,d0
+ srl d0,2,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+ b,a linked_record_argument_part_3_b
+
+not_linked_record_argument_part_3_b:
+ stb %o1,[%o4+d1]
+
+ sub a6,d6,d0
+ srl d0,2,d0
+ clrmbit (%o4,d0,d1,%o0,%o1,%o2)
+
+linked_record_argument_part_3_b:
+ ld [a1],d1
+ add a6,2+1,d0
+ st d0,[a1]
+ mov d1,a1
+move_record_3_2:
+ st a1,[a6]
+ inc 4,a6
+
+ sub %i2,%o4,%o0
+ sll %o0,5,%o0
+ add %o0,%l6,%o0
+
+ cmp %o0,d7
+ be,a bit_in_next_long
+ sethi %hi 0xc0000000,%o1
+
+ inc 4,d7
+ cmp %o0,d7
+ inc 4,d7
+ bne skip_zero_bits
+ sll d4,2,d4
+
+ sethi %hi 0x80000000,%o1
+
+bit_in_next_long:
+ deccc %l5
+ bneg end_compact_heap
+ nop
+
+ ld [%i2],d4
+ ba skip_zeros_2
+ bclr %o1,d4
+
+move_record_2:
+ cmp %g1,1
+ bgu copy_hnf_2
+ nop
+ blu move_real_or_file
+ nop
+move_record_2_ab:
+ ld [a0],a1
+ cmp a1,a0
+ blu move_record_2_1
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bgeu move_record_2_1
+ add a6,1,d0
+#endif
+ ld [a1],d1
+ st d0,[a1]
+ mov d1,a1
+move_record_2_1:
+ st a1,[a6]
+ ld [a0],%o0
+ inc 4,a0
+ st %o0,[a6+4]
+ ba skip_zero_bits
+ inc 8,a6
+
+move_record_1:
+ tst %g1
+ bne copy_hnf_1
+ nop
+ ba move_int_bool_or_char
+ nop
+
+move_real_array:
+ tst d4
+ bneg clear_bit_in_this_word
+ sll d4,1,d4
+
+ ld [a2],d4
+ dec d5
+ sub a2,%o4,d7
+ inc 4,a2
+ sll d7,5,d7
+ add d7,%l6,d7
+
+ sll d4,1,d4
+clear_bit_in_this_word:
+ inc 4,d7
+
+ add %g6,8,d1
+ andn d1,4,d1
+
+ ld [a0],d0
+ ba begin_array_update_list_2
+ bclr 1,d0
+
+update_array_list_2:
+ st d1,[a1]
+begin_array_update_list_2:
+ mov d0,a1
+ ld [a1],d0
+update_array_list__2:
+ btst 1,d0
+ be end_update_array_list_2
+ bclr 1,d0
+ btst 2,d0
+ be update_array_list_2
+ bclr 2,d0
+ mov d0,a1
+ ba update_array_list__2
+ ld [a1],d0
+
+end_update_array_list_2:
+ st d1,[a1]
+
+ st d0,[d1]
+ inc 4,d1
+
+ ld [a0+4],d0
+ inc 4,a0
+
+ inc 16,%g6
+
+ sll d0,3,%o0
+ sll d0,1,d0
+
+ add %g6,%o0,%g6
+
+move_real_array_reals:
+ ld [a0],%o0 !
+ inc 4,a0
+ st %o0,[d1]
+ inc 4,d1
+ deccc d0
+ bge,a move_real_array_reals+4
+ ld [a0],%o0
+
+ b,a skip_zero_bits
+
skip_zeros_2_a:
ld [a2],d4
dec d5
@@ -1699,15 +1737,17 @@ skip_zeros_2_a:
inc 4,a2
end_skip_zeros_a:
- sub %i2,%o4,%l7
- dec 4,%l7
- sll %l7,5,%l7
- add %l7,%l6,%l7
+ sub %i2,%o4,d7
+ dec 4,d7
+ sll d7,5,d7
+ add d7,%l6,d7
move_array:
+
skip_zero_bits_a:
- set first_one_bit_table,%o0
+ seth (first_one_bit_table,%o0) !
srl d4,24,%o1
+ setl (first_one_bit_table,%o0)
ldsb [%o0+%o1],d1
tst d1
bpos,a end_array_bit
@@ -1721,7 +1761,7 @@ more_than_7_a:
sll d4,8,d4
btst d4,%o2
beq more_than_7_a
- inc 8<<2,%l7
+ inc 8<<2,d7
less_than_8_a:
srl d4,24,%o1
@@ -1732,9 +1772,9 @@ end_array_bit:
sll d4,1,d4
sll d1,2,d1
- add %l7,d1,%l7
+ add d7,d1,d7
- mov %l7,d1
+ mov d7,d1
cmp d7,a0
bne move_a_array
inc 4,d7
@@ -1785,7 +1825,7 @@ move_a_array:
deccc 1,d1
blu end_array
nop
-
+
ld [a0],%o0
ld [a1-4],d0
st %o0,[a1-4]
@@ -1802,6 +1842,7 @@ move_a_array:
lduh [d0-2+2],d3
lduh [d0-2],d0
dec 256,d0
+
cmp d0,d3
be st_move_array_lp
nop