rmark_using_reversal: stw a3,-4(sp) li d3,0 li d5,1 stwu a3,-8(sp) b rmarkr_node rmark_using_reversal_: subi a0,a0,4 stw d1,-4(sp) cmplw 0,a0,d1 stwu a3,-8(sp) bgt rmark_no_undo_reverse_1 stw a0,0(a3) stw d0,0(a0) rmark_no_undo_reverse_1: li d3,0 li d5,1 b rmarkr_arguments rmark_array_using_reversal: stw d1,-4(sp) cmplw 0,a0,d1 stwu a3,-8(sp) bgt rmark_no_undo_reverse_2 lea d0,__ARRAY__2 stw a0,0(a3) stw d0,0(a0) rmark_no_undo_reverse_2: li d3,0 li d5,1 b rmarkr_arguments rmarkr_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 rmarkr_node: sub d0,a0,d6 cmplw 0,d0,d7 bge- rmarkr_next_node_after_static srwi o0,d0,5 lbzx o1,o4,o0 rlwinm o2,d0,32-2,29,31 rlwnm. r0,o1,o2,24,24 bne rmarkr_next_node rmarkr_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 rmarkr_lazy_node beq 6,rmarkr_hnf_0 cmplwi 0,d2,256 addi a0,a0,4 bge rmarkr_record subic. d2,d2,2 beq rmarkr_hnf_2 blt rmarkr_hnf_1 rmarkr_hnf_3: lwz a1,4-NODE_POINTER_OFFSET(a0) rmarkr_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 rmarkr_shared_argument_part or o1,o1,o3 stbx o1,o4,o0 rmarkr_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 rmarkr_node rmarkr_shared_argument_part: cmplw 0,a1,a0 bgt rmarkr_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 rmarkr_hnf_1 rmarkr_lazy_node_1: bne rmarkr_selector_node_1 rmarkr_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 rmarkr_node rmarkr_selector_node_1: baddicc d2,3 lwz a1,0-NODE_POINTER_OFFSET(a0) beq rmarkr_indirection_node addic. d2,d2,1 sub o2,a1,d6 ble rmarkr_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 rmarkr_hnf_1 lwz d2,0-NODE_POINTER_OFFSET(a1) andi. r0,d2,2 beq rmarkr_hnf_1 lha g1,-2(d2) cmplwi 0,g1,2 ble rmarkr_small_tuple_or_record rmarkr_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 rmarkr_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 rmarkr_tuple_or_record_selector_node_2 beq rmarkr_tuple_selector_node_2 rmarkr_tuple_or_record_selector_node_g2: addi a0,a2,-12 lwzx a0,a0,d0 stw a0,4-NODE_POINTER_OFFSET(d2) b rmarkr_node rmarkr_tuple_selector_node_2: lwz a0,0(a2) stw a0,4-NODE_POINTER_OFFSET(d2) b rmarkr_node else rmarkr_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 rmarkr_node endif rmarkr_record_selector_node_1: srwi d2,o2,5 lbzx g1,o4,d2 rlwinm g2,o2,32-2,29,31 beq rmarkr_strict_record_selector_node_1 rlwnm. r0,g1,g2,24,24 bne rmarkr_hnf_1 lwz d2,0-NODE_POINTER_OFFSET(a1) andi. r0,d2,2 beq rmarkr_hnf_1 lha g1,-2(d2) cmplwi 0,g1,258 ble rmarkr_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 rmarkr_hnf_1 rmarkr_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 rmarkr_tuple_or_record_selector_node_g2 rmarkr_tuple_or_record_selector_node_2: lwzx a0,a1,d0 stw a0,4-NODE_POINTER_OFFSET(d2) b rmarkr_node else b rmarkr_large_tuple_or_record endif rmarkr_strict_record_selector_node_1: rlwnm. r0,g1,g2,24,24 bne rmarkr_hnf_1 lwz d2,0-NODE_POINTER_OFFSET(a1) andi. r0,d2,2 beq rmarkr_hnf_1 lha g1,-2(d2) cmplwi 0,g1,258 ble rmarkr_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 rmarkr_hnf_1 rmarkr_select_from_small_record: if NEW_DESCRIPTORS if LINUX lwz g1,-8(d0) else lha g1,-6(d0) endif subi a0,a0,4 if ! LINUX lwzx g1,rtoc,g1 endif lhz d0,4(g1) cmplwi 0,d0,8 ble rmarkr_strict_record_selector_node_2 addi d0,d0,-12 lwzx d0,a2,d0 b rmarkr_strict_record_selector_node_3 rmarkr_strict_record_selector_node_2: lwzx d0,a1,d0 rmarkr_strict_record_selector_node_3: stw d0,4-NODE_POINTER_OFFSET(a0) lhz d0,6(g1) tst d0 beq rmarkr_strict_record_selector_node_5 cmplwi 0,d0,8 ble rmarkr_strict_record_selector_node_4 mr a1,a2 addi d0,d0,-12 rmarkr_strict_record_selector_node_4: lwzx d0,a1,d0 stw d0,8-NODE_POINTER_OFFSET(a0) rmarkr_strict_record_selector_node_5: lwz d0,-4(g1) stw d0,0-NODE_POINTER_OFFSET(a0) else 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 endif b rmarkr_next_node rmarkr_indirection_node: andc o1,o1,o3 stbx o1,o4,o0 mr a0,a1 b rmarkr_node rmarkr_next_node: cmpwi 0,d5,0 bne rmarkr_parent lwzu d2,-4-NODE_POINTER_OFFSET(d3) lwz o0,4-NODE_POINTER_OFFSET(d3) andi. d5,d2,3 cmpwi 0,d5,3 beq rmarkr_argument_part_cycle1 stw o0,0-NODE_POINTER_OFFSET(d3) rmarkr_c_argument_part_cycle1: cmplw 0,a0,d3 bgt rmarkr_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 rmarkr_node rmarkr_no_reverse_1: stw a0,4-NODE_POINTER_OFFSET(d3) clrrwi a0,d2,2 b rmarkr_node rmarkr_lazy_node: beq 6,rmarkr_next_node bsubicc d2,1 baddi a0,4 ble rmarkr_lazy_node_1 cmplwi 0,d2,255 bge rmarkr_closure_with_unboxed_arguments rmarkr_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 rmarkr_node rmarkr_closure_with_unboxed_arguments: ; baddi d2,1 srwi d0,d2,8 bandic d2,255 ; bsub d2,d0 bsubc d2,d0 ; bsubicc d2,1 bgt rmarkr_closure_with_unboxed_arguments_ beq rmarkr_hnf_1 bsubi a0,4 b rmarkr_next_node rmarkr_hnf_0: cmpw d0,int_reg bne rmarkr_no_int_3 lwz d2,4-NODE_POINTER_OFFSET(a0) cmplwi 0,d2,33 bge rmarkr_next_node andc o1,o1,o3 stbx o1,o4,o0 lea a0,small_integers slwi d2,d2,3 add a0,a0,d2 b rmarkr_next_node_after_static rmarkr_no_int_3: cmplw d0,char_reg bne rmarkr_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 rmarkr_next_node_after_static rmarkr_no_char_3: blt rmarkr_no_normal_hnf_0 subi a0,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET andc o1,o1,o3 stbx o1,o4,o0 b rmarkr_next_node_after_static rmarkr_no_normal_hnf_0: lea o0,__ARRAY__2 cmplw 0,d0,o0 bne+ rmarkr_next_node b rmarkr_array rmarkr_record: subic. d2,d2,258 beq rmarkr_record_2 blt rmarkr_record_1 rmarkr_record_3: lhz d2,-2+2(d0) lwz a1,4-NODE_POINTER_OFFSET(a0) subic. d2,d2,1 blt rmarkr_record_3_bb beq rmarkr_record_3_ab subic. d2,d2,1 beq rmarkr_record_3_aab b rmarkr_hnf_3_ rmarkr_record_3_bb: subi a0,a0,4 sub d0,a1,d6 setmbit o4,d0,d1,o0,o1,o2,2 cmplw a1,a0 bgt rmarkr_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+ rmarkr_not_next_byte_1 addi d1,d1,1 lbzx o1,o4,d1 li o0,128 rmarkr_not_next_byte_1: and. r0,o1,o0 beq+ rmarkr_not_yet_linked_bb sub d0,a0,d6 addi d0,d0,8 setmbit o4,d0,d1,o0,o1,o2,2 b rmarkr_next_node rmarkr_not_yet_linked_bb: or o1,o1,o0 stbx o1,o4,d1 b rmarkr_next_node rmarkr_record_3_ab: sub d0,a1,d6 setmbit o4,d0,d1,o0,o1,o2,2 cmplw 0,a1,a0 bgt rmarkr_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+ rmarkr_not_next_byte_2 addi d1,d1,1 lbzx o1,o4,d1 li o0,128 rmarkr_not_next_byte_2: and. r0,o1,o0 beq+ rmarkr_not_yet_linked_ab sub d0,a0,d6 addi d0,d0,4 setmbit o4,d0,d1,o0,o1,o2,2 b rmarkr_hnf_1 rmarkr_not_yet_linked_ab: or o1,o1,o0 stbx o1,o4,d1 b rmarkr_hnf_1 rmarkr_record_3_aab: sub d0,a1,d6 tstmbit o4,d0,d1,o0,o1,o2,2 bne rmarkr_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 rmarkr_node rmarkr_record_2: lhz g1,-2+2(d0) cmplwi g1,1 bgt rmarkr_hnf_2 beq rmarkr_hnf_1 subi a0,a0,4 b rmarkr_next_node rmarkr_record_1: lhz g1,-2+2(d0) tst g1 bne rmarkr_hnf_1 subi a0,a0,4 b rmarkr_next_node rmarkr_array: lwz d1,8-NODE_POINTER_OFFSET(a0) tst d1 beq rmarkr_lazy_array lhz d0,-2(d1) tst d0 beq rmarkr_b_record_array lhz d1,-2+2(d1) tst d1 beq rmarkr_b_record_array subi d0,d0,256 cmpw 0,d0,d1 beq rmarkr_a_record_array rmarkr_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 rmarkr_lr_array rmarkr_b_record_array: sub d0,a0,d6 addi d0,d0,4 setmbit o4,d0,d1,o0,o1,o2,2 b rmarkr_next_node rmarkr_a_record_array: lwz d0,4-NODE_POINTER_OFFSET(a0) addi a0,a0,8 mullw d0,d0,d1 b rmarkr_lr_array rmarkr_lazy_array: lwz d0,4-NODE_POINTER_OFFSET(a0) addi a0,a0,8 rmarkr_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 rmarkr_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 rmarkr_node rmarkr_array_length_0_1: subi a0,a0,8 blt rmarkr_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 rmarkr_hnf_1 rmarkr_parent: tst d3 beq end_rmarkr subic. d5,d5,1 beq rmarkr_argument_part_parent cmplw a0,d3 lwz d2,0-NODE_POINTER_OFFSET(d3) bgt rmarkr_no_reverse_2 mr a1,a0 addi d0,d3,1 lwz a0,0-NODE_POINTER_OFFSET(a1) stw d0,0-NODE_POINTER_OFFSET(a1) rmarkr_no_reverse_2: stw a0,0-NODE_POINTER_OFFSET(d3) subi a0,d3,4 andi. d5,d2,3 clrrwi d3,d2,2 b rmarkr_next_node rmarkr_argument_part_parent: mr a1,d3 mr d3,a0 lwz d2,0-NODE_POINTER_OFFSET(a1) mr a0,a1 rmarkr_skip_upward_pointers: andi. d0,d2,3 cmpwi 0,d0,3 bne rmarkr_no_upward_pointer clrrwi a1,d2,2 lwz d2,0-NODE_POINTER_OFFSET(a1) b rmarkr_skip_upward_pointers rmarkr_no_upward_pointer: cmplw 0,d3,a0 bgt rmarkr_no_reverse_3 mr o0,d3 lwz d3,0-NODE_POINTER_OFFSET(d3) addi d0,a0,1 stw d0,0-NODE_POINTER_OFFSET(o0) rmarkr_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,rmarkr_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 rmarkr_node rmarkr_no_reverse_4: stw a0,4-NODE_POINTER_OFFSET(d3) clrrwi a0,d2,2 b rmarkr_node rmarkr_argument_part_cycle1: mr d1,a1 rmarkr_skip_pointer_list1: clrrwi a1,d2,2 lwz d2,0-NODE_POINTER_OFFSET(a1) andi. d5,d2,3 cmpwi 0,d5,3 beq rmarkr_skip_pointer_list1 stw o0,0-NODE_POINTER_OFFSET(a1) mr a1,d1 b rmarkr_c_argument_part_cycle1 rmarkr_next_node_after_static: cmpwi 0,d5,0 bne rmarkr_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 rmarkr_argument_part_cycle2 stw o0,0-NODE_POINTER_OFFSET(d3) rmarkr_c_argument_part_cycle2: stw a0,4-NODE_POINTER_OFFSET(d3) clrrwi a0,d2,2 b rmarkr_node rmarkr_parent_after_static: cmpwi 0,d3,0 beq end_rmarkr_after_static subic. d5,d5,1 beq rmarkr_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 rmarkr_next_node rmarkr_argument_part_parent_after_static: mr a1,d3 mr d3,a0 lwz d2,0-NODE_POINTER_OFFSET(a1) mr a0,a1 rmarkr_skip_upward_pointers_2: andi. d0,d2,3 cmpwi 0,d0,3 bne rmarkr_no_reverse_3 clrrwi a1,d2,2 lwz d2,0-NODE_POINTER_OFFSET(a1) b rmarkr_skip_upward_pointers_2 rmarkr_argument_part_cycle2: mr d1,a1 rmarkr_skip_pointer_list2: clrrwi a1,d2,2 lwz d2,0-NODE_POINTER_OFFSET(a1) andi. d5,d2,3 cmpwi 0,d5,3 beq rmarkr_skip_pointer_list2 stw o0,0-NODE_POINTER_OFFSET(a1) mr a1,d1 b rmarkr_c_argument_part_cycle2 end_rmarkr_after_static: lwz a3,0(sp) addi sp,sp,8 stw a0,0(a3) b rmarkr_next_stack_node end_rmarkr: lwz d1,4(sp) lwz a3,0(sp) cmplw 0,a0,d1 addi sp,sp,8 bgt rmarkr_no_reverse_5 mr a1,a0 addi d0,a3,1 lwz a0,0(a0) stw d0,0(a1) rmarkr_no_reverse_5: stw a0,0(a3) rmarkr_next_stack_node: cmplw 0,sp,d4 bge rmark_next_node lwz a0,0(sp) lwz a3,4(sp) addi sp,sp,8 cmplwi a0,1 bgt rmark_using_reversal b rmark_next_node_