lea	o0,heap_p2
	lea	o1,stack_p
	lwz	a6,0(o0)
	lwz	a2,0(o1)

 .if COPIED_VECTOR
	lea	o0,heap_size_129
	lwz	d7,0(o0)
	lea	o0,heap_p1
	slwi	d7,d7,6
	lwz	a3,0(o0)
 .else
	lea	o0,heap_size
	lwz	d7,0(o0)
	srwi	d7,d7,1
 .endif
	add	o4,a6,d7

 .if WRITE_HEAP
	lea	o0,heap2_begin_and_end
	stw	o4,4(o0)
 .endif

	lea	o0,caf_list

 .if USE_DCBZ
	li	g3,32
	li	o3,-32
 .endif
	lwz	d0,0(o0)
	cmpwi	0,d0,0
	beq	end_copy_cafs

copy_cafs_lp:
	lwz	o5,-4(d0)
	lwz	d5,0(d0)
	addi	a2,d0,4
	subi	d5,d5,1
	bl	copy_lp2

	addic.	d0,o5,0
	bne	copy_cafs_lp

end_copy_cafs:

	lea	o0,stack_p
	lwz	a2,0(o0)

	sub	d5,a4,a2
	subic.	d5,d5,4
	srwi	d5,d5,2

	bgel	copy_lp2

	lea	o0,heap_p2
	lwz	a2,0(o0)

;
;	Copy all referenced nodes to the other semi space
;

	lea	g2,copy_lp1

copy_lp1:
	cmplw	0,a2,a6
	bge	end_copy1

	lwz	d0,0(a2)
	mtlr	g2

	baddi	a2,4
	andi.	o0,d0,2

	lha	d5,-2(d0)

	beq	not_in_hnf_1

in_hnf_1:
	cmpwi	0,d5,0
	beq	copy_array_21

	cmpwi	0,d5,2
	ble	b_copy_lp2

	cmplwi	0,d5,256
	bge	copy_record_1

	lwz	o0,4(a2)
	mr	d6,d5

	andi.	r0,o0,1
	bne	node_without_arguments_part

	li	d5,0
	bl	copy_lp2

	mtlr	g2

	baddi	a2,4
	subi	d5,d6,2
	b	copy_lp2

node_without_arguments_part:
	clrrwi	o0,o0,1
	stw	o0,4(a2)
	li	d5,0
	bl	copy_lp2

	baddi	a2,4
	b	copy_lp1

copy_record_1:
	subic.	d5,d5,258
	bgt	copy_record_arguments_3

	lhz	d5,-2+2(d0)
	blt	copy_record_arguments_1

	subic.	d5,d5,1
	bgt	copy_lp2
	
	beq-	copy_node_arity1

	baddi	a2,8
	b	copy_lp1

copy_record_arguments_1:
	cmpwi	d5,0
	li	d5,0
	bne	copy_lp2
	baddi	a2,4
	b	copy_lp1

copy_record_arguments_3:
 .if COPIED_VECTOR
	lwz	o1,4(a2)
	andi.	r0,o1,1
	lhz	d1,-2+2(d0)
	cmpwi	cr6,d1,0
	bne	record_node_without_arguments_part
 .else
	lhz	d1,-2+2(d0)
	cmpwi	cr6,,d1,0
 .endif
	baddi	d5,2+1
	beq	cr6,copy_record_arguments_3b

	subic.	d6,d1,1
	beq	copy_record_arguments_3abb

	slwi	d5,d5,2
	add	d4,a2,d5

	li	d5,0
	bl	copy_lp2
		
	baddi	a2,4
	subi	d5,d6,1
	bl	copy_lp2

	mr	a2,d4
	b	copy_lp1

copy_record_arguments_3abb:
	subi	d5,d5,1
	slwi	d6,d5,2
	li	d5,0
	bl	copy_lp2	

	add	a2,a2,d6
	b	copy_lp1

copy_record_arguments_3b:
	slwi	d5,d5,2
	add	a2,a2,d5
	b	copy_lp1

 .if COPIED_VECTOR
record_node_without_arguments_part:
	clrrwi	o1,o1,1
	stw	o1,4(a2)

	baddi	a2,8
	beq	cr6,copy_lp1

	subi	a2,a2,8
	li	d5,0
	bl	copy_lp2
		
	baddi	a2,4
	b	copy_lp1
 .endif

not_in_hnf_1:
	cmpwi	0,d5,257
	bge	copy_unboxed_closure_arguments

	subic.	d5,d5,1
	bgt	copy_lp2

copy_node_arity1:
	li	d5,0
	bl	copy_lp2

	baddi	a2,4
	b	copy_lp1

copy_unboxed_closure_arguments:
	srwi	d4,d5,8
	rlwinm	d5,d5,0,24,31

	beq	copy_unboxed_closure_arguments1

	bsubc	d5,d4
	bsubi	d5,1
	bnel+	copy_lp2
	
	slwi	d4,d4,2
	badd	a2,d4
	b	copy_lp1

copy_unboxed_closure_arguments1:
	baddi	a2,8
	b	copy_lp1

copy_array_21:
	lwz	d1,4(a2)
	cmpwi	0,d1,0

	lwz	d5,0(a2)
	baddi	a2,8
	beq	copy_array_21_a

	lhz	d0,-2(d1)
	subi	d0,d0,256

	lhz	d1,-2+2(d1)
	cmpwi	0,d1,0
	beq	copy_array_21_b

	cmpw	0,d0,d1
	beq	copy_array_21_r_a

copy_array_21_ab:
	subic.	d5,d5,1
	blt	copy_lp1

	sub	d0,d0,d1
	slwi	d0,d0,2
	subi	d1,d1,1

	mr	d6,d5
	stw	d1,-4(sp)
	stwu	d0,-8(sp)

copy_array_21_lp_ab:
	lwz	d5,4(sp)
	bl	copy_lp2

	lwz	o1,0(sp)
	subic.	d6,d6,1
	add	a2,a2,o1
	bge	copy_array_21_lp_ab
		
	baddi	sp,8
	b	copy_lp1

copy_array_21_b:
	mullw	d2,d5,d0
	slwi	d2,d2,2
	add	a2,a2,d2
	b	copy_lp1

copy_array_21_r_a:
	mullw	d2,d5,d0
	mr	d5,d2
copy_array_21_a:
	subic.	d5,d5,1
	bge	copy_lp2
		
	b	copy_lp1

;
;	Copy root nodes to the other semi-space
;

b_copy_lp2:
	bsubi	d5,1
copy_lp2:
	lwz	a1,0(a2)
	baddi	a2,4

	lwz	d0,0-NODE_POINTER_OFFSET(a1)
	bsubi	d5,1

continue_after_selector_2:
	andi.	r0,d0,2
	beq	not_in_hnf_2

in_hnf_2:	lhz	d2,-2(d0)
	cmpwi	5,d5,0

	cmpwi	0,d2,0
	beq	copy_arity_0_node2

	cmplwi	cr6,d2,256
 .if NODE_POINTER_OFFSET==0
	stw	a6,-4(a2)
 .endif
	stw	d0,0(a6)
	bge	cr6,copy_record_2

	subic.	d2,d2,2
	lwz	o0,4-NODE_POINTER_OFFSET(a1)

	addi	a0,a6,1+NODE_POINTER_OFFSET
	stw	a0,0-NODE_POINTER_OFFSET(a1)

	blt	copy_hnf_node2_1
	bgt	copy_hnf_node2_3

	lwz	o1,8-NODE_POINTER_OFFSET(a1)

	stw	o0,4(a6)
 .if NODE_POINTER_OFFSET==0
	stw	o1,8(a6)
	stw	a6,-4(a2)
	baddi	a6,12
 .else
	stwu	o1,8(a6)
	stw	a6,-4(a2)
	baddi	a6,4
 .endif
	bge	cr5,copy_lp2
	blr	

copy_hnf_node2_1:
	stw	o0,4(a6)
	baddi	a6,8
 .if NODE_POINTER_OFFSET
	stw	a6,-4(a2)
 .endif
	bge	cr5,copy_lp2
	blr	

copy_hnf_node2_3:
	lwz	a0,8-NODE_POINTER_OFFSET(a1)
	baddi	a6,12

	stw	o0,4-12(a6)
 .if NODE_POINTER_OFFSET
 	addi	a1,a6,NODE_POINTER_OFFSET
 .endif
	lwz	d1,0-NODE_POINTER_OFFSET(a0)

	andi.	r0,d1,1
	bne	arguments_already_copied_2

 .if NODE_POINTER_OFFSET==0
	stw	a6,-4(a6)
	ori	a1,a6,1
	stw	d1,0(a6)
 .else
	stwu	a1,-4(a6)
	ori	a1,a1,1
	stw	a6,-4(a2)
	stwu	d1,4(a6)
 .endif
	stw	a1,0-NODE_POINTER_OFFSET(a0)

cp_hnf_arg_lp2:
 .if NODE_POINTER_OFFSET
	lwz	o0,4-NODE_POINTER_OFFSET(a0)
	baddi	a0,4
 .else
	lwzu	o0,4(a0)
 .endif
	subic.	d2,d2,1
	stwu	o0,4(a6)
	bgt	cp_hnf_arg_lp2

	baddi	a6,4

	bge	cr5,copy_lp2
	blr	

arguments_already_copied_2:
	stw	d1,-4(a6)
 .if NODE_POINTER_OFFSET
	addi	a1,a6,-4
	stw	a1,-4(a2)
 .endif
 	bge	cr5,copy_lp2
	blr	
		
copy_arity_0_node2:
	cmplw	d0,int_reg
	blt	copy_real_file_or_string_2

	cmplw	d0,char_reg
	bgt	copy_normal_hnf_0_2

copy_int_bool_or_char_2:
 .if SHARE_CHAR_INT
	bne	no_char_2
		
	lbz	d2,7-NODE_POINTER_OFFSET(a1)
 .if NODE_POINTER_OFFSET
	lea	a0,static_characters8
 .else
	lea	a0,static_characters
 .endif
	slwi	d2,d2,3
	add	a0,a0,d2
	stw	a0,-4(a2)

	bge	cr5,copy_lp2
	blr	

no_char_2:
	cmpw	int_reg,d0
	lwz	o0,4-NODE_POINTER_OFFSET(a1)
	bne	no_small_int_or_char_2

	cmplwi	0,o0,33
	slwi	d2,o0,3
	bge	no_small_int_or_char_2

 .if NODE_POINTER_OFFSET
	lea	a0,small_integers8
 .else
	lea	a0,small_integers
 .endif
	add	a0,a0,d2
	stw	a0,-4(a2)

	bge	cr5,copy_lp2
	blr	
		
no_small_int_or_char_2:
 .else
no_small_int_or_char_2:
	lwz	o0,4-NODE_POINTER_OFFSET(a1)
 .endif

 .if NODE_POINTER_OFFSET
	ori	d2,o4,1
	stw	o4,-4(a2)
	stw	d2,0-NODE_POINTER_OFFSET(a1)
 .endif

	stwu	d0,-8(o4)
	stw	o0,4(o4)

 .if NODE_POINTER_OFFSET==0
	ori	d2,o4,1
	stw	o4,-4(a2)
	stw	d2,0-NODE_POINTER_OFFSET(a1)
 .endif

	bge	cr5,copy_lp2
	blr	

copy_normal_hnf_0_2:
	subi	a0,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET-NODE_POINTER_OFFSET
	stw	a0,-4(a2)
	bge	cr5,copy_lp2
	blr

copy_real_file_or_string_2:
	lea	o0,__STRING__+2
	cmplw	0,d0,o0
	ble	copy_string_or_array_2

copy_real_or_file_2:
 .if NODE_POINTER_OFFSET==0
	stwu	d0,-12(o4)
	lwz	o0,4-NODE_POINTER_OFFSET(a1)

	addi	d2,o4,1
	stw	d2,0-NODE_POINTER_OFFSET(a1)

	lwz	o1,8-NODE_POINTER_OFFSET(a1)

	stw	o0,4(o4)
	stw	o1,8(o4)
	stw	o4,-4(a2)
 .else
	lwz	o1,8-NODE_POINTER_OFFSET(a1)
	lwz	o0,4-NODE_POINTER_OFFSET(a1)
	stwu	o1,-4(o4)
	stw	o4,-4(a2)
	addi	d2,o4,1
	stw	d2,0-NODE_POINTER_OFFSET(a1)
	stw	o0,-4(o4)
	stwu	d0,-8(o4)
 .endif
	bge	cr5,copy_lp2
	blr

already_copied_2:
	cmpwi	5,d5,0
already_copied_2_:
	subi	d0,d0,1
	stw	d0,-4(a2)

	bge	cr5,copy_lp2
	blr	

; to do: copy strict basic records to end of heap

copy_record_2:
	subic.	d2,d2,258
	lwz	o0,4-NODE_POINTER_OFFSET(a1)

	addi	a0,a6,1+NODE_POINTER_OFFSET
	stw	a0,0-NODE_POINTER_OFFSET(a1)

	blt	copy_record_node2_1
	bgt	copy_record_node2_3

	lwz	o1,8-NODE_POINTER_OFFSET(a1)

	stw	o0,4(a6)
 .if NODE_POINTER_OFFSET==0
	stw	o1,8(a6)
	baddi	a6,12
 .else
	stwu	o1,8(a6)
 	stw	a6,-4(a2)
	baddi	a6,4
 .endif
	bge	cr5,copy_lp2
	blr	

copy_record_node2_1:
	stw	o0,4-NODE_POINTER_OFFSET(a6)
	baddi	a6,8
 .if NODE_POINTER_OFFSET
 	stw	a6,-4(a2)
 .endif
	bge	cr5,copy_lp2
	blr

copy_record_node2_3:
	lwz	a0,8-NODE_POINTER_OFFSET(a1)
	stw	o0,4(a6)

 .if COPIED_VECTOR
	lea	a1,heap_copied_vector
	sub	d0,a0,a3
	lwz	a1,0(a1)

	tstmbit	a1,d0,d1,o0,o1,o2,3
	bne	record_arguments_already_copied_2

	li	o0,128
	srw	o0,o0,o2
	or	o1,o1,o0	
	stbx	o1,a1,d1
 .endif
 .if NODE_POINTER_OFFSET==0
	addi	a1,a6,12
	stw	a1,8(a6)
 .else
	addi	a1,a6,12+NODE_POINTER_OFFSET
	stwu	a1,8(a6)
 	stw	a6,-4(a2)
 .endif
	lwz	o1,0-NODE_POINTER_OFFSET(a0)
	addi	a1,a1,1
	stw	a1,0-NODE_POINTER_OFFSET(a0)
 .if NODE_POINTER_OFFSET==0
	stwu	o1,12(a6)
 .else
	stwu	o1,4(a6)
 .endif
	subi	d2,d2,1

cp_record_arg_lp2:
 .if NODE_POINTER_OFFSET
	lwz	o1,4-NODE_POINTER_OFFSET(a0)
	baddi	a0,4
 .else
	lwzu	o1,4(a0)
 .endif
	subic.	d2,d2,1
	stwu	o1,4(a6)
	bge	cp_record_arg_lp2

	addi	a6,a6,4

	bge	cr5,copy_lp2
	blr	

 .if COPIED_VECTOR
record_arguments_already_copied_2:
	lwz	o0,0-NODE_POINTER_OFFSET(a0)
 .if NODE_POINTER_OFFSET==0
	addi	a6,a6,12

	stw	o0,-4(a6)
 .else
	stwu	o0,8(a6)
 	stw	a6,-4(a2)
	addi	a6,a6,4
 .endif
	bge	cr5,copy_lp2
	blr	
 .endif

not_in_hnf_2:
	andi.	r0,d0,1
	bne-	already_copied_2

	lwz	d2,-4-NODE_POINTER_OFFSET(d0)
	cmpwi	5,d5,0

	extsb.	d2,d2
	beq	copy_arity_0_node2_

copy_node2_1_:
	subic.	d2,d2,2
	blt	copy_arity_1_node2

copy_node2_3:
 .if NODE_POINTER_OFFSET==0
	stw	a6,-4(a2)
 .endif
	stw	d0,0(a6)
	addi	a0,a6,1+NODE_POINTER_OFFSET
	stw	a0,0-NODE_POINTER_OFFSET(a1)
	lwzu	o0,4-NODE_POINTER_OFFSET(a1)
 .if NODE_POINTER_OFFSET
	addi	o1,a6,8
	stw	o1,-4(a2)
 .endif
	stwu	o0,4(a6)
cp_arg_lp2:
	lwzu	o0,4(a1)
	subic.	d2,d2,1
	stwu	o0,4(a6)
	bge	cp_arg_lp2

	addi	a6,a6,4
	bge	cr5,copy_lp2
	blr	

copy_arity_1_node2:
	cmpwi	0,d2,-1-2
	ble	copy_selector_2

copy_arity_1_node2_:
 .if NODE_POINTER_OFFSET==0
	stw	a6,-4(a2)
 .endif
	lwz	o0,4-NODE_POINTER_OFFSET(a1)
	addi	a0,a6,1+NODE_POINTER_OFFSET
	stw	a0,0-NODE_POINTER_OFFSET(a1)
 .if NODE_POINTER_OFFSET
	addi	o1,a6,8
	stw	o1,-4(a2)
 .endif
	stw	d0,0(a6)
	stw	o0,4(a6)
	addi	a6,a6,12

	bge	cr5,copy_lp2
	blr	

copy_indirection_2:
	mr	d1,a1
	lwz	a1,4-NODE_POINTER_OFFSET(a1)
	
	lwz	d0,0-NODE_POINTER_OFFSET(a1)

	andi.	r0,d0,2
	bne	in_hnf_2

	andi.	r0,d0,1
	bne	already_copied_2_

	lwz	d2,-4(d0)

	extsb.	d2,d2
	beq	copy_arity_0_node2_

	cmpwi	0,d2,-2
	bne	copy_node2_1_

skip_indirections_2:
	lwz	a1,4-NODE_POINTER_OFFSET(a1)
	lwz	d0,0-NODE_POINTER_OFFSET(a1)

	andi.	r0,d0,3
	bne	update_indirection_list_2

	lwz	o0,-4(d0)
	mr	a0,d0
	cmpwi	0,o0,-2
	beq	skip_indirections_2

update_indirection_list_2:
	addi	a0,d1,4
	lwz	d1,0-NODE_POINTER_OFFSET(a0)
	stw	a1,0-NODE_POINTER_OFFSET(a0)
	cmpw	0,a1,d1
	bne	update_indirection_list_2

	lwz	d0,0-NODE_POINTER_OFFSET(a1)
	b	continue_after_selector_2

copy_selector_2:
	cmpwi	0,d2,-2-2
	beq	copy_indirection_2

	mr	a0,d0

; .if no selectors
;	b	copy_arity_1_node2_

	blt	copy_record_selector_2

	lwz	d2,-8(a0)

	lwz	a0,4-NODE_POINTER_OFFSET(a1)
	lwz	d1,0-NODE_POINTER_OFFSET(a0)
	andi.	r0,d1,2
	beq	copy_arity_1_node2_

	lha	g1,-2(d1)
	cmplwi	0,g1,2
	ble	copy_selector_2_

	lwz	g1,8-NODE_POINTER_OFFSET(a0)
	lwz	g1,0-NODE_POINTER_OFFSET(g1)
	andi.	r0,g1,1
	bne	copy_arity_1_node2_

copy_selector_2_:
	lwz	g1,4(d2)

	mtctr	g1

	mr	d2,a1

	mflr	r0
	stwu	r0,-4(sp)
	bctrl
	mtlr	r0

	lea	g1,__indirection
	stw	a0,4-NODE_POINTER_OFFSET(d2)
	stw	g1,0-NODE_POINTER_OFFSET(d2)

	mr	a1,a0
	lwz	d0,0-NODE_POINTER_OFFSET(a1)
	b	continue_after_selector_2

copy_record_selector_2:
	cmpwi	0,d2,-2-3

	lwz	d2,-8(a0)

	beq	copy_strict_record_selector_2

	lwz	a0,4-NODE_POINTER_OFFSET(a1)
	lwz	d1,0-NODE_POINTER_OFFSET(a0)
	andi.	r0,d1,2
	beq	copy_arity_1_node2_

	lha	g1,-2(d1)
	cmplwi	0,g1,258
	ble	copy_selector_2_

 .if COPIED_VECTOR
	lea	g1,heap_copied_vector
	lwz	g0,8-NODE_POINTER_OFFSET(a0)
	lwz	g1,0(g1)
	sub	g0,g0,a3

	tstmbit	g1,g0,d1,o0,o1,o2,3
	bne	copy_arity_1_node2_
 .endif
	b	copy_selector_2_

copy_strict_record_selector_2:
	lwz	a0,4-NODE_POINTER_OFFSET(a1)
	lwz	d1,0-NODE_POINTER_OFFSET(a0)
	andi.	r0,d1,2
	beq	copy_arity_1_node2_

	lha	g1,-2(d1)
	cmplwi	0,g1,258
	ble	copy_strict_record_selector_2_

 .if COPIED_VECTOR
	lea	g1,heap_copied_vector
	lwz	g0,8-NODE_POINTER_OFFSET(a0)
	lwz	g1,0(g1)
	sub	g0,g0,a3

	tstmbit	g1,g0,d1,o0,o1,o2,3
	bne	copy_arity_1_node2_
 .endif

copy_strict_record_selector_2_:
	mr	d0,a1
	lwz	g1,4(d2)
	mr	a1,a0
	mtctr	g1

	mr	a0,d0

	mflr	r0
	stwu	r0,-4(sp)
	bctrl
	mtlr	r0

	lwz	d0,0-NODE_POINTER_OFFSET(a0)
	mr	a1,a0
	b	in_hnf_2

copy_arity_0_node2_:
 .if NODE_POINTER_OFFSET==0
	stwu	d0,-12(o4)
	stw	o4,-4(a2)
	ori	d2,o4,1
 .else
	addi	o1,o4,-4
	stwu	d0,-12(o4)
	ori	d2,o1,1
	stw	o1,-4(a2)
 .endif
	stw	d2,0-NODE_POINTER_OFFSET(a1)
	bge	cr5,copy_lp2
	blr	

copy_string_or_array_2:
	bne	copy_array_2

	sub	d1,a1,a3
	cmplw	0,d1,d7
	bge	copy_string_constant

	lwz	d2,4-NODE_POINTER_OFFSET(a1)
	mr	a0,a1

	lwz	o0,0-NODE_POINTER_OFFSET(a0)
	addi	d2,d2,3
	srwi	d2,d2,2

	slwi	d1,d2,2
	subi	a1,o4,8-NODE_POINTER_OFFSET
	sub	a1,a1,d1

	stw	a1,-4(a2)
	ori	d0,a1,1

	subi	o4,a1,NODE_POINTER_OFFSET
 .if NODE_POINTER_OFFSET
	stwu	d0,0-NODE_POINTER_OFFSET(a0)
	stwu	o0,0-NODE_POINTER_OFFSET(a1)
 .else
	stw	d0,0-NODE_POINTER_OFFSET(a0)
	stw	o0,0(a1)
 .endif

cp_s_arg_lp2:
	lwzu	o0,4(a0)
	subic.	d2,d2,1
	stwu	o0,4(a1)
	bge	cp_s_arg_lp2

	bge	cr5,copy_lp2
	blr

copy_string_constant:
	stw	a1,-4(a2)
	bge	cr5,copy_lp2
	blr

copy_array_2:
	mr	a0,a1

	lwz	d0,8-NODE_POINTER_OFFSET(a0)
	lwz	d2,4-NODE_POINTER_OFFSET(a0)
	cmpwi	0,d0,0
	beq	copy_array_a2

	lhz	d1,-2(d0)
	cmpwi	0,d1,0
	beq	copy_strict_basic_array_2

	subi	d0,d1,256
	mullw	d2,d2,d0

copy_array_a2:
	addi	a1,a6,-NODE_POINTER_OFFSET

	slwi	d1,d2,2
	add	a6,a6,d1
	addi	a6,a6,12

	stw	a1,-4(a2)
	addi	d0,a1,1

	lwz	o0,0-NODE_POINTER_OFFSET(a0)
 .if NODE_POINTER_OFFSET
	stwu	d0,0-NODE_POINTER_OFFSET(a0)
	addi	d2,d2,1
	stwu	o0,0-NODE_POINTER_OFFSET(a1)
 .else
	stw	d0,0-NODE_POINTER_OFFSET(a0)
	addi	d2,d2,1
	stw	o0,0(a1)
 .endif
	b	cp_s_arg_lp2

copy_strict_basic_array_2:
	cmplw	d0,int_reg
	beq	copy_int_array_2
	cmpw	bool_reg,d0
	beq	copy_bool_array_2
	add	d2,d2,d2
copy_int_array_2:
	slwi	d1,d2,2
	subi	a1,o4,12-NODE_POINTER_OFFSET

	sub	a1,a1,d1
	lwz	o0,0-NODE_POINTER_OFFSET(a0)

	stw	a1,-4(a2)
	addi	d0,a1,1

	subi	o4,a1,NODE_POINTER_OFFSET
 .if NODE_POINTER_OFFSET
	stwu	d0,0-NODE_POINTER_OFFSET(a0)
	addi	d2,d2,1
	stw	o0,0-NODE_POINTER_OFFSET(a1)
 .else
	stw	d0,0-NODE_POINTER_OFFSET(a0)
	addi	d2,d2,1
	stw	o0,0(a1)
 .endif
	b	cp_s_arg_lp2

copy_bool_array_2:
	addi	d2,d2,3
	srwi	d2,d2,2
	b	copy_int_array_2

end_copy1:

 .if FINALIZERS
	lea	a0,finalizer_list
	lea	a1,free_finalizer_list
	lwz	a2,0(a0)

determine_free_finalizers_after_copy:
	lwz	d0,0(a2)
	andi.	o0,d0,1
	beq	finalizer_not_used_after_copy

	lwz	a2,4(a2)
	subi	d0,d0,1
	stw	d0,0(a0)
	addi	a0,d0,4
	b	determine_free_finalizers_after_copy

finalizer_not_used_after_copy:
	lea	o0,__Nil-8
	cmplw	a2,o0
	beq	end_finalizers_after_copy

	stw	a2,0(a1)
	addi	a1,a2,4
	lwz	a2,4(a2)
	b	determine_free_finalizers_after_copy	

end_finalizers_after_copy:
	stw	a2,0(a0)
	stw	a2,0(a1)
 .endif