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

LINUX	=	0
; PROFILE	=	0

#define	sp	r1

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

#define	a0	r23
#define	a1	r22
#define	a2	r21
#define	a3	r20
#define	a4	r19
#define	a5	r18
#define	a6	r17

#define	o0	r3
#define	o1	r4
#define	o2	r5
#define	o3	r6
#define	o4	r7
#define	o5	r8

#define	g2	r9
#define	g3	r10

#define	g0	r11
#define	g1	r12

#define	int_reg	r16
#define	char_reg	r15
#define	real_reg	r14
#define	bool_reg	r13

	.macro	setmbit
	rlwinm	$2,$1,32-$6-3,3+$6,31
	lbzx	$4,$0,$2
	rlwinm	$5,$1,(32-$6) & 31,29,31
	srw	$3,g3,$5
	or	$4,$4,$3
	stbx	$4,$0,$2
	.endmacro

;	&vector 0,&bit_n 1,&byte_offset 2,&bit 3,&byte 4,&scratch 5,&shift 6
;	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

	.macro	tstmbit
	rlwinm	$2,$1,32-$6-3,3+$6,31
	lbzx	$4,$0,$2
	rlwinm	$5,$1,32-$6,29,31
	rlwnm.	$3,$4,$5,24,24	
	.endmacro

;	&vector 0,&bit_n 1,&byte_offset 2,&bit 3,&byte 4,&bit_n_in_byte 5,&shift 6
;	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	
;	.endmacro

	.macro	tstmbit_
	rlwinm	$2,$1,32-$5-3,3+$5,31
	lbzx	$4,$0,$2
	rlwinm	$1,$1,32-$5,29,31
	rlwnm.	$3,$4,$1,24,24	
	.endmacro

; same as tstmbit, but modifies bit_n register
;	&vector 0,&bit_n 1,&byte_offset 2,&bit 3,&byte 4,&shift 5
;	rlwinm	&byte_offset,&bit_n,32-&shift-3,3+&shift,31
;	lbzx	&byte,&vector,&byte_offset
;	rlwinm	&bit_n,&bit_n,32-&shift,29,31
;	rlwnm.	&bit,&byte,&bit_n,24,24	
;	endm

	.macro	clrmbit
	rlwinm	$2,$1,32-$6-3,3+$6,31
	lbzx	$4,$0,$2
	rlwinm	$5,$1,32-$6,29,31
	srw	$3,g3,$5
	andc	$4,$4,$3
	stbx	$4,$0,$2
	.endmacro

;	&vector 0,&bit_n 1,&byte_offset 2,&bit 3,&byte 4,&scratch 5,&shift 6
;	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
;	.endmacro

#include	"pmacros.a"

MACOSX		=	1

NODE_POINTER_OFFSET	=	0

SHARE_CHAR_INT	=	1
COPIED_VECTOR	=	1
RECORDS		=	1
MY_ITOS		=	1
FINALIZERS	=	1

USE_DCBZ		=	0
COMPACT_GC_ONLY	=	0

ADJUST_HEAP_SIZE	=	1
MARK_GC		=	1
MARK_AND_COPY_GC	=	1

 .if LINUX
STDERR_TO_FILE	=	0
WRITE_HEAP		=	0
 .else
WRITE_HEAP		=	0
STDERR_TO_FILE	=	1
 .endif
NEW_DESCRIPTORS	=	1
;	PROFILE	=	0

MODULE_NAMES_IN_TIME_PROFILER	=	1

EXCEPTIONS		=	0

MINIMUM_HEAP_SIZE	=	8000

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

	.globl	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
	.globl	_halt_sp
; 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

	.globl	saved_heap_p
	.comm	saved_heap_p,8
	
	.globl	saved_a_stack_p
	.comm	saved_a_stack_p,4
	
	.comm	sprintf_buffer,32
	.comm	sprintf_time_buffer,20

	.globl	small_integers
	.comm	small_integers,33*8
	.globl	static_characters
	.comm	static_characters,256*8

 .if EXCEPTIONS
	.comm	exception_info,12
 .endif

	.comm	caf_list,4
	.globl	caf_listp
	.comm	caf_listp,4

	.data

heap_p3:	.long	0
heap_vector:.long	0
heap_end_after_gc:	.long	0

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

	.align	2
zero_length_string:
	.long	__STRING__+2
	.long	0
true_string:
	.long	__STRING__+2
	.long	4
true_c_string:
	.ascii	"True"
	.byte	0,0,0,0
false_string:
	.long	__STRING__+2
	.long	5
false_c_string:
	.ascii	"False"
	.byte	0,0,0
file_c_string:
	.ascii	"File"
	.byte	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:
	.byte	0
	.byte	0,0,0

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

 .if MARK_GC
marked_gc_string_1:
	.ascii	"Marked: "
	.byte	0
 .endif
 .if PROFILE
 	.align	2
  .if MODULE_NAMES_IN_TIME_PROFILER
m_system:
	.long	6
	.ascii	"System"
	.byte	0,0
	.long	m_system
  .endif
garbage_collector_name:
	.long	0
	.ascii	"garbage_collector"
	.byte	0
	.align	2
 .endif
 .if WRITE_HEAP
	.comm	heap2_begin_and_end,8
 .endif

	.align	3
entier_constants_and_buffers:
	.double	0.0
	.double	0.0
	.long	0x43300000
	.long	0x00000000
	.long	0x43300000
	.long	0x80000000

 .if FINALIZERS
	.globl	__Nil
	.globl	e____system__kFinalizer
	.globl	e____system__kFinalizerGCTemp
	.globl	finalizer_list
	.comm	finalizer_list,4
	.globl	free_finalizer_list
	.comm	free_finalizer_list,4
 .endif

	.align	1

	.text
	.globl	_abc_main
	.globl	print_
	.globl	print_char
	.globl	print_int
	.globl	print_real
	.globl	print_sc
	.globl	print_symbol
	.globl	print_symbol_sc
	.globl	print__string__
	.globl	print__chars__sc
	.globl	printD

	.globl	eprint__
	.globl	eprint__string__
	.globl	eprintD

	.globl	push_t_r_args
	.globl	push_a_r_args
	.globl	halt
		
	.globl	catAC
	.globl	sliceAC
	.globl	updateAC
	.globl	eqAC
	.globl	cmpAC

	.globl	string_to_string_node

	.globl	create_array
	.globl	create_arrayB
	.globl	create_arrayC
	.globl	create_arrayI
	.globl	create_arrayR
	.globl	create_R_array

	.globl	_create_arrayB
	.globl	_create_arrayC
	.globl	_create_arrayI
	.globl	_create_arrayR
	.globl	_create_r_array

	.globl	BtoAC
	.globl	DtoAC
	.globl	ItoAC
	.globl	RtoAC
	.globl	eqD

	.globl	collect_0,collect_1,collect_2,collect_3
	.globl	collect_00,collect_01,collect_02,collect_03

	.globl	eval_01,eval_11,eval_02,eval_12,eval_22

	.globl	e__system__sAP
	.globl	yet_args_needed,yet_args_needed_0,yet_args_needed_1
	.globl	yet_args_needed_2,yet_args_needed_3,yet_args_needed_4

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

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

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

	.globl	out_of_memory_4

	.globl	acos_real
	.globl	asin_real
	.globl	atan_real
	.globl	cos_real
	.globl	sin_real
	.globl	tan_real
	.globl	ln_real
	.globl	log10_real
	.globl	exp_real
	.globl	sqrt_real
	.globl	pow_real
	.globl	entier_real
 .if EXCEPTIONS
	.globl	e__Exceptions__scatch__exception
	.globl	e__Exceptions__sraise__exception
 .endif
 .if LINUX
	.globl	__start
 .else
 	.globl	_start
 .endif
	.globl	__driver

		
; from system.abc:	
	.globl	INT
	.globl	CHAR
	.globl	BOOL
	.globl	REAL
	.globl	FILE
	.globl	__STRING__
	.globl	__ARRAY__
	.globl	__cycle__in__spine
	.globl	__print__graph
	.globl	__eval__to__nf

 .if STDERR_TO_FILE
	.globl	_close_stderr_file
 .endif

; from mcon.c:
	.globl	_w_print_char
	.globl	_w_print_text
	.globl	_w_print_int
	.globl	_w_print_real
	.globl	_w_print_string

 .if STDERR_TO_FILE
	.globl	_er_print_char
	.globl	_er_print_string
	.globl	_er_print_int
	.globl	_er_print_text
 .else
	.globl	_ew_print_char
	.globl	_ew_print_string
	.globl	_ew_print_int
 .endif
 .if 0

	.globl	_wait_for_key_press
 .else
 	.globl	_execution_aborted
 .endif
	.globl	_stack_size
	.globl	_heap_size
	.globl	_flags
 .if ADJUST_HEAP_SIZE
	.globl	_heap_size_multiple
	.globl	_initial_heap_size
 .endif
 
; from standard c library:
	.globl	_sprintf
 .if LINUX
	.globl	malloc
	.globl	free
 .else
	.globl	_NewPtr
	.globl	_DisposePtr
	.globl	_TickCount
	.globl	_Debugger
 .endif
	.globl	_acos
	.globl	_asin
	.globl	_atan
	.globl	_cos
	.globl	_sin
	.globl	_tan
	.globl	_log
	.globl	_log10
	.globl	_exp
	.globl	_sqrt
	.globl	_pow

 .if PROFILE
	.globl	init_profiler
	.globl	profile_s,profile_n,profile_r,profile_ti
	.globl	write_profile_information,write_profile_stack
 .endif

; __TEXT._abc_main:

_abc_main:
 	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	L_NewPtr$stub
 .endif
	nop
 .if MACOSX
 	lwz	sp,0(sp)
 .else
	addi	sp,sp,64
 .endif
	cmpwi	cr0,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)
	
	stwu	sp,-64(sp)
  .if 1
	bl	_allocate_a_stack
  .else
	bl	L_NewPtr$stub
  .endif
	addi	sp,sp,64

	cmpwi	cr0,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,INT+2
make_small_integers_lp:
	stw	d1,0(a0)
	stw	d0,4(a0)
	addi	d0,d0,1
	cmpwi	cr0,d0,33
	addi	a0,a0,8
	bne	make_small_integers_lp

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

	lea	o0,caf_listp
 	lea	a0,caf_list+4
	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-8
 	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,INT+2
	lea	char_reg,CHAR+2
	lea	real_reg,REAL+2
	lea	bool_reg,BOOL+2

 .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
		
	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

	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
	lea	a0,IO_time
	lwz	d2,0(a0)
	add	d0,d0,d2

	bl	_print_time

	li	o0,13
 .if STDERR_TO_FILE
	bl	_er_print_char
 .else
	bl	_ew_print_char
 .endif
	nop

 .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	L_DisposePtr$stub
 .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

__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	L_sprintf$stub

	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

; __TEXT.print_sc:

print_sc:
	lea	o0,basic_only
	lwz	o1,0(o0)
	cmpwi	cr0,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
 .if 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	

; __TEXT.printD:

printD:	andi.	r0,d0,2
	bne	printD_

	mr	a2,d0
	b	print_string_a2

; __TEXT.print_symbol:

print_symbol:
	li	d1,0
	b	print_symbol_2

; __TEXT.print_symbol_sc:

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

	cmpw	cr0,char_reg,d0
	beq	print_char_node

	cmpw	cr0,bool_reg,d0
	beq	print_bool

	cmpw	cr0,real_reg,d0
	beq	print_real_node

	cmpwi	cr0,d1,0
	bne	end_print_symbol

printD_:
	lha	d1,-2(d0)
 .if NEW_DESCRIPTORS
	cmplwi	cr0,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	cr0,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
 .if 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	

; __TEXT.print_int:

print_int:
	mr	o0,d0
	b	print_int2

; __TEXT.print_char:

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

	b	print_char_node_sc
		
print_char_node:
	cmpwi	cr0,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
 .if 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
 .if 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	cr0,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

; __TEXT.print_real:

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
 .if 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
 .if 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	

; __TEXT.print__chars__sc:

print__chars__sc:
	lea	o0,basic_only
	lwz	d1,0(o0)
	cmpwi	cr0,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
 .if 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

	.text
; __TEXT.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
 .if 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

	.text
; __TEXT.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
 .if 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	

	.text
; __TEXT.eprintD:

eprintD:
	andi.	r0,d0,2
	bne	eprintD_

	mr	a2,d0
	b	eprint_string_a2

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

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

	cmplwi	cr0,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
 .if 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	

	.text
; __TEXT.DtoAC:

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

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

	cmplwi	cr0,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

	.text
; __TEXT.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	

; __TEXT.push_t_r_args:

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	cr0,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	

	.text
; __TEXT.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	

	.text
; __TEXT.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	L_sprintf$stub
 .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
		
	.text
; __TEXT.ItoAC:

ItoAC:
 .if MY_ITOS
	lea	a0,sprintf_buffer
	cmpwi	cr0,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	cr0,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	cr0,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	cr0,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	L_sprintf$stub
  .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
 .if USE_DCBZ
	li	g2,32
 .endif
	blr	

	.text
; __TEXT.eqD:

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

	cmpw	cr0,d0,int_reg
	beq	eqD_INT

	cmpw	cr0,d0,char_reg
	beq	eqD_CHAR

	cmpw	cr0,d0,bool_reg
	beq	eqD_BOOL

	cmpw	cr0,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	cr0,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	cr0,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	L_TickCount$stub
  .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)

	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	L_TickCount$stub
 .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	

;
;	the garbage collector
;

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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


 	.text
; __TEXT.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	cr0,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
	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	cr0,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
 	stwu	d0,-4(sp)
	bl	call_finalizers
	lwz	d0,0(sp)
	addi	sp,sp,4
 .endif

 .if WRITE_HEAP
 	.globl	first_function
 	.globl	_write_heap
	.globl	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)

 	li	r9,0

	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-8
	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)

	mtctr	r12

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

	bctrl
	
 .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

	.text
;	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

	.text
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	cr1,reorder_lp

	blr
	
;
;	the sliding compacting garbage collector
;

	.text
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	cr0,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

#include	"pmark.a"

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	cr0,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	cr0,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:
	bl	.add_garbage_collect_time

	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:
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
	baddi	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	cr0,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
	baddi	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

	.text
; __TEXT.eval_01:

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

	.text
; __TEXT.eval_11:

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

	.text
; __TEXT.eval_02:

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

	.text
; __TEXT.eval_12:

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

	.text
; __TEXT.eval_22:

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

; __TEXT.__eaind:

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	

; __TEXT.__indirection:

	b	eval_fill
	nop	
	nop	
 .if LINUX | MACOSX
	nop
	nop
 .endif
	.long	0
	.long	-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
 	.text
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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.eval_upd_7:

 .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

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

;
;	STRINGS
;
	.text
; __TEXT.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

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

; __TEXT.sliceAC:

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

	li	d1,0

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

	cmpw	cr0,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

	.text
; __TEXT.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	cr0,d1,0
	bge	print_error

	lea	o0,low_index_string
update_string_error_2:
	b	print_error

	.text
; __TEXT.eqAC:

eqAC:
	lwzu	d0,4-NODE_POINTER_OFFSET(a0)
	lwzu	o0,4-NODE_POINTER_OFFSET(a1)
	cmpw	cr0,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	

	.text
; __TEXT.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	

	.text
; __TEXT.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

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

;
;	ARRAYS
;

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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	

	.text
; __TEXT.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	cr0,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	

	.text
; __TEXT.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	cr0,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	cr0,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	cr0,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	cr0,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	cr0,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	cr0,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	cr0,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

	.text
; __TEXT.e__system__sAP:

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

;	_ARRAYS

	.text
; __TEXT._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	

	.text
; __TEXT._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	

	.text
; __TEXT._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	

	.text
; __TEXT._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

	.text
; __TEXT._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
	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.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

	.text
; __TEXT.repl_args_b:

repl_args_b:
	cmpwi	cr0,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	cr0,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	

	.text
; __TEXT.push_arg_b:

push_arg_b:
	cmplwi	cr0,d1,2
	blt	push_arg_b_1
	bne	push_arg_b_2

	cmpw	cr0,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	

	.text
; __TEXT.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
	.text
o__S_P2:
	lwz	d0,0(a0)
	lha	d0,-2(d0)
	cmpwi	cr0,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	

	.text
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

	.text
; __TEXT.acos_real:

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	L_acos$stub
 .if 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

	.text
; __TEXT.asin_real:

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	L_asin$stub
 .if 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

	.text
; __TEXT.atan_real:

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	L_atan$stub
 .if 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

	.text
; __TEXT.cos_real:

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	L_cos$stub
 .if 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

	.text
; __TEXT.sin_real:

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	L_sin$stub
 .if 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

	.text
; __TEXT.tan_real:

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	L_tan$stub
 .if 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

	.text
; __TEXT.ln_real:

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	L_log$stub
 .if 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

	.text
; __TEXT.log10_real:

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	L_log10$stub
 .if 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

	.text
; __TEXT.exp_real:

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	L_exp$stub
 .if 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

	.text

; __TEXT.sqrt_real:
	
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	L_sqrt$stub
 .if 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

	.text
	
; __TEXT.pow_real:

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	L_pow$stub
 .if 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

	.text

; __TEXT.entier_real:

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

 .if NEW_DESCRIPTORS
#include	"pap.a"
 .endif

.picsymbol_stub
L_sin$stub:
	.indirect_symbol _sin
	mflr r0
	bcl 20,31,L0$pb
L0$pb:
	mflr r11
	addis r11,r11,ha16(L0$lz-L0$pb)
	mtlr r0
	lwz r12,lo16(L0$lz-L0$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L0$lz-L0$pb )
	bctr
.lazy_symbol_pointer
L0$lz:
	.indirect_symbol _sin
       	.long dyld_stub_binding_helper

.picsymbol_stub
L_cos$stub:
	.indirect_symbol _cos
	mflr r0
	bcl 20,31,L1$pb
L1$pb:
	mflr r11
	addis r11,r11,ha16(L1$lz-L1$pb)
	mtlr r0
	lwz r12,lo16(L1$lz-L1$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L1$lz-L1$pb )
	bctr
.lazy_symbol_pointer
L1$lz:
	.indirect_symbol _cos
       	.long dyld_stub_binding_helper

.picsymbol_stub
L_tan$stub:
	.indirect_symbol _tan
	mflr r0
	bcl 20,31,L2$pb
L2$pb:
	mflr r11
	addis r11,r11,ha16(L2$lz-L2$pb)
	mtlr r0
	lwz r12,lo16(L2$lz-L2$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L2$lz-L2$pb )
	bctr
.lazy_symbol_pointer
L2$lz:
	.indirect_symbol _tan
       	.long dyld_stub_binding_helper

.picsymbol_stub
L_asin$stub:
	.indirect_symbol _asin
	mflr r0
	bcl 20,31,L3$pb
L3$pb:
	mflr r11
	addis r11,r11,ha16(L3$lz-L3$pb)
	mtlr r0
	lwz r12,lo16(L3$lz-L3$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L3$lz-L3$pb )
	bctr
.lazy_symbol_pointer
L3$lz:
	.indirect_symbol _asin
       	.long dyld_stub_binding_helper

.picsymbol_stub
L_acos$stub:
	.indirect_symbol _acos
	mflr r0
	bcl 20,31,L4$pb
L4$pb:
	mflr r11
	addis r11,r11,ha16(L4$lz-L4$pb)
	mtlr r0
	lwz r12,lo16(L4$lz-L4$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L4$lz-L4$pb )
	bctr
.lazy_symbol_pointer
L4$lz:
	.indirect_symbol _acos
       	.long dyld_stub_binding_helper

.picsymbol_stub
L_atan$stub:
	.indirect_symbol _atan
	mflr r0
	bcl 20,31,L5$pb
L5$pb:
	mflr r11
	addis r11,r11,ha16(L5$lz-L5$pb)
	mtlr r0
	lwz r12,lo16(L5$lz-L5$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L5$lz-L5$pb )
	bctr
.lazy_symbol_pointer
L5$lz:
	.indirect_symbol _atan
       	.long dyld_stub_binding_helper

.picsymbol_stub
L_sqrt$stub:
	.indirect_symbol _sqrt
	mflr r0
	bcl 20,31,L6$pb
L6$pb:
	mflr r11
	addis r11,r11,ha16(L6$lz-L6$pb)
	mtlr r0
	lwz r12,lo16(L6$lz-L6$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L6$lz-L6$pb )
	bctr
.lazy_symbol_pointer
L6$lz:
	.indirect_symbol _sqrt
       	.long dyld_stub_binding_helper

.picsymbol_stub
L_pow$stub:
	.indirect_symbol _pow
	mflr r0
	bcl 20,31,L7$pb
L7$pb:
	mflr r11
	addis r11,r11,ha16(L7$lz-L7$pb)
	mtlr r0
	lwz r12,lo16(L7$lz-L7$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L7$lz-L7$pb )
	bctr
.lazy_symbol_pointer
L7$lz:
	.indirect_symbol _pow
       	.long dyld_stub_binding_helper

.picsymbol_stub
L_exp$stub:
	.indirect_symbol _exp
	mflr r0
	bcl 20,31,L8$pb
L8$pb:
	mflr r11
	addis r11,r11,ha16(L8$lz-L8$pb)
	mtlr r0
	lwz r12,lo16(L8$lz-L8$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L8$lz-L8$pb )
	bctr
.lazy_symbol_pointer
L8$lz:
	.indirect_symbol _exp
	.long dyld_stub_binding_helper

.picsymbol_stub
L_log$stub:
	.indirect_symbol _log
	mflr r0
	bcl 20,31,L9$pb
L9$pb:
	mflr r11
	addis r11,r11,ha16(L9$lz-L9$pb)
	mtlr r0
	lwz r12,lo16(L9$lz-L9$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L9$lz-L9$pb )
	bctr
.lazy_symbol_pointer
L9$lz:
	.indirect_symbol _log
	.long dyld_stub_binding_helper

.picsymbol_stub
L_log10$stub:
	.indirect_symbol _log10
	mflr r0
	bcl 20,31,L10$pb
L10$pb:
	mflr r11
	addis r11,r11,ha16(L10$lz-L10$pb)
	mtlr r0
	lwz r12,lo16(L10$lz-L10$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L10$lz-L10$pb )
	bctr
.lazy_symbol_pointer
L10$lz:
	.indirect_symbol _log10
	.long dyld_stub_binding_helper

.picsymbol_stub
L_sprintf$stub:
	.indirect_symbol _sprintf
	mflr r0
	bcl 20,31,L11$pb
L11$pb:
	mflr r11
	addis r11,r11,ha16(L11$lz-L11$pb)
	mtlr r0
	lwz r12,lo16(L11$lz-L11$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L11$lz-L11$pb )
	bctr
.lazy_symbol_pointer
L11$lz:
	.indirect_symbol _sprintf
	.long dyld_stub_binding_helper


.picsymbol_stub
L_TickCount$stub:
	.indirect_symbol _TickCount
	mflr r0
	bcl 20,31,L12$pb
L12$pb:
	mflr r11
	addis r11,r11,ha16(L12$lz-L12$pb)
	mtlr r0
	lwz r12,lo16(L12$lz-L12$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L12$lz-L12$pb )
	bctr
.lazy_symbol_pointer
L12$lz:
	.indirect_symbol _TickCount
	.long dyld_stub_binding_helper

.picsymbol_stub
L_DisposePtr$stub:
	.indirect_symbol _DisposePtr
	mflr r0
	bcl 20,31,L13$pb
L13$pb:
	mflr r11
	addis r11,r11,ha16(L13$lz-L13$pb)
	mtlr r0
	lwz r12,lo16(L13$lz-L13$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L13$lz-L13$pb )
	bctr
.lazy_symbol_pointer
L13$lz:
	.indirect_symbol _DisposePtr
	.long dyld_stub_binding_helper

.picsymbol_stub
L_NewPtr$stub:
	.indirect_symbol _NewPtr
	mflr r0
	bcl 20,31,L14$pb
L14$pb:
	mflr r11
	addis r11,r11,ha16(L14$lz-L14$pb)
	mtlr r0
	lwz r12,lo16(L14$lz-L14$pb)(r11)
	mtctr r12
	addi r11,r11,lo16(L14$lz-L14$pb )
	bctr
.lazy_symbol_pointer
L14$lz:
	.indirect_symbol _NewPtr
	.long dyld_stub_binding_helper