;
; 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}