summaryrefslogtreecommitdiff
path: root/pcompact_rmark.a
diff options
context:
space:
mode:
Diffstat (limited to 'pcompact_rmark.a')
-rw-r--r--pcompact_rmark.a835
1 files changed, 835 insertions, 0 deletions
diff --git a/pcompact_rmark.a b/pcompact_rmark.a
new file mode 100644
index 0000000..3ce30ee
--- /dev/null
+++ b/pcompact_rmark.a
@@ -0,0 +1,835 @@
+
+rmark_stack_nodes:
+ mflr r0
+ stwu r0,-4(sp)
+ b rmark_stack_nodes_
+
+rmark_stack_nodes1:
+ lwz d1,0(a0)
+ addi d0,a3,1
+ stw d1,0(a3)
+ stw d0,0(a0)
+
+rmark_next_stack_node:
+ addi a3,a3,4
+ cmpw 0,a4,a3
+ beq end_rmark_nodes
+
+rmark_stack_nodes_:
+ lwz a0,0(a3)
+
+ sub d0,a0,d6
+ cmplw 0,d0,d7
+ bge- rmark_next_stack_node
+
+ srwi o0,d0,5
+ lbzx o1,o4,o0
+ rlwinm o2,d0,32-2,29,31
+ rlwnm. r0,o1,o2,24,24
+ bne- rmark_stack_nodes1
+
+ srw o3,g3,o2
+
+ lwz d0,0(a0)
+ li g1,0
+ stw a3,-4(sp)
+
+ or o1,o1,o3
+
+ addi a2,a3,1
+ stw d0,0(a3)
+
+ stbx o1,o4,o0
+
+ li d1,-1
+ stwu g1,-8(sp)
+ stw a2,0(a0)
+ bl rmark_no_reverse
+
+ addi a3,a3,4
+ cmpw 0,a4,a3
+ bne rmark_stack_nodes_
+
+end_rmark_nodes:
+ lwz r0,0(sp)
+ addi sp,sp,4
+ mtlr r0
+ blr
+
+rmark_node_d1:
+ sub d0,a0,d6
+ cmplw 0,d0,d7
+ bge- rmark_next_node
+
+ b rmark_node_
+
+rmark_hnf_2:
+ addi d1,a0,4
+ lwz d0,4(a0)
+
+ cmplw 0,sp,d4
+
+ mr a3,a0
+ lwz a0,0(a0)
+
+ stw d1,-4(sp)
+ stwu d0,-8(sp)
+
+ blt rmark_using_reversal
+
+rmark_node:
+ sub d0,a0,d6
+ cmplw 0,d0,d7
+ bge- rmark_next_node
+
+ mr d1,a3
+
+rmark_node_:
+ srwi o0,d0,5
+ lbzx o1,o4,o0
+ rlwinm o2,d0,32-2,29,31
+ rlwnm. r0,o1,o2,24,24
+ bne rmark_reverse_and_mark_next_node
+
+ srw o3,g3,o2
+ or o1,o1,o3
+
+ lwz d0,0(a0)
+
+ stbx o1,o4,o0
+
+rmark_arguments:
+ cmplw 0,a0,d1
+ bgt rmark_no_reverse
+
+ addi a2,a3,1
+ stw d0,0(a3)
+ stw a2,0(a0)
+
+rmark_no_reverse:
+ andi. r0,d0,2
+ lha d2,-2(d0)
+
+ cmpwi 6,d2,0
+ beq rmark_lazy_node
+
+ beq 6,rmark_hnf_0
+
+ cmplwi 0,d2,256
+ addi a0,a0,4
+ bge rmark_record
+
+ subic. d2,d2,2
+ beq rmark_hnf_2
+ blt rmark_hnf_1
+
+rmark_hnf_3:
+ lwz a1,4-NODE_POINTER_OFFSET(a0)
+rmark_hnf_3_:
+ cmplw 0,sp,d4
+ blt rmark_using_reversal_
+
+ 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 rmark_shared_argument_part
+
+ or o1,o1,o3
+ stbx o1,o4,o0
+
+rmark_no_shared_argument_part:
+ slwi d1,d2,2
+ stw a0,-4(sp)
+ addi a3,a0,4
+ lwz a0,0(a0)
+ add a1,a1,d1
+ stwu a0,-8(sp)
+
+rmark_push_hnf_args:
+ bsubicc d2,1
+
+ lwz d1,0(a1)
+ stw a1,-4(sp)
+ bsubi a1,4
+ stwu d1,-8(sp)
+
+ bgt rmark_push_hnf_args
+
+ lwz a0,0(a1)
+ cmplw a1,a3
+ bgt rmark_no_reverse_argument_pointer
+
+ addi a2,a3,3
+ stw a0,0(a3)
+ stw a2,0(a1)
+
+ sub d0,a0,d6
+ cmplw 0,d0,d7
+ bge- rmark_next_node
+
+ mr d1,a1
+ b rmark_node_
+
+rmark_no_reverse_argument_pointer:
+ mr a3,a1
+ b rmark_node
+
+rmark_shared_argument_part:
+ cmplw 0,a1,a0
+ bgt rmark_hnf_1
+
+ lwz d1,0-NODE_POINTER_OFFSET(a1)
+ addi d0,a0,4+2+1
+ stw d0,0-NODE_POINTER_OFFSET(a1)
+ stw d1,4-NODE_POINTER_OFFSET(a0)
+ b rmark_hnf_1
+
+rmark_record:
+ subic. d2,d2,258
+ beq rmark_record_2
+ blt rmark_record_1
+
+rmark_record_3:
+ lhz d2,-2+2(d0)
+ lwz a1,4-NODE_POINTER_OFFSET(a0)
+ subic. d2,d2,1
+ blt rmark_record_3_bb
+
+ beq rmark_record_3_ab
+
+ subic. d2,d2,1
+ beq rmark_record_3_aab
+
+ b rmark_hnf_3_
+
+rmark_record_3_bb:
+ subi a0,a0,4
+
+ sub d0,a1,d6
+ setmbit o4,d0,o0,o3,o1,o2,2
+
+ cmplw a1,a0
+ bgt rmark_next_node
+
+ srwi. o3,o3,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+ rmark_not_next_byte_1
+
+ addi o0,o0,1
+ lbzx o1,o4,o0
+ li o3,128
+rmark_not_next_byte_1:
+ and. r0,o1,o3
+ beq+ rmark_not_yet_linked_bb
+
+ sub d0,a0,d6
+ addi d0,d0,8
+ setmbit o4,d0,o0,o3,o1,o2,2
+ b rmark_next_node
+
+rmark_not_yet_linked_bb:
+ or o1,o1,o3
+ stbx o1,o4,o0
+ b rmark_next_node
+
+rmark_record_3_ab:
+ sub d0,a1,d6
+ setmbit o4,d0,o0,o3,o1,o2,2
+
+ cmplw 0,a1,a0
+ bgt rmark_hnf_1
+
+ srwi. o3,o3,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+ rmark_not_next_byte_2
+
+ addi o0,o0,1
+ lbzx o1,o4,o0
+ li o3,128
+rmark_not_next_byte_2:
+ and. r0,o1,o3
+ beq+ rmark_not_yet_linked_ab
+
+ sub d0,a0,d6
+ addi d0,d0,4
+ setmbit o4,d0,o0,o3,o1,o2,2
+ b rmark_hnf_1
+
+rmark_not_yet_linked_ab:
+ or o1,o1,o3
+ stbx o1,o4,o0
+ b rmark_hnf_1
+
+rmark_record_3_aab:
+ cmplw 0,sp,d4
+ blt rmark_using_reversal_
+
+ sub d0,a1,d6
+
+ tstmbit o4,d0,o0,o3,o1,o2,2
+ bne rmark_shared_argument_part
+
+ stw a0,-4(sp)
+
+ srw o3,g3,o2
+
+ addi a3,a0,4
+ lwz a0,0(a0)
+
+ or o1,o1,o3
+ stbx o1,o4,o0
+
+ stwu a0,-8(sp)
+
+ lwz a0,0(a1)
+ cmplw a1,a3
+ bgt rmark_no_reverse_argument_pointer
+
+ addi a2,a3,3
+ stw a0,0(a3)
+ stw a2,0(a1)
+
+ sub d0,a0,d6
+ cmplw 0,d0,d7
+ bge- rmark_next_node
+
+ mr d1,a1
+ b rmark_node_
+
+rmark_record_2:
+ lhz g1,-2+2(d0)
+ cmplwi g1,1
+ bgt rmark_hnf_2
+ beq rmark_hnf_1
+ b rmark_next_node
+
+rmark_record_1:
+ lhz g1,-2+2(d0)
+ tst g1
+ bne rmark_hnf_1
+ b rmark_next_node
+
+rmark_lazy_node_1:
+ bne rmark_selector_node_1
+
+rmark_hnf_1:
+ mr a3,a0
+ lwz a0,0-NODE_POINTER_OFFSET(a0)
+ b rmark_node
+
+rmark_indirection_node:
+ subi g1,a0,4
+ andc o1,o1,o3
+ mr a0,a1
+
+ cmplw g1,d1
+
+ stbx o1,o4,o0
+ stw a1,0(a3)
+
+ bgt rmark_node_d1
+ stw d0,0(g1)
+ b rmark_node_d1
+
+rmark_selector_node_1:
+ baddicc d2,3
+ lwz a1,0-NODE_POINTER_OFFSET(a0)
+ beq rmark_indirection_node
+
+ addic. d2,d2,1
+ sub o2,a1,d6
+ ble rmark_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 rmark_hnf_1
+
+ lwz d2,0-NODE_POINTER_OFFSET(a1)
+ andi. r0,d2,2
+ beq rmark_hnf_1
+
+ lha g1,-2(d2)
+ cmplwi 0,g1,2
+ ble rmark_small_tuple_or_record
+
+rmark_large_tuple_or_record:
+ lwz o2,8-NODE_POINTER_OFFSET(a1)
+ sub o2,o2,d6
+
+ srwi d2,o2,5
+ lbzx g1,o4,d2
+ rlwinm g2,o2,32-2,29,31
+ rlwnm. r0,g1,g2,24,24
+ bne rmark_hnf_1
+
+rmark_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
+
+ stbx o1,o4,o0
+ mtctr g1
+ mr a0,a1
+ mr d3,d1
+ stw a3,-4(sp)
+ stwu r0,-8(sp)
+ bctrl
+ lwz a3,0(sp)
+ addi sp,sp,4
+ mtlr r0
+ mr d1,d3
+
+ lea g1,__indirection
+ stw a0,0(a3)
+
+ stw a0,4-NODE_POINTER_OFFSET(d2)
+ stw g1,0-NODE_POINTER_OFFSET(d2)
+ b rmark_node_d1
+
+rmark_record_selector_node_1:
+ srwi d2,o2,5
+ lbzx g1,o4,d2
+ rlwinm g2,o2,32-2,29,31
+ beq rmark_strict_record_selector_node_1
+
+ rlwnm. r0,g1,g2,24,24
+ bne rmark_hnf_1
+
+ lwz d2,0-NODE_POINTER_OFFSET(a1)
+ andi. r0,d2,2
+ beq rmark_hnf_1
+
+ lha g1,-2(d2)
+ cmplwi 0,g1,258
+ ble rmark_small_tuple_or_record
+ b rmark_large_tuple_or_record
+
+rmark_strict_record_selector_node_1:
+ rlwnm. r0,g1,g2,24,24
+ bne rmark_hnf_1
+
+ lwz d2,0-NODE_POINTER_OFFSET(a1)
+ andi. r0,d2,2
+ beq rmark_hnf_1
+
+ lha g1,-2(d2)
+ cmplwi 0,g1,258
+ ble rmark_select_from_small_record
+
+ lwz o2,8-NODE_POINTER_OFFSET(a1)
+ sub o2,o2,d6
+
+ srwi d2,o2,5
+ lbzx g1,o4,d2
+ rlwinm g2,o2,32-2,29,31
+ rlwnm. r0,g1,g2,24,24
+ bne rmark_hnf_1
+
+rmark_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
+
+ cmplw a0,d1
+ bgt rmark_selector_pointer_not_reversed
+
+ stw d0,0(a0)
+
+ lwz g1,4(g1)
+
+ stw a0,0(a3)
+
+ mtctr g1
+ stw a3,-4(sp)
+ stwu r0,-8(sp)
+ bctrl
+ lwz a3,0(sp)
+ addi sp,sp,4
+ mtlr r0
+
+ lwz d0,0(a0)
+ addi a3,a3,1
+ stw a3,0(a0)
+ stw d0,-1(a3)
+ b rmark_next_node
+
+rmark_selector_pointer_not_reversed:
+ lwz g1,4(g1)
+
+ mtctr g1
+ stwu r0,-4(sp)
+ bctrl
+ mtlr r0
+
+ b rmark_next_node
+
+rmark_reverse_and_mark_next_node:
+ cmplw a0,d1
+ bgt rmark_next_node
+
+ lwz d0,0(a0)
+ stw d0,0(a3)
+ addi a3,a3,1
+ stw a3,0(a0)
+
+rmark_next_node:
+ lwz a0,0(sp)
+ lwz a3,4(sp)
+ addi sp,sp,8
+
+ cmplwi a0,1
+ bgt rmark_node
+
+ blr
+
+rmark_lazy_node:
+ beq 6,rmark_next_node
+
+ bsubicc d2,1
+ baddi a0,4
+ ble rmark_lazy_node_1
+
+ cmplwi 0,d2,255
+ bge rmark_closure_with_unboxed_arguments
+
+rmark_closure_with_unboxed_arguments_:
+ slwi d1,d2,2
+ add a0,a0,d1
+
+rmark_push_lazy_args
+ bsubicc d2,1
+
+ lwz d1,0(a0)
+ stw a0,-4(sp)
+ bsubi a0,4
+ stwu d1,-8(sp)
+
+ bgt rmark_push_lazy_args
+
+ cmplw 0,sp,d4
+
+ mr a3,a0
+ lwz a0,0(a0)
+
+ bge rmark_node
+ b rmark_using_reversal
+
+rmark_closure_with_unboxed_arguments:
+; baddi d2,1
+ srwi d0,d2,8
+ bandic d2,255
+; bsub d2,d0
+ bsubc d2,d0
+; bsubicc d2,1
+ bgt rmark_closure_with_unboxed_arguments_
+ beq rmark_hnf_1
+ b rmark_next_node
+
+rmark_hnf_0:
+ cmpw d0,int_reg
+ beq rmark_int
+
+ cmplw d0,char_reg
+ beq rmark_char
+ blt rmark_no_normal_hnf_0
+
+ cmplw a0,d1
+
+ andc o1,o1,o3
+ subi a1,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET
+ stbx o1,o4,o0
+ stw a1,0(a3)
+
+ bgt rmark_next_node
+ stw d0,0(a0)
+ b rmark_next_node
+
+rmark_int:
+ lwz d2,4-NODE_POINTER_OFFSET(a0)
+ cmplwi 0,d2,33
+ bge rmark_next_node
+
+ lea a1,small_integers
+ andc o1,o1,o3
+ slwi d2,d2,3
+
+ stbx o1,o4,o0
+ add a1,a1,d2
+
+ cmplw a0,d1
+
+ stw a1,0(a3)
+
+ bgt rmark_next_node
+ stw d0,0(a0)
+ b rmark_next_node
+
+rmark_char:
+ andc o1,o1,o3
+ lbz d2,7-NODE_POINTER_OFFSET(a0)
+
+ lea a1,static_characters
+ stbx o1,o4,o0
+ slwi d2,d2,3
+
+ add a1,a1,d2
+
+ cmplw a0,d1
+
+ stw a1,0(a3)
+
+ bgt rmark_next_node
+ stw d0,0(a0)
+ b rmark_next_node
+
+rmark_no_normal_hnf_0:
+ lea g0,__ARRAY__2
+ cmplw 0,d0,g0
+ bne+ rmark_next_node
+
+rmark_array:
+ lwz g1,8-NODE_POINTER_OFFSET(a0)
+ tst g1
+ beq rmark_lazy_array
+
+ lhz d0,-2(g1)
+ tst d0
+ beq rmark_b_array
+
+ lhz g1,-2+2(g1)
+ subi d0,d0,256
+ tst g1
+ beq rmark_b_array
+
+ cmplw 0,sp,d4
+ blt rmark_array_using_reversal
+
+ cmpw 0,d0,g1
+ mr d1,g1
+ beq rmark_a_record_array
+
+rmark_ab_record_array:
+ mr o2,d2
+ mr o3,d3
+
+ lwz d2,4-NODE_POINTER_OFFSET(a0)
+ addi a0,a0,8
+ stw a0,-4(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,-8(sp)
+ bl reorder2
+ lwz r0,-8(sp)
+ lwz a0,-4(sp)
+ mtlr r0
+
+ lwz d0,-4(a0)
+ mullw d0,d0,d1
+
+ mr d3,o3
+ mr d2,o2
+ b rmark_lr_array
+
+rmark_b_array:
+ sub d0,a0,d6
+ addi d0,d0,4
+ setmbit o4,d0,o0,o3,o1,o2,2
+ b rmark_next_node
+
+rmark_a_record_array:
+ lwz d0,4-NODE_POINTER_OFFSET(a0)
+ addi a0,a0,8
+ mullw d0,d0,d1
+ b rmark_lr_array
+
+rmark_lazy_array:
+ cmplw 0,sp,d4
+ blt rmark_array_using_reversal
+
+ lwz d0,4-NODE_POINTER_OFFSET(a0)
+ addi a0,a0,8
+rmark_lr_array:
+ sub d1,a0,d6
+ srwi d1,d1,2
+ add d1,d1,d0
+ setmbit o4,d1,o0,o3,o1,o2,0
+
+ cmplwi 0,d0,1
+ ble rmark_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)
+ stw o0,0-NODE_POINTER_OFFSET(a0)
+ stw d2,0-NODE_POINTER_OFFSET(a1)
+
+ mflr r0
+ if 0
+ stw a4,-4(sp)
+ mr a4,a0
+ else
+ stw a0,-4(sp)
+ endif
+ mr a3,a1
+ stwu r0,-8(sp)
+ b rmark_array_nodes_
+
+rmark_array_nodes1:
+ cmplw 0,a0,a3
+ bgt rmark_next_array_node
+
+ lwz d1,0(a0)
+ addi d0,a3,1
+ stw d1,0(a3)
+ stw d0,0(a0)
+
+rmark_next_array_node:
+ if 0
+ addi a3,a3,4
+ cmpw 0,a4,a3
+ else
+ lwz d0,4(sp)
+ addi a3,a3,4
+ cmpw 0,d0,a3
+ endif
+ beq end_rmark_array_nodes
+
+rmark_array_nodes_:
+ lwz a0,0(a3)
+
+ sub d0,a0,d6
+ cmplw 0,d0,d7
+ bge- rmark_next_array_node
+
+ srwi o0,d0,5
+ lbzx o1,o4,o0
+ rlwinm o2,d0,32-2,29,31
+ rlwnm. r0,o1,o2,24,24
+ bne- rmark_array_nodes1
+
+ srw o3,g3,o2
+
+ lwz d0,0(a0)
+ li g1,1
+ stw a3,-4(sp)
+
+ or o1,o1,o3
+
+ stwu g1,-8(sp)
+
+ stbx o1,o4,o0
+
+ mr d1,a3
+ bl rmark_arguments
+
+ if 0
+ addi a3,a3,4
+ cmpw 0,a4,a3
+ else
+ lwz d0,4(sp)
+ addi a3,a3,4
+ cmpw 0,d0,a3
+ endif
+ bne rmark_array_nodes_
+
+end_rmark_array_nodes:
+ lwz r0,0(sp)
+ if 0
+ lwz a4,4(sp)
+ endif
+ addi sp,sp,8
+ mtlr r0
+ b rmark_next_node
+
+rmark_array_length_0_1:
+ subi a0,a0,8
+ blt rmark_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 rmark_hnf_1
+
+reorder2:
+ mr d2,d0
+ mr d3,d1
+ slwi g0,d0,2
+ slwi g1,d1,2
+ add a0,a0,g1
+ sub a1,a1,g0
+ b st_reorder_lp2
+
+reorder_lp2:
+ lwzu o0,-4(a1)
+ subic. d2,d2,1
+
+ lwz o1,0(a0)
+ stw o0,0(a0)
+ addi a0,a0,4
+
+ bne+ next_b_in_element2
+ mr d2,d0
+ add a0,a0,g1
+next_b_in_element2:
+
+ subic. d3,d3,1
+ stw o1,0(a1)
+
+ bne+ next_a_in_element2
+ mr d3,d1
+ sub a1,a1,g0
+next_a_in_element2:
+
+st_reorder_lp2:
+ cmplw 1,a1,a0
+ bgt 1,reorder_lp2
+
+ blr