ZERO_ARITY_DESCRIPTOR_OFFSET = -4 #undef COUNT_GARBAGE_COLLECTIONS #undef MARK_USING_REVERSAL #undef COMPARE_HEAP_AFTER_MARK #undef DEBUG_MARK_COLLECT lao SCRATCH_REG,heap_size_33,6 ldo BSTACK_0,SCRATCH_REG,heap_size_33,6 mov BSTACK_1,#0 @ heap_p3 in BSTACK_4 lao SCRATCH_REG,heap_p3,9 ldo BSTACK_4,SCRATCH_REG,heap_p3,9 @ n_marked_words in BSTACK_2 mov BSTACK_2,#0 lsl BSTACK_3,BSTACK_0,#5 @ heap_size_32_33 in BSTACK_3 lao SCRATCH_REG,heap_size_32_33,0 sto BSTACK_3,SCRATCH_REG,heap_size_32_33,0 lao SCRATCH_REG,lazy_array_list,0 sto BSTACK_1,SCRATCH_REG,lazy_array_list,0 add ASTACK_PTR,sp,#-2000 lao SCRATCH_REG,caf_list,1 ldo BSTACK_0,SCRATCH_REG,caf_list,1 lao SCRATCH_REG,end_stack,0 @ end_stack in ASTACK_3 mov ASTACK_3,ASTACK_PTR sto ASTACK_PTR,SCRATCH_REG,end_stack,0 tst BSTACK_0,BSTACK_0 beq _end_mark_cafs .thumb_func _mark_cafs_lp: ldr BSTACK_1,[BSTACK_0] ldr ASTACK_2,[BSTACK_0,#-4] str ASTACK_2,[sp,#-4]! add ASTACK_2,BSTACK_0,#4 add SCRATCH_REG,BSTACK_0,#4 add BSTACK_0,SCRATCH_REG,BSTACK_1,lsl #2 lao SCRATCH_REG,end_vector,0 sto BSTACK_0,SCRATCH_REG,end_vector,0 .align add lr,pc,#9 str lr,[sp,#-4]! bl _mark_stack_nodes ldr BSTACK_0,[sp],#4 tst BSTACK_0,BSTACK_0 bne _mark_cafs_lp .thumb_func _end_mark_cafs: lao SCRATCH_REG,stack_top,2 ldo ASTACK_PTR,SCRATCH_REG,stack_top,2 lao SCRATCH_REG,stack_p,5 ldo ASTACK_2,SCRATCH_REG,stack_p,5 lao SCRATCH_REG,end_vector,1 sto ASTACK_PTR,SCRATCH_REG,end_vector,1 .align add lr,pc,#9 str lr,[sp,#-4]! bl _mark_stack_nodes lao SCRATCH_REG,lazy_array_list,1 ldo ASTACK_0,SCRATCH_REG,lazy_array_list,1 cmp ASTACK_0,#0 beq end_restore_arrays .thumb_func restore_arrays: ldr BSTACK_1,[ASTACK_0] laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,16 otoa SCRATCH_REG,__ARRAY___o_2,16 str SCRATCH_REG,[ASTACK_0] cmp BSTACK_1,#1 beq restore_array_size_1 add ASTACK_1,ASTACK_0,BSTACK_1,lsl #2 ldr BSTACK_0,[ASTACK_1,#8] cmp BSTACK_0,#0 beq restore_lazy_array ldrh ASTACK_2,[BSTACK_0,#-2+2] neg SCRATCH_REG,ASTACK_2 and SCRATCH_REG,SCRATCH_REG,ASTACK_2 @ SCRATCH_REG contains lowest 1 bit of ASTACK_2 clz SCRATCH_REG,SCRATCH_REG rsb SCRATCH_REG,SCRATCH_REG,#31 lsr ASTACK_2,ASTACK_2,SCRATCH_REG lsr BSTACK_1,BSTACK_1,SCRATCH_REG sub ASTACK_2,ASTACK_2,#1 add ASTACK_2,ASTACK_2,ASTACK_2 add SCRATCH_REG,pc,#0 @TODO check offset ldr ASTACK_2,[SCRATCH_REG,ASTACK_2] b skip_mod_inverse_table .word 1 .word -1431655765 .word -858993459 .word -1227133513 .word 954437177 .word -1171354717 .word -991146299 .word -286331153 .word -252645135 .word 678152731 .word 1022611261 .word -373475417 .word -1030792151 .word 1749801491 .word 1332920885 .word -1108378657 .thumb_func skip_mod_inverse_table: mul BSTACK_1,ASTACK_2,BSTACK_1 .thumb_func restore_lazy_array: ldr HEAP_PTR,[ASTACK_0,#8] ldr ASTACK_2,[ASTACK_0,#4] str BSTACK_1,[ASTACK_0,#4] ldr ASTACK_PTR,[ASTACK_1,#4] str BSTACK_0,[ASTACK_0,#8] str ASTACK_2,[ASTACK_1,#4] str HEAP_PTR,[ASTACK_1,#8] cmp BSTACK_0,#0 beq no_reorder_array ldrh ASTACK_1,[BSTACK_0,#-2] sub ASTACK_1,ASTACK_1,#256 ldrh ASTACK_2,[BSTACK_0,#-2+2] cmp ASTACK_2,ASTACK_1 beq no_reorder_array add ASTACK_0,ASTACK_0,#12 mul BSTACK_1,ASTACK_1,BSTACK_1 mov BSTACK_0,ASTACK_1 add ASTACK_1,ASTACK_0,BSTACK_1,lsl #2 mov BSTACK_1,ASTACK_2 sub BSTACK_0,BSTACK_0,ASTACK_2 .align add lr,pc,#9 str lr,[sp,#-4]! bl reorder .thumb_func no_reorder_array: mov ASTACK_0,ASTACK_PTR cmp ASTACK_0,#0 bne restore_arrays b end_restore_arrays restore_array_size_1: ldr ASTACK_2,[ASTACK_0,#4] ldr ASTACK_1,[ASTACK_0,#8] str BSTACK_1,[ASTACK_0,#4] ldr BSTACK_0,[ASTACK_0,#12] str ASTACK_2,[ASTACK_0,#12] str BSTACK_0,[ASTACK_0,#8] mov ASTACK_0,ASTACK_1 tst ASTACK_0,ASTACK_0 bne restore_arrays .thumb_func end_restore_arrays: .ifdef FINALIZERS lao SCRATCH_REG,heap_vector,7 ldo HEAP_PTR,SCRATCH_REG,heap_vector,7 lao ASTACK_0,finalizer_list,2 lao ASTACK_1,free_finalizer_list,4 otoa ASTACK_0,finalizer_list,2 otoa ASTACK_1,free_finalizer_list,4 ldr ASTACK_2,[ASTACK_0] .thumb_func determine_free_finalizers_after_mark: laol SCRATCH_REG,__Nil-4,__Nil_o_m4,4 otoa SCRATCH_REG,__Nil_o_m4,4 cmp ASTACK_2,SCRATCH_REG beq end_finalizers_after_mark sub BSTACK_0,ASTACK_2,BSTACK_4 lsr BSTACK_1,BSTACK_0,#7 and BSTACK_0,BSTACK_0,#31*4 lsr ASTACK_PTR,BSTACK_0,#2 mov SCRATCH_REG,#1 lsl ASTACK_PTR,SCRATCH_REG,ASTACK_PTR ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_PTR,SCRATCH_REG beq finalizer_not_used_after_mark add ASTACK_0,ASTACK_2,#4 ldr ASTACK_2,[ASTACK_2,#4] b determine_free_finalizers_after_mark .thumb_func finalizer_not_used_after_mark: str ASTACK_2,[ASTACK_1] add ASTACK_1,ASTACK_2,#4 ldr ASTACK_2,[ASTACK_2,#4] str ASTACK_2,[ASTACK_0] b determine_free_finalizers_after_mark .thumb_func end_finalizers_after_mark: str ASTACK_2,[ASTACK_1] .endif str BSTACK_2,[sp,#-4]! .align add lr,pc,#9 str lr,[sp,#-4]! bl add_garbage_collect_time ldr BSTACK_2,[sp],#4 .ifdef ADJUST_HEAP_SIZE lao SCRATCH_REG,bit_vector_size,3 ldo BSTACK_0,SCRATCH_REG,bit_vector_size,3 .else lao SCRATCH_REG,heap_size_33,7 ldo BSTACK_0,SCRATCH_REG,heap_size_33,7 lsl BSTACK_0,BSTACK_0,#3 .endif .ifdef ADJUST_HEAP_SIZE lao SCRATCH_REG,n_allocated_words,7 ldo HEAP_PTR,SCRATCH_REG,n_allocated_words,7 add HEAP_PTR,HEAP_PTR,BSTACK_2 lsl HEAP_PTR,HEAP_PTR,#2 lsl ASTACK_PTR,BSTACK_0,#2 str ASTACK_1,[sp,#-4]! str BSTACK_0,[sp,#-4]! lao SCRATCH_REG,heap_size_multiple,3 ldo SCRATCH_REG,SCRATCH_REG,heap_size_multiple,3 umull BSTACK_0,ASTACK_1,SCRATCH_REG,HEAP_PTR lsr BSTACK_0,BSTACK_0,#8 orr BSTACK_0,BSTACK_0,ASTACK_1,lsl #32-8 lsr ASTACK_1,ASTACK_1,#8 mov BSTACK_1,BSTACK_0 cmp ASTACK_1,#0 ldr BSTACK_0,[sp],#4 ldr ASTACK_1,[sp],#4 beq not_largest_heap lao SCRATCH_REG,heap_size_33,8 ldo BSTACK_1,SCRATCH_REG,heap_size_33,8 lsl BSTACK_1,BSTACK_1,#5 .thumb_func not_largest_heap: cmp BSTACK_1,ASTACK_PTR bls no_larger_heap lao SCRATCH_REG,heap_size_33,9 ldo ASTACK_PTR,SCRATCH_REG,heap_size_33,9 lsl ASTACK_PTR,ASTACK_PTR,#5 cmp BSTACK_1,ASTACK_PTR bls not_larger_then_heap mov BSTACK_1,ASTACK_PTR .thumb_func not_larger_then_heap: lsr BSTACK_0,BSTACK_1,#2 lao SCRATCH_REG,bit_vector_size,4 sto BSTACK_0,SCRATCH_REG,bit_vector_size,4 .thumb_func no_larger_heap: .endif mov ASTACK_2,BSTACK_0 lao SCRATCH_REG,heap_vector,8 ldo HEAP_PTR,SCRATCH_REG,heap_vector,8 lsr ASTACK_2,ASTACK_2,#5 tst BSTACK_0,#31 beq no_extra_word mov SCRATCH_REG,#0 str SCRATCH_REG,[HEAP_PTR,ASTACK_2,lsl #2] .thumb_func no_extra_word: sub BSTACK_0,BSTACK_0,BSTACK_2 lsl BSTACK_0,BSTACK_0,#2 lao SCRATCH_REG,n_last_heap_free_bytes,2 sto BSTACK_0,SCRATCH_REG,n_last_heap_free_bytes,2 lao SCRATCH_REG,flags,15 ldo SCRATCH_REG,SCRATCH_REG,flags,15 tst SCRATCH_REG,#2 beq _no_heap_use_message2 str BSTACK_2,[sp,#-4]! lao BSTACK_4,marked_gc_string_1,0 otoa BSTACK_4,marked_gc_string_1,0 bl ew_print_string ldr BSTACK_2,[sp] lsl BSTACK_4,BSTACK_2,#2 bl ew_print_int lao BSTACK_4,heap_use_after_gc_string_2,1 otoa BSTACK_4,heap_use_after_gc_string_2,1 bl ew_print_string ldr BSTACK_2,[sp],#4 _no_heap_use_message2: .ifdef FINALIZERS .align add lr,pc,#9 str lr,[sp,#-4]! bl call_finalizers .endif lao SCRATCH_REG,n_allocated_words,8 ldo ASTACK_PTR,SCRATCH_REG,n_allocated_words,8 mov BSTACK_1,#0 @ n_free_words_after_mark in BSTACK_2 mov ASTACK_0,HEAP_PTR mov BSTACK_2,#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 lao SCRATCH_REG,n_free_words_after_mark,5 sto BSTACK_2,SCRATCH_REG,n_free_words_after_mark,5 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 lao SCRATCH_REG,n_free_words_after_mark,6 sto BSTACK_2,SCRATCH_REG,n_free_words_after_mark,6 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 lao SCRATCH_REG,n_free_words_after_mark,7 sto BSTACK_2,SCRATCH_REG,n_free_words_after_mark,7 cmp BSTACK_0,#0 beq _end_bits mov BSTACK_0,ASTACK_0 str BSTACK_1,[ASTACK_0,#-4] subs BSTACK_0,BSTACK_0,ASTACK_1 b _end_bits2 .thumb_func _end_zero_bits: sub BSTACK_0,ASTACK_0,ASTACK_1 lsl BSTACK_0,BSTACK_0,#3 add BSTACK_2,BSTACK_2,BSTACK_0 str BSTACK_1,[ASTACK_0,#-4] cmp BSTACK_0,ASTACK_PTR blo _scan_bits @ n_free_words_after_mark updated .thumb_func _found_free_memory: lao SCRATCH_REG,n_free_words_after_mark,8 sto BSTACK_2,SCRATCH_REG,n_free_words_after_mark,8 lao SCRATCH_REG,bit_counter,3 sto ASTACK_2,SCRATCH_REG,bit_counter,3 lao SCRATCH_REG,bit_vector_p,2 sto ASTACK_0,SCRATCH_REG,bit_vector_p,2 sub HEAP_FREE,BSTACK_0,ASTACK_PTR add BSTACK_1,ASTACK_1,#-4 sub BSTACK_1,BSTACK_1,HEAP_PTR lsl BSTACK_1,BSTACK_1,#5 lao SCRATCH_REG,heap_p3,10 ldo HEAP_PTR,SCRATCH_REG,heap_p3,10 add HEAP_PTR,HEAP_PTR,BSTACK_1 lao SCRATCH_REG,stack_top,3 ldo ASTACK_PTR,SCRATCH_REG,stack_top,3 add BSTACK_1,HEAP_PTR,BSTACK_0,lsl #2 lao SCRATCH_REG,heap_end_after_gc,11 sto BSTACK_1,SCRATCH_REG,heap_end_after_gc,11 ldmia sp!,{r0-r4,pc} @ n_free_words_after_mark updated .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 lao SCRATCH_REG,n_free_words_after_mark,9 sto BSTACK_2,SCRATCH_REG,n_free_words_after_mark,9 @ n_free_words_after_mark updated .thumb_func _end_scan: lao SCRATCH_REG,bit_counter,4 sto ASTACK_2,SCRATCH_REG,bit_counter,4 b compact_gc .ifdef PIC lto heap_size_33,6 lto heap_p3,9 lto heap_size_32_33,0 lto lazy_array_list,0 lto caf_list,1 lto end_stack,0 lto end_vector,0 lto stack_top,2 lto stack_p,5 lto end_vector,1 lto lazy_array_list,1 ltol __ARRAY__+2,__ARRAY___o_2,16 .ifdef FINALIZERS lto heap_vector,7 lto finalizer_list,2 lto free_finalizer_list,4 ltol __Nil-4,__Nil_o_m4,4 .endif .ifdef ADJUST_HEAP_SIZE lto bit_vector_size,3 .else lto heap_size_33,7 .endif .ifdef ADJUST_HEAP_SIZE lto n_allocated_words,7 lto heap_size_multiple,3 lto heap_size_33,8 lto heap_size_33,9 lto bit_vector_size,4 .endif lto heap_vector,8 lto n_last_heap_free_bytes,2 lto flags,15 lto marked_gc_string_1,0 lto heap_use_after_gc_string_2,1 lto n_allocated_words,8 lto n_free_words_after_mark,5 lto n_free_words_after_mark,6 lto n_free_words_after_mark,7 lto n_free_words_after_mark,8 lto bit_counter,3 lto bit_vector_p,2 lto heap_p3,10 lto stack_top,3 lto heap_end_after_gc,11 lto n_free_words_after_mark,9 lto bit_counter,4 .endif .ltorg @ a2: pointer to stack element @ a4: heap_vector @ d0,d1,a0,a1,a3: free .thumb_func _mark_stack_nodes: lao SCRATCH_REG,end_vector,2 ldo SCRATCH_REG,SCRATCH_REG,end_vector,2 cmp ASTACK_2,SCRATCH_REG beq _end_mark_nodes .thumb_func _mark_stack_nodes_: ldr ASTACK_0,[ASTACK_2],#4 sub ASTACK_1,ASTACK_0,BSTACK_4 cmp ASTACK_1,BSTACK_3 bcs _mark_stack_nodes lsr BSTACK_1,ASTACK_1,#7 and ASTACK_1,ASTACK_1,#31*4 lsr ASTACK_PTR,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_PTR,SCRATCH_REG,ASTACK_PTR ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_PTR,SCRATCH_REG bne _mark_stack_nodes str ASTACK_2,[sp,#-4]! .ifdef MARK_USING_REVERSAL mov ASTACK_PTR,#1 b __mark_node .thumb_func __end_mark_using_reversal: ldr ASTACK_2,[sp],#4 str ASTACK_0,[ASTACK_2,#-4] b _mark_stack_nodes .else mov SCRATCH_REG,#0 str SCRATCH_REG,[sp,#-4]! b _mark_arguments _mark_hnf_2: cmp ASTACK_PTR,#0x20000000 bls fits_in_word_6 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_PTR,ASTACK_PTR,#1 str ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] fits_in_word_6: add BSTACK_2,BSTACK_2,#3 _mark_record_2_c: ldr BSTACK_1,[ASTACK_0,#4] str BSTACK_1,[sp,#-4]! cmp sp,ASTACK_3 blo __mark_using_reversal _mark_node2: .thumb_func _shared_argument_part: ldr ASTACK_0,[ASTACK_0] .thumb_func _mark_node: sub ASTACK_1,ASTACK_0,BSTACK_4 cmp ASTACK_1,BSTACK_3 bcs _mark_next_node lsr BSTACK_1,ASTACK_1,#7 and ASTACK_1,ASTACK_1,#31*4 lsr ASTACK_PTR,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_PTR,SCRATCH_REG,ASTACK_PTR ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_PTR,SCRATCH_REG bne _mark_next_node .thumb_func _mark_arguments: ldr BSTACK_0,[ASTACK_0] tst BSTACK_0,#2 beq _mark_lazy_node ldrh ASTACK_2,[BSTACK_0,#-2] cmp ASTACK_2,#0 beq _mark_hnf_0 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add ASTACK_0,ASTACK_0,#4 cmp ASTACK_2,#256 bhs _mark_record subs ASTACK_2,ASTACK_2,#2 beq _mark_hnf_2 blo _mark_hnf_1 _mark_hnf_3: ldr ASTACK_1,[ASTACK_0,#4] cmp ASTACK_PTR,#0x20000000 bls fits_in_word_1 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_PTR,ASTACK_PTR,#1 str ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] fits_in_word_1: sub BSTACK_0,ASTACK_1,BSTACK_4 add BSTACK_2,BSTACK_2,#3 lsr BSTACK_1,BSTACK_0,#7 and BSTACK_0,BSTACK_0,#31*4 lsr ASTACK_PTR,BSTACK_0,#2 mov SCRATCH_REG,#1 lsl ASTACK_PTR,SCRATCH_REG,ASTACK_PTR ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_PTR,SCRATCH_REG bne _shared_argument_part .thumb_func _no_shared_argument_part: orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add ASTACK_2,ASTACK_2,#1 add BSTACK_2,BSTACK_2,ASTACK_2 add BSTACK_0,BSTACK_0,ASTACK_2,lsl #2 add SCRATCH_REG,ASTACK_1,#-4 add ASTACK_1,SCRATCH_REG,ASTACK_2,lsl #2 cmp BSTACK_0,#32*4 bls fits_in_word_2 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_PTR,ASTACK_PTR,#1 str ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] fits_in_word_2: ldr BSTACK_1,[ASTACK_1] sub ASTACK_2,ASTACK_2,#2 str BSTACK_1,[sp,#-4]! .thumb_func _push_hnf_args: ldr BSTACK_1,[ASTACK_1,#-4]! str BSTACK_1,[sp,#-4]! subs ASTACK_2,ASTACK_2,#1 bge _push_hnf_args cmp sp,ASTACK_3 bhs _mark_node2 b __mark_using_reversal _mark_hnf_1: cmp ASTACK_PTR,#0x40000000 bls fits_in_word_4 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_PTR,ASTACK_PTR,#1 str ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] fits_in_word_4: add BSTACK_2,BSTACK_2,#2 ldr ASTACK_0,[ASTACK_0] b _mark_node _mark_lazy_node_1: add ASTACK_0,ASTACK_0,#4 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp ASTACK_PTR,#0x20000000 bls fits_in_word_3 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_PTR,ASTACK_PTR,#1 str ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] fits_in_word_3: add BSTACK_2,BSTACK_2,#3 cmp ASTACK_2,#1 beq _mark_node2 _mark_selector_node_1: cmp ASTACK_2,#-2 ldr ASTACK_1,[ASTACK_0] beq _mark_indirection_node sub ASTACK_PTR,ASTACK_1,BSTACK_4 lsr BSTACK_1,ASTACK_PTR,#7 and ASTACK_PTR,ASTACK_PTR,#31*4 cmp ASTACK_2,#-3 lsr ASTACK_PTR,ASTACK_PTR,#2 mov SCRATCH_REG,#1 lsl ASTACK_PTR,SCRATCH_REG,ASTACK_PTR ble _mark_record_selector_node_1 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_PTR,SCRATCH_REG bne _mark_node3 ldr ASTACK_2,[ASTACK_1] tst ASTACK_2,#2 beq _mark_node3 ldrh SCRATCH_REG,[ASTACK_2,#-2] cmp SCRATCH_REG,#2 bls _small_tuple_or_record .thumb_func _large_tuple_or_record: ldr ASTACK_2,[ASTACK_1,#8] sub ASTACK_2,ASTACK_2,BSTACK_4 lsr BSTACK_1,ASTACK_2,#7 and ASTACK_2,ASTACK_2,#31*4 lsr ASTACK_2,ASTACK_2,#2 mov SCRATCH_REG,#1 lsl ASTACK_2,SCRATCH_REG,ASTACK_2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_2,SCRATCH_REG bne _mark_node3 lao ASTACK_2,e__system__nind,11 .ifdef PIC add SCRATCH_REG,BSTACK_0,#-8+4 .endif ldr BSTACK_0,[BSTACK_0,#-8] otoa ASTACK_2,e__system__nind,11 str ASTACK_2,[ASTACK_0,#-4] mov ASTACK_2,ASTACK_0 .ifdef PIC ldrh BSTACK_0,[SCRATCH_REG,BSTACK_0] .else ldrh BSTACK_0,[BSTACK_0,#4] .endif cmp BSTACK_0,#8 blt _mark_tuple_selector_node_1 ldr ASTACK_1,[ASTACK_1,#8] beq _mark_tuple_selector_node_2 add SCRATCH_REG,BSTACK_0,#-12 ldr ASTACK_0,[ASTACK_1,SCRATCH_REG] str ASTACK_0,[ASTACK_2] b _mark_node _mark_tuple_selector_node_2: ldr ASTACK_0,[ASTACK_1] str ASTACK_0,[ASTACK_2] b _mark_node .thumb_func _small_tuple_or_record: lao ASTACK_2,e__system__nind,12 .ifdef PIC add SCRATCH_REG,BSTACK_0,#-8+4 .endif ldr BSTACK_0,[BSTACK_0,#-8] otoa ASTACK_2,e__system__nind,12 str ASTACK_2,[ASTACK_0,#-4] mov ASTACK_2,ASTACK_0 .ifdef PIC ldrh BSTACK_0,[SCRATCH_REG,BSTACK_0] .else ldrh BSTACK_0,[BSTACK_0,#4] .endif _mark_tuple_selector_node_1: ldr ASTACK_0,[ASTACK_1,BSTACK_0] str ASTACK_0,[ASTACK_2] b _mark_node _mark_record_selector_node_1: beq _mark_strict_record_selector_node_1 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_PTR,SCRATCH_REG bne _mark_node3 ldr ASTACK_2,[ASTACK_1] tst ASTACK_2,#2 beq _mark_node3 ldrh SCRATCH_REG,[ASTACK_2,#-2] mov BSTACK_1,#258/2 cmp SCRATCH_REG,BSTACK_1,lsl #1 bls _small_tuple_or_record ldr ASTACK_2,[ASTACK_1,#8] sub ASTACK_2,ASTACK_2,BSTACK_4 lsr BSTACK_1,ASTACK_2,#7 and ASTACK_2,ASTACK_2,#31*4 lsr ASTACK_2,ASTACK_2,#2 mov SCRATCH_REG,#1 lsl ASTACK_2,SCRATCH_REG,ASTACK_2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_2,SCRATCH_REG bne _mark_node3 lao ASTACK_2,e__system__nind,13 .ifdef PIC add SCRATCH_REG,BSTACK_0,#-8+4 .endif ldr BSTACK_0,[BSTACK_0,#-8] otoa ASTACK_2,e__system__nind,13 str ASTACK_2,[ASTACK_0,#-4] mov ASTACK_2,ASTACK_0 .ifdef PIC ldrh BSTACK_0,[SCRATCH_REG,BSTACK_0] .else ldrh BSTACK_0,[BSTACK_0,#4] .endif cmp BSTACK_0,#8 ble _mark_record_selector_node_2 ldr ASTACK_1,[ASTACK_1,#8] sub BSTACK_0,BSTACK_0,#12 _mark_record_selector_node_2: ldr ASTACK_0,[ASTACK_1,BSTACK_0] str ASTACK_0,[ASTACK_2] b _mark_node _mark_strict_record_selector_node_1: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_PTR,SCRATCH_REG bne _mark_node3 ldr ASTACK_2,[ASTACK_1] tst ASTACK_2,#2 beq _mark_node3 ldrh SCRATCH_REG,[ASTACK_2,#-2] mov BSTACK_1,#258/2 cmp SCRATCH_REG,BSTACK_1,lsl #1 bls _select_from_small_record ldr ASTACK_2,[ASTACK_1,#8] sub ASTACK_2,ASTACK_2,BSTACK_4 lsr BSTACK_1,ASTACK_2,#7 and ASTACK_2,ASTACK_2,#31*4 lsr ASTACK_2,ASTACK_2,#2 mov SCRATCH_REG,#1 lsl ASTACK_2,SCRATCH_REG,ASTACK_2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_2,SCRATCH_REG bne _mark_node3 .thumb_func _select_from_small_record: .ifdef PIC ldr SCRATCH_REG,[BSTACK_0,#-8] add BSTACK_0,BSTACK_0,#-8+4 .else ldr BSTACK_0,[BSTACK_0,#-8] .endif sub ASTACK_0,ASTACK_0,#4 .ifdef PIC ldrh BSTACK_1,[BSTACK_0,SCRATCH_REG]! .else ldrh BSTACK_1,[BSTACK_0,#4] .endif cmp BSTACK_1,#8 ble _mark_strict_record_selector_node_2 ldr SCRATCH_REG,[ASTACK_1,#8] add BSTACK_1,BSTACK_1,SCRATCH_REG ldr BSTACK_1,[BSTACK_1,#-12] b _mark_strict_record_selector_node_3 _mark_strict_record_selector_node_2: ldr BSTACK_1,[ASTACK_1,BSTACK_1] _mark_strict_record_selector_node_3: str BSTACK_1,[ASTACK_0,#4] .ifdef PIC ldrh BSTACK_1,[BSTACK_0,#6-4] .else ldrh BSTACK_1,[BSTACK_0,#6] .endif tst BSTACK_1,BSTACK_1 beq _mark_strict_record_selector_node_5 cmp BSTACK_1,#8 ble _mark_strict_record_selector_node_4 ldr ASTACK_1,[ASTACK_1,#8] sub BSTACK_1,BSTACK_1,#12 _mark_strict_record_selector_node_4: ldr BSTACK_1,[ASTACK_1,BSTACK_1] str BSTACK_1,[ASTACK_0,#8] _mark_strict_record_selector_node_5: .ifdef PIC ldr BSTACK_0,[BSTACK_0,#-4-4] .else ldr BSTACK_0,[BSTACK_0,#-4] .endif str BSTACK_0,[ASTACK_0] b _mark_next_node .thumb_func _mark_indirection_node: _mark_node3: mov ASTACK_0,ASTACK_1 b _mark_node .thumb_func _mark_next_node: ldr ASTACK_0,[sp],#4 tst ASTACK_0,ASTACK_0 bne _mark_node lao SCRATCH_REG,end_vector,3 ldr ASTACK_2,[sp],#4 ldo SCRATCH_REG,SCRATCH_REG,end_vector,3 cmp ASTACK_2,SCRATCH_REG bne _mark_stack_nodes_ .thumb_func _end_mark_nodes: ldr pc,[sp],#4 .thumb_func _mark_lazy_node: ldr ASTACK_2,[BSTACK_0,#-4] tst ASTACK_2,ASTACK_2 beq _mark_real_or_file cmp ASTACK_2,#1 ble _mark_lazy_node_1 cmp ASTACK_2,#256 bge _mark_closure_with_unboxed_arguments add ASTACK_2,ASTACK_2,#1 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add BSTACK_2,BSTACK_2,ASTACK_2 add ASTACK_1,ASTACK_1,ASTACK_2,lsl #2 add ASTACK_0,ASTACK_0,ASTACK_2,lsl #2 cmp ASTACK_1,#32*4 bls fits_in_word_7 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] fits_in_word_7: sub ASTACK_2,ASTACK_2,#3 .thumb_func _push_lazy_args: ldr BSTACK_1,[ASTACK_0,#-4]! str BSTACK_1,[sp,#-4]! subs ASTACK_2,ASTACK_2,#1 bge _push_lazy_args sub ASTACK_0,ASTACK_0,#4 cmp sp,ASTACK_3 bhs _mark_node2 b __mark_using_reversal .thumb_func _mark_closure_with_unboxed_arguments: mov BSTACK_0,ASTACK_2 and ASTACK_2,ASTACK_2,#255 subs ASTACK_2,ASTACK_2,#1 beq _mark_real_or_file lsr BSTACK_0,BSTACK_0,#8 add ASTACK_2,ASTACK_2,#2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add BSTACK_2,BSTACK_2,ASTACK_2 add ASTACK_1,ASTACK_1,ASTACK_2,lsl #2 sub ASTACK_2,ASTACK_2,BSTACK_0 cmp ASTACK_1,#32*4 bls fits_in_word_7_ add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] fits_in_word_7_: subs ASTACK_2,ASTACK_2,#2 blt _mark_next_node add SCRATCH_REG,ASTACK_0,#8 add ASTACK_0,SCRATCH_REG,ASTACK_2,lsl #2 bne _push_lazy_args .thumb_func _mark_closure_with_one_boxed_argument: ldr ASTACK_0,[ASTACK_0,#-4] b _mark_node _mark_hnf_0: laol SCRATCH_REG,INT+2,INT_o_2,7 otoa SCRATCH_REG,INT_o_2,7 cmp BSTACK_0,SCRATCH_REG blo _mark_real_file_or_string ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] laol SCRATCH_REG,CHAR+2,CHAR_o_2,3 otoa SCRATCH_REG,CHAR_o_2,3 cmp BSTACK_0,SCRATCH_REG bhi _mark_normal_hnf_0 .thumb_func _mark_bool: add BSTACK_2,BSTACK_2,#2 cmp ASTACK_PTR,#0x40000000 bls _mark_next_node add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_PTR,ASTACK_PTR,#1 str ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] b _mark_next_node _mark_normal_hnf_0: add BSTACK_2,BSTACK_2,#1 b _mark_next_node .thumb_func _mark_real_file_or_string: laol SCRATCH_REG,__STRING__+2,__STRING___o_2,8 otoa SCRATCH_REG,__STRING___o_2,8 cmp BSTACK_0,SCRATCH_REG bls _mark_string_or_array .thumb_func _mark_real_or_file: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add BSTACK_2,BSTACK_2,#3 cmp ASTACK_PTR,#0x20000000 bls _mark_next_node add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_PTR,ASTACK_PTR,#1 str ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] b _mark_next_node .thumb_func _mark_record: mov SCRATCH_REG,#258/2 subs ASTACK_2,ASTACK_2,SCRATCH_REG,lsl #1 beq _mark_record_2 blt _mark_record_1 _mark_record_3: add BSTACK_2,BSTACK_2,#3 cmp ASTACK_PTR,#0x20000000 bls fits_in_word_13 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_PTR,ASTACK_PTR,#1 str ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] fits_in_word_13: ldr ASTACK_1,[ASTACK_0,#4] ldrh BSTACK_1,[BSTACK_0,#-2+2] sub ASTACK_PTR,ASTACK_1,BSTACK_4 lsr BSTACK_0,ASTACK_PTR,#7 and ASTACK_PTR,ASTACK_PTR,#31*4 subs BSTACK_1,BSTACK_1,#1 lsr ASTACK_1,ASTACK_PTR,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 blo _mark_record_3_bb ldr SCRATCH_REG,[HEAP_PTR,BSTACK_0,lsl #2] tst ASTACK_1,SCRATCH_REG bne _mark_node2 add ASTACK_2,ASTACK_2,#1 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_0,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_0,lsl #2] add BSTACK_2,BSTACK_2,ASTACK_2 add ASTACK_PTR,ASTACK_PTR,ASTACK_2,lsl #2 cmp ASTACK_PTR,#32*4 bls _push_record_arguments add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_0,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_0,lsl #2] .thumb_func _push_record_arguments: ldr ASTACK_1,[ASTACK_0,#4] mov ASTACK_2,BSTACK_1 lsl BSTACK_1,BSTACK_1,#2 add ASTACK_1,ASTACK_1,BSTACK_1 subs ASTACK_2,ASTACK_2,#1 bge _push_hnf_args b _mark_node2 _mark_record_3_bb: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_0,lsl #2] tst ASTACK_1,SCRATCH_REG bne _mark_next_node add ASTACK_2,ASTACK_2,#1 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_0,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_0,lsl #2] add BSTACK_2,BSTACK_2,ASTACK_2 add ASTACK_PTR,ASTACK_PTR,ASTACK_2,lsl #2 cmp ASTACK_PTR,#32*4 bls _mark_next_node add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_0,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_0,lsl #2] b _mark_next_node _mark_record_2: cmp ASTACK_PTR,#0x20000000 bls fits_in_word_12 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] fits_in_word_12: add BSTACK_2,BSTACK_2,#3 ldrh SCRATCH_REG,[BSTACK_0,#-2+2] cmp SCRATCH_REG,#1 bhi _mark_record_2_c beq _mark_node2 b _mark_next_node _mark_record_1: ldrh SCRATCH_REG,[BSTACK_0,#-2+2] cmp SCRATCH_REG,#0 bne _mark_hnf_1 b _mark_bool .thumb_func _mark_string_or_array: beq _mark_string_ .thumb_func _mark_array: ldr ASTACK_2,[ASTACK_0,#8] cmp ASTACK_2,#0 beq _mark_lazy_array ldrh BSTACK_0,[ASTACK_2,#-2] cmp BSTACK_0,#0 beq _mark_strict_basic_array ldrh ASTACK_2,[ASTACK_2,#-2+2] cmp ASTACK_2,#0 beq _mark_b_record_array cmp sp,ASTACK_3 blo _mark_array_using_reversal sub BSTACK_0,BSTACK_0,#256 cmp BSTACK_0,ASTACK_2 beq _mark_a_record_array .thumb_func _mark_ab_record_array: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] ldr ASTACK_2,[ASTACK_0,#4] mul BSTACK_0,ASTACK_2,BSTACK_0 add BSTACK_0,BSTACK_0,#3 add BSTACK_2,BSTACK_2,BSTACK_0 add SCRATCH_REG,ASTACK_0,#-4 add BSTACK_0,SCRATCH_REG,BSTACK_0,lsl #2 sub BSTACK_0,BSTACK_0,BSTACK_4 lsr BSTACK_0,BSTACK_0,#7 cmp BSTACK_1,BSTACK_0 bhs _end_set_ab_array_bits add BSTACK_1,BSTACK_1,#1 mov ASTACK_2,#1 cmp BSTACK_1,BSTACK_0 bhs _last_ab_array_bits .thumb_func _mark_ab_array_lp: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add BSTACK_1,BSTACK_1,#1 cmp BSTACK_1,BSTACK_0 blo _mark_ab_array_lp .thumb_func _last_ab_array_bits: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] .thumb_func _end_set_ab_array_bits: ldr BSTACK_0,[ASTACK_0,#4] ldr ASTACK_1,[ASTACK_0,#8] ldrh BSTACK_1,[ASTACK_1,#-2+2] ldrh ASTACK_1,[ASTACK_1,#-2] lsl BSTACK_1,BSTACK_1,#2 sub ASTACK_1,ASTACK_1,#256 lsl ASTACK_1,ASTACK_1,#2 str BSTACK_1,[sp,#-4]! str ASTACK_1,[sp,#-4]! add ASTACK_2,ASTACK_0,#12 lao SCRATCH_REG,end_vector,4 ldo SCRATCH_REG,SCRATCH_REG,end_vector,4 str SCRATCH_REG,[sp,#-4]! b _mark_ab_array_begin .thumb_func _mark_ab_array: ldr BSTACK_1,[sp,#8] str BSTACK_0,[sp,#-4]! str ASTACK_2,[sp,#-4]! add BSTACK_0,ASTACK_2,BSTACK_1 lao SCRATCH_REG,end_vector,5 sto BSTACK_0,SCRATCH_REG,end_vector,5 .align add lr,pc,#9 str lr,[sp,#-4]! bl _mark_stack_nodes ldr BSTACK_1,[sp,#4+8] ldr ASTACK_2,[sp],#4 ldr BSTACK_0,[sp],#4 add ASTACK_2,ASTACK_2,BSTACK_1 .thumb_func _mark_ab_array_begin: subs BSTACK_0,BSTACK_0,#1 bcs _mark_ab_array ldr ASTACK_0,[sp] lao SCRATCH_REG,end_vector,6 sto ASTACK_0,SCRATCH_REG,end_vector,6 add sp,sp,#12 b _mark_next_node .thumb_func _mark_a_record_array: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] ldr ASTACK_2,[ASTACK_0,#4] mul BSTACK_0,ASTACK_2,BSTACK_0 str BSTACK_0,[sp,#-4]! add BSTACK_0,BSTACK_0,#3 add BSTACK_2,BSTACK_2,BSTACK_0 add SCRATCH_REG,ASTACK_0,#-4 add BSTACK_0,SCRATCH_REG,BSTACK_0,lsl #2 sub BSTACK_0,BSTACK_0,BSTACK_4 lsr BSTACK_0,BSTACK_0,#7 cmp BSTACK_1,BSTACK_0 bhs _end_set_a_array_bits add BSTACK_1,BSTACK_1,#1 mov ASTACK_2,#1 cmp BSTACK_1,BSTACK_0 bhs _last_a_array_bits .thumb_func _mark_a_array_lp: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add BSTACK_1,BSTACK_1,#1 cmp BSTACK_1,BSTACK_0 blo _mark_a_array_lp .thumb_func _last_a_array_bits: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] .thumb_func _end_set_a_array_bits: ldr BSTACK_0,[sp],#4 add ASTACK_2,ASTACK_0,#12 lao SCRATCH_REG,end_vector,7 ldo SCRATCH_REG,SCRATCH_REG,end_vector,7 str SCRATCH_REG,[sp,#-4]! add SCRATCH_REG,ASTACK_0,#12 add BSTACK_0,SCRATCH_REG,BSTACK_0,lsl #2 lao SCRATCH_REG,end_vector,8 sto BSTACK_0,SCRATCH_REG,end_vector,8 .align add lr,pc,#9 str lr,[sp,#-4]! bl _mark_stack_nodes ldr ASTACK_0,[sp],#4 lao SCRATCH_REG,end_vector,9 sto ASTACK_0,SCRATCH_REG,end_vector,9 b _mark_next_node .thumb_func _mark_lazy_array: cmp sp,ASTACK_3 blo _mark_array_using_reversal ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] ldr BSTACK_0,[ASTACK_0,#4] add BSTACK_0,BSTACK_0,#3 add BSTACK_2,BSTACK_2,BSTACK_0 add SCRATCH_REG,ASTACK_0,#-4 add BSTACK_0,SCRATCH_REG,BSTACK_0,lsl #2 sub BSTACK_0,BSTACK_0,BSTACK_4 lsr BSTACK_0,BSTACK_0,#7 cmp BSTACK_1,BSTACK_0 bhs _end_set_lazy_array_bits add BSTACK_1,BSTACK_1,#1 mov ASTACK_2,#1 cmp BSTACK_1,BSTACK_0 bhs _last_lazy_array_bits .thumb_func _mark_lazy_array_lp: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add BSTACK_1,BSTACK_1,#1 cmp BSTACK_1,BSTACK_0 blo _mark_lazy_array_lp .thumb_func _last_lazy_array_bits: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] .thumb_func _end_set_lazy_array_bits: ldr BSTACK_0,[ASTACK_0,#4] add ASTACK_2,ASTACK_0,#12 lao SCRATCH_REG,end_vector,10 ldo SCRATCH_REG,SCRATCH_REG,end_vector,10 str SCRATCH_REG,[sp,#-4]! add SCRATCH_REG,ASTACK_0,#12 add BSTACK_0,SCRATCH_REG,BSTACK_0,lsl #2 lao SCRATCH_REG,end_vector,11 sto BSTACK_0,SCRATCH_REG,end_vector,11 .align add lr,pc,#9 str lr,[sp,#-4]! bl _mark_stack_nodes ldr ASTACK_0,[sp],#4 lao SCRATCH_REG,end_vector,12 sto ASTACK_0,SCRATCH_REG,end_vector,12 b _mark_next_node .thumb_func _mark_array_using_reversal: mov SCRATCH_REG,#0 str SCRATCH_REG,[sp,#-4]! mov ASTACK_PTR,#1 b __mark_node .thumb_func _mark_strict_basic_array: ldr BSTACK_0,[ASTACK_0,#4] laol SCRATCH_REG,INT+2,INT_o_2,8 otoa SCRATCH_REG,INT_o_2,8 cmp ASTACK_2,SCRATCH_REG beq _mark_strict_int_array laol SCRATCH_REG,BOOL+2,BOOL_o_2,5 otoa SCRATCH_REG,BOOL_o_2,5 cmp ASTACK_2,SCRATCH_REG beq _mark_strict_bool_array .thumb_func _mark_strict_real_array: add BSTACK_0,BSTACK_0,BSTACK_0 .thumb_func _mark_strict_int_array: add BSTACK_0,BSTACK_0,#3 b _mark_basic_array_ .thumb_func _mark_strict_bool_array: add BSTACK_0,BSTACK_0,#12+3 lsr BSTACK_0,BSTACK_0,#2 b _mark_basic_array_ .thumb_func _mark_b_record_array: ldr ASTACK_2,[ASTACK_0,#4] sub BSTACK_0,BSTACK_0,#256 mul BSTACK_0,ASTACK_2,BSTACK_0 add BSTACK_0,BSTACK_0,#3 b _mark_basic_array_ .thumb_func _mark_string_: ldr BSTACK_0,[ASTACK_0,#4] add BSTACK_0,BSTACK_0,#8+3 lsr BSTACK_0,BSTACK_0,#2 .thumb_func _mark_basic_array_: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add BSTACK_2,BSTACK_2,BSTACK_0 add SCRATCH_REG,ASTACK_0,#-4 add BSTACK_0,SCRATCH_REG,BSTACK_0,lsl #2 sub BSTACK_0,BSTACK_0,BSTACK_4 lsr BSTACK_0,BSTACK_0,#7 cmp BSTACK_1,BSTACK_0 bhs _mark_next_node add BSTACK_1,BSTACK_1,#1 mov ASTACK_2,#1 cmp BSTACK_1,BSTACK_0 bhs _last_string_bits .thumb_func _mark_string_lp: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add BSTACK_1,BSTACK_1,#1 cmp BSTACK_1,BSTACK_0 blo _mark_string_lp .thumb_func _last_string_bits: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] b _mark_next_node .thumb_func __end_mark_using_reversal: ldr ASTACK_1,[sp],#4 tst ASTACK_1,ASTACK_1 beq _mark_next_node str ASTACK_0,[ASTACK_1] b _mark_next_node .endif .ifdef PIC lto end_vector,2 lto e__system__nind,11 lto e__system__nind,12 lto e__system__nind,13 lto end_vector,3 ltol INT+2,INT_o_2,7 ltol CHAR+2,CHAR_o_2,3 ltol __STRING__+2,__STRING___o_2,8 lto end_vector,4 lto end_vector,5 lto end_vector,6 lto end_vector,7 lto end_vector,8 lto end_vector,9 lto end_vector,10 lto end_vector,11 lto end_vector,12 ltol INT+2,INT_o_2,8 ltol BOOL+2,BOOL_o_2,5 .endif .ltorg .thumb_func __mark_using_reversal: str ASTACK_0,[sp,#-4]! mov ASTACK_PTR,#1 ldr ASTACK_0,[ASTACK_0] b __mark_node .thumb_func __mark_arguments: ldr BSTACK_0,[ASTACK_0] tst BSTACK_0,#2 beq __mark_lazy_node ldrh ASTACK_2,[BSTACK_0,#-2] tst ASTACK_2,ASTACK_2 beq __mark_hnf_0 add ASTACK_0,ASTACK_0,#4 cmp ASTACK_2,#256 bhs __mark__record subs ASTACK_2,ASTACK_2,#2 beq __mark_hnf_2 blo __mark_hnf_1 __mark_hnf_3: lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 add BSTACK_2,BSTACK_2,#3 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp ASTACK_1,#0x20000000 bls fits__in__word__1 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] fits__in__word__1: ldr SCRATCH_REG,[ASTACK_0,#4] sub BSTACK_0,SCRATCH_REG,BSTACK_4 lsr BSTACK_1,BSTACK_0,#7 and BSTACK_0,BSTACK_0,#31*4 lsr ASTACK_1,BSTACK_0,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_1,SCRATCH_REG bne __shared_argument_part .thumb_func __no_shared_argument_part: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] ldr ASTACK_1,[ASTACK_0,#4] add ASTACK_2,ASTACK_2,#1 str ASTACK_PTR,[ASTACK_0,#4] add BSTACK_2,BSTACK_2,ASTACK_2 add ASTACK_0,ASTACK_0,#4 lsl ASTACK_2,ASTACK_2,#2 ldr SCRATCH_REG,[ASTACK_1] orr SCRATCH_REG,SCRATCH_REG,#1 str SCRATCH_REG,[ASTACK_1] add BSTACK_0,BSTACK_0,ASTACK_2 add ASTACK_1,ASTACK_1,ASTACK_2 cmp BSTACK_0,#32*4 bls fits__in__word__2 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_PTR,ASTACK_PTR,#1 str ASTACK_PTR,[SCRATCH_REG,BSTACK_1,lsl #2] fits__in__word__2: ldr ASTACK_2,[ASTACK_1,#-4] str ASTACK_0,[ASTACK_1,#-4] add ASTACK_PTR,ASTACK_1,#-4 mov ASTACK_0,ASTACK_2 b __mark_node __mark_hnf_1: lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 add BSTACK_2,BSTACK_2,#2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp ASTACK_1,#0x40000000 bls __shared_argument_part add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] .thumb_func __shared_argument_part: ldr ASTACK_2,[ASTACK_0] str ASTACK_PTR,[ASTACK_0] add ASTACK_PTR,ASTACK_0,#2 mov ASTACK_0,ASTACK_2 b __mark_node __mark_no_selector_2: ldr BSTACK_1,[sp],#4 __mark_no_selector_1: lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 add BSTACK_2,BSTACK_2,#3 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp ASTACK_1,#0x20000000 bls __shared_argument_part add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] b __shared_argument_part __mark_lazy_node_1: beq __mark_no_selector_1 __mark_selector_node_1: cmp ASTACK_2,#-2 beq __mark_indirection_node cmp ASTACK_2,#-3 str BSTACK_1,[sp,#-4]! ldr ASTACK_2,[ASTACK_0] str BSTACK_0,[sp,#-4]! ble __mark_record_selector_node_1 sub BSTACK_0,ASTACK_2,BSTACK_4 lsr BSTACK_1,BSTACK_0,#7 and BSTACK_0,BSTACK_0,#31*4 lsr BSTACK_0,BSTACK_0,#2 mov SCRATCH_REG,#1 lsl BSTACK_0,SCRATCH_REG,BSTACK_0 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst BSTACK_0,SCRATCH_REG ldr BSTACK_0,[sp],#4 bne __mark_no_selector_2 ldr BSTACK_1,[ASTACK_2] tst BSTACK_1,#2 beq __mark_no_selector_2 ldrh SCRATCH_REG,[BSTACK_1,#-2] cmp SCRATCH_REG,#2 bls __small_tuple_or_record __large_tuple_or_record: ldr ASTACK_2,[ASTACK_2,#8] sub ASTACK_2,ASTACK_2,BSTACK_4 lsr BSTACK_1,ASTACK_2,#7 and ASTACK_2,ASTACK_2,#31*4 lsr ASTACK_2,ASTACK_2,#2 mov SCRATCH_REG,#1 lsl ASTACK_2,SCRATCH_REG,ASTACK_2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_2,SCRATCH_REG bne __mark_no_selector_2 .ifdef PIC ldr SCRATCH_REG,[BSTACK_0,#-8] add BSTACK_0,BSTACK_0,#-8+4 .else ldr BSTACK_0,[BSTACK_0,#-8] .endif lao ASTACK_2,e__system__nind,14 ldr ASTACK_1,[ASTACK_0] otoa ASTACK_2,e__system__nind,14 str ASTACK_2,[ASTACK_0,#-4] mov ASTACK_2,ASTACK_0 ldr BSTACK_1,[sp],#4 .ifdef PIC ldrh BSTACK_0,[BSTACK_0,SCRATCH_REG] .else ldrh BSTACK_0,[BSTACK_0,#4] .endif cmp BSTACK_0,#8 blt __mark_tuple_selector_node_1 ldr ASTACK_1,[ASTACK_1,#8] beq __mark_tuple_selector_node_2 sub BSTACK_0,BSTACK_0,#12 ldr ASTACK_0,[ASTACK_1,BSTACK_0] str ASTACK_0,[ASTACK_2] b __mark_node __mark_tuple_selector_node_2: ldr ASTACK_0,[ASTACK_1] str ASTACK_0,[ASTACK_2] b __mark_node .thumb_func __small_tuple_or_record: .ifdef PIC ldr SCRATCH_REG,[BSTACK_0,#-8] add BSTACK_0,BSTACK_0,#-8+4 .else ldr BSTACK_0,[BSTACK_0,#-8] .endif lao ASTACK_2,e__system__nind,15 ldr ASTACK_1,[ASTACK_0] otoa ASTACK_2,e__system__nind,15 str ASTACK_2,[ASTACK_0,#-4] mov ASTACK_2,ASTACK_0 ldr BSTACK_1,[sp],#4 .ifdef PIC ldrh BSTACK_0,[BSTACK_0,SCRATCH_REG] .else ldrh BSTACK_0,[BSTACK_0,#4] .endif __mark_tuple_selector_node_1: ldr ASTACK_0,[ASTACK_1,BSTACK_0] str ASTACK_0,[ASTACK_2] b __mark_node __mark_record_selector_node_1: beq __mark_strict_record_selector_node_1 sub BSTACK_0,ASTACK_2,BSTACK_4 lsr BSTACK_1,BSTACK_0,#7 and BSTACK_0,BSTACK_0,#31*4 lsr BSTACK_0,BSTACK_0,#2 mov SCRATCH_REG,#1 lsl BSTACK_0,SCRATCH_REG,BSTACK_0 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst BSTACK_0,SCRATCH_REG ldr BSTACK_0,[sp],#4 bne __mark_no_selector_2 ldr BSTACK_1,[ASTACK_2] tst BSTACK_1,#2 beq __mark_no_selector_2 ldrh SCRATCH_REG,[BSTACK_1,#-2] mov BSTACK_1,#258/2 cmp SCRATCH_REG,BSTACK_1,lsl #1 bls __small_record ldr ASTACK_2,[ASTACK_2,#8] sub ASTACK_2,ASTACK_2,BSTACK_4 lsr BSTACK_1,ASTACK_2,#7 and ASTACK_2,ASTACK_2,#31*4 lsr ASTACK_2,ASTACK_2,#2 mov SCRATCH_REG,#1 lsl ASTACK_2,SCRATCH_REG,ASTACK_2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_2,SCRATCH_REG bne __mark_no_selector_2 .thumb_func __small_record: .ifdef PIC ldr SCRATCH_REG,[BSTACK_0,#-8] add BSTACK_0,BSTACK_0,#-8+4 .else ldr BSTACK_0,[BSTACK_0,#-8] .endif lao ASTACK_2,e__system__nind,16 ldr ASTACK_1,[ASTACK_0] otoa ASTACK_2,e__system__nind,16 str ASTACK_2,[ASTACK_0,#-4] mov ASTACK_2,ASTACK_0 ldr BSTACK_1,[sp],#4 .ifdef PIC ldrh BSTACK_0,[BSTACK_0,SCRATCH_REG] .else ldrh BSTACK_0,[BSTACK_0,#4] .endif cmp BSTACK_0,#8 ble __mark_record_selector_node_2 ldr ASTACK_1,[ASTACK_1,#8] sub BSTACK_0,BSTACK_0,#12 __mark_record_selector_node_2: ldr ASTACK_0,[ASTACK_1,BSTACK_0] str ASTACK_0,[ASTACK_2] b __mark_node __mark_strict_record_selector_node_1: sub BSTACK_0,ASTACK_2,BSTACK_4 lsr BSTACK_1,BSTACK_0,#7 and BSTACK_0,BSTACK_0,#31*4 lsr BSTACK_0,BSTACK_0,#2 mov SCRATCH_REG,#1 lsl BSTACK_0,SCRATCH_REG,BSTACK_0 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst BSTACK_0,SCRATCH_REG ldr BSTACK_0,[sp],#4 bne __mark_no_selector_2 ldr BSTACK_1,[ASTACK_2] tst BSTACK_1,#2 beq __mark_no_selector_2 ldrh SCRATCH_REG,[BSTACK_1,#-2] mov BSTACK_1,#258/2 cmp SCRATCH_REG,BSTACK_1,lsl #1 ble __select_from_small_record ldr ASTACK_2,[ASTACK_2,#8] sub ASTACK_2,ASTACK_2,BSTACK_4 lsr BSTACK_1,ASTACK_2,#7 and ASTACK_2,ASTACK_2,#31*4 lsr ASTACK_2,ASTACK_2,#2 mov SCRATCH_REG,#1 lsl ASTACK_2,SCRATCH_REG,ASTACK_2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_2,SCRATCH_REG bne __mark_no_selector_2 .thumb_func __select_from_small_record: .ifdef PIC ldr BSTACK_0,[BSTACK_0,#-8] add SCRATCH_REG,BSTACK_0,#-8+4 .else ldr BSTACK_0,[BSTACK_0,#-8] .endif ldr ASTACK_1,[ASTACK_0] ldr BSTACK_1,[sp],#4 sub ASTACK_0,ASTACK_0,#4 .ifdef PIC ldrh BSTACK_1,[BSTACK_0,SCRATCH_REG]! .else ldrh BSTACK_1,[BSTACK_0,#4] .endif cmp BSTACK_1,#8 ble __mark_strict_record_selector_node_2 ldr SCRATCH_REG,[ASTACK_1,#8] add BSTACK_1,BSTACK_1,SCRATCH_REG ldr BSTACK_1,[BSTACK_1,#-12] b __mark_strict_record_selector_node_3 __mark_strict_record_selector_node_2: ldr BSTACK_1,[ASTACK_1,BSTACK_1] __mark_strict_record_selector_node_3: str BSTACK_1,[ASTACK_0,#4] .ifdef PIC ldrh BSTACK_1,[BSTACK_0,#6-4] .else ldrh BSTACK_1,[BSTACK_0,#6] .endif tst BSTACK_1,BSTACK_1 beq __mark_strict_record_selector_node_5 cmp BSTACK_1,#8 ble __mark_strict_record_selector_node_4 ldr ASTACK_1,[ASTACK_1,#8] sub BSTACK_1,BSTACK_1,#12 __mark_strict_record_selector_node_4: ldr BSTACK_1,[ASTACK_1,BSTACK_1] str BSTACK_1,[ASTACK_0,#8] __mark_strict_record_selector_node_5: .ifdef PIC ldr BSTACK_0,[BSTACK_0,#-4-4] .else ldr BSTACK_0,[BSTACK_0,#-4] .endif str BSTACK_0,[ASTACK_0] b __mark_node .thumb_func __mark_indirection_node: ldr ASTACK_0,[ASTACK_0] b __mark_node __mark_hnf_2: lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 add BSTACK_2,BSTACK_2,#3 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp ASTACK_1,#0x20000000 bls fits__in__word__6 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] fits__in__word__6: __mark_record_2_c: ldr BSTACK_0,[ASTACK_0] ldr ASTACK_2,[ASTACK_0,#4] orr BSTACK_0,BSTACK_0,#2 str ASTACK_PTR,[ASTACK_0,#4] str BSTACK_0,[ASTACK_0] add ASTACK_PTR,ASTACK_0,#4 mov ASTACK_0,ASTACK_2 .thumb_func __mark_node: sub ASTACK_1,ASTACK_0,BSTACK_4 cmp ASTACK_1,BSTACK_3 bhs __mark_next_node lsr BSTACK_1,ASTACK_1,#7 and ASTACK_1,ASTACK_1,#31*4 lsr ASTACK_2,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_2,SCRATCH_REG,ASTACK_2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] tst ASTACK_2,SCRATCH_REG beq __mark_arguments .thumb_func __mark_next_node: tst ASTACK_PTR,#3 bne __mark_parent ldr ASTACK_2,[ASTACK_PTR,#-4] ldr ASTACK_1,[ASTACK_PTR] str ASTACK_0,[ASTACK_PTR] str ASTACK_1,[ASTACK_PTR,#-4] sub ASTACK_PTR,ASTACK_PTR,#4 mov ASTACK_0,ASTACK_2 and ASTACK_2,ASTACK_2,#3 and ASTACK_0,ASTACK_0,#-4 orr ASTACK_PTR,ASTACK_PTR,ASTACK_2 b __mark_node .thumb_func __mark_parent: mov BSTACK_1,ASTACK_PTR bics ASTACK_PTR,ASTACK_PTR,#3 beq __end_mark_using_reversal and BSTACK_1,BSTACK_1,#3 ldr ASTACK_2,[ASTACK_PTR] str ASTACK_0,[ASTACK_PTR] subs BSTACK_1,BSTACK_1,#1 beq __argument_part_parent add ASTACK_0,ASTACK_PTR,#-4 mov ASTACK_PTR,ASTACK_2 b __mark_next_node .thumb_func __argument_part_parent: and ASTACK_2,ASTACK_2,#-4 mov ASTACK_1,ASTACK_PTR ldr ASTACK_0,[ASTACK_2,#-4] ldr BSTACK_1,[ASTACK_2] str BSTACK_1,[ASTACK_2,#-4] str ASTACK_1,[ASTACK_2] add ASTACK_PTR,ASTACK_2,#2-4 b __mark_node .thumb_func __mark_lazy_node: ldr ASTACK_2,[BSTACK_0,#-4] tst ASTACK_2,ASTACK_2 beq __mark_real_or_file add ASTACK_0,ASTACK_0,#4 cmp ASTACK_2,#1 ble __mark_lazy_node_1 cmp ASTACK_2,#256 bge __mark_closure_with_unboxed_arguments add ASTACK_2,ASTACK_2,#1 mov BSTACK_0,ASTACK_1 lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 add BSTACK_2,BSTACK_2,ASTACK_2 add BSTACK_0,BSTACK_0,ASTACK_2,lsl #2 sub ASTACK_2,ASTACK_2,#2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp BSTACK_0,#32*4 bls fits__in__word__7 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] fits__in__word__7: __mark_closure_with_unboxed_arguments__2: add ASTACK_1,ASTACK_0,ASTACK_2,lsl #2 ldr BSTACK_0,[ASTACK_0] orr BSTACK_0,BSTACK_0,#2 str BSTACK_0,[ASTACK_0] ldr ASTACK_0,[ASTACK_1] str ASTACK_PTR,[ASTACK_1] mov ASTACK_PTR,ASTACK_1 b __mark_node .thumb_func __mark_closure_with_unboxed_arguments: mov BSTACK_0,ASTACK_2 and ASTACK_2,ASTACK_2,#255 subs ASTACK_2,ASTACK_2,#1 beq __mark_closure_1_with_unboxed_argument add ASTACK_2,ASTACK_2,#2 lsr BSTACK_0,BSTACK_0,#8 add BSTACK_2,BSTACK_2,ASTACK_2 str ASTACK_0,[sp,#-4]! add ASTACK_0,ASTACK_1,ASTACK_2,lsl #2 lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 sub ASTACK_2,ASTACK_2,BSTACK_0 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp ASTACK_0,#32*4 bls fits__in_word_7_ add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] fits__in_word_7_: ldr ASTACK_0,[sp],#4 subs ASTACK_2,ASTACK_2,#2 bgt __mark_closure_with_unboxed_arguments__2 beq __shared_argument_part sub ASTACK_0,ASTACK_0,#4 b __mark_next_node __mark_closure_1_with_unboxed_argument: sub ASTACK_0,ASTACK_0,#4 b __mark_real_or_file __mark_hnf_0: laol SCRATCH_REG,INT+2,INT_o_2,9 otoa SCRATCH_REG,INT_o_2,9 cmp BSTACK_0,SCRATCH_REG bne __no_int_3 ldr ASTACK_2,[ASTACK_0,#4] cmp ASTACK_2,#33 blo ____small_int .thumb_func __mark_bool_or_small_string: lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 add BSTACK_2,BSTACK_2,#2 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp ASTACK_1,#0x40000000 bls __mark_next_node add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] b __mark_next_node .thumb_func ____small_int: lao ASTACK_0,small_integers,2 otoa ASTACK_0,small_integers,2 add ASTACK_0,ASTACK_0,ASTACK_2,lsl #3 b __mark_next_node __no_int_3: blo __mark_real_file_or_string laol SCRATCH_REG,CHAR+2,CHAR_o_2,4 otoa SCRATCH_REG,CHAR_o_2,4 cmp BSTACK_0,SCRATCH_REG bne __no_char_3 ldrb ASTACK_2,[ASTACK_0,#4] lao ASTACK_0,static_characters,2 otoa ASTACK_0,static_characters,2 add ASTACK_0,ASTACK_0,ASTACK_2,lsl #3 b __mark_next_node __no_char_3: blo __mark_bool_or_small_string add ASTACK_0,BSTACK_0,#ZERO_ARITY_DESCRIPTOR_OFFSET-2 b __mark_next_node .thumb_func __mark_real_file_or_string: laol SCRATCH_REG,__STRING__+2,__STRING___o_2,9 otoa SCRATCH_REG,__STRING___o_2,9 cmp BSTACK_0,SCRATCH_REG bls __mark_string_or_array .thumb_func __mark_real_or_file: lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 add BSTACK_2,BSTACK_2,#3 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp ASTACK_1,#0x20000000 bls __mark_next_node add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] b __mark_next_node .thumb_func __mark__record: mov SCRATCH_REG,#258/2 subs ASTACK_2,ASTACK_2,SCRATCH_REG,lsl #1 beq __mark_record_2 blt __mark_record_1 __mark_record_3: lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 add BSTACK_2,BSTACK_2,#3 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp ASTACK_1,#0x20000000 bls fits__in__word__13 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] fits__in__word__13: ldrh BSTACK_1,[BSTACK_0,#-2+2] ldr ASTACK_1,[ASTACK_0,#4] sub ASTACK_1,ASTACK_1,BSTACK_4 mov BSTACK_0,ASTACK_1 and ASTACK_1,ASTACK_1,#31*4 lsr BSTACK_0,BSTACK_0,#7 str ASTACK_PTR,[sp,#-4]! lsr ASTACK_PTR,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_PTR,SCRATCH_REG,ASTACK_PTR ldr SCRATCH_REG,[HEAP_PTR,BSTACK_0,lsl #2] tst ASTACK_PTR,SCRATCH_REG bne __shared_record_argument_part add ASTACK_2,ASTACK_2,#1 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_0,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_PTR str SCRATCH_REG,[HEAP_PTR,BSTACK_0,lsl #2] add ASTACK_1,ASTACK_1,ASTACK_2,lsl #2 add BSTACK_2,BSTACK_2,ASTACK_2 ldr ASTACK_PTR,[sp],#4 cmp ASTACK_1,#32*4 bls fits__in__word__14 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_0,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_0,lsl #2] fits__in__word__14: subs BSTACK_1,BSTACK_1,#1 ldr ASTACK_1,[ASTACK_0,#4] blt __mark_record_3_bb beq __shared_argument_part str ASTACK_PTR,[ASTACK_0,#4] add ASTACK_0,ASTACK_0,#4 subs BSTACK_1,BSTACK_1,#1 beq __mark_record_3_aab add ASTACK_PTR,ASTACK_1,BSTACK_1,lsl #2 ldr BSTACK_0,[ASTACK_1] orr BSTACK_0,BSTACK_0,#1 ldr ASTACK_2,[ASTACK_PTR] str BSTACK_0,[ASTACK_1] str ASTACK_0,[ASTACK_PTR] mov ASTACK_0,ASTACK_2 b __mark_node __mark_record_3_bb: sub ASTACK_0,ASTACK_0,#4 b __mark_next_node __mark_record_3_aab: ldr ASTACK_2,[ASTACK_1] str ASTACK_0,[ASTACK_1] add ASTACK_PTR,ASTACK_1,#1 mov ASTACK_0,ASTACK_2 b __mark_node .thumb_func __shared_record_argument_part: ldr ASTACK_1,[ASTACK_0,#4] ldr ASTACK_PTR,[sp],#4 tst BSTACK_1,BSTACK_1 bne __shared_argument_part sub ASTACK_0,ASTACK_0,#4 b __mark_next_node __mark_record_2: lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 add BSTACK_2,BSTACK_2,#3 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] cmp ASTACK_1,#0x20000000 bls fits__in__word_12 add SCRATCH_REG,HEAP_PTR,#4 ldr ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] orr ASTACK_1,ASTACK_1,#1 str ASTACK_1,[SCRATCH_REG,BSTACK_1,lsl #2] fits__in__word_12: ldrh SCRATCH_REG,[BSTACK_0,#-2+2] cmp SCRATCH_REG,#1 bhi __mark_record_2_c beq __shared_argument_part sub ASTACK_0,ASTACK_0,#4 b __mark_next_node __mark_record_1: ldrh SCRATCH_REG,[BSTACK_0,#-2+2] cmp SCRATCH_REG,#0 bne __mark_hnf_1 sub ASTACK_0,ASTACK_0,#4 b __mark_bool_or_small_string .thumb_func __mark_string_or_array: beq __mark_string_ .thumb_func __mark_array: ldr ASTACK_2,[ASTACK_0,#8] cmp ASTACK_2,#0 beq __mark_lazy_array ldrh BSTACK_0,[ASTACK_2,#-2] cmp BSTACK_0,#0 beq __mark_strict_basic_array ldrh ASTACK_2,[ASTACK_2,#-2+2] tst ASTACK_2,ASTACK_2 beq __mark_b_record_array sub BSTACK_0,BSTACK_0,#256 cmp BSTACK_0,ASTACK_2 beq __mark_a_record_array .thumb_func __mark__ab__record__array: str ASTACK_1,[sp,#-4]! str BSTACK_1,[sp,#-4]! mov BSTACK_1,ASTACK_2 ldr ASTACK_2,[ASTACK_0,#4] add ASTACK_0,ASTACK_0,#8 str ASTACK_0,[sp,#-4]! lsl ASTACK_2,ASTACK_2,#2 mov ASTACK_1,BSTACK_0 mul ASTACK_1,ASTACK_2,ASTACK_1 sub BSTACK_0,BSTACK_0,BSTACK_1 add ASTACK_0,ASTACK_0,#4 add ASTACK_1,ASTACK_1,ASTACK_0 .align add lr,pc,#9 str lr,[sp,#-4]! bl reorder ldr ASTACK_0,[sp],#4 mov SCRATCH_REG,BSTACK_0 mov BSTACK_0,BSTACK_1 mov BSTACK_1,SCRATCH_REG ldr ASTACK_2,[ASTACK_0,#-4] mul BSTACK_0,ASTACK_2,BSTACK_0 mul BSTACK_1,ASTACK_2,BSTACK_1 add BSTACK_2,BSTACK_2,BSTACK_1 add BSTACK_1,BSTACK_1,BSTACK_0 lsl BSTACK_1,BSTACK_1,#2 sub ASTACK_2,ASTACK_0,BSTACK_4 add ASTACK_2,ASTACK_2,BSTACK_1 ldr BSTACK_1,[sp],#4 ldr ASTACK_1,[sp],#4 lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add ASTACK_1,ASTACK_0,BSTACK_0,lsl #2 b __mark_r_array .thumb_func __mark_a_record_array: ldr SCRATCH_REG,[ASTACK_0,#4] mul BSTACK_0,SCRATCH_REG,BSTACK_0 add ASTACK_0,ASTACK_0,#8 b __mark_lr_array .thumb_func __mark_lazy_array: ldr BSTACK_0,[ASTACK_0,#4] add ASTACK_0,ASTACK_0,#8 .thumb_func __mark_lr_array: lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add ASTACK_1,ASTACK_0,BSTACK_0,lsl #2 sub ASTACK_2,ASTACK_1,BSTACK_4 .thumb_func __mark_r_array: lsr ASTACK_2,ASTACK_2,#7 cmp BSTACK_1,ASTACK_2 bhs __skip_mark_lazy_array_bits add BSTACK_1,BSTACK_1,#1 .thumb_func __mark_lazy_array_bits: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,#1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add BSTACK_1,BSTACK_1,#1 cmp BSTACK_1,ASTACK_2 bls __mark_lazy_array_bits .thumb_func __skip_mark_lazy_array_bits: add BSTACK_2,BSTACK_2,#3 add BSTACK_2,BSTACK_2,BSTACK_0 cmp BSTACK_0,#1 bls __mark_array_length_0_1 ldr ASTACK_2,[ASTACK_1] ldr BSTACK_1,[ASTACK_0] str BSTACK_1,[ASTACK_1] str ASTACK_2,[ASTACK_0] ldr ASTACK_2,[ASTACK_1,#-4] sub ASTACK_1,ASTACK_1,#4 lao SCRATCH_REG,lazy_array_list,2 ldo BSTACK_1,SCRATCH_REG,lazy_array_list,2 add ASTACK_2,ASTACK_2,#2 str BSTACK_1,[ASTACK_1] str ASTACK_2,[ASTACK_0,#-4] str BSTACK_0,[ASTACK_0,#-8] sub ASTACK_0,ASTACK_0,#8 lao SCRATCH_REG,lazy_array_list,3 sto ASTACK_0,SCRATCH_REG,lazy_array_list,3 ldr ASTACK_0,[ASTACK_1,#-4] str ASTACK_PTR,[ASTACK_1,#-4] add ASTACK_PTR,ASTACK_1,#-4 b __mark_node __mark_array_length_0_1: add ASTACK_0,ASTACK_0,#-8 blo __mark_next_node ldr BSTACK_1,[ASTACK_0,#12] ldr ASTACK_2,[ASTACK_0,#8] lao SCRATCH_REG,lazy_array_list,4 ldo ASTACK_1,SCRATCH_REG,lazy_array_list,4 str ASTACK_2,[ASTACK_0,#12] str ASTACK_1,[ASTACK_0,#8] str BSTACK_0,[ASTACK_0] lao SCRATCH_REG,lazy_array_list,5 sto ASTACK_0,SCRATCH_REG,lazy_array_list,5 str BSTACK_1,[ASTACK_0,#4] add ASTACK_0,ASTACK_0,#4 ldr ASTACK_2,[ASTACK_0] str ASTACK_PTR,[ASTACK_0] add ASTACK_PTR,ASTACK_0,#2 mov ASTACK_0,ASTACK_2 b __mark_node .thumb_func __mark_b_record_array: ldr ASTACK_2,[ASTACK_0,#4] sub BSTACK_0,BSTACK_0,#256 mul BSTACK_0,ASTACK_2,BSTACK_0 add BSTACK_0,BSTACK_0,#3 b __mark_basic_array .thumb_func __mark_strict_basic_array: ldr BSTACK_0,[ASTACK_0,#4] laol SCRATCH_REG,INT+2,INT_o_2,10 otoa SCRATCH_REG,INT_o_2,10 cmp ASTACK_2,SCRATCH_REG beq __mark__strict__int__array laol SCRATCH_REG,BOOL+2,BOOL_o_2,6 otoa SCRATCH_REG,BOOL_o_2,6 cmp ASTACK_2,SCRATCH_REG beq __mark__strict__bool__array .thumb_func __mark__strict__real__array: add BSTACK_0,BSTACK_0,BSTACK_0 .thumb_func __mark__strict__int__array: add BSTACK_0,BSTACK_0,#3 b __mark_basic_array .thumb_func __mark__strict__bool__array: add BSTACK_0,BSTACK_0,#12+3 lsr BSTACK_0,BSTACK_0,#2 b __mark_basic_array .thumb_func __mark_string_: ldr BSTACK_0,[ASTACK_0,#4] add BSTACK_0,BSTACK_0,#8+3 lsr BSTACK_0,BSTACK_0,#2 .thumb_func __mark_basic_array: lsr ASTACK_1,ASTACK_1,#2 mov SCRATCH_REG,#1 lsl ASTACK_1,SCRATCH_REG,ASTACK_1 add BSTACK_2,BSTACK_2,BSTACK_0 ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_1 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add SCRATCH_REG,ASTACK_0,#-4 add BSTACK_0,SCRATCH_REG,BSTACK_0,lsl #2 sub BSTACK_0,BSTACK_0,BSTACK_4 lsr BSTACK_0,BSTACK_0,#7 cmp BSTACK_1,BSTACK_0 bhs __mark_next_node add BSTACK_1,BSTACK_1,#1 mov ASTACK_2,#1 cmp BSTACK_1,BSTACK_0 bhs __last__string__bits .thumb_func __mark_string_lp: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] add BSTACK_1,BSTACK_1,#1 cmp BSTACK_1,BSTACK_0 blo __mark_string_lp .thumb_func __last__string__bits: ldr SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[HEAP_PTR,BSTACK_1,lsl #2] b __mark_next_node .ifdef PIC lto e__system__nind,14 lto e__system__nind,15 lto e__system__nind,16 lto small_integers,2 lto static_characters,2 lto lazy_array_list,2 lto lazy_array_list,3 lto lazy_array_list,4 lto lazy_array_list,5 .endif .ifdef PIC ltol INT+2,INT_o_2,9 ltol CHAR+2,CHAR_o_2,4 ltol __STRING__+2,__STRING___o_2,9 ltol INT+2,INT_o_2,10 ltol BOOL+2,BOOL_o_2,6 .endif .ltorg