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 a2,8-NODE_POINTER_OFFSET(a1) sub o2,a2,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 if NEW_DESCRIPTORS if LINUX lwz d0,-8(d0) else lha d0,-6(d0) endif andc o1,o1,o3 lea g1,__indirection if ! LINUX lwzx d0,rtoc,d0 endif stbx o1,o4,o0 lhz d0,4(d0) stw g1,-4-NODE_POINTER_OFFSET(a0) subi d2,a0,4 cmplwi 0,d0,8 blt rmark_tuple_or_record_selector_node_2 beq rmark_tuple_selector_node_2 rmark_tuple_or_record_selector_node_g2: addi a0,a2,-12 lwzx a0,a0,d0 stw a0,0(a3) stw a0,4-NODE_POINTER_OFFSET(d2) b rmark_node_d1 rmark_tuple_selector_node_2: lwz a0,0(a2) stw a0,0(a3) stw a0,4-NODE_POINTER_OFFSET(d2) b rmark_node_d1 else 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 endif 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 if NEW_DESCRIPTORS lwz a2,8-NODE_POINTER_OFFSET(a1) sub o2,a2,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 d0,-8(d0) else lha d0,-6(d0) endif andc o1,o1,o3 lea g1,__indirection if ! LINUX lwzx d0,rtoc,d0 endif stbx o1,o4,o0 lhz d0,4(d0) stw g1,-4-NODE_POINTER_OFFSET(a0) subi d2,a0,4 cmplwi 0,d0,8 bgt rmark_tuple_or_record_selector_node_g2 rmark_tuple_or_record_selector_node_2: lwzx a0,a1,d0 stw a0,0(a3) stw a0,4-NODE_POINTER_OFFSET(d2) b rmark_node_d1 else b rmark_large_tuple_or_record endif 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 a2,8-NODE_POINTER_OFFSET(a1) sub o2,a2,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) else lha g1,-6(d0) endif if ! NEW_DESCRIPTORS if LINUX mflr r0 else mflr r0 lwzx g1,rtoc,g1 endif endif subi a0,a0,4 if NEW_DESCRIPTORS if ! LINUX lwzx g1,rtoc,g1 endif endif cmplw a0,d1 bgt rmark_selector_pointer_not_reversed if NEW_DESCRIPTORS lhz d0,4(g1) cmplwi 0,d0,8 ble rmark_strict_record_selector_node_2 addi d0,d0,-12 lwzx d0,a2,d0 b rmark_strict_record_selector_node_3 rmark_strict_record_selector_node_2: lwzx d0,a1,d0 rmark_strict_record_selector_node_3: stw d0,4-NODE_POINTER_OFFSET(a0) lhz d0,6(g1) tst d0 beq rmark_strict_record_selector_node_5 cmplwi 0,d0,8 ble rmark_strict_record_selector_node_4 mr a1,a2 addi d0,d0,-12 rmark_strict_record_selector_node_4: lwzx d0,a1,d0 stw d0,8-NODE_POINTER_OFFSET(a0) rmark_strict_record_selector_node_5: lwz d0,-4(g1) else 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) endif addi a3,a3,1 stw a3,0(a0) stw d0,-1(a3) b rmark_next_node rmark_selector_pointer_not_reversed: if NEW_DESCRIPTORS lhz d0,4(g1) cmplwi 0,d0,8 ble rmark_strict_record_selector_node_6 addi d0,d0,-12 lwzx d0,a2,d0 b rmark_strict_record_selector_node_7 rmark_strict_record_selector_node_6: lwzx d0,a1,d0 rmark_strict_record_selector_node_7: stw d0,4-NODE_POINTER_OFFSET(a0) lhz d0,6(g1) tst d0 beq rmark_strict_record_selector_node_9 cmplwi 0,d0,8 ble rmark_strict_record_selector_node_8 mr a1,a2 addi d0,d0,-12 rmark_strict_record_selector_node_8: lwzx d0,a1,d0 stw d0,8-NODE_POINTER_OFFSET(a0) rmark_strict_record_selector_node_9: lwz d0,-4(g1) stw d0,0-NODE_POINTER_OFFSET(a0) else lwz g1,4(g1) mtctr g1 stwu r0,-4(sp) bctrl mtlr r0 endif 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 rmark_next_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