diff options
Diffstat (limited to 'thumb2copy.s')
-rw-r--r-- | thumb2copy.s | 1332 |
1 files changed, 1332 insertions, 0 deletions
diff --git a/thumb2copy.s b/thumb2copy.s new file mode 100644 index 0000000..160ff03 --- /dev/null +++ b/thumb2copy.s @@ -0,0 +1,1332 @@ +
+ZERO_ARITY_DESCRIPTOR_OFFSET = -4
+COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP = 1
+
+ str r9,[sp,#-4]!
+
+ lao r12,heap_p2,9
+ ldo r10,r12,heap_p2,9
+
+ lao r12,heap_size_129,4
+ ldo r4,r12,heap_size_129,4
+ lsl r4,r4,#6
+
+ lao r12,semi_space_size,0
+ sto r4,r12,semi_space_size,0
+
+ add r9,r10,r4
+
+@ r0 = INT+2
+@ r1 = CHAR+2
+ laol r0,INT+2,INT_o_2,6
+ laol r1,CHAR+2,CHAR_o_2,2
+ otoa r0,INT_o_2,6
+ otoa r1,CHAR_o_2,2
+
+.if WRITE_HEAP
+ laol r12,heap2_begin_and_end+4,heap2_begin_and_end_o_4,0
+ sto r9,r12,heap2_begin_and_end_o_4,0
+.endif
+
+ sub sp,sp,#16
+
+ lao r12,caf_list,0
+ ldo r4,r12,caf_list,0
+ tst r4,r4
+ beq end_copy_cafs
+
+copy_cafs_lp:
+ ldr r12,[r4,#-4]
+ str r12,[sp,#-4]!
+
+ add r8,r4,#4
+ ldr r3,[r4]
+ mov r2,#-2
+ bl copy_lp2
+
+ ldr r4,[sp],#4
+ cmp r4,#0
+ bne copy_cafs_lp
+
+end_copy_cafs:
+ ldr r3,[sp,#16]
+ lao r12,stack_p,4
+ ldo r8,r12,stack_p,4
+ sub r3,r3,r8
+ lsr r3,r3,#2
+
+ cmp r3,#0
+ beq end_copy0
+ mov r2,#-2
+ bl copy_lp2
+end_copy0:
+ lao r12,heap_p2,10
+ ldo r8,r12,heap_p2,10
+
+ bl copy_lp1
+
+ add sp,sp,#16
+
+ lao r12,heap_end_after_gc,10
+ sto r9,r12,heap_end_after_gc,10
+
+.ifdef FINALIZERS
+ lao r6,finalizer_list,1
+ lao r7,free_finalizer_list,3
+ otoa r6,finalizer_list,1
+ otoa r7,free_finalizer_list,3
+ ldr r8,[r6]
+
+determine_free_finalizers_after_copy:
+ ldr r4,[r8]
+ tst r4,#1
+ beq finalizer_not_used_after_copy
+
+ ldr r8,[r8,#4]
+ sub r4,r4,#1
+ str r4,[r6]
+ add r6,r4,#4
+ b determine_free_finalizers_after_copy
+
+finalizer_not_used_after_copy:
+ laol r12,__Nil-4,__Nil_o_m4,3
+ otoa r12,__Nil_o_m4,3
+ cmp r8,r12
+ beq end_finalizers_after_copy
+
+ str r8,[r7]
+ add r7,r8,#4
+ ldr r8,[r8,#4]
+ b determine_free_finalizers_after_copy
+
+end_finalizers_after_copy:
+ str r8,[r6]
+ str r8,[r7]
+.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 r2,r8,r3,lsl #2
+
+copy_lp2_lp1:
+copy_lp2:
+ ldr r7,[r8],#4
+ sub r5,r8,#4
+
+copy_lp2__lp1:
+copy_lp2_:
+@ selectors:
+continue_after_selector_2:
+ ldr r6,[r7]
+ tst r6,#2
+ beq not_in_hnf_2
+
+in_hnf_2:
+ ldrh r4,[r6,#-2]
+ cmp r4,#0
+ beq copy_arity_0_node2
+
+ cmp r4,#256
+ bhs copy_record_2
+
+ subs r4,r4,#2
+ str r10,[r5]
+ bhi copy_hnf_node2_3
+
+ str r6,[r10],#1
+ blo copy_hnf_node2_1
+
+ ldr r6,[r7,#4]
+
+ str r10,[r7]
+ ldr r4,[r7,#8]
+
+ subs r3,r3,#1
+ str r6,[r10,#4-1]
+
+ str r4,[r10,#8-1]
+ add r10,r10,#12-1
+
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_hnf_node2_1:
+ ldr r4,[r7,#4]
+
+ subs r3,r3,#1
+ str r10,[r7]
+
+ str r4,[r10,#4-1]
+ add r10,r10,#8-1
+
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_hnf_node2_3:
+ str r6,[r10],#1
+
+ str r10,[r7]
+ ldr r6,[r7,#4]
+
+ str r6,[r10,#4-1]
+ ldr r6,[r7,#8]
+
+ add r10,r10,#12-1
+ ldr r7,[r6]
+
+ tst r7,#1
+ bne arguments_already_copied_2
+
+ str r10,[r10,#-4]
+
+ str r7,[r10],#1
+
+ str r10,[r6],#4
+ add r10,r10,#4-1
+
+cp_hnf_arg_lp2:
+ ldr r7,[r6],#4
+ str r7,[r10],#4
+ subs r4,r4,#1
+ bne cp_hnf_arg_lp2
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+arguments_already_copied_2:
+ str r7,[r10,#-4]
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_arity_0_node2:
+ cmp r6,r0 @ INT+2
+ blo copy_real_file_or_string_2
+
+ cmp r6,r1 @ CHAR+2
+ bhi copy_normal_hnf_0_2
+
+copy_int_bool_or_char_2:
+ ldr r4,[r7,#4]
+ beq copy_char_2
+
+ cmp r6,r0 @ INT+2
+ bne no_small_int_or_char_2
+
+copy_int_2:
+ cmp r4,#33
+ bhs no_small_int_or_char_2
+
+ lao r12,small_integers,1
+ subs r3,r3,#1
+ otoa r12,small_integers,1
+
+ add r4,r12,r4,lsl #3
+
+ str r4,[r5]
+ bne copy_lp2
+
+ mov r8,r2
+ b copy_lp1
+
+copy_char_2:
+ and r4,r4,#255
+
+ lao r12,static_characters,1
+ subs r3,r3,#1
+ otoa r12,static_characters,1
+
+ add r4,r12,r4,lsl #3
+
+ str r4,[r5]
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+no_small_int_or_char_2:
+copy_record_node2_1_b:
+ str r6,[r9,#-8]
+
+ str r4,[r9,#-4]
+ sub r9,r9,#7
+
+ str r9,[r7]
+ sub r9,r9,#1
+
+ str r9,[r5]
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_normal_hnf_0_2:
+ sub r6,r6,#2-ZERO_ARITY_DESCRIPTOR_OFFSET
+ subs r3,r3,#1
+
+ str r6,[r5]
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_real_file_or_string_2:
+ laol r12,__STRING__+2,__STRING___o_2,7
+ otoa r12,__STRING___o_2,7
+ cmp r6,r12
+ bls copy_string_or_array_2
+
+copy_real_or_file_2:
+ str r6,[r9,#-12]
+ sub r9,r9,#12-1
+
+ str r9,[r7]
+ sub r9,r9,#1
+
+ ldr r4,[r7,#4]
+ ldr r6,[r7,#8]
+
+ str r9,[r5]
+
+ str r4,[r9,#4]
+ subs r3,r3,#1
+
+ str r6,[r9,#8]
+
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+already_copied_2:
+ sub r6,r6,#1
+ subs r3,r3,#1
+
+ str r6,[r5]
+
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_record_2:
+ ldrh r12,[r6,#-2+2]
+ sub r4,r4,#256
+ subs r4,#2
+ bhi copy_record_node2_3
+ blo copy_record_node2_1
+
+ cmp r12,#0
+ beq copy_real_or_file_2
+
+ str r10,[r5]
+ str r6,[r10]
+
+ add r6,r10,#1
+ ldr r4,[r7,#4]
+
+ str r6,[r7]
+
+ str r4,[r10,#4]
+ ldr r4,[r7,#8]
+
+ str r4,[r10,#8]
+
+ add r10,r10,#12
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_record_node2_1:
+ ldr r4,[r7,#4]
+
+ cmp r12,#0
+ beq copy_record_node2_1_b
+
+ str r10,[r5]
+ str r6,[r10]
+
+ add r6,r10,#1
+ str r4,[r10,#4]
+
+ str r6,[r7]
+
+ add r10,r10,#8
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_record_node2_3:
+ cmp r12,#1
+ bls copy_record_node2_3_ab_or_b
+
+ str r4,[sp,#-4]!
+ add r4,r10,#1
+
+ str r4,[r7]
+ ldr r4,[r7,#8]
+
+ str r6,[r10]
+ ldr r7,[r7,#4]
+
+ str r7,[r10,#4]
+ str r10,[r5]
+
+ ldr r12,[r4]
+ mov r6,r4
+ tst r12,#1
+ bne record_arguments_already_copied_2
+
+ add r7,r10,#12
+
+ ldr r4,[sp],#4
+ str r7,[r10,#8]
+
+ add r10,r10,#13
+ ldr r7,[r6]
+
+ str r10,[r6],#4
+
+ str r7,[r10,#-1]
+ add r10,r10,#3
+
+cp_record_arg_lp2:
+ ldr r7,[r6],#4
+
+ str r7,[r10],#4
+
+ subs r4,r4,#1
+ bne cp_record_arg_lp2
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+record_arguments_already_copied_2:
+ ldr r7,[r6]
+ ldr r4,[sp],#4
+
+ str r7,[r10,#8]
+ add r10,r10,#12
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_record_node2_3_ab_or_b:
+ blo copy_record_node2_3_b
+
+copy_record_node2_3_ab:
+ str r4,[sp,#-4]!
+ add r4,r10,#1
+
+ lao r12,heap_p1,9
+
+ str r4,[r7]
+ ldr r4,[r7,#8]
+
+ ldo r12,r12,heap_p1,9
+
+ str r6,[r10]
+ ldr r7,[r7,#4]
+
+ mov r6,r4
+ sub r4,r4,r12
+
+ lao r12,heap_copied_vector,4
+
+ str r7,[r10,#4]
+
+ lsr r7,r4,#6
+ lsr r4,r4,#3
+
+ and r4,r4,#31
+
+ ldo r12,r12,heap_copied_vector,4
+ and r7,r7,#-4
+
+ str r10,[r5]
+
+ add r7,r7,r12
+
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r7]
+ tst r4,r12
+ bne record_arguments_already_copied_2
+
+ orr r12,r12,r4
+ str r12,[r7]
+ ldr r4,[sp],#4
+
+ sub r9,r9,#4
+
+ lsl r4,r4,#2
+ sub r9,r9,r4
+
+ str r9,[sp,#-4]!
+ add r9,r9,#1
+
+ str r9,[r10,#8]
+ add r10,r10,#12
+
+ ldr r7,[r6]
+ b cp_record_arg_lp3_c
+
+copy_record_node2_3_b:
+ str r4,[sp,#-4]!
+ add r4,r9,#-12+1
+
+ lao r12,heap_p1,10
+
+ str r4,[r7]
+ ldr r4,[r7,#8]
+
+ ldo r12,r12,heap_p1,10
+
+ str r6,[r9,#-12]
+ ldr r7,[r7,#4]
+
+ mov r6,r4
+ sub r4,r4,r12
+
+ lao r12,heap_copied_vector,5
+
+ str r7,[r9,#-8]
+
+ lsr r7,r4,#6
+ sub r9,r9,#12
+ lsr r4,r4,#3
+
+ and r4,r4,#31
+
+ ldo r12,r12,heap_copied_vector,5
+ and r7,r7,#-4
+
+ str r9,[r5]
+
+ add r7,r7,r12
+
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r7]
+ tst r4,r12
+ bne record_arguments_already_copied_3_b
+
+ orr r12,r12,r4
+ str r12,[r7]
+ ldr r4,[sp],#4
+
+ mov r7,r9
+ sub r9,r9,#4
+
+ lsl r4,r4,#2
+ sub r9,r9,r4
+
+ str r9,[r7,#8]
+
+ ldr r7,[r6]
+
+ str r9,[sp,#-4]!
+ add r9,r9,#1
+
+cp_record_arg_lp3_c:
+ str r9,[r6],#4
+
+ str r7,[r9,#-1]
+ add r9,r9,#3
+
+cp_record_arg_lp3:
+ ldr r7,[r6],#4
+
+ str r7,[r9],#4
+
+ subs r4,r4,#4
+ bne cp_record_arg_lp3
+
+ ldr r9,[sp],#4
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+record_arguments_already_copied_3_b:
+ ldr r7,[r6]
+ ldr r4,[sp],#4
+
+ sub r7,r7,#1
+ str r7,[r9,#8]
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+not_in_hnf_2:
+ tst r6,#1
+ bne already_copied_2
+
+ ldr r4,[r6,#-4]
+ cmp r4,#0
+ ble copy_arity_0_node2_
+
+copy_node2_1_:
+ and r4,r4,#255
+ subs r4,r4,#2
+ blt copy_arity_1_node2
+copy_node2_3:
+ str r10,[r5]
+ str r6,[r10]
+ add r10,r10,#1
+ str r10,[r7]
+ ldr r6,[r7,#4]
+ add r7,r7,#8
+ str r6,[r10,#4-1]
+ add r10,r10,#8-1
+
+cp_arg_lp2:
+ ldr r6,[r7],#4
+ str r6,[r10],#4
+ subs r4,r4,#1
+ bhs cp_arg_lp2
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_arity_1_node2__:
+ ldr r3,[sp],#4
+copy_arity_1_node2:
+copy_arity_1_node2_:
+ str r10,[r5]
+ add r10,r10,#1
+
+ str r10,[r7]
+
+ ldr r4,[r7,#4]
+ str r6,[r10,#-1]
+
+ str r4,[r10,#4-1]
+ add r10,r10,#12-1
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_indirection_2:
+ mov r4,r7
+ ldr r7,[r7,#4]
+
+ ldr r6,[r7]
+ tst r6,#2
+ bne in_hnf_2
+
+ tst r6,#1
+ bne already_copied_2
+
+ ldr r12,[r6,#-4]
+ cmp r12,#-2
+ beq skip_indirections_2
+
+ movs r4,r12
+ ble copy_arity_0_node2_
+ b copy_node2_1_
+
+skip_indirections_2:
+ ldr r7,[r7,#4]
+
+ ldr r6,[r7]
+ tst r6,#2
+ bne update_indirection_list_2
+ tst r6,#1
+ bne update_indirection_list_2
+
+ ldr r12,[r6,#-4]
+ cmp r12,#-2
+ beq skip_indirections_2
+
+update_indirection_list_2:
+ add r6,r4,#4
+ ldr r4,[r4,#4]
+ str r7,[r6]
+ cmp r7,r4
+ bne update_indirection_list_2
+
+ b continue_after_selector_2
+
+copy_selector_2:
+ cmp r4,#-2
+ beq copy_indirection_2
+ blt copy_record_selector_2
+
+ ldr r4,[r7,#4]
+
+ str r3,[sp,#-4]!
+
+ ldr r3,[r4]
+ tst r3,#2
+ beq copy_arity_1_node2__
+
+ ldrh r12,[r3,#-2]
+ cmp r12,#2
+ bls copy_selector_2_
+
+ ldr r3,[r4,#8]
+ ldrb r12,[r3]
+ tst r12,#1
+ bne copy_arity_1_node2__
+
+.ifdef PIC
+ add r11,r6,#-8+4
+.endif
+ ldr r6,[r6,#-8]
+ lao r12,e__system__nind,8
+.ifdef PIC
+ ldrh r6,[r11,r6]
+.else
+ ldrh r6,[r6,#4]
+.endif
+ otoa r12,e__system__nind,8
+ str r12,[r7]
+
+ cmp r6,#8
+ blt copy_selector_2_1
+ beq copy_selector_2_2
+
+ sub r3,r3,#12
+ ldr r6,[r6,r3]
+ ldr r3,[sp],#4
+ str r6,[r7,#4]
+ mov r7,r6
+ b continue_after_selector_2
+
+copy_selector_2_1:
+ ldr r6,[r4,#4]
+ ldr r3,[sp],#4
+ str r6,[r7,#4]
+ mov r7,r6
+ b continue_after_selector_2
+
+copy_selector_2_2:
+ ldr r6,[r3]
+ ldr r3,[sp],#4
+ str r6,[r7,#4]
+ mov r7,r6
+ b continue_after_selector_2
+
+copy_selector_2_:
+.ifdef PIC
+ add r11,r6,#-8+4
+.endif
+ ldr r6,[r6,#-8]
+ ldr r3,[sp],#4
+
+ lao r12,e__system__nind,9
+.ifdef PIC
+ ldrh r6,[r11,r6]
+.else
+ ldrh r6,[r6,#4]
+.endif
+ otoa r12,e__system__nind,9
+ str r12,[r7]
+
+ ldr r6,[r4,r6]
+ str r6,[r7,#4]
+ mov r7,r6
+ b continue_after_selector_2
+
+copy_record_selector_2:
+ cmp r4,#-3
+ ldr r4,[r7,#4]
+ ldr r4,[r4]
+ beq copy_strict_record_selector_2
+
+ tst r4,#2
+ beq copy_arity_1_node2_
+
+ ldrh r12,[r4,#-2]
+ mov r11,#258/2
+ cmp r12,r11,lsl #1
+ bls copy_record_selector_2_
+
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#2
+ bhs copy_selector_2__
+
+ lao r12,heap_p1,11
+
+ ldr r4,[r7,#4]
+ str r7,[sp,#-4]!
+
+ ldo r12,r12,heap_p1,11
+
+ ldr r4,[r4,#8]
+
+ sub r4,r4,r12
+
+ lao r12,heap_copied_vector,6
+
+ lsr r7,r4,#6
+ lsr r4,r4,#3
+
+ ldo r12,r12,heap_copied_vector,6
+
+ and r7,r7,#-4
+ and r4,r4,#31
+
+ add r7,r7,r12
+
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r7]
+ ands r4,r4,r12
+ ldr r7,[sp],#4
+ beq copy_record_selector_2_
+ b copy_arity_1_node2_
+copy_selector_2__:
+ ldr r4,[r7,#4]
+ ldr r4,[r4,#8]
+ ldrb r12,[r4]
+ tst r12,#1
+ bne copy_arity_1_node2_
+copy_record_selector_2_:
+.ifdef PIC
+ add r11,r6,#-8+4
+.endif
+ ldr r4,[r6,#-8]
+ lao r12,e__system__nind,10
+ ldr r6,[r7,#4]
+ otoa r12,e__system__nind,10
+ str r12,[r7]
+
+.ifdef PIC
+ ldrh r4,[r11,r4]
+.else
+ ldrh r4,[r4,#4]
+.endif
+ cmp r4,#8
+ ble copy_record_selector_3
+ ldr r6,[r6,#8]
+ sub r4,r4,#12
+copy_record_selector_3:
+ ldr r6,[r6,r4]
+
+ str r6,[r7,#4]
+
+ mov r7,r6
+ b continue_after_selector_2
+
+copy_strict_record_selector_2:
+ tst r4,#2
+ beq copy_arity_1_node2_
+
+ ldrh r12,[r4,#-2]
+ mov r11,#258/2
+ cmp r12,r11,lsl #1
+ bls copy_strict_record_selector_2_
+
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#2
+ blo copy_strict_record_selector_2_b
+
+ ldr r4,[r7,#4]
+ ldr r4,[r4,#8]
+ ldrb r12,[r4]
+ tst r12,#1
+ bne copy_arity_1_node2_
+
+ b copy_strict_record_selector_2_
+
+copy_strict_record_selector_2_b:
+ lao r12,heap_p1,12
+
+ ldr r4,[r7,#4]
+ str r7,[sp,#-4]!
+
+ ldo r12,r12,heap_p1,12
+
+ ldr r4,[r4,#8]
+
+ sub r4,r4,r12
+
+ lao r12,heap_copied_vector,7
+
+ lsr r7,r4,#6
+ lsr r4,r4,#3
+
+ ldo r12,r12,heap_copied_vector,7
+
+ and r7,r7,#-4
+ and r4,r4,#31
+
+ add r7,r7,r12
+
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r7]
+ ands r4,r4,r12
+ ldr r7,[sp],#4
+
+ bne copy_arity_1_node2_
+
+copy_strict_record_selector_2_:
+.ifdef PIC
+ add r11,r6,#-8+4
+.endif
+ ldr r4,[r6,#-8]
+
+ str r3,[sp,#-4]!
+ ldr r6,[r7,#4]
+
+.ifdef PIC
+ ldrh r3,[r4,r11]!
+.else
+ ldrh r3,[r4,#4]
+.endif
+ cmp r3,#8
+ ble copy_strict_record_selector_3
+ ldr r12,[r6,#8]
+ add r3,r3,r12
+ ldr r3,[r3,#-12]
+ b copy_strict_record_selector_4
+copy_strict_record_selector_3:
+ ldr r3,[r6,r3]
+copy_strict_record_selector_4:
+ str r3,[r7,#4]
+
+.ifdef PIC
+ ldrh r3,[r4,#6-4]
+.else
+ ldrh r3,[r4,#6]
+.endif
+ tst r3,r3
+ beq copy_strict_record_selector_6
+ cmp r3,#8
+ ble copy_strict_record_selector_5
+ ldr r6,[r6,#8]
+ sub r3,r3,#12
+copy_strict_record_selector_5:
+ ldr r3,[r6,r3]
+ str r3,[r7,#8]
+copy_strict_record_selector_6:
+
+.ifdef PIC
+ ldr r6,[r4,#-4-4]
+.else
+ ldr r6,[r4,#-4]
+.endif
+ str r6,[r7]
+ ldr r3,[sp],#4
+ tst r6,#2
+ bne in_hnf_2
+hlt: b hlt
+
+copy_arity_0_node2_:
+ blt copy_selector_2
+
+ str r6,[r9,#-12]!
+ str r9,[r5]
+ add r4,r9,#1
+
+ str r4,[r7]
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_string_or_array_2:
+.ifdef DLL
+ beq copy_string_2
+ laol r12,__ARRAY__+2,__ARRAY___o_2,15
+ otoa r12,__ARRAY___o_2,15
+ cmp r6,r12
+ blo copy_normal_hnf_0_2
+ mov r6,r7
+ b copy_array_2
+copy_string_2:
+ mov r6,r7
+.else
+ mov r6,r7
+ bne copy_array_2
+.endif
+ lao r12,heap_p1,13
+ ldo r12,r12,heap_p1,13
+ sub r7,r7,r12
+
+ lao r12,semi_space_size,1
+ ldo r12,r12,semi_space_size,1
+ cmp r7,r12
+ bhs copy_string_or_array_constant
+
+ ldr r7,[r6,#4]
+
+ add r7,r7,#3
+ str r3,[sp,#-4]!
+
+ lsr r4,r7,#2
+ and r7,r7,#-4
+
+ sub r9,r9,r7
+
+ ldr r3,[r6],#4
+
+ str r3,[r9,#-8]!
+
+ str r9,[r5]
+ add r7,r9,#1
+
+ str r7,[r6,#-4]
+ add r7,r9,#4
+
+cp_s_arg_lp2:
+ ldr r3,[r6],#4
+
+ str r3,[r7],#4
+
+ subs r4,r4,#1
+ bge cp_s_arg_lp2
+
+ ldr r3,[sp],#4
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_array_2:
+ lao r12,heap_p1,14
+ ldo r12,r12,heap_p1,14
+ sub r7,r7,r12
+
+ lao r12,semi_space_size,2
+ ldo r12,r12,semi_space_size,2
+ cmp r7,r12
+ bhs copy_string_or_array_constant
+
+ str r3,[sp,#-4]!
+
+ ldr r4,[r6,#8]
+ cmp r4,#0
+ beq copy_array_a2
+
+ ldrh r3,[r4,#-2]
+
+ cmp r3,#0
+ beq copy_strict_basic_array_2
+
+ sub r3,r3,#256
+ ldr r12,[r6,#4]
+ mul r3,r12,r3
+ b copy_array_a3
+
+copy_array_a2:
+ ldr r3,[r6,#4]
+copy_array_a3:
+ mov r7,r10
+
+ add r10,r10,#12
+ add r10,r10,r3,lsl #2
+
+ str r7,[r5]
+ ldr r4,[r6]
+
+ str r4,[r7]
+
+ add r4,r7,#1
+ add r7,r7,#4
+
+ str r4,[r6],#4
+
+ add r4,r3,#1
+ b cp_s_arg_lp2
+
+copy_strict_basic_array_2:
+ ldr r3,[r6,#4]
+ cmp r4,r0 @ INT+2
+ beq copy_int_array_2
+
+ laol r12,BOOL+2,BOOL_o_2,4
+ otoa r12,BOOL_o_2,4
+ cmp r4,r12
+ beq copy_bool_array_2
+
+ add r3,r3,r3
+copy_int_array_2:
+ add r7,r9,#-12
+
+ sub r7,r7,r3,lsl #2
+ ldr r4,[r6]
+
+ str r7,[r5]
+
+ mov r9,r7
+
+ str r4,[r7]
+ add r4,r7,#1
+
+ add r7,r7,#4
+ str r4,[r6],#4
+
+ add r4,r3,#1
+ b cp_s_arg_lp2
+
+copy_bool_array_2:
+ add r3,r3,#3
+ lsr r3,r3,#2
+ b copy_int_array_2
+
+copy_string_or_array_constant:
+ str r6,[r5]
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+@
+@ Copy all referenced nodes to the other semi space
+@
+
+copy_lp1:
+ cmp r8,r10
+ bhs end_copy1
+
+ ldr r4,[r8],#4
+ tst r4,#2
+ beq not_in_hnf_1
+in_hnf_1:
+ ldrh r3,[r4,#-2]
+
+ cmp r3,#0
+ beq copy_array_21
+
+ cmp r3,#2
+ bls copy_lp2_lp1_all_pointers
+
+ cmp r3,#256
+ bhs copy_record_21
+
+ ldr r12,[r8,#4]
+ tst r12,#1
+ bne node_without_arguments_part
+
+ ldr r7,[r8],#8
+ sub r5,r8,#8
+ sub r2,r8,#4
+ add r2,r2,r3,lsl #2
+ b copy_lp2__lp1
+
+copy_record_21:
+ sub r3,r3,#256
+ subs r3,r3,#2
+ bhi copy_record_arguments_3
+
+ ldrh r3,[r4,#-2+2]
+ blo copy_record_arguments_1
+
+ add r2,r8,#8
+
+ cmp r3,#1
+ bhi copy_lp2_lp1
+ b copy_node_arity1
+
+copy_record_arguments_1:
+ add r2,r8,#4
+ b copy_lp2_lp1
+
+copy_record_arguments_3:
+ ldr r12,[r8,#4]
+ tst r12,#1
+ bne record_node_without_arguments_part
+
+ ldrh r7,[r4,#-2+2]
+
+ add r6,r8,r3,lsl #2
+ add r2,r6,#3*4
+ mov r3,r7
+
+ ldr r7,[r8],#8
+ sub r5,r8,#8
+ b copy_lp2__lp1
+
+node_without_arguments_part:
+record_node_without_arguments_part:
+ ldr r7,[r8],#8
+ sub r4,r12,#1
+
+ mov r3,#1
+ sub r5,r8,#8
+ str r4,[r8,#-4]
+ mov r2,r8
+ b copy_lp2__lp1
+
+not_in_hnf_1:
+ ldr r3,[r4,#-4]
+ cmp r3,#256
+ bgt copy_unboxed_closure_arguments
+
+ cmp r3,#1
+ bgt copy_lp2_lp1_all_pointers
+
+copy_node_arity1:
+ ldr r7,[r8],#8
+ mov r3,#1
+ sub r5,r8,#8
+ mov r2,r8
+ b copy_lp2__lp1
+
+copy_unboxed_closure_arguments:
+ ldr r12,=257
+ cmp r3,r12
+ beq copy_unboxed_closure_arguments1
+
+ uxtb r4,r3,ror #8
+ and r2,r3,#255
+
+ subs r3,r2,r4
+ add r2,r8,r2,lsl #2
+ bne copy_lp2_lp1
+
+copy_unboxed_closure_arguments_without_pointers:
+ mov r8,r2
+ b copy_lp1
+
+copy_unboxed_closure_arguments1:
+ add r8,r8,#8
+ b copy_lp1
+
+copy_array_21:
+ ldr r3,[r8,#4]
+ add r8,r8,#8
+ cmp r3,#0
+ beq copy_array_21_a
+
+ ldrh r4,[r3,#-2]
+ ldrh r3,[r3,#-2+2]
+ sub r4,r4,#256
+ cmp r3,#0
+ beq copy_array_21_b
+
+ cmp r3,r4
+ bne copy_array_21_ab
+
+copy_array_21_r_a:
+ ldr r3,[r8,#-8]
+ mul r3,r4,r3
+ cmp r3,#0
+ beq copy_lp1
+ b copy_lp2_lp1_all_pointers
+
+copy_array_21_a:
+ ldr r3,[r8,#-8]
+ cmp r3,#0
+ beq copy_lp1
+ b copy_lp2_lp1_all_pointers
+
+copy_array_21_b:
+ ldr r3,[r8,#-8]
+ mul r3,r4,r3
+ add r8,r8,r3,lsl #2
+ b copy_lp1
+
+copy_array_21_ab:
+ ldr r12,[r8,#-8]
+ cmp r12,#0
+ beq copy_lp1
+
+ str r12,[sp,#0]
+ lsl r4,r4,#2
+ str r3,[sp,#8]
+ str r4,[sp,#4]
+
+copy_array_21_lp_ab:
+ add r2,r8,r4
+ str r2,[sp,#12]
+ mov r2,#-1
+ b copy_lp2
+
+end_copy1:
+ cmp r8,#-1
+ it ne
+ bxne lr
+
+copy_array_21_lp_ab_next:
+ ldr r8,[sp,#12]
+ ldr r12,[sp]
+ ldr r3,[sp,#8]
+ ldr r4,[sp,#4]
+ subs r12,r12,#1
+ str r12,[sp]
+ 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:
|