COMPACT_MARK_WITH_STACK = 1 NO_BIT_INSTRUCTIONS = 1 @ mark used nodes and pointers in argument parts and link backward pointers lao SCRATCH_REG,heap_size_33,10 ldo BSTACK_0,SCRATCH_REG,heap_size_33,10 lsl BSTACK_0,BSTACK_0,#5 lao SCRATCH_REG,heap_size_32_33,1 sto BSTACK_0,SCRATCH_REG,heap_size_32_33,1 @ heap_size_32_33 in BSTACK_2 mov BSTACK_2,BSTACK_0 lao SCRATCH_REG,heap_p3,11 ldo ASTACK_3,SCRATCH_REG,heap_p3,11 @ heap_p3 in ASTACK_3 .if COMPACT_MARK_WITH_STACK add ASTACK_PTR,sp,#-8000 .endif lao SCRATCH_REG,caf_list,2 ldo BSTACK_0,SCRATCH_REG,caf_list,2 .if COMPACT_MARK_WITH_STACK lao SCRATCH_REG,end_stack,1 sto ASTACK_PTR,SCRATCH_REG,end_stack,1 @ end_stack in BSTACK_4 mov BSTACK_4,ASTACK_PTR .endif cmp BSTACK_0,#0 beq end_mark_cafs .thumb_func mark_cafs_lp: ldr SCRATCH_REG,[BSTACK_0,#-4] str SCRATCH_REG,[sp,#-4]! .if COMPACT_MARK_WITH_STACK add ASTACK_PTR,BSTACK_0,#4 ldr BSTACK_0,[BSTACK_0] add ASTACK_0,ASTACK_PTR,BSTACK_0,lsl #2 .else add ASTACK_2,BSTACK_0,#4 ldr BSTACK_0,[BSTACK_0] add ASTACK_0,ASTACK_2,BSTACK_0,lsl #2 .endif lao SCRATCH_REG,end_vector,13 sto ASTACK_0,SCRATCH_REG,end_vector,13 .align add lr,pc,#9 str lr,[sp,#-4]! .if COMPACT_MARK_WITH_STACK bl rmark_stack_nodes .else bl mark_stack_nodes .endif ldr BSTACK_0,[sp],#4 tst BSTACK_0,BSTACK_0 bne mark_cafs_lp .thumb_func end_mark_cafs: .if COMPACT_MARK_WITH_STACK lao SCRATCH_REG,stack_p,6 ldo ASTACK_PTR,SCRATCH_REG,stack_p,6 .else lao SCRATCH_REG,stack_p,6 ldo ASTACK_2,SCRATCH_REG,stack_p,6 .endif lao SCRATCH_REG,stack_top,4 ldo ASTACK_0,SCRATCH_REG,stack_top,4 lao SCRATCH_REG,end_vector,14 sto ASTACK_0,SCRATCH_REG,end_vector,14 .align add lr,pc,#9 str lr,[sp,#-4]! .if COMPACT_MARK_WITH_STACK bl rmark_stack_nodes .else bl mark_stack_nodes .endif .ifdef MEASURE_GC .align add lr,pc,#9 str lr,[sp,#-4]! bl add_mark_compact_garbage_collect_time .endif b compact_heap .ifdef PIC lto heap_size_33,10 lto heap_size_32_33,1 lto heap_p3,11 lto caf_list,2 .if COMPACT_MARK_WITH_STACK lto end_stack,1 .endif lto end_vector,13 lto stack_p,6 lto stack_top,4 lto end_vector,14 .endif .ltorg .if COMPACT_MARK_WITH_STACK .include "thumb2compact_rmark.s" .include "thumb2compact_rmarkr.s" .else .include "thumb2compact_mark.s" .endif @ compact the heap .thumb_func compact_heap: .ifdef FINALIZERS lao ASTACK_0,finalizer_list,3 lao ASTACK_1,free_finalizer_list,5 otoa ASTACK_0,finalizer_list,3 otoa ASTACK_1,free_finalizer_list,5 ldr ASTACK_2,[ASTACK_0] determine_free_finalizers_after_compact1: laol SCRATCH_REG,__Nil-4,__Nil_o_m4,5 otoa SCRATCH_REG,__Nil_o_m4,5 cmp ASTACK_2,SCRATCH_REG beq end_finalizers_after_compact1 lao SCRATCH_REG,heap_p3,12 ldo BSTACK_0,SCRATCH_REG,heap_p3,12 sub BSTACK_0,ASTACK_2,BSTACK_0 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_compact1 ldr BSTACK_0,[ASTACK_2] mov ASTACK_PTR,ASTACK_2 b finalizer_find_descriptor .thumb_func finalizer_find_descriptor_lp: and BSTACK_0,BSTACK_0,#-4 mov ASTACK_PTR,BSTACK_0 ldr BSTACK_0,[BSTACK_0] .thumb_func finalizer_find_descriptor: tst BSTACK_0,#1 bne finalizer_find_descriptor_lp laol SCRATCH_REG,e____system__kFinalizerGCTemp+2,e____system__kFinalizerGCTemp_o_2,0 sto SCRATCH_REG,ASTACK_PTR,e____system__kFinalizerGCTemp_o_2,0 cmp ASTACK_2,ASTACK_0 bhi finalizer_no_reverse ldr BSTACK_0,[ASTACK_2] add ASTACK_PTR,ASTACK_0,#1 str ASTACK_PTR,[ASTACK_2] str BSTACK_0,[ASTACK_0] .thumb_func finalizer_no_reverse: add ASTACK_0,ASTACK_2,#4 ldr ASTACK_2,[ASTACK_2,#4] b determine_free_finalizers_after_compact1 finalizer_not_used_after_compact1: laol SCRATCH_REG,e____system__kFinalizerGCTemp+2,e____system__kFinalizerGCTemp_o_2,1 sto SCRATCH_REG,ASTACK_2,e____system__kFinalizerGCTemp_o_2,1 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_compact1 end_finalizers_after_compact1: str ASTACK_2,[ASTACK_1] lao SCRATCH_REG,finalizer_list,4 ldo ASTACK_0,SCRATCH_REG,finalizer_list,4 laol SCRATCH_REG,__Nil-4,__Nil_o_m4,6 otoa SCRATCH_REG,__Nil_o_m4,6 cmp ASTACK_0,SCRATCH_REG beq finalizer_list_empty tst ASTACK_0,#3 bne finalizer_list_already_reversed ldr BSTACK_0,[ASTACK_0] laol SCRATCH_REG,finalizer_list+1,finalizer_list_o_1,0 otoa SCRATCH_REG,finalizer_list_o_1,0 str SCRATCH_REG,[ASTACK_0] lao SCRATCH_REG,finalizer_list,5 sto BSTACK_0,SCRATCH_REG,finalizer_list,5 .thumb_func finalizer_list_already_reversed: .thumb_func finalizer_list_empty: .if COMPACT_MARK_WITH_STACK lao ASTACK_PTR,free_finalizer_list,6 otoa ASTACK_PTR,free_finalizer_list,6 ldr ASTACK_0,[ASTACK_PTR] .else lao ASTACK_2,free_finalizer_list,6 otoa ASTACK_2,free_finalizer_list,6 ldr ASTACK_0,[ASTACK_2] .endif laol SCRATCH_REG,__Nil-4,__Nil_o_m4,7 otoa SCRATCH_REG,__Nil_o_m4,7 cmp ASTACK_0,SCRATCH_REG beq free_finalizer_list_empty laol ASTACK_0,free_finalizer_list+4,free_finalizer_list_o_4,0 otoa ASTACK_0,free_finalizer_list_o_4,0 lao SCRATCH_REG,end_vector,15 sto ASTACK_0,SCRATCH_REG,end_vector,15 .if COMPACT_MARK_WITH_STACK .align add lr,pc,#9 str lr,[sp,#-4]! bl rmark_stack_nodes .else .align add lr,pc,#9 str lr,[sp,#-4]! bl mark_stack_nodes .endif .thumb_func free_finalizer_list_empty: .endif lao SCRATCH_REG,heap_size_33,11 ldo BSTACK_0,SCRATCH_REG,heap_size_33,11 mov BSTACK_1,BSTACK_0 lsl BSTACK_1,BSTACK_1,#5 lao SCRATCH_REG,heap_p3,13 ldo SCRATCH_REG,SCRATCH_REG,heap_p3,13 add BSTACK_1,BSTACK_1,SCRATCH_REG lao SCRATCH_REG,end_heap_p3,0 sto BSTACK_1,SCRATCH_REG,end_heap_p3,0 @ end_heap_p3 in BSTACK_4 mov BSTACK_4,BSTACK_1 add BSTACK_0,BSTACK_0,#3 lsr BSTACK_0,BSTACK_0,#2 @ vector_counter in BSTACK_2 mov BSTACK_2,BSTACK_0 lao SCRATCH_REG,heap_vector,9 ldo ASTACK_0,SCRATCH_REG,heap_vector,9 @ vector_p in BSTACK_3 mov BSTACK_3,ASTACK_0 mov SCRATCH_REG,#-4 rsb BSTACK_1,ASTACK_0,SCRATCH_REG lao SCRATCH_REG,neg_heap_vector_plus_4,0 sto BSTACK_1,SCRATCH_REG,neg_heap_vector_plus_4,0 lao SCRATCH_REG,heap_p3,14 ldo HEAP_PTR,SCRATCH_REG,heap_p3,14 mov ASTACK_PTR,#0 @ heap_p3 in ASTACK_3 mov ASTACK_3,HEAP_PTR b skip_zeros @ d0,a0,a2: free .thumb_func find_non_zero_long: .thumb_func skip_zeros: subs BSTACK_2,BSTACK_2,#1 bcc end_copy ldr ASTACK_PTR,[BSTACK_3],#4 cmp ASTACK_PTR,#0 beq skip_zeros @ a2: free .thumb_func end_skip_zeros: lao SCRATCH_REG,neg_heap_vector_plus_4,1 ldo ASTACK_2,SCRATCH_REG,neg_heap_vector_plus_4,1 add ASTACK_2,ASTACK_2,BSTACK_3 add ASTACK_2,ASTACK_3,ASTACK_2,lsl #5 .thumb_func bsf_and_copy_nodes: neg SCRATCH_REG,ASTACK_PTR and SCRATCH_REG,SCRATCH_REG,ASTACK_PTR clz BSTACK_1,SCRATCH_REG rsb BSTACK_1,BSTACK_1,#31 .thumb_func copy_nodes: ldr BSTACK_0,[ASTACK_2,BSTACK_1,lsl #2] bic ASTACK_PTR,ASTACK_PTR,SCRATCH_REG add SCRATCH_REG,ASTACK_2,#4 add ASTACK_0,SCRATCH_REG,BSTACK_1,lsl #2 sub BSTACK_0,BSTACK_0,#1 tst BSTACK_0,#2 beq begin_update_list_2 ldr BSTACK_1,[BSTACK_0,#-10] subs BSTACK_0,BSTACK_0,#2 tst BSTACK_1,#1 beq end_list_2 find_descriptor_2: and BSTACK_1,BSTACK_1,#-4 ldr BSTACK_1,[BSTACK_1] tst BSTACK_1,#1 bne find_descriptor_2 end_list_2: mov ASTACK_1,BSTACK_1 ldrh BSTACK_1,[BSTACK_1,#-2] cmp BSTACK_1,#256 blo no_record_arguments ldrh ASTACK_1,[ASTACK_1,#-2+2] subs ASTACK_1,ASTACK_1,#2 bhs copy_record_arguments_aa sub BSTACK_1,BSTACK_1,#256 sub BSTACK_1,BSTACK_1,#3 .thumb_func copy_record_arguments_all_b: str BSTACK_1,[sp,#-4]! lao SCRATCH_REG,heap_vector,10 ldo BSTACK_1,SCRATCH_REG,heap_vector,10 update_up_list_1r: mov ASTACK_1,BSTACK_0 sub BSTACK_0,BSTACK_0,ASTACK_3 str ASTACK_0,[sp,#-4]! and ASTACK_0,BSTACK_0,#31*4 lsr BSTACK_0,BSTACK_0,#7 lsr ASTACK_0,ASTACK_0,#2 mov SCRATCH_REG,#1 lsl ASTACK_0,SCRATCH_REG,ASTACK_0 ldr BSTACK_0,[BSTACK_1,BSTACK_0,lsl #2] ands BSTACK_0,BSTACK_0,ASTACK_0 ldr ASTACK_0,[sp],#4 beq copy_argument_part_1r ldr BSTACK_0,[ASTACK_1] str HEAP_PTR,[ASTACK_1] subs BSTACK_0,BSTACK_0,#3 b update_up_list_1r copy_argument_part_1r: ldr BSTACK_0,[ASTACK_1] str HEAP_PTR,[ASTACK_1] str BSTACK_0,[HEAP_PTR],#4 sub BSTACK_0,ASTACK_0,ASTACK_3 lsr BSTACK_0,BSTACK_0,#2 mov BSTACK_1,BSTACK_0 and BSTACK_1,BSTACK_1,#31 cmp BSTACK_1,#1 bhs bit_in_this_word sub BSTACK_2,BSTACK_2,#1 ldr ASTACK_PTR,[BSTACK_3],#4 lao SCRATCH_REG,neg_heap_vector_plus_4,2 ldo ASTACK_2,SCRATCH_REG,neg_heap_vector_plus_4,2 add ASTACK_2,ASTACK_2,BSTACK_3 add ASTACK_2,ASTACK_3,ASTACK_2,lsl #5 .thumb_func bit_in_this_word: mov SCRATCH_REG,#1 lsl SCRATCH_REG,SCRATCH_REG,BSTACK_1 bic ASTACK_PTR,ASTACK_PTR,SCRATCH_REG ldr BSTACK_1,[sp],#4 .thumb_func copy_b_record_argument_part_arguments: ldr BSTACK_0,[ASTACK_0],#4 str BSTACK_0,[HEAP_PTR],#4 subs BSTACK_1,BSTACK_1,#1 bcs copy_b_record_argument_part_arguments cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long .thumb_func copy_record_arguments_aa: mov SCRATCH_REG,#(256+2)/2 sub BSTACK_1,BSTACK_1,ASTACK_1 sub BSTACK_1,BSTACK_1,SCRATCH_REG,lsl #1 str BSTACK_1,[sp,#-4]! str ASTACK_1,[sp,#-4]! update_up_list_2r: mov ASTACK_1,BSTACK_0 ldr BSTACK_0,[ASTACK_1] and BSTACK_1,BSTACK_0,#3 subs BSTACK_1,BSTACK_1,#3 bne copy_argument_part_2r str HEAP_PTR,[ASTACK_1] subs BSTACK_0,BSTACK_0,#3 b update_up_list_2r copy_argument_part_2r: str HEAP_PTR,[ASTACK_1] cmp BSTACK_0,ASTACK_0 blo copy_record_argument_2 .ifdef SHARE_CHAR_INT cmp BSTACK_0,BSTACK_4 bhs copy_record_argument_2 .endif mov ASTACK_1,BSTACK_0 ldr BSTACK_0,[ASTACK_1] add BSTACK_1,HEAP_PTR,#1 str BSTACK_1,[ASTACK_1] copy_record_argument_2: str BSTACK_0,[HEAP_PTR],#4 ldr BSTACK_1,[sp],#4 subs BSTACK_1,BSTACK_1,#1 bcc no_pointers_in_record .thumb_func copy_record_pointers: ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 blo copy_record_pointers_2 .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bhs copy_record_pointers_2 .endif ldr BSTACK_0,[ASTACK_1] add HEAP_PTR,HEAP_PTR,#1 str HEAP_PTR,[ASTACK_1] subs HEAP_PTR,HEAP_PTR,#1 mov ASTACK_1,BSTACK_0 copy_record_pointers_2: str ASTACK_1,[HEAP_PTR],#4 subs BSTACK_1,BSTACK_1,#1 bcs copy_record_pointers .thumb_func no_pointers_in_record: ldr BSTACK_1,[sp],#4 subs BSTACK_1,BSTACK_1,#1 bcc no_non_pointers_in_record .thumb_func copy_non_pointers_in_record: ldr BSTACK_0,[ASTACK_0],#4 str BSTACK_0,[HEAP_PTR],#4 subs BSTACK_1,BSTACK_1,#1 bcs copy_non_pointers_in_record .thumb_func no_non_pointers_in_record: cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long .thumb_func no_record_arguments: subs BSTACK_1,BSTACK_1,#3 update_up_list_2: mov ASTACK_1,BSTACK_0 ldr BSTACK_0,[BSTACK_0] add BSTACK_0,BSTACK_0,#1 str HEAP_PTR,[ASTACK_1] tst BSTACK_0,#3 bne copy_argument_part_2 subs BSTACK_0,BSTACK_0,#4 b update_up_list_2 copy_argument_part_2: sub BSTACK_0,BSTACK_0,#1 cmp BSTACK_0,ASTACK_0 bcc copy_arguments_1 .ifdef SHARE_CHAR_INT cmp BSTACK_0,BSTACK_4 bcs copy_arguments_1 .endif mov ASTACK_1,BSTACK_0 ldr BSTACK_0,[BSTACK_0] add HEAP_PTR,HEAP_PTR,#1 str HEAP_PTR,[ASTACK_1] subs HEAP_PTR,HEAP_PTR,#1 copy_arguments_1: str BSTACK_0,[HEAP_PTR],#4 .thumb_func copy_argument_part_arguments: ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 bcc copy_arguments_2 .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bcs copy_arguments_2 .endif ldr BSTACK_0,[ASTACK_1] add HEAP_PTR,HEAP_PTR,#1 str HEAP_PTR,[ASTACK_1] subs HEAP_PTR,HEAP_PTR,#1 mov ASTACK_1,BSTACK_0 copy_arguments_2: str ASTACK_1,[HEAP_PTR],#4 subs BSTACK_1,BSTACK_1,#1 bcs copy_argument_part_arguments cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long update_list_2_: subs BSTACK_0,BSTACK_0,#1 update_list_2: str HEAP_PTR,[ASTACK_1] begin_update_list_2: mov ASTACK_1,BSTACK_0 ldr BSTACK_0,[BSTACK_0] update_list__2: tst BSTACK_0,#1 beq end_update_list_2 tst BSTACK_0,#2 beq update_list_2_ add ASTACK_1,BSTACK_0,#-3 ldr BSTACK_0,[BSTACK_0,#-3] b update_list__2 end_update_list_2: str HEAP_PTR,[ASTACK_1] str BSTACK_0,[HEAP_PTR],#4 tst BSTACK_0,#2 beq move_lazy_node ldrh BSTACK_1,[BSTACK_0,#-2] tst BSTACK_1,BSTACK_1 beq move_hnf_0 cmp BSTACK_1,#256 bhs move_record subs BSTACK_1,BSTACK_1,#2 bcc move_hnf_1 beq move_hnf_2 move_hnf_3: ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 bcc move_hnf_3_1 .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bcs move_hnf_3_1 .endif add BSTACK_0,HEAP_PTR,#1 ldr BSTACK_1,[ASTACK_1] str BSTACK_0,[ASTACK_1] mov ASTACK_1,BSTACK_1 move_hnf_3_1: str ASTACK_1,[HEAP_PTR] ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 bcc move_hnf_3_2 .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bcs move_hnf_3_2 .endif add BSTACK_0,HEAP_PTR,#4+2+1 ldr BSTACK_1,[ASTACK_1] str BSTACK_0,[ASTACK_1] mov ASTACK_1,BSTACK_1 move_hnf_3_2: str ASTACK_1,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long move_hnf_2: ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 bcc move_hnf_2_1 .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bcs move_hnf_2_1 .endif add BSTACK_0,HEAP_PTR,#1 ldr BSTACK_1,[ASTACK_1] str BSTACK_0,[ASTACK_1] mov ASTACK_1,BSTACK_1 move_hnf_2_1: str ASTACK_1,[HEAP_PTR] ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 bcc move_hnf_2_2 .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bcs move_hnf_2_2 .endif add BSTACK_0,HEAP_PTR,#4+1 ldr BSTACK_1,[ASTACK_1] str BSTACK_0,[ASTACK_1] mov ASTACK_1,BSTACK_1 move_hnf_2_2: str ASTACK_1,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long move_hnf_1: ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 bcc move_hnf_1_ .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bcs move_hnf_1_ .endif add BSTACK_0,HEAP_PTR,#1 ldr BSTACK_1,[ASTACK_1] str BSTACK_0,[ASTACK_1] mov ASTACK_1,BSTACK_1 move_hnf_1_: str ASTACK_1,[HEAP_PTR],#4 cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long .thumb_func move_record: mov SCRATCH_REG,#258/2 subs BSTACK_1,BSTACK_1,SCRATCH_REG,lsl #1 blo move_record_1 beq move_record_2 move_record_3: ldrh BSTACK_1,[BSTACK_0,#-2+2] subs BSTACK_1,BSTACK_1,#1 bhi move_hnf_3 ldr ASTACK_1,[ASTACK_0],#4 blo move_record_3_1b move_record_3_1a: cmp ASTACK_1,ASTACK_0 blo move_record_3_1b .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bhs move_record_3_1b .endif add BSTACK_0,HEAP_PTR,#1 ldr BSTACK_1,[ASTACK_1] str BSTACK_0,[ASTACK_1] mov ASTACK_1,BSTACK_1 move_record_3_1b: str ASTACK_1,[HEAP_PTR],#4 ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 blo move_record_3_2 .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bhs move_record_3_2 .endif str ASTACK_2,[sp,#-4]! sub BSTACK_0,ASTACK_1,ASTACK_3 lao SCRATCH_REG,heap_vector,11 ldo BSTACK_1,SCRATCH_REG,heap_vector,11 add BSTACK_0,BSTACK_0,#4 and ASTACK_2,BSTACK_0,#31*4 lsr BSTACK_0,BSTACK_0,#7 lsr ASTACK_2,ASTACK_2,#2 mov SCRATCH_REG,#1 lsl ASTACK_2,SCRATCH_REG,ASTACK_2 ldr SCRATCH_REG,[BSTACK_1,BSTACK_0,lsl #2] tst ASTACK_2,SCRATCH_REG beq not_linked_record_argument_part_3_b sub BSTACK_0,HEAP_PTR,ASTACK_3 and ASTACK_2,BSTACK_0,#31*4 lsr BSTACK_0,BSTACK_0,#7 lsr ASTACK_2,ASTACK_2,#2 mov SCRATCH_REG,#1 lsl ASTACK_2,SCRATCH_REG,ASTACK_2 ldr SCRATCH_REG,[BSTACK_1,BSTACK_0,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[BSTACK_1,BSTACK_0,lsl #2] ldr ASTACK_2,[sp],#4 b linked_record_argument_part_3_b not_linked_record_argument_part_3_b: ldr SCRATCH_REG,[BSTACK_1,BSTACK_0,lsl #2] orr SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[BSTACK_1,BSTACK_0,lsl #2] sub BSTACK_0,HEAP_PTR,ASTACK_3 and ASTACK_2,BSTACK_0,#31*4 lsr BSTACK_0,BSTACK_0,#7 lsr ASTACK_2,ASTACK_2,#2 mov SCRATCH_REG,#1 lsl SCRATCH_REG,ASTACK_2 mvn ASTACK_2,SCRATCH_REG ldr SCRATCH_REG,[BSTACK_1,BSTACK_0,lsl #2] and SCRATCH_REG,SCRATCH_REG,ASTACK_2 str SCRATCH_REG,[BSTACK_1,BSTACK_0,lsl #2] ldr ASTACK_2,[sp],#4 linked_record_argument_part_3_b: ldr BSTACK_1,[ASTACK_1] add BSTACK_0,HEAP_PTR,#2+1 str BSTACK_0,[ASTACK_1] mov ASTACK_1,BSTACK_1 move_record_3_2: str ASTACK_1,[HEAP_PTR],#4 sub BSTACK_1,ASTACK_0,ASTACK_3 lsr BSTACK_1,BSTACK_1,#2 subs BSTACK_1,BSTACK_1,#1 and BSTACK_1,BSTACK_1,#31 cmp BSTACK_1,#2 blo bit_in_next_word mov SCRATCH_REG,#1 lsl SCRATCH_REG,SCRATCH_REG,BSTACK_1 bic ASTACK_PTR,ASTACK_PTR,SCRATCH_REG cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long .thumb_func bit_in_next_word: sub BSTACK_2,BSTACK_2,#1 ldr ASTACK_PTR,[BSTACK_3],#4 mov SCRATCH_REG,#1 lsl SCRATCH_REG,SCRATCH_REG,BSTACK_1 bic ASTACK_PTR,ASTACK_PTR,SCRATCH_REG cmp ASTACK_PTR,#0 beq skip_zeros b end_skip_zeros move_record_2: ldrh SCRATCH_REG,[BSTACK_0,#-2+2] cmp SCRATCH_REG,#1 bhi move_hnf_2 blo move_real_or_file move_record_2_ab: ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 blo move_record_2_1 .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bhs move_record_2_1 .endif add BSTACK_0,HEAP_PTR,#1 ldr BSTACK_1,[ASTACK_1] str BSTACK_0,[ASTACK_1] mov ASTACK_1,BSTACK_1 move_record_2_1: str ASTACK_1,[HEAP_PTR] ldr BSTACK_1,[ASTACK_0],#4 str BSTACK_1,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long move_record_1: ldrh BSTACK_1,[BSTACK_0,#-2+2] tst BSTACK_1,BSTACK_1 bne move_hnf_1 b move_int_bool_or_char .thumb_func move_real_or_file: ldr BSTACK_0,[ASTACK_0],#4 str BSTACK_0,[HEAP_PTR],#4 .thumb_func move_int_bool_or_char: ldr BSTACK_0,[ASTACK_0],#4 str BSTACK_0,[HEAP_PTR],#4 copy_normal_hnf_0: cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long move_hnf_0: laol SCRATCH_REG,INT+2,INT_o_2,13 otoa SCRATCH_REG,INT_o_2,13 cmp BSTACK_0,SCRATCH_REG blo move_real_file_string_or_array laol SCRATCH_REG,CHAR+2,CHAR_o_2,8 otoa SCRATCH_REG,CHAR_o_2,8 cmp BSTACK_0,SCRATCH_REG bls move_int_bool_or_char .ifdef DLL move_normal_hnf_0: .endif cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long .thumb_func move_real_file_string_or_array: laol SCRATCH_REG,__STRING__+2,__STRING___o_2,10 otoa SCRATCH_REG,__STRING___o_2,10 cmp BSTACK_0,SCRATCH_REG bhi move_real_or_file bne move_array ldr BSTACK_0,[ASTACK_0] add BSTACK_0,BSTACK_0,#3 lsr BSTACK_0,BSTACK_0,#2 cp_s_arg_lp3: ldr BSTACK_1,[ASTACK_0],#4 str BSTACK_1,[HEAP_PTR],#4 subs BSTACK_0,BSTACK_0,#1 bcs cp_s_arg_lp3 cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long .thumb_func move_array: .ifdef DLL laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,2 otoa SCRATCH_REG,__ARRAY___o_2,2 cmp BSTACK_0,SCRATCH_REG blo move_normal_hnf_0 .endif cmp ASTACK_PTR,#0 bne bsf_and_end_array_bit .thumb_func skip_zeros_a: ldr ASTACK_PTR,[BSTACK_3],#4 sub BSTACK_2,BSTACK_2,#1 cmp ASTACK_PTR,#0 beq skip_zeros_a lao SCRATCH_REG,neg_heap_vector_plus_4,3 ldo ASTACK_2,SCRATCH_REG,neg_heap_vector_plus_4,3 add ASTACK_2,ASTACK_2,BSTACK_3 add ASTACK_2,ASTACK_3,ASTACK_2,lsl #5 .thumb_func bsf_and_end_array_bit: neg SCRATCH_REG,ASTACK_PTR and SCRATCH_REG,SCRATCH_REG,ASTACK_PTR clz BSTACK_1,SCRATCH_REG rsb BSTACK_1,BSTACK_1,#31 .thumb_func end_array_bit: bic ASTACK_PTR,ASTACK_PTR,SCRATCH_REG add BSTACK_1,ASTACK_2,BSTACK_1,lsl #2 cmp ASTACK_0,BSTACK_1 bne move_a_array .thumb_func move_b_array: ldr ASTACK_1,[ASTACK_0] str ASTACK_1,[HEAP_PTR] ldr BSTACK_1,[ASTACK_0,#4]! ldrh BSTACK_0,[BSTACK_1,#-2] add HEAP_PTR,HEAP_PTR,#4 tst BSTACK_0,BSTACK_0 beq move_strict_basic_array subs BSTACK_0,BSTACK_0,#256 mul ASTACK_1,BSTACK_0,ASTACK_1 mov BSTACK_0,ASTACK_1 b cp_s_arg_lp3 .thumb_func move_strict_basic_array: mov BSTACK_0,ASTACK_1 laol SCRATCH_REG,INT+2,INT_o_2,14 otoa SCRATCH_REG,INT_o_2,14 cmp BSTACK_1,SCRATCH_REG beq cp_s_arg_lp3 laol SCRATCH_REG,BOOL+2,BOOL_o_2,7 otoa SCRATCH_REG,BOOL_o_2,7 cmp BSTACK_1,SCRATCH_REG beq move_bool_array add BSTACK_0,BSTACK_0,BSTACK_0 b cp_s_arg_lp3 .thumb_func move_bool_array: add BSTACK_0,BSTACK_0,#3 lsr BSTACK_0,BSTACK_0,#2 b cp_s_arg_lp3 .thumb_func move_a_array: mov ASTACK_1,BSTACK_1 subs BSTACK_1,BSTACK_1,ASTACK_0 lsr BSTACK_1,BSTACK_1,#2 str ASTACK_PTR,[sp,#-4]! subs BSTACK_1,BSTACK_1,#1 blo end_array ldr ASTACK_PTR,[ASTACK_0] ldr BSTACK_0,[ASTACK_1,#-4] str ASTACK_PTR,[ASTACK_1,#-4] str BSTACK_0,[HEAP_PTR] ldr BSTACK_0,[ASTACK_1] ldr ASTACK_PTR,[ASTACK_0,#4] add ASTACK_0,ASTACK_0,#8 str ASTACK_PTR,[ASTACK_1] str BSTACK_0,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 tst BSTACK_0,BSTACK_0 beq st_move_array_lp ldrh ASTACK_PTR,[BSTACK_0,#-2+2] ldrh BSTACK_0,[BSTACK_0,#-2] subs BSTACK_0,BSTACK_0,#256 cmp BSTACK_0,ASTACK_PTR beq st_move_array_lp .thumb_func move_array_ab: str ASTACK_0,[sp,#-4]! ldr ASTACK_1,[HEAP_PTR,#-8] mov BSTACK_1,ASTACK_PTR mul ASTACK_1,BSTACK_0,ASTACK_1 lsl ASTACK_1,ASTACK_1,#2 subs BSTACK_0,BSTACK_0,BSTACK_1 add ASTACK_1,ASTACK_1,ASTACK_0 .align add lr,pc,#9 str lr,[sp,#-4]! bl reorder ldr ASTACK_0,[sp],#4 subs BSTACK_1,BSTACK_1,#1 subs BSTACK_0,BSTACK_0,#1 str BSTACK_1,[sp,#-4]! str BSTACK_0,[sp,#-4]! ldr SCRATCH_REG,[HEAP_PTR,#-8] str SCRATCH_REG,[sp,#-4]! b st_move_array_lp_ab move_array_ab_lp1: ldr BSTACK_0,[sp,#8] .thumb_func move_array_ab_a_elements: ldr BSTACK_1,[ASTACK_0],#4 cmp BSTACK_1,ASTACK_0 blo move_array_element_ab .ifdef SHARE_CHAR_INT cmp BSTACK_1,BSTACK_4 bcs move_array_element_ab .endif mov ASTACK_1,BSTACK_1 ldr BSTACK_1,[ASTACK_1] add HEAP_PTR,HEAP_PTR,#1 str HEAP_PTR,[ASTACK_1] subs HEAP_PTR,HEAP_PTR,#1 .thumb_func move_array_element_ab: str BSTACK_1,[HEAP_PTR],#4 subs BSTACK_0,BSTACK_0,#1 bcs move_array_ab_a_elements ldr BSTACK_0,[sp,#4] .thumb_func move_array_ab_b_elements: ldr BSTACK_1,[ASTACK_0],#4 str BSTACK_1,[HEAP_PTR],#4 subs BSTACK_0,BSTACK_0,#1 bcs move_array_ab_b_elements .thumb_func st_move_array_lp_ab: ldr SCRATCH_REG,[sp] subs SCRATCH_REG,SCRATCH_REG,#1 str SCRATCH_REG,[sp] bcs move_array_ab_lp1 add sp,sp,#12 b end_array move_array_lp1: ldr BSTACK_0,[ASTACK_0],#4 add HEAP_PTR,HEAP_PTR,#4 cmp BSTACK_0,ASTACK_0 blo move_array_element .ifdef SHARE_CHAR_INT cmp BSTACK_0,BSTACK_4 bcs move_array_element .endif ldr ASTACK_PTR,[BSTACK_0] mov ASTACK_1,BSTACK_0 str ASTACK_PTR,[HEAP_PTR,#-4] add BSTACK_0,HEAP_PTR,#-4+1 str BSTACK_0,[ASTACK_1] subs BSTACK_1,BSTACK_1,#1 bcs move_array_lp1 b end_array .thumb_func move_array_element: str BSTACK_0,[HEAP_PTR,#-4] .thumb_func st_move_array_lp: subs BSTACK_1,BSTACK_1,#1 bcs move_array_lp1 .thumb_func end_array: ldr ASTACK_PTR,[sp],#4 cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long .thumb_func move_lazy_node: mov ASTACK_1,BSTACK_0 ldr BSTACK_1,[ASTACK_1,#-4] tst BSTACK_1,BSTACK_1 beq move_lazy_node_0 subs BSTACK_1,BSTACK_1,#1 ble move_lazy_node_1 cmp BSTACK_1,#256 bge move_closure_with_unboxed_arguments .thumb_func move_lazy_node_arguments: ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 bcc move_lazy_node_arguments_ .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bcs move_lazy_node_arguments_ .endif ldr BSTACK_0,[ASTACK_1] str BSTACK_0,[HEAP_PTR] add BSTACK_0,HEAP_PTR,#1 add HEAP_PTR,HEAP_PTR,#4 str BSTACK_0,[ASTACK_1] subs BSTACK_1,BSTACK_1,#1 bcs move_lazy_node_arguments cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long .thumb_func move_lazy_node_arguments_: str ASTACK_1,[HEAP_PTR],#4 subs BSTACK_1,BSTACK_1,#1 bcs move_lazy_node_arguments cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long move_lazy_node_1: ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 bcc move_lazy_node_1_ .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bcs move_lazy_node_1_ .endif add BSTACK_0,HEAP_PTR,#1 ldr BSTACK_1,[ASTACK_1] str BSTACK_0,[ASTACK_1] mov ASTACK_1,BSTACK_1 move_lazy_node_1_: str ASTACK_1,[HEAP_PTR] add HEAP_PTR,HEAP_PTR,#8 cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long move_lazy_node_0: add HEAP_PTR,HEAP_PTR,#8 cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long .thumb_func move_closure_with_unboxed_arguments: beq move_closure_with_unboxed_arguments_1 add BSTACK_1,BSTACK_1,#1 mov BSTACK_0,BSTACK_1 and BSTACK_1,BSTACK_1,#255 lsr BSTACK_0,BSTACK_0,#8 subs BSTACK_1,BSTACK_1,BSTACK_0 beq move_non_pointers_of_closure str BSTACK_0,[sp,#-4]! .thumb_func move_closure_with_unboxed_arguments_lp: ldr ASTACK_1,[ASTACK_0],#4 cmp ASTACK_1,ASTACK_0 bcc move_closure_with_unboxed_arguments_ .ifdef SHARE_CHAR_INT cmp ASTACK_1,BSTACK_4 bcs move_closure_with_unboxed_arguments_ .endif ldr BSTACK_0,[ASTACK_1] str BSTACK_0,[HEAP_PTR] add BSTACK_0,HEAP_PTR,#1 add HEAP_PTR,HEAP_PTR,#4 str BSTACK_0,[ASTACK_1] subs BSTACK_1,BSTACK_1,#1 bne move_closure_with_unboxed_arguments_lp ldr BSTACK_0,[sp],#4 b move_non_pointers_of_closure .thumb_func move_closure_with_unboxed_arguments_: str ASTACK_1,[HEAP_PTR],#4 subs BSTACK_1,BSTACK_1,#1 bne move_closure_with_unboxed_arguments_lp ldr BSTACK_0,[sp],#4 .thumb_func move_non_pointers_of_closure: ldr BSTACK_1,[ASTACK_0],#4 str BSTACK_1,[HEAP_PTR],#4 subs BSTACK_0,BSTACK_0,#1 bne move_non_pointers_of_closure cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long move_closure_with_unboxed_arguments_1: ldr BSTACK_0,[ASTACK_0] str BSTACK_0,[HEAP_PTR] add HEAP_PTR,HEAP_PTR,#8 cmp ASTACK_PTR,#0 bne bsf_and_copy_nodes b find_non_zero_long .ifdef PIC .ifdef FINALIZERS lto finalizer_list,3 lto free_finalizer_list,5 ltol __Nil-4,__Nil_o_m4,5 lto heap_p3,12 ltol e____system__kFinalizerGCTemp+2,e____system__kFinalizerGCTemp_o_2,0 ltol e____system__kFinalizerGCTemp+2,e____system__kFinalizerGCTemp_o_2,1 lto finalizer_list,4 ltol __Nil-4,__Nil_o_m4,6 ltol finalizer_list+1,finalizer_list_o_1,0 lto finalizer_list,5 lto free_finalizer_list,6 ltol __Nil-4,__Nil_o_m4,7 ltol free_finalizer_list+4,free_finalizer_list_o_4,0 lto end_vector,15 .endif lto heap_size_33,11 lto heap_p3,13 lto end_heap_p3,0 lto heap_vector,9 lto neg_heap_vector_plus_4,0 lto heap_p3,14 lto neg_heap_vector_plus_4,1 lto heap_vector,10 lto neg_heap_vector_plus_4,2 lto heap_vector,11 lto neg_heap_vector_plus_4,3 ltol INT+2,INT_o_2,13 ltol CHAR+2,CHAR_o_2,8 ltol __STRING__+2,__STRING___o_2,10 ltol INT+2,INT_o_2,14 ltol BOOL+2,BOOL_o_2,7 .ifdef DLL laol __ARRAY__+2,__ARRAY___o_2,2 .endif .endif .ltorg .ifdef PIC .ifdef FINALIZERS lto finalizer_list,6 ltol __Nil-4,__Nil_o_m4,8 ltol e____system__kFinalizer+2,e____system__kFinalizer_o_2,0 .endif .endif .thumb_func end_copy: .ifdef FINALIZERS lao SCRATCH_REG,finalizer_list,6 ldo ASTACK_0,SCRATCH_REG,finalizer_list,6 .thumb_func restore_finalizer_descriptors: laol SCRATCH_REG,__Nil-4,__Nil_o_m4,8 otoa SCRATCH_REG,__Nil_o_m4,8 cmp ASTACK_0,SCRATCH_REG beq end_restore_finalizer_descriptors laol SCRATCH_REG,e____system__kFinalizer+2,e____system__kFinalizer_o_2,0 otoa SCRATCH_REG,e____system__kFinalizer_o_2,0 str SCRATCH_REG,[ASTACK_0] ldr ASTACK_0,[ASTACK_0,#4] b restore_finalizer_descriptors .thumb_func end_restore_finalizer_descriptors: .endif