diff options
Diffstat (limited to 'macho/pstartup.a')
-rw-r--r-- | macho/pstartup.a | 6116 |
1 files changed, 6116 insertions, 0 deletions
diff --git a/macho/pstartup.a b/macho/pstartup.a new file mode 100644 index 0000000..8b44279 --- /dev/null +++ b/macho/pstartup.a @@ -0,0 +1,6116 @@ +# comment +# comment File: pstartup.a +# comment Author: John van Groningen +# comment Machine: power macintosh + +LINUX = 0 +# comment 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 + +# comment &vector 0,&bit_n 1,&byte_offset 2,&bit 3,&byte 4,&scratch 5,&shift 6 +# comment rlwinm &byte_offset,&bit_n,32-&shift-3,3+&shift,31 +# comment lbzx &byte,&vector,&byte_offset +# comment rlwinm &scratch,&bit_n,(32-&shift) & 31,29,31 +# comment srw &bit,g3,&scratch +# comment or &byte,&byte,&bit +# comment 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 + +# comment &vector 0,&bit_n 1,&byte_offset 2,&bit 3,&byte 4,&bit_n_in_byte 5,&shift 6 +# comment rlwinm &byte_offset,&bit_n,32-&shift-3,3+&shift,31 +# comment lbzx &byte,&vector,&byte_offset +# comment rlwinm &bit_n_in_byte,&bit_n,32-&shift,29,31 +# comment rlwnm. &bit,&byte,&bit_n_in_byte,24,24 +# comment .endmacro + + .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 + +# comment &vector 0,&bit_n 1,&byte_offset 2,&bit 3,&byte 4,&scratch 5,&shift 6 +# comment rlwinm &byte_offset,&bit_n,32-&shift-3,3+&shift,31 +# comment lbzx &byte,&vector,&byte_offset +# comment rlwinm &scratch,&bit_n,32-&shift,29,31 +# comment srw &bit,g3,&scratch +# comment andc &byte,&byte,&bit +# comment stbx &byte,&vector,&byte_offset +# comment .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 +# comment PROFILE = 0 +UNBOXED_CLOSURES = 1 + +MODULE_NAMES_IN_TIME_PROFILER = 1 + +EXCEPTIONS = 0 + +MINIMUM_HEAP_SIZE = 8000 + + .if 1 +DESCRIPTOR_ARITY_OFFSET = (-2) +ZERO_ARITY_DESCRIPTOR_OFFSET = (-8) + .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 +# comment 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 + +# comment -1: compact or mark, no extra heap +# comment 0: copy, no extra heap +# comment 1: compact, extra heap +# comment 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 __indirection,__eaind,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 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 + + +# comment 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 + +# comment from cgcon.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 + +# comment 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 + +_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 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) + + stwu sp,-64(sp) + bl L_NewPtr$stub + addi sp,sp,64 + + 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,INT+2 +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,CHAR+2 +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 + 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 + +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 + .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 + +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) + addi a2,d0,-2 + + cmplwi 0,d1,256 + bge print_record + + slwi d1,d1,3 + sub a2,a2,d1 + + .if 1 + lhz d1,DESCRIPTOR_ARITY_OFFSET(a2) + addi a2,a2,4 + slwi d1,d1,3 + add a2,a2,d1 + b print_string_a2 + .endif + +print_record: + lwz a2,-4(a2) + b print_string_a2 + +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 + +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 + .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 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 + .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 + +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 + .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 +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 +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 +eprintD: andi. r0,d0,2 + bne eprintD_ + + mr a2,d0 + b eprint_string_a2 + +eprintD_: lha d1,-2(d0) + 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 + b eprint_string_a2 + +eprint_record: + lwz a2,-4(a2) + +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 + +DtoAC: lha d1,-2(d0) + addi a0,d0,-2 + + cmplwi 0,d1,256 + bge DtoAC_record + + slwi d1,d1,3 + bsub a0,d1 + .if 1 + 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: + lwz a0,-4(a0) + b DtoAC_a0 + + .text +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 + + .text +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 +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 +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 + + li o1,10 + divwu o0,d0,o1 + + mullw a1,o0,o1 + sub a1,d0,a1 + addi a1,a1,48 + + stb a1,0(a2) + addi a2,a2,1 + + mr d0,o0 + 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 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 +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 + +# comment +# comment the timer +# comment + +_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 + +# comment +# comment the garbage collector +# comment + + .text +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 +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 +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 +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 +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 +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 +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 +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 +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 + +# comment 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 +# comment 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 +# comment 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: +# comment 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 +# comment 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 + .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 +# comment d0 = n words +# comment a2 = address +# comment 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 + +# comment +# comment the sliding compacting garbage collector +# comment + + .text +compacting_collector: + +# comment 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 +# comment 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 +# comment srwi d0,d0,8 + rlwimi d0,o0,32-8,0,7 +# comment 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 +# comment 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: + 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: + 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 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 + 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 +eval_01: + stw a1,0(a4) + addi a4,a4,4 + bctr + + .text +eval_11: + stw a0,0(a4) + mr a0,a1 + addi a4,a4,4 + bctr + + .text +eval_02: + stw a2,0(a4) + addi a4,a4,8 + stw a1,4-8(a4) + bctr + + .text +eval_12: + stw a0,4(a4) + mr a0,a1 + stw a2,0(a4) + addi a4,a4,8 + bctr + + .text +eval_22: + stw a0,4(a4) + mr a0,a2 + stw a1,0(a4) + addi a4,a4,8 + bctr + +__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 | MACOSX + nop + nop + .endif + .long 0 + .long -2 +__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 + .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 + .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 + .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 + .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 + .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 + .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 + .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 + .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 + +# comment +# comment STRINGS +# comment + .text +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 +# comment reserve one word extra, because +# comment 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) + +# comment 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: + +# comment 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 + +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 + + .text +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 + + .text +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 + + .text +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 +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 +_c3: b __cycle__in__spine + .long 4 +_c4: b __cycle__in__spine + .long 5 +_c5: b __cycle__in__spine + .long 6 +_c6: b __cycle__in__spine + .long 7 +_c7: b __cycle__in__spine + .long 8 +_c8: b __cycle__in__spine + .long 9 +_c9: b __cycle__in__spine + .long 10 +_c10: b __cycle__in__spine + .long 11 +_c11: b __cycle__in__spine + .long 12 +_c12: b __cycle__in__spine + .long 13 +_c13: b __cycle__in__spine + .long 14 +_c14: b __cycle__in__spine + .long 15 +_c15: b __cycle__in__spine + .long 16 +_c16: b __cycle__in__spine + .long 17 +_c17: b __cycle__in__spine + .long 18 +_c18: b __cycle__in__spine + .long 19 +_c19: b __cycle__in__spine + .long 20 +_c20: b __cycle__in__spine + .long 21 +_c21: b __cycle__in__spine + .long 22 +_c22: b __cycle__in__spine + .long 23 +_c23: b __cycle__in__spine + .long 24 +_c24: b __cycle__in__spine + .long 25 +_c25: b __cycle__in__spine + .long 26 +_c26: b __cycle__in__spine + .long 27 +_c27: b __cycle__in__spine + .long 28 +_c28: b __cycle__in__spine + .long 29 +_c29: b __cycle__in__spine + .long 30 +_c30: b __cycle__in__spine + .long 31 +_c31: b __cycle__in__spine + .long 32 +_c32: b __cycle__in__spine + +# comment +# comment ARRAYS +# comment + + .text +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 +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 +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 +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 + + .text +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 + + .text +e__system__sAP: + lwz a2,0(a1) + lwz a2,4-2(a2) + mtctr a2 + bctr + +# comment _ARRAYS + + .text +_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 +_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 +_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 +_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 + +# comment d0: number of elements, d1: element descriptor, d2: element size, +# comment d3: element a size a0: a_element -> a0: array + + .text +_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 + + .text +yet_args_needed: +# comment 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 +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 +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 +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 +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 +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 + + .text +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 + + .text +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 + + .text +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 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 + + .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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 + +.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 + +
\ No newline at end of file |