diff options
author | John van Groningen | 2015-09-02 11:58:16 +0000 |
---|---|---|
committer | John van Groningen | 2015-09-02 11:58:16 +0000 |
commit | bdaf097230053cca853fdab65b026ce1e3678161 (patch) | |
tree | 73dcb94a2d998484965bdf53cd155b9be11c6237 /armcopy.s | |
parent | port to android (diff) |
add runtime system for the ARM
Diffstat (limited to 'armcopy.s')
-rw-r--r-- | armcopy.s | 1235 |
1 files changed, 1235 insertions, 0 deletions
diff --git a/armcopy.s b/armcopy.s new file mode 100644 index 0000000..3706e06 --- /dev/null +++ b/armcopy.s @@ -0,0 +1,1235 @@ +
+ZERO_ARITY_DESCRIPTOR_OFFSET = -4
+COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP = 1
+
+ str r9,[sp,#-4]!
+
+ ldr r12,=heap_p2
+ ldr r10,[r12]
+
+ ldr r12,=heap_size_129
+ ldr r4,[r12]
+ lsl r4,r4,#6
+
+ ldr r12,=semi_space_size
+ str r4,[r12]
+ add r9,r10,r4
+
+@ r0 = INT+2
+ ldr r0,=INT+2
+@ r1 = CHAR+2
+ ldr r1,=CHAR+2
+
+.if WRITE_HEAP
+ ldr r12,=heap2_begin_and_end
+ str r9,[r12,#4]
+.endif
+
+ sub sp,sp,#16
+
+ ldr r12,=caf_list
+ ldr r4,[r12]
+ 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]
+ ldr r12,=stack_p
+ ldr r8,[r12]
+ sub r3,r3,r8
+ lsr r3,r3,#2
+
+ cmp r3,#0
+ beq end_copy0
+ mov r2,#-2
+ bl copy_lp2
+end_copy0:
+ ldr r12,=heap_p2
+ ldr r8,[r12]
+
+ bl copy_lp1
+
+ add sp,sp,#16
+
+ ldr r12,=heap_end_after_gc
+ str r9,[r12]
+
+.ifdef FINALIZERS
+ ldr r6,=finalizer_list
+ ldr r7,=free_finalizer_list
+ 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:
+ ldr r12,=__Nil-4
+ 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
+
+ .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
+
+ ldr r12,=small_integers
+ add r4,r12,r4,lsl #3
+ subs r3,r3,#1
+
+ str r4,[r5]
+ bne copy_lp2
+
+ mov r8,r2
+ b copy_lp1
+
+copy_char_2:
+ and r4,r4,#255
+
+ ldr r12,=static_characters
+ add r4,r12,r4,lsl #3
+ subs r3,r3,#1
+
+ 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:
+ ldr r12,=__STRING__+2
+ 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
+
+ ldr r12,=heap_p1
+
+ str r4,[r7]
+ ldr r4,[r7,#8]
+
+ ldr r12,[r12]
+
+ str r6,[r10]
+ ldr r7,[r7,#4]
+
+ mov r6,r4
+ sub r4,r4,r12
+
+ ldr r12,=heap_copied_vector
+
+ str r7,[r10,#4]
+
+ lsr r7,r4,#6
+ lsr r4,r4,#3
+
+ and r4,r4,#31
+
+ ldr r12,[r12]
+ 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
+
+ ldr r12,=heap_p1
+
+ str r4,[r7]
+ ldr r4,[r7,#8]
+
+ ldr r12,[r12]
+
+ str r6,[r9,#-12]
+ ldr r7,[r7,#4]
+
+ mov r6,r4
+ sub r4,r4,r12
+
+ ldr r12,=heap_copied_vector
+
+ str r7,[r9,#-8]
+
+ lsr r7,r4,#6
+ sub r9,r9,#12
+ lsr r4,r4,#3
+
+ and r4,r4,#31
+
+ ldr r12,[r12]
+ 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__
+
+ ldr r6,[r6,#-8]
+
+ ldrh r6,[r6,#4]
+ ldr r12,=__indirection
+ 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_:
+ ldr r6,[r6,#-8]
+ ldr r3,[sp],#4
+
+ ldrh r6,[r6,#4]
+ ldr r12,=__indirection
+ 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__
+
+ ldr r12,=heap_p1
+
+ ldr r4,[r7,#4]
+ str r7,[sp,#-4]!
+
+ ldr r12,[r12]
+
+ ldr r4,[r4,#8]
+
+ sub r4,r4,r12
+
+ ldr r12,=heap_copied_vector
+
+ lsr r7,r4,#6
+ lsr r4,r4,#3
+
+ ldr r12,[r12]
+
+ 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_:
+ ldr r4,[r6,#-8]
+ ldr r6,[r7,#4]
+ ldr r12,=__indirection
+ str r12,[r7]
+
+ ldrh r4,[r4,#4]
+ 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:
+ ldr r12,=heap_p1
+
+ ldr r4,[r7,#4]
+ str r7,[sp,#-4]!
+
+ ldr r12,[r12]
+
+ ldr r4,[r4,#8]
+
+ sub r4,r4,r12
+
+ ldr r12,=heap_copied_vector
+
+ lsr r7,r4,#6
+ lsr r4,r4,#3
+
+ ldr r12,[r12]
+
+ 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_:
+ ldr r4,[r6,#-8]
+
+ str r3,[sp,#-4]!
+ ldr r6,[r7,#4]
+
+ ldrh r3,[r4,#4]
+ 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]
+
+ ldrh r3,[r4,#6]
+ 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:
+
+ ldr r6,[r4,#-4]
+ 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
+ ldr r12,=__ARRAY__+2
+ 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
+ ldr r12,=heap_p1
+ ldr r12,[r12]
+ sub r7,r7,r12
+
+ ldr r12,=semi_space_size
+ ldr r12,[r12]
+ 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:
+ ldr r12,=heap_p1
+ ldr r12,[r12]
+ sub r7,r7,r12
+
+ ldr r12,=semi_space_size
+ ldr r12,[r12]
+ 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
+
+ ldr r12,=BOOL+2
+ 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
+ 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
+
+ .ltorg
+
+skip_copy_gc:
|