ZERO_ARITY_DESCRIPTOR_OFFSET = -4 COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP = 1 str ASTACK_PTR,[BSTACK_PTR,#-4]! lao SCRATCH_REG,heap_p2,9 ldo HEAP_PTR,SCRATCH_REG,heap_p2,9 lao SCRATCH_REG,heap_size_129,4 ldo BSTACK_0,SCRATCH_REG,heap_size_129,4 lsl BSTACK_0,BSTACK_0,#6 lao SCRATCH_REG,semi_space_size,0 sto BSTACK_0,SCRATCH_REG,semi_space_size,0 add ASTACK_PTR,HEAP_PTR,BSTACK_0 @ BSTACK_4 = INT+2 @ BSTACK_3 = CHAR+2 laol BSTACK_4,INT+2,INT_o_2,6 laol BSTACK_3,CHAR+2,CHAR_o_2,2 otoa BSTACK_4,INT_o_2,6 otoa BSTACK_3,CHAR_o_2,2 .if WRITE_HEAP laol SCRATCH_REG,heap2_begin_and_end+4,heap2_begin_and_end_o_4,0 sto ASTACK_PTR,SCRATCH_REG,heap2_begin_and_end_o_4,0 .endif sub BSTACK_PTR,BSTACK_PTR,#16 lao SCRATCH_REG,caf_list,0 ldo BSTACK_0,SCRATCH_REG,caf_list,0 tst BSTACK_0,BSTACK_0 beq end_copy_cafs copy_cafs_lp: ldr SCRATCH_REG,[BSTACK_0,#-4] str SCRATCH_REG,[BSTACK_PTR,#-4]! add ASTACK_2,BSTACK_0,#4 ldr BSTACK_1,[BSTACK_0] mov BSTACK_2,#-2 bl copy_lp2 ldr BSTACK_0,[BSTACK_PTR],#4 cmp BSTACK_0,#0 bne copy_cafs_lp end_copy_cafs: ldr BSTACK_1,[BSTACK_PTR,#16] lao SCRATCH_REG,stack_p,4 ldo ASTACK_2,SCRATCH_REG,stack_p,4 sub BSTACK_1,BSTACK_1,ASTACK_2 lsr BSTACK_1,BSTACK_1,#2 cmp BSTACK_1,#0 beq end_copy0 mov BSTACK_2,#-2 bl copy_lp2 end_copy0: lao SCRATCH_REG,heap_p2,10 ldo ASTACK_2,SCRATCH_REG,heap_p2,10 bl copy_lp1 add BSTACK_PTR,BSTACK_PTR,#16 lao SCRATCH_REG,heap_end_after_gc,10 sto ASTACK_PTR,SCRATCH_REG,heap_end_after_gc,10 .ifdef FINALIZERS lao ASTACK_0,finalizer_list,1 lao ASTACK_1,free_finalizer_list,3 otoa ASTACK_0,finalizer_list,1 otoa ASTACK_1,free_finalizer_list,3 ldr ASTACK_2,[ASTACK_0] determine_free_finalizers_after_copy: ldr BSTACK_0,[ASTACK_2] tst BSTACK_0,#1 beq finalizer_not_used_after_copy ldr ASTACK_2,[ASTACK_2,#4] str BSTACK_0,[ASTACK_0] add ASTACK_0,BSTACK_0,#4 b determine_free_finalizers_after_copy finalizer_not_used_after_copy: laol SCRATCH_REG,__Nil-4,__Nil_o_m4,3 otoa SCRATCH_REG,__Nil_o_m4,3 cmp ASTACK_2,SCRATCH_REG beq end_finalizers_after_copy str ASTACK_2,[ASTACK_1] add ASTACK_1,ASTACK_2,#4 ldr ASTACK_2,[ASTACK_2,#4] b determine_free_finalizers_after_copy end_finalizers_after_copy: str ASTACK_2,[ASTACK_0] str ASTACK_2,[ASTACK_1] .endif b skip_copy_gc .ifdef PIC lto heap_p2,9 lto heap_size_129,4 lto semi_space_size,0 ltol INT+2,INT_o_2,6 ltol CHAR+2,CHAR_o_2,2 .if WRITE_HEAP ltol heap2_begin_and_end+4,heap2_begin_and_end_o_4,0 .endif lto caf_list,0 lto stack_p,4 lto heap_p2,10 lto heap_end_after_gc,10 .ifdef FINALIZERS lto finalizer_list,1 lto free_finalizer_list,3 ltol __Nil-4,__Nil_o_m4,3 .endif .endif .ltorg @ @ Copy nodes to the other semi-space @ copy_lp2_lp1_all_pointers: add BSTACK_2,ASTACK_2,BSTACK_1,lsl #2 copy_lp2_lp1: copy_lp2: ldr ASTACK_1,[ASTACK_2],#4 sub HEAP_FREE,ASTACK_2,#4 copy_lp2__lp1: copy_lp2_: @ selectors: continue_after_selector_2: ldr ASTACK_0,[ASTACK_1] tst ASTACK_0,#2 beq not_in_hnf_2 in_hnf_2: ldrh BSTACK_0,[ASTACK_0,#-2] cmp BSTACK_0,#0 beq copy_arity_0_node2 cmp BSTACK_0,#256 bhs copy_record_2 subs BSTACK_0,BSTACK_0,#2 str HEAP_PTR,[HEAP_FREE] bhi copy_hnf_node2_3 str ASTACK_0,[HEAP_PTR] blo copy_hnf_node2_1 ldr ASTACK_0,[ASTACK_1,#4] str HEAP_PTR,[ASTACK_1] ldr BSTACK_0,[ASTACK_1,#8] subs BSTACK_1,BSTACK_1,#1 str ASTACK_0,[HEAP_PTR,#4] str BSTACK_0,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_hnf_node2_1: ldr BSTACK_0,[ASTACK_1,#4] subs BSTACK_1,BSTACK_1,#1 str HEAP_PTR,[ASTACK_1] str BSTACK_0,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_hnf_node2_3: str ASTACK_0,[HEAP_PTR],#1 str HEAP_PTR,[ASTACK_1] ldr ASTACK_0,[ASTACK_1,#4] str ASTACK_0,[HEAP_PTR,#4-1] ldr ASTACK_0,[ASTACK_1,#8] add HEAP_PTR,HEAP_PTR,#12-1 ldr ASTACK_1,[ASTACK_0] tst ASTACK_1,#1 bne arguments_already_copied_2 str HEAP_PTR,[HEAP_PTR,#-4] str ASTACK_1,[HEAP_PTR],#1 str HEAP_PTR,[ASTACK_0],#4 add HEAP_PTR,HEAP_PTR,#4-1 cp_hnf_arg_lp2: ldr ASTACK_1,[ASTACK_0],#4 str ASTACK_1,[HEAP_PTR],#4 subs BSTACK_0,BSTACK_0,#1 bne cp_hnf_arg_lp2 subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 arguments_already_copied_2: str ASTACK_1,[HEAP_PTR,#-4] subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_arity_0_node2: cmp ASTACK_0,BSTACK_4 @ INT+2 blo copy_real_file_or_string_2 cmp ASTACK_0,BSTACK_3 @ CHAR+2 bhi copy_normal_hnf_0_2 copy_int_bool_or_char_2: ldr BSTACK_0,[ASTACK_1,#4] beq copy_char_2 cmp ASTACK_0,BSTACK_4 @ INT+2 bne no_small_int_or_char_2 copy_int_2: cmp BSTACK_0,#33 bhs no_small_int_or_char_2 lao SCRATCH_REG,small_integers,1 subs BSTACK_1,BSTACK_1,#1 otoa SCRATCH_REG,small_integers,1 add BSTACK_0,SCRATCH_REG,BSTACK_0,lsl #3 str BSTACK_0,[HEAP_FREE] bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_char_2: and BSTACK_0,BSTACK_0,#255 lao SCRATCH_REG,static_characters,1 subs BSTACK_1,BSTACK_1,#1 otoa SCRATCH_REG,static_characters,1 add BSTACK_0,SCRATCH_REG,BSTACK_0,lsl #3 str BSTACK_0,[HEAP_FREE] bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 no_small_int_or_char_2: copy_record_node2_1_b: str ASTACK_0,[ASTACK_PTR,#-8] str BSTACK_0,[ASTACK_PTR,#-4] sub ASTACK_PTR,ASTACK_PTR,#8 str ASTACK_PTR,[ASTACK_1] str ASTACK_PTR,[HEAP_FREE] subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_normal_hnf_0_2: sub ASTACK_0,ASTACK_0,#2-ZERO_ARITY_DESCRIPTOR_OFFSET subs BSTACK_1,BSTACK_1,#1 str ASTACK_0,[HEAP_FREE] bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_real_file_or_string_2: laol SCRATCH_REG,__STRING__+2,__STRING___o_2,7 otoa SCRATCH_REG,__STRING___o_2,7 cmp ASTACK_0,SCRATCH_REG bls copy_string_or_array_2 copy_real_or_file_2: str ASTACK_0,[ASTACK_PTR,#-12] sub ASTACK_PTR,ASTACK_PTR,#12-1 str ASTACK_PTR,[ASTACK_1] sub ASTACK_PTR,ASTACK_PTR,#1 ldr BSTACK_0,[ASTACK_1,#4] ldr ASTACK_0,[ASTACK_1,#8] str ASTACK_PTR,[HEAP_FREE] str BSTACK_0,[ASTACK_PTR,#4] subs BSTACK_1,BSTACK_1,#1 str ASTACK_0,[ASTACK_PTR,#8] bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 already_copied_2: subs BSTACK_1,BSTACK_1,#1 str ASTACK_0,[HEAP_FREE] bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_record_2: ldrh SCRATCH_REG,[ASTACK_0,#-3+2] sub BSTACK_0,BSTACK_0,#256 subs BSTACK_0,#2 bhi copy_record_node2_3 blo copy_record_node2_1 cmp SCRATCH_REG,#0 beq copy_real_or_file_2 str HEAP_PTR,[HEAP_FREE] str ASTACK_0,[HEAP_PTR] add ASTACK_0,HEAP_PTR,#1 ldr BSTACK_0,[ASTACK_1,#4] str ASTACK_0,[ASTACK_1] str BSTACK_0,[HEAP_PTR,#4] ldr BSTACK_0,[ASTACK_1,#8] str BSTACK_0,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_record_node2_1: ldr BSTACK_0,[ASTACK_1,#4] cmp SCRATCH_REG,#0 beq copy_record_node2_1_b str HEAP_PTR,[HEAP_FREE] str ASTACK_0,[HEAP_PTR] add ASTACK_0,HEAP_PTR,#1 str BSTACK_0,[HEAP_PTR,#4] str ASTACK_0,[ASTACK_1] add HEAP_PTR,HEAP_PTR,#8 subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_record_node2_3: cmp SCRATCH_REG,#1 bls copy_record_node2_3_ab_or_b str BSTACK_0,[BSTACK_PTR,#-4]! add BSTACK_0,HEAP_PTR,#1 str BSTACK_0,[ASTACK_1] ldr BSTACK_0,[ASTACK_1,#8] str ASTACK_0,[HEAP_PTR] ldr ASTACK_1,[ASTACK_1,#4] str ASTACK_1,[HEAP_PTR,#4] str HEAP_PTR,[HEAP_FREE] ldr SCRATCH_REG,[BSTACK_0] mov ASTACK_0,BSTACK_0 tst SCRATCH_REG,#1 bne record_arguments_already_copied_2 add ASTACK_1,HEAP_PTR,#12 ldr BSTACK_0,[BSTACK_PTR],#4 str ASTACK_1,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#13 ldr ASTACK_1,[ASTACK_0] str HEAP_PTR,[ASTACK_0],#4 str ASTACK_1,[HEAP_PTR,#-1] add HEAP_PTR,HEAP_PTR,#3 cp_record_arg_lp2: ldr ASTACK_1,[ASTACK_0],#4 str ASTACK_1,[HEAP_PTR],#4 subs BSTACK_0,BSTACK_0,#1 bne cp_record_arg_lp2 subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 record_arguments_already_copied_2: ldr ASTACK_1,[ASTACK_0] ldr BSTACK_0,[BSTACK_PTR],#4 str ASTACK_1,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_record_node2_3_ab_or_b: blo copy_record_node2_3_b copy_record_node2_3_ab: str BSTACK_0,[BSTACK_PTR,#-4]! add BSTACK_0,HEAP_PTR,#1 lao SCRATCH_REG,heap_p1,9 str BSTACK_0,[ASTACK_1] ldr BSTACK_0,[ASTACK_1,#8] ldo SCRATCH_REG,SCRATCH_REG,heap_p1,9 str ASTACK_0,[HEAP_PTR] ldr ASTACK_1,[ASTACK_1,#4] mov ASTACK_0,BSTACK_0 sub BSTACK_0,BSTACK_0,SCRATCH_REG lao SCRATCH_REG,heap_copied_vector,4 str ASTACK_1,[HEAP_PTR,#4] lsr ASTACK_1,BSTACK_0,#6 lsr BSTACK_0,BSTACK_0,#3 and BSTACK_0,BSTACK_0,#31 ldo SCRATCH_REG,SCRATCH_REG,heap_copied_vector,4 and ASTACK_1,ASTACK_1,#-4 str HEAP_PTR,[HEAP_FREE] add ASTACK_1,ASTACK_1,SCRATCH_REG mov SCRATCH_REG,#1 lsl BSTACK_0,SCRATCH_REG,BSTACK_0 ldr SCRATCH_REG,[ASTACK_1] tst BSTACK_0,SCRATCH_REG bne record_arguments_already_copied_2 orr SCRATCH_REG,SCRATCH_REG,BSTACK_0 str SCRATCH_REG,[ASTACK_1] ldr BSTACK_0,[BSTACK_PTR],#4 sub ASTACK_PTR,ASTACK_PTR,#4 lsl BSTACK_0,BSTACK_0,#2 sub ASTACK_PTR,ASTACK_PTR,BSTACK_0 str ASTACK_PTR,[BSTACK_PTR,#-4]! add ASTACK_PTR,ASTACK_PTR,#1 str ASTACK_PTR,[HEAP_PTR,#8] add HEAP_PTR,HEAP_PTR,#12 ldr ASTACK_1,[ASTACK_0] b cp_record_arg_lp3_c copy_record_node2_3_b: str BSTACK_0,[BSTACK_PTR,#-4]! add BSTACK_0,ASTACK_PTR,#-12+1 lao SCRATCH_REG,heap_p1,10 str BSTACK_0,[ASTACK_1] ldr BSTACK_0,[ASTACK_1,#8] ldo SCRATCH_REG,SCRATCH_REG,heap_p1,10 str ASTACK_0,[ASTACK_PTR,#-12] ldr ASTACK_1,[ASTACK_1,#4] mov ASTACK_0,BSTACK_0 sub BSTACK_0,BSTACK_0,SCRATCH_REG lao SCRATCH_REG,heap_copied_vector,5 str ASTACK_1,[ASTACK_PTR,#-8] lsr ASTACK_1,BSTACK_0,#6 sub ASTACK_PTR,ASTACK_PTR,#12 lsr BSTACK_0,BSTACK_0,#3 and BSTACK_0,BSTACK_0,#31 ldo SCRATCH_REG,SCRATCH_REG,heap_copied_vector,5 and ASTACK_1,ASTACK_1,#-4 str ASTACK_PTR,[HEAP_FREE] add ASTACK_1,ASTACK_1,SCRATCH_REG mov SCRATCH_REG,#1 lsl BSTACK_0,SCRATCH_REG,BSTACK_0 ldr SCRATCH_REG,[ASTACK_1] tst BSTACK_0,SCRATCH_REG bne record_arguments_already_copied_3_b orr SCRATCH_REG,SCRATCH_REG,BSTACK_0 str SCRATCH_REG,[ASTACK_1] ldr BSTACK_0,[BSTACK_PTR],#4 mov ASTACK_1,ASTACK_PTR sub ASTACK_PTR,ASTACK_PTR,#4 lsl BSTACK_0,BSTACK_0,#2 sub ASTACK_PTR,ASTACK_PTR,BSTACK_0 str ASTACK_PTR,[ASTACK_1,#8] ldr ASTACK_1,[ASTACK_0] str ASTACK_PTR,[BSTACK_PTR,#-4]! add ASTACK_PTR,ASTACK_PTR,#1 cp_record_arg_lp3_c: str ASTACK_PTR,[ASTACK_0],#4 str ASTACK_1,[ASTACK_PTR,#-1] add ASTACK_PTR,ASTACK_PTR,#3 cp_record_arg_lp3: ldr ASTACK_1,[ASTACK_0],#4 str ASTACK_1,[ASTACK_PTR],#4 subs BSTACK_0,BSTACK_0,#4 bne cp_record_arg_lp3 ldr ASTACK_PTR,[BSTACK_PTR],#4 subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 record_arguments_already_copied_3_b: ldr ASTACK_1,[ASTACK_0] ldr BSTACK_0,[BSTACK_PTR],#4 sub ASTACK_1,ASTACK_1,#1 str ASTACK_1,[ASTACK_PTR,#8] subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 not_in_hnf_2: tst ASTACK_0,#1 beq already_copied_2 ldr BSTACK_0,[ASTACK_0,#-5] cmp BSTACK_0,#0 ble copy_arity_0_node2_ copy_node2_1_: and BSTACK_0,BSTACK_0,#255 subs BSTACK_0,BSTACK_0,#2 blt copy_arity_1_node2 copy_node2_3: str HEAP_PTR,[HEAP_FREE] str ASTACK_0,[HEAP_PTR] str HEAP_PTR,[ASTACK_1] ldr ASTACK_0,[ASTACK_1,#4] add ASTACK_1,ASTACK_1,#8 str ASTACK_0,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#8 cp_arg_lp2: ldr ASTACK_0,[ASTACK_1],#4 str ASTACK_0,[HEAP_PTR],#4 subs BSTACK_0,BSTACK_0,#1 bhs cp_arg_lp2 subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_arity_1_node2__: ldr BSTACK_1,[BSTACK_PTR],#4 copy_arity_1_node2: copy_arity_1_node2_: str HEAP_PTR,[HEAP_FREE] str HEAP_PTR,[ASTACK_1] ldr BSTACK_0,[ASTACK_1,#4] str ASTACK_0,[HEAP_PTR] str BSTACK_0,[HEAP_PTR,#4] add HEAP_PTR,HEAP_PTR,#12 subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_indirection_2: mov BSTACK_0,ASTACK_1 ldr ASTACK_1,[ASTACK_1,#4] ldr ASTACK_0,[ASTACK_1] tst ASTACK_0,#2 bne in_hnf_2 tst ASTACK_0,#1 beq already_copied_2 ldr SCRATCH_REG,[ASTACK_0,#-4] cmp SCRATCH_REG,#-2 beq skip_indirections_2 movs BSTACK_0,SCRATCH_REG ble copy_arity_0_node2_ b copy_node2_1_ skip_indirections_2: ldr ASTACK_1,[ASTACK_1,#4] ldr ASTACK_0,[ASTACK_1] tst ASTACK_0,#2 bne update_indirection_list_2 tst ASTACK_0,#1 beq update_indirection_list_2 ldr SCRATCH_REG,[ASTACK_0,#-4] cmp SCRATCH_REG,#-2 beq skip_indirections_2 update_indirection_list_2: add ASTACK_0,BSTACK_0,#4 ldr BSTACK_0,[BSTACK_0,#4] str ASTACK_1,[ASTACK_0] cmp ASTACK_1,BSTACK_0 bne update_indirection_list_2 b continue_after_selector_2 copy_selector_2: cmp BSTACK_0,#-2 beq copy_indirection_2 blt copy_record_selector_2 ldr BSTACK_0,[ASTACK_1,#4] str BSTACK_1,[BSTACK_PTR,#-4]! ldr BSTACK_1,[BSTACK_0] tst BSTACK_1,#2 beq copy_arity_1_node2__ ldrh SCRATCH_REG,[BSTACK_1,#-3] cmp SCRATCH_REG,#2 bls copy_selector_2_ ldr BSTACK_1,[BSTACK_0,#8] ldrb SCRATCH_REG,[BSTACK_1] tst SCRATCH_REG,#1 bne copy_arity_1_node2__ .ifdef PIC add ASTACK_3,ASTACK_0,#-9+4 .endif ldr ASTACK_0,[ASTACK_0,#-9] lao SCRATCH_REG,e__system__nind,8 .ifdef PIC ldrh ASTACK_0,[ASTACK_3,ASTACK_0] .else ldrh ASTACK_0,[ASTACK_0,#4] .endif otoa SCRATCH_REG,e__system__nind,8 str SCRATCH_REG,[ASTACK_1] cmp ASTACK_0,#8 blt copy_selector_2_1 beq copy_selector_2_2 sub BSTACK_1,BSTACK_1,#12 ldr ASTACK_0,[ASTACK_0,BSTACK_1] ldr BSTACK_1,[BSTACK_PTR],#4 str ASTACK_0,[ASTACK_1,#4] mov ASTACK_1,ASTACK_0 b continue_after_selector_2 copy_selector_2_1: ldr ASTACK_0,[BSTACK_0,#4] ldr BSTACK_1,[BSTACK_PTR],#4 str ASTACK_0,[ASTACK_1,#4] mov ASTACK_1,ASTACK_0 b continue_after_selector_2 copy_selector_2_2: ldr ASTACK_0,[BSTACK_1] ldr BSTACK_1,[BSTACK_PTR],#4 str ASTACK_0,[ASTACK_1,#4] mov ASTACK_1,ASTACK_0 b continue_after_selector_2 copy_selector_2_: .ifdef PIC add ASTACK_3,ASTACK_0,#-9+4 .endif ldr ASTACK_0,[ASTACK_0,#-9] ldr BSTACK_1,[BSTACK_PTR],#4 lao SCRATCH_REG,e__system__nind,9 .ifdef PIC ldrh ASTACK_0,[ASTACK_3,ASTACK_0] .else ldrh ASTACK_0,[ASTACK_0,#4] .endif otoa SCRATCH_REG,e__system__nind,9 str SCRATCH_REG,[ASTACK_1] ldr ASTACK_0,[BSTACK_0,ASTACK_0] str ASTACK_0,[ASTACK_1,#4] mov ASTACK_1,ASTACK_0 b continue_after_selector_2 copy_record_selector_2: cmp BSTACK_0,#-3 ldr BSTACK_0,[ASTACK_1,#4] ldr BSTACK_0,[BSTACK_0] beq copy_strict_record_selector_2 tst BSTACK_0,#2 beq copy_arity_1_node2_ ldrh SCRATCH_REG,[BSTACK_0,#-3] mov ASTACK_3,#258/2 cmp SCRATCH_REG,ASTACK_3,lsl #1 bls copy_record_selector_2_ ldrh SCRATCH_REG,[BSTACK_0,#-3+2] cmp SCRATCH_REG,#2 bhs copy_selector_2__ lao SCRATCH_REG,heap_p1,11 ldr BSTACK_0,[ASTACK_1,#4] str ASTACK_1,[BSTACK_PTR,#-4]! ldo SCRATCH_REG,SCRATCH_REG,heap_p1,11 ldr BSTACK_0,[BSTACK_0,#8] sub BSTACK_0,BSTACK_0,SCRATCH_REG lao SCRATCH_REG,heap_copied_vector,6 lsr ASTACK_1,BSTACK_0,#6 lsr BSTACK_0,BSTACK_0,#3 ldo SCRATCH_REG,SCRATCH_REG,heap_copied_vector,6 and ASTACK_1,ASTACK_1,#-4 and BSTACK_0,BSTACK_0,#31 add ASTACK_1,ASTACK_1,SCRATCH_REG mov SCRATCH_REG,#1 lsl BSTACK_0,SCRATCH_REG,BSTACK_0 ldr SCRATCH_REG,[ASTACK_1] ands BSTACK_0,BSTACK_0,SCRATCH_REG ldr ASTACK_1,[BSTACK_PTR],#4 beq copy_record_selector_2_ b copy_arity_1_node2_ copy_selector_2__: ldr BSTACK_0,[ASTACK_1,#4] ldr BSTACK_0,[BSTACK_0,#8] ldrb SCRATCH_REG,[BSTACK_0] tst SCRATCH_REG,#1 bne copy_arity_1_node2_ copy_record_selector_2_: .ifdef PIC add ASTACK_3,ASTACK_0,#-9+4 .endif ldr BSTACK_0,[ASTACK_0,#-9] lao SCRATCH_REG,e__system__nind,10 ldr ASTACK_0,[ASTACK_1,#4] otoa SCRATCH_REG,e__system__nind,10 str SCRATCH_REG,[ASTACK_1] .ifdef PIC ldrh BSTACK_0,[ASTACK_3,BSTACK_0] .else ldrh BSTACK_0,[BSTACK_0,#4] .endif cmp BSTACK_0,#8 ble copy_record_selector_3 ldr ASTACK_0,[ASTACK_0,#8] sub BSTACK_0,BSTACK_0,#12 copy_record_selector_3: ldr ASTACK_0,[ASTACK_0,BSTACK_0] str ASTACK_0,[ASTACK_1,#4] mov ASTACK_1,ASTACK_0 b continue_after_selector_2 copy_strict_record_selector_2: tst BSTACK_0,#2 beq copy_arity_1_node2_ ldrh SCRATCH_REG,[BSTACK_0,#-3] mov ASTACK_3,#258/2 cmp SCRATCH_REG,ASTACK_3,lsl #1 bls copy_strict_record_selector_2_ ldrh SCRATCH_REG,[BSTACK_0,#-3+2] cmp SCRATCH_REG,#2 blo copy_strict_record_selector_2_b ldr BSTACK_0,[ASTACK_1,#4] ldr BSTACK_0,[BSTACK_0,#8] ldrb SCRATCH_REG,[BSTACK_0] tst SCRATCH_REG,#1 bne copy_arity_1_node2_ b copy_strict_record_selector_2_ copy_strict_record_selector_2_b: lao SCRATCH_REG,heap_p1,12 ldr BSTACK_0,[ASTACK_1,#4] str ASTACK_1,[BSTACK_PTR,#-4]! ldo SCRATCH_REG,SCRATCH_REG,heap_p1,12 ldr BSTACK_0,[BSTACK_0,#8] sub BSTACK_0,BSTACK_0,SCRATCH_REG lao SCRATCH_REG,heap_copied_vector,7 lsr ASTACK_1,BSTACK_0,#6 lsr BSTACK_0,BSTACK_0,#3 ldo SCRATCH_REG,SCRATCH_REG,heap_copied_vector,7 and ASTACK_1,ASTACK_1,#-4 and BSTACK_0,BSTACK_0,#31 add ASTACK_1,ASTACK_1,SCRATCH_REG mov SCRATCH_REG,#1 lsl BSTACK_0,SCRATCH_REG,BSTACK_0 ldr SCRATCH_REG,[ASTACK_1] ands BSTACK_0,BSTACK_0,SCRATCH_REG ldr ASTACK_1,[BSTACK_PTR],#4 bne copy_arity_1_node2_ copy_strict_record_selector_2_: .ifdef PIC add ASTACK_3,ASTACK_0,#-9+4 .endif ldr BSTACK_0,[ASTACK_0,#-9] str BSTACK_1,[BSTACK_PTR,#-4]! ldr ASTACK_0,[ASTACK_1,#4] .ifdef PIC ldrh BSTACK_1,[BSTACK_0,ASTACK_3]! .else ldrh BSTACK_1,[BSTACK_0,#4] .endif cmp BSTACK_1,#8 ble copy_strict_record_selector_3 ldr SCRATCH_REG,[ASTACK_0,#8] add BSTACK_1,BSTACK_1,SCRATCH_REG ldr BSTACK_1,[BSTACK_1,#-12] b copy_strict_record_selector_4 copy_strict_record_selector_3: ldr BSTACK_1,[ASTACK_0,BSTACK_1] copy_strict_record_selector_4: str BSTACK_1,[ASTACK_1,#4] .ifdef PIC ldrh BSTACK_1,[BSTACK_0,#6-4] .else ldrh BSTACK_1,[BSTACK_0,#6] .endif tst BSTACK_1,BSTACK_1 beq copy_strict_record_selector_6 cmp BSTACK_1,#8 ble copy_strict_record_selector_5 ldr ASTACK_0,[ASTACK_0,#8] sub BSTACK_1,BSTACK_1,#12 copy_strict_record_selector_5: ldr BSTACK_1,[ASTACK_0,BSTACK_1] str BSTACK_1,[ASTACK_1,#8] copy_strict_record_selector_6: .ifdef PIC ldr ASTACK_0,[BSTACK_0,#-4-4] .else ldr ASTACK_0,[BSTACK_0,#-4] .endif str ASTACK_0,[ASTACK_1] ldr BSTACK_1,[BSTACK_PTR],#4 tst ASTACK_0,#2 bne in_hnf_2 hlt: b hlt copy_arity_0_node2_: blt copy_selector_2 str ASTACK_0,[ASTACK_PTR,#-12]! str ASTACK_PTR,[ASTACK_1] str ASTACK_PTR,[HEAP_FREE] subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_string_or_array_2: .ifdef DLL beq copy_string_2 laol SCRATCH_REG,__ARRAY__+2,__ARRAY___o_2,15 otoa SCRATCH_REG,__ARRAY___o_2,15 cmp ASTACK_0,SCRATCH_REG blo copy_normal_hnf_0_2 mov ASTACK_0,ASTACK_1 b copy_array_2 copy_string_2: mov ASTACK_0,ASTACK_1 .else mov ASTACK_0,ASTACK_1 bne copy_array_2 .endif lao SCRATCH_REG,heap_p1,13 ldo SCRATCH_REG,SCRATCH_REG,heap_p1,13 sub ASTACK_1,ASTACK_1,SCRATCH_REG lao SCRATCH_REG,semi_space_size,1 ldo SCRATCH_REG,SCRATCH_REG,semi_space_size,1 cmp ASTACK_1,SCRATCH_REG bhs copy_string_or_array_constant ldr ASTACK_1,[ASTACK_0,#4] add ASTACK_1,ASTACK_1,#3 str BSTACK_1,[BSTACK_PTR,#-4]! lsr BSTACK_0,ASTACK_1,#2 and ASTACK_1,ASTACK_1,#-4 sub ASTACK_PTR,ASTACK_PTR,ASTACK_1 ldr BSTACK_1,[ASTACK_0],#4 str BSTACK_1,[ASTACK_PTR,#-8]! str ASTACK_PTR,[HEAP_FREE] add ASTACK_1,ASTACK_PTR,#1 str ASTACK_1,[ASTACK_0,#-4] add ASTACK_1,ASTACK_PTR,#4 cp_s_arg_lp2: ldr BSTACK_1,[ASTACK_0],#4 str BSTACK_1,[ASTACK_1],#4 subs BSTACK_0,BSTACK_0,#1 bge cp_s_arg_lp2 ldr BSTACK_1,[BSTACK_PTR],#4 subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 copy_array_2: lao SCRATCH_REG,heap_p1,14 ldo SCRATCH_REG,SCRATCH_REG,heap_p1,14 sub ASTACK_1,ASTACK_1,SCRATCH_REG lao SCRATCH_REG,semi_space_size,2 ldo SCRATCH_REG,SCRATCH_REG,semi_space_size,2 cmp ASTACK_1,SCRATCH_REG bhs copy_string_or_array_constant str BSTACK_1,[BSTACK_PTR,#-4]! ldr BSTACK_0,[ASTACK_0,#8] cmp BSTACK_0,#0 beq copy_array_a2 ldrh BSTACK_1,[BSTACK_0,#-3] cmp BSTACK_1,#0 beq copy_strict_basic_array_2 sub BSTACK_1,BSTACK_1,#256 ldr SCRATCH_REG,[ASTACK_0,#4] mul BSTACK_1,SCRATCH_REG,BSTACK_1 b copy_array_a3 copy_array_a2: ldr BSTACK_1,[ASTACK_0,#4] copy_array_a3: mov ASTACK_1,HEAP_PTR add HEAP_PTR,HEAP_PTR,#12 add HEAP_PTR,HEAP_PTR,BSTACK_1,lsl #2 str ASTACK_1,[HEAP_FREE] ldr BSTACK_0,[ASTACK_0] str BSTACK_0,[ASTACK_1] add BSTACK_0,ASTACK_1,#1 add ASTACK_1,ASTACK_1,#4 str BSTACK_0,[ASTACK_0],#4 sub BSTACK_0,BSTACK_1,#1 b cp_s_arg_lp2 copy_strict_basic_array_2: ldr BSTACK_1,[ASTACK_0,#4] cmp BSTACK_0,BSTACK_4 @ INT+2 beq copy_int_array_2 laol SCRATCH_REG,BOOL+2,BOOL_o_2,4 otoa SCRATCH_REG,BOOL_o_2,4 cmp BSTACK_0,SCRATCH_REG beq copy_bool_array_2 add BSTACK_1,BSTACK_1,BSTACK_1 copy_int_array_2: add ASTACK_1,ASTACK_PTR,#-12 sub ASTACK_1,ASTACK_1,BSTACK_1,lsl #2 ldr BSTACK_0,[ASTACK_0] str ASTACK_1,[HEAP_FREE] mov ASTACK_PTR,ASTACK_1 str BSTACK_0,[ASTACK_1] add BSTACK_0,ASTACK_1,#1 add ASTACK_1,ASTACK_1,#4 str BSTACK_0,[ASTACK_0],#4 add BSTACK_0,BSTACK_1,#1 b cp_s_arg_lp2 copy_bool_array_2: add BSTACK_1,BSTACK_1,#3 lsr BSTACK_1,BSTACK_1,#2 b copy_int_array_2 copy_string_or_array_constant: str ASTACK_0,[HEAP_FREE] subs BSTACK_1,BSTACK_1,#1 bne copy_lp2 mov ASTACK_2,BSTACK_2 b copy_lp1 @ @ Copy all referenced nodes to the other semi space @ copy_lp1: cmp ASTACK_2,HEAP_PTR bhs end_copy1 ldr BSTACK_0,[ASTACK_2],#4 tst BSTACK_0,#2 beq not_in_hnf_1 in_hnf_1: ldrh BSTACK_1,[BSTACK_0,#-2] cmp BSTACK_1,#0 beq copy_array_21 cmp BSTACK_1,#2 bls copy_lp2_lp1_all_pointers cmp BSTACK_1,#256 bhs copy_record_21 ldr SCRATCH_REG,[ASTACK_2,#4] tst SCRATCH_REG,#1 bne node_without_arguments_part ldr ASTACK_1,[ASTACK_2],#8 sub HEAP_FREE,ASTACK_2,#8 sub BSTACK_2,ASTACK_2,#4 add BSTACK_2,BSTACK_2,BSTACK_1,lsl #2 b copy_lp2__lp1 copy_record_21: sub BSTACK_1,BSTACK_1,#256 subs BSTACK_1,BSTACK_1,#2 bhi copy_record_arguments_3 ldrh BSTACK_1,[BSTACK_0,#-3+2] blo copy_record_arguments_1 add BSTACK_2,ASTACK_2,#8 cmp BSTACK_1,#1 bhi copy_lp2_lp1 b copy_node_arity1 copy_record_arguments_1: add BSTACK_2,ASTACK_2,#4 b copy_lp2_lp1 copy_record_arguments_3: ldr SCRATCH_REG,[ASTACK_2,#4] tst SCRATCH_REG,#1 bne record_node_without_arguments_part ldrh ASTACK_1,[BSTACK_0,#-3+2] add ASTACK_0,ASTACK_2,BSTACK_1,lsl #2 add BSTACK_2,ASTACK_0,#3*4 mov BSTACK_1,ASTACK_1 ldr ASTACK_1,[ASTACK_2],#8 sub HEAP_FREE,ASTACK_2,#8 b copy_lp2__lp1 node_without_arguments_part: record_node_without_arguments_part: ldr ASTACK_1,[ASTACK_2],#8 sub BSTACK_0,SCRATCH_REG,#1 mov BSTACK_1,#1 sub HEAP_FREE,ASTACK_2,#8 str BSTACK_0,[ASTACK_2,#-4] mov BSTACK_2,ASTACK_2 b copy_lp2__lp1 not_in_hnf_1: ldr BSTACK_1,[BSTACK_0,#-5] cmp BSTACK_1,#256 bgt copy_unboxed_closure_arguments cmp BSTACK_1,#1 bgt copy_lp2_lp1_all_pointers copy_node_arity1: ldr ASTACK_1,[ASTACK_2],#8 mov BSTACK_1,#1 sub HEAP_FREE,ASTACK_2,#8 mov BSTACK_2,ASTACK_2 b copy_lp2__lp1 copy_unboxed_closure_arguments: ldr SCRATCH_REG,=257 cmp BSTACK_1,SCRATCH_REG beq copy_unboxed_closure_arguments1 uxtb BSTACK_0,BSTACK_1,ror #8 and BSTACK_2,BSTACK_1,#255 subs BSTACK_1,BSTACK_2,BSTACK_0 add BSTACK_2,ASTACK_2,BSTACK_2,lsl #2 bne copy_lp2_lp1 copy_unboxed_closure_arguments_without_pointers: mov ASTACK_2,BSTACK_2 b copy_lp1 copy_unboxed_closure_arguments1: add ASTACK_2,ASTACK_2,#8 b copy_lp1 copy_array_21: ldr BSTACK_1,[ASTACK_2,#4] add ASTACK_2,ASTACK_2,#8 cmp BSTACK_1,#0 beq copy_array_21_a ldrh BSTACK_0,[BSTACK_1,#-3] ldrh BSTACK_1,[BSTACK_1,#-3+2] sub BSTACK_0,BSTACK_0,#256 cmp BSTACK_1,#0 beq copy_array_21_b cmp BSTACK_1,BSTACK_0 bne copy_array_21_ab copy_array_21_r_a: ldr BSTACK_1,[ASTACK_2,#-9] mul BSTACK_1,BSTACK_0,BSTACK_1 cmp BSTACK_1,#0 beq copy_lp1 b copy_lp2_lp1_all_pointers copy_array_21_a: ldr BSTACK_1,[ASTACK_2,#-9] cmp BSTACK_1,#0 beq copy_lp1 b copy_lp2_lp1_all_pointers copy_array_21_b: ldr BSTACK_1,[ASTACK_2,#-9] mul BSTACK_1,BSTACK_0,BSTACK_1 add ASTACK_2,ASTACK_2,BSTACK_1,lsl #2 b copy_lp1 copy_array_21_ab: ldr SCRATCH_REG,[ASTACK_2,#-9] cmp SCRATCH_REG,#0 beq copy_lp1 str SCRATCH_REG,[BSTACK_PTR,#0] lsl BSTACK_0,BSTACK_0,#2 str BSTACK_1,[BSTACK_PTR,#8] str BSTACK_0,[BSTACK_PTR,#4] copy_array_21_lp_ab: add BSTACK_2,ASTACK_2,BSTACK_0 str BSTACK_2,[BSTACK_PTR,#12] mov BSTACK_2,#-1 b copy_lp2 end_copy1: cmp ASTACK_2,#-1 it ne bxne lr copy_array_21_lp_ab_next: ldr ASTACK_2,[BSTACK_PTR,#12] ldr SCRATCH_REG,[BSTACK_PTR] ldr BSTACK_1,[BSTACK_PTR,#8] ldr BSTACK_0,[BSTACK_PTR,#4] subs SCRATCH_REG,SCRATCH_REG,#1 str SCRATCH_REG,[BSTACK_PTR] bne copy_array_21_lp_ab b copy_lp1 .ifdef PIC lto small_integers,1 lto static_characters,1 ltol __STRING__+2,__STRING___o_2,7 lto heap_p1,9 lto heap_copied_vector,4 lto heap_p1,10 lto heap_copied_vector,5 lto e__system__nind,8 lto e__system__nind,9 lto heap_p1,11 lto heap_copied_vector,6 lto e__system__nind,10 lto heap_p1,12 lto heap_copied_vector,7 .ifdef DLL ltol __ARRAY__+2,__ARRAY___o_2,15 .endif lto heap_p1,13 lto semi_space_size,1 lto heap_p1,14 lto semi_space_size,2 ltol BOOL+2,BOOL_o_2,4 .endif .ltorg skip_copy_gc: