summaryrefslogtreecommitdiff
path: root/pcompact.a
diff options
context:
space:
mode:
Diffstat (limited to 'pcompact.a')
-rw-r--r--pcompact.a789
1 files changed, 17 insertions, 772 deletions
diff --git a/pcompact.a b/pcompact.a
index ee55b11..948325a 100644
--- a/pcompact.a
+++ b/pcompact.a
@@ -1,7 +1,6 @@
; mark used nodes and pointers in argument parts and link backward pointers
-
lea o0,heap_size_33
lwz d7,0(o0)
@@ -9,20 +8,24 @@
slwi d7,d7,5
lwz d0,0(o0)
- stwu a4,-4(sp)
li g3,128
+ subi d4,sp,8000
+
+ stwu a4,-4(sp)
+
cmpwi 0,d0,0
beq end_mark_cafs
mark_cafs_lp:
lwz d1,0(d0)
lwz o5,-4(d0)
- addi a2,d0,4
+
+ addi a3,d0,4
slwi d0,d1,2
- add a4,a2,d0
+ add a4,a3,d0
- bl mark_stack_nodes
+ bl rmark_stack_nodes
addic. d0,o5,0
bne mark_cafs_lp
@@ -31,10 +34,11 @@ end_mark_cafs:
lea o0,stack_p
lwz a4,0(sp)
- lwz a2,0(o0)
+
+ lwz a3,0(o0)
addi sp,sp,4
- bl mark_stack_nodes
+ bl rmark_stack_nodes
if MEASURE_GC
stwu o4,-4(sp)
@@ -47,770 +51,8 @@ end_mark_cafs:
b compact_heap
-mark_stack_nodes3:
- stw a0,-4(a2)
- b mark_stack_nodes
-
-mark_stack_nodes2:
- lwz g1,0(a0)
- addi d0,a2,1-4
- stw g1,-4(a2)
- stw d0,0(a0)
-
-mark_stack_nodes:
- cmpw 0,a4,a2
- beq end_mark_nodes
-
- lwz a0,0(a2)
- addi a2,a2,4
-
- sub d0,a0,d6
- if SHARE_CHAR_INT
- cmplw 0,d0,d7
- bge- mark_stack_nodes
- endif
-
- srwi o0,d0,5
- lbzx o1,o4,o0
- rlwinm o2,d0,32-2,29,31
- rlwnm. r0,o1,o2,24,24
- bne- mark_stack_nodes2
-
- li d3,0
- li d5,1
-
-mark_arguments:
- lwz d0,0-NODE_POINTER_OFFSET(a0)
- srw o3,g3,o2
-
- or o1,o1,o3
-
- andi. r0,d0,2
- lha d2,-2(d0)
-
- stbx o1,o4,o0
-
- cmpwi 6,d2,0
- beq mark_lazy_node
-
- beq 6,mark_hnf_0
-
- cmplwi 0,d2,256
- addi a0,a0,4
- bge mark_record
-
- subic. d2,d2,2
- beq mark_hnf_2
- blt mark_hnf_1
-
-mark_hnf_3:
- lwz a1,4-NODE_POINTER_OFFSET(a0)
-mark_hnf_3_:
- sub d0,a1,d6
- srwi o0,d0,5
- lbzx o1,o4,o0
- rlwinm o2,d0,32-2,29,31
- srw o3,g3,o2
- and. r0,o1,o3
- bne shared_argument_part
-
- or o1,o1,o3
- stbx o1,o4,o0
-
-no_shared_argument_part:
- lwz o0,0-NODE_POINTER_OFFSET(a0)
- or d3,d3,d5
- ori o0,o0,2
- stw o0,0-NODE_POINTER_OFFSET(a0)
- stwu d3,4-NODE_POINTER_OFFSET(a0)
-
- lwz o0,0-NODE_POINTER_OFFSET(a1)
- slwi d2,d2,2
- ori o0,o0,1
- stw o0,0-NODE_POINTER_OFFSET(a1)
-
- lwzux d2,a1,d2
- li d5,0
- stw a0,0-NODE_POINTER_OFFSET(a1)
- mr d3,a1
- mr a0,d2
- b mark_node
-
-shared_argument_part:
- cmplw 0,a1,a0
- bgt mark_hnf_1
-
- lwz o0,0-NODE_POINTER_OFFSET(a1)
- addi d0,a0,4+2+1
- stw d0,0-NODE_POINTER_OFFSET(a1)
- stw o0,4-NODE_POINTER_OFFSET(a0)
- b mark_hnf_1
-
-mark_lazy_node_1:
-; remove if no selectors:
- bne mark_selector_node_1
-mark_hnf_1:
- lwz d2,0-NODE_POINTER_OFFSET(a0)
- or d3,d3,d5
- stw d3,0-NODE_POINTER_OFFSET(a0)
- mr d3,a0
- li d5,2
- mr a0,d2
- b mark_node
-
-mark_selector_node_1:
- baddicc d2,3
- lwz a1,0-NODE_POINTER_OFFSET(a0)
- beq mark_indirection_node
-
- addic. d2,d2,1
- sub o2,a1,d6
- ble mark_record_selector_node_1
-
- srwi d2,o2,5
- lbzx g1,o4,d2
- rlwinm g2,o2,32-2,29,31
- rlwnm. r0,g1,g2,24,24
- bne mark_hnf_1
-
- lwz d2,0-NODE_POINTER_OFFSET(a1)
- andi. r0,d2,2
- beq mark_hnf_1
-
- lha g1,-2(d2)
- cmplwi 0,g1,2
- ble small_tuple_or_record
-
-large_tuple_or_record:
- lwz d1,8-NODE_POINTER_OFFSET(a1)
-
- sub o2,d1,d6
- srwi d2,o2,5
- lbzx g1,o4,d2
- rlwinm g2,o2,32-2,29,31
- rlwnm. r0,g1,g2,24,24
- bne mark_hnf_1
-
-small_tuple_or_record:
- if LINUX
- lwz g1,-8(d0)
- mflr r0
- else
- lha g1,-6(d0)
- mflr r0
- lwzx g1,rtoc,g1
- endif
- andc o1,o1,o3
-
- lwz g1,4(g1)
- subi d2,a0,4
-
- mtlr g1
- stbx o1,o4,o0
- mr a0,a1
- stwu r0,-4(sp)
- blrl
- mtlr r0
-
- lea g1,__indirection
- stw a0,4-NODE_POINTER_OFFSET(d2)
- stw g1,0-NODE_POINTER_OFFSET(d2)
- b mark_node
-
-mark_record_selector_node_1:
- srwi d2,o2,5
- lbzx g1,o4,d2
- rlwinm g2,o2,32-2,29,31
- beq mark_strict_record_selector_node_1
-
- rlwnm. r0,g1,g2,24,24
- bne mark_hnf_1
-
- lwz d2,0-NODE_POINTER_OFFSET(a1)
- andi. r0,d2,2
- beq mark_hnf_1
-
- lha g1,-2(d2)
- cmplwi 0,g1,258
- ble small_tuple_or_record
- b large_tuple_or_record
-
-mark_strict_record_selector_node_1:
- rlwnm. r0,g1,g2,24,24
- bne mark_hnf_1
-
- lwz d2,0-NODE_POINTER_OFFSET(a1)
- andi. r0,d2,2
- beq mark_hnf_1
-
- lha g1,-2(d2)
- cmplwi 0,g1,258
- ble select_from_small_record
-
- lwz d1,8-NODE_POINTER_OFFSET(a1)
- sub o2,d1,d6
-
- srwi d2,o2,5
- lbzx g1,o4,d2
- rlwinm g2,o2,32-2,29,31
- rlwnm. r0,g1,g2,24,24
- bne mark_hnf_1
-
-select_from_small_record:
- if LINUX
- lwz g1,-8(d0)
- mflr r0
- else
- lha g1,-6(d0)
- mflr r0
- lwzx g1,rtoc,g1
- endif
- subi a0,a0,4
- lwz g1,4(g1)
-
- mtlr g1
- stwu r0,-4(sp)
- blrl
- mtlr r0
-
- b mark_next_node
-
-mark_indirection_node:
- andc o1,o1,o3
- stbx o1,o4,o0
-
- mr a0,a1
- b mark_node
-
-mark_hnf_2:
- lwz o0,0-NODE_POINTER_OFFSET(a0)
- or d3,d3,d5
- ori o0,o0,2
- stw o0,0-NODE_POINTER_OFFSET(a0)
- lwzu d2,4-NODE_POINTER_OFFSET(a0)
- stw d3,0-NODE_POINTER_OFFSET(a0)
- mr d3,a0
- li d5,0
- mr a0,d2
-
-mark_node:
- sub d0,a0,d6
- if SHARE_CHAR_INT
- cmplw 0,d0,d7
- bge- mark_next_node_after_static
- endif
- srwi o0,d0,5
- lbzx o1,o4,o0
- rlwinm o2,d0,32-2,29,31
- rlwnm. r0,o1,o2,24,24
- beq+ mark_arguments
-
-mark_next_node:
- cmpwi 0,d5,0
- bne mark_parent
-
- lwzu d2,-4-NODE_POINTER_OFFSET(d3)
- lwz o0,4-NODE_POINTER_OFFSET(d3)
- andi. d5,d2,3
-
- cmpwi 0,d5,3
- beq argument_part_cycle1
-
- stw o0,0-NODE_POINTER_OFFSET(d3)
-
-c_argument_part_cycle1:
- cmplw 0,a0,d3
- bgt no_reverse_1
-
- lwz o0,0-NODE_POINTER_OFFSET(a0)
- addi d0,d3,4+1
- stw o0,4-NODE_POINTER_OFFSET(d3)
- stw d0,0-NODE_POINTER_OFFSET(a0)
- clrrwi a0,d2,2
- b mark_node
-
-no_reverse_1:
- stw a0,4-NODE_POINTER_OFFSET(d3)
- clrrwi a0,d2,2
- b mark_node
-
-mark_lazy_node:
- beq 6,mark_next_node
-
- bsubicc d2,1
- baddi a0,4
- ble mark_lazy_node_1
-
- cmplwi 0,d2,255
- bge mark_closure_with_unboxed_arguments
-
-mark_closure_with_unboxed_arguments_:
- lwz o0,0-NODE_POINTER_OFFSET(a0)
- slwi d2,d2,2
- ori o0,o0,2
- stw o0,0(a0)
-
- lwzux d2,a0,d2
- or d3,d3,d5
- stw d3,0-NODE_POINTER_OFFSET(a0)
- mr d3,a0
- li d5,0
- mr a0,d2
- b mark_node
-
-mark_closure_with_unboxed_arguments:
-; baddi d2,1
- srwi d0,d2,8
- bandic d2,255
-; bsub d2,d0
- bsubc d2,d0
-; bsubicc d2,1
- bgt mark_closure_with_unboxed_arguments_
- beq mark_hnf_1
- bsubi a0,4
- b mark_next_node
-
-mark_hnf_0:
- if SHARE_CHAR_INT
- cmpw d0,int_reg
- bne no_int_3
-
- lwz d2,4-NODE_POINTER_OFFSET(a0)
- cmplwi 0,d2,33
- bge mark_next_node
-
- andc o1,o1,o3
- stbx o1,o4,o0
-
- lea a0,small_integers
- slwi d2,d2,3
- add a0,a0,d2
- b mark_next_node_after_static
-
-no_int_3:
- cmplw d0,char_reg
- bne no_char_3
-
- andc o1,o1,o3
- stbx o1,o4,o0
-
- lbz d2,7-NODE_POINTER_OFFSET(a0)
- lea a0,static_characters
- slwi d2,d2,3
- add a0,a0,d2
- b mark_next_node_after_static
-
-no_char_3:
- blt no_normal_hnf_0
-
- subi a0,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET
-
- andc o1,o1,o3
- stbx o1,o4,o0
- b mark_next_node_after_static
-
-no_normal_hnf_0:
- endif
-
- lea o0,__ARRAY__2
- cmplw 0,d0,o0
- bne+ mark_next_node
- b mark_array
-
-mark_record:
- subic. d2,d2,258
- beq mark_record_2
- blt mark_record_1
-
-mark_record_3:
- lhz d2,-2+2(d0)
- lwz a1,4-NODE_POINTER_OFFSET(a0)
- subic. d2,d2,1
- blt mark_record_3_bb
-
- beq mark_record_3_ab
-
- subic. d2,d2,1
- beq mark_record_3_aab
-
- b mark_hnf_3_
-
-mark_record_3_bb:
- subi a0,a0,4
-
- sub d0,a1,d6
- setmbit o4,d0,d1,o0,o1,o2,2
-
- cmplw a1,a0
- bgt mark_next_node
-
- srwi. o0,o0,1
-
- lwz o2,0-NODE_POINTER_OFFSET(a1)
- addi d0,a0,8+2+1
- stw o2,8-NODE_POINTER_OFFSET(a0)
- stw d0,0-NODE_POINTER_OFFSET(a1)
-
- bne+ not_next_byte_1
-
- addi d1,d1,1
- lbzx o1,o4,d1
- li o0,128
-not_next_byte_1:
- and. r0,o1,o0
- beq+ not_yet_linked_bb
-
- sub d0,a0,d6
- addi d0,d0,8
- setmbit o4,d0,d1,o0,o1,o2,2
- b mark_next_node
-
-not_yet_linked_bb:
- or o1,o1,o0
- stbx o1,o4,d1
- b mark_next_node
-
-mark_record_3_ab:
- sub d0,a1,d6
- setmbit o4,d0,d1,o0,o1,o2,2
-
- cmplw 0,a1,a0
- bgt mark_hnf_1
-
- srwi. o0,o0,1
-
- lwz o2,0-NODE_POINTER_OFFSET(a1)
- addi d0,a0,4+2+1
- stw o2,4-NODE_POINTER_OFFSET(a0)
- stw d0,0-NODE_POINTER_OFFSET(a1)
-
- bne+ not_next_byte_2
-
- addi d1,d1,1
- lbzx o1,o4,d1
- li o0,128
-not_next_byte_2:
- and. r0,o1,o0
- beq+ not_yet_linked_ab
-
- sub d0,a0,d6
- addi d0,d0,4
- setmbit o4,d0,d1,o0,o1,o2,2
- b mark_hnf_1
-
-not_yet_linked_ab:
- or o1,o1,o0
- stbx o1,o4,d1
- b mark_hnf_1
-
-mark_record_3_aab:
- sub d0,a1,d6
-
- tstmbit o4,d0,d1,o0,o1,o2,2
- bne shared_argument_part
-
- srw o0,g3,o2
- or o1,o1,o0
- stbx o1,o4,d1
-
- lwz o0,0-NODE_POINTER_OFFSET(a0)
- or d3,d3,d5
- ori o0,o0,2
- stw o0,0-NODE_POINTER_OFFSET(a0)
- stwu d3,4-NODE_POINTER_OFFSET(a0)
-
- lwz d2,0-NODE_POINTER_OFFSET(a1)
- li d5,1
- stw a0,0-NODE_POINTER_OFFSET(a1)
- mr d3,a1
- mr a0,d2
- b mark_node
-
-mark_record_2:
- lhz g1,-2+2(d0)
- cmplwi g1,1
- bgt mark_hnf_2
- beq mark_hnf_1
-
- subi a0,a0,4
- b mark_next_node
-
-mark_record_1:
- lhz g1,-2+2(d0)
- tst g1
- bne mark_hnf_1
-
- subi a0,a0,4
- b mark_next_node
-
-mark_array:
- lwz d1,8-NODE_POINTER_OFFSET(a0)
- tst d1
- beq mark_lazy_array
-
- lhz d0,-2(d1)
- tst d0
- beq mark_b_record_array
-
- lhz d1,-2+2(d1)
- tst d1
- beq mark_b_record_array
-
- subi d0,d0,256
- cmpw 0,d0,d1
- beq mark_a_record_array
-
-mark_ab_record_array:
- mr o2,d2
- mr o3,d3
- stw d5,-4(sp)
-
- lwz d2,4-NODE_POINTER_OFFSET(a0)
- addi a0,a0,8
- stw a0,-8(sp)
-
- slwi d2,d2,2
- mullw a1,d2,d0
-
- sub d0,d0,d1
- addi a0,a0,4
- add a1,a1,a0
-
- mflr r0
- stw r0,-12(sp)
- bl reorder
- lwz r0,-12(sp)
-
- lwz a0,-8(sp)
- mtlr r0
-
- lwz d0,-4(a0)
- mullw d0,d0,d1
-
- lwz d5,-4(sp)
- mr d3,o3
- mr d2,o2
- b mark_lr_array
-
-mark_b_record_array:
- sub d0,a0,d6
- addi d0,d0,4
- setmbit o4,d0,d1,o0,o1,o2,2
- b mark_next_node
-
-mark_a_record_array:
- lwz d0,4-NODE_POINTER_OFFSET(a0)
- addi a0,a0,8
- mullw d0,d0,d1
- b mark_lr_array
-
-mark_lazy_array:
- lwz d0,4-NODE_POINTER_OFFSET(a0)
- addi a0,a0,8
-mark_lr_array:
- sub d1,a0,d6
- srwi d1,d1,2
- add d1,d1,d0
- setmbit o4,d1,d2,o0,o1,o2,0
-
- cmplwi 0,d0,1
- ble mark_array_length_0_1
-
- mr a1,a0
- slwi d0,d0,2
- add a0,a0,d0
-
- lwz d2,0-NODE_POINTER_OFFSET(a0)
- lwz o0,0-NODE_POINTER_OFFSET(a1)
- stw d2,0-NODE_POINTER_OFFSET(a1)
- stw o0,0-NODE_POINTER_OFFSET(a0)
-
- lwzu d2,-4-NODE_POINTER_OFFSET(a0)
- lwzu o0,-4-NODE_POINTER_OFFSET(a1)
- addi d2,d2,2
- stw o0,0-NODE_POINTER_OFFSET(a0)
- stw d2,0-NODE_POINTER_OFFSET(a1)
-
- lwzu d2,-4-NODE_POINTER_OFFSET(a0)
- or d3,d3,d5
- stw d3,0-NODE_POINTER_OFFSET(a0)
- mr d3,a0
- li d5,0
- mr a0,d2
- b mark_node
-
-mark_array_length_0_1:
- subi a0,a0,8
- blt mark_next_node
-
- lwz d1,12-NODE_POINTER_OFFSET(a0)
- lwz o0,8-NODE_POINTER_OFFSET(a0)
- lwz o1,4-NODE_POINTER_OFFSET(a0)
- stw o0,12-NODE_POINTER_OFFSET(a0)
- stw o1,8-NODE_POINTER_OFFSET(a0)
- stwu d1,4-NODE_POINTER_OFFSET(a0)
- b mark_hnf_1
-
-
-mark_parent:
- tst d3
- beq mark_stack_nodes2
-
- subic. d5,d5,1
- beq argument_part_parent
-
- cmplw a0,d3
- lwz d2,0-NODE_POINTER_OFFSET(d3)
- bgt no_reverse_2
-
- mr a1,a0
- addi d0,d3,1
- lwz a0,0-NODE_POINTER_OFFSET(a1)
- stw d0,0-NODE_POINTER_OFFSET(a1)
-
-no_reverse_2:
- stw a0,0-NODE_POINTER_OFFSET(d3)
- subi a0,d3,4
- andi. d5,d2,3
- clrrwi d3,d2,2
- b mark_next_node
-
-argument_part_parent:
- mr a1,d3
- mr d3,a0
-
- lwz d2,0-NODE_POINTER_OFFSET(a1)
-
- mr a0,a1
-
-skip_upward_pointers:
- andi. d0,d2,3
- cmpwi 0,d0,3
- bne no_upward_pointer
-
- clrrwi a1,d2,2
- lwz d2,0-NODE_POINTER_OFFSET(a1)
- b skip_upward_pointers
-
-no_upward_pointer:
- cmplw 0,d3,a0
- bgt no_reverse_3
-
- mr a6,d3
- lwz d3,0-NODE_POINTER_OFFSET(d3)
- addi d0,a0,1
- stw d0,0-NODE_POINTER_OFFSET(a6)
-
-no_reverse_3:
- stw d3,0-NODE_POINTER_OFFSET(a1)
-
- clrrwi d3,d2,2
-
- lwzu d2,-4-NODE_POINTER_OFFSET(d3)
-
- cmplw 6,a0,d3
-
- lwz o0,4-NODE_POINTER_OFFSET(d3)
- andi. d5,d2,3
- stw o0,0-NODE_POINTER_OFFSET(d3)
-
- bgt 6,no_reverse_4
-
- lwz o0,0-NODE_POINTER_OFFSET(a0)
- stw o0,4-NODE_POINTER_OFFSET(d3)
- addi d0,d3,4+2+1
- stw d0,0-NODE_POINTER_OFFSET(a0)
- clrrwi a0,d2,2
- b mark_node
-
-no_reverse_4:
- stw a0,4-NODE_POINTER_OFFSET(d3)
- clrrwi a0,d2,2
- b mark_node
-
-argument_part_cycle1:
- mr d1,a1
-
-skip_pointer_list1:
- clrrwi a1,d2,2
- lwz d2,0-NODE_POINTER_OFFSET(a1)
- andi. d5,d2,3
- cmpwi 0,d5,3
- beq skip_pointer_list1
-
- stw o0,0-NODE_POINTER_OFFSET(a1)
- mr a1,d1
- b c_argument_part_cycle1
-
- if SHARE_CHAR_INT
-mark_next_node_after_static:
- cmpwi 0,d5,0
- bne mark_parent_after_static
-
- lwzu d2,-4-NODE_POINTER_OFFSET(d3)
- lwz o0,4-NODE_POINTER_OFFSET(d3)
- andi. d5,d2,3
-
- cmpwi 0,d5,3
- beq argument_part_cycle2
-
- stw o0,0-NODE_POINTER_OFFSET(d3)
-
-c_argument_part_cycle2:
- stw a0,4-NODE_POINTER_OFFSET(d3)
- clrrwi a0,d2,2
- b mark_node
-
-mark_parent_after_static:
- cmpwi 0,d3,0
- beq mark_stack_nodes3
-
- subic. d5,d5,1
- beq argument_part_parent_after_static
-
- lwz d2,0-NODE_POINTER_OFFSET(d3)
- stw a0,0-NODE_POINTER_OFFSET(d3)
- subi a0,d3,4
- andi. d5,d2,3
- clrrwi d3,d2,2
- b mark_next_node
-
-argument_part_parent_after_static:
- mr a1,d3
- mr d3,a0
-
- lwz d2,0-NODE_POINTER_OFFSET(a1)
-
- mr a0,a1
-
-skip_upward_pointers_2:
- andi. d0,d2,3
- cmpwi 0,d0,3
- bne no_reverse_3
-
- clrrwi a1,d2,2
- lwz d2,0-NODE_POINTER_OFFSET(a1)
- b skip_upward_pointers_2
-
-argument_part_cycle2:
- mr d1,a1
-
-skip_pointer_list2:
- clrrwi a1,d2,2
- lwz d2,0-NODE_POINTER_OFFSET(a1)
- andi. d5,d2,3
- cmpwi 0,d5,3
- beq skip_pointer_list2
-
- stw o0,0-NODE_POINTER_OFFSET(a1)
- mr a1,d1
- b c_argument_part_cycle2
- endif
-
-end_mark_nodes:
- addi a2,a2,4
- blr
-
+ include 'pcompact_rmark.a'
+ include 'pcompact_rmarkr.a'
; compact the heap
@@ -897,7 +139,10 @@ finalizer_list_empty:
stwu a4,-4(sp)
addi a4,a2,4
- bl mark_stack_nodes
+
+ mr a3,a2
+ bl rmark_stack_nodes
+
lwz a4,0(sp)
addi sp,sp,4