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_