@ @ File: thumb2startup.s @ Author: John van Groningen, adapted for Thumb-2 by Camil Staps @ Machine: ARM .include "thumb2regs.s" .fpu vfp3 .thumb .syntax unified .include "armmacros.s" USE_CLIB = 1 SHARE_CHAR_INT = 1 MY_ITOS = 1 FINALIZERS = 1 STACK_OVERFLOW_EXCEPTION_HANDLER = 0 WRITE_HEAP = 0 @ DEBUG = 0 PREFETCH2 = 0 NO_BIT_INSTRUCTIONS = 1 ADJUST_HEAP_SIZE = 1 MARK_GC = 1 MARK_AND_COPY_GC = 1 NEW_DESCRIPTORS = 1 @ #define PROFILE MODULE_NAMES_IN_TIME_PROFILER = 1 COMPACT_GC_ONLY = 0 MINIMUM_HEAP_SIZE = 8000 MINIMUM_HEAP_SIZE_2 = 4000 .ifdef LINUX # define section(n) .section .text.n,"ax" .else # define section(n) .text .endif DESCRIPTOR_ARITY_OFFSET = (-2) ZERO_ARITY_DESCRIPTOR_OFFSET = (-4) .hidden semi_space_size .comm semi_space_size,4 .hidden heap_mbp .comm heap_mbp,4 .hidden stack_mbp .comm stack_mbp,4 .hidden heap_p .comm heap_p,4 .hidden heap_p1 .comm heap_p1,4 .hidden heap_p2 .comm heap_p2,4 .hidden heap_p3 .comm heap_p3,4 .hidden end_heap_p3 .comm end_heap_p3,4 .hidden heap_size_33 .comm heap_size_33,4 .hidden vector_p .comm vector_p,4 .hidden vector_counter .comm vector_counter,4 .hidden neg_heap_vector_plus_4 .comm neg_heap_vector_plus_4,4 .hidden heap_size_32_33 .comm heap_size_32_33,4 .hidden heap_vector .comm heap_vector,4 .hidden stack_top .comm stack_top,4 .hidden end_vector .comm end_vector,4 .hidden heap_size_129 .comm heap_size_129,4 .hidden heap_copied_vector .comm heap_copied_vector,4 .hidden heap_copied_vector_size .comm heap_copied_vector_size,4 .hidden heap_end_after_copy_gc .comm heap_end_after_copy_gc,4 .hidden heap_end_after_gc .comm heap_end_after_gc,4 .hidden extra_heap .comm extra_heap,4 .hidden extra_heap_size .comm extra_heap_size,4 .hidden stack_p .comm stack_p,4 .hidden halt_sp .comm halt_sp,4 .hidden n_allocated_words .comm n_allocated_words,4 .hidden basic_only .comm basic_only,4 .hidden last_time .comm last_time,4 .hidden execute_time .comm execute_time,4 .hidden garbage_collect_time .comm garbage_collect_time,4 .hidden IO_time .comm IO_time,4 .globl saved_heap_p .hidden saved_heap_p .comm saved_heap_p,8 .globl saved_a_stack_p .hidden saved_a_stack_p .comm saved_a_stack_p,4 .globl end_a_stack .hidden end_a_stack .comm end_a_stack,4 .globl end_b_stack .hidden end_b_stack .comm end_b_stack,4 .hidden dll_initisialised .comm dll_initisialised,4 .if WRITE_HEAP .comm heap_end_write_heap,4 .comm d3_flag_write_heap,4 .comm heap2_begin_and_end,8 .endif .if STACK_OVERFLOW_EXCEPTION_HANDLER .comm a_stack_guard_page,4 .endif .globl profile_stack_pointer .hidden profile_stack_pointer .comm profile_stack_pointer,4 .data .p2align 2 .if MARK_GC bit_counter: .long 0 bit_vector_p: .long 0 zero_bits_before_mark: .long 1 n_free_words_after_mark: .long 1000 n_last_heap_free_bytes: .long 0 lazy_array_list: .long 0 n_marked_words: .long 0 end_stack: .long 0 .if ADJUST_HEAP_SIZE bit_vector_size: .long 0 .endif .endif caf_list: .long 0 .globl caf_listp .hidden caf_listp caf_listp: .long 0 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 garbage_collect_flag: .byte 0 .byte 0,0,0 .hidden sprintf_buffer .comm sprintf_buffer,32 out_of_memory_string_1: .ascii "Not enough memory to allocate heap and stack" .byte 10,0 printf_int_string: .ascii "%d" .byte 0 printf_real_string: .ascii "%.15g" .byte 0 printf_string_string: .ascii "%s" .byte 0 printf_char_string: .ascii "%c" .byte 0 garbage_collect_string_1: .asciz "A stack: " garbage_collect_string_2: .asciz " bytes. BC stack: " garbage_collect_string_3: .ascii " bytes." .byte 10,0 heap_use_after_gc_string_1: .ascii "Heap use after garbage collection: " .byte 0 heap_use_after_gc_string_2: .ascii " Bytes." .byte 10,0 stack_overflow_string: .ascii "Stack overflow." .byte 10,0 out_of_memory_string_4: .ascii "Heap full." .byte 10,0 time_string_1: .ascii "Execution: " .byte 0 time_string_2: .ascii " Garbage collection: " .byte 0 time_string_4: .ascii " Total: " .byte 0 high_index_string: .ascii "Index too high in UPDATE string." .byte 10,0 low_index_string: .ascii "Index negative in UPDATE string." .byte 10,0 IO_error_string: .ascii "IO error: " .byte 0 new_line_string: .byte 10,0 sprintf_time_string: .ascii "%d.%02d" .byte 0 .if MARK_GC marked_gc_string_1: .ascii "Marked: " .byte 0 .endif .ifdef PROFILE .p2align 2 .if MODULE_NAMES_IN_TIME_PROFILER .ifdef LINUX .globl m_system .endif m_system: .long 6 .ascii "System" .byte 0 .byte 0 .long m_system .endif garbage_collector_name: .long 0 .asciz "garbage_collector" .p2align 2 .endif .ifdef DLL start_address: .long 0 .endif .p2align 2 .hidden sprintf_time_buffer .comm sprintf_time_buffer,20 .p2align 2 .if SHARE_CHAR_INT .globl small_integers .hidden small_integers .comm small_integers,33*8 .globl static_characters .hidden static_characters .comm static_characters,256*8 .endif .ifdef SHARED_LIBRARY .section .init_array .long clean_init .section .fini_array .long clean_fini .endif .text .globl abc_main .globl print .globl print_char .globl print_int .globl print_real .globl print__string__ .globl print__chars__sc .globl print_sc .globl print_symbol .globl print_symbol_sc .globl printD .globl DtoAC .globl push_t_r_args .globl push_a_r_args .globl halt .globl dump .globl catAC .globl sliceAC .globl updateAC .globl eqAC .globl cmpAC .globl string_to_string_node .globl int_array_to_node .globl real_array_to_node .globl _create_arrayB .globl _create_arrayC .globl _create_arrayI .globl _create_arrayR .globl _create_r_array .globl create_array .globl create_arrayB .globl create_arrayC .globl create_arrayI .globl create_arrayR .globl create_R_array .globl BtoAC .globl ItoAC .globl RtoAC .globl eqD .globl collect_0 .globl collect_1 .globl collect_2 .globl collect_3 .globl _c3,_c4,_c5,_c6,_c7,_c8,_c9,_c10,_c11,_c12 .hidden _c3,_c4,_c5,_c6,_c7,_c8,_c9,_c10,_c11,_c12 .globl _c13,_c14,_c15,_c16,_c17,_c18,_c19,_c20,_c21,_c22 .hidden _c13,_c14,_c15,_c16,_c17,_c18,_c19,_c20,_c21,_c22 .globl _c23,_c24,_c25,_c26,_c27,_c28,_c29,_c30,_c31,_c32 .hidden _c23,_c24,_c25,_c26,_c27,_c28,_c29,_c30,_c31,_c32 .globl e__system__eaind .hidden e__system__eaind .globl e__system__nind .hidden e__system__nind @ old name of the previous label for compatibility, remove later .globl __indirection .hidden __indirection .globl e__system__dind .hidden e__system__dind .globl eval_fill .globl eval_upd_0,eval_upd_1,eval_upd_2,eval_upd_3,eval_upd_4 .globl eval_upd_5,eval_upd_6,eval_upd_7,eval_upd_8,eval_upd_9 .globl eval_upd_10,eval_upd_11,eval_upd_12,eval_upd_13,eval_upd_14 .globl eval_upd_15,eval_upd_16,eval_upd_17,eval_upd_18,eval_upd_19 .globl eval_upd_20,eval_upd_21,eval_upd_22,eval_upd_23,eval_upd_24 .globl eval_upd_25,eval_upd_26,eval_upd_27,eval_upd_28,eval_upd_29 .globl eval_upd_30,eval_upd_31,eval_upd_32 .globl repl_args_b .globl push_arg_b .globl del_args .globl add_IO_time .globl add_execute_time .globl IO_error .globl stack_overflow .globl out_of_memory_4 .globl print_error .ifndef DLL .global _start .endif .globl sin_real .globl cos_real .globl tan_real .globl asin_real .globl acos_real .globl atan_real .globl ln_real .globl log10_real .globl exp_real .globl pow_real .globl r_to_i_real .globl entier_real .ifdef PROFILE .globl init_profiler .globl profile_s,profile_n,profile_r,profile_t .globl write_profile_information,write_profile_stack .endif .globl __driver @ from system.abc: .globl INT .globl CHAR .globl BOOL .globl REAL .globl FILE .globl __STRING__ .globl __ARRAY__ .globl __cycle__in__spine .globl __print__graph .globl __eval__to__nf @ from wcon.c: .globl w_print_char .globl w_print_string .globl w_print_text .globl w_print_int .globl w_print_real .globl ew_print_char .globl ew_print_text .globl ew_print_string .globl ew_print_int .globl ab_stack_size .globl heap_size .globl flags @ from standard c library: .globl malloc .globl free .globl sprintf .globl strlen .if STACK_OVERFLOW_EXCEPTION_HANDLER .globl allocate_memory_with_guard_page_at_end .endif .if ADJUST_HEAP_SIZE .global heap_size_multiple .global initial_heap_size .endif .if WRITE_HEAP .global min_write_heap_size .endif .if FINALIZERS .global __Nil .globl finalizer_list .hidden finalizer_list .comm finalizer_list,4 .globl free_finalizer_list .hidden free_finalizer_list .comm free_finalizer_list,4 .endif .thumb_func abc_main: str lr,[BSTACK_PTR,#-4]! stmdb BSTACK_PTR!,{r0-r12} .ifdef DLL ldr BSTACK_0,[BSTACK_PTR,#28] lao SCRATCH_REG,start_address,0 sto BSTACK_0,SCRATCH_REG,start_address,0 .endif .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl init_clean tst BSTACK_0,BSTACK_0 bne init_error .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl init_timer lao SCRATCH_REG,halt_sp,0 sto BSTACK_PTR,SCRATCH_REG,halt_sp,0 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl init_profiler .endif .ifdef DLL lao SCRATCH_REG,start_address,1 ldo BSTACK_0,SCRATCH_REG,start_address,1 .align add lr,pc,#7 str lr,[BSTACK_PTR,#-4]! blx BSTACK_0 .else .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl __start .endif .thumb_func exit: .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl exit_clean .thumb_func init_error: ldmia BSTACK_PTR!,{r0-r12,pc} .globl clean_init .thumb_func clean_init: stmdb BSTACK_PTR!,{r0-r12,lr} lao SCRATCH_REG,dll_initisialised,0 mov r0,#1 sto r0,SCRATCH_REG,dll_initisialised,0 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl init_clean tst BSTACK_0,BSTACK_0 bne init_dll_error .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl init_timer lao SCRATCH_REG,halt_sp,1 sto BSTACK_PTR,SCRATCH_REG,halt_sp,1 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl init_profiler .endif lao SCRATCH_REG,saved_heap_p,0 otoa SCRATCH_REG,saved_heap_p,0 str HEAP_PTR,[SCRATCH_REG] str HEAP_FREE,[SCRATCH_REG,#4] lao SCRATCH_REG,saved_a_stack_p,0 sto ASTACK_PTR,SCRATCH_REG,saved_a_stack_p,0 mov BSTACK_0,#1 b exit_dll_init .thumb_func init_dll_error: mov BSTACK_0,#0 b exit_dll_init .globl clean_fini .thumb_func clean_fini: stmdb BSTACK_PTR!,{r0-r12,lr} lao SCRATCH_REG,saved_heap_p,1 otoa SCRATCH_REG,saved_heap_p,1 ldr HEAP_PTR,[SCRATCH_REG] ldr HEAP_FREE,[SCRATCH_REG,#4] lao SCRATCH_REG,saved_a_stack_p,1 ldo ASTACK_PTR,SCRATCH_REG,saved_a_stack_p,1 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl exit_clean .thumb_func exit_dll_init: ldmia BSTACK_PTR!,{r0-r12,pc} .thumb_func init_clean: add BSTACK_0,BSTACK_PTR,#128 lao SCRATCH_REG,ab_stack_size,0 ldo SCRATCH_REG,SCRATCH_REG,ab_stack_size,0 sub BSTACK_0,BSTACK_0,SCRATCH_REG lao SCRATCH_REG,end_b_stack,0 sto BSTACK_0,SCRATCH_REG,end_b_stack,0 lao SCRATCH_REG,flags,0 ldo BSTACK_0,SCRATCH_REG,flags,0 and BSTACK_0,BSTACK_0,#1 lao SCRATCH_REG,basic_only,0 sto BSTACK_0,SCRATCH_REG,basic_only,0 lao SCRATCH_REG,heap_size,0 ldo BSTACK_0,SCRATCH_REG,heap_size,0 .if PREFETCH2 subs BSTACK_0,BSTACK_0,#63 .else subs BSTACK_0,BSTACK_0,#3 .endif @ divide by 33 ldr SCRATCH_REG,=1041204193 umull ASTACK_3,BSTACK_0,SCRATCH_REG,BSTACK_0 lsr BSTACK_0,BSTACK_0,#3 lao SCRATCH_REG,heap_size_33,0 sto BSTACK_0,SCRATCH_REG,heap_size_33,0 lao SCRATCH_REG,heap_size,1 ldo BSTACK_0,SCRATCH_REG,heap_size,1 subs BSTACK_0,BSTACK_0,#3 @ divide by 129 ldr SCRATCH_REG,=266354561 umull ASTACK_3,BSTACK_0,SCRATCH_REG,BSTACK_0 lsr BSTACK_0,BSTACK_0,#3 lao SCRATCH_REG,heap_size_129,0 sto BSTACK_0,SCRATCH_REG,heap_size_129,0 add BSTACK_0,BSTACK_0,#3 and BSTACK_0,BSTACK_0,#-4 lao SCRATCH_REG,heap_copied_vector_size,0 sto BSTACK_0,SCRATCH_REG,heap_copied_vector_size,0 lao SCRATCH_REG,heap_end_after_copy_gc,0 mov ASTACK_3,#0 sto ASTACK_3,SCRATCH_REG,heap_end_after_copy_gc,0 lao SCRATCH_REG,heap_size,2 ldo BSTACK_0,SCRATCH_REG,heap_size,2 add BSTACK_0,BSTACK_0,#7 and BSTACK_0,BSTACK_0,#-8 .ifdef PIC lao SCRATCH_REG,heap_size,3 .endif sto BSTACK_0,SCRATCH_REG,heap_size,3 add BSTACK_0,BSTACK_0,#7 store_global_registers mov r0,BSTACK_0 bl malloc load_global_registers movs BSTACK_0,r0 beq no_memory_2 lao SCRATCH_REG,heap_mbp,0 sto BSTACK_0,SCRATCH_REG,heap_mbp,0 add HEAP_PTR,BSTACK_0,#3 and HEAP_PTR,HEAP_PTR,#-4 lao SCRATCH_REG,heap_p,0 sto HEAP_PTR,SCRATCH_REG,heap_p,0 lao ASTACK_2,ab_stack_size,1 ldo ASTACK_2,ASTACK_2,ab_stack_size,1 add ASTACK_2,ASTACK_2,#3 store_global_registers mov r0,ASTACK_2 .if STACK_OVERFLOW_EXCEPTION_HANDLER bl allocate_memory_with_guard_page_at_end .else bl malloc .endif load_global_registers movs BSTACK_0,r0 beq no_memory_3 lao SCRATCH_REG,stack_mbp,0 sto BSTACK_0,SCRATCH_REG,stack_mbp,0 .if STACK_OVERFLOW_EXCEPTION_HANDLER lao SCRATCH_REG,ab_stack_size,2 ldo SCRATCH_REG,SCRATCH_REG,ab_stack_size,2 add BSTACK_0,BSTACK_0,SCRATCH_REG lao SCRATCH_REG,a_stack_guard_page,0 add BSTACK_0,BSTACK_0,#4096 add BSTACK_0,BSTACK_0,#(3+4095)-4096 bic BSTACK_0,BSTACK_0,#255 bic BSTACK_0,BSTACK_0,#4095-255 sto BSTACK_0,SCRATCH_REG,a_stack_guard_page,0 lao SCRATCH_REG,ab_stack_size,3 ldo SCRATCH_REG,SCRATCH_REG,ab_stack_size,3 sub BSTACK_0,BSTACK_0,SCRATCH_REG .endif add BSTACK_0,BSTACK_0,#3 and BSTACK_0,BSTACK_0,#-4 mov ASTACK_PTR,BSTACK_0 lao SCRATCH_REG,stack_p,0 sto BSTACK_0,SCRATCH_REG,stack_p,0 lao SCRATCH_REG,ab_stack_size,4 ldo SCRATCH_REG,SCRATCH_REG,ab_stack_size,4 add BSTACK_0,BSTACK_0,SCRATCH_REG subs BSTACK_0,BSTACK_0,#64 lao SCRATCH_REG,end_a_stack,0 sto BSTACK_0,SCRATCH_REG,end_a_stack,0 .if SHARE_CHAR_INT lao ASTACK_0,small_integers,0 otoa ASTACK_0,small_integers,0 mov BSTACK_0,#0 laol BSTACK_1,INT+2,INT_o_2,0 otoa BSTACK_1,INT_o_2,0 .thumb_func make_small_integers_lp: str BSTACK_1,[ASTACK_0] str BSTACK_0,[ASTACK_0,#4] add BSTACK_0,BSTACK_0,#1 add ASTACK_0,ASTACK_0,#8 cmp BSTACK_0,#33 bne make_small_integers_lp lao ASTACK_0,static_characters,0 otoa ASTACK_0,static_characters,0 mov BSTACK_0,#0 laol BSTACK_1,CHAR+2,CHAR_O_2,0 otoa BSTACK_1,CHAR_O_2,0 .thumb_func make_static_characters_lp: str BSTACK_1,[ASTACK_0] str BSTACK_0,[ASTACK_0,#4] add BSTACK_0,BSTACK_0,#1 add ASTACK_0,ASTACK_0,#8 cmp BSTACK_0,#256 bne make_static_characters_lp .endif laol ASTACK_0,caf_list+4,caf_list_o_4,0 otoa ASTACK_0,caf_list_o_4,0 lao SCRATCH_REG,caf_listp,0 sto ASTACK_0,SCRATCH_REG,caf_listp,0 .if FINALIZERS lao SCRATCH_REG,finalizer_list,0 laol ASTACK_3,__Nil-4,__Nil_o_m4,0 otoa ASTACK_3,__Nil_o_m4,0 sto ASTACK_3,SCRATCH_REG,finalizer_list,0 lao SCRATCH_REG,free_finalizer_list,0 sto ASTACK_3,SCRATCH_REG,free_finalizer_list,0 .endif lao SCRATCH_REG,heap_p1,0 sto HEAP_PTR,SCRATCH_REG,heap_p1,0 lao SCRATCH_REG,heap_size_129,1 ldo ASTACK_2,SCRATCH_REG,heap_size_129,1 lsl ASTACK_2,ASTACK_2,#4 add BSTACK_0,HEAP_PTR,ASTACK_2,lsl #2 lao SCRATCH_REG,heap_copied_vector,0 sto BSTACK_0,SCRATCH_REG,heap_copied_vector,0 lao SCRATCH_REG,heap_copied_vector_size,1 ldo SCRATCH_REG,SCRATCH_REG,heap_copied_vector_size,1 add BSTACK_0,SCRATCH_REG lao SCRATCH_REG,heap_p2,0 sto BSTACK_0,SCRATCH_REG,heap_p2,0 lao SCRATCH_REG,garbage_collect_flag,0 mov ASTACK_3,#0 stob ASTACK_3,SCRATCH_REG,garbage_collect_flag,0 .if MARK_AND_COPY_GC lao SCRATCH_REG,flags,1 ldo SCRATCH_REG,SCRATCH_REG,flags,1 tst SCRATCH_REG,#64 beq no_mark1 .endif .if MARK_GC || COMPACT_GC_ONLY lao SCRATCH_REG,heap_size_33,1 ldo BSTACK_0,SCRATCH_REG,heap_size_33,1 lao SCRATCH_REG,heap_vector,0 sto HEAP_PTR,SCRATCH_REG,heap_vector,0 add HEAP_PTR,HEAP_PTR,BSTACK_0 .if PREFETCH2 add HEAP_PTR,HEAP_PTR,#63 and HEAP_PTR,HEAP_PTR,#-64 .else add HEAP_PTR,HEAP_PTR,#3 and HEAP_PTR,HEAP_PTR,#-4 .endif lao SCRATCH_REG,heap_p3,0 sto HEAP_PTR,SCRATCH_REG,heap_p3,0 lsl ASTACK_2,BSTACK_0,#3 lao SCRATCH_REG,garbage_collect_flag,1 mov ASTACK_3,#-1 stob ASTACK_3,SCRATCH_REG,garbage_collect_flag,1 .endif .if MARK_AND_COPY_GC no_mark1: .endif .if ADJUST_HEAP_SIZE lao BSTACK_0,initial_heap_size,0 ldo BSTACK_0,BSTACK_0,initial_heap_size,0 .if MARK_AND_COPY_GC mov BSTACK_1,#MINIMUM_HEAP_SIZE_2 lao SCRATCH_REG,flags,2 ldo SCRATCH_REG,SCRATCH_REG,flags,2 tst SCRATCH_REG,#64 bne no_mark9 add BSTACK_1,BSTACK_1,BSTACK_1 no_mark9: .else .if MARK_GC || COMPACT_GC_ONLY mov BSTACK_1,#MINIMUM_HEAP_SIZE .else mov BSTACK_1,#MINIMUM_HEAP_SIZE_2 .endif .endif cmp BSTACK_0,BSTACK_1 ble too_large_or_too_small lsr BSTACK_0,BSTACK_0,#2 cmp BSTACK_0,ASTACK_2 bge too_large_or_too_small mov ASTACK_2,BSTACK_0 .thumb_func too_large_or_too_small: .endif add BSTACK_0,HEAP_PTR,ASTACK_2,lsl #2 lao SCRATCH_REG,heap_end_after_gc,0 sto BSTACK_0,SCRATCH_REG,heap_end_after_gc,0 mov HEAP_FREE,ASTACK_2 .if MARK_AND_COPY_GC lao SCRATCH_REG,flags,3 ldo SCRATCH_REG,SCRATCH_REG,flags,3 tst SCRATCH_REG,#64 beq no_mark2 .endif .if MARK_GC && ADJUST_HEAP_SIZE lao SCRATCH_REG,bit_vector_size,0 sto ASTACK_2,SCRATCH_REG,bit_vector_size,0 .endif .if MARK_AND_COPY_GC no_mark2: .endif mov BSTACK_0,#0 ldr pc,[BSTACK_PTR],#4 no_memory_2: lao r0,out_of_memory_string_1,0 otoa r0,out_of_memory_string_1,0 store_global_registers bl ew_print_string load_global_registers .ifdef _WINDOWS_ ? movl $1,@execution_aborted .endif mov r0,#1 ldr pc,[BSTACK_PTR],#4 no_memory_3: lao r0,out_of_memory_string_1,1 otoa r0,out_of_memory_string_1,1 store_global_registers bl ew_print_string load_global_registers .ifdef _WINDOWS_ ? movl $1,@execution_aborted .endif lao r0,heap_mbp,1 ldo r0,r0,heap_mbp,1 bl free mov r0,#1 ldr pc,[BSTACK_PTR],#4 .thumb_func exit_clean: .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl add_execute_time lao BSTACK_0,flags,4 ldo BSTACK_0,BSTACK_0,flags,4 tst BSTACK_0,#8 beq no_print_execution_time lao r0,time_string_1,0 otoa r0,time_string_1,0 store_global_registers bl ew_print_string load_global_registers lao SCRATCH_REG,execute_time,0 ldo BSTACK_0,SCRATCH_REG,execute_time,0 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl print_time lao r0,time_string_2,0 otoa r0,time_string_2,0 store_global_registers bl ew_print_string load_global_registers lao SCRATCH_REG,garbage_collect_time,0 ldo BSTACK_0,SCRATCH_REG,garbage_collect_time,0 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl print_time lao r0,time_string_4,0 otoa r0,time_string_4,0 store_global_registers bl ew_print_string load_global_registers lao SCRATCH_REG,execute_time,1 ldo BSTACK_0,SCRATCH_REG,execute_time,1 lao SCRATCH_REG,garbage_collect_time,1 ldo SCRATCH_REG,SCRATCH_REG,garbage_collect_time,1 add BSTACK_0,SCRATCH_REG lao SCRATCH_REG,IO_time,0 ldo SCRATCH_REG,SCRATCH_REG,IO_time,0 add BSTACK_0,SCRATCH_REG .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl print_time mov r0,#10 bl ew_print_char .thumb_func no_print_execution_time: lao r0,stack_mbp,1 ldo r0,r0,stack_mbp,1 bl free lao r0,heap_mbp,2 ldo r0,r0,heap_mbp,2 bl free .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl write_profile_information .endif ldr pc,[BSTACK_PTR],#4 .thumb_func __driver: lao ASTACK_2,flags,5 ldo ASTACK_2,ASTACK_2,flags,5 tst ASTACK_2,#16 beq __print__graph b __eval__to__nf .ifdef PIC .ifdef DLL lto start_address,0 .endif lto halt_sp,0 .ifdef DLL lto start_address,1 .endif lto dll_initisialised,0 lto halt_sp,1 lto saved_heap_p,0 lto saved_a_stack_p,0 lto saved_heap_p,1 lto saved_a_stack_p,1 lto ab_stack_size,0 lto end_b_stack,0 lto flags,0 lto basic_only,0 lto heap_size,0 lto heap_size_33,0 lto heap_size,1 lto heap_size_129,0 lto heap_copied_vector_size,0 lto heap_end_after_copy_gc,0 lto heap_size,2 lto heap_size,3 lto heap_mbp,0 lto heap_p,0 lto ab_stack_size,1 lto stack_mbp,0 .if STACK_OVERFLOW_EXCEPTION_HANDLER lto ab_stack_size,2 lto a_stack_guard_page,0 lto ab_stack_size,3 .endif lto stack_p,0 lto ab_stack_size,4 lto end_a_stack,0 lto small_integers,0 ltol INT+2,INT_o_2,0 lto static_characters,0 ltol CHAR+2,CHAR_O_2,0 ltol caf_list+4,caf_list_o_4,0 lto caf_listp,0 .if FINALIZERS lto finalizer_list,0 ltol __Nil-4,__Nil_o_m4,0 lto free_finalizer_list,0 .endif lto heap_p1,0 lto heap_size_129,1 lto heap_copied_vector,0 lto heap_copied_vector_size,1 lto heap_p2,0 lto garbage_collect_flag,0 .if MARK_AND_COPY_GC lto flags,1 .endif .if MARK_GC || COMPACT_GC_ONLY lto heap_size_33,1 lto heap_vector,0 lto heap_p3,0 lto garbage_collect_flag,1 .endif .if ADJUST_HEAP_SIZE lto initial_heap_size,0 .if MARK_AND_COPY_GC lto flags,2 .endif .endif lto heap_end_after_gc,0 .if MARK_AND_COPY_GC lto flags,3 .endif .if MARK_GC && ADJUST_HEAP_SIZE lto bit_vector_size,0 .endif lto out_of_memory_string_1,0 lto out_of_memory_string_1,1 lto heap_mbp,1 lto flags,4 lto time_string_1,0 lto execute_time,0 lto time_string_2,0 lto garbage_collect_time,0 lto time_string_4,0 lto execute_time,1 lto garbage_collect_time,1 lto IO_time,0 lto stack_mbp,1 lto heap_mbp,2 lto flags,5 .endif .ltorg .thumb_func print_time: @ divide by 1000 ldr SCRATCH_REG,=274877907 umull ASTACK_3,ASTACK_0,SCRATCH_REG,BSTACK_0 lsr ASTACK_0,ASTACK_0,#6 mov ASTACK_3,#-1025 add ASTACK_3,ASTACK_3,#-1000-(-1025) mla BSTACK_0,ASTACK_0,ASTACK_3,BSTACK_0 @ divide by 10 ldr SCRATCH_REG,=-858993459 umull ASTACK_3,BSTACK_0,SCRATCH_REG,BSTACK_0 lsr BSTACK_0,BSTACK_0,#3 .if USE_CLIB store_global_registers mov r3,BSTACK_0 mov r2,ASTACK_0 lao r1,sprintf_time_string,0 lao r0,sprintf_time_buffer,0 otoa r1,sprintf_time_string,0 otoa r0,sprintf_time_buffer,0 bl sprintf lao r0,sprintf_time_buffer,1 otoa r0,sprintf_time_buffer,1 bl ew_print_string load_global_registers .else store_global_registers mov r0,ASTACK_0 bl ew_print_int load_global_registers lao ASTACK_0,sprintf_time_buffer,0 otoa ASTACK_0,sprintf_time_buffer,0 eor ASTACK_1,ASTACK_1,ASTACK_1 mov BSTACK_1,#10 mov SCRATCH_REG,#46 strb SCRATCH_REG,[ASTACK_0] @ divide by 10 ldr SCRATCH_REG,=-858993459 umull ASTACK_3,BSTACK_4,SCRATCH_REG,BSTACK_0 lsr BSTACK_4,BSTACK_4,#3 sub BSTACK_0,BSTACK_0,BSTACK_4,lsl #1 sub BSTACK_0,BSTACK_0,BSTACK_4,lsl #3 add BSTACK_0,BSTACK_0,#48 add ASTACK_1,ASTACK_1,#48 strb BSTACK_4,[ASTACK_0,#1] strb BSTACK_0,[ASTACK_0,#2] store_global_registers mov r1,#3 mov r0,ASTACK_0 bl ew_print_text load_global_registers .endif ldr pc,[BSTACK_PTR],#4 .thumb_func print_sc: lao SCRATCH_REG,basic_only,1 ldo ASTACK_2,SCRATCH_REG,basic_only,1 cmp ASTACK_2,#0 bne end_print .thumb_func print: store_global_registers mov r0,BSTACK_0 bl w_print_string load_global_registers .thumb_func end_print: ldr pc,[BSTACK_PTR],#4 .thumb_func dump: .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl print b halt printD: tst BSTACK_0,#2 bne printD_ mov ASTACK_2,BSTACK_0 b print_string_a2 DtoAC_record: ldr ASTACK_2,[BSTACK_0,#-6] @.ifdef PIC .if 0 add SCRATCH_REG,BSTACK_0,#-6 add ASTACK_2,ASTACK_2,SCRATCH_REG .endif b DtoAC_string_a2 DtoAC: tst BSTACK_0,#2 bne DtoAC_ mov ASTACK_2,BSTACK_0 b DtoAC_string_a2 DtoAC_: ldrh SCRATCH_REG,[BSTACK_0,#-2] cmp SCRATCH_REG,#256 bhs DtoAC_record ldrh BSTACK_1,[BSTACK_0] add SCRATCH_REG,BSTACK_0,#10 add ASTACK_2,SCRATCH_REG,BSTACK_1 DtoAC_string_a2: ldr BSTACK_0,[ASTACK_2] add ASTACK_0,ASTACK_2,#4 b build_string .thumb_func print_symbol: mov BSTACK_1,#0 b print_symbol_2 .thumb_func print_symbol_sc: lao SCRATCH_REG,basic_only,2 ldo BSTACK_1,SCRATCH_REG,basic_only,2 print_symbol_2: ldr BSTACK_0,[ASTACK_0] laol SCRATCH_REG,INT+2,INT_o_2,1 otoa SCRATCH_REG,INT_o_2,1 cmp BSTACK_0,SCRATCH_REG beq print_int_node laol SCRATCH_REG,CHAR+2,CHAR_o_2,0 otoa SCRATCH_REG,CHAR_o_2,0 cmp BSTACK_0,SCRATCH_REG beq print_char_denotation laol SCRATCH_REG,BOOL+2,BOOL_o_2,0 otoa SCRATCH_REG,BOOL_o_2,0 cmp BSTACK_0,SCRATCH_REG beq print_bool laol SCRATCH_REG,REAL+2,REAL_o_2,0 otoa SCRATCH_REG,REAL_o_2,0 cmp BSTACK_0,SCRATCH_REG beq print_real_node cmp BSTACK_1,#0 bne end_print_symbol printD_: ldrh SCRATCH_REG,[BSTACK_0,#-2] cmp SCRATCH_REG,#256 bhs print_record ldrh BSTACK_1,[BSTACK_0] add SCRATCH_REG,BSTACK_0,#10 add ASTACK_2,SCRATCH_REG,BSTACK_1 b print_string_a2 .thumb_func print_record: ldr ASTACK_2,[BSTACK_0,#-6] @.ifdef PIC .if 0 add SCRATCH_REG,BSTACK_0,#-6 add ASTACK_2,ASTACK_2,SCRATCH_REG .endif b print_string_a2 .thumb_func end_print_symbol: ldr pc,[BSTACK_PTR],#4 .thumb_func print_int_node: store_global_registers ldr r0,[ASTACK_0,#4] bl w_print_int load_global_registers ldr pc,[BSTACK_PTR],#4 .thumb_func print_int: store_global_registers mov r0,BSTACK_0 bl w_print_int load_global_registers ldr pc,[BSTACK_PTR],#4 .thumb_func print_char_denotation: tst BSTACK_1,BSTACK_1 bne print_char_node store_global_registers ldr SCRATCH_REG,[ASTACK_0,#4] str SCRATCH_REG,[BSTACK_PTR,#-4]! mov r0,#0x27 bl w_print_char ldr r0,[BSTACK_PTR],#4 bl w_print_char mov r0,#0x27 bl w_print_char load_global_registers ldr pc,[BSTACK_PTR],#4 .thumb_func print_char_node: store_global_registers ldr r0,[ASTACK_0,#4] bl w_print_char load_global_registers ldr pc,[BSTACK_PTR],#4 .thumb_func print_char: store_global_registers str BSTACK_0,[BSTACK_PTR,#-4]! bl w_print_char add BSTACK_PTR,BSTACK_PTR,#4 load_global_registers ldr pc,[BSTACK_PTR],#4 .thumb_func print_bool: ldsb ASTACK_0,[ASTACK_0,#4] tst ASTACK_0,ASTACK_0 beq print_false .thumb_func print_true: store_global_registers lao r0,true_c_string,0 otoa r0,true_c_string,0 bl w_print_string load_global_registers ldr pc,[BSTACK_PTR],#4 .thumb_func print_false: store_global_registers lao r0,false_c_string,0 otoa r0,false_c_string,0 bl w_print_string load_global_registers ldr pc,[BSTACK_PTR],#4 .thumb_func print_real: .ifdef SOFT_FP_CC vmov r0,BSTACK_3,d0 .endif b print_real_ .thumb_func print_real_node: .ifdef SOFT_FP_CC ldrd r0,BSTACK_3,[ASTACK_0,#4] .else vldr.f64 d0,[ASTACK_0,#4] .endif .thumb_func print_real_: store_global_registers push {r11} mov r11,BSTACK_PTR bic lr,r11,#7 mov BSTACK_PTR,lr bl w_print_real mov BSTACK_PTR,r11 pop {r11} load_global_registers ldr pc,[BSTACK_PTR],#4 print_string_a2: store_global_registers ldr r1,[ASTACK_2] add r0,ASTACK_2,#4 bl w_print_text load_global_registers ldr pc,[BSTACK_PTR],#4 .thumb_func print__chars__sc: lao SCRATCH_REG,basic_only,3 ldo ASTACK_2,SCRATCH_REG,basic_only,3 cmp ASTACK_2,#0 bne no_print_chars .thumb_func print__string__: store_global_registers ldr r1,[ASTACK_0,#4] add r0,ASTACK_0,#8 bl w_print_text load_global_registers .thumb_func no_print_chars: ldr pc,[BSTACK_PTR],#4 .thumb_func push_a_r_args: str HEAP_PTR,[BSTACK_PTR,#-4]! ldr ASTACK_1,[ASTACK_0,#8] subs ASTACK_1,ASTACK_1,#2 ldrh HEAP_PTR,[ASTACK_1] subs HEAP_PTR,HEAP_PTR,#256 ldrh BSTACK_1,[ASTACK_1,#2] add ASTACK_1,ASTACK_1,#4 str ASTACK_1,[BSTACK_PTR,#-4]! mov ASTACK_1,HEAP_PTR subs ASTACK_1,ASTACK_1,BSTACK_1 lsl BSTACK_0,BSTACK_0,#2 add SCRATCH_REG,ASTACK_0,#12 add ASTACK_0,SCRATCH_REG,BSTACK_1,lsl #2 subs HEAP_PTR,HEAP_PTR,#1 .thumb_func mul_array_size_lp: add ASTACK_0,ASTACK_0,BSTACK_0 subs HEAP_PTR,HEAP_PTR,#1 bcs mul_array_size_lp add HEAP_PTR,ASTACK_0,ASTACK_1,lsl #2 b push_a_elements .thumb_func push_a_elements_lp: ldr BSTACK_0,[ASTACK_0,#-4]! str BSTACK_0,[ASTACK_PTR],#4 .thumb_func push_a_elements: subs BSTACK_1,BSTACK_1,#1 bcs push_a_elements_lp mov ASTACK_0,HEAP_PTR ldr BSTACK_0,[BSTACK_PTR],#4 ldr HEAP_PTR,[BSTACK_PTR],#4 ldr ASTACK_2,[BSTACK_PTR],#4 b push_b_elements .thumb_func push_b_elements_lp: ldr SCRATCH_REG,[ASTACK_0,#-4]! str SCRATCH_REG,[BSTACK_PTR,#-4]! .thumb_func push_b_elements: subs ASTACK_1,ASTACK_1,#1 bcs push_b_elements_lp mov pc,ASTACK_2 .thumb_func push_t_r_args: ldr ASTACK_2,[BSTACK_PTR],#4 ldr ASTACK_1,[ASTACK_0] add ASTACK_0,ASTACK_0,#4 subs ASTACK_1,ASTACK_1,#2 ldrh BSTACK_0,[ASTACK_1] subs BSTACK_0,BSTACK_0,#256 ldrh BSTACK_1,[ASTACK_1,#2] add ASTACK_1,ASTACK_1,#4 str ASTACK_1,[ASTACK_PTR] str BSTACK_1,[ASTACK_PTR,#4] sub BSTACK_1,BSTACK_0,BSTACK_1 add ASTACK_1,ASTACK_0,BSTACK_0,lsl #2 cmp BSTACK_0,#2 bls small_record ldr ASTACK_1,[ASTACK_0,#4] add SCRATCH_REG,ASTACK_1,#-4 add ASTACK_1,SCRATCH_REG,BSTACK_0,lsl #2 .thumb_func small_record: b push_r_b_elements .thumb_func push_r_b_elements_lp: subs BSTACK_0,BSTACK_0,#1 bne not_first_arg_b ldr SCRATCH_REG,[ASTACK_0] str SCRATCH_REG,[BSTACK_PTR,#-4]! b push_r_b_elements .thumb_func not_first_arg_b: ldr SCRATCH_REG,[ASTACK_1,#-4]! str SCRATCH_REG,[BSTACK_PTR,#-4]! .thumb_func push_r_b_elements: subs BSTACK_1,BSTACK_1,#1 bcs push_r_b_elements_lp ldr BSTACK_1,[ASTACK_PTR,#4] str ASTACK_2,[BSTACK_PTR,#-4]! ldr SCRATCH_REG,[ASTACK_PTR] str SCRATCH_REG,[BSTACK_PTR,#-4]! b push_r_a_elements .thumb_func push_r_a_elements_lp: subs BSTACK_0,BSTACK_0,#1 bne not_first_arg_a ldr ASTACK_2,[ASTACK_0] str ASTACK_2,[ASTACK_PTR],#4 b push_r_a_elements .thumb_func not_first_arg_a: ldr ASTACK_2,[ASTACK_1,#-4]! str ASTACK_2,[ASTACK_PTR],#4 .thumb_func push_r_a_elements: subs BSTACK_1,BSTACK_1,#1 bcs push_r_a_elements_lp ldr BSTACK_0,[BSTACK_PTR],#4 ldr pc,[BSTACK_PTR],#4 BtoAC: tst BSTACK_0,BSTACK_0 beq BtoAC_false BtoAC_true: lao ASTACK_0,true_string,0 otoa ASTACK_0,true_string,0 ldr pc,[BSTACK_PTR],#4 BtoAC_false: lao ASTACK_0,false_string,0 otoa ASTACK_0,false_string,0 ldr pc,[BSTACK_PTR],#4 RtoAC: .if USE_CLIB vmov r2,BSTACK_1,d0 lao r1,printf_real_string,0 lao r0,sprintf_buffer,0 otoa r1,printf_real_string,0 otoa r0,sprintf_buffer,0 mov BSTACK_0,BSTACK_PTR mov lr,BSTACK_PTR and lr,lr,#-8 mov BSTACK_PTR,lr bl sprintf mov BSTACK_PTR,BSTACK_0 .else lao r0,sprintf_buffer,1 otoa r0,sprintf_buffer,1 bl convert_real_to_string .endif b return_sprintf_buffer ItoAC: .if MY_ITOS lao ASTACK_0,sprintf_buffer,2 otoa ASTACK_0,sprintf_buffer,2 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl int_to_string lao SCRATCH_REG,sprintf_buffer,3 otoa SCRATCH_REG,sprintf_buffer,3 sub BSTACK_0,ASTACK_0,SCRATCH_REG b sprintf_buffer_to_string .thumb_func int_to_string: tst BSTACK_0,BSTACK_0 bpl no_minus mov SCRATCH_REG,#45 strb SCRATCH_REG,[ASTACK_0],#1 neg BSTACK_0,BSTACK_0 .thumb_func no_minus: add ASTACK_2,ASTACK_0,#12 beq zero_digit ldr BSTACK_2,=0xcccccccd .thumb_func calculate_digits: cmp BSTACK_0,#10 blo last_digit umull SCRATCH_REG,ASTACK_1,BSTACK_2,BSTACK_0 add BSTACK_1,BSTACK_0,#48 lsr BSTACK_0,ASTACK_1,#3 and ASTACK_1,ASTACK_1,#-8 sub BSTACK_1,BSTACK_1,ASTACK_1 sub BSTACK_1,BSTACK_1,ASTACK_1,lsr #2 strb BSTACK_1,[ASTACK_2],#1 b calculate_digits .thumb_func last_digit: tst BSTACK_0,BSTACK_0 beq no_zero .thumb_func zero_digit: add BSTACK_0,BSTACK_0,#48 strb BSTACK_0,[ASTACK_2],#1 .thumb_func no_zero: add ASTACK_1,ASTACK_0,#12 .thumb_func reverse_digits: ldrb BSTACK_1,[ASTACK_2,#-1]! strb BSTACK_1,[ASTACK_0],#1 cmp ASTACK_1,ASTACK_2 bne reverse_digits mov SCRATCH_REG,#0 strb SCRATCH_REG,[ASTACK_0] ldr pc,[BSTACK_PTR],#4 .else mov r2,BSTACK_0 lao r1,printf_int_string,0 lao r0,sprintf_buffer,4 otoa r1,printf_int_string,0 otoa r0,sprintf_buffer,4 bl sprintf .endif .thumb_func return_sprintf_buffer: .if USE_CLIB lao r0,sprintf_buffer,5 otoa r0,sprintf_buffer,5 bl strlen mov BSTACK_0,r0 .else laol BSTACK_0,sprintf_buffer-1,sprintf_buffer_o_m1,0 otoa BSTACK_0,sprintf_buffer_o_m1,0 .thumb_func skip_characters: ldrb SCRATCH_REG,[BSTACK_0,#1]! tst SCRATCH_REG,SCRATCH_REG bne skip_characters lao SCRATCH_REG,sprintf_buffer,6 otoa SCRATCH_REG,sprintf_buffer,6 sub BSTACK_0,BSTACK_0,SCRATCH_REG .endif .if MY_ITOS .thumb_func sprintf_buffer_to_string: lao ASTACK_0,sprintf_buffer,7 otoa ASTACK_0,sprintf_buffer,7 .thumb_func build_string: .endif add BSTACK_1,BSTACK_0,#3 lsr BSTACK_1,BSTACK_1,#2 add BSTACK_1,BSTACK_1,#2 subs HEAP_FREE,HEAP_FREE,BSTACK_1 bhs D_to_S_no_gc str ASTACK_0,[BSTACK_PTR,#-4]! bl collect_0 ldr ASTACK_0,[BSTACK_PTR],#4 D_to_S_no_gc: subs BSTACK_1,BSTACK_1,#2 mov ASTACK_2,HEAP_PTR laol SCRATCH_REG,__STRING__+2,__STRING___o_2,0 otoa SCRATCH_REG,__STRING___o_2,0 str BSTACK_0,[HEAP_PTR,#4] str SCRATCH_REG,[HEAP_PTR],#8 b D_to_S_cp_str_2 D_to_S_cp_str_1: ldr BSTACK_0,[ASTACK_0],#4 str BSTACK_0,[HEAP_PTR],#4 D_to_S_cp_str_2: subs BSTACK_1,BSTACK_1,#1 bcs D_to_S_cp_str_1 mov ASTACK_0,ASTACK_2 ldr pc,[BSTACK_PTR],#4 eqD: ldr BSTACK_0,[ASTACK_0] ldr SCRATCH_REG,[ASTACK_1] cmp BSTACK_0,SCRATCH_REG bne eqD_false laol SCRATCH_REG,INT+2,INT_o_2,2 otoa SCRATCH_REG,INT_o_2,2 cmp BSTACK_0,SCRATCH_REG beq eqD_INT laol SCRATCH_REG,CHAR+2,CHAR_o_2,1 otoa SCRATCH_REG,CHAR_o_2,1 cmp BSTACK_0,SCRATCH_REG beq eqD_CHAR laol SCRATCH_REG,BOOL+2,BOOL_o_2,1 otoa SCRATCH_REG,BOOL_o_2,1 cmp BSTACK_0,SCRATCH_REG beq eqD_BOOL laol SCRATCH_REG,REAL+2,REAL_o_2,1 otoa SCRATCH_REG,REAL_o_2,1 cmp BSTACK_0,SCRATCH_REG beq eqD_REAL mov BSTACK_0,#1 ldr pc,[BSTACK_PTR],#4 eqD_CHAR: eqD_INT: ldr BSTACK_1,[ASTACK_0,#4] mov BSTACK_0,#0 ldr SCRATCH_REG,[ASTACK_1,#4] cmp BSTACK_1,SCRATCH_REG it eq moveq BSTACK_0,#1 ldr pc,[BSTACK_PTR],#4 eqD_BOOL: ldrb BSTACK_1,[ASTACK_0,#4] mov BSTACK_0,#0 ldrb SCRATCH_REG,[ASTACK_1,#4] cmp BSTACK_1,SCRATCH_REG it eq moveq BSTACK_0,#1 ldr pc,[BSTACK_PTR],#4 eqD_REAL: vldr.f64 d0,[ASTACK_0,#4] vldr.f64 d1,[ASTACK_1,#4] mov BSTACK_0,#0 vcmp.f64 d1,d0 vmrs APSR_nzcv,fpscr it eq moveq BSTACK_0,#1 ldr pc,[BSTACK_PTR],#4 eqD_false: mov BSTACK_0,#0 ldr pc,[BSTACK_PTR],#4 @ @ the timer @ .thumb_func init_timer: store_global_registers sub BSTACK_PTR,BSTACK_PTR,#20 mov r0,BSTACK_PTR bl times ldr BSTACK_0,[BSTACK_PTR] add BSTACK_0,BSTACK_0,BSTACK_0 add BSTACK_0,BSTACK_0,BSTACK_0,lsl #2 add BSTACK_PTR,BSTACK_PTR,#20 lao SCRATCH_REG,last_time,0 sto BSTACK_0,SCRATCH_REG,last_time,0 eor BSTACK_0,BSTACK_0,BSTACK_0 lao SCRATCH_REG,execute_time,2 sto BSTACK_0,SCRATCH_REG,execute_time,2 lao SCRATCH_REG,garbage_collect_time,2 sto BSTACK_0,SCRATCH_REG,garbage_collect_time,2 lao SCRATCH_REG,IO_time,1 sto BSTACK_0,SCRATCH_REG,IO_time,1 load_global_registers ldr pc,[BSTACK_PTR],#4 .thumb_func get_time_diff: sub BSTACK_PTR,BSTACK_PTR,#20 mov r0,BSTACK_PTR bl times ldr BSTACK_0,[BSTACK_PTR] add BSTACK_0,BSTACK_0,BSTACK_0 add BSTACK_0,BSTACK_0,BSTACK_0,lsl #2 add BSTACK_PTR,BSTACK_PTR,#20 lao ASTACK_0,last_time,1 otoa ASTACK_0,last_time,1 ldr ASTACK_1,[ASTACK_0] str BSTACK_0,[ASTACK_0] subs BSTACK_0,BSTACK_0,ASTACK_1 ldr pc,[BSTACK_PTR],#4 .thumb_func add_execute_time: .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl get_time_diff lao ASTACK_0,execute_time,3 otoa ASTACK_0,execute_time,3 .thumb_func add_time: ldr SCRATCH_REG,[ASTACK_0] add BSTACK_0,BSTACK_0,SCRATCH_REG str BSTACK_0,[ASTACK_0] ldr pc,[BSTACK_PTR],#4 .thumb_func add_garbage_collect_time: .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl get_time_diff lao ASTACK_0,garbage_collect_time,3 otoa ASTACK_0,garbage_collect_time,3 b add_time add_IO_time: .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl get_time_diff lao ASTACK_0,IO_time,2 otoa ASTACK_0,IO_time,2 b add_time .ifdef PIC lto sprintf_time_string,0 lto sprintf_time_buffer,0 .if USE_CLIB lto sprintf_time_buffer,1 .endif lto basic_only,1 lto basic_only,2 ltol INT+2,INT_o_2,1 ltol CHAR+2,CHAR_o_2,0 ltol BOOL+2,BOOL_o_2,0 ltol REAL+2,REAL_o_2,0 lto true_c_string,0 lto false_c_string,0 lto basic_only,3 lto true_string,0 lto false_string,0 .if USE_CLIB lto printf_real_string,0 lto sprintf_buffer,0 .else lto sprintf_buffer,1 .endif .if MY_ITOS lto sprintf_buffer,2 lto sprintf_buffer,3 .else lto printf_int_string,0 lto sprintf_buffer,4 .endif .if USE_CLIB lto sprintf_buffer,5 .else ltol sprintf_buffer-1,sprintf_buffer_o_m1,0 lto sprintf_buffer,6 .endif .if MY_ITOS lto sprintf_buffer,7 .endif ltol __STRING__+2,__STRING___o_2,0 ltol INT+2,INT_o_2,2 ltol CHAR+2,CHAR_o_2,1 ltol BOOL+2,BOOL_o_2,1 ltol REAL+2,REAL_o_2,1 lto last_time,0 lto execute_time,2 lto garbage_collect_time,2 lto IO_time,1 lto last_time,1 lto execute_time,3 lto garbage_collect_time,3 lto IO_time,2 .endif .ltorg .ifdef PIC .ifdef PROFILE lto garbage_collector_name,0 lto garbage_collector_name,1 lto garbage_collector_name,2 lto garbage_collector_name,3 .endif lto heap_end_after_gc,1 lto n_allocated_words,0 .if MARK_AND_COPY_GC lto flags,6 .endif .if MARK_GC lto bit_counter,0 lto n_allocated_words,1 lto bit_vector_p,0 lto n_free_words_after_mark,0 lto bit_counter,1 lto bit_vector_p,1 lto n_free_words_after_mark,1 lto heap_vector,1 lto heap_p3,1 lto heap_end_after_gc,2 lto bit_counter,2 lto n_free_words_after_mark,2 .endif lto garbage_collect_flag,2 lto garbage_collect_flag,3 lto extra_heap_size,0 lto extra_heap,0 lto heap_end_after_gc,3 lto flags,7 lto garbage_collect_string_1,0 lto stack_p,1 lto garbage_collect_string_2,0 lto halt_sp,2 lto garbage_collect_string_3,0 lto stack_p,2 lto ab_stack_size,5 .endif @ @ the garbage collector @ collect_3: str lr,[BSTACK_PTR,#-4]! .ifdef PROFILE lao ASTACK_2,garbage_collector_name,0 otoa ASTACK_2,garbage_collector_name,0 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_s .endif str ASTACK_0,[ASTACK_PTR] str ASTACK_1,[ASTACK_PTR,#4] str ASTACK_2,[ASTACK_PTR,#8] add ASTACK_PTR,ASTACK_PTR,#12 bl collect_0_ ldr ASTACK_2,[ASTACK_PTR,#-4] ldr ASTACK_1,[ASTACK_PTR,#-8] ldr ASTACK_0,[ASTACK_PTR,#-12]! .ifdef PROFILE b profile_r .else ldr pc,[BSTACK_PTR],#4 .endif collect_2: str lr,[BSTACK_PTR,#-4]! .ifdef PROFILE lao ASTACK_2,garbage_collector_name,1 otoa ASTACK_2,garbage_collector_name,1 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_s .endif str ASTACK_0,[ASTACK_PTR] str ASTACK_1,[ASTACK_PTR,#4] add ASTACK_PTR,ASTACK_PTR,#8 bl collect_0_ ldr ASTACK_1,[ASTACK_PTR,#-4] ldr ASTACK_0,[ASTACK_PTR,#-8]! .ifdef PROFILE b profile_r .else ldr pc,[BSTACK_PTR],#4 .endif collect_1: str lr,[BSTACK_PTR,#-4]! .ifdef PROFILE lao ASTACK_2,garbage_collector_name,2 otoa ASTACK_2,garbage_collector_name,2 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_s .endif str ASTACK_0,[ASTACK_PTR],#4 bl collect_0_ ldr ASTACK_0,[ASTACK_PTR,#-4]! .ifdef PROFILE b profile_r .else ldr pc,[BSTACK_PTR],#4 mov pc,lr .endif .ifdef PROFILE collect_0: str lr,[BSTACK_PTR,#-4]! lao ASTACK_2,garbage_collector_name,3 otoa ASTACK_2,garbage_collector_name,3 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_s bl collect_0_ b profile_r .endif .ifndef PROFILE collect_0: .endif collect_0_: store_bstack_and_lr lao SCRATCH_REG,heap_end_after_gc,1 ldo SCRATCH_REG,SCRATCH_REG,heap_end_after_gc,1 sub ASTACK_2,SCRATCH_REG,HEAP_PTR lsr ASTACK_2,ASTACK_2,#2 sub ASTACK_2,ASTACK_2,HEAP_FREE lao SCRATCH_REG,n_allocated_words,0 sto ASTACK_2,SCRATCH_REG,n_allocated_words,0 .if MARK_AND_COPY_GC lao SCRATCH_REG,flags,6 ldo SCRATCH_REG,SCRATCH_REG,flags,6 tst SCRATCH_REG,#64 beq no_mark3 .endif .if MARK_GC lao SCRATCH_REG,bit_counter,0 ldo ASTACK_2,SCRATCH_REG,bit_counter,0 cmp ASTACK_2,#0 beq no_scan mov BSTACK_1,#0 str ASTACK_PTR,[BSTACK_PTR,#-4]! lao SCRATCH_REG,n_allocated_words,1 ldo ASTACK_PTR,SCRATCH_REG,n_allocated_words,1 lao SCRATCH_REG,bit_vector_p,0 ldo ASTACK_0,SCRATCH_REG,bit_vector_p,0 lao SCRATCH_REG,n_free_words_after_mark,0 ldo BSTACK_2,SCRATCH_REG,n_free_words_after_mark,0 .thumb_func scan_bits: ldr SCRATCH_REG,[ASTACK_0] cmp BSTACK_1,SCRATCH_REG beq zero_bits str BSTACK_1,[ASTACK_0],#4 subs ASTACK_2,ASTACK_2,#1 bne scan_bits b end_scan .thumb_func zero_bits: add ASTACK_1,ASTACK_0,#4 add ASTACK_0,ASTACK_0,#4 subs ASTACK_2,ASTACK_2,#1 bne skip_zero_bits_lp1 b end_bits .thumb_func skip_zero_bits_lp: cmp BSTACK_0,#0 bne end_zero_bits skip_zero_bits_lp1: ldr BSTACK_0,[ASTACK_0],#4 subs ASTACK_2,ASTACK_2,#1 bne skip_zero_bits_lp cmp BSTACK_0,#0 beq end_bits str BSTACK_1,[ASTACK_0,#-4] subs BSTACK_0,ASTACK_0,ASTACK_1 b end_bits2 .thumb_func end_zero_bits: sub BSTACK_0,ASTACK_0,ASTACK_1 lsl BSTACK_0,BSTACK_0,#3 str BSTACK_1,[ASTACK_0,#-4] add BSTACK_2,BSTACK_2,BSTACK_0 cmp BSTACK_0,ASTACK_PTR blo scan_bits .thumb_func found_free_memory: lao SCRATCH_REG,bit_counter,1 sto ASTACK_2,SCRATCH_REG,bit_counter,1 lao SCRATCH_REG,bit_vector_p,1 sto ASTACK_0,SCRATCH_REG,bit_vector_p,1 lao SCRATCH_REG,n_free_words_after_mark,1 sto BSTACK_2,SCRATCH_REG,n_free_words_after_mark,1 sub HEAP_FREE,BSTACK_0,ASTACK_PTR add ASTACK_2,ASTACK_1,#-4 lao SCRATCH_REG,heap_vector,1 ldo SCRATCH_REG,SCRATCH_REG,heap_vector,1 subs ASTACK_2,ASTACK_2,SCRATCH_REG lsl ASTACK_2,ASTACK_2,#5 lao SCRATCH_REG,heap_p3,1 ldo HEAP_PTR,SCRATCH_REG,heap_p3,1 add HEAP_PTR,HEAP_PTR,ASTACK_2 add ASTACK_2,HEAP_PTR,BSTACK_0,lsl #2 lao SCRATCH_REG,heap_end_after_gc,2 sto ASTACK_2,SCRATCH_REG,heap_end_after_gc,2 ldr ASTACK_PTR,[BSTACK_PTR],#4 load_bstack_and_pc .thumb_func end_bits: sub BSTACK_0,ASTACK_0,ASTACK_1 add BSTACK_0,BSTACK_0,#4 end_bits2: lsl BSTACK_0,BSTACK_0,#3 add BSTACK_2,BSTACK_2,BSTACK_0 cmp BSTACK_0,ASTACK_PTR bhs found_free_memory .thumb_func end_scan: ldr ASTACK_PTR,[BSTACK_PTR],#4 lao SCRATCH_REG,bit_counter,2 sto ASTACK_2,SCRATCH_REG,bit_counter,2 lao SCRATCH_REG,n_free_words_after_mark,2 sto BSTACK_2,SCRATCH_REG,n_free_words_after_mark,2 .thumb_func no_scan: .endif @ to do: check value in ASTACK_2 .if MARK_AND_COPY_GC no_mark3: .endif lao SCRATCH_REG,garbage_collect_flag,2 ldosb BSTACK_0,SCRATCH_REG,garbage_collect_flag,2 cmp BSTACK_0,#0 ble collect .ifdef PIC lao SCRATCH_REG,garbage_collect_flag,3 .endif sub BSTACK_0,BSTACK_0,#2 stob BSTACK_0,SCRATCH_REG,garbage_collect_flag,3 lao SCRATCH_REG,extra_heap_size,0 ldo BSTACK_1,SCRATCH_REG,extra_heap_size,0 cmp ASTACK_2,BSTACK_1 bhi collect sub HEAP_FREE,BSTACK_1,ASTACK_2 lao SCRATCH_REG,extra_heap,0 ldo HEAP_PTR,SCRATCH_REG,extra_heap,0 add BSTACK_1,HEAP_PTR,BSTACK_1,lsl #2 lao SCRATCH_REG,heap_end_after_gc,3 sto BSTACK_1,SCRATCH_REG,heap_end_after_gc,3 load_bstack_and_pc .thumb_func .align collect: add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl add_execute_time lao SCRATCH_REG,flags,7 ldo SCRATCH_REG,SCRATCH_REG,flags,7 tst SCRATCH_REG,#4 beq no_print_stack_sizes lao r0,garbage_collect_string_1,0 otoa r0,garbage_collect_string_1,0 store_global_registers bl ew_print_string mov BSTACK_0,ASTACK_PTR lao SCRATCH_REG,stack_p,1 ldo SCRATCH_REG,SCRATCH_REG,stack_p,1 sub r0,BSTACK_0,SCRATCH_REG bl ew_print_int lao r0,garbage_collect_string_2,0 otoa r0,garbage_collect_string_2,0 bl ew_print_string lao SCRATCH_REG,halt_sp,2 ldo BSTACK_0,SCRATCH_REG,halt_sp,2 add r0,BSTACK_PTR,#0 sub r0,BSTACK_0,r0 bl ew_print_int lao r0,garbage_collect_string_3,0 otoa r0,garbage_collect_string_3,0 bl ew_print_string load_global_registers .thumb_func no_print_stack_sizes: lao SCRATCH_REG,stack_p,2 ldo BSTACK_0,SCRATCH_REG,stack_p,2 lao SCRATCH_REG,ab_stack_size,5 ldo SCRATCH_REG,SCRATCH_REG,ab_stack_size,5 add BSTACK_0,BSTACK_0,SCRATCH_REG cmp ASTACK_PTR,BSTACK_0 bhi stack_overflow .if MARK_AND_COPY_GC lao SCRATCH_REG,flags,8 ldo SCRATCH_REG,SCRATCH_REG,flags,8 tst SCRATCH_REG,#64 bne compacting_collector .else .if MARK_GC b compacting_collector .endif .endif .if MARK_AND_COPY_GC || !MARK_GC lao SCRATCH_REG,garbage_collect_flag,4 ldosb SCRATCH_REG,SCRATCH_REG,garbage_collect_flag,4 cmp SCRATCH_REG,#0 bne compacting_collector lao SCRATCH_REG,heap_copied_vector,1 ldo ASTACK_2,SCRATCH_REG,heap_copied_vector,1 lao SCRATCH_REG,heap_end_after_copy_gc,1 ldo SCRATCH_REG,SCRATCH_REG,heap_end_after_copy_gc,1 cmp SCRATCH_REG,#0 beq zero_all mov BSTACK_0,HEAP_PTR lao SCRATCH_REG,heap_p1,1 ldo SCRATCH_REG,SCRATCH_REG,heap_p1,1 subs BSTACK_0,BSTACK_0,SCRATCH_REG add BSTACK_0,BSTACK_0,#63*4 lsr BSTACK_0,BSTACK_0,#8 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl zero_bit_vector lao SCRATCH_REG,heap_end_after_copy_gc,2 ldo ASTACK_1,SCRATCH_REG,heap_end_after_copy_gc,2 lao SCRATCH_REG,heap_p1,2 ldo SCRATCH_REG,SCRATCH_REG,heap_p1,2 subs ASTACK_1,ASTACK_1,SCRATCH_REG lsr ASTACK_1,ASTACK_1,#6 and ASTACK_1,ASTACK_1,#-4 lao SCRATCH_REG,heap_copied_vector,2 ldo ASTACK_2,SCRATCH_REG,heap_copied_vector,2 lao SCRATCH_REG,heap_copied_vector_size,2 ldo BSTACK_0,SCRATCH_REG,heap_copied_vector_size,2 add ASTACK_2,ASTACK_2,ASTACK_1 subs BSTACK_0,BSTACK_0,ASTACK_1 lsr BSTACK_0,BSTACK_0,#2 lao SCRATCH_REG,heap_end_after_copy_gc,3 mov LINK_REG,#0 sto LINK_REG,SCRATCH_REG,heap_end_after_copy_gc,3 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl zero_bit_vector b end_zero_bit_vector .thumb_func zero_all: lao SCRATCH_REG,heap_copied_vector_size,3 ldo BSTACK_0,SCRATCH_REG,heap_copied_vector_size,3 lsr BSTACK_0,BSTACK_0,#2 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl zero_bit_vector .thumb_func end_zero_bit_vector: .include "thumb2copy.s" .if WRITE_HEAP lao SCRATCH_REG,heap2_begin_and_end,0 sto ASTACK_PTR,SCRATCH_REG,heap2_begin_and_end,0 .endif sub ASTACK_2,ASTACK_PTR,HEAP_PTR lsr ASTACK_2,ASTACK_2,#2 ldr ASTACK_PTR,[BSTACK_PTR],#4 .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl add_garbage_collect_time lao SCRATCH_REG,n_allocated_words,2 ldo SCRATCH_REG,SCRATCH_REG,n_allocated_words,2 subs ASTACK_2,ASTACK_2,SCRATCH_REG mov HEAP_FREE,ASTACK_2 @bls switch_to_mark_scan add BSTACK_0,ASTACK_2,ASTACK_2,lsl #2 lsl BSTACK_0,BSTACK_0,#5 lao BSTACK_1,heap_size,4 ldo BSTACK_1,BSTACK_1,heap_size,4 mov ASTACK_0,BSTACK_1 lsl BSTACK_1,BSTACK_1,#2 add BSTACK_1,BSTACK_1,ASTACK_0 add BSTACK_1,BSTACK_1,BSTACK_1 add BSTACK_1,BSTACK_1,ASTACK_0 cmp BSTACK_0,BSTACK_1 bhs no_mark_scan b no_mark_scan .thumb_func switch_to_mark_scan: lao SCRATCH_REG,heap_size_33,2 ldo BSTACK_0,SCRATCH_REG,heap_size_33,2 lsl BSTACK_0,BSTACK_0,#5 lao SCRATCH_REG,heap_p,1 ldo BSTACK_1,SCRATCH_REG,heap_p,1 lao SCRATCH_REG,heap_p1,3 ldo ASTACK_0,SCRATCH_REG,heap_p1,3 lao SCRATCH_REG,heap_p2,1 ldo SCRATCH_REG,SCRATCH_REG,heap_p2,1 cmp ASTACK_0,SCRATCH_REG bcc vector_at_begin .thumb_func vector_at_end: lao SCRATCH_REG,heap_p3,2 sto BSTACK_1,SCRATCH_REG,heap_p3,2 add BSTACK_1,BSTACK_1,BSTACK_0 lao SCRATCH_REG,heap_vector,2 sto BSTACK_1,SCRATCH_REG,heap_vector,2 lao SCRATCH_REG,heap_p1,4 ldo BSTACK_0,SCRATCH_REG,heap_p1,4 lao SCRATCH_REG,extra_heap,1 sto BSTACK_0,SCRATCH_REG,extra_heap,1 subs BSTACK_1,BSTACK_1,BSTACK_0 lsr BSTACK_1,BSTACK_1,#2 lao SCRATCH_REG,extra_heap_size,1 sto BSTACK_1,SCRATCH_REG,extra_heap_size,1 b switch_to_mark_scan_2 .thumb_func vector_at_begin: lao SCRATCH_REG,heap_vector,3 sto BSTACK_1,SCRATCH_REG,heap_vector,3 lao SCRATCH_REG,heap_size,5 ldo SCRATCH_REG,SCRATCH_REG,heap_size,5 add BSTACK_1,BSTACK_1,SCRATCH_REG subs BSTACK_1,BSTACK_1,BSTACK_0 lao SCRATCH_REG,heap_p3,3 sto BSTACK_1,SCRATCH_REG,heap_p3,3 lao SCRATCH_REG,extra_heap,2 sto BSTACK_1,SCRATCH_REG,extra_heap,2 lao SCRATCH_REG,heap_p2,2 ldo ASTACK_0,SCRATCH_REG,heap_p2,2 subs ASTACK_0,ASTACK_0,BSTACK_1 lsr ASTACK_0,ASTACK_0,#2 lao SCRATCH_REG,extra_heap_size,2 sto ASTACK_0,SCRATCH_REG,extra_heap_size,2 switch_to_mark_scan_2: lao BSTACK_0,heap_size,6 ldo BSTACK_0,BSTACK_0,heap_size,6 lsr BSTACK_0,BSTACK_0,#3 sub BSTACK_0,BSTACK_0,ASTACK_2 lsl BSTACK_0,BSTACK_0,#2 lao SCRATCH_REG,garbage_collect_flag,5 mov ASTACK_3,#1 stob ASTACK_3,SCRATCH_REG,garbage_collect_flag,5 cmp ASTACK_2,#0 bpl end_garbage_collect mov ASTACK_3,#-1 strb ASTACK_3,[SCRATCH_REG] lao SCRATCH_REG,extra_heap_size,3 ldo BSTACK_1,SCRATCH_REG,extra_heap_size,3 mov BSTACK_0,BSTACK_1 lao SCRATCH_REG,n_allocated_words,3 ldo SCRATCH_REG,SCRATCH_REG,n_allocated_words,3 subs BSTACK_0,BSTACK_0,SCRATCH_REG bmi out_of_memory_4 lao SCRATCH_REG,extra_heap,3 ldo HEAP_PTR,SCRATCH_REG,extra_heap,3 lsl BSTACK_1,BSTACK_1,#2 add BSTACK_1,BSTACK_1,HEAP_PTR lao SCRATCH_REG,heap_end_after_gc,4 sto BSTACK_1,SCRATCH_REG,heap_end_after_gc,4 .if WRITE_HEAP lao SCRATCH_REG,heap_end_write_heap,0 sto HEAP_PTR,SCRATCH_REG,heap_end_write_heap,0 lao SCRATCH_REG,d3_flag_write_heap,0 mov ASTACK_3,#1 sto ASTACK_3,SCRATCH_REG,d3_flag_write_heap,0 b end_garbage_collect_ .else b end_garbage_collect .endif .thumb_func no_mark_scan: @ exchange the semi_spaces lao SCRATCH_REG,heap_p1,5 ldo BSTACK_0,SCRATCH_REG,heap_p1,5 lao SCRATCH_REG,heap_p2,3 ldo BSTACK_1,SCRATCH_REG,heap_p2,3 lao SCRATCH_REG,heap_p2,4 sto BSTACK_0,SCRATCH_REG,heap_p2,4 lao SCRATCH_REG,heap_p1,6 sto BSTACK_1,SCRATCH_REG,heap_p1,6 lao SCRATCH_REG,heap_size_129,2 ldo BSTACK_0,SCRATCH_REG,heap_size_129,2 lsl BSTACK_0,BSTACK_0,#6-2 .ifdef MUNMAP lao SCRATCH_REG,heap_p2,5 ldo BSTACK_1,SCRATCH_REG,heap_p2,5 add ASTACK_0,BSTACK_1,BSTACK_0,lsl #2 add BSTACK_1,BSTACK_1,#4095 and BSTACK_1,BSTACK_1,#-4096 and ASTACK_0,ASTACK_0,#-4096 subs ASTACK_0,ASTACK_0,BSTACK_1 bls no_pages str BSTACK_0,[BSTACK_PTR,#-4]! str ASTACK_0,[BSTACK_PTR,#-4]! str BSTACK_1,[BSTACK_PTR,#-4]! .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl _munmap add BSTACK_PTR,BSTACK_PTR,#8 ldr BSTACK_0,[BSTACK_PTR],#4 .thumb_func no_pages: .endif .if ADJUST_HEAP_SIZE mov BSTACK_1,BSTACK_0 .endif subs BSTACK_0,BSTACK_0,ASTACK_2 .if ADJUST_HEAP_SIZE mov ASTACK_0,BSTACK_0 lao SCRATCH_REG,heap_size_multiple,0 ldo SCRATCH_REG,SCRATCH_REG,heap_size_multiple,0 umull BSTACK_0,ASTACK_1,SCRATCH_REG,BSTACK_0 lsr BSTACK_0,BSTACK_0,#9 orr BSTACK_0,BSTACK_0,ASTACK_1,lsl #32-9 lsrs ASTACK_1,ASTACK_1,#9 bne no_small_heap1 cmp BSTACK_0,#MINIMUM_HEAP_SIZE_2 bhs not_too_small1 mov BSTACK_0,#MINIMUM_HEAP_SIZE_2 not_too_small1: subs BSTACK_1,BSTACK_1,BSTACK_0 blo no_small_heap1 sub HEAP_FREE,HEAP_FREE,BSTACK_1 lsl BSTACK_1,BSTACK_1,#2 lao SCRATCH_REG,heap_end_after_gc,5 ldo ASTACK_2,SCRATCH_REG,heap_end_after_gc,5 lao SCRATCH_REG,heap_end_after_copy_gc,4 sto ASTACK_2,SCRATCH_REG,heap_end_after_copy_gc,4 sub ASTACK_2,ASTACK_2,BSTACK_1 lao SCRATCH_REG,heap_end_after_gc,6 sto ASTACK_2,SCRATCH_REG,heap_end_after_gc,6 no_small_heap1: mov BSTACK_0,ASTACK_0 .endif lsl BSTACK_0,BSTACK_0,#2 .endif .thumb_func end_garbage_collect: .if WRITE_HEAP lao SCRATCH_REG,heap_end_write_heap,1 sto HEAP_PTR,SCRATCH_REG,heap_end_write_heap,1 lao SCRATCH_REG,d3_flag_write_heap,1 mov ASTACK_3,#0 sto ASTACK_3,SCRATCH_REG,d3_flag_write_heap,1 .thumb_func end_garbage_collect_: .endif str BSTACK_0,[BSTACK_PTR,#-4]! store_global_registers lao SCRATCH_REG,flags,9 ldo SCRATCH_REG,SCRATCH_REG,flags,9 tst SCRATCH_REG,#2 beq no_heap_use_message str BSTACK_0,[BSTACK_PTR,#-4]! lao r0,heap_use_after_gc_string_1,0 otoa r0,heap_use_after_gc_string_1,0 bl ew_print_string ldr r0,[BSTACK_PTR],#4 bl ew_print_int lao r0,heap_use_after_gc_string_2,0 otoa r0,heap_use_after_gc_string_2,0 bl ew_print_string .thumb_func no_heap_use_message: load_global_registers .if FINALIZERS .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl call_finalizers .endif ldr BSTACK_0,[BSTACK_PTR],#4 .if WRITE_HEAP @ Check whether memory profiling is on or off lao SCRATCH_REG,flags,10 ldo SCRATCH_REG,SCRATCH_REG,flags,10 tst SCRATCH_REG,#32 beq no_write_heap lao SCRATCH_REG,min_write_heap_size,0 ldo SCRATCH_REG,SCRATCH_REG,min_write_heap_size,0 cmp BSTACK_0,SCRATCH_REG blo no_write_heap str ASTACK_0,[BSTACK_PTR,#-4]! str ASTACK_1,[BSTACK_PTR,#-4]! str ASTACK_2,[BSTACK_PTR,#-4]! str ASTACK_PTR,[BSTACK_PTR,#-4]! str HEAP_PTR,[BSTACK_PTR,#-4]! subs BSTACK_PTR,BSTACK_PTR,#64 lao SCRATCH_REG,d3_flag_write_heap,2 ldo BSTACK_0,SCRATCH_REG,d3_flag_write_heap,2 tst BSTACK_0,BSTACK_0 bne copy_to_compact_with_alloc_in_extra_heap lao BSTACK_0,garbage_collect_flag,6 ldosb BSTACK_0,BSTACK_0,garbage_collect_flag,6 lao SCRATCH_REG,heap2_begin_and_end,1 ldo ASTACK_0,SCRATCH_REG,heap2_begin_and_end,1 laol SCRATCH_REG,heap2_begin_and_end+4,heap2_begin_and_end_o_4,0 ldo ASTACK_1,SCRATCH_REG,heap2_begin_and_end_o_4,0 lao BSTACK_1,heap_p1,7 otoa BSTACK_1,heap_p1,7 tst BSTACK_0,BSTACK_0 beq gc0 lao BSTACK_1,heap_p2,6 otoa BSTACK_1,heap_p2,6 bgt gc1 lao BSTACK_1,heap_p3,4 otoa BSTACK_1,heap_p3,4 mov ASTACK_0,#0 mov ASTACK_1,#0 gc0: gc1: ldr BSTACK_1,[BSTACK_1] ? /* fill record */ mov BSTACK_0,BSTACK_PTR str BSTACK_1,[BSTACK_0,#0] ? movl a4,4(d0) // klop dit? ? movl a0,8(d0) // heap2_begin ? movl a1,12(d0) // heap2_end lao SCRATCH_REG,stack_p,3 ldo BSTACK_1,SCRATCH_REG,stack_p,3 ? movl d1,16(d0) // stack_begin ? movl a3,20(d0) // stack_end ? movl $0,24(d0) // text_begin ? movl $0,28(d0) // data_begin ? movl $small_integers,32(d0) // small_integers ? movl $static_characters,36(d0) // small_characters ? movl $INT+2,40(d0) // INT-descP ? movl $CHAR+2,44(d0) // CHAR-descP ? movl $REAL+2,48(d0) // REAL-descP ? movl $BOOL+2,52(d0) // BOOL-descP ? movl $__STRING__+2,56(d0) // STRING-descP ? movl $__ARRAY__+2,60(d0) // ARRAY-descP str BSTACK_0,[BSTACK_PTR,#-4]! bl write_heap add BSTACK_PTR,BSTACK_PTR,#68 ldr HEAP_PTR,[BSTACK_PTR],#4 ldr ASTACK_PTR,[BSTACK_PTR],#4 ldr ASTACK_2,[BSTACK_PTR],#4 ldr ASTACK_1,[BSTACK_PTR],#4 ldr ASTACK_0,[BSTACK_PTR],#4 .thumb_func no_write_heap: .endif load_bstack_and_pc .ifdef PIC .if MARK_AND_COPY_GC lto flags,8 .endif .if MARK_AND_COPY_GC || !MARK_GC lto garbage_collect_flag,4 lto heap_copied_vector,1 lto heap_end_after_copy_gc,1 lto heap_p1,1 lto heap_end_after_copy_gc,2 lto heap_p1,2 lto heap_copied_vector,2 lto heap_copied_vector_size,2 lto heap_end_after_copy_gc,3 lto heap_copied_vector_size,3 .endif .if WRITE_HEAP lto heap2_begin_and_end,0 .endif lto n_allocated_words,2 lto heap_size,4 lto heap_size_33,2 lto heap_p,1 lto heap_p1,3 lto heap_p2,1 lto heap_p3,2 lto heap_vector,2 lto heap_p1,4 lto extra_heap,1 lto extra_heap_size,1 lto heap_vector,3 lto heap_size,5 lto heap_p3,3 lto extra_heap,2 lto heap_p2,2 lto extra_heap_size,2 lto heap_size,6 lto garbage_collect_flag,5 lto extra_heap_size,3 lto n_allocated_words,3 lto extra_heap,3 lto heap_end_after_gc,4 .if WRITE_HEAP lto heap_end_write_heap,0 lto d3_flag_write_heap,0 .endif lto heap_p1,5 lto heap_p2,3 lto heap_p2,4 lto heap_p1,6 lto heap_size_129,2 .ifdef MUNMAP lto heap_p2,5 .endif .if ADJUST_HEAP_SIZE lto heap_size_multiple,0 lto heap_end_after_gc,5 lto heap_end_after_copy_gc,4 lto heap_end_after_gc,6 .endif .if WRITE_HEAP lto heap_end_write_heap,1 lto d3_flag_write_heap,1 .endif lto flags,9 lto heap_use_after_gc_string_1,0 lto heap_use_after_gc_string_2,0 .if WRITE_HEAP lto flags,10 lto min_write_heap_size,0 lto d3_flag_write_heap,2 lto garbage_collect_flag,6 lto heap2_begin_and_end,1 ltol heap2_begin_and_end+4,heap2_begin_and_end_o_4,0 lto heap_p1,7 lto heap_p2,6 lto heap_p3,4 lto stack_p,3 .endif .endif .ltorg .ifdef PIC .if FINALIZERS lto free_finalizer_list,1 ltol __Nil-4,__Nil_o_m4,1 lto free_finalizer_list,2 ltol __Nil-4,__Nil_o_m4,2 .endif .if WRITE_HEAP lto heap2_begin_and_end,2 ltol heap2_begin_and_end+4,heap2_begin_and_end_o_4,1 lto heap_p2,7 .endif lto out_of_memory_string_4,0 lto stack_top,0 lto heap_vector,4 .if MARK_GC .if MARK_AND_COPY_GC lto flags,11 .endif lto zero_bits_before_mark,0 .endif lto heap_size_33,3 .if MARK_GC .if MARK_AND_COPY_GC lto flags,12 .endif lto n_last_heap_free_bytes,0 lto n_free_words_after_mark,3 .endif .if ADJUST_HEAP_SIZE lto bit_vector_size,1 lto heap_size_multiple,1 .endif .endif .if FINALIZERS .thumb_func call_finalizers: lao SCRATCH_REG,free_finalizer_list,1 ldo BSTACK_0,SCRATCH_REG,free_finalizer_list,1 .thumb_func call_finalizers_lp: laol SCRATCH_REG,__Nil-4,__Nil_o_m4,1 otoa SCRATCH_REG,__Nil_o_m4,1 cmp BSTACK_0,SCRATCH_REG beq end_call_finalizers ldr SCRATCH_REG,[BSTACK_0,#4] str SCRATCH_REG,[BSTACK_PTR,#-4]! ldr BSTACK_1,[BSTACK_0,#8] ldr SCRATCH_REG,[BSTACK_1,#4] str SCRATCH_REG,[BSTACK_PTR,#-4]! ldr SCRATCH_REG,[BSTACK_1] blx SCRATCH_REG add BSTACK_PTR,BSTACK_PTR,#4 ldr BSTACK_0,[BSTACK_PTR],#4 b call_finalizers_lp .thumb_func end_call_finalizers: lao SCRATCH_REG,free_finalizer_list,2 laol ASTACK_3,__Nil-4,__Nil_o_m4,2 otoa ASTACK_3,__Nil_o_m4,2 sto ASTACK_3,SCRATCH_REG,free_finalizer_list,2 ldr pc,[BSTACK_PTR],#4 .endif .if WRITE_HEAP .thumb_func copy_to_compact_with_alloc_in_extra_heap: lao SCRATCH_REG,heap2_begin_and_end,2 ldo ASTACK_0,SCRATCH_REG,heap2_begin_and_end,2 laol SCRATCH_REG,heap2_begin_and_end+4,heap2_begin_and_end_o_4,1 ldo ASTACK_1,SCRATCH_REG,heap2_begin_and_end_o_4,1 lao BSTACK_1,heap_p2,7 otoa BSTACK_1,heap_p2,7 b gc1 .endif out_of_memory_4: .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl add_garbage_collect_time lao ASTACK_2,out_of_memory_string_4,0 otoa ASTACK_2,out_of_memory_string_4,0 b print_error .thumb_func zero_bit_vector: eor ASTACK_1,ASTACK_1,ASTACK_1 tst BSTACK_0,#1 beq zero_bits1_1 str ASTACK_1,[ASTACK_2] add ASTACK_2,ASTACK_2,#4 zero_bits1_1: lsr BSTACK_0,BSTACK_0,#1 mov BSTACK_1,BSTACK_0 lsr BSTACK_0,BSTACK_0,#1 tst BSTACK_1,#1 beq zero_bits1_5 subs ASTACK_2,ASTACK_2,#8 b zero_bits1_2 zero_bits1_4: str ASTACK_1,[ASTACK_2] str ASTACK_1,[ASTACK_2,#4] zero_bits1_2: str ASTACK_1,[ASTACK_2,#8] str ASTACK_1,[ASTACK_2,#12] add ASTACK_2,ASTACK_2,#16 zero_bits1_5: subs BSTACK_0,BSTACK_0,#1 bhs zero_bits1_4 ldr pc,[BSTACK_PTR],#4 .thumb_func reorder: str ASTACK_PTR,[BSTACK_PTR,#-4]! str ASTACK_2,[BSTACK_PTR,#-4]! mov ASTACK_2,BSTACK_0 lsl ASTACK_2,ASTACK_2,#2 mov ASTACK_PTR,BSTACK_1 lsl ASTACK_PTR,ASTACK_PTR,#2 add ASTACK_0,ASTACK_0,ASTACK_PTR subs ASTACK_1,ASTACK_1,ASTACK_2 str ASTACK_PTR,[BSTACK_PTR,#-4]! str ASTACK_2,[BSTACK_PTR,#-4]! str BSTACK_1,[BSTACK_PTR,#-4]! str BSTACK_0,[BSTACK_PTR,#-4]! b st_reorder_lp .thumb_func reorder_lp: ldr ASTACK_2,[ASTACK_0] ldr ASTACK_PTR,[ASTACK_1,#-4] str ASTACK_2,[ASTACK_1,#-4] subs ASTACK_1,ASTACK_1,#4 str ASTACK_PTR,[ASTACK_0] add ASTACK_0,ASTACK_0,#4 subs BSTACK_0,BSTACK_0,#1 bne next_b_in_element ldr BSTACK_0,[BSTACK_PTR] ldr SCRATCH_REG,[BSTACK_PTR,#12] add ASTACK_0,ASTACK_0,SCRATCH_REG .thumb_func next_b_in_element: subs BSTACK_1,BSTACK_1,#1 bne next_a_in_element ldr BSTACK_1,[BSTACK_PTR,#4] ldr SCRATCH_REG,[BSTACK_PTR,#8] subs ASTACK_1,ASTACK_1,SCRATCH_REG .thumb_func next_a_in_element: .thumb_func st_reorder_lp: cmp ASTACK_1,ASTACK_0 bhi reorder_lp ldr BSTACK_0,[BSTACK_PTR],#4 ldr BSTACK_1,[BSTACK_PTR],#4 add BSTACK_PTR,BSTACK_PTR,#8 ldr ASTACK_2,[BSTACK_PTR],#4 ldr ASTACK_PTR,[BSTACK_PTR],#4 ldr pc,[BSTACK_PTR],#4 @ @ the sliding compacting garbage collector @ .thumb_func compacting_collector: @ zero all mark bits lao SCRATCH_REG,stack_top,0 sto ASTACK_PTR,SCRATCH_REG,stack_top,0 lao SCRATCH_REG,heap_vector,4 ldo HEAP_PTR,SCRATCH_REG,heap_vector,4 .if MARK_GC .if MARK_AND_COPY_GC lao SCRATCH_REG,flags,11 ldo SCRATCH_REG,SCRATCH_REG,flags,11 tst SCRATCH_REG,#64 beq no_mark4 .endif lao SCRATCH_REG,zero_bits_before_mark,0 otoa SCRATCH_REG,zero_bits_before_mark,0 ldr ASTACK_3,[SCRATCH_REG] cmp ASTACK_3,#0 beq no_zero_bits mov ASTACK_3,#0 str ASTACK_3,[SCRATCH_REG] .if MARK_AND_COPY_GC no_mark4: .endif .endif mov ASTACK_2,HEAP_PTR lao SCRATCH_REG,heap_size_33,3 ldo BSTACK_0,SCRATCH_REG,heap_size_33,3 add BSTACK_0,BSTACK_0,#3 lsr BSTACK_0,BSTACK_0,#2 mov BSTACK_1,#0 tst BSTACK_0,#1 beq zero_bits_1 str BSTACK_1,[ASTACK_2],#4 zero_bits_1: mov ASTACK_0,BSTACK_0 lsr BSTACK_0,BSTACK_0,#2 tst ASTACK_0,#2 beq zero_bits_5 subs ASTACK_2,ASTACK_2,#8 b zero_bits_2 zero_bits_4: str BSTACK_1,[ASTACK_2] str BSTACK_1,[ASTACK_2,#4] zero_bits_2: str BSTACK_1,[ASTACK_2,#8] str BSTACK_1,[ASTACK_2,#12] add ASTACK_2,ASTACK_2,#16 zero_bits_5: subs BSTACK_0,BSTACK_0,#1 bcs zero_bits_4 .if MARK_GC .if MARK_AND_COPY_GC lao SCRATCH_REG,flags,12 ldo SCRATCH_REG,SCRATCH_REG,flags,12 tst SCRATCH_REG,#64 beq no_mark5 .endif .thumb_func no_zero_bits: lao SCRATCH_REG,n_last_heap_free_bytes,0 ldo BSTACK_0,SCRATCH_REG,n_last_heap_free_bytes,0 lao SCRATCH_REG,n_free_words_after_mark,3 ldo BSTACK_1,SCRATCH_REG,n_free_words_after_mark,3 .if 1 lsr BSTACK_0,BSTACK_0,#2 .else lsl BSTACK_1,BSTACK_1,#2 .endif add ASTACK_2,BSTACK_1,BSTACK_1,lsl #3 lsr ASTACK_2,ASTACK_2,#2 cmp BSTACK_0,ASTACK_2 bgt compact_gc .if ADJUST_HEAP_SIZE lao SCRATCH_REG,bit_vector_size,1 ldo BSTACK_1,SCRATCH_REG,bit_vector_size,1 lsl BSTACK_1,BSTACK_1,#2 sub BSTACK_0,BSTACK_1,BSTACK_0 lao SCRATCH_REG,heap_size_multiple,1 ldo SCRATCH_REG,SCRATCH_REG,heap_size_multiple,1 umull BSTACK_0,ASTACK_1,SCRATCH_REG,BSTACK_0 lsr BSTACK_0,BSTACK_0,#7 orr BSTACK_0,BSTACK_0,ASTACK_1,lsl #32-7 lsrs ASTACK_1,ASTACK_1,#7 bne no_smaller_heap cmp BSTACK_0,BSTACK_1 bhs no_smaller_heap cmp BSTACK_1,#MINIMUM_HEAP_SIZE bls no_smaller_heap b compact_gc .thumb_func no_smaller_heap: .endif .include "thumb2mark.s" .ifdef PIC lto zero_bits_before_mark,1 lto n_last_heap_free_bytes,1 lto n_free_words_after_mark,4 .endif .thumb_func compact_gc: lao SCRATCH_REG,zero_bits_before_mark,1 mov ASTACK_3,#1 sto ASTACK_3,SCRATCH_REG,zero_bits_before_mark,1 lao SCRATCH_REG,n_last_heap_free_bytes,1 mov ASTACK_3,#0 sto ASTACK_3,SCRATCH_REG,n_last_heap_free_bytes,1 lao SCRATCH_REG,n_free_words_after_mark,4 mov ASTACK_3,#1000 sto ASTACK_3,SCRATCH_REG,n_free_words_after_mark,4 .if MARK_AND_COPY_GC no_mark5: .endif .endif .include "thumb2compact.s" lao SCRATCH_REG,stack_top,1 ldo ASTACK_PTR,SCRATCH_REG,stack_top,1 lao SCRATCH_REG,heap_size_33,4 ldo BSTACK_1,SCRATCH_REG,heap_size_33,4 lsl BSTACK_1,BSTACK_1,#5 lao SCRATCH_REG,heap_p3,5 ldo SCRATCH_REG,SCRATCH_REG,heap_p3,5 add BSTACK_1,BSTACK_1,SCRATCH_REG lao SCRATCH_REG,heap_end_after_gc,7 sto BSTACK_1,SCRATCH_REG,heap_end_after_gc,7 subs BSTACK_1,BSTACK_1,HEAP_PTR lsr BSTACK_1,BSTACK_1,#2 lao SCRATCH_REG,n_allocated_words,4 ldo SCRATCH_REG,SCRATCH_REG,n_allocated_words,4 subs BSTACK_1,BSTACK_1,SCRATCH_REG mov HEAP_FREE,BSTACK_1 bcc out_of_memory_4 ldr SCRATCH_REG,=107374182 cmp BSTACK_1,SCRATCH_REG bhs not_out_of_memory add BSTACK_0,BSTACK_1,BSTACK_1,lsl #2 lsl BSTACK_0,BSTACK_0,#3 lao SCRATCH_REG,heap_size,7 ldo SCRATCH_REG,SCRATCH_REG,heap_size,7 cmp BSTACK_0,SCRATCH_REG bcc out_of_memory_4 .thumb_func not_out_of_memory: .if MARK_GC || COMPACT_GC_ONLY .if MARK_GC && ADJUST_HEAP_SIZE .if MARK_AND_COPY_GC lao SCRATCH_REG,flags,13 ldo SCRATCH_REG,SCRATCH_REG,flags,13 tst SCRATCH_REG,#64 beq no_mark_6 .endif lao SCRATCH_REG,heap_p3,6 ldo BSTACK_0,SCRATCH_REG,heap_p3,6 sub BSTACK_0,HEAP_PTR,BSTACK_0 lao SCRATCH_REG,n_allocated_words,5 ldo BSTACK_1,SCRATCH_REG,n_allocated_words,5 add BSTACK_0,BSTACK_0,BSTACK_1,lsl #2 lao SCRATCH_REG,heap_size_33,5 ldo BSTACK_1,SCRATCH_REG,heap_size_33,5 lsl BSTACK_1,BSTACK_1,#5 lao SCRATCH_REG,heap_size_multiple,2 ldo SCRATCH_REG,SCRATCH_REG,heap_size_multiple,2 umull BSTACK_0,ASTACK_1,SCRATCH_REG,BSTACK_0 lsr BSTACK_0,BSTACK_0,#8 orr BSTACK_0,BSTACK_0,ASTACK_1,lsl #32-8 lsrs ASTACK_1,ASTACK_1,#8 bne no_small_heap2 and BSTACK_0,BSTACK_0,#-4 cmp BSTACK_0,#MINIMUM_HEAP_SIZE bhs not_too_small2 mov BSTACK_0,#MINIMUM_HEAP_SIZE not_too_small2: mov ASTACK_0,BSTACK_1 subs ASTACK_0,ASTACK_0,BSTACK_0 blo no_small_heap2 lao SCRATCH_REG,heap_end_after_gc,8 otoa SCRATCH_REG,heap_end_after_gc,8 ldr ASTACK_3,[SCRATCH_REG] sub ASTACK_3,ASTACK_3,ASTACK_0 str ASTACK_3,[SCRATCH_REG] sub HEAP_FREE,HEAP_FREE,ASTACK_0,lsr #2 mov BSTACK_1,BSTACK_0 no_small_heap2: lsr BSTACK_1,BSTACK_1,#2 lao SCRATCH_REG,bit_vector_size,2 sto BSTACK_1,SCRATCH_REG,bit_vector_size,2 .if MARK_AND_COPY_GC no_mark_6: .endif .endif b no_copy_garbage_collection .else @ to do prevent overflow lsl BSTACK_0,BSTACK_0,#2 lao SCRATCH_REG,heap_size,8 ldo SCRATCH_REG,SCRATCH_REG,heap_size,8 lsl ASTACK_0,SCRATCH_REG,#5 sub ASTACK_0,ASTACK_0,SCRATCH_REG cmp BSTACK_0,ASTACK_0 ble no_copy_garbage_collection lao SCRATCH_REG,heap_p,2 ldo BSTACK_0,SCRATCH_REG,heap_p,2 lao SCRATCH_REG,heap_p1,8 sto BSTACK_0,SCRATCH_REG,heap_p1,8 lao SCRATCH_REG,heap_size_129,3 lto BSTACK_1,SCRATCH_REG,heap_size_129,3 lsl BSTACK_1,BSTACK_1,#6 add BSTACK_0,BSTACK_0,BSTACK_1 lao SCRATCH_REG,heap_copied_vector,3 sto BSTACK_0,SCRATCH_REG,heap_copied_vector,3 lao SCRATCH_REG,heap_end_after_gc,9 sto BSTACK_0,SCRATCH_REG,heap_end_after_gc,9 lao SCRATCH_REG,heap_copied_vector_size,4 ldo BSTACK_1,SCRATCH_REG,heap_copied_vector_size,4 add BSTACK_1,BSTACK_1,BSTACK_0 lao SCRATCH_REG,heap_p2,8 sto BSTACK_1,SCRATCH_REG,heap_p2,8 lao SCRATCH_REG,heap_p3,7 ldo BSTACK_0,SCRATCH_REG,heap_p3,7 lao SCRATCH_REG,heap_vector,5 ldo SCRATCH_REG,SCRATCH_REG,heap_vector,5 cmp BSTACK_0,SCRATCH_REG ble vector_at_end_2 lao SCRATCH_REG,heap_vector,6 ldo BSTACK_1,SCRATCH_REG,heap_vector,6 lao SCRATCH_REG,extra_heap,4 sto BSTACK_1,SCRATCH_REG,extra_heap,4 subs BSTACK_0,BSTACK_0,BSTACK_1 lsr BSTACK_0,BSTACK_0,#2 lao SCRATCH_REG,extra_heap_size,4 sto BSTACK_0,SCRATCH_REG,extra_heap_size,4 lao SCRATCH_REG,garbage_collect_flag,7 mov ASTACK_3,#2 stob ASTACK_3,SCRATCH_REG,garbage_collect_flag,7 b no_copy_garbage_collection vector_at_end_2: lao SCRATCH_REG,garbage_collect_flag,8 mov ASTACK_3,#0 stob ASTACK_3,SCRATCH_REG,garbage_collect_flag,8 .endif .thumb_func no_copy_garbage_collection: .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl add_garbage_collect_time mov BSTACK_0,HEAP_PTR lao SCRATCH_REG,heap_p3,8 ldo SCRATCH_REG,SCRATCH_REG,heap_p3,8 subs BSTACK_0,BSTACK_0,SCRATCH_REG lao SCRATCH_REG,n_allocated_words,6 ldo BSTACK_1,SCRATCH_REG,n_allocated_words,6 add BSTACK_0,BSTACK_0,BSTACK_1,lsl #2 b end_garbage_collect .thumb_func stack_overflow: .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl add_execute_time lao ASTACK_2,stack_overflow_string,0 otoa ASTACK_2,stack_overflow_string,0 b print_error IO_error: str r0,[BSTACK_PTR] lao r0,IO_error_string,0 otoa r0,IO_error_string,0 store_global_registers bl ew_print_string ldr r0,[BSTACK_PTR],#4 bl ew_print_string lao r0,new_line_string,0 otoa r0,new_line_string,0 bl ew_print_string load_global_registers b halt .thumb_func print_error: mov r0,ASTACK_2 store_global_registers bl ew_print_string load_global_registers .thumb_func halt: lao SCRATCH_REG,halt_sp,3 ldo BSTACK_PTR,SCRATCH_REG,halt_sp,3 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl write_profile_stack .endif b exit .ifdef PIC lto stack_top,1 lto heap_size_33,4 lto heap_p3,5 lto heap_end_after_gc,7 lto n_allocated_words,4 lto heap_size,7 .if MARK_GC || COMPACT_GC_ONLY .if MARK_GC && ADJUST_HEAP_SIZE .if MARK_AND_COPY_GC lto flags,13 .endif lto heap_p3,6 lto n_allocated_words,5 lto heap_size_33,5 lto heap_size_multiple,2 lto heap_end_after_gc,8 lto bit_vector_size,2 .endif .else lto heap_size,8 lto heap_p,2 lto heap_p1,8 lto heap_size_129,3 lto heap_copied_vector,3 lto heap_end_after_gc,9 lto heap_copied_vector_size,4 lto heap_p2,8 lto heap_p3,7 lto heap_vector,5 lto heap_vector,6 lto extra_heap,4 lto extra_heap_size,4 lto garbage_collect_flag,7 lto garbage_collect_flag,8 .endif lto heap_p3,8 lto n_allocated_words,6 lto stack_overflow_string,0 lto IO_error_string,0 lto new_line_string,0 lto halt_sp,3 .endif .ltorg .thumb_func e__system__eaind: .thumb_func eval_fill: str ASTACK_0,[ASTACK_PTR],#4 mov ASTACK_0,ASTACK_1 ldr SCRATCH_REG,[ASTACK_1] .align add lr,pc,#7 str lr,[BSTACK_PTR,#-4]! blx SCRATCH_REG mov ASTACK_1,ASTACK_0 ldr ASTACK_0,[ASTACK_PTR,#-4]! ldr ASTACK_2,[ASTACK_1] str ASTACK_2,[ASTACK_0] ldr ASTACK_2,[ASTACK_1,#4] str ASTACK_2,[ASTACK_0,#4] ldr ASTACK_2,[ASTACK_1,#8] str ASTACK_2,[ASTACK_0,#8] ldr pc,[BSTACK_PTR],#4 .p2align 2 b e__system__eaind nop nop .ifdef PIC .long e__system__dind-. .else .long e__system__dind .endif .long -2 .thumb_func e__system__nind: .thumb_func __indirection: ldr ASTACK_1,[ASTACK_0,#4] ldr BSTACK_0,[ASTACK_1] tst BSTACK_0,#2 .if MARK_GC beq eval_fill2 .else beq __cycle__in__spine .endif str BSTACK_0,[ASTACK_0] ldr ASTACK_2,[ASTACK_1,#4] str ASTACK_2,[ASTACK_0,#4] ldr ASTACK_2,[ASTACK_1,#8] str ASTACK_2,[ASTACK_0,#8] ldr pc,[BSTACK_PTR],#4 .if MARK_GC eval_fill2: lao SCRATCH_REG,__cycle__in__spine,0 otoa SCRATCH_REG,__cycle__in__spine,0 str SCRATCH_REG,[ASTACK_0] str ASTACK_0,[ASTACK_PTR] .if MARK_AND_COPY_GC lao SCRATCH_REG,flags,14 ldo SCRATCH_REG,SCRATCH_REG,flags,14 tst SCRATCH_REG,#64 beq __cycle__in__spine .endif add ASTACK_PTR,ASTACK_PTR,#4 mov ASTACK_0,ASTACK_1 .align add lr,pc,#7 str lr,[BSTACK_PTR,#-4]! blx BSTACK_0 mov ASTACK_1,ASTACK_0 ldr ASTACK_0,[ASTACK_PTR,#-4]! ldr ASTACK_2,[ASTACK_1] str ASTACK_2,[ASTACK_0] ldr ASTACK_2,[ASTACK_1,#4] str ASTACK_2,[ASTACK_0,#4] ldr ASTACK_2,[ASTACK_1,#8] str ASTACK_2,[ASTACK_0,#8] ldr pc,[BSTACK_PTR],#4 .endif .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_0: lao SCRATCH_REG,e__system__nind,0 otoa SCRATCH_REG,e__system__nind,0 str SCRATCH_REG,[ASTACK_1] str ASTACK_0,[ASTACK_1,#4] mov pc,ASTACK_3 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_1: lao SCRATCH_REG,e__system__nind,1 otoa SCRATCH_REG,e__system__nind,1 str SCRATCH_REG,[ASTACK_1] ldr BSTACK_0,[ASTACK_1,#4] str ASTACK_0,[ASTACK_1,#4] mov ASTACK_1,BSTACK_0 mov pc,ASTACK_3 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_2: lao SCRATCH_REG,e__system__nind,2 otoa SCRATCH_REG,e__system__nind,2 str SCRATCH_REG,[ASTACK_1] ldr ASTACK_2,[ASTACK_1,#4] str ASTACK_0,[ASTACK_1,#4] ldr ASTACK_1,[ASTACK_1,#8] mov pc,ASTACK_3 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_3: lao SCRATCH_REG,e__system__nind,3 otoa SCRATCH_REG,e__system__nind,3 str SCRATCH_REG,[ASTACK_1] ldr ASTACK_2,[ASTACK_1,#4] str ASTACK_0,[ASTACK_1,#4] str ASTACK_0,[ASTACK_PTR],#4 ldr ASTACK_0,[ASTACK_1,#12] ldr ASTACK_1,[ASTACK_1,#8] mov pc,ASTACK_3 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_4: lao SCRATCH_REG,e__system__nind,4 otoa SCRATCH_REG,e__system__nind,4 str SCRATCH_REG,[ASTACK_1] ldr ASTACK_2,[ASTACK_1,#4] str ASTACK_0,[ASTACK_1,#4] str ASTACK_0,[ASTACK_PTR] ldr BSTACK_1,[ASTACK_1,#16] str BSTACK_1,[ASTACK_PTR,#4] add ASTACK_PTR,ASTACK_PTR,#8 ldr ASTACK_0,[ASTACK_1,#12] ldr ASTACK_1,[ASTACK_1,#8] mov pc,ASTACK_3 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_5: lao SCRATCH_REG,e__system__nind,5 otoa SCRATCH_REG,e__system__nind,5 str SCRATCH_REG,[ASTACK_1] ldr ASTACK_2,[ASTACK_1,#4] str ASTACK_0,[ASTACK_PTR] str ASTACK_0,[ASTACK_1,#4] ldr BSTACK_1,[ASTACK_1,#20] str BSTACK_1,[ASTACK_PTR,#4] ldr BSTACK_1,[ASTACK_1,#16] str BSTACK_1,[ASTACK_PTR,#8] add ASTACK_PTR,ASTACK_PTR,#12 ldr ASTACK_0,[ASTACK_1,#12] ldr ASTACK_1,[ASTACK_1,#8] mov pc,ASTACK_3 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_6: lao SCRATCH_REG,e__system__nind,6 otoa SCRATCH_REG,e__system__nind,6 str SCRATCH_REG,[ASTACK_1] ldr ASTACK_2,[ASTACK_1,#4] str ASTACK_0,[ASTACK_PTR] str ASTACK_0,[ASTACK_1,#4] ldr BSTACK_1,[ASTACK_1,#24] str BSTACK_1,[ASTACK_PTR,#4] ldr BSTACK_1,[ASTACK_1,#20] str BSTACK_1,[ASTACK_PTR,#8] ldr BSTACK_1,[ASTACK_1,#16] str BSTACK_1,[ASTACK_PTR,#12] add ASTACK_PTR,ASTACK_PTR,#16 ldr ASTACK_0,[ASTACK_1,#12] ldr ASTACK_1,[ASTACK_1,#8] mov pc,ASTACK_3 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_7: mov BSTACK_0,#0 mov BSTACK_1,#20 .thumb_func eval_upd_n: lao SCRATCH_REG,e__system__nind,7 otoa SCRATCH_REG,e__system__nind,7 add BSTACK_2,ASTACK_1,BSTACK_1 str SCRATCH_REG,[ASTACK_1] ldr ASTACK_2,[ASTACK_1,#4] str ASTACK_0,[ASTACK_PTR] str ASTACK_0,[ASTACK_1,#4] ldr BSTACK_1,[BSTACK_2,#8] str BSTACK_1,[ASTACK_PTR,#4] ldr BSTACK_1,[BSTACK_2,#4] str BSTACK_1,[ASTACK_PTR,#8] ldr BSTACK_1,[BSTACK_2] str BSTACK_1,[ASTACK_PTR,#12] add ASTACK_PTR,ASTACK_PTR,#16 .thumb_func eval_upd_n_lp: ldr BSTACK_1,[BSTACK_2,#-4]! str BSTACK_1,[ASTACK_PTR],#4 subs BSTACK_0,BSTACK_0,#1 bcs eval_upd_n_lp ldr ASTACK_0,[ASTACK_1,#12] ldr ASTACK_1,[ASTACK_1,#8] mov pc,ASTACK_3 .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_8: mov BSTACK_0,#1 mov BSTACK_1,#24 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_9: mov BSTACK_0,#2 mov BSTACK_1,#28 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_10: mov BSTACK_0,#3 mov BSTACK_1,#32 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_11: mov BSTACK_0,#4 mov BSTACK_1,#36 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_12: mov BSTACK_0,#5 mov BSTACK_1,#40 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_13: mov BSTACK_0,#6 mov BSTACK_1,#44 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_14: mov BSTACK_0,#7 mov BSTACK_1,#48 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_15: mov BSTACK_0,#8 mov BSTACK_1,#52 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_16: mov BSTACK_0,#9 mov BSTACK_1,#56 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_17: mov BSTACK_0,#10 mov BSTACK_1,#60 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_18: mov BSTACK_0,#11 mov BSTACK_1,#64 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_19: mov BSTACK_0,#12 mov BSTACK_1,#68 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_20: mov BSTACK_0,#13 mov BSTACK_1,#72 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_21: mov BSTACK_0,#14 mov BSTACK_1,#76 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_22: mov BSTACK_0,#15 mov BSTACK_1,#80 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_23: mov BSTACK_0,#16 mov BSTACK_1,#84 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_24: mov BSTACK_0,#17 mov BSTACK_1,#88 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_25: mov BSTACK_0,#18 mov BSTACK_1,#92 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_26: mov BSTACK_0,#19 mov BSTACK_1,#96 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_27: mov BSTACK_0,#20 mov BSTACK_1,#100 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_28: mov BSTACK_0,#21 mov BSTACK_1,#104 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_29: mov BSTACK_0,#22 mov BSTACK_1,#108 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_30: mov BSTACK_0,#23 mov BSTACK_1,#112 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_31: mov BSTACK_0,#24 mov BSTACK_1,#116 b eval_upd_n .ifdef PROFILE .align add lr,pc,#9 str lr,[BSTACK_PTR,#-4]! bl profile_n mov ASTACK_2,BSTACK_0 .endif eval_upd_32: mov BSTACK_0,#25 mov BSTACK_1,#120 b eval_upd_n @ @ STRINGS @ .section .text. (catAC) catAC: ldr BSTACK_0,[ASTACK_0,#4] ldr BSTACK_1,[ASTACK_1,#4] add ASTACK_2,BSTACK_0,BSTACK_1 add ASTACK_2,ASTACK_2,#8+3 lsr ASTACK_2,ASTACK_2,#2 subs HEAP_FREE,HEAP_FREE,ASTACK_2 blo gc_3 gc_r_3: add ASTACK_0,ASTACK_0,#8 add ASTACK_1,ASTACK_1,#8 @ fill_node str HEAP_PTR,[BSTACK_PTR,#-4]! laol SCRATCH_REG,__STRING__+2,__STRING___o_2,1 otoa SCRATCH_REG,__STRING___o_2,1 str SCRATCH_REG,[HEAP_PTR] @ store length add ASTACK_2,BSTACK_0,BSTACK_1 str ASTACK_2,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 @ copy string 1 add ASTACK_2,BSTACK_1,#3 add BSTACK_1,BSTACK_1,HEAP_PTR lsrs ASTACK_2,ASTACK_2,#2 beq catAC_after_copy_lp1 catAC_copy_lp1: ldr SCRATCH_REG,[ASTACK_1],#4 str SCRATCH_REG,[HEAP_PTR],#4 subs ASTACK_2,ASTACK_2,#1 bne catAC_copy_lp1 catAC_after_copy_lp1: mov HEAP_PTR,BSTACK_1 @ copy_string 2 cat_string_6: lsrs ASTACK_2,BSTACK_0,#2 beq cat_string_9 cat_string_7: ldr BSTACK_1,[ASTACK_0],#4 @ store not aligned str BSTACK_1,[HEAP_PTR],#4 subs ASTACK_2,ASTACK_2,#1 bne cat_string_7 cat_string_9: tst BSTACK_0,#2 beq cat_string_10 ldrh BSTACK_1,[ASTACK_0],#2 strh BSTACK_1,[HEAP_PTR],#2 cat_string_10: tst BSTACK_0,#1 beq cat_string_11 ldrb BSTACK_1,[ASTACK_0] strb BSTACK_1,[HEAP_PTR],#1 cat_string_11: ldr ASTACK_0,[BSTACK_PTR],#4 @ align heap pointer add HEAP_PTR,HEAP_PTR,#3 and HEAP_PTR,HEAP_PTR,#-4 ldr pc,[BSTACK_PTR],#4 gc_3: bl collect_2 b gc_r_3 .thumb_func empty_string: lao ASTACK_0,zero_length_string,0 otoa ASTACK_0,zero_length_string,0 ldr pc,[BSTACK_PTR],#4 .ifdef PIC ltol __STRING__+2,__STRING___o_2,1 lto zero_length_string,0 .endif .section .text.sliceAC,"ax" sliceAC: ldr ASTACK_2,[ASTACK_0,#4] tst BSTACK_1,BSTACK_1 bpl slice_string_1 mov BSTACK_1,#0 slice_string_1: cmp BSTACK_1,ASTACK_2 bge empty_string cmp BSTACK_0,BSTACK_1 blt empty_string add BSTACK_0,BSTACK_0,#1 cmp BSTACK_0,ASTACK_2 ble slice_string_2 mov BSTACK_0,ASTACK_2 slice_string_2: subs BSTACK_0,BSTACK_0,BSTACK_1 add ASTACK_2,BSTACK_0,#8+3 lsr ASTACK_2,ASTACK_2,#2 subs HEAP_FREE,HEAP_FREE,ASTACK_2 blo gc_4 r_gc_4: subs ASTACK_2,ASTACK_2,#2 add SCRATCH_REG,ASTACK_0,#8 add ASTACK_1,SCRATCH_REG,BSTACK_1 laol SCRATCH_REG,__STRING__+2,__STRING___o_2,2 otoa SCRATCH_REG,__STRING___o_2,2 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] @ copy part of string mov ASTACK_0,HEAP_PTR add HEAP_PTR,HEAP_PTR,#8 cmp ASTACK_2,#0 beq sliceAC_after_copy_lp sliceAC_copy_lp: @ load not aligned ldr SCRATCH_REG,[ASTACK_1],#4 str SCRATCH_REG,[HEAP_PTR],#4 subs ASTACK_2,ASTACK_2,#1 bne sliceAC_copy_lp sliceAC_after_copy_lp: ldr pc,[BSTACK_PTR],#4 gc_4: bl collect_1 add ASTACK_2,BSTACK_0,#8+3 lsr ASTACK_2,ASTACK_2,#2 b r_gc_4 .ifdef PIC ltol __STRING__+2,__STRING___o_2,2 .endif .section .text.updateAC,"ax" updateAC: ldr ASTACK_2,[ASTACK_0,#4] cmp BSTACK_1,ASTACK_2 bhs update_string_error add ASTACK_2,ASTACK_2,#8+3 lsr ASTACK_2,ASTACK_2,#2 subs HEAP_FREE,HEAP_FREE,ASTACK_2 blo gc_5 r_gc_5: ldr ASTACK_2,[ASTACK_0,#4] add ASTACK_2,ASTACK_2,#3 lsr ASTACK_2,ASTACK_2,#2 mov ASTACK_1,ASTACK_0 mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__STRING__+2,__STRING___o_2,3 otoa SCRATCH_REG,__STRING___o_2,3 str SCRATCH_REG,[HEAP_PTR] ldr SCRATCH_REG,[ASTACK_1,#4] add ASTACK_1,ASTACK_1,#8 str SCRATCH_REG,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 add BSTACK_1,BSTACK_1,HEAP_PTR cmp ASTACK_2,#0 beq updateAC_after_copy_lp updateAC_copy_lp: ldr SCRATCH_REG,[ASTACK_1],#4 str SCRATCH_REG,[HEAP_PTR],#4 subs ASTACK_2,ASTACK_2,#1 bne updateAC_copy_lp updateAC_after_copy_lp: strb BSTACK_0,[BSTACK_1] ldr pc,[BSTACK_PTR],#4 gc_5: bl collect_1 b r_gc_5 .thumb_func update_string_error: lao ASTACK_2,high_index_string,0 otoa ASTACK_2,high_index_string,0 tst BSTACK_0,BSTACK_0 bpl update_string_error_2 lao ASTACK_2,low_index_string,0 otoa ASTACK_2,low_index_string,0 update_string_error_2: b print_error .ifdef PIC ltol __STRING__+2,__STRING___o_2,3 lto high_index_string,0 lto low_index_string,0 .endif .section .text.eqAC,"ax" eqAC: ldr BSTACK_0,[ASTACK_0,#4] ldr SCRATCH_REG,[ASTACK_1,#4] cmp BSTACK_0,SCRATCH_REG bne equal_string_ne add ASTACK_0,ASTACK_0,#8 add ASTACK_1,ASTACK_1,#8 and BSTACK_1,BSTACK_0,#3 lsrs BSTACK_0,BSTACK_0,#2 beq equal_string_b equal_string_1: ldr ASTACK_2,[ASTACK_0] ldr SCRATCH_REG,[ASTACK_1] cmp ASTACK_2,SCRATCH_REG bne equal_string_ne add ASTACK_0,ASTACK_0,#4 add ASTACK_1,ASTACK_1,#4 subs BSTACK_0,BSTACK_0,#1 bne equal_string_1 .thumb_func equal_string_b: tst BSTACK_1,#2 beq equal_string_2 ldrh BSTACK_0,[ASTACK_0] ldrh SCRATCH_REG,[ASTACK_1] cmp BSTACK_0,SCRATCH_REG bne equal_string_ne add ASTACK_0,ASTACK_0,#2 add ASTACK_1,ASTACK_1,#2 equal_string_2: tst BSTACK_1,#1 beq equal_string_eq ldrb BSTACK_1,[ASTACK_0] ldrb SCRATCH_REG,[ASTACK_1] cmp BSTACK_1,SCRATCH_REG bne equal_string_ne .thumb_func equal_string_eq: mov BSTACK_0,#1 ldr pc,[BSTACK_PTR],#4 .thumb_func equal_string_ne: mov BSTACK_0,#0 ldr pc,[BSTACK_PTR],#4 .section .text.cmpAC,"ax" cmpAC: ldr BSTACK_1,[ASTACK_0,#4] ldr ASTACK_2,[ASTACK_1,#4] add ASTACK_0,ASTACK_0,#8 add ASTACK_1,ASTACK_1,#8 cmp ASTACK_2,BSTACK_1 blo cmp_string_less bhi cmp_string_more mov BSTACK_0,#0 b cmp_string_chars .thumb_func cmp_string_more: mov BSTACK_0,#1 b cmp_string_chars .thumb_func cmp_string_less: mov BSTACK_0,#-1 mov BSTACK_1,ASTACK_2 b cmp_string_chars cmp_string_1: ldr ASTACK_2,[ASTACK_1] ldr SCRATCH_REG,[ASTACK_0] cmp ASTACK_2,SCRATCH_REG bne cmp_string_ne4 add ASTACK_1,ASTACK_1,#4 add ASTACK_0,ASTACK_0,#4 .thumb_func cmp_string_chars: subs BSTACK_1,BSTACK_1,#4 bcs cmp_string_1 .thumb_func cmp_string_b: @ to do compare bytes using and instead of ldrb tst BSTACK_1,#2 beq cmp_string_2 ldrb ASTACK_2,[ASTACK_1] ldrb SCRATCH_REG,[ASTACK_0] cmp ASTACK_2,SCRATCH_REG bne cmp_string_ne ldrb ASTACK_2,[ASTACK_1,#1] ldrb SCRATCH_REG,[ASTACK_0,#1] cmp ASTACK_2,SCRATCH_REG bne cmp_string_ne add ASTACK_1,ASTACK_1,#2 add ASTACK_0,ASTACK_0,#2 cmp_string_2: tst BSTACK_1,#1 beq cmp_string_eq ldrb ASTACK_2,[ASTACK_1] ldrb SCRATCH_REG,[ASTACK_0] cmp ASTACK_2,SCRATCH_REG bne cmp_string_ne .thumb_func cmp_string_eq: ldr pc,[BSTACK_PTR],#4 cmp_string_ne4: @ to do compare bytes using and instead of ldrb ldrb BSTACK_1,[ASTACK_1] ldrb SCRATCH_REG,[ASTACK_0] cmp BSTACK_1,SCRATCH_REG bne cmp_string_ne ldrb BSTACK_1,[ASTACK_1,#1] ldrb SCRATCH_REG,[ASTACK_0,#1] cmp BSTACK_1,SCRATCH_REG bne cmp_string_ne ldrb BSTACK_1,[ASTACK_1,#2] ldrb SCRATCH_REG,[ASTACK_0,#2] cmp BSTACK_1,SCRATCH_REG bne cmp_string_ne ldrb BSTACK_1,[ASTACK_1,#3] ldrb SCRATCH_REG,[ASTACK_0,#3] cmp BSTACK_1,SCRATCH_REG .thumb_func cmp_string_ne: bhi cmp_string_r1 mov BSTACK_0,#-1 ldr pc,[BSTACK_PTR],#4 cmp_string_r1: mov BSTACK_0,#1 ldr pc,[BSTACK_PTR],#4 .section .text.string_to_string_node,"ax" .thumb_func string_to_string_node: ldr ASTACK_2,[ASTACK_0],#4 add BSTACK_0,ASTACK_2,#3 lsr BSTACK_0,BSTACK_0,#2 add SCRATCH_REG,BSTACK_0,#2 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG blo string_to_string_node_gc .thumb_func string_to_string_node_r: laol SCRATCH_REG,__STRING__+2,__STRING___o_2,4 otoa SCRATCH_REG,__STRING___o_2,4 str SCRATCH_REG,[HEAP_PTR] str ASTACK_2,[HEAP_PTR,#4] mov ASTACK_2,HEAP_PTR add HEAP_PTR,HEAP_PTR,#8 b string_to_string_node_4 string_to_string_node_2: ldr SCRATCH_REG,[ASTACK_0],#4 str SCRATCH_REG,[HEAP_PTR],#4 string_to_string_node_4: subs BSTACK_0,BSTACK_0,#1 bge string_to_string_node_2 mov ASTACK_0,ASTACK_2 ldr pc,[BSTACK_PTR],#4 .thumb_func string_to_string_node_gc: stmdb BSTACK_PTR!,{ASTACK_2,ASTACK_0} bl collect_0 ldmia BSTACK_PTR!,{ASTACK_2,ASTACK_0} b string_to_string_node_r .ifdef PIC ltol __STRING__+2,__STRING___o_2,4 .endif .section .text.int_array_to_node,"ax" .thumb_func int_array_to_node: ldr BSTACK_0,[ASTACK_0,#-8] add SCRATCH_REG,BSTACK_0,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG blo int_array_to_node_gc .thumb_func int_array_to_node_r: laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,0 otoa SCRATCH_REG,__ARRAY___o_2,0 str SCRATCH_REG,[HEAP_PTR] mov ASTACK_1,ASTACK_0 str BSTACK_0,[HEAP_PTR,#4] mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,INT+2,INT_o_2,3 otoa SCRATCH_REG,INT_o_2,3 str SCRATCH_REG,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 b int_array_to_node_4 int_array_to_node_2: ldr SCRATCH_REG,[ASTACK_1],#4 str SCRATCH_REG,[HEAP_PTR],#4 int_array_to_node_4: subs BSTACK_0,BSTACK_0,#1 bge int_array_to_node_2 ldr pc,[BSTACK_PTR],#4 .thumb_func int_array_to_node_gc: str ASTACK_0,[BSTACK_PTR,#-4]! bl collect_0 ldr ASTACK_0,[BSTACK_PTR],#4 b int_array_to_node_r .ifdef PIC ltol __ARRAY__+2,__ARRAY___o_2,0 ltol INT+2,INT_o_2,3 .endif .section .text.real_array_to_node,"ax" .thumb_func real_array_to_node: ldr BSTACK_0,[ASTACK_0,#-8] add SCRATCH_REG,BSTACK_0,#3+1 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG blo real_array_to_node_gc .thumb_func real_array_to_node_r: tst HEAP_PTR,#4 orr HEAP_PTR,HEAP_PTR,#4 it ne addne HEAP_FREE,HEAP_FREE,#1 mov ASTACK_1,ASTACK_0 laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,1 otoa SCRATCH_REG,__ARRAY___o_2,1 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,REAL+2,REAL_o_2,2 otoa SCRATCH_REG,REAL_o_2,2 str SCRATCH_REG,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 b real_array_to_node_4 real_array_to_node_2: ldr SCRATCH_REG,[ASTACK_1] str SCRATCH_REG,[HEAP_PTR] ldr ASTACK_2,[ASTACK_1,#4] add ASTACK_1,ASTACK_1,#8 str ASTACK_2,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 real_array_to_node_4: subs BSTACK_0,BSTACK_0,#1 bge real_array_to_node_2 ldr pc,[BSTACK_PTR],#4 .thumb_func real_array_to_node_gc: str ASTACK_0,[BSTACK_PTR,#-4]! bl collect_0 ldr ASTACK_0,[BSTACK_PTR],#4 b real_array_to_node_r .ifdef PIC ltol __ARRAY__+2,__ARRAY___o_2,1 ltol REAL+2,REAL_o_2,2 .endif .text .p2align 2 .long 3 _c3: b __cycle__in__spine .p2align 2 .long 4 _c4: b __cycle__in__spine .p2align 2 .long 5 _c5: b __cycle__in__spine .p2align 2 .long 6 _c6: b __cycle__in__spine .p2align 2 .long 7 _c7: b __cycle__in__spine .p2align 2 .long 8 _c8: b __cycle__in__spine .p2align 2 .long 9 _c9: b __cycle__in__spine .p2align 2 .long 10 _c10: b __cycle__in__spine .p2align 2 .long 11 _c11: b __cycle__in__spine .p2align 2 .long 12 _c12: b __cycle__in__spine .p2align 2 .long 13 _c13: b __cycle__in__spine .p2align 2 .long 14 _c14: b __cycle__in__spine .p2align 2 .long 15 _c15: b __cycle__in__spine .p2align 2 .long 16 _c16: b __cycle__in__spine .p2align 2 .long 17 _c17: b __cycle__in__spine .p2align 2 .long 18 _c18: b __cycle__in__spine .p2align 2 .long 19 _c19: b __cycle__in__spine .p2align 2 .long 20 _c20: b __cycle__in__spine .p2align 2 .long 21 _c21: b __cycle__in__spine .p2align 2 .long 22 _c22: b __cycle__in__spine .p2align 2 .long 23 _c23: b __cycle__in__spine .p2align 2 .long 24 _c24: b __cycle__in__spine .p2align 2 .long 25 _c25: b __cycle__in__spine .p2align 2 .long 26 _c26: b __cycle__in__spine .p2align 2 .long 27 _c27: b __cycle__in__spine .p2align 2 .long 28 _c28: b __cycle__in__spine .p2align 2 .long 29 _c29: b __cycle__in__spine .p2align 2 .long 30 _c30: b __cycle__in__spine .p2align 2 .long 31 _c31: b __cycle__in__spine .p2align 2 .long 32 _c32: b __cycle__in__spine @ @ ARRAYS @ _create_arrayB: add BSTACK_1,BSTACK_0,#3 lsr BSTACK_1,BSTACK_1,#2 add SCRATCH_REG,BSTACK_1,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4574 bl collect_0 no_collect_4574: mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,2 otoa SCRATCH_REG,__ARRAY___o_2,2 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] laol SCRATCH_REG,BOOL+2,BOOL_o_2,2 otoa SCRATCH_REG,BOOL_o_2,2 str SCRATCH_REG,[HEAP_PTR,#8] add SCRATCH_REG,HEAP_PTR,#12 add HEAP_PTR,SCRATCH_REG,BSTACK_1,lsl #2 ldr pc,[BSTACK_PTR],#4 _create_arrayC: add BSTACK_1,BSTACK_0,#3 lsr BSTACK_1,BSTACK_1,#2 add SCRATCH_REG,BSTACK_1,#2 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4573 bl collect_0 no_collect_4573: mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__STRING__+2,__STRING___o_2,5 otoa SCRATCH_REG,__STRING___o_2,5 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] add SCRATCH_REG,HEAP_PTR,#8 add HEAP_PTR,SCRATCH_REG,BSTACK_1,lsl #2 ldr pc,[BSTACK_PTR],#4 _create_arrayI: add SCRATCH_REG,BSTACK_0,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4572 bl collect_0 no_collect_4572: mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,3 otoa SCRATCH_REG,__ARRAY___o_2,3 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] laol SCRATCH_REG,INT+2,INT_o_2,4 otoa SCRATCH_REG,INT_o_2,4 str SCRATCH_REG,[HEAP_PTR,#8] add SCRATCH_REG,HEAP_PTR,#12 add HEAP_PTR,SCRATCH_REG,BSTACK_0,lsl #2 ldr pc,[BSTACK_PTR],#4 _create_arrayR: add SCRATCH_REG,BSTACK_0,BSTACK_0 add SCRATCH_REG,SCRATCH_REG,#3+1 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4580 bl collect_0 no_collect_4580: tst HEAP_PTR,#4 orr HEAP_PTR,HEAP_PTR,#4 it ne addne HEAP_FREE,HEAP_FREE,#1 mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,4 otoa SCRATCH_REG,__ARRAY___o_2,4 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] laol SCRATCH_REG,REAL+2,REAL_o_2,3 otoa SCRATCH_REG,REAL_o_2,3 str SCRATCH_REG,[HEAP_PTR,#8] add SCRATCH_REG,HEAP_PTR,#12 add HEAP_PTR,SCRATCH_REG,BSTACK_0,lsl #3 ldr pc,[BSTACK_PTR],#4 @ BSTACK_0: number of elements, BSTACK_1: element descriptor @ BSTACK_2: element size, BSTACK_3: element a size, a0:a_element-> a0: array .thumb_func _create_r_array: mul SCRATCH_REG,BSTACK_0,BSTACK_2 add SCRATCH_REG,SCRATCH_REG,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4586 bl collect_1 no_collect_4586: mov ASTACK_2,ASTACK_0 laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,5 otoa SCRATCH_REG,__ARRAY___o_2,5 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] str BSTACK_1,[HEAP_PTR,#8] mov ASTACK_0,HEAP_PTR add HEAP_PTR,HEAP_PTR,#12 @ BSTACK_0: number of elements, a0: array @ BSTACK_2: element size, BSTACK_3: element a size, a2:a_element cmp BSTACK_3,#0 beq _create_r_array_0 cmp BSTACK_3,#2 blo _create_r_array_1 beq _create_r_array_2 cmp BSTACK_3,#4 blo _create_r_array_3 beq _create_r_array_4 b _create_r_array_5 _create_r_array_0: lsl BSTACK_2,BSTACK_2,#2 mul SCRATCH_REG,BSTACK_0,BSTACK_2 add HEAP_PTR,HEAP_PTR,SCRATCH_REG ldr pc,[BSTACK_PTR],#4 _create_r_array_1: lsl BSTACK_2,BSTACK_2,#2 b _st_fillBSTACK_3_array _fillBSTACK_3_array: str ASTACK_2,[HEAP_PTR] add HEAP_PTR,HEAP_PTR,BSTACK_2 _st_fillBSTACK_3_array: subs BSTACK_0,BSTACK_0,#1 bcs _fillBSTACK_3_array ldr pc,[BSTACK_PTR],#4 _create_r_array_2: lsl BSTACK_2,BSTACK_2,#2 b _st_fillBSTACK_2_array _fillBSTACK_2_array: str ASTACK_2,[HEAP_PTR] str ASTACK_2,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,BSTACK_2 _st_fillBSTACK_2_array: subs BSTACK_0,BSTACK_0,#1 bcs _fillBSTACK_2_array ldr pc,[BSTACK_PTR],#4 _create_r_array_3: lsl BSTACK_2,BSTACK_2,#2 b _st_fillBSTACK_1_array _fillBSTACK_1_array: str ASTACK_2,[HEAP_PTR] str ASTACK_2,[HEAP_PTR,#4] str ASTACK_2,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,BSTACK_2 _st_fillBSTACK_1_array: subs BSTACK_0,BSTACK_0,#1 bcs _fillBSTACK_1_array ldr pc,[BSTACK_PTR],#4 _create_r_array_4: lsl BSTACK_2,BSTACK_2,#2 b _st_fillBSTACK_0_array _fillBSTACK_0_array: str ASTACK_2,[HEAP_PTR] str ASTACK_2,[HEAP_PTR,#4] str ASTACK_2,[HEAP_PTR,#8] str ASTACK_2,[HEAP_PTR,#12] add HEAP_PTR,HEAP_PTR,BSTACK_2 _st_fillBSTACK_0_array: subs BSTACK_0,BSTACK_0,#1 bcs _fillBSTACK_0_array ldr pc,[BSTACK_PTR],#4 _create_r_array_5: sub BSTACK_2,BSTACK_2,BSTACK_3 lsl BSTACK_2,BSTACK_2,#2 b _st_fillr5_array _fillr5_array: str ASTACK_2,[HEAP_PTR] str ASTACK_2,[HEAP_PTR,#4] str ASTACK_2,[HEAP_PTR,#8] str ASTACK_2,[HEAP_PTR,#12] add HEAP_PTR,HEAP_PTR,#16 sub BSTACK_1,BSTACK_3,#5 _copy_elem_5_lp: str ASTACK_2,[HEAP_PTR],#4 subs BSTACK_1,BSTACK_1,#1 bcs _copy_elem_5_lp add HEAP_PTR,HEAP_PTR,BSTACK_2 _st_fillr5_array: subs BSTACK_0,BSTACK_0,#1 bcs _fillr5_array ldr pc,[BSTACK_PTR],#4 create_arrayB: mov ASTACK_1,BSTACK_1 add BSTACK_1,BSTACK_1,#3 lsr BSTACK_1,BSTACK_1,#2 add SCRATCH_REG,BSTACK_1,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4575 str ASTACK_1,[BSTACK_PTR,#-4]! bl collect_0 ldr ASTACK_1,[BSTACK_PTR],#4 no_collect_4575: orr BSTACK_0,BSTACK_0,BSTACK_0,lsl #8 orr BSTACK_0,BSTACK_0,BSTACK_0,lsl #16 mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,6 otoa SCRATCH_REG,__ARRAY___o_2,6 str SCRATCH_REG,[HEAP_PTR] str ASTACK_1,[HEAP_PTR,#4] laol SCRATCH_REG,BOOL+2,BOOL_o_2,3 otoa SCRATCH_REG,BOOL_o_2,3 str SCRATCH_REG,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 b create_arrayBCI create_arrayC: mov ASTACK_1,BSTACK_1 add BSTACK_1,BSTACK_1,#3 lsr BSTACK_1,BSTACK_1,#2 add SCRATCH_REG,BSTACK_1,#2 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4578 str ASTACK_1,[BSTACK_PTR,#-4]! bl collect_0 ldr ASTACK_1,[BSTACK_PTR],#4 no_collect_4578: orr BSTACK_0,BSTACK_0,BSTACK_0,lsl #8 orr BSTACK_0,BSTACK_0,BSTACK_0,lsl #16 mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__STRING__+2,__STRING___o_2,6 otoa SCRATCH_REG,__STRING___o_2,6 str SCRATCH_REG,[HEAP_PTR] str ASTACK_1,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 b create_arrayBCI create_arrayI: add SCRATCH_REG,BSTACK_1,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4577 bl collect_0 no_collect_4577: mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,7 otoa SCRATCH_REG,__ARRAY___o_2,7 str SCRATCH_REG,[HEAP_PTR] str BSTACK_1,[HEAP_PTR,#4] laol SCRATCH_REG,INT+2,INT_o_2,5 otoa SCRATCH_REG,INT_o_2,5 str SCRATCH_REG,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 create_arrayBCI: tst BSTACK_1,#1 lsr BSTACK_1,BSTACK_1,#1 beq st_filli_array str BSTACK_0,[HEAP_PTR],#4 b st_filli_array .thumb_func filli_array: str BSTACK_0,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 .thumb_func st_filli_array: subs BSTACK_1,BSTACK_1,#1 bcs filli_array ldr pc,[BSTACK_PTR],#4 create_arrayR: add SCRATCH_REG,BSTACK_0,BSTACK_0 add SCRATCH_REG,SCRATCH_REG,#3+1 vmov BSTACK_1,ASTACK_1,d0 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4579 str ASTACK_1,[BSTACK_PTR,#-4]! bl collect_0 ldr ASTACK_1,[BSTACK_PTR],#4 no_collect_4579: tst HEAP_PTR,#4 orr HEAP_PTR,HEAP_PTR,#4 it ne addne HEAP_FREE,HEAP_FREE,#1 mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,8 otoa SCRATCH_REG,__ARRAY___o_2,8 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] laol SCRATCH_REG,REAL+2,REAL_o_2,4 otoa SCRATCH_REG,REAL_o_2,4 str SCRATCH_REG,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 b st_fillr_array .thumb_func fillr_array: str BSTACK_1,[HEAP_PTR] str ASTACK_1,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 .thumb_func st_fillr_array: subs BSTACK_0,BSTACK_0,#1 bcs fillr_array ldr pc,[BSTACK_PTR],#4 .thumb_func create_array: add SCRATCH_REG,BSTACK_0,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4576 bl collect_1 no_collect_4576: mov BSTACK_1,ASTACK_0 mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,9 otoa SCRATCH_REG,__ARRAY___o_2,9 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] mov SCRATCH_REG,#0 str SCRATCH_REG,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 mov BSTACK_3,BSTACK_0 b fillBSTACK_3_array @ in BSTACK_0: number of elements, BSTACK_1: element descriptor @ BSTACK_2: element size, BSTACK_3: element a size -> a0: array create_R_array: cmp BSTACK_2,#2 blo create_R_array_1 beq create_R_array_2 cmp BSTACK_2,#4 blo create_R_array_3 beq create_R_array_4 b create_R_array_5 create_R_array_1: @ BSTACK_0: number of elements, BSTACK_1: element descriptor @ BSTACK_3: element a size add SCRATCH_REG,BSTACK_0,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4581 bl collect_0 no_collect_4581: mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,10 otoa SCRATCH_REG,__ARRAY___o_2,10 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] str BSTACK_1,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 cmp BSTACK_3,#0 beq r_array_1_b ldr BSTACK_1,[ASTACK_PTR,#-4] b fillBSTACK_3_array r_array_1_b: ldr BSTACK_1,[BSTACK_PTR,#4] fillBSTACK_3_array: tst BSTACK_0,#1 lsr BSTACK_0,BSTACK_0,#1 beq st_fillBSTACK_3_array_1 str BSTACK_1,[HEAP_PTR],#4 b st_fillBSTACK_3_array_1 fillBSTACK_3_array_lp: str BSTACK_1,[HEAP_PTR] str BSTACK_1,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 st_fillBSTACK_3_array_1: subs BSTACK_0,BSTACK_0,#1 bcs fillBSTACK_3_array_lp ldr pc,[BSTACK_PTR],#4 create_R_array_2: @ BSTACK_0: number of elements, BSTACK_1: element descriptor @ BSTACK_3: element a size add SCRATCH_REG,BSTACK_0,BSTACK_0 add SCRATCH_REG,SCRATCH_REG,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4582 bl collect_0 no_collect_4582: mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,11 otoa SCRATCH_REG,__ARRAY___o_2,11 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] str BSTACK_1,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 subs BSTACK_3,BSTACK_3,#1 blo r_array_2_bb beq r_array_2_ab r_array_2_aa: ldr BSTACK_1,[ASTACK_PTR,#-4] ldr ASTACK_2,[ASTACK_PTR,#-8] b st_fillBSTACK_2_array r_array_2_ab: ldr BSTACK_1,[ASTACK_PTR,#-4] ldr ASTACK_2,[BSTACK_PTR,#4] b st_fillBSTACK_2_array r_array_2_bb: ldr BSTACK_1,[BSTACK_PTR,#4] ldr ASTACK_2,[BSTACK_PTR,#8] b st_fillBSTACK_2_array fillBSTACK_2_array_1: str BSTACK_1,[HEAP_PTR] str ASTACK_2,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 st_fillBSTACK_2_array: subs BSTACK_0,BSTACK_0,#1 bcs fillBSTACK_2_array_1 ldr pc,[BSTACK_PTR],#4 create_R_array_3: @ BSTACK_0: number of elements, BSTACK_1: element descriptor @ BSTACK_3: element a size add SCRATCH_REG,BSTACK_0,BSTACK_0,lsl #1 add SCRATCH_REG,SCRATCH_REG,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4583 bl collect_0 no_collect_4583: mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,12 otoa SCRATCH_REG,__ARRAY___o_2,12 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] str BSTACK_1,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 ldr lr,[BSTACK_PTR],#4 mov BSTACK_2,BSTACK_PTR cmp BSTACK_3,#0 beq r_array_3 sub ASTACK_2,ASTACK_PTR,BSTACK_3,lsl #2 subs BSTACK_3,BSTACK_3,#1 copy_a_to_b_lp3: ldr SCRATCH_REG,[ASTACK_2],#4 str SCRATCH_REG,[BSTACK_PTR,#-4]! subs BSTACK_3,BSTACK_3,#1 bcs copy_a_to_b_lp3 r_array_3: ldr BSTACK_1,[BSTACK_PTR] ldr ASTACK_1,[BSTACK_PTR,#4] ldr ASTACK_2,[BSTACK_PTR,#8] mov BSTACK_PTR,BSTACK_2 b st_fillBSTACK_1_array fillBSTACK_1_array_1: str BSTACK_1,[HEAP_PTR] str ASTACK_1,[HEAP_PTR,#4] str ASTACK_2,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 st_fillBSTACK_1_array: subs BSTACK_0,BSTACK_0,#1 bcs fillBSTACK_1_array_1 bx lr create_R_array_4: @ BSTACK_0: number of elements, BSTACK_1: element descriptor @ BSTACK_3: element a size lsl SCRATCH_REG,BSTACK_0,#2 add SCRATCH_REG,SCRATCH_REG,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4584 bl collect_0 no_collect_4584: mov ASTACK_0,HEAP_PTR laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,13 otoa SCRATCH_REG,__ARRAY___o_2,13 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] str BSTACK_1,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 ldr lr,[BSTACK_PTR],#4 mov BSTACK_2,BSTACK_PTR cmp BSTACK_3,#0 beq r_array_4 sub ASTACK_2,ASTACK_PTR,BSTACK_3,lsl #2 subs BSTACK_3,BSTACK_3,#1 copy_a_to_b_lp4: ldr SCRATCH_REG,[ASTACK_2],#4 str SCRATCH_REG,[BSTACK_PTR,#-4]! subs BSTACK_3,BSTACK_3,#1 bcs copy_a_to_b_lp4 r_array_4: ldr BSTACK_4,[BSTACK_PTR] ldr BSTACK_1,[BSTACK_PTR,#4] ldr ASTACK_1,[BSTACK_PTR,#8] ldr ASTACK_2,[BSTACK_PTR,#12] mov BSTACK_PTR,BSTACK_2 b st_fillBSTACK_0_array fillBSTACK_0_array: str BSTACK_4,[HEAP_PTR] str BSTACK_1,[HEAP_PTR,#4] str ASTACK_1,[HEAP_PTR,#8] str ASTACK_2,[HEAP_PTR,#12] add HEAP_PTR,HEAP_PTR,#16 st_fillBSTACK_0_array: subs BSTACK_0,BSTACK_0,#1 bcs fillBSTACK_0_array bx lr create_R_array_5: @ BSTACK_0: number of elements, BSTACK_1: element descriptor @ BSTACK_3: element a size, BSTACK_2: element size mul SCRATCH_REG,BSTACK_0,BSTACK_2 add SCRATCH_REG,SCRATCH_REG,#3 subs HEAP_FREE,HEAP_FREE,SCRATCH_REG bhs no_collect_4585 bl collect_0 no_collect_4585: laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,14 otoa SCRATCH_REG,__ARRAY___o_2,14 str SCRATCH_REG,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] str BSTACK_1,[HEAP_PTR,#8] ldr lr,[BSTACK_PTR],#4 mov ASTACK_3,BSTACK_PTR cmp BSTACK_3,#0 beq r_array_5 sub ASTACK_2,ASTACK_PTR,BSTACK_3,lsl #2 subs BSTACK_3,BSTACK_3,#1 copy_a_to_b_lp5: ldr SCRATCH_REG,[ASTACK_2],#4 str SCRATCH_REG,[BSTACK_PTR,#-4]! subs BSTACK_3,BSTACK_3,#1 bcs copy_a_to_b_lp5 r_array_5: mov ASTACK_0,HEAP_PTR add HEAP_PTR,HEAP_PTR,#12 ldr BSTACK_1,[BSTACK_PTR] ldr ASTACK_1,[BSTACK_PTR,#4] b st_fillr5_array fillr5_array_1: str BSTACK_1,[HEAP_PTR] str ASTACK_1,[HEAP_PTR,#4] sub SCRATCH_REG,BSTACK_2,#5 ldr ASTACK_2,[BSTACK_PTR,#8] str ASTACK_2,[HEAP_PTR,#8] ldr ASTACK_2,[BSTACK_PTR,#12] add BSTACK_4,BSTACK_PTR,#16 str ASTACK_2,[HEAP_PTR,#12] add HEAP_PTR,HEAP_PTR,#16 copy_elem_lp5: ldr ASTACK_2,[BSTACK_4],#4 str ASTACK_2,[HEAP_PTR],#4 subs SCRATCH_REG,SCRATCH_REG,#1 bcs copy_elem_lp5 st_fillr5_array: subs BSTACK_0,BSTACK_0,#1 bcs fillr5_array_1 mov BSTACK_PTR,ASTACK_3 bx lr .thumb_func repl_args_b: cmp BSTACK_0,#0 ble repl_args_b_1 subs BSTACK_0,BSTACK_0,#1 beq repl_args_b_4 ldr ASTACK_1,[ASTACK_0,#8] subs BSTACK_1,BSTACK_1,#2 bne repl_args_b_2 str ASTACK_1,[ASTACK_PTR],#4 b repl_args_b_4 repl_args_b_2: add ASTACK_1,ASTACK_1,BSTACK_0,lsl #2 repl_args_b_3: ldr ASTACK_2,[ASTACK_1,#-4]! str ASTACK_2,[ASTACK_PTR],#4 subs BSTACK_0,BSTACK_0,#1 bne repl_args_b_3 repl_args_b_4: ldr ASTACK_2,[ASTACK_0,#4] str ASTACK_2,[ASTACK_PTR],#4 repl_args_b_1: ldr pc,[BSTACK_PTR],#4 .thumb_func push_arg_b: cmp BSTACK_1,#2 blo push_arg_b_1 bne push_arg_b_2 cmp BSTACK_1,BSTACK_0 beq push_arg_b_1 push_arg_b_2: ldr ASTACK_0,[ASTACK_0,#8] subs BSTACK_1,BSTACK_1,#2 push_arg_b_1: ldr ASTACK_0,[ASTACK_0,BSTACK_1,lsl #2] ldr pc,[BSTACK_PTR],#4 .thumb_func del_args: ldr BSTACK_1,[ASTACK_0] subs BSTACK_1,BSTACK_1,BSTACK_0 ldrsh BSTACK_0,[BSTACK_1,#-2] subs BSTACK_0,BSTACK_0,#2 bge del_args_2 str BSTACK_1,[ASTACK_1] ldr ASTACK_2,[ASTACK_0,#4] str ASTACK_2,[ASTACK_1,#4] ldr ASTACK_2,[ASTACK_0,#8] str ASTACK_2,[ASTACK_1,#8] ldr pc,[BSTACK_PTR],#4 del_args_2: bne del_args_3 str BSTACK_1,[ASTACK_1] ldr ASTACK_2,[ASTACK_0,#4] str ASTACK_2,[ASTACK_1,#4] ldr ASTACK_2,[ASTACK_0,#8] ldr ASTACK_2,[ASTACK_2] str ASTACK_2,[ASTACK_1,#8] ldr pc,[BSTACK_PTR],#4 del_args_3: subs HEAP_FREE,HEAP_FREE,BSTACK_0 blo del_args_gc .thumb_func del_args_r_gc: str BSTACK_1,[ASTACK_1] str HEAP_PTR,[ASTACK_1,#8] ldr ASTACK_2,[ASTACK_0,#4] ldr ASTACK_0,[ASTACK_0,#8] str ASTACK_2,[ASTACK_1,#4] .thumb_func del_args_copy_args: ldr ASTACK_2,[ASTACK_0],#4 str ASTACK_2,[HEAP_PTR],#4 subs BSTACK_0,BSTACK_0,#1 bgt del_args_copy_args ldr pc,[BSTACK_PTR],#4 .thumb_func del_args_gc: bl collect_2 b del_args_r_gc .section .text.sin_real,"ax" .thumb_func sin_real: .ifdef SOFT_FP_CC vmov r0,r1,d0 .endif bl sin .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif ldr pc,[BSTACK_PTR],#4 .section .text.cos_real,"ax" .thumb_func cos_real: .ifdef SOFT_FP_CC vmov r0,r1,d0 .endif bl cos .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif ldr pc,[BSTACK_PTR],#4 .section .text.tan_real,"ax" .thumb_func tan_real: .ifdef SOFT_FP_CC vmov r0,r1,d0 .endif bl tan .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif ldr pc,[BSTACK_PTR],#4 .section .text.asin_real,"ax" .thumb_func asin_real: .ifdef SOFT_FP_CC vmov r0,r1,d0 .endif bl asin .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif ldr pc,[BSTACK_PTR],#4 .section .text.acos_real,"ax" .thumb_func acos_real: .ifdef SOFT_FP_CC vmov r0,r1,d0 .endif bl acos .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif ldr pc,[BSTACK_PTR],#4 .section .text.atan_real,"ax" .thumb_func atan_real: .ifdef SOFT_FP_CC vmov r0,r1,d0 .endif bl atan .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif ldr pc,[BSTACK_PTR],#4 .section .text.ln_real,"ax" .thumb_func ln_real: .ifdef SOFT_FP_CC vmov r0,r1,d0 .endif bl log .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif ldr pc,[BSTACK_PTR],#4 .section .text.log10_real,"ax" log10_real: .ifdef SOFT_FP_CC vmov r0,r1,d0 .endif bl log10 .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif ldr pc,[BSTACK_PTR],#4 .section .text.exp_real,"ax" .thumb_func exp_real: .ifdef SOFT_FP_CC vmov r0,r1,d0 .endif bl exp .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif ldr pc,[BSTACK_PTR],#4 .section .text.pow_real,"ax" .thumb_func pow_real: .ifdef SOFT_FP_CC vmov r0,r1,d1 vmov BSTACK_2,BSTACK_1,d0 .else vmov.f64 d2,d0 vmov.f64 d0,d1 vmov.f64 d1,d2 .endif bl pow .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif ldr pc,[BSTACK_PTR],#4 .section .text.entier_real,"ax" .thumb_func entier_real: .ifdef SOFT_FP_CC vmov r0,r1,d0 .endif bl floor .ifdef SOFT_FP_CC vmov d0,r0,r1 .endif .thumb_func r_to_i_real: vcvtr.s32.f64 s0,d0 vmov BSTACK_0,s0 ldr pc,[BSTACK_PTR],#4 .text .ifdef PIC .if MARK_GC lto __cycle__in__spine,0 .if MARK_AND_COPY_GC lto flags,14 .endif .endif lto e__system__nind,0 lto e__system__nind,1 lto e__system__nind,2 lto e__system__nind,3 lto e__system__nind,4 lto e__system__nind,5 lto e__system__nind,6 lto e__system__nind,7 ltol __STRING__+2,__STRING___o_2,5 ltol __STRING__+2,__STRING___o_2,6 ltol __ARRAY__+2,__ARRAY___o_2,2 ltol BOOL+2,BOOL_o_2,2 ltol __ARRAY__+2,__ARRAY___o_2,3 ltol INT+2,INT_o_2,4 ltol __ARRAY__+2,__ARRAY___o_2,4 ltol REAL+2,REAL_o_2,3 ltol __ARRAY__+2,__ARRAY___o_2,5 ltol __ARRAY__+2,__ARRAY___o_2,6 ltol BOOL+2,BOOL_o_2,3 ltol __ARRAY__+2,__ARRAY___o_2,7 ltol INT+2,INT_o_2,5 ltol __ARRAY__+2,__ARRAY___o_2,8 ltol REAL+2,REAL_o_2,4 ltol __ARRAY__+2,__ARRAY___o_2,9 ltol __ARRAY__+2,__ARRAY___o_2,10 ltol __ARRAY__+2,__ARRAY___o_2,11 ltol __ARRAY__+2,__ARRAY___o_2,12 ltol __ARRAY__+2,__ARRAY___o_2,13 ltol __ARRAY__+2,__ARRAY___o_2,14 .endif .ltorg .if NEW_DESCRIPTORS .include "thumb2ap.s" .endif