From bdaf097230053cca853fdab65b026ce1e3678161 Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Wed, 2 Sep 2015 11:58:16 +0000 Subject: add runtime system for the ARM --- armap.s | 2679 ++++++++++++++++++++++++++++++++ armcompact.s | 1140 ++++++++++++++ armcompact_rmark.s | 947 +++++++++++ armcompact_rmarkr.s | 1015 ++++++++++++ armcopy.s | 1235 +++++++++++++++ armdivmod.s | 169 ++ armfileIO3.s | 892 +++++++++++ armmark.s | 2265 +++++++++++++++++++++++++++ armstartup.s | 4316 +++++++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 14658 insertions(+) create mode 100644 armap.s create mode 100644 armcompact.s create mode 100644 armcompact_rmark.s create mode 100644 armcompact_rmarkr.s create mode 100644 armcopy.s create mode 100644 armdivmod.s create mode 100644 armfileIO3.s create mode 100644 armmark.s create mode 100644 armstartup.s diff --git a/armap.s b/armap.s new file mode 100644 index 0000000..91ddf2a --- /dev/null +++ b/armap.s @@ -0,0 +1,2679 @@ + + .text + + .globl ap_2 + .globl ap_3 + .globl ap_4 + .globl ap_5 + .globl ap_6 + .globl ap_7 + .globl ap_8 + .globl ap_9 + .globl ap_10 + .globl ap_11 + .globl ap_12 + .globl ap_13 + .globl ap_14 + .globl ap_15 + .globl ap_16 + .globl ap_17 + .globl ap_18 + .globl ap_19 + .globl ap_20 + .globl ap_21 + .globl ap_22 + .globl ap_23 + .globl ap_24 + .globl ap_25 + .globl ap_26 + .globl ap_27 + .globl ap_28 + .globl ap_29 + .globl ap_30 + .globl ap_31 + .globl ap_32 + + .globl add_empty_node_2 + .globl add_empty_node_3 + .globl add_empty_node_4 + .globl add_empty_node_5 + .globl add_empty_node_6 + .globl add_empty_node_7 + .globl add_empty_node_8 + .globl add_empty_node_9 + .globl add_empty_node_10 + .globl add_empty_node_11 + .globl add_empty_node_12 + .globl add_empty_node_13 + .globl add_empty_node_14 + .globl add_empty_node_15 + .globl add_empty_node_16 + .globl add_empty_node_17 + .globl add_empty_node_18 + .globl add_empty_node_19 + .globl add_empty_node_20 + .globl add_empty_node_21 + .globl add_empty_node_22 + .globl add_empty_node_23 + .globl add_empty_node_24 + .globl add_empty_node_25 + .globl add_empty_node_26 + .globl add_empty_node_27 + .globl add_empty_node_28 + .globl add_empty_node_29 + .globl add_empty_node_30 + .globl add_empty_node_31 + .globl add_empty_node_32 + + .globl yet_args_needed + .globl yet_args_needed_0 + .globl yet_args_needed_1 + .globl yet_args_needed_2 + .globl yet_args_needed_3 + .globl yet_args_needed_4 + .globl yet_args_needed_5 + .globl yet_args_needed_6 + .globl yet_args_needed_7 + .globl yet_args_needed_8 + .globl yet_args_needed_9 + .globl yet_args_needed_10 + .globl yet_args_needed_11 + .globl yet_args_needed_12 + .globl yet_args_needed_13 + .globl yet_args_needed_14 + .globl yet_args_needed_15 + .globl yet_args_needed_16 + .globl yet_args_needed_17 + .globl yet_args_needed_18 + .globl yet_args_needed_19 + .globl yet_args_needed_20 + .globl yet_args_needed_21 + .globl yet_args_needed_22 + .globl yet_args_needed_23 + .globl yet_args_needed_24 + .globl yet_args_needed_25 + .globl yet_args_needed_26 + .globl yet_args_needed_27 + .globl yet_args_needed_28 + .globl yet_args_needed_29 + .globl yet_args_needed_30 + .globl yet_args_needed_31 + +ap_32: + ldr r11,[r8] + mov r3,#32*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap32 + +ap_31: + ldr r11,[r8] + mov r3,#31*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap31 + +ap_30: + ldr r11,[r8] + mov r3,#30*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap30 + +ap_29: + ldr r11,[r8] + mov r3,#29*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap29 + +ap_28: + ldr r11,[r8] + mov r3,#28*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap28 + +ap_27: + ldr r11,[r8] + mov r3,#27*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap27 + +ap_26: + ldr r11,[r8] + mov r3,#26*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap26 + +ap_25: + ldr r11,[r8] + mov r3,#25*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap25 + +ap_24: + ldr r11,[r8] + mov r3,#24*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap24 + +ap_23: + ldr r11,[r8] + mov r3,#23*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap23 + +ap_22: + ldr r11,[r8] + mov r3,#22*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap22 + +ap_21: + ldr r11,[r8] + mov r3,#21*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap21 + +ap_20: + ldr r11,[r8] + mov r3,#20*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap20 + +ap_19: + ldr r11,[r8] + mov r3,#19*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap19 + +ap_18: + ldr r11,[r8] + mov r3,#18*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap18 + +ap_17: + ldr r11,[r8] + mov r3,#17*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap17 + +ap_16: + ldr r11,[r8] + mov r3,#16*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap16 + +ap_15: + ldr r11,[r8] + mov r3,#15*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap15 + +ap_14: + ldr r11,[r8] + mov r3,#14*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap14 + +ap_13: + ldr r11,[r8] + mov r3,#13*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap13 + +ap_12: + ldr r11,[r8] + mov r3,#12*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap12 + +ap_11: + ldr r11,[r8] + mov r3,#11*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap11 + +ap_10: + ldr r11,[r8] + mov r3,#10*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap10 + +ap_9: + ldr r11,[r8] + mov r3,#9*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap9 + +ap_8: + ldr r11,[r8] + mov r3,#8*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap8 + +ap_7: + ldr r11,[r8] + mov r3,#7*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap7 + +ap_6: + ldr r11,[r8] + mov r3,#6*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap6 + +ap_5: + ldr r11,[r8] + mov r3,#5*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap5 + +ap_4: + ldr r11,[r8] + mov r3,#4*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap4 + +ap_3: + ldr r11,[r8] + mov r3,#3*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap + + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap3 + +ap_2: + ldr r11,[r8] + mov r3,#2*8 + ldrh r12,[r11] + cmp r12,r3 + bne no_fast_ap2_ + +fast_ap_2_2_: + add r3,r3,r11 + ldrh r4,[r11,#-2] + ldr r2,[r3,#-6] +.ifdef PROFILE + sub r2,r2,#16 +.else + sub r2,r2,#8 +.endif + cmp r4,#1 + blo repl_args_0_2 + beq repl_args_1 + + cmp r4,#3 + blo repl_args_2 + + str r7,[r9,#4] + str r6,[r9],#8 + + ldr r7,[r8,#8] + + b fast_ap_ + +no_fast_ap2_: + str r6,[r9],#4 + mov r6,r7 + mov r7,r8 + b no_fast_ap2 + +fast_ap_2_2: + mov r8,r7 + mov r7,r6 + ldr r6,[r9,#-4]! + b fast_ap_2_2_ + +fast_ap_2: + mov r8,r7 + mov r7,r6 + ldr r6,[r9,#-4]! + +fast_ap: + add r3,r3,r11 + ldrh r4,[r11,#-2] + ldr r2,[r3,#-6] +.ifdef PROFILE + sub r2,r2,#16 +.else + sub r2,r2,#8 +.endif + cmp r4,#1 + blo repl_args_0 + beq repl_args_1 + + cmp r4,#3 + blo repl_args_2 + + str r7,[r9,#4] + str r6,[r9],#8 + + ldr r7,[r8,#8] + +fast_ap_: + ldr r8,[r8,#4] + beq repl_args_3 + + cmp r4,#5 + blo repl_args_4 + beq repl_args_5 + + cmp r4,#7 + blo repl_args_6 + + sub r4,r4,#2 + +repl_args_7_: + ldr r1,[r7,r4,lsl #2] + str r1,[r9],#4 + sub r4,r4,#1 + cmp r4,#6-2 + bne repl_args_7_ + +repl_args_6: + ldr r4,[r7,#16] + str r4,[r9],#12 + ldr r4,[r7,#12] + str r4,[r9,#-8] + ldr r4,[r7,#8] + str r4,[r9,#-4] + ldr r6,[r7,#4] + ldr r7,[r7] + bx r2 + +repl_args_0: + mov r8,r7 + mov r7,r6 + ldr r6,[r9,#-4]! +repl_args_0_2: + bx r2 + +repl_args_1: + ldr r8,[r8,#4] + bx r2 + +repl_args_2: + str r6,[r9],#4 + mov r6,r7 + ldr r7,[r8,#8] + ldr r8,[r8,#4] + bx r2 + +repl_args_3: + ldr r6,[r7,#4] + ldr r7,[r7] + bx r2 + +repl_args_4: + ldr r4,[r7,#8] + str r4,[r9],#4 + ldr r6,[r7,#4] + ldr r7,[r7] + bx r2 + +repl_args_5: + ldr r4,[r7,#12] + str r4,[r9],#8 + ldr r4,[r7,#8] + str r4,[r9,#-4] + ldr r6,[r7,#4] + ldr r7,[r7] + bx r2 + +no_fast_ap32: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#31*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap31: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#30*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap30: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#29*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap29: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#28*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap28: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#27*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap27: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#26*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap26: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#25*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap25: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#24*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap24: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#23*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap23: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#22*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap22: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#21*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap21: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#20*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap20: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#19*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap19: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#18*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap18: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#17*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap17: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#16*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap16: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#15*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap15: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#14*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap14: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#13*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap13: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#12*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap12: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#11*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap11: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#10*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap10: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#9*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap9: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#8*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap8: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#7*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap7: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#6*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap6: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#5*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap5: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#4*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap4: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#3*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2 + +no_fast_ap3: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r11,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + + mov r3,#3*8 + ldrh r12,[r11] + cmp r12,r3 + beq fast_ap_2_2 + +no_fast_ap2: + ldr r12,[r11,#2] + str pc,[sp,#-4]! + blx r12 + ldr r8,[r6] + mov r7,r6 + ldr r6,[r9,#-4]! + ldr r12,[r8,#2] + bx r12 + + .ltorg + +add_empty_node_2: + subs r5,r5,#3 + blo add_empty_node_2_gc +add_empty_node_2_gc_: + ldr r12,=__cycle__in__spine + mov r8,r7 + mov r7,r6 + mov r6,r10 + str r12,[r10],#12 + bx lr +add_empty_node_2_gc: + str lr,[sp,#-4]! + bl collect_2 + ldr lr,[sp],#4 + b add_empty_node_2_gc_ + +add_empty_node_3: + subs r5,r5,#3 + blo add_empty_node_3_gc +add_empty_node_3_gc_: + ldr r12,=__cycle__in__spine + str r10,[r9],#4 + str r12,[r10],#12 + bx lr +add_empty_node_3_gc: + str lr,[sp,#-4]! + bl collect_3 + ldr lr,[sp],#4 + b add_empty_node_3_gc_ + +add_empty_node_4: + subs r5,r5,#3 + blo add_empty_node_4_gc +add_empty_node_4_gc_: + ldr r11,[r9,#-4] + str r11,[r9] + str r10,[r9,#-4] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_4_gc: + str lr,[sp,#-4]! + bl collect_3 + ldr lr,[sp],#4 + b add_empty_node_4_gc_ + +add_empty_node_5: + subs r5,r5,#3 + blo add_empty_node_5_gc +add_empty_node_5_gc_: + ldr r11,[r9,#-4] + str r11,[r9] + ldr r11,[r9,#-8] + str r11,[r9,#-4] + str r10,[r9,#-8] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_5_gc: + str lr,[sp,#-4]! + bl collect_3 + ldr lr,[sp],#4 + b add_empty_node_5_gc_ + +add_empty_node_6: + subs r5,r5,#3 + blo add_empty_node_6_gc +add_empty_node_6_gc_: + ldr r11,[r9,#-4] + str r11,[r9] + ldr r11,[r9,#-8] + str r11,[r9,#-4] + ldr r11,[r9,#-12] + str r11,[r9,#-8] + str r10,[r9,#-12] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_6_gc: + bl collect_3 + b add_empty_node_6_gc_ + +add_empty_node_7: + subs r5,r5,#3 + blo add_empty_node_7_gc +add_empty_node_7_gc_: + ldr r11,[r9,#-4] + str r11,[r9] + ldr r11,[r9,#-8] + str r11,[r9,#-4] + ldr r11,[r9,#-12] + str r11,[r9,#-8] + ldr r11,[r9,#-16] + str r11,[r9,#-12] + str r10,[r9,#-16] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_7_gc: + bl collect_3 + b add_empty_node_7_gc_ + +add_empty_node_8: + subs r5,r5,#3 + blo add_empty_node_8_gc +add_empty_node_8_gc_: + ldr r11,[r9,#-4] + str r11,[r9] + ldr r11,[r9,#-8] + str r11,[r9,#-4] + ldr r11,[r9,#-12] + str r11,[r9,#-8] + ldr r11,[r9,#-16] + str r11,[r9,#-12] + ldr r11,[r9,#-20] + str r11,[r9,#-16] + str r10,[r9,#-20] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_8_gc: + bl collect_3 + b add_empty_node_8_gc_ + +add_empty_node_9: + subs r5,r5,#3 + blo add_empty_node_9_gc +add_empty_node_9_gc_: + ldr r11,[r9,#-4] + str r11,[r9] + ldr r11,[r9,#-8] + str r11,[r9,#-4] + ldr r11,[r9,#-12] + str r11,[r9,#-8] + ldr r11,[r9,#-16] + str r11,[r9,#-12] + ldr r11,[r9,#-20] + str r11,[r9,#-16] + ldr r11,[r9,#-24] + str r11,[r9,#-20] + str r10,[r9,#-24] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_9_gc: + bl collect_3 + b add_empty_node_9_gc_ + +add_empty_node_10: + subs r5,r5,#3 + blo add_empty_node_10_gc +add_empty_node_10_gc_: + ldr r11,[r9,#-4] + str r11,[r9] + ldr r11,[r9,#-8] + str r11,[r9,#-4] + ldr r11,[r9,#-12] + str r11,[r9,#-8] + ldr r11,[r9,#-16] + str r11,[r9,#-12] + ldr r11,[r9,#-20] + str r11,[r9,#-16] + ldr r11,[r9,#-24] + str r11,[r9,#-20] + ldr r11,[r9,#-28] + str r11,[r9,#-24] + str r10,[r9,#-28] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_10_gc: + bl collect_3 + b add_empty_node_10_gc_ + +add_empty_node_31: + mov r3,#7 + b add_empty_node_11_ +add_empty_node_27: + mov r3,#6 + b add_empty_node_11_ +add_empty_node_23: + mov r3,#5 + b add_empty_node_11_ +add_empty_node_19: + mov r3,#4 + b add_empty_node_11_ +add_empty_node_15: + mov r3,#3 + b add_empty_node_11_ +add_empty_node_11: + mov r3,#2 +add_empty_node_11_: + subs r5,r5,#3 + blo add_empty_node_11_gc +add_empty_node_11_gc_: + mov r4,r9 +add_empty_node_11_lp: + ldr r11,[r4,#-4] + str r11,[r4] + ldr r11,[r4,#-8] + str r11,[r4,#-4] + ldr r11,[r4,#-12] + str r11,[r4,#-8] + ldr r11,[r4,#-16] + str r11,[r4,#-12] + sub r4,r4,#16 + subs r3,r3,#1 + bne add_empty_node_11_lp + str r10,[r4] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_11_gc: + bl collect_3 + b add_empty_node_11_gc_ + +add_empty_node_32: + mov r3,#7 + b add_empty_node_12_ +add_empty_node_28: + mov r3,#6 + b add_empty_node_12_ +add_empty_node_24: + mov r3,#5 + b add_empty_node_12_ +add_empty_node_20: + mov r3,#4 + b add_empty_node_12_ +add_empty_node_16: + mov r3,#3 + b add_empty_node_12_ +add_empty_node_12: + mov r3,#2 +add_empty_node_12_: + subs r5,r5,#3 + blo add_empty_node_12_gc +add_empty_node_12_gc_: + mov r4,r9 + ldr r11,[r9,#-4] + str r11,[r9] +add_empty_node_12_lp: + ldr r11,[r4,#-8] + str r11,[r4,#-4] + ldr r11,[r4,#-12] + str r11,[r4,#-8] + ldr r11,[r4,#-16] + str r11,[r4,#-12] + ldr r11,[r4,#-20] + str r11,[r4,#-16]! + subs r3,r3,#1 + bne add_empty_node_12_lp + str r10,[r4,#-4] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_12_gc: + bl collect_3 + b add_empty_node_12_gc_ + +add_empty_node_29: + mov r3,#6 + b add_empty_node_13_ +add_empty_node_25: + mov r3,#5 + b add_empty_node_13_ +add_empty_node_21: + mov r3,#4 + b add_empty_node_13_ +add_empty_node_17: + mov r3,#3 + b add_empty_node_13_ +add_empty_node_13: + mov r3,#2 +add_empty_node_13_: + subs r5,r5,#3 + blo add_empty_node_13_gc +add_empty_node_13_gc_: + mov r4,r9 + ldr r11,[r9,#-4] + str r11,[r9] + ldr r11,[r9,#-8] + str r11,[r9,#-4] +add_empty_node_13_lp: + ldr r11,[r4,#-12] + str r11,[r4,#-8] + ldr r11,[r4,#-16] + str r11,[r4,#-12] + ldr r11,[r4,#-20] + str r11,[r4,#-16] + ldr r11,[r4,#-24] + str r11,[r4,#-20] + sub r4,r4,#16 + subs r3,r3,#1 + bne add_empty_node_13_lp + str r10,[r4,#-8] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_13_gc: + bl collect_3 + b add_empty_node_13_gc_ + +add_empty_node_30: + mov r3,#6 + b add_empty_node_14_ +add_empty_node_26: + mov r3,#5 + b add_empty_node_14_ +add_empty_node_22: + mov r3,#4 + b add_empty_node_14_ +add_empty_node_18: + mov r3,#3 + b add_empty_node_14_ +add_empty_node_14: + mov r3,#2 + b add_empty_node_14_ +add_empty_node_14_: + subs r5,r5,#3 + blo add_empty_node_14_gc +add_empty_node_14_gc: + mov r4,r9 + ldr r11,[r9,#-4] + str r11,[r9] + ldr r11,[r9,#-8] + str r11,[r9,#-4] + ldr r11,[r9,#-12] + str r11,[r9,#-8] +add_empty_node_14_lp: + ldr r11,[r4,#-16] + str r11,[r4,#-12] + ldr r11,[r4,#-20] + str r11,[r4,#-16] + ldr r11,[r4,#-24] + str r11,[r4,#-20] + ldr r11,[r4,#-28] + str r11,[r4,#-24] + sub r4,r4,#16 + subs r3,r3,#1 + bne add_empty_node_14_lp + str r10,[r4,#-12] + ldr r12,=__cycle__in__spine + add r9,r9,#4 + str r12,[r10],#12 + bx lr +add_empty_node_14_gc_: + bl collect_3 + b add_empty_node_14_gc_ + + .ltorg + +yet_args_needed_0: + subs r5,r5,#2 + blo yet_args_needed_0_gc +yet_args_needed_0_gc_r: + str r6,[r10,#4] + ldr r4,[r7] + mov r6,r10 + add r4,r4,#8 + str r4,[r10],#8 + ldr pc,[sp],#4 + +yet_args_needed_0_gc: + bl collect_2 + b yet_args_needed_0_gc_r + + + .p2align 2 + subs r5,r5,#3 + b build_node_2 +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_1: + subs r5,r5,#3 + blo yet_args_needed_1_gc +yet_args_needed_1_gc_r: + str r6,[r10,#8] + ldr r4,[r7] + mov r6,r10 + add r4,r4,#8 + str r4,[r10] + ldr r3,[r7,#4] + str r3,[r10,#4] + add r10,r10,#12 + ldr pc,[sp],#4 + +yet_args_needed_1_gc: + bl collect_2 + b yet_args_needed_1_gc_r + +build_node_2: + blo build_node_2_gc +build_node_2_gc_r: + str r3,[r10] + str r7,[r10,#4] + str r6,[r10,#8] + mov r6,r10 + add r10,r10,#12 + ldr pc,[sp],#4 + +build_node_2_gc: + bl collect_2 + b build_node_2_gc_r + + + .p2align 2 + subs r5,r5,#5 + b build_node_3 +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_2: + subs r5,r5,#5 + blo gc_22 +gc_r_22: + ldr r4,[r7] + str r6,[r10,#4] + add r4,r4,#8 + ldr r8,[r7,#4] + str r4,[r10,#8] + add r6,r10,#8 + str r8,[r10,#12] + ldr r8,[r7,#8] + str r8,[r10] + str r10,[r10,#16] + add r10,r10,#20 + ldr pc,[sp],#4 + +gc_22: bl collect_2 + b gc_r_22 + +build_node_3: + blo build_node_3_gc +build_node_3_gc_r: + str r3,[r10] + add r8,r10,#12 + str r7,[r10,#4] + str r8,[r10,#8] + str r6,[r10,#12] + mov r6,r10 + ldr r8,[r9,#-4] + subs r9,r9,#4 + str r8,[r10,#16] + add r10,r10,#20 + ldr pc,[sp],#4 + +build_node_3_gc: + bl collect_2 + b build_node_3_gc_r + + + .p2align 2 + subs r5,r5,#6 + b build_node_4 +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_3: + subs r5,r5,#6 + blo gc_23 +gc_r_23: + ldr r4,[r7] + str r6,[r10,#8] + add r4,r4,#8 + ldr r8,[r7,#4] + str r4,[r10,#12] + ldr r7,[r7,#8] + str r8,[r10,#16] + ldr r8,[r7] + str r10,[r10,#20] + str r8,[r10] + ldr r8,[r7,#4] + add r6,r10,#12 + str r8,[r10,#4] + add r10,r10,#24 + ldr pc,[sp],#4 + +gc_23: bl collect_2 + b gc_r_23 + +build_node_4: + blo build_node_4_gc +build_node_4_gc_r: + str r3,[r10] + add r8,r10,#12 + str r7,[r10,#4] + str r8,[r10,#8] + str r6,[r10,#12] + mov r6,r10 + ldr r8,[r9,#-4] + str r8,[r10,#16] + ldr r8,[r9,#-8] + subs r9,r9,#8 + str r8,[r10,#20] + add r10,r10,#24 + ldr pc,[sp],#4 + +build_node_4_gc: + bl collect_2 + b build_node_4_gc_r + + + .p2align 2 + subs r5,r5,#7 + b build_node_5 +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_4: + subs r5,r5,#7 + blo gc_24 +gc_r_24: + ldr r4,[r7] + str r6,[r10,#12] + add r4,r4,#8 + ldr r8,[r7,#4] + str r4,[r10,#16] + ldr r7,[r7,#8] + str r8,[r10,#20] + ldr r8,[r7] + str r10,[r10,#24] + str r8,[r10] + ldr r8,[r7,#4] + add r6,r10,#16 + str r8,[r10,#4] + ldr r8,[r7,#8] + str r8,[r10,#8] + add r10,r10,#28 + ldr pc,[sp],#4 + +gc_24: bl collect_2 + b gc_r_24 + +build_node_5: + blo build_node_5_gc +build_node_5_gc_r: + str r3,[r10] + add r8,r10,#12 + str r7,[r10,#4] + str r8,[r10,#8] + str r6,[r10,#12] + mov r6,r10 + ldr r8,[r9,#-4] + str r8,[r10,#16] + ldr r8,[r9,#-8] + str r8,[r10,#20] + ldr r8,[r9,#-12] + subs r9,r9,#12 + str r8,[r10,#24] + add r10,r10,#28 + ldr pc,[sp],#4 + +build_node_5_gc: + bl collect_2 + b build_node_5_gc_r + + + .p2align 2 + mov r4,#8 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_5: + ldr r3,[r7] + mov r4,#8 + b yet_args_needed_ + + + .p2align 2 + mov r4,#9 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_6: + ldr r3,[r7] + mov r4,#9 + b yet_args_needed_ + + .p2align 2 + mov r4,#10 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_7: + ldr r3,[r7] + mov r4,#10 + b yet_args_needed_ + + .p2align 2 + mov r4,#11 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_8: + ldr r3,[r7] + mov r4,#11 + b yet_args_needed_ + + .p2align 2 + mov r4,#12 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_9: + ldr r3,[r7] + mov r4,#12 + b yet_args_needed_ + + .p2align 2 + mov r4,#13 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_10: + ldr r3,[r7] + mov r4,#13 + b yet_args_needed_ + + .p2align 2 + mov r4,#14 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_11: + ldr r3,[r7] + mov r4,#14 + b yet_args_needed_ + + .p2align 2 + mov r4,#15 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_12: + ldr r3,[r7] + mov r4,#15 + b yet_args_needed_ + + .p2align 2 + mov r4,#16 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_13: + ldr r3,[r7] + mov r4,#16 + b yet_args_needed_ + + .p2align 2 + mov r4,#17 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_14: + ldr r3,[r7] + mov r4,#17 + b yet_args_needed_ + + .p2align 2 + mov r4,#18 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_15: + ldr r3,[r7] + mov r4,#18 + b yet_args_needed_ + + .p2align 2 + mov r4,#19 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_16: + ldr r3,[r7] + mov r4,#19 + b yet_args_needed_ + + .p2align 2 + mov r4,#20 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_17: + ldr r3,[r7] + mov r4,#20 + b yet_args_needed_ + + .p2align 2 + mov r4,#21 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_18: + ldr r3,[r7] + mov r4,#21 + b yet_args_needed_ + + .p2align 2 + mov r4,#22 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_19: + ldr r3,[r7] + mov r4,#22 + b yet_args_needed_ + + .p2align 2 + mov r4,#23 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_20: + ldr r3,[r7] + mov r4,#23 + b yet_args_needed_ + + .p2align 2 + mov r4,#24 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_21: + ldr r3,[r7] + mov r4,#24 + b yet_args_needed_ + + .p2align 2 + mov r4,#25 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_22: + ldr r3,[r7] + mov r4,#25 + b yet_args_needed_ + + .p2align 2 + mov r4,#26 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_23: + ldr r3,[r7] + mov r4,#26 + b yet_args_needed_ + + .p2align 2 + mov r4,#27 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_24: + ldr r3,[r7] + mov r4,#27 + b yet_args_needed_ + + .p2align 2 + mov r4,#28 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_25: + ldr r3,[r7] + mov r4,#28 + b yet_args_needed_ + + .p2align 2 + mov r4,#29 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_26: + ldr r3,[r7] + mov r4,#29 + b yet_args_needed_ + + .p2align 2 + mov r4,#30 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_27: + ldr r3,[r7] + mov r4,#30 + b yet_args_needed_ + + .p2align 2 + mov r4,#31 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_28: + ldr r3,[r7] + mov r4,#31 + b yet_args_needed_ + + .p2align 2 + mov r4,#32 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_29: + ldr r3,[r7] + mov r4,#32 + b yet_args_needed_ + + .p2align 2 + mov r4,#33 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_30: + ldr r3,[r7] + mov r4,#33 + b yet_args_needed_ + + .p2align 2 + mov r4,#34 + b build_node_ +.ifdef PROFILE + nop + nop +.endif +yet_args_needed_31: + ldr r3,[r7] + mov r4,#34 + b yet_args_needed_ + +yet_args_needed: +@ for more than 4 arguments + ldr r3,[r7] + ldrh r4,[r3,#-2] + add r4,r4,#3 +yet_args_needed_: + subs r5,r5,r4 + blo yet_args_needed_gc +yet_args_needed_gc_r: + subs r4,r4,#3+1+4 + str r3,[sp,#-4]! + str r6,[sp,#-4]! + ldr r3,[r7,#4] + ldr r7,[r7,#8] + mov r8,r10 + ldr r6,[r7] + str r6,[r10] + ldr r6,[r7,#4] + str r6,[r10,#4] + ldr r6,[r7,#8] + str r6,[r10,#8] + add r7,r7,#12 + add r10,r10,#12 + +yet_args_needed_cp_a: + ldr r6,[r7],#4 + str r6,[r10],#4 + subs r4,r4,#1 + bge yet_args_needed_cp_a + + ldr r6,[sp],#4 + str r6,[r10] + ldr r4,[sp],#4 + add r4,r4,#8 + str r4,[r10,#4] + add r6,r10,#4 + str r3,[r10,#8] + str r8,[r10,#12] + add r10,r10,#16 + ldr pc,[sp],#4 + +yet_args_needed_gc: + bl collect_2 + b yet_args_needed_gc_r + +build_node_: + subs r5,r5,r4 + blo build_node_gc +build_node_gc_r: + str r3,[r10] + add r8,r10,#12 + str r7,[r10,#4] + str r8,[r10,#8] + str r6,[r10,#12] + mov r6,r10 + ldr r8,[r9,#-4] + str r8,[r10,#16] + ldr r8,[r9,#-8] + str r8,[r10,#20] + ldr r8,[r9,#-12] + subs r9,r9,#12 + str r8,[r10,#24] + add r10,r10,#28 + + subs r4,r4,#5+2 +build_node_cp_a: + ldr r8,[r9,#-4]! + str r8,[r10],#4 + subs r4,r4,#1 + bne build_node_cp_a + + ldr pc,[sp],#4 + +build_node_gc: + bl collect_2 + b build_node_gc_r + + .globl apupd_1 + .globl apupd_2 + .globl apupd_3 + .globl apupd_4 + .globl apupd_5 + .globl apupd_6 + .globl apupd_7 + .globl apupd_8 + .globl apupd_9 + .globl apupd_10 + .globl apupd_11 + .globl apupd_12 + .globl apupd_13 + .globl apupd_14 + .globl apupd_15 + .globl apupd_16 + .globl apupd_17 + .globl apupd_18 + .globl apupd_19 + .globl apupd_20 + .globl apupd_21 + .globl apupd_22 + .globl apupd_23 + .globl apupd_24 + .globl apupd_25 + .globl apupd_26 + .globl apupd_27 + .globl apupd_28 + .globl apupd_29 + .globl apupd_30 + .globl apupd_31 + .globl apupd_32 + .globl __indirection + +apupd_1: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_1 + bne ap_upd + + ldr r8,[r9,#-4] + ldr r4,[r9,#-8] + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] +ap_1: + ldr r8,[r7] + ldr r12,[r8,#2] + bx r12 + +apupd_2: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_2 + bne ap_upd + + ldr r8,[r9,#-8] + ldr r4,[r9,#-12] + ldr r3,[r9,#-4] + str r3,[r9,#-8] + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_2 + +apupd_3: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_3 + bne ap_upd + + ldr r8,[r9,#-12] + ldr r4,[r9,#-16] + ldr r3,[r9,#-8] + str r3,[r9,#-12] + ldr r3,[r9,#-4] + str r3,[r9,#-8] + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_3 + +apupd_4: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_4 + bne ap_upd + + ldr r8,[r9,#-16] + ldr r4,[r9,#-20] + ldr r3,[r9,#-12] + str r3,[r9,#-16] + ldr r3,[r9,#-8] + str r3,[r9,#-12] + ldr r3,[r9,#-4] + str r3,[r9,#-8] + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_4 + +apupd_5: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_5 + bne ap_upd + + ldr r8,[r9,#-20] + ldr r4,[r9,#-24] + ldr r3,[r9,#-16] + str r3,[r9,#-20] + ldr r3,[r9,#-12] + str r3,[r9,#-16] + ldr r3,[r9,#-8] + str r3,[r9,#-12] + ldr r3,[r9,#-4] + str r3,[r9,#-8] + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_5 + +apupd_6: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_6 + bne ap_upd + + ldr r8,[r9,#-24] + ldr r4,[r9,#-28] + ldr r3,[r9,#-20] + str r3,[r9,#-24] + ldr r3,[r9,#-16] + str r3,[r9,#-20] + ldr r3,[r9,#-12] + str r3,[r9,#-16] + ldr r3,[r9,#-8] + str r3,[r9,#-12] + ldr r3,[r9,#-4] + str r3,[r9,#-8] + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_6 + +apupd_7: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_7 + bne ap_upd + + ldr r8,[r9,#-28] + ldr r4,[r9,#-32] + str pc,[sp,#-4]! + bl move_8 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_7 + +apupd_8: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_8 + bne ap_upd + + ldr r8,[r9,#-32] + ldr r4,[r9,#-36] + str pc,[sp,#-4]! + bl move_9 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_8 + +apupd_9: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_9 + bne ap_upd + + ldr r8,[r9,#-36] + ldr r4,[r9,#-40] + str pc,[sp,#-4]! + bl move_10 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_9 + +apupd_10: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_10 + bne ap_upd + + ldr r8,[r9,#-40] + ldr r4,[r9,#-44] + str pc,[sp,#-4]! + bl move_11 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_10 + +apupd_11: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_11 + bne ap_upd + + ldr r8,[r9,#-44] + ldr r4,[r9,#-48] + str pc,[sp,#-4]! + bl move_12 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_11 + +apupd_12: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_12 + bne ap_upd + + ldr r8,[r9,#-48] + ldr r4,[r9,#-52] + str pc,[sp,#-4]! + bl move_13 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_12 + +apupd_13: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_13 + bne ap_upd + + ldr r8,[r9,#-52] + ldr r4,[r9,#-56] + str pc,[sp,#-4]! + bl move_14 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_13 + +apupd_14: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_14 + bne ap_upd + + ldr r8,[r9,#-56] + ldr r4,[r9,#-60] + str pc,[sp,#-4]! + bl move_15 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_14 + +apupd_15: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_15 + bne ap_upd + + ldr r8,[r9,#-60] + ldr r4,[r9,#-64] + str pc,[sp,#-4]! + bl move_16 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_15 + +apupd_16: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_16 + bne ap_upd + + ldr r8,[r9,#-64] + ldr r4,[r9,#-68] + str pc,[sp,#-4]! + bl move_17 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_16 + +apupd_17: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_17 + bne ap_upd + + ldr r8,[r9,#-68] + ldr r4,[r9,#-72] + str pc,[sp,#-4]! + bl move_18 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_17 + +apupd_18: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_18 + bne ap_upd + + ldr r8,[r9,#-72] + ldr r4,[r9,#-76] + str pc,[sp,#-4]! + bl move_19 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_18 + +apupd_19: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_19 + bne ap_upd + + ldr r8,[r9,#-76] + ldr r4,[r9,#-80] + str pc,[sp,#-4]! + bl move_20 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_19 + +apupd_20: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_20 + bne ap_upd + + ldr r8,[r9,#-80] + ldr r4,[r9,#-84] + str pc,[sp,#-4]! + bl move_21 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_20 + +apupd_21: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_21 + bne ap_upd + + ldr r8,[r9,#-84] + ldr r4,[r9,#-88] + str pc,[sp,#-4]! + bl move_22 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_21 + +apupd_22: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_22 + bne ap_upd + + ldr r8,[r9,#-88] + ldr r4,[r9,#-92] + str pc,[sp,#-4]! + bl move_23 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_22 + +apupd_23: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_23 + bne ap_upd + + ldr r8,[r9,#-92] + ldr r4,[r9,#-96] + str pc,[sp,#-4]! + bl move_24 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_23 + +apupd_24: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_24 + bne ap_upd + + ldr r8,[r9,#-96] + ldr r4,[r9,#-100] + str pc,[sp,#-4]! + bl move_25 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_24 + +apupd_25: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_25 + bne ap_upd + + ldr r8,[r9,#-100] + ldr r4,[r9,#-104] + str pc,[sp,#-4]! + bl move_26 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_25 + +apupd_26: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_26 + bne ap_upd + + ldr r8,[r9,#-104] + ldr r4,[r9,#-108] + str pc,[sp,#-4]! + bl move_27 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_26 + +apupd_27: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_27 + bne ap_upd + + ldr r8,[r9,#-108] + ldr r4,[r9,#-112] + str pc,[sp,#-4]! + bl move_28 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_27 + +apupd_28: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_28 + bne ap_upd + + ldr r8,[r9,#-112] + ldr r4,[r9,#-116] + str pc,[sp,#-4]! + bl move_29 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_28 + +apupd_29: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_29 + bne ap_upd + + ldr r8,[r9,#-116] + ldr r4,[r9,#-120] + str pc,[sp,#-4]! + bl move_30 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_29 + +apupd_30: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_30 + bne ap_upd + + ldr r8,[r9,#-120] + ldr r4,[r9,#-124] + str pc,[sp,#-4]! + bl move_31 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_30 + +apupd_31: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_31 + bne ap_upd + + ldr r8,[r9,#-124] + ldr r4,[r9,#-128] + str pc,[sp,#-4]! + bl move_32 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_31 + +apupd_32: + ldr r12,[sp] + ldr r8,=apupd_upd + cmp r12,r8 + ldr r8,=ap_32 + bne ap_upd + + ldr r8,[r9,#-128] + ldr r4,[r9,#-132] + str pc,[sp,#-4]! + bl move_33 + subs r9,r9,#4 + ldr r12,=__indirection + str r12,[r8] + str r4,[r8,#4] + b ap_32 + +ap_upd: + str pc,[sp,#-4]! + blx r8 +apupd_upd: + ldr r7,[r9,#-4] + subs r9,r9,#4 + ldr r4,[r6] + str r4,[r7] + ldr r4,[r6,#4] + str r4,[r7,#4] + ldr r4,[r6,#8] + mov r6,r7 + str r4,[r7,#8] + ldr pc,[sp],#4 + +move_33: + ldr r3,[r9,#-124] + str r3,[r9,#-128] +move_32: + ldr r3,[r9,#-120] + str r3,[r9,#-124] +move_31: + ldr r3,[r9,#-116] + str r3,[r9,#-120] +move_30: + ldr r3,[r9,#-112] + str r3,[r9,#-116] +move_29: + ldr r3,[r9,#-108] + str r3,[r9,#-112] +move_28: + ldr r3,[r9,#-104] + str r3,[r9,#-108] +move_27: + ldr r3,[r9,#-100] + str r3,[r9,#-104] +move_26: + ldr r3,[r9,#-96] + str r3,[r9,#-100] +move_25: + ldr r3,[r9,#-92] + str r3,[r9,#-96] +move_24: + ldr r3,[r9,#-88] + str r3,[r9,#-92] +move_23: + ldr r3,[r9,#-84] + str r3,[r9,#-88] +move_22: + ldr r3,[r9,#-80] + str r3,[r9,#-84] +move_21: + ldr r3,[r9,#-76] + str r3,[r9,#-80] +move_20: + ldr r3,[r9,#-72] + str r3,[r9,#-76] +move_19: + ldr r3,[r9,#-68] + str r3,[r9,#-72] +move_18: + ldr r3,[r9,#-64] + str r3,[r9,#-68] +move_17: + ldr r3,[r9,#-60] + str r3,[r9,#-64] +move_16: + ldr r3,[r9,#-56] + str r3,[r9,#-60] +move_15: + ldr r3,[r9,#-52] + str r3,[r9,#-56] +move_14: + ldr r3,[r9,#-48] + str r3,[r9,#-52] +move_13: + ldr r3,[r9,#-44] + str r3,[r9,#-48] +move_12: + ldr r3,[r9,#-40] + str r3,[r9,#-44] +move_11: + ldr r3,[r9,#-36] + str r3,[r9,#-40] +move_10: + ldr r3,[r9,#-32] + str r3,[r9,#-36] +move_9: + ldr r3,[r9,#-28] + str r3,[r9,#-32] +move_8: + ldr r3,[r9,#-24] + str r3,[r9,#-28] +move_7: + ldr r3,[r9,#-20] + str r3,[r9,#-24] + ldr r3,[r9,#-16] + str r3,[r9,#-20] + ldr r3,[r9,#-12] + str r3,[r9,#-16] + ldr r3,[r9,#-8] + str r3,[r9,#-12] + ldr r3,[r9,#-4] + str r3,[r9,#-8] + ldr pc,[sp],#4 diff --git a/armcompact.s b/armcompact.s new file mode 100644 index 0000000..adc4899 --- /dev/null +++ b/armcompact.s @@ -0,0 +1,1140 @@ + +COMPACT_MARK_WITH_STACK = 1 +NO_BIT_INSTRUCTIONS = 1 + +@ mark used nodes and pointers in argument parts and link backward pointers + + ldr r12,=heap_size_33 + ldr r4,[r12] + lsl r4,r4,#5 + ldr r12,=heap_size_32_33 + str r4,[r12] +@ heap_size_32_33 in r2 + mov r2,r4 + + ldr r12,=heap_p3 + ldr r11,[r12] +@ heap_p3 in r11 + +.if COMPACT_MARK_WITH_STACK + add r9,sp,#-8000 +.endif + ldr r12,=caf_list + ldr r4,[r12] +.if COMPACT_MARK_WITH_STACK + ldr r12,=end_stack + str r9,[r12] +@ end_stack in r0 + mov r0,r9 +.endif + cmp r4,#0 + beq end_mark_cafs + +mark_cafs_lp: + ldr r12,[r4,#-4] + str r12,[sp,#-4]! +.if COMPACT_MARK_WITH_STACK + add r9,r4,#4 + ldr r4,[r4] + add r6,r9,r4,lsl #2 +.else + add r8,r4,#4 + ldr r4,[r4] + add r6,r8,r4,lsl #2 +.endif + ldr r12,=end_vector + str r6,[r12] + + str pc,[sp,#-4]! +.if COMPACT_MARK_WITH_STACK + bl rmark_stack_nodes +.else + bl mark_stack_nodes +.endif + + ldr r4,[sp],#4 + tst r4,r4 + bne mark_cafs_lp + +end_mark_cafs: +.if COMPACT_MARK_WITH_STACK + ldr r12,=stack_p + ldr r9,[r12] +.else + ldr r12,=stack_p + ldr r8,[r12] +.endif + + ldr r12,=stack_top + ldr r6,[r12] + ldr r12,=end_vector + str r6,[r12] + str pc,[sp,#-4]! +.if COMPACT_MARK_WITH_STACK + bl rmark_stack_nodes +.else + bl mark_stack_nodes +.endif + +.ifdef MEASURE_GC + str pc,[sp,#-4]! + bl add_mark_compact_garbage_collect_time +.endif + + b compact_heap + + .ltorg + +.if COMPACT_MARK_WITH_STACK + .include "armcompact_rmark.s" + .include "armcompact_rmarkr.s" +.else + .include "armcompact_mark.s" +.endif + +@ compact the heap + +compact_heap: + +.ifdef FINALIZERS + ldr r6,=finalizer_list + ldr r7,=free_finalizer_list + + ldr r8,[r6] +determine_free_finalizers_after_compact1: + ldr r12,=__Nil-4 + cmp r8,r12 + beq end_finalizers_after_compact1 + + ldr r12,=heap_p3 + ldr r4,[r12] + sub r4,r8,r4 + lsr r3,r4,#7 + and r4,r4,#31*4 + lsr r9,r4,#2 + mov r12,#1 + lsl r9,r12,r9 + + ldr r12,[r10,r3,lsl #2] + tst r9,r12 + beq finalizer_not_used_after_compact1 + + ldr r4,[r8] + mov r9,r8 + b finalizer_find_descriptor + +finalizer_find_descriptor_lp: + and r4,r4,#-4 + mov r9,r4 + ldr r4,[r4] +finalizer_find_descriptor: + tst r4,#1 + bne finalizer_find_descriptor_lp + + ldr r12,=e____system__kFinalizerGCTemp+2 + str r12,[r9] + + cmp r8,r6 + bhi finalizer_no_reverse + + ldr r4,[r8] + add r9,r6,#1 + str r9,[r8] + str r4,[r6] + +finalizer_no_reverse: + add r6,r8,#4 + ldr r8,[r8,#4] + b determine_free_finalizers_after_compact1 + +finalizer_not_used_after_compact1: + ldr r12,=e____system__kFinalizerGCTemp+2 + str r12,[r8] + + str r8,[r7] + add r7,r8,#4 + + ldr r8,[r8,#4] + str r8,[r6] + + b determine_free_finalizers_after_compact1 + +end_finalizers_after_compact1: + str r8,[r7] + + ldr r12,=finalizer_list + ldr r6,[r12] + ldr r12,=__Nil-4 + cmp r6,r12 + beq finalizer_list_empty + tst r6,#3 + bne finalizer_list_already_reversed + ldr r4,[r6] + ldr r12,=finalizer_list+1 + str r12,[r6] + ldr r12,=finalizer_list + str r4,[r12] +finalizer_list_already_reversed: +finalizer_list_empty: + + .if COMPACT_MARK_WITH_STACK + ldr r9,=free_finalizer_list + ldr r6,[r9] + ldr r12,=__Nil-4 + cmp r6,r12 + .else + ldr r8,=free_finalizer_list + ldr r6,[r8] + ldr r12,=__Nil-4 + cmp r6,r12 + .endif + beq free_finalizer_list_empty + ldr r6,=free_finalizer_list+4 + ldr r12,=end_vector + str r6,[r12] + .if COMPACT_MARK_WITH_STACK + str pc,[sp,#-4]! + bl rmark_stack_nodes + .else + str pc,[sp,#-4]! + bl mark_stack_nodes + .endif +free_finalizer_list_empty: +.endif + + ldr r12,=heap_size_33 + ldr r4,[r12] + mov r3,r4 + lsl r3,r3,#5 + + ldr r12,=heap_p3 + ldr r12,[r12] + add r3,r3,r12 + + ldr r12,=end_heap_p3 + str r3,[r12] +@ end_heap_p3 in r0 + mov r0,r3 + + add r4,r4,#3 + lsr r4,r4,#2 +@ vector_counter in r2 + mov r2,r4 + + ldr r12,=heap_vector + ldr r6,[r12] +@ vector_p in r1 + mov r1,r6 + + mov r12,#-4 + rsb r3,r6,r12 + ldr r12,=neg_heap_vector_plus_4 + str r3,[r12] + + ldr r12,=heap_p3 + ldr r10,[r12] + mov r9,#0 +@ heap_p3 in r11 + mov r11,r10 + b skip_zeros + +@ d0,a0,a2: free +find_non_zero_long: +skip_zeros: + subs r2,r2,#1 + bcc end_copy + ldr r9,[r1],#4 + cmp r9,#0 + beq skip_zeros +@ a2: free +end_skip_zeros: + ldr r12,=neg_heap_vector_plus_4 + ldr r8,[r12] + add r8,r8,r1 + + add r8,r11,r8,lsl #5 + +bsf_and_copy_nodes: + neg r12,r9 + and r12,r12,r9 + clz r3,r12 + rsb r3,r3,#31 + +copy_nodes: + ldr r4,[r8,r3,lsl #2] + + bic r9,r9,r12 + + add r12,r8,#4 + add r6,r12,r3,lsl #2 + sub r4,r4,#1 + + tst r4,#2 + beq begin_update_list_2 + + ldr r3,[r4,#-10] + subs r4,r4,#2 + + tst r3,#1 + beq end_list_2 +find_descriptor_2: + and r3,r3,#-4 + ldr r3,[r3] + tst r3,#1 + bne find_descriptor_2 + +end_list_2: + mov r7,r3 + ldrh r3,[r3,#-2] + cmp r3,#256 + blo no_record_arguments + + ldrh r7,[r7,#-2+2] + subs r7,r7,#2 + bhs copy_record_arguments_aa + + sub r3,r3,#256 + sub r3,r3,#3 + +copy_record_arguments_all_b: + str r3,[sp,#-4]! + ldr r12,=heap_vector + ldr r3,[r12] + +update_up_list_1r: + mov r7,r4 + sub r4,r4,r11 + + str r6,[sp,#-4]! + + and r6,r4,#31*4 + lsr r4,r4,#7 + lsr r6,r6,#2 + mov r12,#1 + lsl r6,r12,r6 + + ldr r4,[r3,r4,lsl #2] + + ands r4,r4,r6 + + ldr r6,[sp],#4 + beq copy_argument_part_1r + + ldr r4,[r7] + str r10,[r7] + subs r4,r4,#3 + b update_up_list_1r + +copy_argument_part_1r: + ldr r4,[r7] + str r10,[r7] + str r4,[r10],#4 + + sub r4,r6,r11 + lsr r4,r4,#2 + + mov r3,r4 + and r3,r3,#31 + cmp r3,#1 + bhs bit_in_this_word + + sub r2,r2,#1 + ldr r9,[r1],#4 + + ldr r12,=neg_heap_vector_plus_4 + ldr r8,[r12] + add r8,r8,r1 + add r8,r11,r8,lsl #5 + +bit_in_this_word: + mov r12,#1 + lsl r12,r12,r3 + bic r9,r9,r12 + + ldr r3,[sp],#4 + +copy_b_record_argument_part_arguments: + ldr r4,[r6],#4 + str r4,[r10],#4 + subs r3,r3,#1 + bcs copy_b_record_argument_part_arguments + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +copy_record_arguments_aa: + ldr r12,=256+2 + sub r3,r3,r7 + sub r3,r3,r12 + + str r3,[sp,#-4]! + str r7,[sp,#-4]! + +update_up_list_2r: + mov r7,r4 + ldr r4,[r7] + and r3,r4,#3 + subs r3,r3,#3 + bne copy_argument_part_2r + + str r10,[r7] + subs r4,r4,#3 + b update_up_list_2r + +copy_argument_part_2r: + str r10,[r7] + cmp r4,r6 + blo copy_record_argument_2 +.ifdef SHARE_CHAR_INT + cmp r4,r0 + bhs copy_record_argument_2 +.endif + mov r7,r4 + ldr r4,[r7] + add r3,r10,#1 + str r3,[r7] +copy_record_argument_2: + str r4,[r10],#4 + + ldr r3,[sp],#4 + subs r3,r3,#1 + bcc no_pointers_in_record + +copy_record_pointers: + ldr r7,[r6],#4 + cmp r7,r6 + blo copy_record_pointers_2 +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bhs copy_record_pointers_2 +.endif + ldr r4,[r7] + add r10,r10,#1 + str r10,[r7] + subs r10,r10,#1 + mov r7,r4 +copy_record_pointers_2: + str r7,[r10],#4 + subs r3,r3,#1 + bcs copy_record_pointers + +no_pointers_in_record: + ldr r3,[sp],#4 + + subs r3,r3,#1 + bcc no_non_pointers_in_record + +copy_non_pointers_in_record: + ldr r4,[r6],#4 + str r4,[r10],#4 + subs r3,r3,#1 + bcs copy_non_pointers_in_record + +no_non_pointers_in_record: + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +no_record_arguments: + subs r3,r3,#3 +update_up_list_2: + mov r7,r4 + ldr r4,[r4] + add r4,r4,#1 + str r10,[r7] + tst r4,#3 + bne copy_argument_part_2 + + subs r4,r4,#4 + b update_up_list_2 + +copy_argument_part_2: + sub r4,r4,#1 + cmp r4,r6 + bcc copy_arguments_1 +.ifdef SHARE_CHAR_INT + cmp r4,r0 + bcs copy_arguments_1 +.endif + mov r7,r4 + ldr r4,[r4] + add r10,r10,#1 + str r10,[r7] + subs r10,r10,#1 +copy_arguments_1: + str r4,[r10],#4 + +copy_argument_part_arguments: + ldr r7,[r6],#4 + cmp r7,r6 + bcc copy_arguments_2 +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bcs copy_arguments_2 +.endif + ldr r4,[r7] + add r10,r10,#1 + str r10,[r7] + subs r10,r10,#1 + mov r7,r4 +copy_arguments_2: + str r7,[r10],#4 + subs r3,r3,#1 + bcs copy_argument_part_arguments + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +update_list_2_: + subs r4,r4,#1 +update_list_2: + str r10,[r7] +begin_update_list_2: + mov r7,r4 + ldr r4,[r4] +update_list__2: + tst r4,#1 + beq end_update_list_2 + tst r4,#2 + beq update_list_2_ + add r7,r4,#-3 + ldr r4,[r4,#-3] + b update_list__2 + +end_update_list_2: + str r10,[r7] + + str r4,[r10],#4 + + tst r4,#2 + beq move_lazy_node + + ldrh r3,[r4,#-2] + tst r3,r3 + beq move_hnf_0 + + cmp r3,#256 + bhs move_record + + subs r3,r3,#2 + bcc move_hnf_1 + beq move_hnf_2 + +move_hnf_3: + ldr r7,[r6],#4 + cmp r7,r6 + bcc move_hnf_3_1 +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bcs move_hnf_3_1 +.endif + add r4,r10,#1 + ldr r3,[r7] + str r4,[r7] + mov r7,r3 +move_hnf_3_1: + str r7,[r10] + + ldr r7,[r6],#4 + cmp r7,r6 + bcc move_hnf_3_2 +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bcs move_hnf_3_2 +.endif + add r4,r10,#4+2+1 + ldr r3,[r7] + str r4,[r7] + mov r7,r3 +move_hnf_3_2: + str r7,[r10,#4] + add r10,r10,#8 + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_hnf_2: + ldr r7,[r6],#4 + cmp r7,r6 + bcc move_hnf_2_1 +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bcs move_hnf_2_1 +.endif + add r4,r10,#1 + ldr r3,[r7] + str r4,[r7] + mov r7,r3 +move_hnf_2_1: + str r7,[r10] + + ldr r7,[r6],#4 + cmp r7,r6 + bcc move_hnf_2_2 +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bcs move_hnf_2_2 +.endif + add r4,r10,#4+1 + ldr r3,[r7] + str r4,[r7] + mov r7,r3 +move_hnf_2_2: + str r7,[r10,#4] + add r10,r10,#8 + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_hnf_1: + ldr r7,[r6],#4 + cmp r7,r6 + bcc move_hnf_1_ +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bcs move_hnf_1_ +.endif + add r4,r10,#1 + ldr r3,[r7] + str r4,[r7] + mov r7,r3 +move_hnf_1_: + str r7,[r10],#4 + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_record: + ldr r12,=258 + subs r3,r3,r12 + blo move_record_1 + beq move_record_2 + +move_record_3: + ldrh r3,[r4,#-2+2] + subs r3,r3,#1 + bhi move_hnf_3 + + ldr r7,[r6],#4 + blo move_record_3_1b + +move_record_3_1a: + cmp r7,r6 + blo move_record_3_1b +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bhs move_record_3_1b +.endif + add r4,r10,#1 + ldr r3,[r7] + str r4,[r7] + mov r7,r3 +move_record_3_1b: + str r7,[r10],#4 + + ldr r7,[r6],#4 + cmp r7,r6 + blo move_record_3_2 +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bhs move_record_3_2 +.endif + str r8,[sp,#-4]! + sub r4,r7,r11 + + ldr r12,=heap_vector + ldr r3,[r12] + add r4,r4,#4 + and r8,r4,#31*4 + lsr r4,r4,#7 + lsr r8,r8,#2 + mov r12,#1 + lsl r8,r12,r8 + + ldr r12,[r3,r4,lsl #2] + tst r8,r12 + beq not_linked_record_argument_part_3_b + + sub r4,r10,r11 + + and r8,r4,#31*4 + lsr r4,r4,#7 + lsr r8,r8,#2 + mov r12,#1 + lsl r8,r12,r8 + ldr r12,[r3,r4,lsl #2] + orr r12,r12,r8 + str r12,[r3,r4,lsl #2] + ldr r8,[sp],#4 + b linked_record_argument_part_3_b + +not_linked_record_argument_part_3_b: + ldr r12,[r3,r4,lsl #2] + orr r12,r12,r8 + str r12,[r3,r4,lsl #2] + + sub r4,r10,r11 + + and r8,r4,#31*4 + lsr r4,r4,#7 + + lsr r8,r8,#2 + mov r12,#1 + mvn r8,r12,lsl r8 + + ldr r12,[r3,r4,lsl #2] + and r12,r12,r8 + str r12,[r3,r4,lsl #2] + ldr r8,[sp],#4 + +linked_record_argument_part_3_b: + ldr r3,[r7] + add r4,r10,#2+1 + str r4,[r7] + mov r7,r3 +move_record_3_2: + str r7,[r10],#4 + + sub r3,r6,r11 + lsr r3,r3,#2 + subs r3,r3,#1 + and r3,r3,#31 + cmp r3,#2 + blo bit_in_next_word + + mov r12,#1 + lsl r12,r12,r3 + bic r9,r9,r12 + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +bit_in_next_word: + sub r2,r2,#1 + ldr r9,[r1],#4 + + mov r12,#1 + lsl r12,r12,r3 + bic r9,r9,r12 + + cmp r9,#0 + beq skip_zeros + b end_skip_zeros + +move_record_2: + ldrh r12,[r4,#-2+2] + cmp r12,#1 + bhi move_hnf_2 + blo move_real_or_file + +move_record_2_ab: + ldr r7,[r6],#4 + cmp r7,r6 + blo move_record_2_1 +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bhs move_record_2_1 +.endif + add r4,r10,#1 + ldr r3,[r7] + str r4,[r7] + mov r7,r3 +move_record_2_1: + str r7,[r10] + ldr r3,[r6],#4 + str r3,[r10,#4] + add r10,r10,#8 + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_record_1: + ldrh r3,[r4,#-2+2] + tst r3,r3 + bne move_hnf_1 + b move_int_bool_or_char + +move_real_or_file: + ldr r4,[r6],#4 + str r4,[r10],#4 +move_int_bool_or_char: + ldr r4,[r6],#4 + str r4,[r10],#4 +copy_normal_hnf_0: + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_hnf_0: + ldr r12,=INT+2 + cmp r4,r12 + blo move_real_file_string_or_array + ldr r12,=CHAR+2 + cmp r4,r12 + bls move_int_bool_or_char +.ifdef DLL +move_normal_hnf_0: +.endif + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_real_file_string_or_array: + ldr r12,=__STRING__+2 + cmp r4,r12 + bhi move_real_or_file + bne move_array + + ldr r4,[r6] + add r4,r4,#3 + lsr r4,r4,#2 + +cp_s_arg_lp3: + ldr r3,[r6],#4 + str r3,[r10],#4 + subs r4,r4,#1 + bcs cp_s_arg_lp3 + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_array: +.ifdef DLL + ldr r12,=__ARRAY__+2 + cmp r4,r12 + blo move_normal_hnf_0 +.endif + cmp r9,#0 + bne bsf_and_end_array_bit + +skip_zeros_a: + ldr r9,[r1],#4 + sub r2,r2,#1 + cmp r9,#0 + beq skip_zeros_a + + ldr r12,=neg_heap_vector_plus_4 + ldr r8,[r12] + add r8,r8,r1 + + add r8,r11,r8,lsl #5 + +bsf_and_end_array_bit: + neg r12,r9 + and r12,r12,r9 + clz r3,r12 + rsb r3,r3,#31 + +end_array_bit: + bic r9,r9,r12 + + add r3,r8,r3,lsl #2 + + cmp r6,r3 + bne move_a_array + +move_b_array: + ldr r7,[r6] + str r7,[r10] + ldr r3,[r6,#4]! + ldrh r4,[r3,#-2] + add r10,r10,#4 + tst r4,r4 + beq move_strict_basic_array + + subs r4,r4,#256 + mul r7,r4,r7 + mov r4,r7 + b cp_s_arg_lp3 + +move_strict_basic_array: + mov r4,r7 + ldr r12,=INT+2 + cmp r3,r12 + beq cp_s_arg_lp3 + + ldr r12,=BOOL+2 + cmp r3,r12 + beq move_bool_array + + add r4,r4,r4 + b cp_s_arg_lp3 + +move_bool_array: + add r4,r4,#3 + lsr r4,r4,#2 + b cp_s_arg_lp3 + +move_a_array: + mov r7,r3 + subs r3,r3,r6 + lsr r3,r3,#2 + + str r9,[sp,#-4]! + + subs r3,r3,#1 + blo end_array + + ldr r9,[r6] + ldr r4,[r7,#-4] + str r9,[r7,#-4] + str r4,[r10] + ldr r4,[r7] + ldr r9,[r6,#4] + add r6,r6,#8 + str r9,[r7] + str r4,[r10,#4] + add r10,r10,#8 + tst r4,r4 + beq st_move_array_lp + + ldrh r9,[r4,#-2+2] + ldrh r4,[r4,#-2] + subs r4,r4,#256 + cmp r4,r9 + beq st_move_array_lp + +move_array_ab: + str r6,[sp,#-4]! + + ldr r7,[r10,#-8] + mov r3,r9 + mul r7,r4,r7 + lsl r7,r7,#2 + + subs r4,r4,r3 + add r7,r7,r6 + str pc,[sp,#-4]! + bl reorder + + ldr r6,[sp],#4 + subs r3,r3,#1 + subs r4,r4,#1 + + str r3,[sp,#-4]! + str r4,[sp,#-4]! + ldr r12,[r10,#-8] + str r12,[sp,#-4]! + b st_move_array_lp_ab + +move_array_ab_lp1: + ldr r4,[sp,#8] +move_array_ab_a_elements: + ldr r3,[r6],#4 + cmp r3,r6 + blo move_array_element_ab +.ifdef SHARE_CHAR_INT + cmp r3,r0 + bcs move_array_element_ab +.endif + mov r7,r3 + ldr r3,[r7] + add r10,r10,#1 + str r10,[r7] + subs r10,r10,#1 +move_array_element_ab: + str r3,[r10],#4 + subs r4,r4,#1 + bcs move_array_ab_a_elements + + ldr r4,[sp,#4] +move_array_ab_b_elements: + ldr r3,[r6],#4 + str r3,[r10],#4 + subs r4,r4,#1 + bcs move_array_ab_b_elements + +st_move_array_lp_ab: + ldr r12,[sp] + subs r12,r12,#1 + str r12,[sp] + bcs move_array_ab_lp1 + + add sp,sp,#12 + b end_array + +move_array_lp1: + ldr r4,[r6],#4 + add r10,r10,#4 + cmp r4,r6 + blo move_array_element +.ifdef SHARE_CHAR_INT + cmp r4,r0 + bcs move_array_element +.endif + ldr r9,[r4] + mov r7,r4 + str r9,[r10,#-4] + add r4,r10,#-4+1 + str r4,[r7] + + subs r3,r3,#1 + bcs move_array_lp1 + + b end_array + +move_array_element: + str r4,[r10,#-4] +st_move_array_lp: + subs r3,r3,#1 + bcs move_array_lp1 + +end_array: + ldr r9,[sp],#4 + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_lazy_node: + mov r7,r4 + ldr r3,[r7,#-4] + tst r3,r3 + beq move_lazy_node_0 + + subs r3,r3,#1 + ble move_lazy_node_1 + + cmp r3,#256 + bge move_closure_with_unboxed_arguments + +move_lazy_node_arguments: + ldr r7,[r6],#4 + cmp r7,r6 + bcc move_lazy_node_arguments_ +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bcs move_lazy_node_arguments_ +.endif + ldr r4,[r7] + str r4,[r10] + add r4,r10,#1 + add r10,r10,#4 + str r4,[r7] + subs r3,r3,#1 + bcs move_lazy_node_arguments + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_lazy_node_arguments_: + str r7,[r10],#4 + subs r3,r3,#1 + bcs move_lazy_node_arguments + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_lazy_node_1: + ldr r7,[r6],#4 + cmp r7,r6 + bcc move_lazy_node_1_ +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bcs move_lazy_node_1_ +.endif + add r4,r10,#1 + ldr r3,[r7] + str r4,[r7] + mov r7,r3 +move_lazy_node_1_: + str r7,[r10] + add r10,r10,#8 + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_lazy_node_0: + add r10,r10,#8 + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_closure_with_unboxed_arguments: + beq move_closure_with_unboxed_arguments_1 + add r3,r3,#1 + mov r4,r3 + and r3,r3,#255 + lsr r4,r4,#8 + subs r3,r3,r4 + beq move_non_pointers_of_closure + + str r4,[sp,#-4]! + +move_closure_with_unboxed_arguments_lp: + ldr r7,[r6],#4 + cmp r7,r6 + bcc move_closure_with_unboxed_arguments_ +.ifdef SHARE_CHAR_INT + cmp r7,r0 + bcs move_closure_with_unboxed_arguments_ +.endif + ldr r4,[r7] + str r4,[r10] + add r4,r10,#1 + add r10,r10,#4 + str r4,[r7] + subs r3,r3,#1 + bne move_closure_with_unboxed_arguments_lp + + ldr r4,[sp],#4 + b move_non_pointers_of_closure + +move_closure_with_unboxed_arguments_: + str r7,[r10],#4 + subs r3,r3,#1 + bne move_closure_with_unboxed_arguments_lp + + ldr r4,[sp],#4 + +move_non_pointers_of_closure: + ldr r3,[r6],#4 + str r3,[r10],#4 + subs r4,r4,#1 + bne move_non_pointers_of_closure + + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + +move_closure_with_unboxed_arguments_1: + ldr r4,[r6] + str r4,[r10] + add r10,r10,#8 + cmp r9,#0 + bne bsf_and_copy_nodes + b find_non_zero_long + + .ltorg + +end_copy: + +.ifdef FINALIZERS + ldr r12,=finalizer_list + ldr r6,[r12] + +restore_finalizer_descriptors: + ldr r12,=__Nil-4 + cmp r6,r12 + beq end_restore_finalizer_descriptors + + ldr r12,=e____system__kFinalizer+2 + str r12,[r6] + ldr r6,[r6,#4] + b restore_finalizer_descriptors + +end_restore_finalizer_descriptors: +.endif diff --git a/armcompact_rmark.s b/armcompact_rmark.s new file mode 100644 index 0000000..f9be19a --- /dev/null +++ b/armcompact_rmark.s @@ -0,0 +1,947 @@ + +ZERO_ARITY_DESCRIPTOR_OFFSET = -4 + +rmark_stack_nodes1: + ldr r3,[r6] + add r4,r9,#1 + str r3,[r9] + str r4,[r6] + +rmark_next_stack_node: + add r9,r9,#4 +rmark_stack_nodes: + ldr r12,=end_vector + ldr r12,[r12] + cmp r9,r12 + beq end_rmark_nodes + +rmark_more_stack_nodes: + ldr r6,[r9] + + sub r4,r6,r11 + cmp r4,r2 + bcs rmark_next_stack_node + + lsr r3,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r8,[r10,r3,lsl #2] + tst r8,r4 + bne rmark_stack_nodes1 + + orr r8,r8,r4 + str r8,[r10,r3,lsl #2] + + ldr r4,[r6] + str pc,[sp,#-4]! + bl rmark_stack_node + + add r9,r9,#4 + ldr r12,=end_vector + ldr r12,[r12] + cmp r9,r12 + bne rmark_more_stack_nodes + ldr pc,[sp],#4 + +rmark_stack_node: + subs sp,sp,#8 + str r4,[r9] + add r8,r9,#1 + str r9,[sp,#4] + mov r3,#-1 + mov r12,#0 + str r12,[sp] + str r8,[r6] + b rmark_no_reverse + +rmark_node_d1: + sub r4,r6,r11 + cmp r4,r2 + bcs rmark_next_node + + b rmark_node_ + +rmark_hnf_2: + add r3,r6,#4 + ldr r4,[r6,#4] + sub sp,sp,#8 + + mov r9,r6 + ldr r6,[r6] + + str r3,[sp,#4] + str r4,[sp] + + cmp sp,r0 + blo rmark_using_reversal + +rmark_node: + sub r4,r6,r11 + cmp r4,r2 + bcs rmark_next_node + + mov r3,r9 + +rmark_node_: + lsr r7,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + ldr r8,[r10,r7,lsl #2] + mov r12,#1 + lsl r4,r12,r4 + tst r8,r4 + bne rmark_reverse_and_mark_next_node + + orr r8,r8,r4 + str r8,[r10,r7,lsl #2] + + ldr r4,[r6] +rmark_arguments: + cmp r6,r3 + bhi rmark_no_reverse + + add r8,r9,#1 + str r4,[r9] + str r8,[r6] + +rmark_no_reverse: + tst r4,#2 + beq rmark_lazy_node + + ldrh r8,[r4,#-2] + tst r8,r8 + beq rmark_hnf_0 + + add r6,r6,#4 + + cmp r8,#256 + bhs rmark_record + + subs r8,r8,#2 + beq rmark_hnf_2 + bcc rmark_hnf_1 + +rmark_hnf_3: + ldr r7,[r6,#4] +rmark_hnf_3_: + cmp sp,r0 + blo rmark_using_reversal_ + + sub r4,r7,r11 + + lsr r3,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r3,lsl #2] + tst r4,r12 + bne rmark_shared_argument_part + + ldr r12,[r10,r3,lsl #2] + orr r12,r12,r4 + str r12,[r10,r3,lsl #2] + +rmark_no_shared_argument_part: + subs sp,sp,#8 + str r6,[sp,#4] + add r9,r6,#4 + ldr r6,[r6] + add r7,r7,r8,lsl #2 + str r6,[sp] + +rmark_push_hnf_args: + ldr r3,[r7] + subs sp,sp,#8 + str r7,[sp,#4] + subs r7,r7,#4 + str r3,[sp] + + subs r8,r8,#1 + bgt rmark_push_hnf_args + + ldr r6,[r7] + + cmp r7,r9 + bhi rmark_no_reverse_argument_pointer + + add r8,r9,#3 + str r6,[r9] + str r8,[r7] + + sub r4,r6,r11 + cmp r4,r2 + bcs rmark_next_node + + mov r3,r7 + b rmark_node_ + +rmark_no_reverse_argument_pointer: + mov r9,r7 + b rmark_node + +rmark_shared_argument_part: + cmp r7,r6 + bhi rmark_hnf_1 + + ldr r3,[r7] + add r4,r6,#4+2+1 + str r4,[r7] + str r3,[r6,#4] + b rmark_hnf_1 + +rmark_record: + ldr r12,=258 + subs r8,r8,r12 + beq rmark_record_2 + blo rmark_record_1 + +rmark_record_3: + ldrh r8,[r4,#-2+2] + ldr r7,[r6,#4] + subs r8,r8,#1 + blo rmark_record_3_bb + beq rmark_record_3_ab + subs r8,r8,#1 + beq rmark_record_3_aab + b rmark_hnf_3_ + +rmark_record_3_bb: + subs r6,r6,#4 + + sub r4,r7,r11 + + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + cmp r7,r6 + bhi rmark_next_node + + add r4,r4,r4 + bne rmark_bit_in_same_word1 + add r8,r8,#1 + mov r4,#1 +rmark_bit_in_same_word1: + ldr r12,[r10,r8,lsl #2] + tst r4,r12 + beq rmark_not_yet_linked_bb + + sub r4,r6,r11 + + add r4,r4,#2*4 + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] +rmark_not_yet_linked_bb: + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + ldr r8,[r7] + add r4,r6,#8+2+1 + str r8,[r6,#8] + str r4,[r7] + b rmark_next_node + +rmark_record_3_ab: + sub r4,r7,r11 + + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + cmp r7,r6 + bhi rmark_hnf_1 + + adds r4,r4,r4 + bne rmark_bit_in_same_word2 + add r8,r8,#1 + mov r4,#1 +rmark_bit_in_same_word2: + ldr r12,[r10,r8,lsl #2] + tst r4,r12 + beq rmark_not_yet_linked_ab + + sub r4,r6,r11 + + add r4,r4,#4 + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + + ldr r12,[r10,r8,lsl #2] +rmark_not_yet_linked_ab: + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + ldr r8,[r7] + add r4,r6,#4+2+1 + str r8,[r6,#4] + str r4,[r7] + b rmark_hnf_1 + +rmark_record_3_aab: + cmp sp,r0 + blo rmark_using_reversal_ + + sub r4,r7,r11 + + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] + tst r4,r12 + bne rmark_shared_argument_part + + ldr r12,[r10,r8,lsl #2] + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + subs sp,sp,#8 + str r6,[sp,#4] + add r9,r6,#4 + ldr r6,[r6] + str r6,[sp] + + ldr r6,[r7] + + cmp r7,r9 + bhi rmark_no_reverse_argument_pointer + + add r8,r9,#3 + str r6,[r9] + str r8,[r7] + + sub r4,r6,r11 + cmp r4,r2 + bcs rmark_next_node + + mov r3,r7 + b rmark_node_ + +rmark_record_2: + ldrh r12,[r4,#-2+2] + cmp r12,#1 + bhi rmark_hnf_2 + beq rmark_hnf_1 + b rmark_next_node + +rmark_record_1: + ldrh r12,[r4,#-2+2] + cmp r12,#0 + bne rmark_hnf_1 + b rmark_next_node + +rmark_lazy_node_1: +@ selectors: + bne rmark_selector_node_1 + +rmark_hnf_1: + mov r9,r6 + ldr r6,[r6] + b rmark_node + +@ selectors +rmark_indirection_node: + subs r6,r6,#4 + sub r7,r6,r11 + + and r8,r7,#31*4 + lsr r7,r7,#7 + lsr r8,r8,#2 + mov r12,#1 + lsl r8,r12,r8 + ldr r12,[r10,r7,lsl #2] + bic r12,r12,r8 + str r12,[r10,r7,lsl #2] + + mov r7,r6 + cmp r6,r3 + ldr r6,[r6,#4] + str r6,[r9] + bhi rmark_node_d1 + str r4,[r7] + b rmark_node_d1 + +rmark_selector_node_1: + cmp r8,#(-2)-1 + beq rmark_indirection_node + + ldr r7,[r6] + mov r1,r3 + + sub r3,r7,r11 + lsr r3,r3,#2 + + cmp r8,#(-3)-1 + ble rmark_record_selector_node_1 + + and r8,r3,#31 + lsr r3,r3,#5 + mov r12,#1 + lsl r8,r12,r8 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r8 + bne rmark_hnf_1 + + ldr r3,[r7] + tst r3,#2 + beq rmark_hnf_1 + + ldrh r12,[r3,#-2] + cmp r12,#2 + bls rmark_small_tuple_or_record + +rmark_large_tuple_or_record: + ldr r3,[r7,#8] + sub r3,r3,r11 + lsr r3,r3,#2 + + and r8,r3,#31 + lsr r3,r3,#5 + mov r12,#1 + lsl r8,r12,r8 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r8 + bne rmark_hnf_1 + + add r12,r6,#-4 + sub r3,r12,r11 + + str r6,[sp,#-4]! + + ldr r4,[r4,#-8] + + and r6,r3,#31*4 + lsr r3,r3,#7 + lsr r6,r6,#2 + mov r12,#1 + lsl r6,r12,r6 + ldr r12,[r10,r3,lsl #2] + bic r12,r12,r6 + str r12,[r10,r3,lsl #2] + + ldrh r4,[r4,#4] + mov r3,r1 + + cmp r4,#8 + blt rmark_tuple_or_record_selector_node_2 + ldr r7,[r7,#8] + beq rmark_tuple_selector_node_2 + add r6,r4,#-12 + ldr r6,[r7,r6] + ldr r7,[sp],#4 + str r6,[r9] + ldr r12,=__indirection + str r12,[r7,#-4] + str r6,[r7] + b rmark_node_d1 + +rmark_tuple_selector_node_2: + ldr r6,[r7] + ldr r7,[sp],#4 + str r6,[r9] + ldr r12,=__indirection + str r12,[r7,#-4] + str r6,[r7] + b rmark_node_d1 + +rmark_record_selector_node_1: + beq rmark_strict_record_selector_node_1 + + and r8,r3,#31 + lsr r3,r3,#5 + mov r12,#1 + lsl r8,r12,r8 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r8 + bne rmark_hnf_1 + + ldr r3,[r7] + tst r3,#2 + beq rmark_hnf_1 + + ldrh r12,[r3,#-2] + ldr r3,=258 + cmp r12,r3 + bls rmark_small_tuple_or_record + + ldr r3,[r7,#8] + sub r3,r3,r11 + lsr r3,r3,#2 + + and r8,r3,#31 + lsr r3,r3,#5 + mov r12,#1 + lsl r8,r12,r8 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r8 + bne rmark_hnf_1 + +rmark_small_tuple_or_record: + add r12,r6,#-4 + sub r3,r12,r11 + + str r6,[sp,#-4]! + + ldr r4,[r4,#-8] + + and r6,r3,#31*4 + lsr r3,r3,#7 + lsr r6,r6,#2 + mov r12,#1 + lsl r6,r12,r6 + ldr r12,[r10,r3,lsl #2] + bic r12,r12,r6 + str r12,[r10,r3,lsl #2] + + ldrh r4,[r4,#4] + mov r3,r1 + + cmp r4,#8 + ble rmark_tuple_or_record_selector_node_2 + ldr r7,[r7,#8] + subs r4,r4,#12 +rmark_tuple_or_record_selector_node_2: + ldr r6,[r7,r4] + ldr r7,[sp],#4 + str r6,[r9] + ldr r12,=__indirection + str r12,[r7,#-4] + str r6,[r7] + b rmark_node_d1 + +rmark_strict_record_selector_node_1: + and r8,r3,#31 + lsr r3,r3,#5 + mov r12,#1 + lsl r8,r12,r8 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r8 + bne rmark_hnf_1 + + ldr r3,[r7] + tst r3,#2 + beq rmark_hnf_1 + + ldrh r12,[r3,#-2] + ldr r3,=258 + cmp r12,r3 + bls rmark_select_from_small_record + + ldr r3,[r7,#8] + sub r3,r3,r11 + + and r8,r3,#31*4 + lsr r3,r3,#7 + lsr r8,r8,#2 + mov r12,#1 + lsl r8,r12,r8 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r8 + bne rmark_hnf_1 + +rmark_select_from_small_record: + ldr r3,[r4,#-8] + subs r6,r6,#4 + + cmp r6,r1 + bhi rmark_selector_pointer_not_reversed + + ldrh r4,[r3,#4] + cmp r4,#8 + ble rmark_strict_record_selector_node_2 + ldr r12,[r7,#8] + add r4,r4,r12 + ldr r4,[r4,#-12] + b rmark_strict_record_selector_node_3 +rmark_strict_record_selector_node_2: + ldr r4,[r7,r4] +rmark_strict_record_selector_node_3: + str r4,[r6,#4] + + ldrh r4,[r3,#6] + tst r4,r4 + beq rmark_strict_record_selector_node_5 + cmp r4,#8 + ble rmark_strict_record_selector_node_4 + ldr r7,[r7,#8] + subs r4,r4,#12 +rmark_strict_record_selector_node_4: + ldr r4,[r7,r4] + str r4,[r6,#8] +rmark_strict_record_selector_node_5: + + ldr r4,[r3,#-4] + + add r9,r9,#1 + str r9,[r6] + str r4,[r9,#-1] + b rmark_next_node + +rmark_selector_pointer_not_reversed: + ldrh r4,[r3,#4] + cmp r4,#8 + ble rmark_strict_record_selector_node_6 + ldr r12,[r7,#8] + add r4,r4,r12 + ldr r4,[r4,#-12] + b rmark_strict_record_selector_node_7 +rmark_strict_record_selector_node_6: + ldr r4,[r7,r4] +rmark_strict_record_selector_node_7: + str r4,[r6,#4] + + ldrh r4,[r3,#6] + tst r4,r4 + beq rmark_strict_record_selector_node_9 + cmp r4,#8 + ble rmark_strict_record_selector_node_8 + ldr r7,[r7,#8] + subs r4,r4,#12 +rmark_strict_record_selector_node_8: + ldr r4,[r7,r4] + str r4,[r6,#8] +rmark_strict_record_selector_node_9: + + ldr r4,[r3,#-4] + str r4,[r6] + b rmark_next_node + +rmark_reverse_and_mark_next_node: + cmp r6,r3 + bhi rmark_next_node + + ldr r4,[r6] + str r4,[r9] + add r9,r9,#1 + str r9,[r6] + +@ a2,d1: free + +rmark_next_node: + ldr r6,[sp] + ldr r9,[sp,#4] + add sp,sp,#8 + + cmp r6,#1 + bhi rmark_node + +rmark_next_node_: +end_rmark_nodes: + ldr pc,[sp],#4 + +rmark_lazy_node: + ldr r8,[r4,#-4] + cmp r8,#0 + beq rmark_next_node + + add r6,r6,#4 + + subs r8,r8,#1 + ble rmark_lazy_node_1 + + cmp r8,#255 + bge rmark_closure_with_unboxed_arguments + +rmark_closure_with_unboxed_arguments_: + add r6,r6,r8,lsl #2 + +rmark_push_lazy_args: + ldr r3,[r6] + sub sp,sp,#8 + str r6,[sp,#4] + sub r6,r6,#4 + str r3,[sp] + subs r8,r8,#1 + bgt rmark_push_lazy_args + + mov r9,r6 + ldr r6,[r6] + cmp sp,r0 + bhs rmark_node + + b rmark_using_reversal + +rmark_closure_with_unboxed_arguments: +@ (a_size+b_size)+(b_size<<8) +@ addl $1,a2 + mov r4,r8 + and r8,r8,#255 + lsr r4,r4,#8 + subs r8,r8,r4 +@ subl $1,a2 + bgt rmark_closure_with_unboxed_arguments_ + beq rmark_hnf_1 + b rmark_next_node + +rmark_hnf_0: + ldr r12,=INT+2 + cmp r4,r12 + beq rmark_int_3 + + ldr r12,=CHAR+2 + cmp r4,r12 + beq rmark_char_3 + + blo rmark_no_normal_hnf_0 + + sub r8,r6,r11 + + and r7,r8,#31*4 + lsr r8,r8,#7 + lsr r7,r7,#2 + mov r12,#1 + lsl r7,r12,r7 + ldr r12,[r10,r8,lsl #2] + bic r12,r12,r7 + str r12,[r10,r8,lsl #2] + + add r7,r4,#ZERO_ARITY_DESCRIPTOR_OFFSET-2 + str r7,[r9] + cmp r6,r3 + bhi rmark_next_node + str r4,[r6] + b rmark_next_node + +rmark_int_3: + ldr r8,[r6,#4] + cmp r8,#33 + bcs rmark_next_node + + ldr r12,=small_integers + add r7,r12,r8,lsl #3 + str r7,[r9] + sub r8,r6,r11 + + and r7,r8,#31*4 + lsr r8,r8,#7 + lsr r7,r7,#2 + mov r12,#1 + lsl r7,r12,r7 + ldr r12,[r10,r8,lsl #2] + bic r12,r12,r7 + str r12,[r10,r8,lsl #2] + + cmp r6,r3 + bhi rmark_next_node + str r4,[r6] + b rmark_next_node + +rmark_char_3: + ldrb r7,[r6,#4] + + ldr r12,=static_characters + add r7,r12,r7,lsl #3 + sub r8,r6,r11 + + str r7,[r9] + + and r7,r8,#31*4 + lsr r8,r8,#7 + lsr r7,r7,#2 + mov r12,#1 + lsl r7,r12,r7 + ldr r12,[r10,r8,lsl #2] + bic r12,r12,r7 + str r12,[r10,r8,lsl #2] + + cmp r6,r3 + bhi rmark_next_node + str r4,[r6] + b rmark_next_node + +rmark_no_normal_hnf_0: + ldr r12,=__ARRAY__+2 + cmp r4,r12 + bne rmark_next_node + + ldr r4,[r6,#8] + tst r4,r4 + beq rmark_lazy_array + + ldrh r7,[r4,#-2+2] + tst r7,r7 + beq rmark_b_array + + ldrh r4,[r4,#-2] + tst r4,r4 + beq rmark_b_array + + cmp sp,r0 + blo rmark_array_using_reversal + + subs r4,r4,#256 + cmp r7,r4 + mov r3,r7 + beq rmark_a_record_array + +rmark_ab_record_array: + ldr r7,[r6,#4] + add r6,r6,#8 + str r6,[sp,#-4]! + + mul r7,r4,r7 + lsl r7,r7,#2 + + subs r4,r4,r3 + add r6,r6,#4 + add r7,r7,r6 + str pc,[sp,#-4]! + bl reorder + + ldr r6,[sp],#4 + mov r4,r3 + ldr r12,[r6,#-4] + mul r4,r12,r4 + b rmark_lr_array + +rmark_b_array: + sub r4,r6,r11 + + add r4,r4,#4 + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + b rmark_next_node + +rmark_a_record_array: + ldr r4,[r6,#4] + add r6,r6,#8 + cmp r3,#2 + blo rmark_lr_array + + mul r4,r3,r4 + b rmark_lr_array + +rmark_lazy_array: + cmp sp,r0 + blo rmark_array_using_reversal + + ldr r4,[r6,#4] + add r6,r6,#8 + +rmark_lr_array: + sub r3,r6,r11 + lsr r3,r3,#2 + add r3,r3,r4 + + lsr r7,r3,#5 + and r3,r3,#31 + mov r12,#1 + lsl r3,r12,r3 + ldr r12,[r10,r7,lsl #2] + orr r12,r12,r3 + str r12,[r10,r7,lsl #2] + + cmp r4,#1 + bls rmark_array_length_0_1 + mov r7,r6 + add r6,r6,r4,lsl #2 + + ldr r4,[r6] + ldr r3,[r7] + str r4,[r7] + str r3,[r6] + + ldr r4,[r6,#-4]! + ldr r3,[r7,#-4]! + str r3,[r6] + str r4,[r7] + str r6,[sp,#-4]! + mov r9,r7 + b rmark_array_nodes + +rmark_array_nodes1: + cmp r6,r9 + bhi rmark_next_array_node + + ldr r3,[r6] + add r4,r9,#1 + str r3,[r9] + str r4,[r6] + +rmark_next_array_node: + add r9,r9,#4 + ldr r12,[sp] + cmp r9,r12 + beq end_rmark_array_node + +rmark_array_nodes: + ldr r6,[r9] + + sub r4,r6,r11 + cmp r4,r2 + bcs rmark_next_array_node + + lsr r3,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r8,[r10,r3,lsl #2] + tst r8,r4 + bne rmark_array_nodes1 + + orr r8,r8,r4 + str r8,[r10,r3,lsl #2] + + ldr r4,[r6] + str pc,[sp,#-4]! + bl rmark_array_node + + add r9,r9,#4 + ldr r12,[sp] + cmp r9,r12 + bne rmark_array_nodes + +end_rmark_array_node: + add sp,sp,#4 + b rmark_next_node + +rmark_array_node: + sub sp,sp,#8 + str r9,[sp,#4] + mov r3,r9 + mov r12,#1 + str r12,[sp] + b rmark_arguments + +rmark_array_length_0_1: + add r6,r6,#-8 + blo rmark_next_node + + ldr r3,[r6,#12] + ldr r8,[r6,#8] + str r8,[r6,#12] + ldr r8,[r6,#4] + str r8,[r6,#8] + str r3,[r6,#4] + add r6,r6,#4 + b rmark_hnf_1 + + .ltorg diff --git a/armcompact_rmarkr.s b/armcompact_rmarkr.s new file mode 100644 index 0000000..5821d66 --- /dev/null +++ b/armcompact_rmarkr.s @@ -0,0 +1,1015 @@ + +ZERO_ARITY_DESCRIPTOR_OFFSET = -4 +NO_BIT_INSTRUCTIONS = 1 + +rmark_using_reversal: + str r9,[sp,#-4]! + str r9,[sp,#-4]! + mov r9,#1 + b rmarkr_node + +rmark_using_reversal_: + subs r6,r6,#4 + str r3,[sp,#-4]! + str r9,[sp,#-4]! + cmp r6,r3 + bhi rmark_no_undo_reverse_1 + str r6,[r9] + str r4,[r6] +rmark_no_undo_reverse_1: + mov r9,#1 + b rmarkr_arguments + +rmark_array_using_reversal: + str r3,[sp,#-4]! + str r9,[sp,#-4]! + cmp r6,r3 + bhi rmark_no_undo_reverse_2 + str r6,[r9] + ldr r12,=__ARRAY__+2 + str r12,[r6] +rmark_no_undo_reverse_2: + mov r9,#1 + b rmarkr_arguments + +rmarkr_hnf_2: + ldr r12,[r6] + orr r12,r12,#2 + str r12,[r6] + ldr r8,[r6,#4] + str r9,[r6,#4] + add r9,r6,#4 + mov r6,r8 + +rmarkr_node: + sub r4,r6,r11 +.ifdef SHARE_CHAR_INT + cmp r4,r2 + bhs rmarkr_next_node_after_static +.endif + + lsr r3,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r8,[r10,r3,lsl #2] + tst r8,r4 + bne rmarkr_next_node + + orr r8,r8,r4 + str r8,[r10,r3,lsl #2] + +rmarkr_arguments: + ldr r4,[r6] + tst r4,#2 + beq rmarkr_lazy_node + + ldrh r8,[r4,#-2] + tst r8,r8 + beq rmarkr_hnf_0 + + add r6,r6,#4 + + cmp r8,#256 + bhs rmarkr_record + + subs r8,r8,#2 + beq rmarkr_hnf_2 + blo rmarkr_hnf_1 + +rmarkr_hnf_3: + ldr r7,[r6,#4] + + sub r4,r7,r11 + + lsr r3,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r3,lsl #2] + tst r4,r12 + bne rmarkr_shared_argument_part + + orr r12,r12,r4 + str r12,[r10,r3,lsl #2] + +rmarkr_no_shared_argument_part: + ldr r12,[r6] + orr r12,r12,#2 + str r12,[r6] + str r9,[r6,#4] + add r6,r6,#4 + + ldr r12,[r7] + orr r12,r12,#1 + str r12,[r7] + add r7,r7,r8,lsl #2 + + ldr r8,[r7] + str r6,[r7] + mov r9,r7 + mov r6,r8 + b rmarkr_node + +rmarkr_shared_argument_part: + cmp r7,r6 + bhi rmarkr_hnf_1 + + ldr r3,[r7] + add r4,r6,#4+2+1 + str r4,[r7] + str r3,[r6,#4] + b rmarkr_hnf_1 + +rmarkr_record: + ldr r12,=258 + subs r8,r8,r12 + beq rmarkr_record_2 + blo rmarkr_record_1 + +rmarkr_record_3: + ldrh r8,[r4,#-2+2] + subs r8,r8,#1 + blo rmarkr_record_3_bb + beq rmarkr_record_3_ab + subs r8,r8,#1 + beq rmarkr_record_3_aab + b rmarkr_hnf_3 + +rmarkr_record_3_bb: + ldr r7,[r6,#8-4] + subs r6,r6,#4 + + sub r4,r7,r11 + + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + cmp r7,r6 + bhi rmarkr_next_node + + add r4,r4,r4 + bne rmarkr_bit_in_same_word1 + add r8,r8,#1 + mov r4,#1 +rmarkr_bit_in_same_word1: + ldr r12,[r10,r8,lsl #2] + tst r4,r12 + beq rmarkr_not_yet_linked_bb + + sub r4,r6,r11 + + add r4,r4,#2*4 + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] +rmarkr_not_yet_linked_bb: + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + ldr r8,[r7] + add r4,r6,#8+2+1 + str r8,[r6,#8] + str r4,[r7] + b rmarkr_next_node + +rmarkr_record_3_ab: + ldr r7,[r6,#4] + + sub r4,r7,r11 + + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + cmp r7,r6 + bhi rmarkr_hnf_1 + + add r4,r4,r4 + bne rmarkr_bit_in_same_word2 + add r8,r8,#1 + mov r4,#1 +rmarkr_bit_in_same_word2: + ldr r12,[r10,r8,lsl #2] + tst r4,r12 + beq rmarkr_not_yet_linked_ab + + sub r4,r6,r11 + + add r4,r4,#4 + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] +rmarkr_not_yet_linked_ab: + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + ldr r8,[r7] + add r4,r6,#4+2+1 + str r8,[r6,#4] + str r4,[r7] + b rmarkr_hnf_1 + +rmarkr_record_3_aab: + ldr r7,[r6,#4] + + sub r4,r7,r11 + + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] + tst r4,r12 + bne rmarkr_shared_argument_part + ldr r12,[r10,r8,lsl #2] + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + ldr r12,[r6] + add r12,r12,#2 + str r12,[r6] + str r9,[r6,#4] + add r6,r6,#4 + + ldr r9,[r7] + str r6,[r7] + mov r6,r9 + add r9,r7,#1 + b rmarkr_node + +rmarkr_record_2: + ldrh r12,[r4,#-2+2] + cmp r12,#1 + bhi rmarkr_hnf_2 + beq rmarkr_hnf_1 + subs r6,r6,#4 + b rmarkr_next_node + +rmarkr_record_1: + ldrh r12,[r4,#-2+2] + cmp r12,#0 + bne rmarkr_hnf_1 + subs r6,r6,#4 + b rmarkr_next_node + +rmarkr_lazy_node_1: +@ selectors: + bne rmarkr_selector_node_1 + +rmarkr_hnf_1: + ldr r8,[r6] + str r9,[r6] + + add r9,r6,#2 + mov r6,r8 + b rmarkr_node + +@ selectors +rmarkr_indirection_node: + add r12,r6,#-4 + sub r3,r12,r11 + +.ifdef NO_BIT_INSTRUCTIONS + and r4,r3,#31*4 + lsr r3,r3,#7 + lsr r12,r4,#2 + mov r4,#1 + lsl r4,r4,r12 + ldr r12,[r10,r3,lsl #2] + bic r12,r12,r4 + str r12,[r10,r3,lsl #2] +.else + lsr r3,r3,#2 +? btr d1,(a4) +.endif + ldr r6,[r6] + b rmarkr_node + +rmarkr_selector_node_1: + cmp r8,#(-2)-1 + beq rmarkr_indirection_node + + ldr r7,[r6] + + sub r3,r7,r11 + lsr r3,r3,#2 + + cmp r8,#(-3)-1 + ble rmarkr_record_selector_node_1 + + str r4,[sp,#-4]! + and r4,r3,#31 + lsr r3,r3,#5 + mov r12,#1 + lsl r4,r12,r4 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r4 + ldr r4,[sp],#4 + bne rmarkr_hnf_1 + + ldr r3,[r7] + tst r3,#2 + beq rmarkr_hnf_1 + + ldrh r12,[r3,#-2] + cmp r12,#2 + bls rmarkr_small_tuple_or_record + +rmarkr_large_tuple_or_record: + ldr r3,[r7,#8] + sub r3,r3,r11 + lsr r3,r3,#2 + + str r4,[sp,#-4]! + and r4,r3,#31 + lsr r3,r3,#5 + mov r12,#1 + lsl r4,r12,r4 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r4 + ldr r4,[sp],#4 + bne rmarkr_hnf_1 + + add r12,r6,#-4 + sub r3,r12,r11 + + str r6,[sp,#-4]! + + ldr r4,[r4,#-8] + + and r6,r3,#31*4 + lsr r3,r3,#7 + lsr r12,r6,#2 + mov r6,#1 + lsl r6,r6,r12 + ldr r12,[r10,r3,lsl #2] + bic r12,r12,r6 + str r12,[r10,r3,lsl #2] + + ldrh r4,[r4,#4] + cmp r4,#8 + blt rmarkr_tuple_or_record_selector_node_2 + ldr r7,[r7,#8] + beq rmarkr_tuple_selector_node_2 + add r12,r4,#-12 + ldr r6,[r7,r12] + ldr r7,[sp],#4 + ldr r12,=__indirection + str r12,[r7,#-4] + str r6,[r7] + b rmarkr_node + +rmarkr_tuple_selector_node_2: + ldr r6,[r7] + ldr r7,[sp],#4 + ldr r12,=__indirection + str r12,[r7,#-4] + str r6,[r7] + b rmarkr_node + +rmarkr_record_selector_node_1: + beq rmarkr_strict_record_selector_node_1 + + str r4,[sp,#-4]! + and r4,r3,#31 + lsr r3,r3,#5 + mov r12,#1 + lsl r4,r12,r4 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r4 + ldr r4,[sp],#4 + bne rmarkr_hnf_1 + + ldr r3,[r7] + tst r3,#2 + beq rmarkr_hnf_1 + + ldrh r12,[r3,#-2] + ldr r3,=258 + cmp r12,r3 + bls rmarkr_small_tuple_or_record + + ldr r3,[r7,#8] + sub r3,r3,r11 + lsr r3,r3,#2 + + str r4,[sp,#-4]! + and r4,r3,#31 + lsr r3,r3,#5 + mov r12,#1 + lsl r4,r12,r4 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r4 + ldr r4,[sp],#4 + bne rmarkr_hnf_1 + +rmarkr_small_tuple_or_record: + add r12,r6,#-4 + sub r3,r12,r11 + + str r6,[sp,#-4]! + + ldr r4,[r4,#-8] + + and r6,r3,#31*4 + lsr r3,r3,#7 + lsr r12,r6,#2 + mov r6,#1 + lsl r6,r6,r12 + ldr r12,[r10,r3,lsl #2] + bic r12,r12,r6 + str r12,[r10,r3,lsl #2] + + ldrh r4,[r4,#4] + cmp r4,#8 + ble rmarkr_tuple_or_record_selector_node_2 + ldr r7,[r7,#8] + subs r4,r4,#12 +rmarkr_tuple_or_record_selector_node_2: + ldr r6,[r7,r4] + ldr r7,[sp],#4 + ldr r12,=__indirection + str r12,[r7,#-4] + str r6,[r7] + b rmarkr_node + +rmarkr_strict_record_selector_node_1: + str r4,[sp,#-4]! + and r4,r3,#31 + lsr r3,r3,#5 + mov r12,#1 + lsl r4,r12,r4 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r4 + ldr r4,[sp],#4 + bne rmarkr_hnf_1 + + ldr r3,[r7] + tst r3,#2 + beq rmarkr_hnf_1 + + ldrh r12,[r3,#-2] + ldr r3,=258 + cmp r12,r3 + bls rmarkr_select_from_small_record + + ldr r3,[r7,#8] + sub r3,r3,r11 + + str r4,[sp,#-4]! + and r4,r3,#31*4 + lsr r3,r3,#7 + lsr r4,r4,#2 + mov r12,#1 + lsl r4,r12,r4 + ldr r3,[r10,r3,lsl #2] + and r3,r3,r4 + ldr r4,[sp],#4 + bne rmarkr_hnf_1 + +rmarkr_select_from_small_record: + ldr r4,[r4,#-8] + subs r6,r6,#4 + + ldrh r3,[r4,#4] + cmp r3,#8 + ble rmarkr_strict_record_selector_node_2 + ldr r12,[r7,#8] + add r3,r3,r12 + ldr r3,[r3,#-12] + b rmarkr_strict_record_selector_node_3 +rmarkr_strict_record_selector_node_2: + ldr r3,[r7,r3] +rmarkr_strict_record_selector_node_3: + str r3,[r6,#4] + + ldrh r3,[r4,#6] + tst r3,r3 + beq rmarkr_strict_record_selector_node_5 + cmp r3,#8 + ble rmarkr_strict_record_selector_node_4 + ldr r7,[r7,#8] + subs r3,r3,#12 +rmarkr_strict_record_selector_node_4: + ldr r3,[r7,r3] + str r3,[r6,#8] +rmarkr_strict_record_selector_node_5: + + ldr r4,[r4,#-4] + str r4,[r6] + b rmarkr_next_node + +@ a2,d1: free + +rmarkr_next_node: + tst r9,#3 + bne rmarkr_parent + + ldr r8,[r9,#-4] + mov r3,#3 + + and r3,r3,r8 + subs r9,r9,#4 + + cmp r3,#3 + beq rmarkr_argument_part_cycle1 + + ldr r7,[r9,#4] + str r7,[r9] + +rmarkr_c_argument_part_cycle1: + cmp r6,r9 + bhi rmarkr_no_reverse_1 + + ldr r7,[r6] + add r4,r9,#4+1 + str r7,[r9,#4] + str r4,[r6] + + orr r9,r9,r3 + mov r6,r8 + eor r6,r6,r3 + b rmarkr_node + +rmarkr_no_reverse_1: + str r6,[r9,#4] + mov r6,r8 + orr r9,r9,r3 + eor r6,r6,r3 + b rmarkr_node + +rmarkr_lazy_node: + ldr r8,[r4,#-4] + tst r8,r8 + beq rmarkr_next_node + + add r6,r6,#4 + + subs r8,r8,#1 + ble rmarkr_lazy_node_1 + + cmp r8,#255 + bge rmarkr_closure_with_unboxed_arguments + +rmarkr_closure_with_unboxed_arguments_: + ldr r12,[r6] + orr r12,r12,#2 + str r12,[r6] + add r6,r6,r8,lsl #2 + + ldr r8,[r6] + str r9,[r6] + mov r9,r6 + mov r6,r8 + b rmarkr_node + +rmarkr_closure_with_unboxed_arguments: +@ (a_size+b_size)+(b_size<<8) +@ addl $1,a2 + mov r4,r8 + and r8,r8,#255 + lsr r4,r4,#8 + subs r8,r8,r4 +@ subl $1,a2 + bgt rmarkr_closure_with_unboxed_arguments_ + beq rmarkr_hnf_1 + subs r6,r6,#4 + b rmarkr_next_node + +rmarkr_hnf_0: +.ifdef SHARE_CHAR_INT + ldr r12,=INT+2 + cmp r4,r12 + beq rmarkr_int_3 + + ldr r12,=CHAR+2 + cmp r4,r12 + beq rmarkr_char_3 + + blo rmarkr_no_normal_hnf_0 + + sub r3,r6,r11 +.ifdef NO_BIT_INSTRUCTIONS + and r6,r3,#31*4 + lsr r3,r3,#7 + lsr r12,r6,#2 + mov r6,#1 + lsl r6,r6,r12 + ldr r12,[r10,r3,lsl #2] + bic r12,r12,r6 + str r12,[r10,r3,lsl #2] +.else + lsr r3,r3,#2 +? btr d1,(a4) +.endif + add r6,r4,#ZERO_ARITY_DESCRIPTOR_OFFSET-2 + b rmarkr_next_node_after_static + +rmarkr_int_3: + ldr r8,[r6,#4] + cmp r8,#33 + bhs rmarkr_next_node + + sub r3,r6,r11 + +.ifdef NO_BIT_INSTRUCTIONS + and r6,r3,#31*4 + lsr r3,r3,#7 + lsr r12,r6,#2 + mov r6,#1 + lsl r6,r6,r12 + ldr r12,[r10,r3,lsl #2] + bic r12,r12,r6 + str r12,[r10,r3,lsl #2] +.else + lsr r3,r3,#2 +? btr d1,(a4) +.endif + ldr r12,=small_integers + add r6,r12,r8,lsl #3 + b rmarkr_next_node_after_static + +rmarkr_char_3: + ldrb r4,[r6,#4] + sub r3,r6,r11 + +.ifdef NO_BIT_INSTRUCTIONS + and r8,r3,#31*4 + lsr r3,r3,#7 + lsr r12,r8,#2 + mov r8,#1 + lsl r8,r8,r12 + ldr r12,[r10,r3,lsl #2] + bic r12,r12,r8 + str r12,[r10,r3,lsl #2] +.else + lsr r3,r3,#2 +? btr d1,(a4) +.endif + + ldr r12,=static_characters + add r6,r12,r4,lsl #3 + b rmarkr_next_node_after_static + +rmarkr_no_normal_hnf_0: +.endif + + ldr r12,=__ARRAY__+2 + cmp r4,r12 + bne rmarkr_next_node + + ldr r4,[r6,#8] + cmp r4,#0 + beq rmarkr_lazy_array + + ldrh r3,[r4,#-2+2] + cmp r3,#0 + beq rmarkr_b_array + + ldrh r4,[r4,#-2] + cmp r4,#0 + beq rmarkr_b_array + + subs r4,r4,#256 + cmp r3,r4 + beq rmarkr_a_record_array + +rmarkr_ab_record_array: + ldr r7,[r6,#4] + add r6,r6,#8 + str r6,[sp,#-4]! + + mul r7,r4,r7 + lsl r7,r7,#2 + + subs r4,r4,r3 + add r6,r6,#4 + add r7,r7,r6 + str pc,[sp,#-4]! + bl reorder + + ldr r6,[sp],#4 + mov r4,r3 + ldr r12,[r6,#-4] + mul r4,r12,r4 + b rmarkr_lr_array + +rmarkr_b_array: + sub r4,r6,r11 + + add r4,r4,#4 + lsr r8,r4,#7 + lsr r4,r4,#2 + and r4,r4,#31 + mov r12,#1 + lsl r4,r12,r4 + ldr r12,[r10,r8,lsl #2] + orr r12,r12,r4 + str r12,[r10,r8,lsl #2] + + b rmarkr_next_node + +rmarkr_a_record_array: + ldr r4,[r6,#4] + add r6,r6,#8 + cmp r3,#2 + blo rmarkr_lr_array + + mul r4,r3,r4 + b rmarkr_lr_array + +rmarkr_lazy_array: + ldr r4,[r6,#4] + add r6,r6,#8 + +rmarkr_lr_array: + sub r3,r6,r11 + lsr r3,r3,#2 + add r3,r3,r4 + + lsr r7,r3,#5 + and r3,r3,#31 + mov r12,#1 + lsl r3,r12,r3 + ldr r12,[r10,r7,lsl #2] + orr r12,r12,r3 + str r12,[r10,r7,lsl #2] + + cmp r4,#1 + bls rmarkr_array_length_0_1 + + mov r7,r6 + add r6,r6,r4,lsl #2 + + ldr r4,[r6] + ldr r3,[r7] + str r4,[r7] + str r3,[r6] + + ldr r4,[r6,#-4] + subs r6,r6,#4 + add r4,r4,#2 + ldr r3,[r7,#-4] + subs r7,r7,#4 + str r3,[r6] + str r4,[r7] + + ldr r4,[r6,#-4] + subs r6,r6,#4 + str r9,[r6] + mov r9,r6 + mov r6,r4 + b rmarkr_node + +rmarkr_array_length_0_1: + add r6,r6,#-8 + blo rmarkr_next_node + + ldr r3,[r6,#12] + ldr r8,[r6,#8] + str r8,[r6,#12] + ldr r8,[r6,#4] + str r8,[r6,#8] + str r3,[r6,#4] + add r6,r6,#4 + b rmarkr_hnf_1 + +@ a2: free + +rmarkr_parent: + and r3,r9,#3 + + bics r9,r9,#3 + beq end_rmarkr + + subs r3,r3,#1 + beq rmarkr_argument_part_parent + + ldr r8,[r9] + + cmp r6,r9 + bhi rmarkr_no_reverse_2 + + mov r7,r6 + add r4,r9,#1 + ldr r6,[r7] + str r4,[r7] + +rmarkr_no_reverse_2: + str r6,[r9] + add r6,r9,#-4 + mov r9,r8 + b rmarkr_next_node + + +rmarkr_argument_part_parent: + ldr r8,[r9] + + mov r7,r9 + mov r9,r6 + mov r6,r7 + +rmarkr_skip_upward_pointers: + mov r4,r8 + and r4,r4,#3 + cmp r4,#3 + bne rmarkr_no_upward_pointer + + add r7,r8,#-3 + ldr r8,[r8,#-3] + b rmarkr_skip_upward_pointers + +rmarkr_no_upward_pointer: + cmp r9,r6 + bhi rmarkr_no_reverse_3 + + mov r3,r9 + ldr r9,[r9] + add r4,r6,#1 + str r4,[r3] + +rmarkr_no_reverse_3: + str r9,[r7] + add r9,r8,#-4 + + and r9,r9,#-4 + + mov r7,r9 + mov r3,#3 + + ldr r8,[r9] + + and r3,r3,r8 + ldr r4,[r7,#4] + + orr r9,r9,r3 + str r4,[r7] + + cmp r6,r7 + bhi rmarkr_no_reverse_4 + + ldr r4,[r6] + str r4,[r7,#4] + add r4,r7,#4+2+1 + str r4,[r6] + mov r6,r8 + and r6,r6,#-4 + b rmarkr_node + +rmarkr_no_reverse_4: + str r6,[r7,#4] + mov r6,r8 + and r6,r6,#-4 + b rmarkr_node + +rmarkr_argument_part_cycle1: + ldr r4,[r9,#4] + str r7,[sp,#-4]! + +rmarkr_skip_pointer_list1: + mov r7,r8 + and r7,r7,#-4 + ldr r8,[r7] + mov r3,#3 + and r3,r3,r8 + cmp r3,#3 + beq rmarkr_skip_pointer_list1 + + str r4,[r7] + ldr r7,[sp],#4 + b rmarkr_c_argument_part_cycle1 + +.ifdef SHARE_CHAR_INT +rmarkr_next_node_after_static: + tst r9,#3 + bne rmarkr_parent_after_static + + ldr r8,[r9,#-4] + mov r3,#3 + + and r3,r3,r8 + subs r9,r9,#4 + + cmp r3,#3 + beq rmarkr_argument_part_cycle2 + + ldr r4,[r9,#4] + str r4,[r9] + +rmarkr_c_argument_part_cycle2: + str r6,[r9,#4] + mov r6,r8 + orr r9,r9,r3 + eor r6,r6,r3 + b rmarkr_node + +rmarkr_parent_after_static: + and r3,r9,#3 + + ands r9,r9,#-4 + beq end_rmarkr_after_static + + subs r3,r3,#1 + beq rmarkr_argument_part_parent_after_static + + ldr r8,[r9] + str r6,[r9] + add r6,r9,#-4 + mov r9,r8 + b rmarkr_next_node + +rmarkr_argument_part_parent_after_static: + ldr r8,[r9] + + mov r7,r9 + mov r9,r6 + mov r6,r7 + +@ movl (a1),a2 +rmarkr_skip_upward_pointers_2: + mov r4,r8 + and r4,r4,#3 + cmp r4,#3 + bne rmarkr_no_reverse_3 + +@ movl a2,a1 +@ andl $-4,a1 +@ movl (a1),a2 + add r7,r8,#-3 + ldr r8,[r8,#-3] + b rmarkr_skip_upward_pointers_2 + +rmarkr_argument_part_cycle2: + ldr r4,[r9,#4] + str r7,[sp,#-4]! + +rmarkr_skip_pointer_list2: + mov r7,r8 + and r7,r7,#-4 + ldr r8,[r7] + mov r3,#3 + and r3,r3,r8 + cmp r3,#3 + beq rmarkr_skip_pointer_list2 + + str r4,[r7] + ldr r7,[sp],#4 + b rmarkr_c_argument_part_cycle2 +.endif + +end_rmarkr_after_static: + ldr r9,[sp] + add sp,sp,#8 + str r6,[r9] + b rmarkr_next_stack_node + +end_rmarkr: + ldr r9,[sp],#4 + ldr r3,[sp],#4 + + cmp r6,r3 + bhi rmark_no_reverse_4 + + mov r7,r6 + add r4,r9,#1 + ldr r6,[r6] + str r4,[r7] + +rmark_no_reverse_4: + str r6,[r9] + +rmarkr_next_stack_node: + cmp sp,r0 + bhs rmark_next_node + + ldr r6,[sp] + ldr r9,[sp,#4] + add sp,sp,#8 + + cmp r6,#1 + bhi rmark_using_reversal + + b rmark_next_node_ + + .ltorg 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: diff --git a/armdivmod.s b/armdivmod.s new file mode 100644 index 0000000..cafc9ca --- /dev/null +++ b/armdivmod.s @@ -0,0 +1,169 @@ + + .arch armv7-a + .fpu vfpv3-d16 + .text + + .globl divide +divide: + eor r12,r3,r4 + cmp r4,#0 + neglt r4,r4 + cmp r3,#0 + neglt r3,r3 + + cmp r4,#32 + bls divide_by_small_number + + clz r1,r4 + clz r2,r3 + rsb r1,r1,#31-5-11 + add r1,r1,r2 + mov r2,#0 + + cmp r1,#32-5-11 + bhs divide_large_result + + add r1,r1,r1,lsl #1 + add pc,pc,r1,lsl #2 + nop + + .set shift,32-5-11 + .rept 32-5-11 + .set shift,shift-1 + subs r1,r3,r4,lsl #shift + movcs r3,r1 + orrcs r2,r2,#1< a0: array + +_create_r_array: + mul r12,r4,r2 + add r12,r12,#3 + subs r5,r5,r12 + bhs no_collect_4586 + bl collect_1 +no_collect_4586: + mov r8,r6 + + ldr r12,=__ARRAY__+2 + str r12,[r10] + str r4,[r10,#4] + str r3,[r10,#8] + + mov r6,r10 + add r10,r10,#12 + +@ r4: number of elements, a0: array +@ r2: element size, r1: element a size, a2:a_element + + cmp r1,#0 + beq _create_r_array_0 + cmp r1,#2 + blo _create_r_array_1 + beq _create_r_array_2 + cmp r1,#4 + blo _create_r_array_3 + beq _create_r_array_4 + b _create_r_array_5 + +_create_r_array_0: + lsl r2,r2,#2 + mul r12,r4,r2 + add r10,r10,r12 + ldr pc,[sp],#4 + +_create_r_array_1: + lsl r2,r2,#2 + b _st_fillr1_array +_fillr1_array: + str r8,[r10] + add r10,r10,r2 +_st_fillr1_array: + subs r4,r4,#1 + bcs _fillr1_array + ldr pc,[sp],#4 + +_create_r_array_2: + lsl r2,r2,#2 + b _st_fillr2_array +_fillr2_array: + str r8,[r10] + str r8,[r10,#4] + add r10,r10,r2 +_st_fillr2_array: + subs r4,r4,#1 + bcs _fillr2_array + ldr pc,[sp],#4 + +_create_r_array_3: + lsl r2,r2,#2 + b _st_fillr3_array +_fillr3_array: + str r8,[r10] + str r8,[r10,#4] + str r8,[r10,#8] + add r10,r10,r2 +_st_fillr3_array: + subs r4,r4,#1 + bcs _fillr3_array + ldr pc,[sp],#4 + +_create_r_array_4: + lsl r2,r2,#2 + b _st_fillr4_array +_fillr4_array: + str r8,[r10] + str r8,[r10,#4] + str r8,[r10,#8] + str r8,[r10,#12] + add r10,r10,r2 +_st_fillr4_array: + subs r4,r4,#1 + bcs _fillr4_array + ldr pc,[sp],#4 + +_create_r_array_5: + sub r2,r2,r1 + lsl r2,r2,#2 + b _st_fillr5_array + +_fillr5_array: + str r8,[r10] + str r8,[r10,#4] + str r8,[r10,#8] + str r8,[r10,#12] + add r10,r10,#16 + + sub r3,r1,#5 +_copy_elem_5_lp: + str r8,[r10],#4 + subs r3,r3,#1 + bcs _copy_elem_5_lp + + add r10,r10,r2 +_st_fillr5_array: + subs r4,r4,#1 + bcs _fillr5_array + + ldr pc,[sp],#4 + +create_arrayB: + mov r7,r3 + add r3,r3,#3 + lsr r3,r3,#2 + + add r12,r3,#3 + subs r5,r5,r12 + bhs no_collect_4575 + + str r7,[sp,#-4]! + bl collect_0 + ldr r7,[sp],#4 + +no_collect_4575: + orr r4,r4,r4,lsl #8 + orr r4,r4,r4,lsl #16 + mov r6,r10 + ldr r12,=__ARRAY__+2 + str r12,[r10] + str r7,[r10,#4] + ldr r12,=BOOL+2 + str r12,[r10,#8] + add r10,r10,#12 + b create_arrayBCI + +create_arrayC: + mov r7,r3 + add r3,r3,#3 + lsr r3,r3,#2 + + add r12,r3,#2 + subs r5,r5,r12 + bhs no_collect_4578 + + str r7,[sp,#-4]! + bl collect_0 + ldr r7,[sp],#4 + +no_collect_4578: + orr r4,r4,r4,lsl #8 + orr r4,r4,r4,lsl #16 + mov r6,r10 + ldr r12,=__STRING__+2 + str r12,[r10] + str r7,[r10,#4] + add r10,r10,#8 + b create_arrayBCI + +create_arrayI: + add r12,r3,#3 + subs r5,r5,r12 + bhs no_collect_4577 + + bl collect_0 + +no_collect_4577: + mov r6,r10 + ldr r12,=__ARRAY__+2 + str r12,[r10] + str r3,[r10,#4] + ldr r12,=INT+2 + str r12,[r10,#8] + add r10,r10,#12 +create_arrayBCI: + tst r3,#1 + lsr r3,r3,#1 + beq st_filli_array + + str r4,[r10],#4 + b st_filli_array + +filli_array: + str r4,[r10] + str r4,[r10,#4] + add r10,r10,#8 +st_filli_array: + subs r3,r3,#1 + bcs filli_array + + ldr pc,[sp],#4 + +create_arrayR: + add r12,r4,r4 + add r12,r12,#3+1 + + vmov r3,r7,d0 + + subs r5,r5,r12 + bhs no_collect_4579 + + str r7,[sp,#-4]! + bl collect_0 + ldr r7,[sp],#4 + +no_collect_4579: + tst r10,#4 + orr r10,r10,#4 + addne r5,r5,#1 + + mov r6,r10 + ldr r12,=__ARRAY__+2 + str r12,[r10] + str r4,[r10,#4] + ldr r12,=REAL+2 + str r12,[r10,#8] + add r10,r10,#12 + b st_fillr_array +fillr_array: + str r3,[r10] + str r7,[r10,#4] + add r10,r10,#8 +st_fillr_array: + subs r4,r4,#1 + bcs fillr_array + + ldr pc,[sp],#4 + +create_array: + add r12,r4,#3 + subs r5,r5,r12 + bhs no_collect_4576 + + bl collect_1 + +no_collect_4576: + mov r3,r6 + mov r6,r10 + ldr r12,=__ARRAY__+2 + str r12,[r10] + str r4,[r10,#4] + mov r12,#0 + str r12,[r10,#8] + add r10,r10,#12 + mov r1,r4 + b fillr1_array + +@ in r4: number of elements, r3: element descriptor +@ r2: element size, r1: element a size -> a0: array + +create_R_array: + cmp r2,#2 + blo create_R_array_1 + beq create_R_array_2 + cmp r2,#4 + blo create_R_array_3 + beq create_R_array_4 + b create_R_array_5 + +create_R_array_1: +@ r4: number of elements, r3: element descriptor +@ r1: element a size + + add r12,r4,#3 + subs r5,r5,r12 + bhs no_collect_4581 + + bl collect_0 + +no_collect_4581: + mov r6,r10 + ldr r12,=__ARRAY__+2 + str r12,[r10] + str r4,[r10,#4] + str r3,[r10,#8] + add r10,r10,#12 + + cmp r1,#0 + beq r_array_1_b + + ldr r3,[r9,#-4] + b fillr1_array + +r_array_1_b: + ldr r3,[sp,#4] + +fillr1_array: + tst r4,#1 + lsr r4,r4,#1 + beq st_fillr1_array_1 + + str r3,[r10],#4 + b st_fillr1_array_1 + +fillr1_array_lp: + str r3,[r10] + str r3,[r10,#4] + add r10,r10,#8 +st_fillr1_array_1: + subs r4,r4,#1 + bcs fillr1_array_lp + + ldr pc,[sp],#4 + +create_R_array_2: +@ r4: number of elements, r3: element descriptor +@ r1: element a size + + add r12,r4,r4 + add r12,r12,#3 + subs r5,r5,r12 + bhs no_collect_4582 + + bl collect_0 + +no_collect_4582: + mov r6,r10 + ldr r12,=__ARRAY__+2 + str r12,[r10] + str r4,[r10,#4] + str r3,[r10,#8] + add r10,r10,#12 + + subs r1,r1,#1 + blo r_array_2_bb + beq r_array_2_ab +r_array_2_aa: + ldr r3,[r9,#-4] + ldr r8,[r9,#-8] + b st_fillr2_array +r_array_2_ab: + ldr r3,[r9,#-4] + ldr r8,[sp,#4] + b st_fillr2_array +r_array_2_bb: + ldr r3,[sp,#4] + ldr r8,[sp,#8] + b st_fillr2_array + +fillr2_array_1: + str r3,[r10] + str r8,[r10,#4] + add r10,r10,#8 +st_fillr2_array: + subs r4,r4,#1 + bcs fillr2_array_1 + + ldr pc,[sp],#4 + +create_R_array_3: +@ r4: number of elements, r3: element descriptor +@ r1: element a size + + add r12,r4,r4,lsl #1 + add r12,r12,#3 + subs r5,r5,r12 + bhs no_collect_4583 + + bl collect_0 + +no_collect_4583: + mov r6,r10 + ldr r12,=__ARRAY__+2 + str r12,[r10] + str r4,[r10,#4] + str r3,[r10,#8] + add r10,r10,#12 + + ldr lr,[sp],#4 + mov r2,sp + + cmp r1,#0 + beq r_array_3 + + sub r8,r9,r1,lsl #2 + subs r1,r1,#1 + +copy_a_to_b_lp3: + ldr r12,[r8],#4 + str r12,[sp,#-4]! + subs r1,r1,#1 + bcs copy_a_to_b_lp3 + +r_array_3: + ldr r3,[sp] + ldr r7,[sp,#4] + ldr r8,[sp,#8] + + mov sp,r2 + b st_fillr3_array + +fillr3_array_1: + str r3,[r10] + str r7,[r10,#4] + str r8,[r10,#8] + add r10,r10,#12 +st_fillr3_array: + subs r4,r4,#1 + bcs fillr3_array_1 + + bx lr + +create_R_array_4: +@ r4: number of elements, r3: element descriptor +@ r1: element a size + + lsl r12,r4,#2 + add r12,r12,#3 + subs r5,r5,r12 + bhs no_collect_4584 + + bl collect_0 + +no_collect_4584: + mov r6,r10 + ldr r12,=__ARRAY__+2 + str r12,[r10] + str r4,[r10,#4] + str r3,[r10,#8] + add r10,r10,#12 + + ldr lr,[sp],#4 + mov r2,sp + + cmp r1,#0 + beq r_array_4 + + sub r8,r9,r1,lsl #2 + subs r1,r1,#1 + +copy_a_to_b_lp4: + ldr r12,[r8],#4 + str r12,[sp,#-4]! + subs r1,r1,#1 + bcs copy_a_to_b_lp4 + +r_array_4: + ldr r0,[sp] + ldr r3,[sp,#4] + ldr r7,[sp,#8] + ldr r8,[sp,#12] + + mov sp,r2 + b st_fillr4_array + +fillr4_array: + str r0,[r10] + str r3,[r10,#4] + str r7,[r10,#8] + str r8,[r10,#12] + add r10,r10,#16 +st_fillr4_array: + subs r4,r4,#1 + bcs fillr4_array + + bx lr + +create_R_array_5: +@ r4: number of elements, r3: element descriptor +@ r1: element a size, r2: element size + + mul r12,r4,r2 + add r12,r12,#3 + subs r5,r5,r12 + bhs no_collect_4585 + + bl collect_0 + +no_collect_4585: + ldr r12,=__ARRAY__+2 + str r12,[r10] + str r4,[r10,#4] + str r3,[r10,#8] + + ldr lr,[sp],#4 + mov r11,sp + + cmp r1,#0 + beq r_array_5 + + sub r8,r9,r1,lsl #2 + subs r1,r1,#1 + +copy_a_to_b_lp5: + ldr r12,[r8],#4 + str r12,[sp,#-4]! + subs r1,r1,#1 + bcs copy_a_to_b_lp5 + +r_array_5: + mov r6,r10 + add r10,r10,#12 + + ldr r3,[sp] + ldr r7,[sp,#4] + b st_fillr5_array + +fillr5_array_1: + str r3,[r10] + str r7,[r10,#4] + + sub r12,r2,#5 + + ldr r8,[sp,#8] + str r8,[r10,#8] + + ldr r8,[sp,#12] + add r0,sp,#16 + str r8,[r10,#12] + add r10,r10,#16 + +copy_elem_lp5: + ldr r8,[r0],#4 + str r8,[r10],#4 + subs r12,r12,#1 + bcs copy_elem_lp5 + +st_fillr5_array: + subs r4,r4,#1 + bcs fillr5_array_1 + + mov sp,r11 + + bx lr + +repl_args_b: + cmp r4,#0 + ble repl_args_b_1 + + subs r4,r4,#1 + beq repl_args_b_4 + + ldr r7,[r6,#8] + subs r3,r3,#2 + bne repl_args_b_2 + + str r7,[r9],#4 + b repl_args_b_4 + +repl_args_b_2: + add r7,r7,r4,lsl #2 + +repl_args_b_3: + ldr r8,[r7,#-4]! + str r8,[r9],#4 + subs r4,r4,#1 + bne repl_args_b_3 + +repl_args_b_4: + ldr r8,[r6,#4] + str r8,[r9],#4 +repl_args_b_1: + ldr pc,[sp],#4 + +push_arg_b: + cmp r3,#2 + blo push_arg_b_1 + bne push_arg_b_2 + cmp r3,r4 + beq push_arg_b_1 +push_arg_b_2: + ldr r6,[r6,#8] + subs r3,r3,#2 +push_arg_b_1: + ldr r6,[r6,r3,lsl #2] + ldr pc,[sp],#4 + +del_args: + ldr r3,[r6] + subs r3,r3,r4 + ldrsh r4,[r3,#-2] + subs r4,r4,#2 + bge del_args_2 + + str r3,[r7] + ldr r8,[r6,#4] + str r8,[r7,#4] + ldr r8,[r6,#8] + str r8,[r7,#8] + ldr pc,[sp],#4 + +del_args_2: + bne del_args_3 + + str r3,[r7] + ldr r8,[r6,#4] + str r8,[r7,#4] + ldr r8,[r6,#8] + ldr r8,[r8] + str r8,[r7,#8] + ldr pc,[sp],#4 + +del_args_3: + subs r5,r5,r4 + blo del_args_gc +del_args_r_gc: + str r3,[r7] + str r10,[r7,#8] + ldr r8,[r6,#4] + ldr r6,[r6,#8] + str r8,[r7,#4] + +del_args_copy_args: + ldr r8,[r6],#4 + str r8,[r10],#4 + subs r4,r4,#1 + bgt del_args_copy_args + + ldr pc,[sp],#4 + +del_args_gc: + bl collect_2 + b del_args_r_gc + + .section .text.sin_real,"ax" +sin_real: + bl sin + ldr pc,[sp],#4 + + .section .text.cos_real,"ax" +cos_real: + bl cos + ldr pc,[sp],#4 + + .section .text.tan_real,"ax" +tan_real: + bl tan + ldr pc,[sp],#4 + + .section .text.asin_real,"ax" +asin_real: + bl asin + ldr pc,[sp],#4 + + .section .text.acos_real,"ax" +acos_real: + bl acos + ldr pc,[sp],#4 + + .section .text.atan_real,"ax" +atan_real: + bl atan + ldr pc,[sp],#4 + + .section .text.ln_real,"ax" +ln_real: + bl log + ldr pc,[sp],#4 + + .section .text.log10_real,"ax" +log10_real: + bl log10 + ldr pc,[sp],#4 + + .section .text.exp_real,"ax" +exp_real: + bl exp + ldr pc,[sp],#4 + + .section .text.pow_real,"ax" +pow_real: + vmov.f64 d2,d0 + vmov.f64 d0,d1 + vmov.f64 d1,d2 + bl pow + ldr pc,[sp],#4 + + .section .text.entier_real,"ax" +entier_real: + bl floor + +r_to_i_real: + vcvtr.s32.f64 s0,d0 + vmov r4,s0 + ldr pc,[sp],#4 + + .ltorg + +.if NEW_DESCRIPTORS +# include "armap.s" +.endif -- cgit v1.2.3