summaryrefslogtreecommitdiff
path: root/pcompact_rmarkr.a
diff options
context:
space:
mode:
authorJohn van Groningen2005-11-15 11:33:56 +0000
committerJohn van Groningen2005-11-15 11:33:56 +0000
commit8799fc073e4f4e8b1bad274a9c81ffab330db074 (patch)
tree80e2f4816aed624b059d017fec62d54c788cd730 /pcompact_rmarkr.a
parentdefine label 'copy_selector_2__' if both NEW_DESCRIPTORS and (diff)
move mark pass of compacting collector to separate file(s),
mark using a stack instead of pointer reversal if possible
Diffstat (limited to 'pcompact_rmarkr.a')
-rw-r--r--pcompact_rmarkr.a783
1 files changed, 783 insertions, 0 deletions
diff --git a/pcompact_rmarkr.a b/pcompact_rmarkr.a
new file mode 100644
index 0000000..3efb806
--- /dev/null
+++ b/pcompact_rmarkr.a
@@ -0,0 +1,783 @@
+
+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 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 rmarkr_hnf_1
+
+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
+
+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
+ b rmarkr_large_tuple_or_record
+
+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 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 rmarkr_hnf_1
+
+rmarkr_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 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_