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