;
;	File:	pstartup.a
;	Author:	John van Groningen
;	Machine:	power macintosh

	string	asis

	macro
	setmbit	&vector,&bit_n,&byte_offset,&bit,&byte,&scratch,&shift
	rlwinm	&byte_offset,&bit_n,32-&shift-3,3+&shift,31
	lbzx	&byte,&vector,&byte_offset
	rlwinm	&scratch,&bit_n,(32-&shift) & 31,29,31
	srw	&bit,g3,&scratch
	or	&byte,&byte,&bit
	stbx	&byte,&vector,&byte_offset
	endm

	macro
	tstmbit	&vector,&bit_n,&byte_offset,&bit,&byte,&bit_n_in_byte,&shift
	rlwinm	&byte_offset,&bit_n,32-&shift-3,3+&shift,31
	lbzx	&byte,&vector,&byte_offset
	rlwinm	&bit_n_in_byte,&bit_n,32-&shift,29,31
	rlwnm.	&bit,&byte,&bit_n_in_byte,24,24	
	endm

	macro
	clrmbit	&vector,&bit_n,&byte_offset,&bit,&byte,&scratch,&shift
	rlwinm	&byte_offset,&bit_n,32-&shift-3,3+&shift,31
	lbzx	&byte,&vector,&byte_offset
	rlwinm	&scratch,&bit_n,32-&shift,29,31
	srw	&bit,g3,&scratch
	andc	&byte,&byte,&bit
	stbx	&byte,&vector,&byte_offset
	endm

	include	'pmacros.a'

d0:	set	r24
d1:	set	r25
d2:	set	r26
d3:	set	r27
d4:	set	r28
d5:	set	r29
d6:	set	r30
d7:	set	r31

a0:	set	r23
a1:	set	r22
a2:	set	r21
a3:	set	r20
a4:	set	r19
a5:	set	r18
a6:	set	r17

o0:	set	r3
o1:	set	r4
o2:	set	r5
o3:	set	r6
o4:	set	r7
o5:	set	r8

g2:	set	r9
g3:	set	r10

g0:	set	r11
g1:	set	r12

int_reg	set	r16
char_reg	set	r15
real_reg	set	r14
bool_reg	set	r13

; MACOSX		set	1

SHARE_CHAR_INT	set	1
MY_ITOS	set	1
FINALIZERS	set	1
STACK_OVERFLOW_EXCEPTION_HANDLER set	MACOSX
MEASURE_GC	set	0

COPIED_VECTOR	set	1
USE_DCBZ	set	0
COMPACT_GC_ONLY	set	0

ADJUST_HEAP_SIZE	set	1
MARK_GC	set	1
MARK_AND_COPY_GC	set	1

 if LINUX
STDERR_TO_FILE	set	0
WRITE_HEAP	set	0
 else
WRITE_HEAP	set	1
STDERR_TO_FILE	set	1
 endif
NEW_DESCRIPTORS	set	1
;PROFILE		set	1
PREFETCH		set	0
MARK_WITH_STACK		set	1

MODULE_NAMES_IN_TIME_PROFILER	set	1

EXCEPTIONS	set	0

MINIMUM_HEAP_SIZE	set	8000

 if 1
DESCRIPTOR_ARITY_OFFSET	set	(-2)
  if NEW_DESCRIPTORS
ZERO_ARITY_DESCRIPTOR_OFFSET	set	(-4)
  else
ZERO_ARITY_DESCRIPTOR_OFFSET	set	(-8)
  endif
 else
DESCRIPTOR_ARITY_OFFSET	set	(-8)
ZERO_ARITY_DESCRIPTOR_OFFSET	set	(-12)
 endif

NO_PREFETCH_MASK	set	4096

	export	r_to_i_buffer
	comm	r_to_i_buffer,8
	comm	heap_mbp,4
	comm	heap_p,4
	comm	heap_p1,4
	comm	heap_p2,4
	comm	heap_size_33,4
 if COPIED_VECTOR
	comm	heap_size_129,4
	comm	heap_copied_vector,4
	comm	heap_copied_vector_size,4
	comm	heap_end_after_copy_gc,4
 endif
	comm	extra_heap,4
	comm	extra_heap_size,4
	comm	stack_p,4
 if MACOSX
	comm	end_a_stack,4
	comm	end_b_stack,4
 endif
	comm	halt_sp,4
; number of long words requested from the garbage collector
	comm	alloc_size,4
	comm	basic_only,4
	comm	last_time,4
	comm	execute_time,4
	comm	garbage_collect_time,4
	comm	IO_time,4
 if MEASURE_GC
	comm	compact_garbage_collect_time,4
	comm	mark_compact_garbage_collect_time,4
	comm	total_gc_bytes_lo,4
	comm	total_gc_bytes_hi,4
	comm	total_compact_gc_bytes_lo,4
	comm	total_compact_gc_bytes_hi,4
 endif
	export	saved_heap_p
	comm	saved_heap_p,8
	
	export	saved_a_stack_p
	comm	saved_a_stack_p,4
	
	comm	sprintf_buffer,32
	comm	sprintf_time_buffer,20

	export	small_integers
	comm	small_integers,33*8
	export	static_characters
	comm	static_characters,256*8

 if EXCEPTIONS
	comm	exception_info,12
 endif

	comm	caf_list,4
	export	caf_listp
	comm	caf_listp,4

	csect	data{RW}

heap_p3:	dc.l	0
heap_vector:dc.l	0
heap_end_after_gc:	dc.l	0

 if MARK_GC
bit_counter:
	dc.l	0
bit_vector_p:
	dc.l	0
zero_bits_before_mark:
	dc.l	1
free_after_mark:
	dc.l	1000
last_heap_free:
	dc.l	0
lazy_array_list:
	dc.l	0
  if ADJUST_HEAP_SIZE
bit_vector_size:
	dc.l	0	; in bits
  endif
 endif

	align	2
zero_length_string:
	dc.l	__STRING__+2
	dc.l	0
true_string:
	dc.l	__STRING__+2
	dc.l	4
true_c_string:
	dc.b	'True'
	dc.b	0,0,0,0
false_string:
	dc.l	__STRING__+2
	dc.l	5
false_c_string:
	dc.b	'False'
	dc.b	0,0,0
file_c_string:
	dc.b	'File'
	dc.b	0,0,0,0

; -1: compact or mark, no extra heap
;  0: copy, no extra heap
;  1: compact, extra heap
;  2: copy, extra heap
garbage_collect_flag:
	dc.b	0
	dc.b	0,0,0

out_of_memory_string_1:
	dc.b	'Not enough memory to allocate heap and stack'
	dc.b	13,0
printf_int_string:
	dc.b	'%d'
	dc.b	0
printf_real_string:
	dc.b	'%g'
	dc.b	0
printf_string_string:
	dc.b	'%s'
	dc.b	0
printf_char_string:
	dc.b	'%c'
	dc.b	0
garbage_collect_string_1:
	dc.b	'A stack: '
	dc.b	0
garbage_collect_string_2:
	dc.b	' bytes. BC stack: '
	dc.b	0
garbage_collect_string_3:
	dc.b	' bytes.'
	dc.b	13,0
heap_use_after_gc_string_1:
	dc.b	'Heap use after garbage collection: '
	dc.b	0
heap_use_after_gc_string_2:
	dc.b	' Bytes.'
	dc.b	13,0
stack_overflow_string:
	dc.b	'Stack overflow.'
	dc.b	13,0
out_of_memory_string_4:
	dc.b	'Heap full.'
	dc.b	13,0
time_string_1:
	dc.b	'Execution: '
	dc.b	0
time_string_2:
	dc.b	'  Garbage collection: '
	dc.b	0
 if MEASURE_GC
time_string_2a:
	dc.b	' '
	dc.b	0
 endif
time_string_3:
	dc.b	'  IO: '
	dc.b	0
time_string_4:
	dc.b	'  Total: '
	dc.b	0
high_index_string:
	dc.b	'Index too high in UPDATE string.'
	dc.b	13,0
low_index_string:
	dc.b	'Index negative in UPDATE string.'
	dc.b	13,0
IO_error_string:
	dc.b	'IO error: '
	dc.b	0
new_line_string:
	dc.b	13,0
		
sprintf_time_string:
	dc.b	'%d.%02d'
	dc.b	0

 if MARK_GC
marked_gc_string_1:
	dc.b	'Marked: '
	dc.b	0
 endif
 if PROFILE
 	align	2
  if MODULE_NAMES_IN_TIME_PROFILER
m_system:
	dc.l	6
	dc.b	'System'
	dc.b	0,0
	dc.l	m_system
  endif
garbage_collector_name:
	dc.l	0
	dc.b	'garbage_collector'
	dc.b	0
	align	2
 endif
	align	3
entier_constants_and_buffers:
	dc.d	"0.0"
	dc.d	"0.0"
	dc.l	0x43300000
	dc.l	0x00000000
	dc.l	0x43300000
	dc.l	0x80000000
 if MEASURE_GC
f_power2_52:
	dc.l	0x43300000
	dc.l	0x00000000
f_60:
	dc.d	"60"
f_1000000:
	dc.d	"1000000"
 endif
 if WRITE_HEAP
	comm	heap2_begin_and_end,8
 endif
 if FINALIZERS
	import	__Nil
	import	e____system__kFinalizer
	import	e____system__kFinalizerGCTemp
	export	finalizer_list
	comm	finalizer_list,4
	export	free_finalizer_list
	comm	free_finalizer_list,4
 endif
 if STACK_OVERFLOW_EXCEPTION_HANDLER
	import	.allocate_a_stack
 endif
	align	1

	csect	text{PR}
 if LINUX
	export	abc_main
 else
	export	.abc_main
 endif
	export	print_
	export	print_char
	export	print_int
	export	print_real
	export	print_sc
	export	print_symbol
	export	print_symbol_sc
	export	print__string__
	export	print__chars__sc
	export	printD

	export	eprint__
	export	eprint__string__
	export	eprintD

	export	push_t_r_args
	export	push_a_r_args
	export	halt
		
	export	catAC
	export	sliceAC
	export	updateAC
	export	eqAC
	export	cmpAC

	export	string_to_string_node

	export	create_array
	export	create_arrayB
	export	create_arrayC
	export	create_arrayI
	export	create_arrayR
	export	create_R_array

	export	_create_arrayB
	export	_create_arrayC
	export	_create_arrayI
	export	_create_arrayR
	export	_create_r_array

	export	BtoAC
	export	DtoAC
	export	ItoAC
	export	RtoAC
	export	eqD

	export	collect_0,collect_1,collect_2,collect_3
	export	collect_00,collect_01,collect_02,collect_03

	export	eval_01,eval_11,eval_02,eval_12,eval_22

	import	e__system__AP

	export	e__system__sAP
	export	yet_args_needed,yet_args_needed_0,yet_args_needed_1
	export	yet_args_needed_2,yet_args_needed_3,yet_args_needed_4

	export	_c3,_c4,_c5,_c6,_c7,_c8,_c9,_c10,_c11,_c12
	export	_c13,_c14,_c15,_c16,_c17,_c18,_c19,_c20,_c21,_c22
	export	_c23,_c24,_c25,_c26,_c27,_c28,_c29,_c30,_c31,_c32

	export	e__system__nind
	export	e__system__eaind
; old names of the previous two labels for compatibility, remove later
	export	__indirection,__eaind

	export	eval_fill
	export	eval_upd_0,eval_upd_1,eval_upd_2,eval_upd_3,eval_upd_4
	export	eval_upd_5,eval_upd_6,eval_upd_7,eval_upd_8,eval_upd_9
	export	eval_upd_10,eval_upd_11,eval_upd_12,eval_upd_13,eval_upd_14
	export	eval_upd_15,eval_upd_16,eval_upd_17,eval_upd_18,eval_upd_19
	export	eval_upd_20,eval_upd_21,eval_upd_22,eval_upd_23,eval_upd_24
	export	eval_upd_25,eval_upd_26,eval_upd_27,eval_upd_28,eval_upd_29
	export	eval_upd_30,eval_upd_31,eval_upd_32
		
	export	repl_args_b
	export	push_arg_b
	export	del_args
 if 0
	export	o__S_P2
	export	ea__S_P2
 endif
	export	.add_IO_time
	export	.add_execute_time
		
	export	.IO_error
	export	print_error
	export	stack_overflow

	export	out_of_memory_4

	export	acos_real
	export	asin_real
	export	atan_real
	export	cos_real
	export	sin_real
	export	tan_real
	export	ln_real
	export	log10_real
	export	exp_real
	export	sqrt_real
	export	pow_real
	export	entier_real
 if LINUX
 else
	export	.my_pointer_glue{PR}
 endif
 if EXCEPTIONS
	export	e__Exceptions__scatch__exception
	export	e__Exceptions__sraise__exception
 endif
 if LINUX
	import	__start
 else
 	import	_start
 endif
	export	__driver

	export	.print_execution_time{PR}
		
; from system.abc:	
	import	INT
	import	CHAR
	import	BOOL
	import	REAL
	import	__STRING<='STRING'
	import	FILE
	import	__STRING__
	import	__ARRAY__
	import	__cycle__in__spine
	import	__print__graph
	import	__eval__to__nf

 if STDERR_TO_FILE
	import	.close_stderr_file
 endif

; from cgcon.c:
	import	.w_print_char
	import	.w_print_text
	import	.w_print_int
	import	.w_print_real
	import	.w_print_string

 if STDERR_TO_FILE
	import	.er_print_char
	import	.er_print_string
	import	.er_print_int
	import	.er_print_text
	import	.er_print_real
 else
	import	.ew_print_char
	import	.ew_print_string
	import	.ew_print_int
	import	.ew_print_real
 endif
 if 0

	import	.wait_for_key_press
 else
 	import	execution_aborted
 endif
	import	stack_size
	import	heap_size
	import	flags
 if ADJUST_HEAP_SIZE
	import	heap_size_multiple
	import	initial_heap_size
 endif
 
; from standard c library:
	import	.sprintf
 if LINUX
	import	malloc
	import	free
 else
	import	.NewPtr
	import	.DisposePtr
	import	.TickCount
  if 0
	import	.Debugger
  endif
 endif
	import	.acos
	import	.asin
	import	.atan
	import	.cos
	import	.sin
	import	.tan
	import	.log
	import	.log10
	import	.exp
	import	.sqrt
	import	.pow

 if PROFILE
	import	init_profiler
	import	profile_s,profile_n,profile_r,profile_ti
	import	write_profile_information,write_profile_stack
 endif

 if LINUX
abc_main:
 else
.abc_main:
 endif
 	mflr	r0
	stwu	r0,-4(sp)
	stmw	r13,-76(sp)
	subi	sp,sp,76

	lea	o0,flags
	lwz	d0,0(o0)
	lea	o0,basic_only
	andi.	d0,d0,1
	stw	d0,0(o0)

	lea	o0,heap_size
	lwz	d0,0(o0)
	subi	o0,d0,3
	li	o1,33
	divwu	o0,o0,o1
	lea	o1,heap_size_33
	stw	o0,0(o1)

 if COPIED_VECTOR
	lea	o0,heap_size
	li	o1,129
	lwz	d0,0(o0)
	subi	o0,d0,7
	divwu	o0,o0,o1
	lea	o1,heap_size_129
	stw	o0,0(o1)
	addi	o0,o0,3
	lea	o1,heap_copied_vector_size
	clrrwi	o0,o0,2
	stw	o0,0(o1)
	
	lea	o1,heap_end_after_copy_gc
	li	g0,0
	stw	g0,0(o1)
 endif

	lea	o1,heap_size
	lwz	o0,0(o1)
	addi	o0,o0,7
	clrrwi	o0,o0,3
	stw	o0,0(o1)
	addi	o0,o0,3+4

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif

 if LINUX
	bl	malloc
 else
	bl	.NewPtr
 endif
	nop
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif
	cmpwi	0,o0,0
	beq	no_memory_1

	lea	o1,heap_mbp
	stw	o0,0(o1)

	addi	o0,o0,3
	clrrwi	a6,o0,2

	lea	o0,heap_p
	lea	o1,heap_p1
	stw	a6,0(o0)
	stw	a6,0(o1)
 if MACOSX
	lea	o0,stack_size
	lwz	o0,0(o0)
	
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)

  if STACK_OVERFLOW_EXCEPTION_HANDLER
	bl	.allocate_a_stack
  else
	bl	.NewPtr
  endif
	nop

 	lwz	sp,0(sp)

	cmpwi	0,o0,0
	beq	no_memory_1

	mr	a4,o0
	lea	o0,stack_p
	stw	a4,0(o0)

	lea	o0,stack_size
	addi	d0,sp,128
	lwz	d1,0(o0)

	lea	o0,end_a_stack
 	sub	d0,d0,d1
	add	d1,a4,d1
	stw	d1,0(o0)

	lea	o0,end_b_stack
	stw	d0,0(o0)
 else
	lea	o0,stack_size
	addi	d0,sp,-128
	lwz	o0,0(o0)
 	sub	a4,d0,o0

	lea	o0,stack_p
	stw	a4,0(o0)
 endif
	lea	a0,small_integers
	li	d0,0
	lea	d1,INT2
make_small_integers_lp:
	stw	d1,0(a0)
	stw	d0,4(a0)
	addi	d0,d0,1
	cmpwi	0,d0,33
	addi	a0,a0,8
	bne	make_small_integers_lp

	lea	a0,static_characters
	li	d0,0
	lea	d1,CHAR2
make_static_characters_lp:
	stw	d1,0(a0)
	stw	d0,4(a0)
	addi	d0,d0,1
	cmpwi	0,d0,256
	addi	a0,a0,8
	bne	make_static_characters_lp

	lea	o0,caf_listp
 if LINUX
 	lea	a0,caf_list+4
 else
	lea	a0,caf_list4
 endif
	stw	a0,0(o0)
	li	g0,0
	stw	g0,-4(a0)

 if FINALIZERS
 	lea	o0,finalizer_list
 	lea	o1,free_finalizer_list
 	lea	a0,__Nil_m8
 	stw	a0,0(o0)
 	stw	a0,0(o1)
 endif

 if COPIED_VECTOR
	lea	o0,heap_size_129
	lwz	d1,0(o0)
	slwi	d7,d1,6-2
	slwi	d1,d1,6
	lea	o0,heap_copied_vector
	add	d0,a6,d1
	lea	o1,heap_copied_vector_size
	stw	d0,0(o0)
	lwz	o1,0(o1)
	lea	o0,heap_p2
	add	d0,d0,o1
	stw	d0,0(o0)
 else
	lea	o0,heap_size
	lwz	d1,0(o0)
	lea	o0,heap_p2
	srwi	d1,d1,1
	add	d0,a6,d1
	srwi	d7,d1,2
	stw	d0,0(o0)
 endif

	lea	o0,garbage_collect_flag
	li	g0,0
	stb	g0,0(o0)

 if MARK_AND_COPY_GC
 	lea	o0,flags
	lwz	o0,0(o0)
	andi.	r0,o0,64
	beq	no_mark1
 endif

 if MARK_GC || COMPACT_GC_ONLY
	lea	o0,heap_size_33
	lea	o1,heap_vector
	lwz	d0,0(o0)
	stw	a6,0(o1)
	slwi	d7,d0,3
	add	a6,a6,d0
	addi	a6,a6,3
	lea	o0,heap_p3
	clrrwi	a6,a6,2
	stw	a6,0(o0)
	lea	o0,garbage_collect_flag
	li	d0,-1
	stb	d0,0(o0)
 endif

 if MARK_AND_COPY_GC
no_mark1:
 endif

 if ADJUST_HEAP_SIZE
 	lea	d0,initial_heap_size
 	lea	o0,flags
	lwz	d0,0(d0)
  if MARK_AND_COPY_GC
	lwz	o0,0(o0)
	li	d1,MINIMUM_HEAP_SIZE/2
	andi.	r0,o0,64
	bne	no_mark9
	add	d1,d1,d1
no_mark9:
  else
   if MARK_GC || COMPACT_GC_ONLY
 	li	d1,MINIMUM_HEAP_SIZE
   else
 	li	d1,MINIMUM_HEAP_SIZE/2
   endif
  endif
	cmpw	d0,d1
	ble	too_large_or_too_small
	srwi	d0,d0,2
 	cmpw	d0,d7
	bge	too_large_or_too_small
	mr	d7,d0
too_large_or_too_small:
 endif

 if MARK_AND_COPY_GC
 	lea	o0,flags
	lwz	o0,0(o0)
	andi.	r0,o0,64
	beq	no_mark2
 endif

 if MARK_GC && ADJUST_HEAP_SIZE
	lea	o0,bit_vector_size
	stw	d7,0(o0)
 endif

 if MARK_AND_COPY_GC
no_mark2:
 endif

 	lea	o0,heap_end_after_gc
	slwi	d0,d7,2
	add	d0,a6,d0
	stw	d0,0(o0)

	lea	o0,halt_sp
	stw	sp,0(o0)

 if EXCEPTIONS
	lea	o0,exception_info
	li	o1,0
	stw	o1,0(o0)
 endif
	bl	_init_timer


	lea	a5,__cycle__in__spine
	lea	int_reg,INT2
	lea	char_reg,CHAR2
	lea	real_reg,REAL2
	lea	bool_reg,BOOL2

 if USE_DCBZ
 	subi	d7,d7,15
	li	g2,32
 endif

	li	r0,-1
 if PROFILE
	stwu	r0,-4(sp)
	bl	init_profiler
 endif
	stwu	r0,-4(sp)

 if 0
	stwu	sp,-64(sp)
	bl	.Debugger
	nop
	addi	sp,sp,64
 endif

	subi	a6,a6,4

 if LINUX
 	bl	__start
 else
	bl	_start
 endif
	nop

exit:
	bl	.add_execute_time

	lea	o0,flags
	lwz	d0,0(o0)
	andi.	g0,d0,8
	beq	no_print_execution_time

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif

	bl	.print_execution_time

 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif
no_print_execution_time:

exit_3:
exit_2:
	lea	o0,heap_mbp
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	lwz	o0,0(o0)
 if LINUX
	bl	free
 else
	bl	.DisposePtr
 endif
	nop
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif

exit_1:
 if STDERR_TO_FILE
	lea	o0,flags
	lwz	d0,0(o0)
	andi.	g0,d0,128
	beq	no_close_stderr_file

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.close_stderr_file
	nop	
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif

no_close_stderr_file:
 endif
 if PROFILE
	mflr	r0
	stwu	r0,-4(sp)
	bl	write_profile_information
 endif

	lwz	r0,76(sp)
	mtlr	r0
	lmw	r13,0(sp)
	addi	sp,sp,80
	blr


	csect	.print_execution_time{PR}
.print_execution_time:
	mflr	r0
	stw	r0,8(sp)
	stwu	sp,-64(sp)

	bl	.add_execute_time

	lea	o0,time_string_1
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif
	nop

	lea	a0,execute_time
	lwz	d0,0(a0)
	bl	_print_time

	lea	o0,time_string_2
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif

	lea	a0,garbage_collect_time
	lwz	d0,0(a0)
	bl	_print_time

 if MEASURE_GC
	lea	o0,time_string_2a
  if STDERR_TO_FILE
	bl	.er_print_string
  else
	bl	.ew_print_string
  endif
	lea	a0,mark_compact_garbage_collect_time
	lwz	d0,0(a0)
	bl	_print_time

	lea	o0,time_string_2a
  if STDERR_TO_FILE
	bl	.er_print_string
  else
	bl	.ew_print_string
  endif
	lea	a0,compact_garbage_collect_time
	lwz	d0,0(a0)
	bl	_print_time
 endif

	lea	o0,time_string_3
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif

	lea	a0,IO_time
	lwz	d0,0(a0)
	bl	_print_time

	lea	o0,time_string_4
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif

	lea	a0,execute_time
	lwz	d0,0(a0)
	lea	a0,garbage_collect_time
	lwz	d2,0(a0)
	add	d0,d0,d2
 if MEASURE_GC
	lea	a0,mark_compact_garbage_collect_time
	lwz	d2,0(a0)
	add	d0,d0,d2
	lea	a0,compact_garbage_collect_time
	lwz	d2,0(a0)
	add	d0,d0,d2
 endif
	lea	a0,IO_time
	lwz	d2,0(a0)
	add	d0,d0,d2

	bl	_print_time

 if MEASURE_GC
	li	o0,13
  if STDERR_TO_FILE
	bl	.er_print_char
  else
	bl	.ew_print_char
  endif
	nop

	lea	o0,total_gc_bytes_hi
	lwz	o0,0(o0)
  if STDERR_TO_FILE
	bl	.er_print_int
  else
	bl	.ew_print_int
  endif
  	nop

	li	o0,':'
  if STDERR_TO_FILE
	bl	.er_print_char
  else
	bl	.ew_print_char
  endif
	nop

	lea	o0,total_gc_bytes_lo
	lwz	o0,0(o0)
  if STDERR_TO_FILE
	bl	.er_print_int
  else
	bl	.ew_print_int
  endif
  	nop

	li	o0,32
  if STDERR_TO_FILE
	bl	.er_print_char
  else
	bl	.ew_print_char
  endif
	nop
	
	lea	o0,total_compact_gc_bytes_hi
	lwz	o0,0(o0)
  if STDERR_TO_FILE
	bl	.er_print_int
  else
	bl	.ew_print_int
  endif
  	nop

	li	o0,':'
  if STDERR_TO_FILE
	bl	.er_print_char
  else
	bl	.ew_print_char
  endif
	nop

	lea	o0,total_compact_gc_bytes_lo
	lwz	o0,0(o0)
  if STDERR_TO_FILE
	bl	.er_print_int
  else
	bl	.ew_print_int
  endif
  	nop
 endif

	li	o0,13
 if STDERR_TO_FILE
	bl	.er_print_char
 else
	bl	.ew_print_char
 endif
	nop

 if MEASURE_GC
	lea	g0,total_gc_bytes_hi
	lea	g1,total_gc_bytes_lo
	bl	fload_52_bit_int
  if STDERR_TO_FILE
	bl	.er_print_real
  else
	bl	.ew_print_real
  endif
	nop

	li	o0,' '
	bl	.er_print_char
	nop

	lea	g0,total_compact_gc_bytes_hi
	lea	g1,total_compact_gc_bytes_lo
	bl	fload_52_bit_int
  if STDERR_TO_FILE
	bl	.er_print_real
  else
	bl	.ew_print_real
  endif
	nop

	li	o0,' '
	bl	.er_print_char
	nop

	lea	g1,garbage_collect_time
	lea	o1,f_power2_52
	lwz	g1,0(g1)
	lis	o0,0x4330
	stw	g1,-4(sp)
	stw	o0,-8(sp)
	lfd	f2,0(o1)
	lfd	f1,-8(sp)
	fsub	f1,f1,f2
 if STDERR_TO_FILE
	bl	.er_print_real
 else
	bl	.ew_print_real
 endif
	nop

	li	o0,' '
	bl	.er_print_char
	nop

	lea	g1,mark_compact_garbage_collect_time
	lea	o1,f_power2_52
	lwz	g1,0(g1)
	lis	o0,0x4330
	stw	g1,-4(sp)
	stw	o0,-8(sp)
	lfd	f2,0(o1)
	lfd	f1,-8(sp)
	fsub	f1,f1,f2
  if STDERR_TO_FILE
	bl	.er_print_real
  else
	bl	.ew_print_real
  endif
	nop

	li	o0,' '
	bl	.er_print_char
	nop

	lea	g1,compact_garbage_collect_time
	lea	o1,f_power2_52
	lwz	g1,0(g1)
	lis	o0,0x4330
	stw	g1,-4(sp)
	stw	o0,-8(sp)
	lfd	f2,0(o1)
	lfd	f1,-8(sp)
	fsub	f1,f1,f2
  if STDERR_TO_FILE
	bl	.er_print_real
  else
	bl	.ew_print_real
  endif
	nop

	li	o0,' '
	bl	.er_print_char
	nop

	lea	g0,total_gc_bytes_hi
	lea	g1,total_gc_bytes_lo
	bl	fload_52_bit_int
	lea	g1,garbage_collect_time
	bl	compute_mb_per_second
  if STDERR_TO_FILE
	bl	.er_print_real
  else
	bl	.ew_print_real
  endif
	nop

	li	o0,' '
	bl	.er_print_char
	nop

	lea	g0,total_compact_gc_bytes_hi
	lea	g1,total_compact_gc_bytes_lo
	bl	fload_52_bit_int
	lea	g1,mark_compact_garbage_collect_time
	bl	compute_mb_per_second
  if STDERR_TO_FILE
	bl	.er_print_real
  else
	bl	.ew_print_real
  endif
	nop

	li	o0,' '
	bl	.er_print_char
	nop

	lea	g0,total_compact_gc_bytes_hi
	lea	g1,total_compact_gc_bytes_lo
	bl	fload_52_bit_int
	lea	g1,compact_garbage_collect_time
	bl	compute_mb_per_second
  if STDERR_TO_FILE
	bl	.er_print_real
  else
	bl	.ew_print_real
  endif
	nop

	li	o0,' '
	bl	.er_print_char
	nop

	lea	g0,total_compact_gc_bytes_hi
	lea	g1,total_compact_gc_bytes_lo
	bl	fload_52_bit_int
	lea	g0,mark_compact_garbage_collect_time
	lea	g1,compact_garbage_collect_time
	lwz	g0,0(g0)
	lwz	g1,0(g1)
	lis	o0,0x4330
	add	g1,g1,g0
	stw	g1,-4(sp)
	stw	o0,-8(sp)
	lfd	f3,0(o1)
	lfd	f2,-8(sp)
	lea	o1,f_60
	lea	o0,f_1000000
	fsub	f2,f2,f3
	lfd	f4,0(o1)
	lfd	f3,0(o0)
	fmul	f1,f1,f4
	fmul	f2,f2,f3
	fdiv	f1,f1,f2
  if STDERR_TO_FILE
	bl	.er_print_real
  else
	bl	.ew_print_real
  endif
	nop

	li	o0,13
	bl	.er_print_char
	nop
 endif

	lea	o1,execute_time
	li	o0,0
	stw	o0,0(o1)

	lea	o1,garbage_collect_time
	stw	o0,0(o1)
 if MEASURE_GC
	lea	o1,mark_compact_garbage_collect_time
	stw	o0,0(o1)

	lea	o1,compact_garbage_collect_time
	stw	o0,0(o1)
 endif
	lea	o1,IO_time
	stw	o0,0(o1)

 if MEASURE_GC
	lea	o1,total_gc_bytes_hi
	stw	o0,0(o1)
	lea	o1,total_gc_bytes_lo
	stw	o0,0(o1)
	lea	o1,total_compact_gc_bytes_hi
	stw	o0,0(o1)
	lea	o1,total_compact_gc_bytes_lo
	stw	o0,0(o1)
 endif

	lwz	r0,64+8(sp)
	addi	sp,sp,64
	mtlr	r0
	blr

 if MEASURE_GC
fload_52_bit_int:
	lea	o1,f_power2_52
	lwz	g0,0(g0)
	lwz	g1,0(g1)
	lis	o0,0x4330
	andc	g0,g0,o0
	or	g0,g0,o0
	stw	g1,-4(sp)
	stw	g0,-8(sp)
	lfd	f2,0(o1)
	lfd	f1,-8(sp)
	fsub	f1,f1,f2
	blr

compute_mb_per_second:
	lwz	g1,0(g1)
	lis	o0,0x4330
	stw	g1,-4(sp)
	stw	o0,-8(sp)
	lfd	f3,0(o1)
	lfd	f2,-8(sp)
	lea	o1,f_60
	lea	o0,f_1000000
	fsub	f2,f2,f3
	lfd	f4,0(o1)
	lfd	f3,0(o0)
	fmul	f1,f1,f4
	fmul	f2,f2,f3
	fdiv	f1,f1,f2
	blr
 endif

	csect	text{PR}

__driver:
	lea	o1,flags
	lwz	o0,0(o1)
	andi.	r0,o0,16
	bne	_eval__to__nf
	b	__print__graph
_eval__to__nf:
	b	__eval__to__nf

_print_time:
	mflr	r0
	stwu	r0,-4(sp)

 if LINUX
	li	o1,100
 else
	li	o1,60
 endif
	divwu	o2,d0,o1

 if LINUX
	mulli	o3,o2,100
 	sub	o3,d0,o3
 else
	mulli	o3,o2,60
	sub	o3,d0,o3
	mulli	o3,o3,5
	li	o1,3
	divwu	o3,o3,o1
 endif		
	lea	o1,sprintf_time_string
	lea	o0,sprintf_time_buffer

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.sprintf
	nop

	lea	o0,sprintf_time_buffer
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif
	nop
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif
	lwz	r0,0(sp)
	addi	sp,sp,4
	mtlr	r0

	blr	

no_memory_1:
	lea	o0,out_of_memory_string_1

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif
	nop
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif
	b	exit_1

print_sc:
	lea	o0,basic_only
	lwz	o1,0(o0)
	cmpwi	0,o1,0
	bne	end_print
print_:
	mr	o0,d0

print_string_o0_and_return:
	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.w_print_string
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,8
 else
	lwz	r0,64(sp)
	addi	sp,sp,72
 endif
	mtlr	r0
	lwz	r0,-4(sp)
	blr	

end_print:
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr

printD:	andi.	r0,d0,2
	bne	printD_

	mr	a2,d0
	b	print_string_a2

print_symbol:
	li	d1,0
	b	print_symbol_2

print_symbol_sc:
	lea	o0,basic_only
	lwz	d1,0(o0)
print_symbol_2:
	lwz	d0,0(a0)
		
	cmpw	0,int_reg,d0
	beq	print_int_node

	cmpw	0,char_reg,d0
	beq	print_char_node

	cmpw	0,bool_reg,d0
	beq	print_bool

	cmpw	0,real_reg,d0
	beq	print_real_node

	cmpwi	0,d1,0
	bne	end_print_symbol

printD_:
	lha	d1,-2(d0)
 if NEW_DESCRIPTORS
	cmplwi	0,d1,256
	bge	print_record

	lhz	d1,0(d0)
	addi	a2,d0,10
	add	a2,a2,d1
	b	print_string_a2

print_record:
	lwz	a2,-6(d0)
	b	print_string_a2
 else
	addi	a2,d0,-2

	cmplwi	0,d1,256
	bge	print_record

	slwi	d1,d1,3
	sub	a2,a2,d1

 	lhz	d1,DESCRIPTOR_ARITY_OFFSET(a2)
	addi	a2,a2,4
	slwi	d1,d1,3
	add	a2,a2,d1
	b	print_string_a2

print_record:
	lwz	a2,-4(a2)
	b	print_string_a2
 endif

end_print_symbol:
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

print_int_node:
	lwz	o0,4(a0)
print_int2:
	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.w_print_int
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,8
 else
	lwz	r0,64(sp)
	addi	sp,sp,72
 endif
	mtlr	r0
	lwz	r0,-4(sp)
	blr	

print_int:
	mr	o0,d0
	b	print_int2

print_char:
	lea	o0,basic_only
	lwz	d1,0(o0)
	cmpwi	0,d1,0
	bne	print_char_node_bo

	b	print_char_node_sc
		
print_char_node:
	cmpwi	0,d1,0
	lwz	d0,4(a0)
	bne	print_char_node_sc
print_char_node_bo:
	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	li	o0,0x27
	bl	.w_print_char
		
	mr	o0,d0
	bl	.w_print_char

	li	o0,0x27
	bl	.w_print_char
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,8
 else
	lwz	r0,64(sp)
	addi	sp,sp,72
 endif
	mtlr	r0
	lwz	r0,-4(sp)
	blr	

print_char_node_sc:
	mr	o0,d0

	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.w_print_char
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,8
 else
	lwz	r0,64(sp)
	addi	sp,sp,72
 endif
	mtlr	r0
	lwz	r0,-4(sp)
	blr	
		
print_bool:
	lbz	o0,7(a0)
	cmpwi	0,o0,0
	beq	print_false

print_true:
	lea	o0,true_c_string
	b	print_string_o0_and_return

print_false:
	lea	o0,false_c_string
	b	print_string_o0_and_return

print_real:
	fmr	f1,f14
	b	print_real_
print_real_node:
	lfd	f1,4(a0)
print_real_:
	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.w_print_real
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,8
 else
	lwz	r0,64(sp)
	addi	sp,sp,72
 endif
	mtlr	r0
	lwz	r0,-4(sp)
	blr	

print_string_a2:
	lwz	o1,0(a2)
	addi	o0,a2,4

	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.w_print_text
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,8
 else
	lwz	r0,64(sp)
	addi	sp,sp,72
 endif
	mtlr	r0
	lwz	r0,-4(sp)
	blr	

print__chars__sc:
	lea	o0,basic_only
	lwz	d1,0(o0)
	cmpwi	0,d1,0
	bne	no_print_chars

print__string__:
	lwz	o1,4(a0)
	addi	o0,a0,8

	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.w_print_text
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,8
 else
	lwz	r0,64(sp)
	addi	sp,sp,72
 endif
	mtlr	r0
	lwz	r0,-4(sp)
	blr

no_print_chars:
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr

	csect	.eprint__
eprint__:
	mr	o0,d0

	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,8
 else
	lwz	r0,64(sp)
	addi	sp,sp,72
 endif
	mtlr	r0
	lwz	r0,-4(sp)
	blr

	csect	.eprint__string__
eprint__string__:
	lwz	o1,4(a0)
	addi	o0,a0,8

	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
 if STDERR_TO_FILE
	bl	.er_print_text
 else
	bl	.ew_print_text
 endif
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,8
 else
	lwz	r0,64(sp)
	addi	sp,sp,72
 endif
	mtlr	r0
	lwz	r0,-4(sp)
	blr	

	csect	.eprintD
eprintD:
	andi.	r0,d0,2
	bne	eprintD_

	mr	a2,d0
	b	eprint_string_a2

eprintD_:
	lha	d1,-2(d0)
 if NEW_DESCRIPTORS
	cmplwi	0,d1,256
	bge	eprint_record

	lhz	d1,0(d0)
	addi	a2,d0,10
	add	a2,a2,d1
 else
	addi	a2,d0,-2

	cmplwi	0,d1,256
	bge	eprint_record

	slwi	d1,d1,3
	sub	a2,a2,d1

 	lhz	d1,DESCRIPTOR_ARITY_OFFSET(a2)
	addi	a2,a2,4
	slwi	d1,d1,3
	add	a2,a2,d1
 endif
	b	eprint_string_a2

eprint_record:
 if NEW_DESCRIPTORS
	lwz	a2,-6(d0)
 else
	lwz	a2,-4(a2)
 endif

eprint_string_a2:
	lwz	o1,0(a2)
	addi	o0,a2,4

	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
 if STDERR_TO_FILE
	bl	.er_print_text
 else
	bl	.ew_print_text
 endif
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,8
 else
	lwz	r0,64(sp)
	addi	sp,sp,72
 endif
	mtlr	r0
	lwz	r0,-4(sp)
	blr	

	csect	.DtoAC

DtoAC:
	lha	d1,-2(d0)
 if NEW_DESCRIPTORS
	cmplwi	0,d1,256
	bge	DtoAC_record

	lhz	d1,0(d0)
	addi	a0,d0,10
	add	a0,a0,d1
 else
	addi	a0,d0,-2

	cmplwi	0,d1,256
	bge	DtoAC_record

	slwi	d1,d1,3
	bsub	a0,d1

	lhz	d1,DESCRIPTOR_ARITY_OFFSET(a0)
	baddi	a0,4
	slwi	d1,d1,3
	badd	a0,d1
 endif

DtoAC_a0:
	lwz	d2,0(a0)
	mr	a2,a0

	addi	d3,d2,3
	bsubi	d7,2

	srwi	d3,d3,2		
	sub.	d7,d7,d3
	blt	DtoAC_gc
DtoAC_r_gc:
	lea	o1,__STRING__2

	subic.	d3,d3,1

	addi	a0,a6,4
	stw	o1,4(a6)
	stwu	d2,8(a6)
	blt	DtoAC_copy

DtoAC_copy_lp:
	lwzu	o0,4(a2)
	subic.	d3,d3,1
	stwu	o0,4(a6)
	bge	DtoAC_copy_lp
DtoAC_copy:

	lwz	r0,0(sp)
	baddi	sp,4
	blr	

DtoAC_gc:	mflr	r0
	mr	d0,a0
	bl	collect_0
	mr	a2,d0
	b	DtoAC_r_gc

DtoAC_record:
 if NEW_DESCRIPTORS
	lwz	a0,-6(d0)
 else
	lwz	a0,-4(a0)
 endif
	b	DtoAC_a0

	csect	.push_a_r_args
push_a_r_args:
	lwz	a1,8(a0)
	subi	a1,a1,2
	lhz	d3,0(a1)
	subi	d3,d3,256
	lhz	d1,2(a1)
	addi	a1,a1,4
	sub	d2,d3,d1
	slwi	d0,d0,2

	mullw	d4,d0,d3
	addi	a0,a0,12
	add	a0,a0,d4

	lwz	r0,0(sp)
	addi	sp,sp,4

	slwi	o0,d1,2
	add	a0,a0,o0
	mr	a3,a0
	b	push_a_elements

push_a_elements_lp:
	lwzu	o0,-4(a3)
	addi	a4,a4,4
	stw	o0,-4(a4)
push_a_elements:
	subic.	d1,d1,1
	bge	push_a_elements_lp

	slwi	o0,d2,2
	add	a0,a0,o0
	b	push_b_elements

push_b_elements_lp:
	lwzu	o0,-4(a0)
	stwu	o0,-4(sp)
push_b_elements:
	subic.	d2,d2,1
	bge	push_b_elements_lp

	mr	d0,a1
	blr	

push_t_r_args:
	lwz	a1,0(a0)
	addi	a0,a0,4
	subi	a1,a1,2
	lhz	d3,0(a1)
	lhz	d1,2(a1)
	subi	d3,d3,256
	addi	d0,a1,4
	sub	d2,d3,d1

	slwi	d4,d3,2
	cmplwi	0,d3,2
	add	a1,a0,d4
	ble	small_record
		
	lwz	a1,4(a0)
	subi	a1,a1,4
	add	a1,a1,d4
small_record:
	lwz	r0,0(sp)
	addi	sp,sp,4
	b	push_r_b_elements

push_r_b_elements_lp:
	subic.	d3,d3,1
	bne	not_first_arg_b
		
	lwz	o0,0(a0)
	stwu	o0,-4(sp)
	b	push_r_b_elements
not_first_arg_b:
	lwzu	o0,-4(a1)
	stwu	o0,-4(sp)
push_r_b_elements:
	subic.	d2,d2,1
	bge	push_r_b_elements_lp

	b	push_r_a_elements

push_r_a_elements_lp:
	subic.	d3,d3,1
	addi	a4,a4,4
	bne	not_first_arg_a

	lwz	o0,0(a0)
	stw	o0,-4(a4)
	b	push_r_a_elements

not_first_arg_a:
	lwzu	o0,-4(a1)
	stw	o0,-4(a4)
push_r_a_elements:
	subic.	d1,d1,1
	bge	push_r_a_elements_lp

	blr	

	csect	.BtoAC
BtoAC:
	andi.	d0,d0,255
	beq	BtoAC_false
BtoAC_true:
	lea	a0,true_string
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr
BtoAC_false:
	lea	a0,false_string
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	.RtoAC
RtoAC:
 if LINUX
 	fmr	f1,f14
 else
	stfd	f14,-8(sp)
 endif
	lea	o1,printf_real_string
	lea	o0,sprintf_buffer
 if LINUX
	creqv	6,6,6
 else
	lwz	o2,-8(sp)
	lwz	o3,-4(sp)
 endif
	mflr	r0
 if MACOSX
	stwu	r0,-4(sp)
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stw	r0,-4(sp)
	stwu	sp,-64(sp)
 endif
	bl	.sprintf
	nop
 if MACOSX
 	lwz	sp,0(sp)
	lwz	r0,0(sp)
	addi	sp,sp,4
 else
	lwz	r0,60(sp)
	addi	sp,sp,64
 endif
	mtlr	r0

	b	return_sprintf_buffer_string
		
	csect	.ItoAC
ItoAC:
 if MY_ITOS
	lea	a0,sprintf_buffer
	cmpwi	0,d0,0
	bge	no_minus

	li	o0,45
	stb	o0,0(a0)
	addi	a0,a0,1
	li	g0,0
	sub	d0,g0,d0
no_minus:
	addi	a2,a0,12
	beq	zero_digit

calculate_digits:
	cmplwi	0,d0,10
	blt	last_digit

 if 1
	lis	o0,-13107
	subi	o0,o0,13107
	mulhwu	o0,o0,d0

	rlwinm	o1,o0,0,0,31-3
	srwi	o0,o0,3

	sub	a1,d0,o1
	slwi	o1,o0,1

	sub	a1,a1,o1
 else
	li	o1,10
	divwu	o0,d0,o1

	mullw	a1,o0,o1
	sub	a1,d0,a1
 endif
	addi	a1,a1,48
	mr	d0,o0

	stb	a1,0(a2)
	addi	a2,a2,1		
	b	calculate_digits

last_digit:
	cmpwi	0,d0,0
	beq	no_zero
zero_digit:
	addi	d0,d0,48
	stb	d0,0(a2)
	addi	a2,a2,1
no_zero:
	addi	a1,a0,12

reverse_digits:
	lbzu	d1,-1(a2)
	cmpw	0,a2,a1
	stb	d1,0(a0)
	addi	a0,a0,1
	bne	reverse_digits

	li	g0,0
	lea	d0,sprintf_buffer

	stb	g0,0(a0)
	sub	d0,a0,d0
	b	sprintf_buffer_to_string

 else	
	mr	o2,d0
	lea	o1,printf_int_string
	lea	o0,sprintf_buffer
	
  if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
  else
	stwu	sp,-64(sp)
  endif
	bl	.sprintf
	nop
  if MACOSX
 	lwz	sp,0(sp)
  else
	addi	sp,sp,64
  endif
 endif

return_sprintf_buffer_string:
	lea	o0,sprintf_buffer
	li	d0,-1
	subi	o0,o0,1
	
count_chars_in_c_string:
	lbzu	d1,1(o0)
	addi	d0,d0,1
	cmpwi	d1,0
	bne	count_chars_in_c_string

 if MY_ITOS
sprintf_buffer_to_string:
 endif
	addi	d1,d0,3
	srwi	d1,d1,2
	subi	d7,d7,2
	sub.	d7,d7,d1
	bge+	D_to_S_no_gc

	mflr	r0
	bl	collect_0

D_to_S_no_gc:
	lea	a0,sprintf_buffer
	lea	o0,__STRING__2
	addi	d2,a6,4
	stw	o0,4(a6)
	stwu	d0,8(a6)
	b	D_to_S_cp_str_2

D_to_S_cp_str_1:
	lwz	o0,0(a0)
	addi	a0,a0,4
	stwu	o0,4(a6)
D_to_S_cp_str_2:
	subic.	d1,d1,1
	bge	D_to_S_cp_str_1

	mr	a0,d2		
	lwz	r0,0(sp)
	addi	sp,sp,4
#ifdef USE_DCBZ
	li	g2,32
#endif
	blr	

	csect	.eqD
eqD:	lwz	d0,0(a0)
	lwz	o0,0(a1)
	cmpw	0,d0,o0
	bne	eqD_false

	cmpw	0,d0,int_reg
	beq	eqD_INT

	cmpw	0,d0,char_reg
	beq	eqD_CHAR

	cmpw	0,d0,bool_reg
	beq	eqD_BOOL

	cmpw	0,d0,real_reg
	beq	eqD_REAL

	li	d0,-1

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

eqD_CHAR:
eqD_INT:	lwz	d1,4(a0)
	lwz	o0,4(a1)
	li	d0,0
	cmpw	0,d1,o0

	mfcr	d0
	srwi	d0,d0,31-2
	andi.	d0,d0,1

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

eqD_BOOL:	lbz	d1,7(a0)
	lbz	o0,7(a1)
	li	d0,0
	cmpw	0,d1,o0

	mfcr	d0
	srwi	d0,d0,31-2
	andi.	d0,d0,1

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

eqD_REAL:	lfd	f0,4(a0)
	lfd	f1,4(a1)

	fcmpo	0,f0,f1

	mfcr	d0
	srwi	d0,d0,31-2
	andi.	d0,d0,1

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

eqD_false:
	li	d0,0

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

;
;	the timer
;

_init_timer:
	mflr	r0
	stwu	r0,-4(sp)
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
 if LINUX
	addi	o0,sp,8
	bl	times
	lwz	o0,8(sp)
 else
	bl	.TickCount
	nop
 endif
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif
	lwz	r0,0(sp)
	addi	sp,sp,4
	mtlr	r0

	lea	o1,last_time
	stw	o0,0(o1)
		
	lea	o1,execute_time
	li	o0,0
	stw	o0,0(o1)

	lea	o1,garbage_collect_time
	stw	o0,0(o1)
 if MEASURE_GC
	lea	o1,mark_compact_garbage_collect_time
	stw	o0,0(o1)

	lea	o1,compact_garbage_collect_time
	stw	o0,0(o1)
 endif
	lea	o1,IO_time
	stw	o0,0(o1)

	blr	

_get_time_diff:
	mflr	r0
	stwu	r0,-4(sp)

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
 if LINUX
	addi	o0,sp,8
	bl	times
	lwz	o0,8(sp)
 else
	bl	.TickCount
	nop
 endif
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif
	lea	o2,last_time

	lwz	r0,0(sp)
	addi	sp,sp,4
	mtlr	r0

	lwz	o1,0(o2)
	stw	o0,0(o2)
	sub	o0,o0,o1

	blr	
		
.add_execute_time:
	mflr	r0
	stwu	r0,-4(sp)

	bl	_get_time_diff

	lea	o2,execute_time

	lwz	r0,0(sp)
	addi	sp,sp,4
	mtlr	r0

	lwz	o1,0(o2)
	add	o1,o1,o0
	stw	o1,0(o2)

	blr	

.add_garbage_collect_time:
	mflr	r0
	stwu	r0,-4(sp)

	bl	_get_time_diff

	lea	o2,garbage_collect_time

	lwz	r0,0(sp)
	addi	sp,sp,4
	mtlr	r0

	lwz	o1,0(o2)
	add	o1,o1,o0
	stw	o1,0(o2)

	blr	

.add_IO_time:
	mflr	r0
	stwu	r0,-4(sp)

	bl	_get_time_diff

	lea	o2,IO_time

	lwz	r0,0(sp)
	addi	sp,sp,4
	mtlr	r0

	lwz	o1,0(o2)
	add	o1,o1,o0
	stw	o1,0(o2)

	blr	

 if MEASURE_GC
.add_mark_compact_garbage_collect_time:
	mflr	r0
	stwu	r0,-4(sp)

	bl	_get_time_diff

	lea	o2,mark_compact_garbage_collect_time

	lwz	r0,0(sp)
	addi	sp,sp,4
	mtlr	r0

	lwz	o1,0(o2)
	add	o1,o1,o0
	stw	o1,0(o2)

	blr	

.add_compact_garbage_collect_time:
	mflr	r0
	stwu	r0,-4(sp)

	bl	_get_time_diff

	lea	o2,compact_garbage_collect_time

	lwz	r0,0(sp)
	addi	sp,sp,4
	mtlr	r0

	lwz	o1,0(o2)
	add	o1,o1,o0
	stw	o1,0(o2)

	blr	
 endif
;
;	the garbage collector
;

	csect	.collect_3
collect_3:
	stwu	r0,-4(sp)
 if PROFILE
	lea	r3,garbage_collector_name
	mflr	r0
	bl	profile_s
 endif
	stw	a0,0(a4)
	stw	a1,4(a4)
	stw	a2,8(a4)
	addi	a4,a4,12

	mflr	r0
	bl	collect_

	lwz	a2,-4(a4)
	lwz	a1,-8(a4)
	lwzu	a0,-12(a4)

	lwz	r0,0(sp)
	mtctr	r0
	lwz	r0,4(sp)
	mtlr	r0
	addi	sp,sp,8
 if PROFILE
	b	profile_ti
 else
	bctr
 endif

	csect	.collect_2
collect_2:
	stwu	r0,-4(sp)
 if PROFILE
	lea	r3,garbage_collector_name
	mflr	r0
	bl	profile_s
 endif
	stw	a0,0(a4)
	stw	a1,4(a4)
	addi	a4,a4,8

	mflr	r0
	bl	collect_

	lwz	a1,-4(a4)
	lwzu	a0,-8(a4)

	lwz	r0,0(sp)
	mtctr	r0
	lwz	r0,4(sp)
	mtlr	r0
	addi	sp,sp,8
 if PROFILE
	b	profile_ti
 else
	bctr
 endif

	csect	.collect_1
collect_1:
	stwu	r0,-4(sp)
 if PROFILE
	lea	r3,garbage_collector_name
	mflr	r0
	bl	profile_s
 endif
	stw	a0,0(a4)
	addi	a4,a4,4

	mflr	r0
	bl	collect_

	lwzu	a0,-4(a4)

	lwz	r0,0(sp)
	mtctr	r0
	lwz	r0,4(sp)
	mtlr	r0
	addi	sp,sp,8
 if PROFILE
	b	profile_ti
 else
	bctr
 endif

	csect	.collect_0
collect_0:
	stwu	r0,-4(sp)
 if PROFILE
	lea	r3,garbage_collector_name
	mflr	r0
	bl	profile_s
 endif
	mflr	r0
	bl	collect_

	lwz	r0,0(sp)
	mtctr	r0
	lwz	r0,4(sp)
	mtlr	r0
	addi	sp,sp,8
 if PROFILE
	b	profile_ti
 else
	bctr
 endif

	csect	.collect_03
collect_03:
	stwu	r0,-4(sp)
 if PROFILE
	lea	r3,garbage_collector_name
	mflr	r0
	bl	profile_s
 endif
	stw	a0,0(a4)
	stw	a1,4(a4)
	stw	a2,8(a4)
	addi	a4,a4,12

	mflr	r0
	bl	collect_

	lwz	a2,-4(a4)
	lwz	a1,-8(a4)
	lwzu	a0,-12(a4)

	lwz	r0,0(sp)
	mtctr	r0
	lwz	r0,4(sp)
	addi	sp,sp,8
 if PROFILE
	b	profile_ti
 else
	bctr
 endif

	csect	.collect_02
collect_02:
	stwu	r0,-4(sp)
 if PROFILE
	lea	r3,garbage_collector_name
	mflr	r0
	bl	profile_s
 endif
	stw	a0,0(a4)
	stw	a1,4(a4)
	addi	a4,a4,8

	mflr	r0
	bl	collect_

	lwz	a1,-4(a4)
	lwzu	a0,-8(a4)

	lwz	r0,0(sp)
	mtctr	r0
	lwz	r0,4(sp)
	addi	sp,sp,8
 if PROFILE
	b	profile_ti
 else
	bctr
 endif

	csect	.collect_01
collect_01:
	stwu	r0,-4(sp)
 if PROFILE
	lea	r3,garbage_collector_name
	mflr	r0
	bl	profile_s
 endif
	stw	a0,0(a4)
	addi	a4,a4,4

	mflr	r0
	bl	collect_

	lwzu	a0,-4(a4)

	lwz	r0,0(sp)
	mtctr	r0
	lwz	r0,4(sp)
	addi	sp,sp,8
 if PROFILE
	b	profile_ti
 else
	bctr
 endif

	csect	.collect_00
collect_00:
	stwu	r0,-4(sp)
 if PROFILE
	lea	r3,garbage_collector_name
	mflr	r0
	bl	profile_s
 endif
	mflr	r0
	bl	collect_

	lwz	r0,0(sp)
	mtctr	r0
	lwz	r0,4(sp)
	addi	sp,sp,8
 if PROFILE
	b	profile_ti
 else
	bctr
 endif


	csect	._collect_
collect_:
	stwu	r0,-4(sp)

	addi	a6,a6,4
 if USE_DCBZ
 	addi	d7,d7,15
 endif

 if MARK_AND_COPY_GC
 	lea	o0,flags
	lwz	o0,0(o0)
	andi.	r0,o0,64
	beq	no_mark3
 endif

 if MARK_GC
	lea	g1,bit_counter
	lwz	o2,0(g1)
	li	g0,0

	tst	o2
	beq	no_scan

	mtctr	o2

	lea	o4,heap_end_after_gc
	lea	a0,bit_vector_p
	lwz	o4,0(o4)
	lwz	a0,0(a0)
	sub	o4,o4,a6
	srwi	o4,o4,2
	sub	o4,o4,d7

scan_bits:
	lwz	o0,0(a0)
	addi	a0,a0,4
	cmpwi	o0,0
	beq	zero_bits
	stw	g0,-4(a0)
	bdnz	scan_bits

	b	end_scan

zero_bits:
	mr	a1,a0
	bdnz	skip_zero_bits_lp+4
	b	end_bits

skip_zero_bits_lp:
	bne	end_zero_bits
	lwz	o3,0(a0)
	addi	a0,a0,4
	tst	o3
	bdnz	skip_zero_bits_lp

	beq	end_bits
	stw	g0,-4(a0)
	sub	o3,a0,a1
	b	end_bits2

end_zero_bits:
	lea	g1,free_after_mark

	sub	o3,a0,a1
	slwi	o3,o3,3

	cmplw	0,o3,o4

	lwz	o1,0(g1)
	stw	g0,-4(a0)

	add	o1,o1,o3
	stw	o1,0(g1)
	blt	scan_bits

found_free_memory:
	mfctr	o2
	lea	o1,bit_counter
	lea	g1,bit_vector_p
	stw	o2,0(o1)
	stw	a0,0(g1)

	lea	o1,heap_vector
	sub	d7,o3,o4

	lwz	o1,0(o1)
	subi	o2,a1,4
	lea	g1,heap_p3
	sub	o2,o2,o1
	lwz	o1,0(g1)
	slwi	o2,o2,5

	add	a6,o2,o1

	slwi	o3,o3,2
	lea	g1,heap_end_after_gc
	add	o2,a6,o3
	stw	o2,0(g1)

 if USE_DCBZ
 	subi	d7,d7,15
	li	g2,32
 endif
	subi	a6,a6,4
	blr	

end_bits:
	sub	o3,a0,a1
	addi	o3,o3,4
end_bits2:
	lea	g1,free_after_mark

	slwi	o3,o3,3

	lwz	o1,0(g1)
	cmplw	0,o3,o4
	add	o1,o1,o3
	stw	o1,0(g1)
	bge	found_free_memory

end_scan:
	mfctr	o2
	lea	g1,bit_counter
	stw	o2,0(g1)
no_scan:
 endif

 if MARK_AND_COPY_GC
no_mark3:
 endif
	mflr	r0
	stwu	r0,-4(sp)

	subi	sp,sp,28
	stw	d0,0(sp)
	stw	d1,4(sp)
	stw	d2,8(sp)
	stw	d3,12(sp)
	stw	d4,16(sp)

	lea	g1,garbage_collect_flag

	stw	d5,20(sp)

	lbz	o0,0(g1)

	stw	d6,24(sp)

	extsb	o0,o0
	cmpwi	0,o0,0
	ble	collect

	subi	o0,o0,2
	stb	o0,0(g1)

	lea	o0,heap_end_after_gc
	lwz	d0,0(o0)
	sub	d0,d0,a6
	srwi	d0,d0,2
	lea	o0,extra_heap_size
	sub	d0,d0,d7
	lwz	d1,0(o0)
	cmplw	0,d0,d1
	bgt	collect

	lea	o0,extra_heap_size
	lwz	d1,0(o0)

	lea	o0,extra_heap

	sub	d7,d1,d0

	lwz	a6,0(o0)
	slwi	d1,d1,2
	lea	o0,heap_end_after_gc
	add	d1,d1,a6
	stw	d1,0(o0)

	lwz	d0,0(sp)
	lwz	d1,4(sp)
	lwz	d2,8(sp)
	lwz	d3,12(sp)
	lwz	d4,16(sp)
	lwz	d5,20(sp)
	lwz	d6,24(sp)

	lwz	r0,28(sp)
	mtlr	r0

 if USE_DCBZ
 	subi	d7,d7,15
	li	g2,32
 endif
	subi	a6,a6,4

	addi	sp,sp,32
	blr	

collect:
	bl	.add_execute_time

	lea	o1,flags
	lwz	o0,0(o1)
	andi.	r0,o0,4
	beq	no_print_stack_sizes
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	lea	o0,garbage_collect_string_1
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif
	nop

	lea	o0,stack_p
	lwz	a0,0(o0)
	sub	o0,a4,a0
 if MACOSX
	lea	o1,halt_sp
	lwz	d0,0(o1)
 else
	lea	o1,stack_size
	lwz	o2,0(o1)
	add	d0,a0,o2
 endif
	sub	d0,d0,sp
 if STDERR_TO_FILE
	bl	.er_print_int
 else
	bl	.ew_print_int
 endif
	nop

	lea	o0,garbage_collect_string_2
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif
	nop

	mr	o0,d0
 if STDERR_TO_FILE
	bl	.er_print_int
 else
	bl	.ew_print_int
 endif
	nop

	lea	o0,garbage_collect_string_3
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif
	nop
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif
no_print_stack_sizes:
	cmplw	0,a4,sp
	bgt	stack_overflow

 if MARK_AND_COPY_GC
 	lea	o0,flags
	lwz	o0,0(o0)
	andi.	r0,o0,64
	bne	compacting_collector
 else
  if MARK_GC
	b	compacting_collector
  endif
 endif

 if MARK_AND_COPY_GC || !MARK_GC
	lea	o0,garbage_collect_flag
	lbz	o1,0(o0)
	extsb.	o1,o1
	bne	compacting_collector

 if COPIED_VECTOR
	lea	o1,heap_end_after_copy_gc
	li	g0,0
	lwz	a1,0(o1)
	lea	a2,heap_copied_vector
	tst	a1

	lea	o0,heap_copied_vector_size
	lwz	a2,0(a2)
	lwz	d1,0(o0)

	beq	zero_all

	lea	o0,heap_p1
	stw	g0,0(o1)
	lwz	a0,0(o0)
	sub	d0,a6,a0
	addi	d0,d0,63*4
	srwi	d0,d0,8
	bl	zero_bit_vector

	sub	d2,a1,a0
	lea	a2,heap_copied_vector
	clrrwi	d2,d2,8
	lwz	a2,0(a2)
	srwi	d2,d2,6
	add	a2,a2,d2

	sub	d0,d1,d2
	srwi	d0,d0,2
	bl	zero_bit_vector

	b	end_zero_bit_vector

zero_all:
	srwi	d0,d1,2 
	bl	zero_bit_vector

end_zero_bit_vector:
 endif

; calculate alloc_size
	lea	o0,heap_end_after_gc
	lwz	d0,0(o0)
	lea	o1,alloc_size
	sub	d0,d0,a6
	srwi	d0,d0,2
	sub	d0,d0,d7
	stw	d0,0(o1)

	include	'pcopy.a'

 if WRITE_HEAP
	lea	o0,heap2_begin_and_end
	stw	o4,0(o0)
 endif

	lea	o0,heap_end_after_gc
	stw	o4,0(o0)

	sub	d7,o4,a6

 if MEASURE_GC
	lea	o1,heap_size_129
	lea	o0,total_gc_bytes_lo
	lwz	d0,0(o1)
	lwz	o1,0(o0)
	slwi	d0,d0,6
	sub	d0,d0,d7
	addc	o1,o1,d0
	stw	o1,0(o0)
	lea	o0,total_gc_bytes_hi
 	lwz	o1,0(o0)
 	addze	o1,o1
 	stw	o1,0(o0)	
 endif

	srwi	d7,d7,2

	bl	.add_garbage_collect_time

	lea	o0,alloc_size
	lwz	o1,0(o0)
	sub.	d7,d7,o1
	blt	switch_to_mark_scan
;	bneg	out_of_memory_4

	slwi	d0,d7,2
	add	d0,d0,d7
	slwi	d0,d0,5
	lea	o0,heap_size
	lwz	d2,0(o0)
	slwi	d1,d2,2
	add	d1,d1,d2
	slwi	d1,d1,1
	add	d1,d1,d2
	cmplw	0,d0,d1
	bge	no_mark_scan
;	b	no_mark_scan

switch_to_mark_scan:
	lea	o0,heap_size_33
	lwz	d0,0(o0)
	slwi	d0,d0,5
	lea	o0,heap_p
	lwz	d1,0(o0)

	lea	o0,heap_p1
	lwz	d2,0(o0)
	lea	o0,heap_p2
	lwz	o1,0(o0)
	cmplw	0,d2,o1
	blt	vector_at_begin
		
vector_at_end:
	lea	o0,heap_p3
	stw	d1,0(o0)
	add	d1,d1,d0
	lea	o0,heap_vector
	stw	d1,0(o0)
		
	lea	o0,heap_p1
	lwz	d0,0(o0)
	lea	o0,extra_heap
	stw	d0,0(o0)
	sub	d1,d1,d0
	srwi	d1,d1,2
	lea	o0,extra_heap_size
	stw	d1,0(o0)
	b	switch_to_mark_scan_2

vector_at_begin:
	lea	o0,heap_vector
	stw	d1,0(o0)
	lea	o1,heap_size
	lwz	o0,0(o1)
	add	d1,d1,o0
	sub	d1,d1,d0
	lea	o0,heap_p3
	stw	d1,0(o0)
		
	lea	o0,extra_heap
	stw	d1,0(o0)
	lea	o0,heap_p2
	lwz	d2,0(o0)
	sub	d2,d2,d1
	srwi	d2,d2,2
	lea	o0,extra_heap_size
	stw	d2,0(o0)

switch_to_mark_scan_2:
	lea	o0,heap_size
	lwz	d0,0(o0)
	srwi	d0,d0,3
	sub	d0,d0,d7
	slwi	d0,d0,2
		
	lea	o0,garbage_collect_flag
	li	o1,1
	stb	o1,0(o0)
		
	cmpwi	0,d7,0
	bge	end_garbage_collect
	
	li	o1,-1
	stb	o1,0(o0)
		
	lea	o0,extra_heap_size
	lea	o1,alloc_size
	lwz	d1,0(o0)
	lwz	d7,0(o1)
	sub.	d7,d1,d7
	blt	out_of_memory_4

	lea	o0,extra_heap
	lea	o1,heap_end_after_gc
 if WRITE_HEAP
	mr	d2,a6
 endif
	lwz	a6,0(o0)
	slwi	d1,d1,2
	add	d1,d1,a6
	stw	d1,0(o1)
 if WRITE_HEAP
 	li	d3,1
	b	end_garbage_collect_
 else
	b	end_garbage_collect
 endif

no_mark_scan:
; exchange the semi_spaces

	lea	o0,heap_p1
	lea	o1,heap_p2
	lwz	d0,0(o0)
	lwz	d1,0(o1)
	stw	d0,0(o1)
	stw	d1,0(o0)

 if COPIED_VECTOR
	lea	o0,heap_size_129
	lwz	d1,0(o0)
	slwi	d1,d1,6-2
 else
	lea	o0,heap_size
	lwz	d1,0(o0)
	srwi	d1,d1,3
 endif
	sub	d0,d1,d7

  if ADJUST_HEAP_SIZE
	lea	o0,heap_size_multiple
	lwz	o0,0(o0)

	mullw	d2,d0,o0
	mulhwu	o0,d0,o0

	rlwinm	d2,d2,32-9,9,31-2
;	srwi	d2,d2,9

	rlwimi	d2,o0,32-9,0,8
	srwi.	o0,o0,9
	bne	no_small_heap1

	cmplwi	d2,MINIMUM_HEAP_SIZE/2
	bge	not_too_small1
	li	d2,MINIMUM_HEAP_SIZE/2
not_too_small1:

	sub.	d2,d1,d2
	blt	no_small_heap1
	
	sub	d7,d7,d2
	lea	o0,heap_end_after_gc
	slwi	d2,d2,2
	lwz	d1,0(o0)
	sub	d2,d1,d2
	lea	o1,heap_end_after_copy_gc
	stw	d2,0(o0)
	stw	d1,0(o1)

no_small_heap1:
  endif

	slwi	d0,d0,2	
 endif

end_garbage_collect:
 if WRITE_HEAP
	mr	d2,a6
	li	d3,0
end_garbage_collect_:
 endif
	lea	o0,flags
	lwz	o1,0(o0)
	andi.	r0,o1,2
	beq+	no_heap_use_message

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	lea	o0,heap_use_after_gc_string_1
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif

	mr	o0,d0
 if STDERR_TO_FILE
	bl	.er_print_int
 else
	bl	.ew_print_int
 endif

	lea	o0,heap_use_after_gc_string_2
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif

 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif

no_heap_use_message:
 if FINALIZERS
	bl	call_finalizers
 endif

 if WRITE_HEAP
 	import	first_function{DS}
 	import	.write_heap
	import	min_write_heap_size

	lea	o0,flags
	lea	o1,min_write_heap_size

	lwz	o0,0(o0)
	lwz	o1,0(o1)

	andi.	r0,o0,32
	beq	no_write_heap

	cmplw	0,d0,o1
	blt	no_write_heap

	subi	sp,sp,64

	lea	r3,garbage_collect_flag
	cmpwi	d3,0
	
	lea	r7,heap2_begin_and_end
	lbz	r3,0(r3)
	lwz	r5,0(r7)
	bne	copy_to_compact_with_alloc_in_extra_heap

	extsb.	r3,r3
	lwz	r6,4(r7)

	lea	r4,heap_p1
	beq	gc0
	lea	r4,heap_p2
	bgt	gc1
	lea	r4,heap_p3
	li	r5,0
	li	r6,0
gc0:	
gc1:
	lwz	r4,0(r4)
	mr	r10,sp
	stw	r4,0(r10)
	stw	d2,4(r10)
	stw	r5,8(r10)
	stw	r6,12(r10)

	lea	r6,stack_p
	lea	r8,first_function
	lwz	r6,0(r6)
 if LINUX
 	li	r9,0
 else
	addi	r9,rtoc,-32768
 endif
	lwz	r8,0(r8)

	stw	r6,16(r10)
	stw	a4,20(r10)
	stw	r8,24(r10)
	stw	r9,28(r10)

	lea	r4,small_integers
	lea	r5,static_characters
	stw	r4,32(r10)
	stw	r5,36(r10)

	stw	r16,40(r10)
	stw	r15,44(r10)
	stw	r14,48(r10)
	stw	r13,52(r10)
	lea	d0,__STRING__2
	lea	d1,__ARRAY__2
	stw	d0,56(r10)
	stw	d1,60(r10)
	
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif

	mr	r3,r10
	bl	.write_heap
	nop

 if MACOSX
 	lwz	sp,0(sp)
	addi	sp,sp,64
 else
	addi	sp,sp,128
 endif
no_write_heap:

 endif

	lwz	d0,0(sp)
	lwz	d1,4(sp)
	lwz	d2,8(sp)
	lwz	d3,12(sp)
	lwz	d4,16(sp)
	lwz	d5,20(sp)
	lwz	d6,24(sp)

	lwz	r0,28(sp)
	mtlr	r0

 if USE_DCBZ
 	subi	d7,d7,15
	li	g2,32
 endif
	subi	a6,a6,4

	addi	sp,sp,32
	blr

 if FINALIZERS
call_finalizers:
	lea	d0,free_finalizer_list
	lwz	d0,0(d0)

call_finalizers_lp:
	lea	o0,__Nil_m8
	cmplw	d0,o0
	beq	end_call_finalizers
	
	lwz	d1,8(d0)
	lwz	d0,4(d0)
	mflr	d2

	lwz	r12,0(d1)
	lwz	r3,4(d1)

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif

	lwz	r0,0(r12)
	stw	RTOC,20(SP)
	mtctr	r0
	lwz	RTOC,4(r12)
	bctrl
	lwz	RTOC,20(sp)
	
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif

	mtlr	d2
	b	call_finalizers_lp
end_call_finalizers:
	lea	d0,free_finalizer_list
	stw	o0,0(d0)
	blr
 endif

 if WRITE_HEAP
copy_to_compact_with_alloc_in_extra_heap:
	lwz	r6,4(r7)
	lea	r4,heap_p2
	b	gc1	
 endif

out_of_memory_4:
	bl	.add_garbage_collect_time

	lea	o0,out_of_memory_string_4
	b	print_error

	csect	.zero_bit_vector
;	d0 = n words
;	a2 = address
;	g0 = 0
zero_bit_vector:
	andi.	r0,d0,1
	srwi	d0,d0,1
	beq	zero_bits1_1

	stw	g0,0(a2)
	addi	a2,a2,4
zero_bits1_1:
	andi.	r0,d0,1
	srwi	d0,d0,1
	beq	zero_bits1_5

	subi	a2,a2,8
	b	zero_bits1_2

zero_bits1_4:
	stw	g0,0(a2)
	stw	g0,4(a2)
zero_bits1_2:
	stw	g0,8(a2)
	stw	g0,12(a2)
	addi	a2,a2,16
zero_bits1_5:
	subic.	d0,d0,1
	bge	zero_bits1_4

	blr

	csect	.reorder	
reorder:
	mr	d2,d0
	mr	d3,d1
	slwi	d4,d0,2
	slwi	d5,d1,2
	add	a0,a0,d5
	sub	a1,a1,d4
	b	st_reorder_lp

reorder_lp:
	lwzu	o0,-4(a1)
	subic.	d2,d2,1

	lwz	o1,0(a0)
	stw	o0,0(a0)
	addi	a0,a0,4

	bne+	next_b_in_element
	mr	d2,d0
	add	a0,a0,d5
next_b_in_element:

	subic.	d3,d3,1
	stw	o1,0(a1)

	bne+	next_a_in_element
	mr	d3,d1
	sub	a1,a1,d4
next_a_in_element:

st_reorder_lp:
	cmplw	1,a1,a0
	bgt	1,reorder_lp

	blr
	
;
;	the sliding compacting garbage collector
;

	csect	text{PR}
compacting_collector:

; zero all mark bits

	lea	o0,heap_p3
	lea	o1,heap_vector
	lwz	d6,0(o0)
	lea	o0,heap_end_after_gc
	lwz	o4,0(o1)
	lwz	d5,0(o0)
	sub	d5,d5,a6
	srwi	d5,d5,2

	lea	o0,alloc_size
	sub	d5,d5,d7
	stw	d5,0(o0)

 if MARK_GC
  if MARK_AND_COPY_GC
 	lea	o0,flags
	lwz	o0,0(o0)
	andi.	r0,o0,64
	beq	no_mark4
  endif

	lea	o0,zero_bits_before_mark
	li	g0,0
	lwz	o1,0(o0)
	cmpwi	0,o1,0
	beq	no_zero_bits

	stw	g0,0(o0)

  if MARK_AND_COPY_GC
no_mark4:
  endif
 endif

	lea	o0,heap_size_33
	mr	a2,o4
	lwz	d0,0(o0)
	addi	d0,d0,3
	srwi	d0,d0,2

	li	o0,0

	andi.	r0,d0,1
	srwi	d0,d0,1
	beq	zero_bits_1
		
	stw	o0,0(a2)
	addi	a2,a2,4
zero_bits_1:

	andi.	r0,d0,1
	srwi	d0,d0,1
	beq	zero_bits_5

	subi	a2,a2,8
	b	zero_bits_2

zero_bits_4:
	stw	o0,0(a2)
	stw	o0,4(a2)
zero_bits_2:
	stw	o0,8(a2)
	stw	o0,12(a2)
	addi	a2,a2,16
zero_bits_5:
	subic.	d0,d0,1
	bge	zero_bits_4

 if MARK_GC
  if MARK_AND_COPY_GC
 	lea	o0,flags
	lwz	o0,0(o0)
	andi.	r0,o0,64
	beq	no_mark5
  endif

no_zero_bits:
	lea	o0,last_heap_free
	lea	o1,free_after_mark
	lwz	d0,0(o0)
	lwz	d1,0(o1)
	slwi	d1,d1,2

	slwi	d2,d1,3
	add	d2,d2,d1
	srwi	d2,d2,2

	cmplw	d0,d2
	bgt	compact_gc

  if ADJUST_HEAP_SIZE
	lea	o0,bit_vector_size
	lwz	d1,0(o0)
	lea	o0,heap_size_multiple
	slwi	d1,d1,2
	lwz	o0,0(o0)
	sub	o2,d1,d0

	mullw	o1,o2,o0
	mulhwu	o2,o2,o0

	rlwinm	o1,o1,32-7,7,31-2
;	srwi	o1,o1,7

	rlwimi	o1,o2,32-7,0,6
	srwi.	o2,o2,7
	bne	no_smaller_heap

	cmplw	o1,d1
	bge	no_smaller_heap

	cmplwi	d1,MINIMUM_HEAP_SIZE
	ble	no_smaller_heap

	b	compact_gc

no_smaller_heap:
  endif

 if PREFETCH
 	lea	o0,flags
	lwz	o0,0(o0)
	andi.	r0,o0,NO_PREFETCH_MASK
 	beq	pmark
 endif
	include	'pmark.a'
 if PREFETCH
	include	'pmark_prefetch.a'
 endif

compact_gc:
	lea	o0,zero_bits_before_mark
	li	d0,1
	stw	d0,0(o0)
	lea	o0,last_heap_free
	li	g0,0
	stw	g0,0(o0)
	lea	o0,free_after_mark
	li	o1,1000
	stw	o1,0(o0)
 endif

   if MARK_AND_COPY_GC
no_mark5:
   endif

	include	'pcompact.a'

	lea	o0,heap_size_33
	lwz	d7,0(o0)
	lea	o0,heap_end_after_gc
	slwi	d7,d7,5
	add	d7,d7,d6
	stw	d7,0(o0)

	lea	o0,alloc_size
	sub	d7,d7,a6
	lwz	d1,0(o0)
	srwi	d7,d7,2
	sub.	d7,d7,d1
	blt	out_of_memory_4

	slwi	d0,d7,2
	lea	o0,heap_size
	add	d0,d0,d7
	lwz	o1,0(o0)
	slwi	d0,d0,3
	cmplw	0,d0,o1
	blt	out_of_memory_4

 if MARK_GC || COMPACT_GC_ONLY
  if MARK_GC && ADJUST_HEAP_SIZE
   if MARK_AND_COPY_GC
 	lea	o0,flags
	lwz	o0,0(o0)
	andi.	r0,o0,64
	beq	no_mark6
   endif

	sub	d0,a6,d6
	lea	o0,heap_size_multiple
	slwi	d1,d1,2
	lwz	o0,0(o0)
	add	o2,d0,d1

	lea	d1,heap_size_33
	lwz	d1,0(d1)
	slwi	d1,d1,5

	mullw	d0,o2,o0
	mulhwu	o0,o2,o0

	rlwinm	d0,d0,32-8,8,31-2
;	srwi	d0,d0,8
	rlwimi	d0,o0,32-8,0,7
;	clrrwi	d0,d0,2
	
	srwi.	o0,o0,8
	bne	no_small_heap2

	cmplwi	d0,MINIMUM_HEAP_SIZE
	bge	not_too_small2
	li	d0,MINIMUM_HEAP_SIZE
not_too_small2:

	sub.	d2,d1,d0
	blt	no_small_heap2

	lea	o1,heap_end_after_gc
	srwi	o0,d2,2
	lwz	d1,0(o1)
	sub	d7,d7,o0
	sub	d1,d1,d2
	stw	d1,0(o1)

	mr	d1,d0

no_small_heap2:
	lea	o0,bit_vector_size
	srwi	d1,d1,2
	stw	d1,0(o0)

   if MARK_AND_COPY_GC
no_mark6:
   endif
  endif
	b	no_copy_garbage_collection
 else
	lea	o0,heap_size
	slwi	d0,d0,2
	lwz	d1,0(o0)
	lwz	o1,0(o0)
	slwi	d1,d1,5
	sub	d1,d1,o1
	cmpw	0,d0,d1

	ble	no_copy_garbage_collection
;	b	no_copy_garbage_collection

	lea	o0,heap_p
	lwz	d0,0(o0)
	lea	o0,heap_p1
	stw	d0,0(o0)
 if COPIED_VECTOR
	lea	o0,heap_size_129
	lwz	d1,0(o0)
	slwi	d1,d1,6
	add	d0,d0,d1
	lea	o0,heap_copied_vector
	lea	o1,heap_end_after_gc
	stw	d0,0(o0)
	lea	o0,heap_copied_vector_size
	stw	d0,0(o1)
	lwz	d1,0(o0)
	lea	o0,heap_p2
	add	d1,d1,d0
	stw	d1,0(o0)
 else
	lea	o0,heap_size
	lwz	d1,0(o0)
	srwi	d1,d1,1
	add	d0,d0,d1
	lea	o0,heap_p2
	stw	d0,0(o0)
	lea	o0,heap_end_after_gc
	stw	d0,0(o0)
 endif
	sub	d0,d0,a6
	srwi	d0,d0,2
	mr	d7,d0
	lea	o0,alloc_size
	lwz	o1,0(o0)
	sub	d7,d7,o1
		
	lea	o0,heap_p3
	lwz	d0,0(o0)
	lea	o0,heap_vector
	lwz	o1,0(o0)
	cmpw	0,d0,o1
	ble	vector_at_end_2

	lea	o0,heap_vector
	lwz	d1,0(o0)
	lea	o0,extra_heap
	stw	d1,0(o0)
	sub	d0,d0,d1
	srwi	d0,d0,2
	lea	o0,extra_heap_size
	stw	d0,0(o0)

	lea	o0,garbage_collect_flag
	li	o1,2
	stb	o1,0(o0)
		
	b	no_copy_garbage_collection

vector_at_end_2:
	lea	o0,garbage_collect_flag
	li	o1,0
	stb	o1,0(o0)
 endif

no_copy_garbage_collection:
 if MEASURE_GC
 	bl	.add_compact_garbage_collect_time
 
	sub	d0,a6,d6
	
 	lea	o0,total_compact_gc_bytes_lo
 	lwz	o1,0(o0)
 	addc	o1,o1,d0
 	stw	o1,0(o0)
	lea	o0,total_compact_gc_bytes_hi
 	lwz	o1,0(o0)
 	addze	o1,o1
 	stw	o1,0(o0)	
 else
	bl	.add_garbage_collect_time
 endif
	lea	o0,alloc_size
	sub	d0,a6,d6
	lwz	d1,0(o0)
	slwi	d1,d1,2
		
	add	d0,d0,d1
	b	end_garbage_collect

stack_overflow:
	lea	o0,halt_sp
	lwz	sp,0(o0)

	bl	.add_execute_time

	lea	o0,stack_overflow_string
	b	print_error

.IO_error:
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(128+28)(sp)
 else
	stwu	sp,-128(sp)
 endif
	stw	o0,124(sp)

	lea	o0,IO_error_string
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif

	lwz	o0,124(sp)

 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif

	lea	o0,new_line_string
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif

 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,128
 endif
	b	halt

print_error:
 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
 if STDERR_TO_FILE
	bl	.er_print_string
 else
	bl	.ew_print_string
 endif
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif
halt:
 if PROFILE
	mflr	r0
	stwu	r0,-4(sp)
	bl	write_profile_stack
	mtlr	r0
 endif

 if EXCEPTIONS
	lea	o0,exception_info
	lwz	o0,0(o0)
	cmpwi	0,o0,0
	bne	e__Exceptions__sraise__exception
 endif
 
 	lea	o0,halt_sp
	lwz	sp,0(o0)

 if 0
	lea	o0,flags
	lwz	d0,0(o0)
	andi.	r0,d0,8
	bne	exit
	
	andi.	r0,d0,16
	beq	exit

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.wait_for_key_press
 if MACOSX
 	lwz	sp,0(sp)
 else
	addi	sp,sp,64
 endif
 else
	lea	o0,execution_aborted
	li	d0,1
	stw	d0,0(o0)
 endif
	b	exit

 if EXCEPTIONS
e__Exceptions__scatch__exception:
	lea	o0,exception_info
	mflr	d0
	stw	a4,0(o0)
	stw	sp,4(o0)
	stw	d0,8(o0)

	li	d0,0

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

e__Exceptions__sraise__exception:
	lea	o0,exception_info
	li	d0,-1

	lwz	o1,8(o0)
	lwz	sp,4(o0)
	mtlr	o1
	lwz	a4,0(o0)

	li	o1,0
	stw	o1,0(o0)
	
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	
 endif

	csect	.eval_01
eval_01:
	stw	a1,0(a4)
	addi	a4,a4,4
	bctr

	csect	.eval_11
eval_11:
	stw	a0,0(a4)
	mr	a0,a1
	addi	a4,a4,4
	bctr

	csect	.eval_02
eval_02:
	stw	a2,0(a4)
	addi	a4,a4,8
	stw	a1,4-8(a4)
	bctr

	csect	.eval_12
eval_12:
	stw	a0,4(a4)
	mr	a0,a1
	stw	a2,0(a4)
	addi	a4,a4,8
	bctr

	csect	.eval_22
eval_22:
	stw	a0,4(a4)
	mr	a0,a2
	stw	a1,0(a4)
	addi	a4,a4,8
	bctr

e__system__eaind:
__eaind:
eval_fill:
	stw	a0,0(a4)
	mr	a0,a1
	lwz	a1,0-NODE_POINTER_OFFSET(a1)
	addi	a4,a4,4

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

	mr	a1,a0
	lwzu	a0,-4(a4)
	
	lwz	g0,0-NODE_POINTER_OFFSET(a1)
	lwz	g1,4-NODE_POINTER_OFFSET(a1)
	stw	g0,0-NODE_POINTER_OFFSET(a0)
	lwz	g0,8-NODE_POINTER_OFFSET(a1)
	stw	g1,4-NODE_POINTER_OFFSET(a0)
	stw	g0,8-NODE_POINTER_OFFSET(a0)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	b	eval_fill
	nop	
	nop	
 if LINUX
	nop
	nop
 endif
	dc.l	0
	dc.l	-2
e__system__nind:
__indirection:
	lwz	a1,4(a0)
	lwz	d0,0(a1)
	andi.	r0,d0,2
 if MARK_GC
	beq	eval_fill2
 else
	beq	_cycle__in__spine
 endif
	stw	d0,0(a0)
	lwz	g0,4(a1)
	lwz	g1,8(a1)
	stw	g0,4(a0)
	stw	g1,8(a0)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

_cycle__in__spine:
	b 	__cycle__in__spine

 if MARK_GC
 	csect	.eval_fill2
eval_fill2:
   if MARK_AND_COPY_GC
 	lea	o0,flags
	stw	a5,0-NODE_POINTER_OFFSET(a0)
	lwz	o0,0(o0)
	stw	a0,0(a4)
	andi.	r0,o0,64
	beq	_cycle__in__spine
   else
	stw	a5,0-NODE_POINTER_OFFSET(a0)
	stw	a0,0(a4)
   endif		
	addi	a4,a4,4
	mr	a0,a1

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

	lwzu	a1,-4(a4)
	lwz	o0,0-NODE_POINTER_OFFSET(a0)
	lwz	o1,4-NODE_POINTER_OFFSET(a0)
	stw	o0,0-NODE_POINTER_OFFSET(a1)
	lwz	o0,8-NODE_POINTER_OFFSET(a0)
	stw	o1,4-NODE_POINTER_OFFSET(a1)
	stw	o0,8-NODE_POINTER_OFFSET(a1)
	mr	a0,a1

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	
 endif

	csect	.eval_upd_0
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_0:
	lea	a3,__indirection
	mtctr	a2
	stw	a0,4-NODE_POINTER_OFFSET(a1)
	stw	a3,0-NODE_POINTER_OFFSET(a1)
	bctr

	csect	.eval_upd_1
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_1:
	lea	a3,__indirection
	mtctr	a2
	lwz	d0,4-NODE_POINTER_OFFSET(a1)
	stw	a3,0-NODE_POINTER_OFFSET(a1)
	stw	a0,4-NODE_POINTER_OFFSET(a1)
	mr	a1,d0
	bctr

	csect	.eval_upd_2
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_2:
	mtctr	a2
	lea	a2,__indirection
	stw	a2,0-NODE_POINTER_OFFSET(a1)
	lwz	a2,4-NODE_POINTER_OFFSET(a1)
	stw	a0,4-NODE_POINTER_OFFSET(a1)
	lwz	a1,8-NODE_POINTER_OFFSET(a1)
	bctr

	csect	.eval_upd_3
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_3:
	mtctr	a2
	lea	a2,__indirection
	stw	a0,0(a4)
	stw	a2,0-NODE_POINTER_OFFSET(a1)
	lwz	a2,4-NODE_POINTER_OFFSET(a1)
	stw	a0,4-NODE_POINTER_OFFSET(a1)
	addi	a4,a4,4
	lwz	a0,12-NODE_POINTER_OFFSET(a1)
	lwz	a1,8-NODE_POINTER_OFFSET(a1)
	bctr

	csect	.eval_upd_4
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_4:
	mtctr	a2
	lea	a2,__indirection
	stw	a0,0(a4)
	stw	a2,0-NODE_POINTER_OFFSET(a1)
	lwz	a2,4-NODE_POINTER_OFFSET(a1)
	stw	a0,4-NODE_POINTER_OFFSET(a1)
	lwz	g1,16-NODE_POINTER_OFFSET(a1)
	lwz	a0,12-NODE_POINTER_OFFSET(a1)
	stw	g1,4(a4)
	addi	a4,a4,8
	lwz	a1,8-NODE_POINTER_OFFSET(a1)
	bctr

	csect	.eval_upd_5
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_5:
	mtctr	a2
	lea	a2,__indirection
	stw	a0,0(a4)
	stw	a2,0-NODE_POINTER_OFFSET(a1)
	lwz	a2,4-NODE_POINTER_OFFSET(a1)
	stw	a0,4-NODE_POINTER_OFFSET(a1)
	lwz	g1,20-NODE_POINTER_OFFSET(a1)
	lwz	a0,12-NODE_POINTER_OFFSET(a1)
	stw	g1,4(a4)
	lwz	g1,16-NODE_POINTER_OFFSET(a1)
	lwz	a1,8-NODE_POINTER_OFFSET(a1)
	stw	g1,8(a4)
	addi	a4,a4,12
	bctr

	csect	.eval_upd_6
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_6:
	mtctr	a2
	lea	a2,__indirection
	stw	a0,0(a4)
	stw	a2,0-NODE_POINTER_OFFSET(a1)
	lwz	a2,4-NODE_POINTER_OFFSET(a1)
	stw	a0,4-NODE_POINTER_OFFSET(a1)
	lwz	g1,24-NODE_POINTER_OFFSET(a1)
	lwz	a0,12-NODE_POINTER_OFFSET(a1)
	stw	g1,4(a4)
	lwz	g1,20-NODE_POINTER_OFFSET(a1)
	stw	g1,8(a4)
	lwz	g1,16-NODE_POINTER_OFFSET(a1)
	lwz	a1,8-NODE_POINTER_OFFSET(a1)
	stw	g1,12(a4)
	addi	a4,a4,16
	bctr

	csect	.eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_7:
	li	d0,0
	li	d1,20
eval_upd_n:
	mtctr	a2
	lea	a2,__indirection
	stw	a0,0(a4)
	stw	a2,0-NODE_POINTER_OFFSET(a1)
	lwz	a2,4-NODE_POINTER_OFFSET(a1)
	stw	a0,4-NODE_POINTER_OFFSET(a1)
	add	a1,a1,d1
	lwz	g1,8-NODE_POINTER_OFFSET(a1)
	stw	g1,4(a4)
	lwz	g1,4-NODE_POINTER_OFFSET(a1)
	stw	g1,8(a4)
	lwz	g1,0-NODE_POINTER_OFFSET(a1)
	stw	g1,12(a4)
	addi	a4,a4,16
eval_upd_n_lp:
	lwz	g1,-4-NODE_POINTER_OFFSET(a1)
	subi	a1,a1,4
	stw	g1,0(a4)
	subic.	d0,d0,1
	addi	a4,a4,4
	bge	eval_upd_n_lp

	lwz	a0,-4-NODE_POINTER_OFFSET(a1)
	lwz	a1,-8-NODE_POINTER_OFFSET(a1)
	bctr

 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_8:
	li	d0,1
	li	d1,24
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_9:
	li	d0,2
	li	d1,28
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_10:
	li	d0,3
	li	d1,32
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_11:
	li	d0,4
	li	d1,36
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_12:
	li	d0,5
	li	d1,40
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_13:
	li	d0,6
	li	d1,44
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_14:
	li	d0,7
	li	d1,48
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_15:
	li	d0,8
	li	d1,52
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_16:
	li	d0,9
	li	d1,56
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_17:
	li	d0,10
	li	d1,60
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_18:
	li	d0,11
	li	d1,64
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_19:
	li	d0,12
	li	d1,68
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_20:
	li	d0,13
	li	d1,72
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_21:
	li	d0,14
	li	d1,76
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_22:
	li	d0,15
	li	d1,80
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_23:
	li	d0,16
	li	d1,84
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_24:
	li	d0,17
	li	d1,88
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_25:
	li	d0,18
	li	d1,92
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_26:
	li	d0,19
	li	d1,96
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_27:
	li	d0,20
	li	d1,100
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_28:
	li	d0,21
	li	d1,104
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_29:
	li	d0,22
	li	d1,108
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_30:
	li	d0,23
	li	d1,112
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_31:
	li	d0,24
	li	d1,116
	b	eval_upd_n
 if PROFILE
	mflr	r0
	bl	profile_n
 endif
eval_upd_32:
	li	d0,25
	li	d1,120
	b	eval_upd_n

;
;	STRINGS
;
	csect	.catAC
catAC:
 if NODE_POINTER_OFFSET==0
	lwzu	d0,4(a0)
	lwzu	d1,4(a1)
 else
	lwz	d0,4-NODE_POINTER_OFFSET(a0)
	baddi	a0,4
	lwz	d1,4-NODE_POINTER_OFFSET(a1)
	baddi	a1,4
 endif
	add	d2,d0,d1
	addi	d5,d2,3+8
	srwi	d5,d5,2
	sub.	d7,d7,d5
; reserve one word extra, because 
; word after the string may change
	addi	d6,d2,3
	ble	gc_3
gc_r_3:

	lea	o1,__STRING__2
	addi	d3,a6,4+NODE_POINTER_OFFSET
	stw	o1,4(a6)
	stwu	d2,8(a6)

; copy string 1

	addi	d2,d1,3
	srwi	d2,d2,2
	mr	a2,a6

	subic.	d2,d2,1
	blt	cat_string_4
cat_string_3:
 if NODE_POINTER_OFFSET==0
	lwzu	o0,4(a1)
 else
	lwz	o0,4-NODE_POINTER_OFFSET(a1)
	baddi	a1,4
 endif
	subic.	d2,d2,1
	stwu	o0,4(a2)
	bge	cat_string_3
cat_string_4:

; copy string 2

	addi	d0,d0,3
	srwi	d0,d0,2
	subic.	d0,d0,1
	add	a2,a6,d1
	blt	cat_string_1

cat_string_0:
 if NODE_POINTER_OFFSET==0
	lwzu	o0,4(a0)
 else
	lwz	o0,4-NODE_POINTER_OFFSET(a0)
	baddi	a0,4
 endif
	subic.	d0,d0,1
	stwu	o0,4(a2)
	bge	cat_string_0
cat_string_1:

	clrrwi	d6,d6,2
	mr	a0,d3
	add	a6,a6,d6

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

gc_3:	subi	d7,d7,1
	subi	a0,a0,4
	subi	a1,a1,4
	mflr	r0
	bl	collect_2
	addi	a0,a0,4
	addi	a1,a1,4
	addi	d7,d7,1
	b	gc_r_3

	csect	.sliceAC
empty_string:
	lea	a0,zero_length_string
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

sliceAC:
	lwz	d2,4-NODE_POINTER_OFFSET(a0)
	addi	a2,a0,4-NODE_POINTER_OFFSET
	cmpwi	0,d1,0
	bge	slice_string_1

	li	d1,0

slice_string_1:
	cmpw	0,d1,d2
	bge	empty_string
	cmpw	0,d0,d1
	addi	d0,d0,1
	blt	empty_string

	cmpw	0,d0,d2
	ble	slice_string_2

	mr	d0,d2

slice_string_2:
	sub	d0,d0,d1

	subi	d7,d7,2

	addi	d2,d0,3
	srwi	d2,d2,2

	sub.	d7,d7,d2
	blt	gc_4
r_gc_4:
	lea	o1,__STRING__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o1,4(a6)
	stwu	d0,8(a6)

	add	a2,a2,d1
	subic.	d2,d2,1
	blt	slice_string__1
		
slice_string__0:
	lwzu	o0,4(a2)
	subic.	d2,d2,1
	stwu	o0,4(a6)
	bge	slice_string__0
slice_string__1:

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

gc_4:	mflr	r0
	bl	collect_1
	addi	a2,a0,4-NODE_POINTER_OFFSET
	b	r_gc_4

	csect	.updateAC
updateAC:
	lwz	d2,4-NODE_POINTER_OFFSET(a0)
	addi	a2,a0,4-NODE_POINTER_OFFSET
	cmplw	0,d1,d2
	bge	update_string_error

	addi	d3,d2,3
	subi	d7,d7,2

	srwi	d3,d3,2		
	sub.	d7,d7,d3
	blt	gc_5
r_gc_5:
	lea	o1,__STRING__2

	subic.	d3,d3,1

	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o1,4(a6)
	stwu	d2,8(a6)
	blt	update_string_5

update_string_4:
	lwzu	o0,4(a2)
	subic.	d3,d3,1
	stwu	o0,4(a6)
	bge	update_string_4
update_string_5:

	addi	d1,d1,8
	lwz	r0,0(sp)
	stbx	d0,a0,d1
	addi	sp,sp,4
	blr	

gc_5:	mflr	r0
	bl	collect_1
	addi	a2,a0,4-NODE_POINTER_OFFSET
	b	r_gc_5

		
update_string_error:
	lea	o0,high_index_string
	cmpwi	0,d1,0
	bge	print_error

	lea	o0,low_index_string
update_string_error_2:
	b	print_error

	csect	.eqAC
eqAC:
	lwzu	d0,4-NODE_POINTER_OFFSET(a0)
	lwzu	o0,4-NODE_POINTER_OFFSET(a1)
	cmpw	0,d0,o0
	bne	equal_string_ne

	andi.	d1,d0,3
	srwi	d0,d0,2
	subic.	d0,d0,1
	blt	equal_string_b

equal_string_1:
	lwzu	o0,4(a1)
	lwzu	o1,4(a0)

	cmpw	o1,o0
	bne	equal_string_ne

	subic.	d0,d0,1
	bge	equal_string_1

equal_string_b:
	subic.	d1,d1,1
	blt	equal_string_eq

equal_string_2:
	lbz	o0,4(a1)
	addi	a1,a1,1
	lbz	o1,4(a0)
	addi	a0,a0,1
	cmpw	o1,o0
	bne	equal_string_ne

	subic.	d1,d1,1
	bge	equal_string_2

equal_string_eq:
	li	d0,-1

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	
equal_string_ne:
	li	d0,0

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	.cmpAC
cmpAC:
	lwzu	d1,4-NODE_POINTER_OFFSET(a0)
	lwzu	d2,4-NODE_POINTER_OFFSET(a1)

	cmplw	0,d2,d1
	blt	cmp_string_less

	li	d0,0
	beq	cmp_string_chars

	li	d0,1
	b	cmp_string_chars	

cmp_string_less:
	li	d0,-1
	mr	d1,d2
cmp_string_chars:	
	andi.	d2,d1,3
	srwi	d1,d1,2
	subic.	d1,d1,1
	blt	cmp_string_b

cmp_string_1:
	lwzu	o0,4(a0)
	lwzu	o1,4(a1)

	cmplw	0,o1,o0
	bne	cmp_string_ne

	subic.	d1,d1,1
	bge	cmp_string_1

cmp_string_b:
	subic.	d2,d2,1
	blt	cmp_string_eq

cmp_string_2:
	lbz	o0,4(a0)
	lbz	o1,4(a1)
	addi	a0,a0,1

	cmplw	0,o1,o0
	addi	a1,a1,1
	bne	cmp_string_ne

	subic.	d2,d2,1
	bge	cmp_string_2

cmp_string_eq:
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

cmp_string_ne:
	bgt	cmp_string_r1

	li	d0,-1

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	
cmp_string_r1:
	li	d0,1

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	.string_to_string_node
string_to_string_node:
	lwz	d0,0(a0)
	addi	a0,a0,4

	addi	d1,d0,3
	srwi	d1,d1,2
		
	subi	d7,d7,2
	sub.	d7,d7,d1
	blt	string_to_string_node_gc

string_to_string_node_r:
	lea	o0,__STRING__2
	stw	o0,4(a6)
	addi	d2,a6,4+NODE_POINTER_OFFSET
	stwu	d0,8(a6)
	b	string_to_string_node_4
		
string_to_string_node_2:
	lwz	o0,0(a0)
	addi	a0,a0,4
	stwu	o0,4(a6)
string_to_string_node_4:
	subic.	d1,d1,1
	bge	string_to_string_node_2

	mr	a0,d2

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

string_to_string_node_gc:
	mflr	r0
	stwu	a0,-4(sp)
	bl	collect_0

	lwz	a0,0(sp)
	addi	sp,sp,4
	b	string_to_string_node_r

	csect	_cn
	dc.l	3
_c3:	b	__cycle__in__spine
	dc.l	4
_c4:	b	__cycle__in__spine
	dc.l	5
_c5:	b	__cycle__in__spine
	dc.l	6
_c6:	b	__cycle__in__spine
	dc.l	7
_c7:	b	__cycle__in__spine
	dc.l	8
_c8:	b	__cycle__in__spine
	dc.l	9
_c9:	b	__cycle__in__spine
	dc.l	10
_c10:	b	__cycle__in__spine
	dc.l	11
_c11:	b	__cycle__in__spine
	dc.l	12
_c12:	b	__cycle__in__spine
	dc.l	13
_c13:	b	__cycle__in__spine
	dc.l	14
_c14:	b	__cycle__in__spine
	dc.l	15
_c15:	b	__cycle__in__spine
	dc.l	16
_c16:	b	__cycle__in__spine
	dc.l	17
_c17:	b	__cycle__in__spine
	dc.l	18
_c18:	b	__cycle__in__spine
	dc.l	19
_c19:	b	__cycle__in__spine
	dc.l	20
_c20:	b	__cycle__in__spine
	dc.l	21
_c21:	b	__cycle__in__spine
	dc.l	22
_c22:	b	__cycle__in__spine
	dc.l	23
_c23:	b	__cycle__in__spine
	dc.l	24
_c24:	b	__cycle__in__spine
	dc.l	25
_c25:	b	__cycle__in__spine
	dc.l	26
_c26:	b	__cycle__in__spine
	dc.l	27
_c27:	b	__cycle__in__spine
	dc.l	28
_c28:	b	__cycle__in__spine
	dc.l	29
_c29:	b	__cycle__in__spine
	dc.l	30
_c30:	b	__cycle__in__spine
	dc.l	31
_c31:	b	__cycle__in__spine
	dc.l	32
_c32:	b	__cycle__in__spine

;
;	ARRAYS
;

	csect	.create_arrayB
create_arrayB:
	mr	d2,d1
	addi	d1,d1,3
	srwi	d1,d1,2
	subi	d7,d7,3
	sub.	d7,d7,d1
	bge+	no_collect_4575

	mflr	r0
	bl	collect_0

no_collect_4575:
	slwi	d3,d0,8
	or	d0,d0,d3
	slwi	d3,d0,16
	or	d0,d0,d3
	lea	o0,__ARRAY__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d2,8(a6)
	stwu	bool_reg,12(a6)
	b	create_arrayBCI

	csect	.create_arrayC
create_arrayC:
	mr	d2,d1
	addi	d1,d1,3
	srwi	d1,d1,2
	subi	d7,d7,2
	sub.	d7,d7,d1
	bge+	no_collect_4578

	mflr	r0
	bl	collect_0

no_collect_4578:
	slwi	d3,d0,8
	or	d0,d0,d3
	slwi	d3,d0,16
	or	d0,d0,d3
	lea	o0,__STRING__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stwu	d2,8(a6)
	b	create_arrayBCI

	csect	.create_arrayI
create_arrayI:
	subi	d7,d7,3
	sub.	d7,d7,d1
	bge+	no_collect_4577

	mflr	r0
	bl	collect_0

no_collect_4577:
	lea	o0,__ARRAY__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d1,8(a6)
	stwu	int_reg,12(a6)

create_arrayBCI:
	andi.	o0,d1,1
	beq	st_filli_array

	stwu	d0,4(a6)

st_filli_array:
	srwi.	d1,d1,1
	beq	skip_filli_array

	mtctr	d1
filli_array:
	stw	d0,4(a6)
	stwu	d0,8(a6)
	bdnz	filli_array

skip_filli_array:
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	.create_arrayR
create_arrayR:
	stfd	f14,-8(sp)
	sub	d7,d7,d0

	lwz	d1,-8(sp)
	subi	d7,d7,3+1

	lwz	d2,-4(sp)
	sub.	d7,d7,d0
	bge+	no_collect_4579

	mflr	r0
	bl	collect_0

no_collect_4579:
	addi	a6,a6,4

	rlwinm	d3,a6,32-2,31,31
	lea	o0,__ARRAY__2

	rlwinm	a6,a6,0,0,31-3
	add	d7,d7,d3

	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)

	cmpwi	0,d0,0

	stw	d0,8(a6)
	stwu	real_reg,12(a6)
	beq	skip_fillr_array
	
	mtctr	d0
fillr_array:
	stw	d1,4(a6)
	stwu	d2,8(a6)
	bdnz	fillr_array

skip_fillr_array:
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	.create_array
create_array:
	subi	d7,d7,3
	sub.	d7,d7,d0
	bge+	no_collect_4576

	mflr	r0
	bl	collect_1

no_collect_4576:
	mr	d1,a0
	lea	o0,__ARRAY__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d0,8(a6)
	li	g0,0
	stwu	g0,12(a6)
	lwz	r0,0(sp)
	addi	sp,sp,4
	b	fillr1_array

create_R_array:
	subic.	d2,d2,2
	blt	create_R_array_1
	beq	create_R_array_2
	subic.	d2,d2,2
	blt	create_R_array_3	
	beq	create_R_array_4
	b	create_R_array_5

create_R_array_1:
	subi	d7,d7,3
	sub.	d7,d7,d0
	bge+	no_collect_4581

	mflr	r0
	bl	collect_0

no_collect_4581:
	lea	o0,__ARRAY__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d0,8(a6)
	stwu	d1,12(a6)
	cmpwi	0,d3,0

	lwz	r0,0(sp)
	addi	sp,sp,4
	beq	r_array_1_b

	lwz	d1,-4(a4)
	b	fillr1_array

r_array_1_b:
	lwz	d1,0(sp)

fillr1_array:
	andi.	o0,d0,1
	beq	st_fillr1_array_1

	stwu	d1,4(a6)
st_fillr1_array_1:
	srwi.	d0,d0,1
	beq	skip_fillr1_array_lp

	mtctr	d0
fillr1_array_lp:
	stw	d1,4(a6)
	stwu	d1,8(a6)
	bdnz	fillr1_array_lp

skip_fillr1_array_lp:
	blr

create_R_array_2:
	subi	d7,d7,3
	sub	d7,d7,d0
	sub.	d7,d7,d0
	bge+	no_collect_4582

	mflr	r0
	bl	collect_0

no_collect_4582:
	lea	o0,__ARRAY__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d0,8(a6)
	stwu	d1,12(a6)

	lwz	r0,0(sp)
	addi	sp,sp,4

	subic.	d3,d3,1
	blt	r_array_2_bb
	beq	r_array_2_ab
r_array_2_aa:
	lwz	d1,-4(a4)
	lwz	d2,-8(a4)
	b	st_fillr2_array
r_array_2_ab:
	lwz	d1,-4(a4)
	lwz	d2,0(sp)
	b	st_fillr2_array
r_array_2_bb:
	lwz	d1,0(sp)
	lwz	d2,4(sp)
	b	st_fillr2_array

st_fillr2_array:
	cmpwi	0,d0,0
	beq	skip_fillr2_array_1

	mtctr	d0
fillr2_array_1:
	stw	d1,4(a6)
	stwu	d2,8(a6)
	bdnz	fillr2_array_1

skip_fillr2_array_1:
	blr

create_R_array_3:
	subi	d7,d7,3
	sub	d7,d7,d0
	sub	d7,d7,d0
	sub.	d7,d7,d0
	bge+	no_collect_4583

	mflr	r0
	bl	collect_0

no_collect_4583:
	lea	o0,__ARRAY__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d0,8(a6)
	stwu	d1,12(a6)

	cmpwi	0,d3,0

	lwz	r0,0(sp)
	addi	a2,sp,4
	addi	sp,sp,4

	beq	r_array_3

	slwi	d4,d3,2
	sub	a3,a4,d4
	subi	d3,d3,1

copy_a_to_b_lp3:
	subic.	d3,d3,1

	lwz	o0,0(a3)
	addi	a3,a3,4
	stwu	o0,-4(sp)
	bge	copy_a_to_b_lp3

r_array_3:
	lwz	d1,0(sp)
	cmpwi	0,d0,0

	lwz	d2,4(sp)
	lwz	d3,8(sp)
	mr	sp,a2

	beq	skip_fillr3_array

	mtctr	d0
fillr3_array_1:
	stw	d1,4(a6)
	stw	d2,8(a6)
	stwu	d3,12(a6)
	bdnz	fillr3_array_1

skip_fillr3_array:
	blr

create_R_array_4:
	subi	d7,d7,3
	slwi	d2,d0,2
	sub.	d7,d7,d2
	bge+	no_collect_4584

	mflr	r0
	bl	collect_0

no_collect_4584:
	lea	o1,__ARRAY__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o1,4(a6)
	stw	d0,8(a6)
	stwu	d1,12(a6)

	cmpwi	0,d3,0

	lwz	r0,0(sp)
	addi	a2,sp,4
	addi	sp,sp,4

	beq	r_array_4

	slwi	d4,d3,2
	sub	a3,a4,d4
	subi	d3,d3,1

copy_a_to_b_lp4:
	subic.	d3,d3,1
	lwz	o1,0(a3)
	addi	a3,a3,4
	stwu	o1,-4(sp)
	bge	copy_a_to_b_lp4

r_array_4:
	lwz	d1,0(sp)
	lwz	d2,4(sp)
	cmpwi	0,d0,0

	lwz	d3,8(sp)
	lwz	d4,12(sp)
	mr	sp,a2
	beq	skip_fillr4_array

	mtctr	d0
fillr4_array:
	stw	d1,4(a6)
	stw	d2,8(a6)
	stw	d3,12(a6)
	stwu	d4,16(a6)
	bdnz	fillr4_array

skip_fillr4_array:
	blr

create_R_array_5:
	subi	d7,d7,3
	slwi	d4,d0,2
	sub	d7,d7,d4
	mr	d5,d2
sub_size_lp:
	subic.	d5,d5,1
	sub	d7,d7,d0
	bgt	sub_size_lp

	tst	d7
	bge+	no_collect_4585

	mflr	r0
	bl	collect_0

no_collect_4585:
	lea	o0,__ARRAY__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d0,8(a6)
	stwu	d1,12(a6)

	cmpwi	0,d3,0

	lwz	r0,0(sp)
	addi	a2,sp,4
	addi	sp,sp,4
	mr	d5,d2

	beq	r_array_5

	slwi	d4,d3,2
	sub	a3,a4,d4
	subi	d3,d3,1

copy_a_to_b_lp5:
	subic.	d3,d3,1

	lwz	o0,0(a3)
	addi	a3,a3,4
	stwu	o0,-4(sp)
	bge	copy_a_to_b_lp5

r_array_5:
	lwz	d1,0(sp)
	lwz	d2,4(sp)
	lwz	d3,8(sp)
	lwz	d4,12(sp)
	b	st_fillr5_array

fillr5_array_1:
	stw	d1,4(a6)
	stw	d2,8(a6)
	mtctr	d5
	stw	d3,12(a6)
	addi	a3,sp,16
	stwu	d4,16(a6)

copy_elem_lp5:
	lwz	o0,0(a3)
	addi	a3,a3,4
	stwu	o0,4(a6)
	bdnz	copy_elem_lp5

st_fillr5_array:
	subic.	d0,d0,1
	bge	fillr5_array_1

	mr	sp,a2
	blr

	csect	.e__system__sAP
e__system__sAP:
	lwz	a2,0(a1)
	lwz	a2,4-2(a2)
	mtctr	a2	
	bctr

;	_ARRAYS

	csect	._create_arrayB
_create_arrayB:
	mr	d1,d0
	addi	d0,d0,3
	srwi	d0,d0,2
	subi	d7,d7,3
	sub.	d7,d7,d0
	bge+	no_collect_3575

	mflr	r0
	bl	collect_0

no_collect_3575:
	lea	o0,__ARRAY__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d1,8(a6)
	stwu	bool_reg,12(a6)
	slwi	d0,d0,2
	add	a6,a6,d0
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	._create_arrayC
_create_arrayC:
	mr	d1,d0
	addi	d0,d0,3
	srwi	d0,d0,2
	subi	d7,d7,2
	sub.	d7,d7,d0
	bge+	no_collect_3578

	mflr	r0
	bl	collect_0

no_collect_3578:
	lea	o0,__STRING__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stwu	d1,8(a6)
	slwi	d0,d0,2
	add	a6,a6,d0
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	._create_arrayI
_create_arrayI:
	subi	d7,d7,3
	sub.	d7,d7,d0
	bge+	no_collect_3577

	mflr	r0
	bl	collect_0

no_collect_3577:
	lea	o0,__ARRAY__2
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d0,8(a6)
	stwu	int_reg,12(a6)
	slwi	d0,d0,2
	add	a6,a6,d0
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	._create_arrayR
_create_arrayR:
	sub	d7,d7,d0
	subi	d7,d7,3+1
	sub.	d7,d7,d0
	bge+	no_collect_3579

	mflr	r0
	bl	collect_0

no_collect_3579:
	addi	a6,a6,4

	lea	o0,__ARRAY__2
	rlwinm	d3,a6,32-2,31,31

	rlwinm	a6,a6,0,0,31-3
	add	d7,d7,d3

	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d0,8(a6)
	slwi	d0,d0,3
	stwu	real_reg,12(a6)
	add	a6,a6,d0
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

; d0: number of elements, d1: element descriptor, d2: element size,
; d3: element a size a0: a_element -> a0: array

	csect	._create_r_array
_create_r_array:
	subi	d7,d7,3
	mr	d5,d2
sub_size_lp2:
	subic.	d5,d5,1
	sub	d7,d7,d0
	bgt	sub_size_lp2

	tst	d7
	bge+	no_collect_3585

	mflr	r0
	bl	collect_1

no_collect_3585:
	lea	o0,__ARRAY__2
	mr	d4,a0
	addi	a0,a6,4+NODE_POINTER_OFFSET
	stw	o0,4(a6)
	stw	d0,8(a6)
	stwu	d1,12(a6)

	tst	d3
	lwz	r0,0(sp)
	addi	sp,sp,4
	beq	_create_r_array_0
	subic.	d3,d3,2
	blt	_create_r_array_1
	beq	_create_r_array_2
	subic.	d3,d3,2
	blt	_create_r_array_3	
	beq	_create_r_array_4
	b	_create_r_array_5

_create_r_array_0:
	tst	d2
	mtctr	d2
	slwi	d0,d0,2
	beq	_skip_fillr0_array_lp
_fillr0_array_1:
	add	a6,a6,d0
	bdnz	_fillr0_array_1
_skip_fillr0_array_lp:
	blr

_create_r_array_1:
	tst	d0
	mtctr	d0
	slwi	d2,d2,2
	beq	_skip_fillr1_array_lp
_fillr1_array_lp:
	stw	d4,4(a6)
	add	a6,a6,d2
	bdnz	_fillr1_array_lp
_skip_fillr1_array_lp:
	blr

_create_r_array_2:
	tst	d0
	mtctr	d0
	slwi	d2,d2,2
	beq	_skip_fillr2_array_1
_fillr2_array_1:
	stw	d4,4(a6)
	stw	d4,8(a6)
	add	a6,a6,d2
	bdnz	_fillr2_array_1
_skip_fillr2_array_1:
	blr

_create_r_array_3:
	tst	d0
	mtctr	d0
	slwi	d2,d2,2
	beq	_skip_fillr3_array
_fillr3_array_1:
	stw	d4,4(a6)
	stw	d4,8(a6)
	stw	d4,12(a6)
	add	a6,a6,d2
	bdnz	_fillr3_array_1
_skip_fillr3_array:
	blr

_create_r_array_4:
	tst	d0
	mtctr	d0
	slwi	d2,d2,2
	beq	_skip_fillr4_array
_fillr4_array:
	stw	d4,4(a6)
	stw	d4,8(a6)
	stw	d4,12(a6)
	stw	d4,16(a6)
	add	a6,a6,d2
	bdnz	_fillr4_array
_skip_fillr4_array:
	blr

_create_r_array_5:
	mr	d1,d3
	subi	d2,d2,4
	sub	d2,d2,d3
	slwi	d2,d2,2
	b	_st_fillr5_array

_fillr5_array_1:
	stw	d4,4(a6)
	stw	d4,8(a6)
	mtctr	d1
	stw	d4,12(a6)
	stwu	d4,16(a6)

_copy_elem_lp5:
	stwu	d4,4(a6)
	bdnz	_copy_elem_lp5
	add	a6,a6,d2
_st_fillr5_array:
	subic.	d0,d0,1
	bge	_fillr5_array_1
	blr

 if !NEW_DESCRIPTORS
	csect	.yet_args_needed
yet_args_needed:
; for more than 4 arguments
	lwz	d1,0(a1)
	lhz	d0,-2(d1)
	subi	d7,d7,3
	sub.	d7,d7,d0
	blt	gc_1

gc_r_1:	lwz	d3,4(a1)
	subi	d0,d0,1+4
	lwz	a1,8(a1)
	addi	d2,a6,4
	lwz	o0,0(a1)
	lwz	o1,4(a1)
	stw	o0,4(a6)
	lwz	o2,8(a1)
	stw	o1,8(a6)
	addi	a1,a1,12
	stwu	o2,12(a6)

cp_a:	lwz	o0,0(a1)
	addi	a1,a1,4
	stwu	o0,4(a6)
	subic.	d0,d0,1
	bge	cp_a

	stw	a0,4(a6)
	addi	d1,d1,8
	stw	d1,8(a6)
	addi	a0,a6,8
	stw	d3,12(a6)
	stwu	d2,16(a6)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

gc_1:	mflr	r0
	bl	collect_2
	b	gc_r_1

	csect	.yet_args_needed_0
yet_args_needed_0:
	subic.	d7,d7,2
	blt	gc_20
gc_r_20:	stwu	a0,8(a6)
	lwz	d0,0(a1)
	addi	a0,a6,4-8
	addi	d0,d0,8
	stw	d0,4-8(a6)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

gc_20:	mflr	r0
	bl	collect_2
	b	gc_r_20

	csect	.yet_args_needed_1
yet_args_needed_1:
	subic.	d7,d7,3
	blt	gc_21
gc_r_21:	stwu	a0,12(a6)
	lwz	d0,0(a1)
	addi	a0,a6,4-12
	addi	d0,d0,8
	stw	d0,4-12(a6)
	lwz	d1,4(a1)
	stw	d1,8-12(a6)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

gc_21:	mflr	r0
	bl	collect_2
	b	gc_r_21

	csect	.yet_args_needed_2
yet_args_needed_2:
	subic.	d7,d7,5
	blt	gc_22
gc_r_22:
	lwz	d0,0(a1)
	stw	a0,8(a6)
	addi	d0,d0,8
	lwz	d2,4(a1)
	stw	d0,12(a6)
	addi	a0,a6,12
	lwz	o0,8(a1)
	stw	d2,16(a6)
	stwu	o0,4(a6)
	stwu	a6,16(a6)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	
		
gc_22:	mflr	r0
	bl	collect_2
	b	gc_r_22

	csect	.yet_args_needed_3
yet_args_needed_3:
	subic.	d7,d7,6
	blt	gc_23
gc_r_23:
	lwz	d0,0(a1)
	stw	a0,12(a6)
	addi	d0,d0,8
	lwz	d2,4(a1)
	stw	d0,16(a6)
	lwz	a1,8(a1)
	stw	d2,20(a6)
	lwz	o0,0(a1)
	lwz	o1,4(a1)
	stwu	o0,4(a6)
	stwu	a6,20(a6)
	addi	a0,a6,16-24
	stw	o1,8-24(a6)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

gc_23:	mflr	r0
	bl	collect_2
	b	gc_r_23

	csect	.yet_args_needed_4
yet_args_needed_4:
	subic.	d7,d7,7
	blt	gc_24
gc_r_24:
	lwz	d0,0(a1)
	stw	a0,16(a6)
	addi	d0,d0,8
	lwz	d2,4(a1)
	stw	d0,20(a6)
	lwz	a1,8(a1)
	stw	d2,24(a6)
	lwz	o0,0(a1)
	lwz	o1,4(a1)
	stwu	o0,4(a6)
	stwu	a6,24(a6)
	addi	a0,a6,20-28
	lwz	o2,8(a1)
	stw	o1,8-28(a6)
	stw	o2,12-28(a6)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

gc_24:	mflr	r0
	bl	collect_2
	b	gc_r_24
 endif

	csect	.repl_args_b
repl_args_b:
	cmpwi	0,d0,0
	ble	repl_args_b_1

	subic.	d0,d0,1
	beq	repl_args_b_4

	lwz	a1,8(a0)
	subic.	d1,d1,2
	bne	repl_args_b_2

	stw	a1,0(a4)
	addi	a4,a4,4
	b	repl_args_b_4

repl_args_b_2:
	slwi	d1,d0,2
	add	a1,a1,d1
	subi	d0,d0,1
repl_args_b_3:
	lwzu	o0,-4(a1)
	addi	a4,a4,4
	stw	o0,0-4(a4)
	cmpwi	0,d0,0
	subi	d0,d0,1
	bne	repl_args_b_3
repl_args_b_4:
	lwz	o0,4(a0)
	addi	a4,a4,4
	stw	o0,0-4(a4)
repl_args_b_1:
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	.push_arg_b
push_arg_b:
	cmplwi	0,d1,2
	blt	push_arg_b_1
	bne	push_arg_b_2

	cmpw	0,d1,d0
	beq	push_arg_b_1
push_arg_b_2:
	lwz	a0,8(a0)
	subi	d1,d1,2
push_arg_b_1:
	slwi	d1,d1,2
	lwzx	a0,a0,d1

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	.del_args
del_args:
	lwz	d1,0(a0)
	sub	d1,d1,d0
	lhz	d0,-2(d1)
	subic.	d0,d0,2
	bge	del_args_2

	lwz	o0,4(a0)
	stw	d1,0(a1)
	lwz	o1,8(a0)
	stw	o0,4(a1)
	stw	o1,8(a1)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

del_args_2:
	bne	del_args_3

	lwz	o0,4(a0)
	stw	d1,0(a1)
	lwz	o1,8(a0)
	stw	o0,4(a1)
	lwz	o1,0(o1)
	stw	o1,8(a1)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

del_args_3:
	sub.	d7,d7,d0
	blt	del_args_gc
del_args_r_gc:
	stw	d1,0(a1)
	lwz	o0,4(a0)
	stw	a6,8(a1)
	lwz	a0,8(a0)
	stw	o0,4(a1)

del_args_copy_args:
	lwz	o0,0(a0)
	addi	a0,a0,4
	stw	o0,0(a6)
	addi	a6,a6,4
	subic.	d0,d0,1
	bgt	del_args_copy_args

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

del_args_gc:
	mflr	r0
	bl	collect_2	
	b	del_args_r_gc

 if 0
	csect	.o__S_P2
o__S_P2:
	lwz	d0,0(a0)
	lha	d0,-2(d0)
	cmpwi	0,d0,2
	lwz	a0,8(a0)
	beq	o__S_P2_2
	lwz	a0,0(a0)
o__S_P2_2:
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	

	csect	.ea__S_P2
ea__S_P2:
	lea	a2,__indirection
	lwz	d0,4(a1)
	stw	a2,0(a1)
	stw	a0,4(a1)
	mr	a1,d0
	lwz	d0,0(a1)
	andi.	r0,d0,2
	bne	ea__S_P2_1
		
	stw	a0,0(a4)
	addi	a4,a4,4

	mtctr	d0

	mr	a0,a1

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

	mr	a1,a0
	lwzu	a0,-4(a4)

ea__S_P2_1:
	lwz	d0,0(a1)
	lha	d0,-2(d0)
	lwz	a1,8(a1)
	cmpwi	0,d0,2
	beq	ea__S_P2_2
	lwz	a1,0(a1)
ea__S_P2_2:
	lwz	d0,0(a1)
	andi.	r0,d0,2
	bne	ea__S_P2_3

	subi	d0,d0,20
	mtctr	d0
	bctr

ea__S_P2_3:
	stw	d0,0(a0)
	lwz	g1,4(a1)
	stw	g1,4(a0)
	lwz	g1,8(a1)
	stw	g1,8(a0)

	lwz	r0,0(sp)
	addi	sp,sp,4
	blr	
 endif

	csect	.acos_real{PR}
acos_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f1,f14

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.acos
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.asin_real{PR}
asin_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f1,f14

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.asin
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.atan_real{PR}
atan_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f1,f14

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.atan
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.cos_real{PR}
cos_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f1,f14

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.cos
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.sin_real{PR}
sin_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f1,f14

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.sin
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.tan_real{PR}
tan_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f1,f14

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.tan
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.ln_real{PR}
ln_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f1,f14

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.log
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.log10_real{PR}
log10_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f1,f14

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.log10
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.exp_real{PR}
exp_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f1,f14

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.exp
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.sqrt_real{PR}
sqrt_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f1,f14

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.sqrt
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.pow_real{PR}
pow_real:
	mflr	r0
	stwu	r0,-4(sp)
	fmr	f2,f14
	fmr	f1,f15

 if MACOSX
 	mr	g0,sp
 	ori	sp,sp,28
 	stwu	g0,-(64+28)(sp)
 else
	stwu	sp,-64(sp)
 endif
	bl	.pow
	nop
#ifdef USE_DCBZ
	li	g2,32
#endif
 if MACOSX
 	lwz	sp,0(sp)
 	lwz	r0,0(sp)
 else
	lwz	r0,64(sp)
 endif
	fmr	f14,f1
	mtlr	r0
 if MACOSX
	lwz	r0,4(sp)
	addi	sp,sp,8
 else
	lwz	r0,68(sp)
	addi	sp,sp,72
 endif
	blr

	csect	.entier_real{PR}
entier_real:
	lea	o0,entier_constants_and_buffers
	fctiwz	f2,f14
	lfd	f1,0(o0)
	stfd	f2,8(o0)
	fcmpo	0,f14,f1
	lwz	d0,12(o0)
	bge+	entier_real_2

	lfd	f31,24(o0)
	xoris	o1,d0,0x8000
	stw	o1,20(o0)
	lfd	f1,16(o0)
	fsub	f1,f1,f31
	fcmpo	0,f14,f1
	beq	entier_real_2

	subi	d0,d0,1
entier_real_2:
	lwz	r0,0(sp)
	addi	sp,sp,4
	blr
	
	csect	.my_pointer_glue{PR}
	lwz	r0,0(r3)
	stw	RTOC,20(SP)
	mtctr	r0
	lwz	RTOC,4(r3)
	bctr

 if NEW_DESCRIPTORS
	include	'pap.a'
 endif

 if MACOSX
 	export	.call_function_0{PR}
	csect	.call_function_0{PR}
	mflr	r0
	stw	r0,8(sp)
	subi	sp,sp,64

	stw	RTOC,20(sp)
	lwz	RTOC,4(r3)
	lwz	r3,0(r3)
	mtctr	r3
	bctrl
	lwz	RTOC,20(sp)

	lwz	r0,64+8(sp)
	addi	sp,sp,64
	mtlr	r0
	blr

 	export	.call_function_2{PR}
	csect	.call_function_2{PR}
	mflr	r0
	stw	r0,8(sp)
	subi	sp,sp,64

	stw	RTOC,20(sp)
	lwz	RTOC,4(r5)
	lwz	r5,0(r5)
	mtctr	r5
	bctrl
	lwz	RTOC,20(sp)

	lwz	r0,64+8(sp)
	addi	sp,sp,64
	mtlr	r0
	blr

 	export	.call_function_3{PR}
	csect	.call_function_3{PR}
	mflr	r0
	stw	r0,8(sp)
	subi	sp,sp,64

	stw	RTOC,20(sp)
	lwz	RTOC,4(r6)
	lwz	r6,0(r6)
	mtctr	r6
	bctrl
	lwz	RTOC,20(sp)

	lwz	r0,64+8(sp)
	addi	sp,sp,64
	mtlr	r0
	blr

 	export	.call_function_5{PR}
	csect	.call_function_5{PR}
	mflr	r0
	stw	r0,8(sp)
	subi	sp,sp,64

	stw	RTOC,20(sp)
	lwz	RTOC,4(r8)
	lwz	r8,0(r8)
	mtctr	r8
	bctrl
	lwz	RTOC,20(sp)

	lwz	r0,64+8(sp)
	addi	sp,sp,64
	mtlr	r0
	blr

 	export	.call_function_7{PR}
	csect	.call_function_7{PR}
	mflr	r0
	stw	r0,8(sp)
	subi	sp,sp,64

	stw	RTOC,20(sp)
	lwz	RTOC,4(r10)
	lwz	r10,0(r10)
	mtctr	r10
	bctrl
	lwz	RTOC,20(sp)

	lwz	r0,64+8(sp)
	addi	sp,sp,64
	mtlr	r0
	blr

 	export	.get_TOC{PR}
	csect	.get_TOC{PR}
	mr	r3,RTOC
	blr
 endif

	macro
	te	&address
	tc	&address{TC},&address
	endm

	toc

	tc	INT2{TC},INT+2
	tc	CHAR2{TC},CHAR+2
	tc	BOOL2{TC},BOOL+2
	tc	REAL2{TC},REAL+2
	tc	__STRING__2{TC},__STRING__+2
	tc	__ARRAY__2{TC},__ARRAY__+2

	tc	small_integers{TC},small_integers{BS}
 if 1
	tc	small_integers8{TC},small_integers{BS}+8
 endif
	tc	stack_p{TC},stack_p{BS}
 if MACOSX
	tc	end_a_stack{TC},end_a_stack{BS}
	tc	end_b_stack{TC},end_b_stack{BS}
 endif
	tc	static_characters{TC},static_characters{BS}
 if 1
	tc	static_characters8{TC},static_characters{BS}+8
 endif
	tc	sprintf_time_buffer{TC},sprintf_time_buffer{BS}
	tc	sprintf_buffer{TC},sprintf_buffer{BS}
	tc	last_time{TC},last_time{BS}
	tc	heap_size_33{TC},heap_size_33{BS}
	tc	heap_size_129{TC},heap_size_129{BS}
	tc	heap_p{TC},heap_p{BS}
	tc	heap_p1{TC},heap_p1{BS}
	tc	heap_p2{TC},heap_p2{BS}
	tc	heap_mbp{TC},heap_mbp{BS}
	tc	heap_copied_vector_size{TC},heap_copied_vector_size{BS}
	tc	heap_copied_vector{TC},heap_copied_vector{BS}
	tc	halt_sp{TC},halt_sp{BS}
	tc	garbage_collect_time{TC},garbage_collect_time{BS}
	tc	extra_heap{TC},extra_heap{BS}	
	tc	extra_heap_size{TC},extra_heap_size{BS}
	tc	execute_time{TC},execute_time{BS}
	tc	basic_only{TC},basic_only{BS}
	tc	alloc_size{TC},alloc_size{BS}
	tc	IO_time{TC},IO_time{BS}
 if MEASURE_GC
	tc	compact_garbage_collect_time{TC},compact_garbage_collect_time{BS}
	tc	mark_compact_garbage_collect_time{TC},mark_compact_garbage_collect_time{BS}
	tc	total_gc_bytes_lo{TC},total_gc_bytes_lo{BS}
	tc	total_gc_bytes_hi{TC},total_gc_bytes_hi{BS}
	tc	total_compact_gc_bytes_lo{TC},total_compact_gc_bytes_lo{BS}
	tc	total_compact_gc_bytes_hi{TC},total_compact_gc_bytes_hi{BS}
 endif
	tc	heap_end_after_copy_gc{TC},heap_end_after_copy_gc{BS}
	tc	caf_listp{TC},caf_listp{BS}
	tc	caf_list{TC},caf_list{BS}
	tc	caf_list4{TC},caf_list{BS}+4

 if EXCEPTIONS
	tc	exception_info{TC},exception_info{BS}
 endif
 if FINALIZERS
	tc	finalizer_list{TC},finalizer_list{BS}
	tc	free_finalizer_list{TC},free_finalizer_list{BS}
	tc	__Nil_m8{TC},__Nil-8
	tc	e____system__kFinalizer_2{TC},e____system__kFinalizer+2
	tc	e____system__kFinalizerGCTemp_2{TC},e____system__kFinalizerGCTemp+2
 endif
 if MARK_GC
	te	last_heap_free
	te	free_after_mark
	te	bit_counter
	te	zero_bits_before_mark
	te	bit_vector_p
	te	marked_gc_string_1
	te	lazy_array_list
  if ADJUST_HEAP_SIZE
	te	bit_vector_size
	te	heap_size_multiple
	te	initial_heap_size
  endif
 endif
 if MARK_AND_COPY_GC || !MARK_GC
	te	copy_lp1
 endif
	te	IO_error_string
	te	__cycle__in__spine
	te	__indirection
	te	stack_size
	te	flags
	te	execution_aborted
	te	heap_size
	te	false_c_string
	te	false_string
	te	file_c_string
	te	garbage_collect_string_1
	te	garbage_collect_string_2
	te	garbage_collect_string_3
	te	heap_end_after_gc
	te	heap_p3
	te	heap_use_after_gc_string_1
	te	heap_use_after_gc_string_2
	te	heap_vector
	te	high_index_string
	te	low_index_string
	te	new_line_string
	te	out_of_memory_string_1
	te	out_of_memory_string_4
	te	print_
	te	printf_int_string
	te	printf_real_string
	te	sprintf_time_string
	te	stack_overflow_string
	te	time_string_1
	te	time_string_2
 if MEASURE_GC
	te	time_string_2a
 endif
 if PREFETCH
	te	queue
	te	rmarkp_queue
 endif
	te	time_string_3
	te	time_string_4
	te	true_c_string
	te	true_string
	te	zero_length_string
	te	garbage_collect_flag
	te	entier_constants_and_buffers
 if MEASURE_GC
	te	f_power2_52
	te	f_60
	te	f_1000000
 endif

 if WRITE_HEAP
	tc	first_function{TC},first_function{DS}
	tc	heap2_begin_and_end{TC},heap2_begin_and_end{BS}
	te	min_write_heap_size
 endif
 if PROFILE
 	te	garbage_collector_name
 endif

	export	print_execution_time{DS}
	csect	print_execution_time{DS}
	dc.l	.print_execution_time{PR}
	dc.l	TOC{tc0}