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 cr0,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 cr0,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 cr6,d2,0
beq rmark_lazy_node
beq cr6,rmark_hnf_0
cmplwi cr0,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 cr0,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
lwz d0,-8(d0)
andc o1,o1,o3
lea g1,__indirection
stbx o1,o4,o0
lhz d0,4(d0)
stw g1,-4-NODE_POINTER_OFFSET(a0)
subi d2,a0,4
cmplwi cr0,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:
lwz g1,-8(d0)
mflr r0
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 cr0,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:
lwz d0,-8(d0)
andc o1,o1,o3
lea g1,__indirection
stbx o1,o4,o0
lhz d0,4(d0)
stw g1,-4-NODE_POINTER_OFFSET(a0)
subi d2,a0,4
cmplwi cr0,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 cr0,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:
lwz g1,-8(d0)
.if ! NEW_DESCRIPTORS
mflr r0
.endif
subi a0,a0,4
cmplw a0,d1
bgt rmark_selector_pointer_not_reversed
.if NEW_DESCRIPTORS
lhz d0,4(g1)
cmplwi cr0,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 cr0,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 cr0,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 cr0,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 cr6,rmark_next_node
bsubicc d2,1
baddi a0,4
ble rmark_lazy_node_1
cmplwi cr0,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 cr0,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 cr0,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 cr0,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 cr0,a4,a3
.else
lwz d0,4(sp)
addi a3,a3,4
cmpw cr0,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 cr0,a4,a3
.else
lwz d0,4(sp)
addi a3,a3,4
cmpw cr0,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 cr1,reorder_lp2
blr