diff options
Diffstat (limited to 'pcompact_rmark.a')
-rw-r--r-- | pcompact_rmark.a | 835 |
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 |