From 90a02f720ece4c6d3163246ce17718d3d4d4b5c8 Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Thu, 22 Oct 2015 13:08:20 +0000 Subject: add position independent code option (PIC) for ARM --- armap.s | 444 +++++++++++---- armcompact.s | 232 +++++--- armcompact_rmark.s | 102 +++- armcompact_rmarkr.s | 131 +++-- armcopy.s | 208 +++++-- armfileIO3.s | 38 +- armmacros.s | 76 +++ armmark.s | 476 +++++++++++----- armstartup.s | 1536 ++++++++++++++++++++++++++++++++++----------------- 9 files changed, 2280 insertions(+), 963 deletions(-) create mode 100644 armmacros.s diff --git a/armap.s b/armap.s index 91ddf2a..f46ac0b 100644 --- a/armap.s +++ b/armap.s @@ -1003,10 +1003,11 @@ add_empty_node_2: subs r5,r5,#3 blo add_empty_node_2_gc add_empty_node_2_gc_: - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,1 mov r8,r7 mov r7,r6 mov r6,r10 + otoa r12,__cycle__in__spine,1 str r12,[r10],#12 bx lr add_empty_node_2_gc: @@ -1019,8 +1020,9 @@ add_empty_node_3: subs r5,r5,#3 blo add_empty_node_3_gc add_empty_node_3_gc_: - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,2 str r10,[r9],#4 + otoa r12,__cycle__in__spine,2 str r12,[r10],#12 bx lr add_empty_node_3_gc: @@ -1036,8 +1038,9 @@ add_empty_node_4_gc_: ldr r11,[r9,#-4] str r11,[r9] str r10,[r9,#-4] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,3 add r9,r9,#4 + otoa r12,__cycle__in__spine,3 str r12,[r10],#12 bx lr add_empty_node_4_gc: @@ -1055,8 +1058,9 @@ add_empty_node_5_gc_: ldr r11,[r9,#-8] str r11,[r9,#-4] str r10,[r9,#-8] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,4 add r9,r9,#4 + otoa r12,__cycle__in__spine,4 str r12,[r10],#12 bx lr add_empty_node_5_gc: @@ -1076,8 +1080,9 @@ add_empty_node_6_gc_: ldr r11,[r9,#-12] str r11,[r9,#-8] str r10,[r9,#-12] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,5 add r9,r9,#4 + otoa r12,__cycle__in__spine,5 str r12,[r10],#12 bx lr add_empty_node_6_gc: @@ -1097,8 +1102,9 @@ add_empty_node_7_gc_: ldr r11,[r9,#-16] str r11,[r9,#-12] str r10,[r9,#-16] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,6 add r9,r9,#4 + otoa r12,__cycle__in__spine,6 str r12,[r10],#12 bx lr add_empty_node_7_gc: @@ -1120,8 +1126,9 @@ add_empty_node_8_gc_: ldr r11,[r9,#-20] str r11,[r9,#-16] str r10,[r9,#-20] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,7 add r9,r9,#4 + otoa r12,__cycle__in__spine,7 str r12,[r10],#12 bx lr add_empty_node_8_gc: @@ -1145,8 +1152,9 @@ add_empty_node_9_gc_: ldr r11,[r9,#-24] str r11,[r9,#-20] str r10,[r9,#-24] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,8 add r9,r9,#4 + otoa r12,__cycle__in__spine,8 str r12,[r10],#12 bx lr add_empty_node_9_gc: @@ -1172,8 +1180,9 @@ add_empty_node_10_gc_: ldr r11,[r9,#-28] str r11,[r9,#-24] str r10,[r9,#-28] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,9 add r9,r9,#4 + otoa r12,__cycle__in__spine,9 str r12,[r10],#12 bx lr add_empty_node_10_gc: @@ -1215,8 +1224,9 @@ add_empty_node_11_lp: subs r3,r3,#1 bne add_empty_node_11_lp str r10,[r4] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,10 add r9,r9,#4 + otoa r12,__cycle__in__spine,10 str r12,[r10],#12 bx lr add_empty_node_11_gc: @@ -1259,8 +1269,9 @@ add_empty_node_12_lp: subs r3,r3,#1 bne add_empty_node_12_lp str r10,[r4,#-4] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,11 add r9,r9,#4 + otoa r12,__cycle__in__spine,11 str r12,[r10],#12 bx lr add_empty_node_12_gc: @@ -1303,8 +1314,9 @@ add_empty_node_13_lp: subs r3,r3,#1 bne add_empty_node_13_lp str r10,[r4,#-8] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,12 add r9,r9,#4 + otoa r12,__cycle__in__spine,12 str r12,[r10],#12 bx lr add_empty_node_13_gc: @@ -1350,14 +1362,30 @@ add_empty_node_14_lp: subs r3,r3,#1 bne add_empty_node_14_lp str r10,[r4,#-12] - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,13 add r9,r9,#4 + otoa r12,__cycle__in__spine,13 str r12,[r10],#12 bx lr add_empty_node_14_gc_: bl collect_3 b add_empty_node_14_gc_ +.ifdef PIC + lto __cycle__in__spine,1 + lto __cycle__in__spine,2 + lto __cycle__in__spine,3 + lto __cycle__in__spine,4 + lto __cycle__in__spine,5 + lto __cycle__in__spine,6 + lto __cycle__in__spine,7 + lto __cycle__in__spine,8 + lto __cycle__in__spine,9 + lto __cycle__in__spine,10 + lto __cycle__in__spine,11 + lto __cycle__in__spine,12 + lto __cycle__in__spine,13 +.endif .ltorg yet_args_needed_0: @@ -2009,15 +2037,17 @@ build_node_gc: apupd_1: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,0 + otoa r8,apupd_upd,0 cmp r12,r8 - ldr r8,=ap_1 + lao r8,ap_1,0 bne ap_upd ldr r8,[r9,#-4] ldr r4,[r9,#-8] + lao r12,__indirection,23 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,23 str r12,[r8] str r4,[r8,#4] ap_1: @@ -2027,26 +2057,29 @@ ap_1: apupd_2: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,1 + otoa r8,apupd_upd,1 cmp r12,r8 - ldr r8,=ap_2 + lao r8,ap_2,0 bne ap_upd ldr r8,[r9,#-8] ldr r4,[r9,#-12] ldr r3,[r9,#-4] str r3,[r9,#-8] + lao r12,__indirection,24 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,24 str r12,[r8] str r4,[r8,#4] b ap_2 apupd_3: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,2 + otoa r8,apupd_upd,2 cmp r12,r8 - ldr r8,=ap_3 + lao r8,ap_3,0 bne ap_upd ldr r8,[r9,#-12] @@ -2055,17 +2088,19 @@ apupd_3: str r3,[r9,#-12] ldr r3,[r9,#-4] str r3,[r9,#-8] + lao r12,__indirection,25 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,25 str r12,[r8] str r4,[r8,#4] b ap_3 apupd_4: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,3 + otoa r8,apupd_upd,3 cmp r12,r8 - ldr r8,=ap_4 + lao r8,ap_4,0 bne ap_upd ldr r8,[r9,#-16] @@ -2076,17 +2111,19 @@ apupd_4: str r3,[r9,#-12] ldr r3,[r9,#-4] str r3,[r9,#-8] + lao r12,__indirection,26 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,26 str r12,[r8] str r4,[r8,#4] b ap_4 apupd_5: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,4 + otoa r8,apupd_upd,4 cmp r12,r8 - ldr r8,=ap_5 + lao r8,ap_5,0 bne ap_upd ldr r8,[r9,#-20] @@ -2099,17 +2136,19 @@ apupd_5: str r3,[r9,#-12] ldr r3,[r9,#-4] str r3,[r9,#-8] + lao r12,__indirection,27 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,27 str r12,[r8] str r4,[r8,#4] b ap_5 apupd_6: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,5 + otoa r8,apupd_upd,5 cmp r12,r8 - ldr r8,=ap_6 + lao r8,ap_6,0 bne ap_upd ldr r8,[r9,#-24] @@ -2124,455 +2163,543 @@ apupd_6: str r3,[r9,#-12] ldr r3,[r9,#-4] str r3,[r9,#-8] + lao r12,__indirection,28 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,28 str r12,[r8] str r4,[r8,#4] b ap_6 apupd_7: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,6 + otoa r8,apupd_upd,6 cmp r12,r8 - ldr r8,=ap_7 + lao r8,ap_7,0 bne ap_upd ldr r8,[r9,#-28] ldr r4,[r9,#-32] str pc,[sp,#-4]! bl move_8 + lao r12,__indirection,29 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,29 str r12,[r8] str r4,[r8,#4] b ap_7 apupd_8: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,7 + otoa r8,apupd_upd,7 cmp r12,r8 - ldr r8,=ap_8 + lao r8,ap_8,0 bne ap_upd ldr r8,[r9,#-32] ldr r4,[r9,#-36] str pc,[sp,#-4]! bl move_9 + lao r12,__indirection,30 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,30 str r12,[r8] str r4,[r8,#4] b ap_8 apupd_9: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,8 + otoa r8,apupd_upd,8 cmp r12,r8 - ldr r8,=ap_9 + lao r8,ap_9,0 bne ap_upd ldr r8,[r9,#-36] ldr r4,[r9,#-40] str pc,[sp,#-4]! bl move_10 + lao r12,__indirection,31 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,31 str r12,[r8] str r4,[r8,#4] b ap_9 apupd_10: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,9 + otoa r8,apupd_upd,9 cmp r12,r8 - ldr r8,=ap_10 + lao r8,ap_10,0 bne ap_upd ldr r8,[r9,#-40] ldr r4,[r9,#-44] str pc,[sp,#-4]! bl move_11 + lao r12,__indirection,32 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,32 str r12,[r8] str r4,[r8,#4] b ap_10 apupd_11: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,10 + otoa r8,apupd_upd,10 cmp r12,r8 - ldr r8,=ap_11 + lao r8,ap_11,0 bne ap_upd ldr r8,[r9,#-44] ldr r4,[r9,#-48] str pc,[sp,#-4]! bl move_12 + lao r12,__indirection,33 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,33 str r12,[r8] str r4,[r8,#4] b ap_11 apupd_12: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,11 + otoa r8,apupd_upd,11 cmp r12,r8 - ldr r8,=ap_12 + lao r8,ap_12,0 bne ap_upd ldr r8,[r9,#-48] ldr r4,[r9,#-52] str pc,[sp,#-4]! bl move_13 + lao r12,__indirection,34 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,34 str r12,[r8] str r4,[r8,#4] b ap_12 apupd_13: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,12 + otoa r8,apupd_upd,12 cmp r12,r8 - ldr r8,=ap_13 + lao r8,ap_13,0 bne ap_upd ldr r8,[r9,#-52] ldr r4,[r9,#-56] str pc,[sp,#-4]! bl move_14 + lao r12,__indirection,35 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,35 str r12,[r8] str r4,[r8,#4] b ap_13 apupd_14: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,13 + otoa r8,apupd_upd,13 cmp r12,r8 - ldr r8,=ap_14 + lao r8,ap_14,0 bne ap_upd ldr r8,[r9,#-56] ldr r4,[r9,#-60] str pc,[sp,#-4]! bl move_15 + lao r12,__indirection,36 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,36 str r12,[r8] str r4,[r8,#4] b ap_14 apupd_15: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,14 + otoa r8,apupd_upd,14 cmp r12,r8 - ldr r8,=ap_15 + lao r8,ap_15,0 bne ap_upd ldr r8,[r9,#-60] ldr r4,[r9,#-64] str pc,[sp,#-4]! bl move_16 + lao r12,__indirection,37 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,37 str r12,[r8] str r4,[r8,#4] b ap_15 apupd_16: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,15 + otoa r8,apupd_upd,15 cmp r12,r8 - ldr r8,=ap_16 + lao r8,ap_16,0 bne ap_upd ldr r8,[r9,#-64] ldr r4,[r9,#-68] str pc,[sp,#-4]! bl move_17 + lao r12,__indirection,38 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,38 str r12,[r8] str r4,[r8,#4] b ap_16 apupd_17: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,16 + otoa r8,apupd_upd,16 cmp r12,r8 - ldr r8,=ap_17 + lao r8,ap_17,0 bne ap_upd ldr r8,[r9,#-68] ldr r4,[r9,#-72] str pc,[sp,#-4]! bl move_18 + lao r12,__indirection,39 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,39 str r12,[r8] str r4,[r8,#4] b ap_17 apupd_18: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,17 + otoa r8,apupd_upd,17 cmp r12,r8 - ldr r8,=ap_18 + lao r8,ap_18,0 bne ap_upd ldr r8,[r9,#-72] ldr r4,[r9,#-76] str pc,[sp,#-4]! bl move_19 + lao r12,__indirection,40 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,40 str r12,[r8] str r4,[r8,#4] b ap_18 apupd_19: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,18 + otoa r8,apupd_upd,18 cmp r12,r8 - ldr r8,=ap_19 + lao r8,ap_19,0 bne ap_upd ldr r8,[r9,#-76] ldr r4,[r9,#-80] str pc,[sp,#-4]! bl move_20 + lao r12,__indirection,41 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,41 str r12,[r8] str r4,[r8,#4] b ap_19 apupd_20: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,19 + otoa r8,apupd_upd,19 cmp r12,r8 - ldr r8,=ap_20 + lao r8,ap_20,0 bne ap_upd ldr r8,[r9,#-80] ldr r4,[r9,#-84] str pc,[sp,#-4]! bl move_21 + lao r12,__indirection,42 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,42 str r12,[r8] str r4,[r8,#4] b ap_20 apupd_21: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,20 + otoa r8,apupd_upd,20 cmp r12,r8 - ldr r8,=ap_21 + lao r8,ap_21,0 bne ap_upd ldr r8,[r9,#-84] ldr r4,[r9,#-88] str pc,[sp,#-4]! bl move_22 + lao r12,__indirection,43 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,43 str r12,[r8] str r4,[r8,#4] b ap_21 apupd_22: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,21 + otoa r8,apupd_upd,21 cmp r12,r8 - ldr r8,=ap_22 + lao r8,ap_22,0 bne ap_upd ldr r8,[r9,#-88] ldr r4,[r9,#-92] str pc,[sp,#-4]! bl move_23 + lao r12,__indirection,44 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,44 str r12,[r8] str r4,[r8,#4] b ap_22 apupd_23: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,22 + otoa r8,apupd_upd,22 cmp r12,r8 - ldr r8,=ap_23 + lao r8,ap_23,0 bne ap_upd ldr r8,[r9,#-92] ldr r4,[r9,#-96] str pc,[sp,#-4]! bl move_24 + lao r12,__indirection,45 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,45 str r12,[r8] str r4,[r8,#4] b ap_23 apupd_24: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,23 + otoa r8,apupd_upd,23 cmp r12,r8 - ldr r8,=ap_24 + lao r8,ap_24,0 bne ap_upd ldr r8,[r9,#-96] ldr r4,[r9,#-100] str pc,[sp,#-4]! bl move_25 + lao r12,__indirection,46 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,46 str r12,[r8] str r4,[r8,#4] b ap_24 apupd_25: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,24 + otoa r8,apupd_upd,24 cmp r12,r8 - ldr r8,=ap_25 + lao r8,ap_25,0 bne ap_upd ldr r8,[r9,#-100] ldr r4,[r9,#-104] str pc,[sp,#-4]! bl move_26 + lao r12,__indirection,47 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,47 str r12,[r8] str r4,[r8,#4] b ap_25 apupd_26: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,25 + otoa r8,apupd_upd,25 cmp r12,r8 - ldr r8,=ap_26 + lao r8,ap_26,0 bne ap_upd ldr r8,[r9,#-104] ldr r4,[r9,#-108] str pc,[sp,#-4]! bl move_27 + lao r12,__indirection,48 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,48 str r12,[r8] str r4,[r8,#4] b ap_26 apupd_27: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,26 + otoa r8,apupd_upd,26 cmp r12,r8 - ldr r8,=ap_27 + lao r8,ap_27,0 bne ap_upd ldr r8,[r9,#-108] ldr r4,[r9,#-112] str pc,[sp,#-4]! bl move_28 + lao r12,__indirection,49 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,49 str r12,[r8] str r4,[r8,#4] b ap_27 apupd_28: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,27 + otoa r8,apupd_upd,27 cmp r12,r8 - ldr r8,=ap_28 + lao r8,ap_28,0 bne ap_upd ldr r8,[r9,#-112] ldr r4,[r9,#-116] str pc,[sp,#-4]! bl move_29 + lao r12,__indirection,50 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,50 str r12,[r8] str r4,[r8,#4] b ap_28 apupd_29: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,28 + otoa r8,apupd_upd,28 cmp r12,r8 - ldr r8,=ap_29 + lao r8,ap_29,0 bne ap_upd ldr r8,[r9,#-116] ldr r4,[r9,#-120] str pc,[sp,#-4]! bl move_30 + lao r12,__indirection,51 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,51 str r12,[r8] str r4,[r8,#4] b ap_29 apupd_30: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,29 + otoa r8,apupd_upd,29 cmp r12,r8 - ldr r8,=ap_30 + lao r8,ap_30,0 bne ap_upd ldr r8,[r9,#-120] ldr r4,[r9,#-124] str pc,[sp,#-4]! bl move_31 + lao r12,__indirection,52 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,52 str r12,[r8] str r4,[r8,#4] b ap_30 apupd_31: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,30 + otoa r8,apupd_upd,30 cmp r12,r8 - ldr r8,=ap_31 + lao r8,ap_31,0 bne ap_upd ldr r8,[r9,#-124] ldr r4,[r9,#-128] str pc,[sp,#-4]! bl move_32 + lao r12,__indirection,53 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,53 str r12,[r8] str r4,[r8,#4] b ap_31 apupd_32: ldr r12,[sp] - ldr r8,=apupd_upd + lao r8,apupd_upd,31 + otoa r8,apupd_upd,31 cmp r12,r8 - ldr r8,=ap_32 + lao r8,ap_32,0 bne ap_upd ldr r8,[r9,#-128] ldr r4,[r9,#-132] str pc,[sp,#-4]! bl move_33 + lao r12,__indirection,54 subs r9,r9,#4 - ldr r12,=__indirection + otoa r12,__indirection,54 str r12,[r8] str r4,[r8,#4] b ap_32 ap_upd: +.ifdef PIC +ap_1__u0: +ap_2__u0: +ap_3__u0: +ap_4__u0: +ap_5__u0: +ap_6__u0: +ap_7__u0: +ap_8__u0: +ap_9__u0: +ap_10__u0: +ap_11__u0: +ap_12__u0: +ap_13__u0: +ap_14__u0: +ap_15__u0: +ap_16__u0: +ap_17__u0: +ap_18__u0: +ap_19__u0: +ap_20__u0: +ap_21__u0: +ap_22__u0: +ap_23__u0: +ap_24__u0: +ap_25__u0: +ap_26__u0: +ap_27__u0: +ap_28__u0: +ap_29__u0: +ap_30__u0: +ap_31__u0: +ap_32__u0: + add r8,r8,pc +.endif str pc,[sp,#-4]! blx r8 apupd_upd: @@ -2677,3 +2804,102 @@ move_7: ldr r3,[r9,#-4] str r3,[r9,#-8] ldr pc,[sp],#4 + +.ifdef PIC + lto apupd_upd,0 + lto ap_1,0 + lto __indirection,23 + lto apupd_upd,1 + lto ap_2,0 + lto __indirection,24 + lto apupd_upd,2 + lto ap_3,0 + lto __indirection,25 + lto apupd_upd,3 + lto ap_4,0 + lto __indirection,26 + lto apupd_upd,4 + lto ap_5,0 + lto __indirection,27 + lto apupd_upd,5 + lto ap_6,0 + lto __indirection,28 + lto apupd_upd,6 + lto ap_7,0 + lto __indirection,29 + lto apupd_upd,7 + lto ap_8,0 + lto __indirection,30 + lto apupd_upd,8 + lto ap_9,0 + lto __indirection,31 + lto apupd_upd,9 + lto ap_10,0 + lto __indirection,32 + lto apupd_upd,10 + lto ap_11,0 + lto __indirection,33 + lto apupd_upd,11 + lto ap_12,0 + lto __indirection,34 + lto apupd_upd,12 + lto ap_13,0 + lto __indirection,35 + lto apupd_upd,13 + lto ap_14,0 + lto __indirection,36 + lto apupd_upd,14 + lto ap_15,0 + lto __indirection,37 + lto apupd_upd,15 + lto ap_16,0 + lto __indirection,38 + lto apupd_upd,16 + lto ap_17,0 + lto __indirection,39 + lto apupd_upd,17 + lto ap_18,0 + lto __indirection,40 + lto apupd_upd,18 + lto ap_19,0 + lto __indirection,41 + lto apupd_upd,19 + lto ap_20,0 + lto __indirection,42 + lto apupd_upd,20 + lto ap_21,0 + lto __indirection,43 + lto apupd_upd,21 + lto ap_22,0 + lto __indirection,44 + lto apupd_upd,22 + lto ap_23,0 + lto __indirection,45 + lto apupd_upd,23 + lto ap_24,0 + lto __indirection,46 + lto apupd_upd,24 + lto ap_25,0 + lto __indirection,47 + lto apupd_upd,25 + lto ap_26,0 + lto __indirection,48 + lto apupd_upd,26 + lto ap_27,0 + lto __indirection,49 + lto apupd_upd,27 + lto ap_28,0 + lto __indirection,50 + lto apupd_upd,28 + lto ap_29,0 + lto __indirection,51 + lto apupd_upd,29 + lto ap_30,0 + lto __indirection,52 + lto apupd_upd,30 + lto ap_31,0 + lto __indirection,53 + lto apupd_upd,31 + lto ap_32,0 + lto __indirection,54 +.endif diff --git a/armcompact.s b/armcompact.s index adc4899..7869198 100644 --- a/armcompact.s +++ b/armcompact.s @@ -4,26 +4,26 @@ NO_BIT_INSTRUCTIONS = 1 @ mark used nodes and pointers in argument parts and link backward pointers - ldr r12,=heap_size_33 - ldr r4,[r12] + lao r12,heap_size_33,10 + ldo r4,r12,heap_size_33,10 lsl r4,r4,#5 - ldr r12,=heap_size_32_33 - str r4,[r12] + lao r12,heap_size_32_33,1 + sto r4,r12,heap_size_32_33,1 @ heap_size_32_33 in r2 mov r2,r4 - ldr r12,=heap_p3 - ldr r11,[r12] + lao r12,heap_p3,11 + ldo r11,r12,heap_p3,11 @ heap_p3 in r11 .if COMPACT_MARK_WITH_STACK add r9,sp,#-8000 .endif - ldr r12,=caf_list - ldr r4,[r12] + lao r12,caf_list,2 + ldo r4,r12,caf_list,2 .if COMPACT_MARK_WITH_STACK - ldr r12,=end_stack - str r9,[r12] + lao r12,end_stack,1 + sto r9,r12,end_stack,1 @ end_stack in r0 mov r0,r9 .endif @@ -42,8 +42,8 @@ mark_cafs_lp: ldr r4,[r4] add r6,r8,r4,lsl #2 .endif - ldr r12,=end_vector - str r6,[r12] + lao r12,end_vector,13 + sto r6,r12,end_vector,13 str pc,[sp,#-4]! .if COMPACT_MARK_WITH_STACK @@ -58,17 +58,17 @@ mark_cafs_lp: end_mark_cafs: .if COMPACT_MARK_WITH_STACK - ldr r12,=stack_p - ldr r9,[r12] + lao r12,stack_p,6 + ldo r9,r12,stack_p,6 .else - ldr r12,=stack_p - ldr r8,[r12] + lao r12,stack_p,6 + ldo r8,r12,stack_p,6 .endif - ldr r12,=stack_top - ldr r6,[r12] - ldr r12,=end_vector - str r6,[r12] + lao r12,stack_top,4 + ldo r6,r12,stack_top,4 + lao r12,end_vector,14 + sto r6,r12,end_vector,14 str pc,[sp,#-4]! .if COMPACT_MARK_WITH_STACK bl rmark_stack_nodes @@ -83,6 +83,19 @@ end_mark_cafs: b compact_heap +.ifdef PIC + lto heap_size_33,10 + lto heap_size_32_33,1 + lto heap_p3,11 + lto caf_list,2 + .if COMPACT_MARK_WITH_STACK + lto end_stack,1 + .endif + lto end_vector,13 + lto stack_p,6 + lto stack_top,4 + lto end_vector,14 +.endif .ltorg .if COMPACT_MARK_WITH_STACK @@ -97,17 +110,20 @@ end_mark_cafs: compact_heap: .ifdef FINALIZERS - ldr r6,=finalizer_list - ldr r7,=free_finalizer_list + lao r6,finalizer_list,3 + lao r7,free_finalizer_list,5 + otoa r6,finalizer_list,3 + otoa r7,free_finalizer_list,5 ldr r8,[r6] determine_free_finalizers_after_compact1: - ldr r12,=__Nil-4 + laol r12,__Nil-4,__Nil_o_m4,5 + otoa r12,__Nil_o_m4,5 cmp r8,r12 beq end_finalizers_after_compact1 - ldr r12,=heap_p3 - ldr r4,[r12] + lao r12,heap_p3,12 + ldo r4,r12,heap_p3,12 sub r4,r8,r4 lsr r3,r4,#7 and r4,r4,#31*4 @@ -131,8 +147,8 @@ finalizer_find_descriptor: tst r4,#1 bne finalizer_find_descriptor_lp - ldr r12,=e____system__kFinalizerGCTemp+2 - str r12,[r9] + laol r12,e____system__kFinalizerGCTemp+2,e____system__kFinalizerGCTemp_o_2,0 + sto r12,r9,e____system__kFinalizerGCTemp_o_2,0 cmp r8,r6 bhi finalizer_no_reverse @@ -148,8 +164,8 @@ finalizer_no_reverse: b determine_free_finalizers_after_compact1 finalizer_not_used_after_compact1: - ldr r12,=e____system__kFinalizerGCTemp+2 - str r12,[r8] + laol r12,e____system__kFinalizerGCTemp+2,e____system__kFinalizerGCTemp_o_2,1 + sto r12,r8,e____system__kFinalizerGCTemp_o_2,1 str r8,[r7] add r7,r8,#4 @@ -162,36 +178,40 @@ finalizer_not_used_after_compact1: end_finalizers_after_compact1: str r8,[r7] - ldr r12,=finalizer_list - ldr r6,[r12] - ldr r12,=__Nil-4 + lao r12,finalizer_list,4 + ldo r6,r12,finalizer_list,4 + laol r12,__Nil-4,__Nil_o_m4,6 + otoa r12,__Nil_o_m4,6 cmp r6,r12 beq finalizer_list_empty tst r6,#3 bne finalizer_list_already_reversed ldr r4,[r6] - ldr r12,=finalizer_list+1 + laol r12,finalizer_list+1,finalizer_list_o_1,0 + otoa r12,finalizer_list_o_1,0 str r12,[r6] - ldr r12,=finalizer_list - str r4,[r12] + lao r12,finalizer_list,5 + sto r4,r12,finalizer_list,5 finalizer_list_already_reversed: finalizer_list_empty: .if COMPACT_MARK_WITH_STACK - ldr r9,=free_finalizer_list + lao r9,free_finalizer_list,6 + otoa r9,free_finalizer_list,6 ldr r6,[r9] - ldr r12,=__Nil-4 - cmp r6,r12 .else - ldr r8,=free_finalizer_list + lao r8,free_finalizer_list,6 + otoa r8,free_finalizer_list,6 ldr r6,[r8] - ldr r12,=__Nil-4 - cmp r6,r12 .endif + laol r12,__Nil-4,__Nil_o_m4,7 + otoa r12,__Nil_o_m4,7 + cmp r6,r12 beq free_finalizer_list_empty - ldr r6,=free_finalizer_list+4 - ldr r12,=end_vector - str r6,[r12] + laol r6,free_finalizer_list+4,free_finalizer_list_o_4,0 + otoa r6,free_finalizer_list_o_4,0 + lao r12,end_vector,15 + sto r6,r12,end_vector,15 .if COMPACT_MARK_WITH_STACK str pc,[sp,#-4]! bl rmark_stack_nodes @@ -202,17 +222,17 @@ finalizer_list_empty: free_finalizer_list_empty: .endif - ldr r12,=heap_size_33 - ldr r4,[r12] + lao r12,heap_size_33,11 + ldo r4,r12,heap_size_33,11 mov r3,r4 lsl r3,r3,#5 - ldr r12,=heap_p3 - ldr r12,[r12] + lao r12,heap_p3,13 + ldo r12,r12,heap_p3,13 add r3,r3,r12 - ldr r12,=end_heap_p3 - str r3,[r12] + lao r12,end_heap_p3,0 + sto r3,r12,end_heap_p3,0 @ end_heap_p3 in r0 mov r0,r3 @@ -221,18 +241,18 @@ free_finalizer_list_empty: @ vector_counter in r2 mov r2,r4 - ldr r12,=heap_vector - ldr r6,[r12] + lao r12,heap_vector,9 + ldo r6,r12,heap_vector,9 @ vector_p in r1 mov r1,r6 mov r12,#-4 rsb r3,r6,r12 - ldr r12,=neg_heap_vector_plus_4 - str r3,[r12] + lao r12,neg_heap_vector_plus_4,0 + sto r3,r12,neg_heap_vector_plus_4,0 - ldr r12,=heap_p3 - ldr r10,[r12] + lao r12,heap_p3,14 + ldo r10,r12,heap_p3,14 mov r9,#0 @ heap_p3 in r11 mov r11,r10 @@ -248,8 +268,8 @@ skip_zeros: beq skip_zeros @ a2: free end_skip_zeros: - ldr r12,=neg_heap_vector_plus_4 - ldr r8,[r12] + lao r12,neg_heap_vector_plus_4,1 + ldo r8,r12,neg_heap_vector_plus_4,1 add r8,r8,r1 add r8,r11,r8,lsl #5 @@ -298,8 +318,8 @@ end_list_2: copy_record_arguments_all_b: str r3,[sp,#-4]! - ldr r12,=heap_vector - ldr r3,[r12] + lao r12,heap_vector,10 + ldo r3,r12,heap_vector,10 update_up_list_1r: mov r7,r4 @@ -341,8 +361,8 @@ copy_argument_part_1r: sub r2,r2,#1 ldr r9,[r1],#4 - ldr r12,=neg_heap_vector_plus_4 - ldr r8,[r12] + lao r12,neg_heap_vector_plus_4,2 + ldo r8,r12,neg_heap_vector_plus_4,2 add r8,r8,r1 add r8,r11,r8,lsl #5 @@ -364,9 +384,9 @@ copy_b_record_argument_part_arguments: b find_non_zero_long copy_record_arguments_aa: - ldr r12,=256+2 + mov r12,#(256+2)/2 sub r3,r3,r7 - sub r3,r3,r12 + sub r3,r3,r12,lsl #1 str r3,[sp,#-4]! str r7,[sp,#-4]! @@ -610,8 +630,8 @@ move_hnf_1_: b find_non_zero_long move_record: - ldr r12,=258 - subs r3,r3,r12 + mov r12,#258/2 + subs r3,r3,r12,lsl #1 blo move_record_1 beq move_record_2 @@ -647,8 +667,8 @@ move_record_3_1b: str r8,[sp,#-4]! sub r4,r7,r11 - ldr r12,=heap_vector - ldr r3,[r12] + lao r12,heap_vector,11 + ldo r3,r12,heap_vector,11 add r4,r4,#4 and r8,r4,#31*4 lsr r4,r4,#7 @@ -773,10 +793,12 @@ copy_normal_hnf_0: b find_non_zero_long move_hnf_0: - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,13 + otoa r12,INT_o_2,13 cmp r4,r12 blo move_real_file_string_or_array - ldr r12,=CHAR+2 + laol r12,CHAR+2,CHAR_o_2,8 + otoa r12,CHAR_o_2,8 cmp r4,r12 bls move_int_bool_or_char .ifdef DLL @@ -788,7 +810,8 @@ move_normal_hnf_0: b find_non_zero_long move_real_file_string_or_array: - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,10 + otoa r12,__STRING___o_2,10 cmp r4,r12 bhi move_real_or_file bne move_array @@ -809,7 +832,8 @@ cp_s_arg_lp3: move_array: .ifdef DLL - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,2 + otoa r12,__ARRAY___o_2,2 cmp r4,r12 blo move_normal_hnf_0 .endif @@ -822,8 +846,8 @@ skip_zeros_a: cmp r9,#0 beq skip_zeros_a - ldr r12,=neg_heap_vector_plus_4 - ldr r8,[r12] + lao r12,neg_heap_vector_plus_4,3 + ldo r8,r12,neg_heap_vector_plus_4,3 add r8,r8,r1 add r8,r11,r8,lsl #5 @@ -858,11 +882,13 @@ move_b_array: move_strict_basic_array: mov r4,r7 - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,14 + otoa r12,INT_o_2,14 cmp r3,r12 beq cp_s_arg_lp3 - ldr r12,=BOOL+2 + laol r12,BOOL+2,BOOL_o_2,7 + otoa r12,BOOL_o_2,7 cmp r3,r12 beq move_bool_array @@ -1118,20 +1144,66 @@ move_closure_with_unboxed_arguments_1: bne bsf_and_copy_nodes b find_non_zero_long +.ifdef PIC + .ifdef FINALIZERS + lto finalizer_list,3 + lto free_finalizer_list,5 + ltol __Nil-4,__Nil_o_m4,5 + lto heap_p3,12 + ltol e____system__kFinalizerGCTemp+2,e____system__kFinalizerGCTemp_o_2,0 + ltol e____system__kFinalizerGCTemp+2,e____system__kFinalizerGCTemp_o_2,1 + lto finalizer_list,4 + ltol __Nil-4,__Nil_o_m4,6 + ltol finalizer_list+1,finalizer_list_o_1,0 + lto finalizer_list,5 + lto free_finalizer_list,6 + ltol __Nil-4,__Nil_o_m4,7 + ltol free_finalizer_list+4,free_finalizer_list_o_4,0 + lto end_vector,15 + .endif + lto heap_size_33,11 + lto heap_p3,13 + lto end_heap_p3,0 + lto heap_vector,9 + lto neg_heap_vector_plus_4,0 + lto heap_p3,14 + lto neg_heap_vector_plus_4,1 + lto heap_vector,10 + lto neg_heap_vector_plus_4,2 + lto heap_vector,11 + lto neg_heap_vector_plus_4,3 + ltol INT+2,INT_o_2,13 + ltol CHAR+2,CHAR_o_2,8 + ltol __STRING__+2,__STRING___o_2,10 + ltol INT+2,INT_o_2,14 + ltol BOOL+2,BOOL_o_2,7 + .ifdef DLL + laol __ARRAY__+2,__ARRAY___o_2,2 + .endif +.endif .ltorg +.ifdef PIC + .ifdef FINALIZERS + lto finalizer_list,6 + ltol __Nil-4,__Nil_o_m4,8 + ltol e____system__kFinalizer+2,e____system__kFinalizer_o_2,0 + .endif +.endif end_copy: .ifdef FINALIZERS - ldr r12,=finalizer_list - ldr r6,[r12] + lao r12,finalizer_list,6 + ldo r6,r12,finalizer_list,6 restore_finalizer_descriptors: - ldr r12,=__Nil-4 + laol r12,__Nil-4,__Nil_o_m4,8 + otoa r12,__Nil_o_m4,8 cmp r6,r12 beq end_restore_finalizer_descriptors - ldr r12,=e____system__kFinalizer+2 + laol r12,e____system__kFinalizer+2,e____system__kFinalizer_o_2,0 + otoa r12,e____system__kFinalizer_o_2,0 str r12,[r6] ldr r6,[r6,#4] b restore_finalizer_descriptors diff --git a/armcompact_rmark.s b/armcompact_rmark.s index f9be19a..251d503 100644 --- a/armcompact_rmark.s +++ b/armcompact_rmark.s @@ -10,8 +10,8 @@ rmark_stack_nodes1: rmark_next_stack_node: add r9,r9,#4 rmark_stack_nodes: - ldr r12,=end_vector - ldr r12,[r12] + lao r12,end_vector,16 + ldo r12,r12,end_vector,16 cmp r9,r12 beq end_rmark_nodes @@ -39,8 +39,8 @@ rmark_more_stack_nodes: bl rmark_stack_node add r9,r9,#4 - ldr r12,=end_vector - ldr r12,[r12] + lao r12,end_vector,17 + ldo r12,r12,end_vector,17 cmp r9,r12 bne rmark_more_stack_nodes ldr pc,[sp],#4 @@ -193,8 +193,8 @@ rmark_shared_argument_part: b rmark_hnf_1 rmark_record: - ldr r12,=258 - subs r8,r8,r12 + mov r12,#258/2 + subs r8,r8,r12,lsl #1 beq rmark_record_2 blo rmark_record_1 @@ -429,18 +429,26 @@ rmark_large_tuple_or_record: str r6,[sp,#-4]! +.ifdef PIC + add r12,r4,#-8+4 +.endif ldr r4,[r4,#-8] and r6,r3,#31*4 lsr r3,r3,#7 lsr r6,r6,#2 +.ifdef PIC + ldrh r4,[r12,r4] +.endif mov r12,#1 lsl r6,r12,r6 ldr r12,[r10,r3,lsl #2] bic r12,r12,r6 str r12,[r10,r3,lsl #2] +.ifndef PIC ldrh r4,[r4,#4] +.endif mov r3,r1 cmp r4,#8 @@ -451,7 +459,8 @@ rmark_large_tuple_or_record: ldr r6,[r7,r6] ldr r7,[sp],#4 str r6,[r9] - ldr r12,=__indirection + lao r12,__indirection,17 + otoa r12,__indirection,17 str r12,[r7,#-4] str r6,[r7] b rmark_node_d1 @@ -460,7 +469,8 @@ rmark_tuple_selector_node_2: ldr r6,[r7] ldr r7,[sp],#4 str r6,[r9] - ldr r12,=__indirection + lao r12,__indirection,18 + otoa r12,__indirection,18 str r12,[r7,#-4] str r6,[r7] b rmark_node_d1 @@ -481,8 +491,8 @@ rmark_record_selector_node_1: beq rmark_hnf_1 ldrh r12,[r3,#-2] - ldr r3,=258 - cmp r12,r3 + mov r3,#258/2 + cmp r12,r3,lsl #1 bls rmark_small_tuple_or_record ldr r3,[r7,#8] @@ -503,18 +513,26 @@ rmark_small_tuple_or_record: str r6,[sp,#-4]! +.ifdef PIC + add r12,r4,#-8+4 +.endif ldr r4,[r4,#-8] and r6,r3,#31*4 lsr r3,r3,#7 lsr r6,r6,#2 +.ifdef PIC + ldrh r4,[r12,r4] +.endif mov r12,#1 lsl r6,r12,r6 ldr r12,[r10,r3,lsl #2] bic r12,r12,r6 str r12,[r10,r3,lsl #2] +.ifndef PIC ldrh r4,[r4,#4] +.endif mov r3,r1 cmp r4,#8 @@ -525,7 +543,8 @@ rmark_tuple_or_record_selector_node_2: ldr r6,[r7,r4] ldr r7,[sp],#4 str r6,[r9] - ldr r12,=__indirection + lao r12,__indirection,19 + otoa r12,__indirection,19 str r12,[r7,#-4] str r6,[r7] b rmark_node_d1 @@ -544,8 +563,8 @@ rmark_strict_record_selector_node_1: beq rmark_hnf_1 ldrh r12,[r3,#-2] - ldr r3,=258 - cmp r12,r3 + mov r3,#258/2 + cmp r12,r3,lsl #1 bls rmark_select_from_small_record ldr r3,[r7,#8] @@ -562,12 +581,19 @@ rmark_strict_record_selector_node_1: rmark_select_from_small_record: ldr r3,[r4,#-8] +.ifdef PIC + add r12,r4,#-8+4 +.endif subs r6,r6,#4 cmp r6,r1 bhi rmark_selector_pointer_not_reversed +.ifdef PIC + ldrh r4,[r3,r12]! +.else ldrh r4,[r3,#4] +.endif cmp r4,#8 ble rmark_strict_record_selector_node_2 ldr r12,[r7,#8] @@ -579,27 +605,38 @@ rmark_strict_record_selector_node_2: rmark_strict_record_selector_node_3: str r4,[r6,#4] +.ifdef PIC + ldrh r4,[r3,#6-4] +.else ldrh r4,[r3,#6] +.endif 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 + sub r4,r4,#12 rmark_strict_record_selector_node_4: ldr r4,[r7,r4] str r4,[r6,#8] rmark_strict_record_selector_node_5: +.ifdef PIC + ldr r4,[r3,#-4-4] +.else ldr r4,[r3,#-4] - +.endif add r9,r9,#1 str r9,[r6] str r4,[r9,#-1] b rmark_next_node rmark_selector_pointer_not_reversed: +.ifdef PIC + ldrh r4,[r3,r12]! +.else ldrh r4,[r3,#4] +.endif cmp r4,#8 ble rmark_strict_record_selector_node_6 ldr r12,[r7,#8] @@ -611,7 +648,11 @@ rmark_strict_record_selector_node_6: rmark_strict_record_selector_node_7: str r4,[r6,#4] +.ifdef PIC + ldrh r4,[r3,#6-4] +.else ldrh r4,[r3,#6] +.endif tst r4,r4 beq rmark_strict_record_selector_node_9 cmp r4,#8 @@ -623,7 +664,11 @@ rmark_strict_record_selector_node_8: str r4,[r6,#8] rmark_strict_record_selector_node_9: +.ifdef PIC + ldr r4,[r3,#-4-4] +.else ldr r4,[r3,#-4] +.endif str r4,[r6] b rmark_next_node @@ -695,11 +740,13 @@ rmark_closure_with_unboxed_arguments: b rmark_next_node rmark_hnf_0: - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,11 + otoa r12,INT_o_2,11 cmp r4,r12 beq rmark_int_3 - ldr r12,=CHAR+2 + laol r12,CHAR+2,CHAR_o_2,6 + otoa r12,CHAR_o_2,6 cmp r4,r12 beq rmark_char_3 @@ -728,7 +775,8 @@ rmark_int_3: cmp r8,#33 bcs rmark_next_node - ldr r12,=small_integers + lao r12,small_integers,3 + otoa r12,small_integers,3 add r7,r12,r8,lsl #3 str r7,[r9] sub r8,r6,r11 @@ -750,7 +798,8 @@ rmark_int_3: rmark_char_3: ldrb r7,[r6,#4] - ldr r12,=static_characters + lao r12,static_characters,3 + otoa r12,static_characters,3 add r7,r12,r7,lsl #3 sub r8,r6,r11 @@ -771,7 +820,8 @@ rmark_char_3: b rmark_next_node rmark_no_normal_hnf_0: - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,17 + otoa r12,__ARRAY___o_2,17 cmp r4,r12 bne rmark_next_node @@ -944,4 +994,16 @@ rmark_array_length_0_1: add r6,r6,#4 b rmark_hnf_1 +.ifdef PIC + lto end_vector,16 + lto end_vector,17 + lto __indirection,17 + lto __indirection,18 + lto __indirection,19 + ltol INT+2,INT_o_2,11 + ltol CHAR+2,CHAR_o_2,6 + lto small_integers,3 + lto static_characters,3 + ltol __ARRAY__+2,__ARRAY___o_2,17 +.endif .ltorg diff --git a/armcompact_rmarkr.s b/armcompact_rmarkr.s index 5821d66..05e9959 100644 --- a/armcompact_rmarkr.s +++ b/armcompact_rmarkr.s @@ -26,7 +26,8 @@ rmark_array_using_reversal: cmp r6,r3 bhi rmark_no_undo_reverse_2 str r6,[r9] - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,18 + otoa r12,__ARRAY___o_2,18 str r12,[r6] rmark_no_undo_reverse_2: mov r9,#1 @@ -43,10 +44,8 @@ rmarkr_hnf_2: 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 @@ -124,8 +123,8 @@ rmarkr_shared_argument_part: b rmarkr_hnf_1 rmarkr_record: - ldr r12,=258 - subs r8,r8,r12 + mov r12,#258/2 + subs r8,r8,r12,lsl #1 beq rmarkr_record_2 blo rmarkr_record_1 @@ -290,7 +289,6 @@ 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 @@ -299,10 +297,7 @@ rmarkr_indirection_node: 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 @@ -356,18 +351,26 @@ rmarkr_large_tuple_or_record: str r6,[sp,#-4]! +.ifdef PIC + add r12,r4,#-8+4 +.endif ldr r4,[r4,#-8] and r6,r3,#31*4 lsr r3,r3,#7 - lsr r12,r6,#2 - mov r6,#1 - lsl r6,r6,r12 + lsr r6,r6,#2 +.ifdef PIC + ldrh r4,[r12,r4] +.endif + mov r12,#1 + lsl r6,r12,r6 ldr r12,[r10,r3,lsl #2] bic r12,r12,r6 str r12,[r10,r3,lsl #2] +.ifndef PIC ldrh r4,[r4,#4] +.endif cmp r4,#8 blt rmarkr_tuple_or_record_selector_node_2 ldr r7,[r7,#8] @@ -375,7 +378,8 @@ rmarkr_large_tuple_or_record: add r12,r4,#-12 ldr r6,[r7,r12] ldr r7,[sp],#4 - ldr r12,=__indirection + lao r12,__indirection,20 + otoa r12,__indirection,20 str r12,[r7,#-4] str r6,[r7] b rmarkr_node @@ -383,7 +387,8 @@ rmarkr_large_tuple_or_record: rmarkr_tuple_selector_node_2: ldr r6,[r7] ldr r7,[sp],#4 - ldr r12,=__indirection + lao r12,__indirection,21 + otoa r12,__indirection,21 str r12,[r7,#-4] str r6,[r7] b rmarkr_node @@ -406,8 +411,8 @@ rmarkr_record_selector_node_1: beq rmarkr_hnf_1 ldrh r12,[r3,#-2] - ldr r3,=258 - cmp r12,r3 + mov r3,#258/2 + cmp r12,r3,lsl #1 bls rmarkr_small_tuple_or_record ldr r3,[r7,#8] @@ -429,27 +434,35 @@ rmarkr_small_tuple_or_record: sub r3,r12,r11 str r6,[sp,#-4]! - +.ifdef PIC + add r12,r4,#-8+4 +.endif ldr r4,[r4,#-8] and r6,r3,#31*4 lsr r3,r3,#7 - lsr r12,r6,#2 - mov r6,#1 - lsl r6,r6,r12 + lsr r6,r6,#2 +.ifdef PIC + ldrh r4,[r12,r4] +.endif + mov r12,#1 + lsl r6,r12,r6 ldr r12,[r10,r3,lsl #2] bic r12,r12,r6 str r12,[r10,r3,lsl #2] +.ifndef PIC ldrh r4,[r4,#4] +.endif cmp r4,#8 ble rmarkr_tuple_or_record_selector_node_2 ldr r7,[r7,#8] - subs r4,r4,#12 + sub r4,r4,#12 rmarkr_tuple_or_record_selector_node_2: ldr r6,[r7,r4] ldr r7,[sp],#4 - ldr r12,=__indirection + lao r12,__indirection,22 + otoa r12,__indirection,22 str r12,[r7,#-4] str r6,[r7] b rmarkr_node @@ -470,8 +483,8 @@ rmarkr_strict_record_selector_node_1: beq rmarkr_hnf_1 ldrh r12,[r3,#-2] - ldr r3,=258 - cmp r12,r3 + mov r3,#258/2 + cmp r12,r3,lsl #1 bls rmarkr_select_from_small_record ldr r3,[r7,#8] @@ -489,10 +502,19 @@ rmarkr_strict_record_selector_node_1: bne rmarkr_hnf_1 rmarkr_select_from_small_record: +.ifdef PIC + ldr r12,[r4,#-8] + add r4,r4,#-8+4 +.else ldr r4,[r4,#-8] - subs r6,r6,#4 +.endif + sub r6,r6,#4 +.ifdef PIC + ldrh r3,[r4,r12]! +.else ldrh r3,[r4,#4] +.endif cmp r3,#8 ble rmarkr_strict_record_selector_node_2 ldr r12,[r7,#8] @@ -504,7 +526,11 @@ rmarkr_strict_record_selector_node_2: rmarkr_strict_record_selector_node_3: str r3,[r6,#4] +.ifdef PIC + ldrh r3,[r4,#6-4] +.else ldrh r3,[r4,#6] +.endif tst r3,r3 beq rmarkr_strict_record_selector_node_5 cmp r3,#8 @@ -516,7 +542,11 @@ rmarkr_strict_record_selector_node_4: str r3,[r6,#8] rmarkr_strict_record_selector_node_5: +.ifdef PIC + ldr r4,[r4,#-4-4] +.else ldr r4,[r4,#-4] +.endif str r4,[r6] b rmarkr_next_node @@ -598,19 +628,20 @@ rmarkr_closure_with_unboxed_arguments: b rmarkr_next_node rmarkr_hnf_0: -.ifdef SHARE_CHAR_INT - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,12 + otoa r12,INT_o_2,12 cmp r4,r12 beq rmarkr_int_3 - ldr r12,=CHAR+2 + laol r12,CHAR+2,CHAR_o_2,7 + otoa r12,CHAR_o_2,7 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 @@ -619,10 +650,7 @@ rmarkr_hnf_0: 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 @@ -633,7 +661,6 @@ rmarkr_int_3: sub r3,r6,r11 -.ifdef NO_BIT_INSTRUCTIONS and r6,r3,#31*4 lsr r3,r3,#7 lsr r12,r6,#2 @@ -642,11 +669,9 @@ rmarkr_int_3: 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 + + lao r12,small_integers,4 + otoa r12,small_integers,4 add r6,r12,r8,lsl #3 b rmarkr_next_node_after_static @@ -654,7 +679,6 @@ 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 @@ -663,19 +687,15 @@ rmarkr_char_3: 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 + lao r12,static_characters,4 + otoa r12,static_characters,4 add r6,r12,r4,lsl #3 b rmarkr_next_node_after_static rmarkr_no_normal_hnf_0: -.endif - - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,19 + otoa r12,__ARRAY___o_2,19 cmp r4,r12 bne rmarkr_next_node @@ -900,7 +920,6 @@ rmarkr_skip_pointer_list1: 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 @@ -976,7 +995,6 @@ 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] @@ -1012,4 +1030,15 @@ rmarkr_next_stack_node: b rmark_next_node_ +.ifdef PIC + ltol __ARRAY__+2,__ARRAY___o_2,18 + lto __indirection,20 + lto __indirection,21 + lto __indirection,22 + ltol INT+2,INT_o_2,12 + ltol CHAR+2,CHAR_o_2,7 + lto small_integers,4 + lto static_characters,4 + ltol __ARRAY__+2,__ARRAY___o_2,19 +.endif .ltorg diff --git a/armcopy.s b/armcopy.s index 3706e06..39fe41f 100644 --- a/armcopy.s +++ b/armcopy.s @@ -4,31 +4,34 @@ COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP = 1 str r9,[sp,#-4]! - ldr r12,=heap_p2 - ldr r10,[r12] + lao r12,heap_p2,9 + ldo r10,r12,heap_p2,9 - ldr r12,=heap_size_129 - ldr r4,[r12] + lao r12,heap_size_129,4 + ldo r4,r12,heap_size_129,4 lsl r4,r4,#6 - ldr r12,=semi_space_size - str r4,[r12] + lao r12,semi_space_size,0 + sto r4,r12,semi_space_size,0 + add r9,r10,r4 @ r0 = INT+2 - ldr r0,=INT+2 @ r1 = CHAR+2 - ldr r1,=CHAR+2 + laol r0,INT+2,INT_o_2,6 + laol r1,CHAR+2,CHAR_o_2,2 + otoa r0,INT_o_2,6 + otoa r1,CHAR_o_2,2 .if WRITE_HEAP - ldr r12,=heap2_begin_and_end - str r9,[r12,#4] + laol r12,heap2_begin_and_end+4,heap2_begin_and_end_o_4,0 + sto r9,r12,heap2_begin_and_end_o_4,0 .endif sub sp,sp,#16 - ldr r12,=caf_list - ldr r4,[r12] + lao r12,caf_list,0 + ldo r4,r12,caf_list,0 tst r4,r4 beq end_copy_cafs @@ -47,8 +50,8 @@ copy_cafs_lp: end_copy_cafs: ldr r3,[sp,#16] - ldr r12,=stack_p - ldr r8,[r12] + lao r12,stack_p,4 + ldo r8,r12,stack_p,4 sub r3,r3,r8 lsr r3,r3,#2 @@ -57,19 +60,21 @@ end_copy_cafs: mov r2,#-2 bl copy_lp2 end_copy0: - ldr r12,=heap_p2 - ldr r8,[r12] + lao r12,heap_p2,10 + ldo r8,r12,heap_p2,10 bl copy_lp1 add sp,sp,#16 - ldr r12,=heap_end_after_gc - str r9,[r12] + lao r12,heap_end_after_gc,10 + sto r9,r12,heap_end_after_gc,10 .ifdef FINALIZERS - ldr r6,=finalizer_list - ldr r7,=free_finalizer_list + lao r6,finalizer_list,1 + lao r7,free_finalizer_list,3 + otoa r6,finalizer_list,1 + otoa r7,free_finalizer_list,3 ldr r8,[r6] determine_free_finalizers_after_copy: @@ -84,7 +89,8 @@ determine_free_finalizers_after_copy: b determine_free_finalizers_after_copy finalizer_not_used_after_copy: - ldr r12,=__Nil-4 + laol r12,__Nil-4,__Nil_o_m4,3 + otoa r12,__Nil_o_m4,3 cmp r8,r12 beq end_finalizers_after_copy @@ -100,8 +106,28 @@ end_finalizers_after_copy: b skip_copy_gc +.ifdef PIC + lto heap_p2,9 + lto heap_size_129,4 + lto semi_space_size,0 + ltol INT+2,INT_o_2,6 + ltol CHAR+2,CHAR_o_2,2 + .if WRITE_HEAP + ltol heap2_begin_and_end+4,heap2_begin_and_end_o_4,0 + .endif + lto caf_list,0 + lto stack_p,4 + lto heap_p2,10 + lto heap_end_after_gc,10 + .ifdef FINALIZERS + lto finalizer_list,1 + lto free_finalizer_list,3 + ltol __Nil-4,__Nil_o_m4,3 + .endif +.endif .ltorg + @ @ Copy nodes to the other semi-space @ @@ -224,9 +250,11 @@ copy_int_2: cmp r4,#33 bhs no_small_int_or_char_2 - ldr r12,=small_integers - add r4,r12,r4,lsl #3 + lao r12,small_integers,1 subs r3,r3,#1 + otoa r12,small_integers,1 + + add r4,r12,r4,lsl #3 str r4,[r5] bne copy_lp2 @@ -237,9 +265,11 @@ copy_int_2: copy_char_2: and r4,r4,#255 - ldr r12,=static_characters - add r4,r12,r4,lsl #3 + lao r12,static_characters,1 subs r3,r3,#1 + otoa r12,static_characters,1 + + add r4,r12,r4,lsl #3 str r4,[r5] bne copy_lp2 @@ -273,7 +303,8 @@ copy_normal_hnf_0_2: b copy_lp1 copy_real_file_or_string_2: - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,7 + otoa r12,__STRING___o_2,7 cmp r6,r12 bls copy_string_or_array_2 @@ -423,12 +454,12 @@ copy_record_node2_3_ab: str r4,[sp,#-4]! add r4,r10,#1 - ldr r12,=heap_p1 + lao r12,heap_p1,9 str r4,[r7] ldr r4,[r7,#8] - ldr r12,[r12] + ldo r12,r12,heap_p1,9 str r6,[r10] ldr r7,[r7,#4] @@ -436,7 +467,7 @@ copy_record_node2_3_ab: mov r6,r4 sub r4,r4,r12 - ldr r12,=heap_copied_vector + lao r12,heap_copied_vector,4 str r7,[r10,#4] @@ -445,7 +476,7 @@ copy_record_node2_3_ab: and r4,r4,#31 - ldr r12,[r12] + ldo r12,r12,heap_copied_vector,4 and r7,r7,#-4 str r10,[r5] @@ -481,12 +512,12 @@ copy_record_node2_3_b: str r4,[sp,#-4]! add r4,r9,#-12+1 - ldr r12,=heap_p1 + lao r12,heap_p1,10 str r4,[r7] ldr r4,[r7,#8] - ldr r12,[r12] + ldo r12,r12,heap_p1,10 str r6,[r9,#-12] ldr r7,[r7,#4] @@ -494,7 +525,7 @@ copy_record_node2_3_b: mov r6,r4 sub r4,r4,r12 - ldr r12,=heap_copied_vector + lao r12,heap_copied_vector,5 str r7,[r9,#-8] @@ -504,7 +535,7 @@ copy_record_node2_3_b: and r4,r4,#31 - ldr r12,[r12] + ldo r12,r12,heap_copied_vector,5 and r7,r7,#-4 str r9,[r5] @@ -684,10 +715,17 @@ copy_selector_2: tst r12,#1 bne copy_arity_1_node2__ +.ifdef PIC + add r11,r6,#-8+4 +.endif ldr r6,[r6,#-8] - + lao r12,__indirection,8 +.ifdef PIC + ldrh r6,[r11,r6] +.else ldrh r6,[r6,#4] - ldr r12,=__indirection +.endif + otoa r12,__indirection,8 str r12,[r7] cmp r6,#8 @@ -716,11 +754,19 @@ copy_selector_2_2: b continue_after_selector_2 copy_selector_2_: +.ifdef PIC + add r11,r6,#-8+4 +.endif ldr r6,[r6,#-8] ldr r3,[sp],#4 + lao r12,__indirection,9 +.ifdef PIC + ldrh r6,[r11,r6] +.else ldrh r6,[r6,#4] - ldr r12,=__indirection +.endif + otoa r12,__indirection,9 str r12,[r7] ldr r6,[r4,r6] @@ -746,23 +792,23 @@ copy_record_selector_2: cmp r12,#2 bhs copy_selector_2__ - ldr r12,=heap_p1 + lao r12,heap_p1,11 ldr r4,[r7,#4] str r7,[sp,#-4]! - ldr r12,[r12] + ldo r12,r12,heap_p1,11 ldr r4,[r4,#8] sub r4,r4,r12 - ldr r12,=heap_copied_vector + lao r12,heap_copied_vector,6 lsr r7,r4,#6 lsr r4,r4,#3 - ldr r12,[r12] + ldo r12,r12,heap_copied_vector,6 and r7,r7,#-4 and r4,r4,#31 @@ -784,12 +830,20 @@ copy_selector_2__: tst r12,#1 bne copy_arity_1_node2_ copy_record_selector_2_: +.ifdef PIC + add r11,r6,#-8+4 +.endif ldr r4,[r6,#-8] + lao r12,__indirection,10 ldr r6,[r7,#4] - ldr r12,=__indirection + otoa r12,__indirection,10 str r12,[r7] +.ifdef PIC + ldrh r4,[r11,r4] +.else ldrh r4,[r4,#4] +.endif cmp r4,#8 ble copy_record_selector_3 ldr r6,[r6,#8] @@ -824,23 +878,23 @@ copy_strict_record_selector_2: b copy_strict_record_selector_2_ copy_strict_record_selector_2_b: - ldr r12,=heap_p1 + lao r12,heap_p1,12 ldr r4,[r7,#4] str r7,[sp,#-4]! - ldr r12,[r12] + ldo r12,r12,heap_p1,12 ldr r4,[r4,#8] sub r4,r4,r12 - ldr r12,=heap_copied_vector + lao r12,heap_copied_vector,7 lsr r7,r4,#6 lsr r4,r4,#3 - ldr r12,[r12] + ldo r12,r12,heap_copied_vector,7 and r7,r7,#-4 and r4,r4,#31 @@ -857,12 +911,19 @@ copy_strict_record_selector_2_b: bne copy_arity_1_node2_ copy_strict_record_selector_2_: +.ifdef PIC + add r11,r6,#-8+4 +.endif ldr r4,[r6,#-8] str r3,[sp,#-4]! ldr r6,[r7,#4] +.ifdef PIC + ldrh r3,[r4,r11]! +.else ldrh r3,[r4,#4] +.endif cmp r3,#8 ble copy_strict_record_selector_3 ldr r12,[r6,#8] @@ -874,7 +935,11 @@ copy_strict_record_selector_3: copy_strict_record_selector_4: str r3,[r7,#4] +.ifdef PIC + ldrh r3,[r4,#6-4] +.else ldrh r3,[r4,#6] +.endif tst r3,r3 beq copy_strict_record_selector_6 cmp r3,#8 @@ -886,7 +951,11 @@ copy_strict_record_selector_5: str r3,[r7,#8] copy_strict_record_selector_6: +.ifdef PIC + ldr r6,[r4,#-4-4] +.else ldr r6,[r4,#-4] +.endif str r6,[r7] ldr r3,[sp],#4 tst r6,#2 @@ -910,7 +979,8 @@ copy_arity_0_node2_: copy_string_or_array_2: .ifdef DLL beq copy_string_2 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,15 + otoa r12,__ARRAY___o_2,15 cmp r6,r12 blo copy_normal_hnf_0_2 mov r6,r7 @@ -921,12 +991,12 @@ copy_string_2: mov r6,r7 bne copy_array_2 .endif - ldr r12,=heap_p1 - ldr r12,[r12] + lao r12,heap_p1,13 + ldo r12,r12,heap_p1,13 sub r7,r7,r12 - ldr r12,=semi_space_size - ldr r12,[r12] + lao r12,semi_space_size,1 + ldo r12,r12,semi_space_size,1 cmp r7,r12 bhs copy_string_or_array_constant @@ -965,12 +1035,12 @@ cp_s_arg_lp2: b copy_lp1 copy_array_2: - ldr r12,=heap_p1 - ldr r12,[r12] + lao r12,heap_p1,14 + ldo r12,r12,heap_p1,14 sub r7,r7,r12 - ldr r12,=semi_space_size - ldr r12,[r12] + lao r12,semi_space_size,2 + ldo r12,r12,semi_space_size,2 cmp r7,r12 bhs copy_string_or_array_constant @@ -1016,7 +1086,8 @@ copy_strict_basic_array_2: cmp r4,r0 @ INT+2 beq copy_int_array_2 - ldr r12,=BOOL+2 + laol r12,BOOL+2,BOOL_o_2,4 + otoa r12,BOOL_o_2,4 cmp r4,r12 beq copy_bool_array_2 @@ -1230,6 +1301,31 @@ copy_array_21_lp_ab_next: b copy_lp1 +.ifdef PIC + lto small_integers,1 + lto static_characters,1 + ltol __STRING__+2,__STRING___o_2,7 + lto heap_p1,9 + lto heap_copied_vector,4 + lto heap_p1,10 + lto heap_copied_vector,5 + lto __indirection,8 + lto __indirection,9 + lto heap_p1,11 + lto heap_copied_vector,6 + lto __indirection,10 + lto heap_p1,12 + lto heap_copied_vector,7 + .ifdef DLL + ltol __ARRAY__+2,__ARRAY___o_2,15 + .endif + lto heap_p1,13 + lto semi_space_size,1 + lto heap_p1,14 + lto semi_space_size,2 + ltol BOOL+2,BOOL_o_2,4 +.endif + .ltorg skip_copy_gc: diff --git a/armfileIO3.s b/armfileIO3.s index ca59153..32e4407 100644 --- a/armfileIO3.s +++ b/armfileIO3.s @@ -1,6 +1,8 @@ .fpu vfp3 + .include "armmacros.s" + .data .p2align 3 @@ -237,8 +239,8 @@ readFS: subs r1,r5,r12,lsr #2 blo readFS_gc readFS_r_gc: - - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,0 + otoa r12,__STRING___o_2,0 str r12,[r10] add r1,r10,#4 str r4,[r10,#4] @@ -300,7 +302,8 @@ readFString: ldr pc,[sp],#4 readFString_error: - ldr r8,=freadstring_error + lao r8,freadstring_error,0 + otoa r8,freadstring_error,0 b print_error @ .d 0 2 f @@ -312,7 +315,8 @@ readLineF: blo readLineF_gc readLineF_r_gc: - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,1 + otoa r12,__STRING___o_2,1 add r2,r10,#8 str r12,[r10] lsl r1,r5,#2 @@ -348,7 +352,8 @@ readLineF_again: add r5,r5,r4,lsr #2 - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,2 + otoa r12,__STRING___o_2,2 mov r6,r10 add r1,r10,r5,lsl #2 str r12,[r10] @@ -501,7 +506,8 @@ writeFString: ldr pc,[sp],#4 writeFString_error: - ldr r8,=fwritestring_error + lao r8,fwritestring_error,0 + otoa r8,fwritestring_error,0 b print_error @ .d 0 2 f @@ -703,7 +709,8 @@ readSFS: blo readSFS_gc readSFS_r_gc: - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,3 + otoa r12,__STRING___o_2,3 str r12,[r10] mov r1,r4 mov r0,r2 @@ -744,7 +751,8 @@ readLineSF: blo readLineSF_gc readLineSF_r_gc: - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,4 + otoa r12,__STRING___o_2,4 add r2,r10,#8 str r12,[r10] lsl r1,r5,#2 @@ -783,7 +791,8 @@ readLineSF_again: add r5,r5,r2,lsr #2 - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,5 + otoa r12,__STRING___o_2,5 add r1,r10,r5,lsl #2 str r12,[r10] @@ -890,3 +899,14 @@ seekSF: ldr r4,[sp],#4 mov r3,r6 ldr pc,[sp],#4 + +.ifdef PIC + lto freadstring_error,0 + ltol __STRING__+2,__STRING___o_2,0 + ltol __STRING__+2,__STRING___o_2,1 + ltol __STRING__+2,__STRING___o_2,2 + lto fwritestring_error,0 + ltol __STRING__+2,__STRING___o_2,3 + ltol __STRING__+2,__STRING___o_2,4 + ltol __STRING__+2,__STRING___o_2,5 +.endif diff --git a/armmacros.s b/armmacros.s new file mode 100644 index 0000000..609d4b5 --- /dev/null +++ b/armmacros.s @@ -0,0 +1,76 @@ + +.ifdef PIC + +.macro lao r a i + ldr \r,\a\()__o\i +.endm + +.macro otoa r a i +\a\()__u\i: + add \r,\r,pc +.endm + +.macro ldo rd ra a i +\a\()__u\i: + ldr \rd,[pc,\ra] +.endm + +.macro ldosb rd ra a i +\a\()__u\i: + ldrsb \rd,[pc,\ra] +.endm + +.macro sto rd ra a i +\a\()__u\i: + str \rd,[pc,\ra] +.endm + +.macro stob rd ra a i +\a\()__u\i: + strb \rd,[pc,\ra] +.endm + +.macro lto a i +\a\()__o\i: + .long \a\()-(\a\()__u\i\()+8) +.endm + +.macro laol r a l i + ldr \r,\l\()__o\i +.endm + +.macro ltol a l i +\l\()__o\i: + .long \a\()-(\l\()__u\i\()+8) +.endm + +.else + +.macro lao r a i + ldr \r,=\a +.endm + +.macro otoa r a i +.endm + +.macro ldo rd ra a i + ldr \rd,[\ra] +.endm + +.macro ldosb rd ra a i + ldrsb \rd,[\ra] +.endm + +.macro sto rd ra a i + str \rd,[\ra] +.endm + +.macro stob rd ra a i + strb \rd,[\ra] +.endm + +.macro laol r a l i + ldr \r,=\a +.endm + +.endif diff --git a/armmark.s b/armmark.s index 24304e2..f501b61 100644 --- a/armmark.s +++ b/armmark.s @@ -6,14 +6,14 @@ ZERO_ARITY_DESCRIPTOR_OFFSET = -4 #undef COMPARE_HEAP_AFTER_MARK #undef DEBUG_MARK_COLLECT - ldr r12,=heap_size_33 - ldr r4,[r12] + lao r12,heap_size_33,6 + ldo r4,r12,heap_size_33,6 mov r3,#0 @ heap_p3 in r0 - ldr r12,=heap_p3 - ldr r0,[r12] + lao r12,heap_p3,9 + ldo r0,r12,heap_p3,9 @ n_marked_words in r2 @@ -21,21 +21,21 @@ ZERO_ARITY_DESCRIPTOR_OFFSET = -4 lsl r1,r4,#5 @ heap_size_32_33 in r1 - ldr r12,=heap_size_32_33 - str r1,[r12] + lao r12,heap_size_32_33,0 + sto r1,r12,heap_size_32_33,0 - ldr r12,=lazy_array_list - str r3,[r12] + lao r12,lazy_array_list,0 + sto r3,r12,lazy_array_list,0 add r9,sp,#-2000 - ldr r12,=caf_list - ldr r4,[r12] + lao r12,caf_list,1 + ldo r4,r12,caf_list,1 - ldr r12,=end_stack + lao r12,end_stack,0 @ end_stack in r11 mov r11,r9 - str r9,[r12] + sto r9,r12,end_stack,0 tst r4,r4 beq _end_mark_cafs @@ -48,8 +48,8 @@ _mark_cafs_lp: add r8,r4,#4 add r12,r4,#4 add r4,r12,r3,lsl #2 - ldr r12,=end_vector - str r4,[r12] + lao r12,end_vector,0 + sto r4,r12,end_vector,0 str pc,[sp,#-4]! bl _mark_stack_nodes @@ -59,25 +59,26 @@ _mark_cafs_lp: bne _mark_cafs_lp _end_mark_cafs: - ldr r12,=stack_top - ldr r9,[r12] - ldr r12,=stack_p - ldr r8,[r12] + lao r12,stack_top,2 + ldo r9,r12,stack_top,2 + lao r12,stack_p,5 + ldo r8,r12,stack_p,5 - ldr r12,=end_vector - str r9,[r12] + lao r12,end_vector,1 + sto r9,r12,end_vector,1 str pc,[sp,#-4]! bl _mark_stack_nodes - ldr r12,=lazy_array_list - ldr r6,[r12] + lao r12,lazy_array_list,1 + ldo r6,r12,lazy_array_list,1 cmp r6,#0 beq end_restore_arrays restore_arrays: ldr r3,[r6] - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,16 + otoa r12,__ARRAY___o_2,16 str r12,[r6] cmp r3,#1 @@ -172,14 +173,17 @@ restore_array_size_1: end_restore_arrays: .ifdef FINALIZERS - ldr r12,=heap_vector - ldr r10,[r12] - ldr r6,=finalizer_list - ldr r7,=free_finalizer_list + lao r12,heap_vector,7 + ldo r10,r12,heap_vector,7 + lao r6,finalizer_list,2 + lao r7,free_finalizer_list,4 + otoa r6,finalizer_list,2 + otoa r7,free_finalizer_list,4 ldr r8,[r6] determine_free_finalizers_after_mark: - ldr r12,=__Nil-4 + laol r12,__Nil-4,__Nil_o_m4,4 + otoa r12,__Nil_o_m4,4 cmp r8,r12 beq end_finalizers_after_mark @@ -218,17 +222,17 @@ end_finalizers_after_mark: ldr r2,[sp],#4 .ifdef ADJUST_HEAP_SIZE - ldr r12,=bit_vector_size - ldr r4,[r12] + lao r12,bit_vector_size,3 + ldo r4,r12,bit_vector_size,3 .else - ldr r12,=heap_size_33 - ldr r4,[r12] + lao r12,heap_size_33,7 + ldo r4,r12,heap_size_33,7 lsl r4,r4,#3 .endif .ifdef ADJUST_HEAP_SIZE - ldr r12,=n_allocated_words - ldr r10,[r12] + lao r12,n_allocated_words,7 + ldo r10,r12,n_allocated_words,7 add r10,r10,r2 lsl r10,r10,#2 @@ -237,8 +241,8 @@ end_finalizers_after_mark: str r7,[sp,#-4]! str r4,[sp,#-4]! - ldr r12,=heap_size_multiple - ldr r12,[r12] + lao r12,heap_size_multiple,3 + ldo r12,r12,heap_size_multiple,3 umull r4,r7,r12,r10 lsr r4,r4,#8 orr r4,r4,r7,lsl #32-8 @@ -252,30 +256,30 @@ end_finalizers_after_mark: beq not_largest_heap - ldr r12,=heap_size_33 - ldr r3,[r12] + lao r12,heap_size_33,8 + ldo r3,r12,heap_size_33,8 lsl r3,r3,#5 not_largest_heap: cmp r3,r9 bls no_larger_heap - ldr r12,=heap_size_33 - ldr r9,[r12] + lao r12,heap_size_33,9 + ldo r9,r12,heap_size_33,9 lsl r9,r9,#5 cmp r3,r9 bls not_larger_then_heap mov r3,r9 not_larger_then_heap: lsr r4,r3,#2 - ldr r12,=bit_vector_size - str r4,[r12] + lao r12,bit_vector_size,4 + sto r4,r12,bit_vector_size,4 no_larger_heap: .endif mov r8,r4 - ldr r12,=heap_vector - ldr r10,[r12] + lao r12,heap_vector,8 + ldo r10,r12,heap_vector,8 lsr r8,r8,#5 @@ -288,24 +292,26 @@ no_larger_heap: no_extra_word: sub r4,r4,r2 lsl r4,r4,#2 - ldr r12,=n_last_heap_free_bytes - str r4,[r12] + lao r12,n_last_heap_free_bytes,2 + sto r4,r12,n_last_heap_free_bytes,2 - ldr r12,=flags - ldr r12,[r12] + lao r12,flags,15 + ldo r12,r12,flags,15 tst r12,#2 beq _no_heap_use_message2 str r2,[sp,#-4]! - ldr r0,=marked_gc_string_1 + lao r0,marked_gc_string_1,0 + otoa r0,marked_gc_string_1,0 bl ew_print_string ldr r2,[sp] lsl r0,r2,#2 bl ew_print_int - ldr r0,=heap_use_after_gc_string_2 + lao r0,heap_use_after_gc_string_2,1 + otoa r0,heap_use_after_gc_string_2,1 bl ew_print_string ldr r2,[sp],#4 @@ -317,8 +323,8 @@ _no_heap_use_message2: bl call_finalizers .endif - ldr r12,=n_allocated_words - ldr r9,[r12] + lao r12,n_allocated_words,8 + ldo r9,r12,n_allocated_words,8 mov r3,#0 @ n_free_words_after_mark in r2 @@ -333,8 +339,8 @@ _scan_bits: subs r8,r8,#1 bne _scan_bits - ldr r12,=n_free_words_after_mark - str r2,[r12] + lao r12,n_free_words_after_mark,5 + sto r2,r12,n_free_words_after_mark,5 b _end_scan _zero_bits: @@ -343,8 +349,8 @@ _zero_bits: subs r8,r8,#1 bne _skip_zero_bits_lp1 - ldr r12,=n_free_words_after_mark - str r2,[r12] + lao r12,n_free_words_after_mark,6 + sto r2,r12,n_free_words_after_mark,6 b _end_bits _skip_zero_bits_lp: @@ -355,8 +361,8 @@ _skip_zero_bits_lp1: subs r8,r8,#1 bne _skip_zero_bits_lp - ldr r12,=n_free_words_after_mark - str r2,[r12] + lao r12,n_free_words_after_mark,7 + sto r2,r12,n_free_words_after_mark,7 cmp r4,#0 beq _end_bits @@ -376,28 +382,28 @@ _end_zero_bits: @ n_free_words_after_mark updated _found_free_memory: - ldr r12,=n_free_words_after_mark - str r2,[r12] - ldr r12,=bit_counter - str r8,[r12] - ldr r12,=bit_vector_p - str r6,[r12] + lao r12,n_free_words_after_mark,8 + sto r2,r12,n_free_words_after_mark,8 + lao r12,bit_counter,3 + sto r8,r12,bit_counter,3 + lao r12,bit_vector_p,2 + sto r6,r12,bit_vector_p,2 sub r5,r4,r9 add r3,r7,#-4 sub r3,r3,r10 lsl r3,r3,#5 - ldr r12,=heap_p3 - ldr r10,[r12] + lao r12,heap_p3,10 + ldo r10,r12,heap_p3,10 add r10,r10,r3 - ldr r12,=stack_top - ldr r9,[r12] + lao r12,stack_top,3 + ldo r9,r12,stack_top,3 add r3,r10,r4,lsl #2 - ldr r12,=heap_end_after_gc - str r3,[r12] + lao r12,heap_end_after_gc,11 + sto r3,r12,heap_end_after_gc,11 ldmia sp!,{r0-r4,pc} @@ -412,15 +418,64 @@ _end_bits2: cmp r4,r9 bhs _found_free_memory - ldr r12,=n_free_words_after_mark - str r2,[r12] + lao r12,n_free_words_after_mark,9 + sto r2,r12,n_free_words_after_mark,9 @ n_free_words_after_mark updated _end_scan: - ldr r12,=bit_counter - str r8,[r12] + lao r12,bit_counter,4 + sto r8,r12,bit_counter,4 b compact_gc +.ifdef PIC + lto heap_size_33,6 + lto heap_p3,9 + lto heap_size_32_33,0 + lto lazy_array_list,0 + lto caf_list,1 + lto end_stack,0 + lto end_vector,0 + lto stack_top,2 + lto stack_p,5 + lto end_vector,1 + lto lazy_array_list,1 + ltol __ARRAY__+2,__ARRAY___o_2,16 +.ifdef FINALIZERS + lto heap_vector,7 + lto finalizer_list,2 + lto free_finalizer_list,4 + ltol __Nil-4,__Nil_o_m4,4 +.endif +.ifdef ADJUST_HEAP_SIZE + lto bit_vector_size,3 +.else + lto heap_size_33,7 +.endif +.ifdef ADJUST_HEAP_SIZE + lto n_allocated_words,7 + lto heap_size_multiple,3 + lto heap_size_33,8 + lto heap_size_33,9 + lto bit_vector_size,4 +.endif + lto heap_vector,8 + lto n_last_heap_free_bytes,2 + lto flags,15 + lto marked_gc_string_1,0 + lto heap_use_after_gc_string_2,1 + lto n_allocated_words,8 + lto n_free_words_after_mark,5 + lto n_free_words_after_mark,6 + lto n_free_words_after_mark,7 + lto n_free_words_after_mark,8 + lto bit_counter,3 + lto bit_vector_p,2 + lto heap_p3,10 + lto stack_top,3 + lto heap_end_after_gc,11 + lto n_free_words_after_mark,9 + lto bit_counter,4 +.endif .ltorg @ a2: pointer to stack element @@ -428,8 +483,8 @@ _end_scan: @ d0,d1,a0,a1,a3: free _mark_stack_nodes: - ldr r12,=end_vector - ldr r12,[r12] + lao r12,end_vector,2 + ldo r12,r12,end_vector,2 cmp r8,r12 beq _end_mark_nodes _mark_stack_nodes_: @@ -653,12 +708,20 @@ _large_tuple_or_record: tst r8,r12 bne _mark_node3 + lao r8,__indirection,11 +.ifdef PIC + add r12,r4,#-8+4 +.endif ldr r4,[r4,#-8] - ldr r12,=__indirection - str r12,[r6,#-4] + otoa r8,__indirection,11 + str r8,[r6,#-4] mov r8,r6 +.ifdef PIC + ldrh r4,[r12,r4] +.else ldrh r4,[r4,#4] +.endif cmp r4,#8 blt _mark_tuple_selector_node_1 ldr r7,[r7,#8] @@ -674,12 +737,20 @@ _mark_tuple_selector_node_2: b _mark_node _small_tuple_or_record: + lao r8,__indirection,12 +.ifdef PIC + add r12,r4,#-8+4 +.endif ldr r4,[r4,#-8] - ldr r12,=__indirection - str r12,[r6,#-4] + otoa r8,__indirection,12 + str r8,[r6,#-4] mov r8,r6 +.ifdef PIC + ldrh r4,[r12,r4] +.else ldrh r4,[r4,#4] +.endif _mark_tuple_selector_node_1: ldr r6,[r7,r4] str r6,[r8] @@ -697,8 +768,8 @@ _mark_record_selector_node_1: beq _mark_node3 ldrh r12,[r8,#-2] - ldr r3,=258 - cmp r12,r3 + mov r3,#258/2 + cmp r12,r3,lsl #1 bls _small_tuple_or_record ldr r8,[r7,#8] @@ -713,12 +784,20 @@ _mark_record_selector_node_1: tst r8,r12 bne _mark_node3 + lao r8,__indirection,13 +.ifdef PIC + add r12,r4,#-8+4 +.endif ldr r4,[r4,#-8] - ldr r12,=__indirection - str r12,[r6,#-4] + otoa r8,__indirection,13 + str r8,[r6,#-4] mov r8,r6 +.ifdef PIC + ldrh r4,[r12,r4] +.else ldrh r4,[r4,#4] +.endif cmp r4,#8 ble _mark_record_selector_node_2 ldr r7,[r7,#8] @@ -739,8 +818,8 @@ _mark_strict_record_selector_node_1: beq _mark_node3 ldrh r12,[r8,#-2] - ldr r3,=258 - cmp r12,r3 + mov r3,#258/2 + cmp r12,r3,lsl #1 bls _select_from_small_record ldr r8,[r7,#8] @@ -756,11 +835,20 @@ _mark_strict_record_selector_node_1: bne _mark_node3 _select_from_small_record: +.ifdef PIC + ldr r12,[r4,#-8] + add r4,r4,#-8+4 +.else ldr r4,[r4,#-8] +.endif sub r6,r6,#4 +.ifdef PIC + ldrh r3,[r4,r12]! +.else ldrh r3,[r4,#4] +.endif cmp r3,#8 ble _mark_strict_record_selector_node_2 ldr r12,[r7,#8] @@ -771,8 +859,11 @@ _mark_strict_record_selector_node_2: ldr r3,[r7,r3] _mark_strict_record_selector_node_3: str r3,[r6,#4] - +.ifdef PIC + ldrh r3,[r4,#6-4] +.else ldrh r3,[r4,#6] +.endif tst r3,r3 beq _mark_strict_record_selector_node_5 cmp r3,#8 @@ -784,7 +875,11 @@ _mark_strict_record_selector_node_4: str r3,[r6,#8] _mark_strict_record_selector_node_5: +.ifdef PIC + ldr r4,[r4,#-4-4] +.else ldr r4,[r4,#-4] +.endif str r4,[r6] b _mark_next_node @@ -798,9 +893,9 @@ _mark_next_node: tst r6,r6 bne _mark_node + lao r12,end_vector,3 ldr r8,[sp],#4 - ldr r12,=end_vector - ldr r12,[r12] + ldo r12,r12,end_vector,3 cmp r8,r12 bne _mark_stack_nodes_ @@ -883,7 +978,8 @@ _mark_closure_with_one_boxed_argument: b _mark_node _mark_hnf_0: - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,7 + otoa r12,INT_o_2,7 cmp r4,r12 blo _mark_real_file_or_string @@ -891,7 +987,8 @@ _mark_hnf_0: orr r12,r12,r9 str r12,[r10,r3,lsl #2] - ldr r12,=CHAR+2 + laol r12,CHAR+2,CHAR_o_2,3 + otoa r12,CHAR_o_2,3 cmp r4,r12 bhi _mark_normal_hnf_0 @@ -912,7 +1009,8 @@ _mark_normal_hnf_0: b _mark_next_node _mark_real_file_or_string: - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,8 + otoa r12,__STRING___o_2,8 cmp r4,r12 bls _mark_string_or_array @@ -932,8 +1030,8 @@ _mark_real_or_file: b _mark_next_node _mark_record: - ldr r12,=258 - subs r8,r8,r12 + mov r12,#258/2 + subs r8,r8,r12,lsl #1 beq _mark_record_2 blt _mark_record_1 @@ -1107,8 +1205,8 @@ _end_set_ab_array_bits: str r7,[sp,#-4]! add r8,r6,#12 - ldr r12,=end_vector - ldr r12,[r12] + lao r12,end_vector,4 + ldo r12,r12,end_vector,4 str r12,[sp,#-4]! b _mark_ab_array_begin @@ -1118,8 +1216,8 @@ _mark_ab_array: str r8,[sp,#-4]! add r4,r8,r3 - ldr r12,=end_vector - str r4,[r12] + lao r12,end_vector,5 + sto r4,r12,end_vector,5 str pc,[sp,#-4]! bl _mark_stack_nodes @@ -1132,8 +1230,8 @@ _mark_ab_array_begin: bcs _mark_ab_array ldr r6,[sp] - ldr r12,=end_vector - str r6,[r12] + lao r12,end_vector,6 + sto r6,r12,end_vector,6 add sp,sp,#12 b _mark_next_node @@ -1180,20 +1278,20 @@ _end_set_a_array_bits: ldr r4,[sp],#4 add r8,r6,#12 - ldr r12,=end_vector - ldr r12,[r12] + lao r12,end_vector,7 + ldo r12,r12,end_vector,7 str r12,[sp,#-4]! add r12,r6,#12 add r4,r12,r4,lsl #2 - ldr r12,=end_vector - str r4,[r12] + lao r12,end_vector,8 + sto r4,r12,end_vector,8 str pc,[sp,#-4]! bl _mark_stack_nodes ldr r6,[sp],#4 - ldr r12,=end_vector - str r6,[r12] + lao r12,end_vector,9 + sto r6,r12,end_vector,9 b _mark_next_node _mark_lazy_array: @@ -1239,20 +1337,20 @@ _end_set_lazy_array_bits: ldr r4,[r6,#4] add r8,r6,#12 - ldr r12,=end_vector - ldr r12,[r12] + lao r12,end_vector,10 + ldo r12,r12,end_vector,10 str r12,[sp,#-4]! add r12,r6,#12 add r4,r12,r4,lsl #2 - ldr r12,=end_vector - str r4,[r12] + lao r12,end_vector,11 + sto r4,r12,end_vector,11 str pc,[sp,#-4]! bl _mark_stack_nodes ldr r6,[sp],#4 - ldr r12,=end_vector - str r6,[r12] + lao r12,end_vector,12 + sto r6,r12,end_vector,12 b _mark_next_node _mark_array_using_reversal: @@ -1263,10 +1361,12 @@ _mark_array_using_reversal: _mark_strict_basic_array: ldr r4,[r6,#4] - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,8 + otoa r12,INT_o_2,8 cmp r8,r12 beq _mark_strict_int_array - ldr r12,=BOOL+2 + laol r12,BOOL+2,BOOL_o_2,5 + otoa r12,BOOL_o_2,5 cmp r8,r12 beq _mark_strict_bool_array _mark_strict_real_array: @@ -1333,6 +1433,27 @@ __end_mark_using_reversal: b _mark_next_node .endif +.ifdef PIC + lto end_vector,2 + lto __indirection,11 + lto __indirection,12 + lto __indirection,13 + lto end_vector,3 + ltol INT+2,INT_o_2,7 + ltol CHAR+2,CHAR_o_2,3 + ltol __STRING__+2,__STRING___o_2,8 + lto end_vector,4 + lto end_vector,5 + lto end_vector,6 + lto end_vector,7 + lto end_vector,8 + lto end_vector,9 + lto end_vector,10 + lto end_vector,11 + lto end_vector,12 + ltol INT+2,INT_o_2,8 + ltol BOOL+2,BOOL_o_2,5 +.endif .ltorg __mark_using_reversal: @@ -1512,15 +1633,25 @@ __large_tuple_or_record: tst r8,r12 bne __mark_no_selector_2 +.ifdef PIC + ldr r12,[r4,#-8] + add r4,r4,#-8+4 +.else ldr r4,[r4,#-8] +.endif + lao r8,__indirection,14 ldr r7,[r6] - ldr r12,=__indirection - str r12,[r6,#-4] + otoa r8,__indirection,14 + str r8,[r6,#-4] mov r8,r6 ldr r3,[sp],#4 +.ifdef PIC + ldrh r4,[r4,r12] +.else ldrh r4,[r4,#4] +.endif cmp r4,#8 blt __mark_tuple_selector_node_1 ldr r7,[r7,#8] @@ -1536,15 +1667,25 @@ __mark_tuple_selector_node_2: b __mark_node __small_tuple_or_record: +.ifdef PIC + ldr r12,[r4,#-8] + add r4,r4,#-8+4 +.else ldr r4,[r4,#-8] +.endif + lao r8,__indirection,15 ldr r7,[r6] - ldr r12,=__indirection - str r12,[r6,#-4] + otoa r8,__indirection,15 + str r8,[r6,#-4] mov r8,r6 ldr r3,[sp],#4 +.ifdef PIC + ldrh r4,[r4,r12] +.else ldrh r4,[r4,#4] +.endif __mark_tuple_selector_node_1: ldr r6,[r7,r4] str r6,[r8] @@ -1570,8 +1711,8 @@ __mark_record_selector_node_1: beq __mark_no_selector_2 ldrh r12,[r3,#-2] - ldr r3,=258 - cmp r12,r3 + mov r3,#258/2 + cmp r12,r3,lsl #1 bls __small_record ldr r8,[r8,#8] @@ -1587,15 +1728,25 @@ __mark_record_selector_node_1: bne __mark_no_selector_2 __small_record: +.ifdef PIC + ldr r12,[r4,#-8] + add r4,r4,#-8+4 +.else ldr r4,[r4,#-8] +.endif + lao r8,__indirection,16 ldr r7,[r6] - ldr r12,=__indirection - str r12,[r6,#-4] + otoa r8,__indirection,16 + str r8,[r6,#-4] mov r8,r6 ldr r3,[sp],#4 +.ifdef PIC + ldrh r4,[r4,r12] +.else ldrh r4,[r4,#4] +.endif cmp r4,#8 ble __mark_record_selector_node_2 ldr r7,[r7,#8] @@ -1624,8 +1775,8 @@ __mark_strict_record_selector_node_1: beq __mark_no_selector_2 ldrh r12,[r3,#-2] - ldr r3,=258 - cmp r12,r3 + mov r3,#258/2 + cmp r12,r3,lsl #1 ble __select_from_small_record ldr r8,[r8,#8] @@ -1641,12 +1792,21 @@ __mark_strict_record_selector_node_1: bne __mark_no_selector_2 __select_from_small_record: +.ifdef PIC + ldr r4,[r4,#-8] + add r12,r4,#-8+4 +.else ldr r4,[r4,#-8] +.endif ldr r7,[r6] ldr r3,[sp],#4 sub r6,r6,#4 +.ifdef PIC + ldrh r3,[r4,r12]! +.else ldrh r3,[r4,#4] +.endif cmp r3,#8 ble __mark_strict_record_selector_node_2 ldr r12,[r7,#8] @@ -1658,7 +1818,11 @@ __mark_strict_record_selector_node_2: __mark_strict_record_selector_node_3: str r3,[r6,#4] +.ifdef PIC + ldrh r3,[r4,#6-4] +.else ldrh r3,[r4,#6] +.endif tst r3,r3 beq __mark_strict_record_selector_node_5 cmp r3,#8 @@ -1670,7 +1834,11 @@ __mark_strict_record_selector_node_4: str r3,[r6,#8] __mark_strict_record_selector_node_5: +.ifdef PIC + ldr r4,[r4,#-4-4] +.else ldr r4,[r4,#-4] +.endif str r4,[r6] b __mark_node @@ -1843,7 +2011,8 @@ __mark_closure_1_with_unboxed_argument: b __mark_real_or_file __mark_hnf_0: - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,9 + otoa r12,INT_o_2,9 cmp r4,r12 bne __no_int_3 @@ -1868,19 +2037,22 @@ __mark_bool_or_small_string: b __mark_next_node ____small_int: - ldr r6,=small_integers + lao r6,small_integers,2 + otoa r6,small_integers,2 add r6,r6,r8,lsl #3 b __mark_next_node __no_int_3: blo __mark_real_file_or_string - ldr r12,=CHAR+2 + laol r12,CHAR+2,CHAR_o_2,4 + otoa r12,CHAR_o_2,4 cmp r4,r12 bne __no_char_3 ldrb r8,[r6,#4] - ldr r6,=static_characters + lao r6,static_characters,2 + otoa r6,static_characters,2 add r6,r6,r8,lsl #3 b __mark_next_node @@ -1891,7 +2063,8 @@ __no_char_3: b __mark_next_node __mark_real_file_or_string: - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,9 + otoa r12,__STRING___o_2,9 cmp r4,r12 bls __mark_string_or_array @@ -1915,8 +2088,8 @@ __mark_real_or_file: b __mark_next_node __mark__record: - ldr r12,=258 - subs r8,r8,r12 + mov r12,#258/2 + subs r8,r8,r12,lsl #1 beq __mark_record_2 blt __mark_record_1 @@ -2157,15 +2330,15 @@ __skip_mark_lazy_array_bits: ldr r8,[r7,#-4] sub r7,r7,#4 - ldr r12,=lazy_array_list - ldr r3,[r12] + lao r12,lazy_array_list,2 + ldo r3,r12,lazy_array_list,2 add r8,r8,#2 str r3,[r7] str r8,[r6,#-4] str r4,[r6,#-8] sub r6,r6,#8 - ldr r12,=lazy_array_list - str r6,[r12] + lao r12,lazy_array_list,3 + sto r6,r12,lazy_array_list,3 ldr r6,[r7,#-4] str r9,[r7,#-4] @@ -2178,13 +2351,13 @@ __mark_array_length_0_1: ldr r3,[r6,#12] ldr r8,[r6,#8] - ldr r12,=lazy_array_list - ldr r7,[r12] + lao r12,lazy_array_list,4 + ldo r7,r12,lazy_array_list,4 str r8,[r6,#12] str r7,[r6,#8] str r4,[r6] - ldr r12,=lazy_array_list - str r6,[r12] + lao r12,lazy_array_list,5 + sto r6,r12,lazy_array_list,5 str r3,[r6,#4] add r6,r6,#4 @@ -2203,10 +2376,12 @@ __mark_b_record_array: __mark_strict_basic_array: ldr r4,[r6,#4] - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,10 + otoa r12,INT_o_2,10 cmp r8,r12 beq __mark__strict__int__array - ldr r12,=BOOL+2 + laol r12,BOOL+2,BOOL_o_2,6 + otoa r12,BOOL_o_2,6 cmp r8,r12 beq __mark__strict__bool__array __mark__strict__real__array: @@ -2262,4 +2437,23 @@ __last__string__bits: str r12,[r10,r3,lsl #2] b __mark_next_node +.ifdef PIC + lto __indirection,14 + lto __indirection,15 + lto __indirection,16 + lto small_integers,2 + lto static_characters,2 + lto lazy_array_list,2 + lto lazy_array_list,3 + lto lazy_array_list,4 + lto lazy_array_list,5 +.endif + +.ifdef PIC + ltol INT+2,INT_o_2,9 + ltol CHAR+2,CHAR_o_2,4 + ltol __STRING__+2,__STRING___o_2,9 + ltol INT+2,INT_o_2,10 + ltol BOOL+2,BOOL_o_2,6 +.endif .ltorg diff --git a/armstartup.s b/armstartup.s index 3920067..d5e284d 100644 --- a/armstartup.s +++ b/armstartup.s @@ -14,6 +14,8 @@ .fpu vfp3 + .include "armmacros.s" + USE_CLIB = 1 SHARE_CHAR_INT = 1 @@ -442,8 +444,8 @@ abc_main: .ifdef DLL ldr r4,[sp,#28] - ldr r12,=start_address - str r4,[r12] + lao r12,start_address,0 + sto r4,r12,start_address,0 .endif str pc,[sp,#-4]! bl init_clean @@ -453,8 +455,8 @@ abc_main: str pc,[sp,#-4]! bl init_timer - ldr r12,=halt_sp - str sp,[r12] + lao r12,halt_sp,0 + sto sp,r12,halt_sp,0 .ifdef PROFILE str pc,[sp,#-4]! @@ -462,8 +464,8 @@ abc_main: .endif .ifdef DLL - ldr r12,=start_address - ldr r4,[r12] + lao r12,start_address,1 + ldo r4,r12,start_address,1 str pc,[sp,#-4]! blx r4 .else @@ -482,9 +484,9 @@ init_error: clean_init: stmdb sp!,{r4-r11} - ldr r12,=dll_initisialised + lao r12,dll_initisialised,0 mov r0,#1 - str r0,[r12] + sto r0,r12,dll_initisialised,0 str pc,[sp,#-4]! bl init_clean @@ -494,18 +496,18 @@ clean_init: str pc,[sp,#-4]! bl init_timer - ldr r12,=halt_sp - str sp,[r12] + lao r12,halt_sp,1 + sto sp,r12,halt_sp,1 .ifdef PROFILE str pc,[sp,#-4]! bl init_profiler .endif - ldr r12,=saved_heap_p - str r10,[r12] - ldr r12,=saved_a_stack_p - str r9,[r12] + lao r12,saved_heap_p,0 + sto r10,r12,saved_heap_p,0 + lao r12,saved_a_stack_p,0 + sto r9,r12,saved_a_stack_p,0 mov r4,#1 b exit_dll_init @@ -518,10 +520,10 @@ init_dll_error: clean_fini: stmdb sp!,{r4-r11} - ldr r12,=saved_heap_p - ldr r10,[r12] - ldr r12,=saved_a_stack_p - ldr r9,[r12] + lao r12,saved_heap_p,1 + ldo r10,r12,saved_heap_p,1 + lao r12,saved_a_stack_p,1 + ldo r9,r12,saved_a_stack_p,1 str pc,[sp,#-4]! bl exit_clean @@ -531,20 +533,20 @@ exit_dll_init: init_clean: add r4,sp,#128 - ldr r12,=ab_stack_size - ldr r12,[r12] + lao r12,ab_stack_size,0 + ldo r12,r12,ab_stack_size,0 sub r4,r4,r12 - ldr r12,=end_b_stack - str r4,[r12] + lao r12,end_b_stack,0 + sto r4,r12,end_b_stack,0 - ldr r12,=flags - ldr r4,[r12] + lao r12,flags,0 + ldo r4,r12,flags,0 and r4,r4,#1 - ldr r12,=basic_only - str r4,[r12] + lao r12,basic_only,0 + sto r4,r12,basic_only,0 - ldr r12,=heap_size - ldr r4,[r12] + lao r12,heap_size,0 + ldo r4,r12,heap_size,0 .if PREFETCH2 subs r4,r4,#63 .else @@ -554,31 +556,34 @@ init_clean: ldr r12,=1041204193 umull r11,r4,r12,r4 lsr r4,r4,#3 - ldr r12,=heap_size_33 - str r4,[r12] + lao r12,heap_size_33,0 + sto r4,r12,heap_size_33,0 - ldr r12,=heap_size - ldr r4,[r12] + lao r12,heap_size,1 + ldo r4,r12,heap_size,1 subs r4,r4,#3 @ divide by 129 ldr r12,=266354561 umull r11,r4,r12,r4 lsr r4,r4,#3 - ldr r12,=heap_size_129 - str r4,[r12] + lao r12,heap_size_129,0 + sto r4,r12,heap_size_129,0 add r4,r4,#3 and r4,r4,#-4 - ldr r12,=heap_copied_vector_size - str r4,[r12] - ldr r12,=heap_end_after_copy_gc + lao r12,heap_copied_vector_size,0 + sto r4,r12,heap_copied_vector_size,0 + lao r12,heap_end_after_copy_gc,0 mov r11,#0 - str r11,[r12] + sto r11,r12,heap_end_after_copy_gc,0 - ldr r12,=heap_size - ldr r4,[r12] + lao r12,heap_size,2 + ldo r4,r12,heap_size,2 add r4,r4,#7 and r4,r4,#-8 - str r4,[r12] +.ifdef PIC + lao r12,heap_size,3 +.endif + sto r4,r12,heap_size,3 add r4,r4,#7 mov r0,r4 @@ -587,15 +592,15 @@ init_clean: movs r4,r0 beq no_memory_2 - ldr r12,=heap_mbp - str r4,[r12] + lao r12,heap_mbp,0 + sto r4,r12,heap_mbp,0 add r10,r4,#3 and r10,r10,#-4 - ldr r12,=heap_p - str r10,[r12] + lao r12,heap_p,0 + sto r10,r12,heap_p,0 - ldr r8,=ab_stack_size - ldr r8,[r8] + lao r8,ab_stack_size,1 + ldo r8,r8,ab_stack_size,1 add r8,r8,#3 mov r0,r8 @@ -608,40 +613,42 @@ init_clean: movs r4,r0 beq no_memory_3 - ldr r12,=stack_mbp - str r4,[r12] + lao r12,stack_mbp,0 + sto r4,r12,stack_mbp,0 .if STACK_OVERFLOW_EXCEPTION_HANDLER - ldr r12,=ab_stack_size - ldr r12,[r12] + lao r12,ab_stack_size,2 + ldo r12,r12,ab_stack_size,2 add r4,r4,r12 - ldr r12,=a_stack_guard_page + lao r12,a_stack_guard_page,0 add r4,r4,#4096 add r4,r4,#(3+4095)-4096 bic r4,r4,#255 bic r4,r4,#4095-255 - str r4,[r12] - ldr r12,=ab_stack_size - ldr r12,[r12] + sto r4,r12,a_stack_guard_page,0 + lao r12,ab_stack_size,3 + ldo r12,r12,ab_stack_size,3 sub r4,r4,r12 .endif add r4,r4,#3 and r4,r4,#-4 mov r9,r4 - ldr r12,=stack_p - str r4,[r12] + lao r12,stack_p,0 + sto r4,r12,stack_p,0 - ldr r12,=ab_stack_size - ldr r12,[r12] + lao r12,ab_stack_size,4 + ldo r12,r12,ab_stack_size,4 add r4,r4,r12 subs r4,r4,#64 - ldr r12,=end_a_stack - str r4,[r12] + lao r12,end_a_stack,0 + sto r4,r12,end_a_stack,0 .if SHARE_CHAR_INT - ldr r6,=small_integers + lao r6,small_integers,0 + otoa r6,small_integers,0 mov r4,#0 - ldr r3,=INT+2 + laol r3,INT+2,INT_o_2,0 + otoa r3,INT_o_2,0 make_small_integers_lp: str r3,[r6] @@ -651,9 +658,11 @@ make_small_integers_lp: cmp r4,#33 bne make_small_integers_lp - ldr r6,=static_characters + lao r6,static_characters,0 + otoa r6,static_characters,0 mov r4,#0 - ldr r3,=CHAR+2 + laol r3,CHAR+2,CHAR_O_2,0 + otoa r3,CHAR_O_2,0 make_static_characters_lp: str r3,[r6] @@ -664,49 +673,51 @@ make_static_characters_lp: bne make_static_characters_lp .endif - ldr r6,=caf_list+4 - ldr r12,=caf_listp - str r6,[r12] + laol r6,caf_list+4,caf_list_o_4,0 + otoa r6,caf_list_o_4,0 + lao r12,caf_listp,0 + sto r6,r12,caf_listp,0 .if FINALIZERS - ldr r12,=finalizer_list - ldr r11,=__Nil-4 - str r11,[r12] - ldr r12,=free_finalizer_list - str r11,[r12] + lao r12,finalizer_list,0 + laol r11,__Nil-4,__Nil_o_m4,0 + otoa r11,__Nil_o_m4,0 + sto r11,r12,finalizer_list,0 + lao r12,free_finalizer_list,0 + sto r11,r12,free_finalizer_list,0 .endif - ldr r12,=heap_p1 - str r10,[r12] + lao r12,heap_p1,0 + sto r10,r12,heap_p1,0 - ldr r12,=heap_size_129 - ldr r8,[r12] + lao r12,heap_size_129,1 + ldo r8,r12,heap_size_129,1 lsl r8,r8,#4 add r4,r10,r8,lsl #2 - ldr r12,=heap_copied_vector - str r4,[r12] - ldr r12,=heap_copied_vector_size - ldr r12,[r12] + lao r12,heap_copied_vector,0 + sto r4,r12,heap_copied_vector,0 + lao r12,heap_copied_vector_size,1 + ldo r12,r12,heap_copied_vector_size,1 add r4,r12 - ldr r12,=heap_p2 - str r4,[r12] + lao r12,heap_p2,0 + sto r4,r12,heap_p2,0 - ldr r12,=garbage_collect_flag + lao r12,garbage_collect_flag,0 mov r11,#0 - strb r11,[r12] + stob r11,r12,garbage_collect_flag,0 .if MARK_AND_COPY_GC - ldr r12,=flags - ldrb r12,[r12] + lao r12,flags,1 + ldo r12,r12,flags,1 tst r12,#64 beq no_mark1 .endif .if MARK_GC || COMPACT_GC_ONLY - ldr r12,=heap_size_33 - ldr r4,[r12] - ldr r12,=heap_vector - str r10,[r12] + lao r12,heap_size_33,1 + ldo r4,r12,heap_size_33,1 + lao r12,heap_vector,0 + sto r10,r12,heap_vector,0 add r10,r10,r4 .if PREFETCH2 add r10,r10,#63 @@ -715,12 +726,12 @@ make_static_characters_lp: add r10,r10,#3 and r10,r10,#-4 .endif - ldr r12,=heap_p3 - str r10,[r12] + lao r12,heap_p3,0 + sto r10,r12,heap_p3,0 lsl r8,r4,#3 - ldr r12,=garbage_collect_flag + lao r12,garbage_collect_flag,1 mov r11,#-1 - strb r11,[r12] + stob r11,r12,garbage_collect_flag,1 .endif .if MARK_AND_COPY_GC @@ -728,12 +739,12 @@ no_mark1: .endif .if ADJUST_HEAP_SIZE - ldr r4,=initial_heap_size - ldr r4,[r4] + lao r4,initial_heap_size,0 + ldo r4,r4,initial_heap_size,0 .if MARK_AND_COPY_GC mov r3,#MINIMUM_HEAP_SIZE_2 - ldr r12,=flags - ldrb r12,[r12] + lao r12,flags,2 + ldo r12,r12,flags,2 tst r12,#64 bne no_mark9 add r3,r3,r3 @@ -756,21 +767,21 @@ too_large_or_too_small: .endif add r4,r10,r8,lsl #2 - ldr r12,=heap_end_after_gc - str r4,[r12] + lao r12,heap_end_after_gc,0 + sto r4,r12,heap_end_after_gc,0 mov r5,r8 .if MARK_AND_COPY_GC - ldr r12,=flags - ldrb r12,[r12] + lao r12,flags,3 + ldo r12,r12,flags,3 tst r12,#64 beq no_mark2 .endif .if MARK_GC && ADJUST_HEAP_SIZE - ldr r12,=bit_vector_size - str r8,[r12] + lao r12,bit_vector_size,0 + sto r8,r12,bit_vector_size,0 .endif .if MARK_AND_COPY_GC @@ -781,7 +792,8 @@ no_mark2: ldr pc,[sp],#4 no_memory_2: - ldr r0,=out_of_memory_string_1 + lao r0,out_of_memory_string_1,0 + otoa r0,out_of_memory_string_1,0 bl ew_print_string .ifdef _WINDOWS_ ? movl $1,@execution_aborted @@ -790,14 +802,15 @@ no_memory_2: ldr pc,[sp],#4 no_memory_3: - ldr r0,=out_of_memory_string_1 + lao r0,out_of_memory_string_1,1 + otoa r0,out_of_memory_string_1,1 bl ew_print_string .ifdef _WINDOWS_ ? movl $1,@execution_aborted .endif - ldr r0,=heap_mbp - ldr r0,[r0] + lao r0,heap_mbp,1 + ldo r0,r0,heap_mbp,1 bl free mov r0,#1 @@ -807,39 +820,42 @@ exit_clean: str pc,[sp,#-4]! bl add_execute_time - ldr r4,=flags - ldr r4,[r4] + lao r4,flags,4 + ldo r4,r4,flags,4 tst r4,#8 beq no_print_execution_time - ldr r0,=time_string_1 + lao r0,time_string_1,0 + otoa r0,time_string_1,0 bl ew_print_string - ldr r12,=execute_time - ldr r4,[r12] + lao r12,execute_time,0 + ldo r4,r12,execute_time,0 str pc,[sp,#-4]! bl print_time - ldr r0,=time_string_2 + lao r0,time_string_2,0 + otoa r0,time_string_2,0 bl ew_print_string - ldr r12,=garbage_collect_time - ldr r4,[r12] + lao r12,garbage_collect_time,0 + ldo r4,r12,garbage_collect_time,0 str pc,[sp,#-4]! bl print_time - ldr r0,=time_string_4 + lao r0,time_string_4,0 + otoa r0,time_string_4,0 bl ew_print_string - ldr r12,=execute_time - ldr r4,[r12] - ldr r12,=garbage_collect_time - ldr r12,[r12] + lao r12,execute_time,1 + ldo r4,r12,execute_time,1 + lao r12,garbage_collect_time,1 + ldo r12,r12,garbage_collect_time,1 add r4,r12 - ldr r12,=IO_time - ldr r12,[r12] + lao r12,IO_time,0 + ldo r12,r12,IO_time,0 add r4,r12 str pc,[sp,#-4]! @@ -849,12 +865,12 @@ exit_clean: bl ew_print_char no_print_execution_time: - ldr r0,=stack_mbp - ldr r0,[r0] + lao r0,stack_mbp,1 + ldo r0,r0,stack_mbp,1 bl free - ldr r0,=heap_mbp - ldr r0,[r0] + lao r0,heap_mbp,2 + ldo r0,r0,heap_mbp,2 bl free .ifdef PROFILE @@ -865,12 +881,105 @@ no_print_execution_time: ldr pc,[sp],#4 __driver: - ldr r8,=flags - ldr r8,[r8] + lao r8,flags,5 + ldo r8,r8,flags,5 tst r8,#16 beq __print__graph b __eval__to__nf +.ifdef PIC + .ifdef DLL + lto start_address,0 + .endif + lto halt_sp,0 + .ifdef DLL + lto start_address,1 + .endif + lto dll_initisialised,0 + lto halt_sp,1 + lto saved_heap_p,0 + lto saved_a_stack_p,0 + lto saved_heap_p,1 + lto saved_a_stack_p,1 + lto ab_stack_size,0 + lto end_b_stack,0 + lto flags,0 + lto basic_only,0 + lto heap_size,0 + lto heap_size_33,0 + lto heap_size,1 + lto heap_size_129,0 + lto heap_copied_vector_size,0 + lto heap_end_after_copy_gc,0 + lto heap_size,2 + lto heap_size,3 + lto heap_mbp,0 + lto heap_p,0 + lto ab_stack_size,1 + lto stack_mbp,0 + .if STACK_OVERFLOW_EXCEPTION_HANDLER + lto ab_stack_size,2 + lto a_stack_guard_page,0 + lto ab_stack_size,3 + .endif + lto stack_p,0 + lto ab_stack_size,4 + lto end_a_stack,0 + lto small_integers,0 + ltol INT+2,INT_o_2,0 + lto static_characters,0 + ltol CHAR+2,CHAR_O_2,0 + ltol caf_list+4,caf_list_o_4,0 + lto caf_listp,0 + .if FINALIZERS + lto finalizer_list,0 + ltol __Nil-4,__Nil_o_m4,0 + lto free_finalizer_list,0 + .endif + lto heap_p1,0 + lto heap_size_129,1 + lto heap_copied_vector,0 + lto heap_copied_vector_size,1 + lto heap_p2,0 + lto garbage_collect_flag,0 + .if MARK_AND_COPY_GC + lto flags,1 + .endif + .if MARK_GC || COMPACT_GC_ONLY + lto heap_size_33,1 + lto heap_vector,0 + lto heap_p3,0 + lto garbage_collect_flag,1 + .endif + .if ADJUST_HEAP_SIZE + lto initial_heap_size,0 + .if MARK_AND_COPY_GC + lto flags,2 + .endif + .endif + lto heap_end_after_gc,0 + .if MARK_AND_COPY_GC + lto flags,3 + .endif + .if MARK_GC && ADJUST_HEAP_SIZE + lto bit_vector_size,0 + .endif + lto out_of_memory_string_1,0 + lto out_of_memory_string_1,1 + lto heap_mbp,1 + lto flags,4 + lto time_string_1,0 + lto execute_time,0 + lto time_string_2,0 + lto garbage_collect_time,0 + lto time_string_4,0 + lto execute_time,1 + lto garbage_collect_time,1 + lto IO_time,0 + lto stack_mbp,1 + lto heap_mbp,2 + lto flags,5 +.endif .ltorg print_time: @@ -891,17 +1000,21 @@ print_time: .if USE_CLIB mov r3,r4 mov r2,r6 - ldr r1,=sprintf_time_string - ldr r0,=sprintf_time_buffer + lao r1,sprintf_time_string,0 + lao r0,sprintf_time_buffer,0 + otoa r1,sprintf_time_string,0 + otoa r0,sprintf_time_buffer,0 bl sprintf - ldr r0,=sprintf_time_buffer + lao r0,sprintf_time_buffer,1 + otoa r0,sprintf_time_buffer,1 bl ew_print_string .else mov r0,r6 bl ew_print_int - ldr r6,=sprintf_time_buffer + lao r6,sprintf_time_buffer,0 + otoa r6,sprintf_time_buffer,0 eor r7,r7,r7 mov r3,#10 @@ -929,8 +1042,8 @@ print_time: ldr pc,[sp],#4 print_sc: - ldr r12,=basic_only - ldr r8,[r12] + lao r12,basic_only,1 + ldo r8,r12,basic_only,1 cmp r8,#0 bne end_print @@ -954,6 +1067,10 @@ printD: tst r4,#2 DtoAC_record: ldr r8,[r4,#-6] +.ifdef PIC + add r12,r4,#-6 + add r8,r8,r12 +.endif b DtoAC_string_a2 DtoAC: tst r4,#2 @@ -981,24 +1098,28 @@ print_symbol: b print_symbol_2 print_symbol_sc: - ldr r12,=basic_only - ldr r3,[r12] + lao r12,basic_only,2 + ldo r3,r12,basic_only,2 print_symbol_2: ldr r4,[r6] - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,1 + otoa r12,INT_o_2,1 cmp r4,r12 beq print_int_node - ldr r12,=CHAR+2 + laol r12,CHAR+2,CHAR_o_2,0 + otoa r12,CHAR_o_2,0 cmp r4,r12 beq print_char_denotation - ldr r12,=BOOL+2 + laol r12,BOOL+2,BOOL_o_2,0 + otoa r12,BOOL_o_2,0 cmp r4,r12 beq print_bool - ldr r12,=REAL+2 + laol r12,REAL+2,REAL_o_2,0 + otoa r12,REAL_o_2,0 cmp r4,r12 beq print_real_node @@ -1017,6 +1138,10 @@ printD_: print_record: ldr r8,[r4,#-6] +.ifdef PIC + add r12,r4,#-6 + add r8,r8,r12 +.endif b print_string_a2 end_print_symbol: @@ -1067,12 +1192,14 @@ print_bool: beq print_false print_true: - ldr r0,=true_c_string + lao r0,true_c_string,0 + otoa r0,true_c_string,0 bl w_print_string ldr pc,[sp],#4 print_false: - ldr r0,=false_c_string + lao r0,false_c_string,0 + otoa r0,false_c_string,0 bl w_print_string ldr pc,[sp],#4 @@ -1094,8 +1221,8 @@ print_string_a2: ldr pc,[sp],#4 print__chars__sc: - ldr r12,=basic_only - ldr r8,[r12] + lao r12,basic_only,3 + ldo r8,r12,basic_only,3 cmp r8,#0 bne no_print_chars @@ -1219,31 +1346,38 @@ BtoAC: tst r4,r4 beq BtoAC_false BtoAC_true: - ldr r6,=true_string + lao r6,true_string,0 + otoa r6,true_string,0 ldr pc,[sp],#4 BtoAC_false: - ldr r6,=false_string + lao r6,false_string,0 + otoa r6,false_string,0 ldr pc,[sp],#4 RtoAC: .if USE_CLIB vmov r2,r3,d0 - ldr r1,=printf_real_string - ldr r0,=sprintf_buffer + lao r1,printf_real_string,0 + lao r0,sprintf_buffer,0 + otoa r1,printf_real_string,0 + otoa r0,sprintf_buffer,0 bl sprintf .else - ldr r0,=sprintf_buffer + lao r0,sprintf_buffer,1 + otoa r0,sprintf_buffer,1 bl convert_real_to_string .endif b return_sprintf_buffer ItoAC: .if MY_ITOS - ldr r6,=sprintf_buffer + lao r6,sprintf_buffer,2 + otoa r6,sprintf_buffer,2 str pc,[sp,#-4]! bl int_to_string - ldr r12,=sprintf_buffer + lao r12,sprintf_buffer,3 + otoa r12,sprintf_buffer,3 sub r4,r6,r12 b sprintf_buffer_to_string @@ -1295,30 +1429,36 @@ reverse_digits: ldr pc,[sp],#4 .else mov r2,r4 - ldr r1,=printf_int_string - ldr r0,=sprintf_buffer + lao r1,printf_int_string,0 + lao r0,sprintf_buffer,4 + otoa r1,printf_int_string,0 + otoa r0,sprintf_buffer,4 bl sprintf .endif return_sprintf_buffer: .if USE_CLIB - ldr r0,=sprintf_buffer + lao r0,sprintf_buffer,5 + otoa r0,sprintf_buffer,5 bl strlen mov r4,r0 .else - ldr r4,=sprintf_buffer-1 + laol r4,sprintf_buffer-1,sprintf_buffer_o_m1,0 + otoa r4,sprintf_buffer_o_m1,0 skip_characters: ldrb r12,[r4,#1]! tst r12,r12 bne skip_characters - ldr r12,=sprintf_buffer + lao r12,sprintf_buffer,6 + otoa r12,sprintf_buffer,6 sub r4,r4,r12 .endif .if MY_ITOS sprintf_buffer_to_string: - ldr r6,=sprintf_buffer + lao r6,sprintf_buffer,7 + otoa r6,sprintf_buffer,7 build_string: .endif add r3,r4,#3 @@ -1335,7 +1475,8 @@ build_string: D_to_S_no_gc: subs r3,r3,#2 mov r8,r10 - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,0 + otoa r12,__STRING___o_2,0 str r4,[r10,#4] str r12,[r10],#8 b D_to_S_cp_str_2 @@ -1355,16 +1496,20 @@ eqD: ldr r4,[r6] cmp r4,r12 bne eqD_false - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,2 + otoa r12,INT_o_2,2 cmp r4,r12 beq eqD_INT - ldr r12,=CHAR+2 + laol r12,CHAR+2,CHAR_o_2,1 + otoa r12,CHAR_o_2,1 cmp r4,r12 beq eqD_CHAR - ldr r12,=BOOL+2 + laol r12,BOOL+2,BOOL_o_2,1 + otoa r12,BOOL_o_2,1 cmp r4,r12 beq eqD_BOOL - ldr r12,=REAL+2 + laol r12,REAL+2,REAL_o_2,1 + otoa r12,REAL_o_2,1 cmp r4,r12 beq eqD_REAL @@ -1413,15 +1558,15 @@ init_timer: add r4,r4,r4,lsl #2 add sp,sp,#20 - ldr r12,=last_time - str r4,[r12] + lao r12,last_time,0 + sto r4,r12,last_time,0 eor r4,r4,r4 - ldr r12,=execute_time - str r4,[r12] - ldr r12,=garbage_collect_time - str r4,[r12] - ldr r12,=IO_time - str r4,[r12] + lao r12,execute_time,2 + sto r4,r12,execute_time,2 + lao r12,garbage_collect_time,2 + sto r4,r12,garbage_collect_time,2 + lao r12,IO_time,1 + sto r4,r12,IO_time,1 ldr pc,[sp],#4 @@ -1434,7 +1579,8 @@ get_time_diff: add r4,r4,r4,lsl #2 add sp,sp,#20 - ldr r6,=last_time + lao r6,last_time,1 + otoa r6,last_time,1 ldr r7,[r6] str r4,[r6] subs r4,r4,r7 @@ -1443,7 +1589,8 @@ get_time_diff: add_execute_time: str pc,[sp,#-4]! bl get_time_diff - ldr r6,=execute_time + lao r6,execute_time,3 + otoa r6,execute_time,3 add_time: ldr r12,[r6] @@ -1454,16 +1601,111 @@ add_time: add_garbage_collect_time: str pc,[sp,#-4]! bl get_time_diff - ldr r6,=garbage_collect_time + lao r6,garbage_collect_time,3 + otoa r6,garbage_collect_time,3 b add_time add_IO_time: str pc,[sp,#-4]! bl get_time_diff - ldr r6,=IO_time + lao r6,IO_time,2 + otoa r6,IO_time,2 b add_time +.ifdef PIC + lto sprintf_time_string,0 + lto sprintf_time_buffer,0 + .if USE_CLIB + lto sprintf_time_buffer,1 + .endif + lto basic_only,1 + lto basic_only,2 + ltol INT+2,INT_o_2,1 + ltol CHAR+2,CHAR_o_2,0 + ltol BOOL+2,BOOL_o_2,0 + ltol REAL+2,REAL_o_2,0 + lto true_c_string,0 + lto false_c_string,0 + lto basic_only,3 + lto true_string,0 + lto false_string,0 + .if USE_CLIB + lto printf_real_string,0 + lto sprintf_buffer,0 + .else + lto sprintf_buffer,1 + .endif + .if MY_ITOS + lto sprintf_buffer,2 + lto sprintf_buffer,3 + .else + lto printf_int_string,0 + lto sprintf_buffer,4 + .endif + .if USE_CLIB + lto sprintf_buffer,5 + .else + ltol sprintf_buffer-1,sprintf_buffer_o_m1,0 + lto sprintf_buffer,6 + .endif + .if MY_ITOS + lto sprintf_buffer,7 + .endif + ltol __STRING__+2,__STRING___o_2,0 + ltol INT+2,INT_o_2,2 + ltol CHAR+2,CHAR_o_2,1 + ltol BOOL+2,BOOL_o_2,1 + ltol REAL+2,REAL_o_2,1 + lto last_time,0 + lto execute_time,2 + lto garbage_collect_time,2 + lto IO_time,1 + lto last_time,1 + lto execute_time,3 + lto garbage_collect_time,3 + lto IO_time,2 +.endif .ltorg +.ifdef PIC + .ifdef PROFILE + lto garbage_collector_name,0 + lto garbage_collector_name,1 + lto garbage_collector_name,2 + lto garbage_collector_name,3 + .endif + lto heap_end_after_gc,1 + lto n_allocated_words,0 + .if MARK_AND_COPY_GC + lto flags,6 + .endif + .if MARK_GC + lto bit_counter,0 + lto n_allocated_words,1 + lto bit_vector_p,0 + lto n_free_words_after_mark,0 + lto bit_counter,1 + lto bit_vector_p,1 + lto n_free_words_after_mark,1 + lto heap_vector,1 + lto heap_p3,1 + lto heap_end_after_gc,2 + lto bit_counter,2 + lto n_free_words_after_mark,2 + .endif + lto garbage_collect_flag,2 + lto garbage_collect_flag,3 + lto extra_heap_size,0 + lto extra_heap,0 + lto heap_end_after_gc,3 + lto flags,7 + lto garbage_collect_string_1,0 + lto stack_p,1 + lto garbage_collect_string_2,0 + lto halt_sp,2 + lto garbage_collect_string_3,0 + lto stack_p,2 + lto ab_stack_size,5 +.endif @ @ the garbage collector @@ -1472,7 +1714,8 @@ add_IO_time: collect_3: str lr,[sp,#-4]! .ifdef PROFILE - ldr r8,=garbage_collector_name + lao r8,garbage_collector_name,0 + otoa r8,garbage_collector_name,0 str pc,[sp,#-4]! bl profile_s .endif @@ -1493,7 +1736,8 @@ collect_3: collect_2: str lr,[sp,#-4]! .ifdef PROFILE - ldr r8,=garbage_collector_name + lao r8,garbage_collector_name,1 + otoa r8,garbage_collector_name,1 str pc,[sp,#-4]! bl profile_s .endif @@ -1512,7 +1756,8 @@ collect_2: collect_1: str lr,[sp,#-4]! .ifdef PROFILE - ldr r8,=garbage_collector_name + lao r8,garbage_collector_name,2 + otoa r8,garbage_collector_name,2 str pc,[sp,#-4]! bl profile_s .endif @@ -1528,7 +1773,8 @@ collect_1: .ifdef PROFILE collect_0: str lr,[sp,#-4]! - ldr r8,=garbage_collector_name + lao r8,garbage_collector_name,3 + otoa r8,garbage_collector_name,3 str pc,[sp,#-4]! bl profile_s bl collect_0_ @@ -1541,36 +1787,36 @@ collect_0: collect_0_: stmdb sp!,{r0-r4,lr} - ldr r12,=heap_end_after_gc - ldr r12,[r12] + lao r12,heap_end_after_gc,1 + ldo r12,r12,heap_end_after_gc,1 sub r8,r12,r10 lsr r8,r8,#2 sub r8,r8,r5 - ldr r12,=n_allocated_words - str r8,[r12] + lao r12,n_allocated_words,0 + sto r8,r12,n_allocated_words,0 .if MARK_AND_COPY_GC - ldr r12,=flags - ldrb r12,[r12] + lao r12,flags,6 + ldo r12,r12,flags,6 tst r12,#64 beq no_mark3 .endif .if MARK_GC - ldr r12,=bit_counter - ldr r8,[r12] + lao r12,bit_counter,0 + ldo r8,r12,bit_counter,0 cmp r8,#0 beq no_scan mov r3,#0 str r9,[sp,#-4]! - ldr r12,=n_allocated_words - ldr r9,[r12] - ldr r12,=bit_vector_p - ldr r6,[r12] - ldr r12,=n_free_words_after_mark - ldr r2,[r12] + lao r12,n_allocated_words,1 + ldo r9,r12,n_allocated_words,1 + lao r12,bit_vector_p,0 + ldo r6,r12,bit_vector_p,0 + lao r12,n_free_words_after_mark,0 + ldo r2,r12,n_free_words_after_mark,0 scan_bits: ldr r12,[r6] @@ -1613,27 +1859,27 @@ end_zero_bits: blo scan_bits found_free_memory: - ldr r12,=bit_counter - str r8,[r12] - ldr r12,=bit_vector_p - str r6,[r12] - ldr r12,=n_free_words_after_mark - str r2,[r12] + lao r12,bit_counter,1 + sto r8,r12,bit_counter,1 + lao r12,bit_vector_p,1 + sto r6,r12,bit_vector_p,1 + lao r12,n_free_words_after_mark,1 + sto r2,r12,n_free_words_after_mark,1 sub r5,r4,r9 add r8,r7,#-4 - ldr r12,=heap_vector - ldr r12,[r12] + lao r12,heap_vector,1 + ldo r12,r12,heap_vector,1 subs r8,r8,r12 lsl r8,r8,#5 - ldr r12,=heap_p3 - ldr r10,[r12] + lao r12,heap_p3,1 + ldo r10,r12,heap_p3,1 add r10,r10,r8 add r8,r10,r4,lsl #2 - ldr r12,=heap_end_after_gc - str r8,[r12] + lao r12,heap_end_after_gc,2 + sto r8,r12,heap_end_after_gc,2 ldr r9,[sp],#4 @@ -1650,10 +1896,10 @@ end_bits2: end_scan: ldr r9,[sp],#4 - ldr r12,=bit_counter - str r8,[r12] - ldr r12,=n_free_words_after_mark - str r2,[r12] + lao r12,bit_counter,2 + sto r8,r12,bit_counter,2 + lao r12,n_free_words_after_mark,2 + sto r2,r12,n_free_words_after_mark,2 no_scan: .endif @@ -1664,26 +1910,29 @@ no_scan: no_mark3: .endif - ldr r12,=garbage_collect_flag - ldrsb r4,[r12] + lao r12,garbage_collect_flag,2 + ldosb r4,r12,garbage_collect_flag,2 cmp r4,#0 ble collect +.ifdef PIC + lao r12,garbage_collect_flag,3 +.endif sub r4,r4,#2 - strb r4,[r12] + stob r4,r12,garbage_collect_flag,3 - ldr r12,=extra_heap_size - ldr r3,[r12] + lao r12,extra_heap_size,0 + ldo r3,r12,extra_heap_size,0 cmp r8,r3 bhi collect sub r5,r3,r8 - ldr r12,=extra_heap - ldr r10,[r12] + lao r12,extra_heap,0 + ldo r10,r12,extra_heap,0 add r3,r10,r3,lsl #2 - ldr r12,=heap_end_after_gc - str r3,[r12] + lao r12,heap_end_after_gc,3 + sto r3,r12,heap_end_after_gc,3 ldmia sp!,{r0-r4,pc} @@ -1691,43 +1940,46 @@ collect: str pc,[sp,#-4]! bl add_execute_time - ldr r12,=flags - ldr r12,[r12] + lao r12,flags,7 + ldo r12,r12,flags,7 tst r12,#4 beq no_print_stack_sizes - ldr r0,=garbage_collect_string_1 + lao r0,garbage_collect_string_1,0 + otoa r0,garbage_collect_string_1,0 bl ew_print_string mov r4,r9 - ldr r12,=stack_p - ldr r12,[r12] + lao r12,stack_p,1 + ldo r12,r12,stack_p,1 sub r0,r4,r12 bl ew_print_int - ldr r0,=garbage_collect_string_2 + lao r0,garbage_collect_string_2,0 + otoa r0,garbage_collect_string_2,0 bl ew_print_string - ldr r12,=halt_sp - ldr r4,[r12] + lao r12,halt_sp,2 + ldo r4,r12,halt_sp,2 sub r0,r4,sp bl ew_print_int - ldr r0,=garbage_collect_string_3 + lao r0,garbage_collect_string_3,0 + otoa r0,garbage_collect_string_3,0 bl ew_print_string no_print_stack_sizes: - ldr r12,=stack_p - ldr r4,[r12] - ldr r12,=ab_stack_size - ldr r12,[r12] + lao r12,stack_p,2 + ldo r4,r12,stack_p,2 + lao r12,ab_stack_size,5 + ldo r12,r12,ab_stack_size,5 add r4,r4,r12 cmp r9,r4 bhi stack_overflow .if MARK_AND_COPY_GC - ldr r12,=flags - ldr r12,[r12] + lao r12,flags,8 + ldo r12,r12,flags,8 tst r12,#64 bne compacting_collector .else @@ -1737,55 +1989,55 @@ no_print_stack_sizes: .endif .if MARK_AND_COPY_GC || !MARK_GC - ldr r12,=garbage_collect_flag - ldrb r12,[r12] + lao r12,garbage_collect_flag,4 + ldosb r12,r12,garbage_collect_flag,4 cmp r12,#0 bne compacting_collector - ldr r12,=heap_copied_vector - ldr r8,[r12] + lao r12,heap_copied_vector,1 + ldo r8,r12,heap_copied_vector,1 - ldr r12,=heap_end_after_copy_gc - ldr r12,[r12] + lao r12,heap_end_after_copy_gc,1 + ldo r12,r12,heap_end_after_copy_gc,1 cmp r12,#0 beq zero_all mov r4,r10 - ldr r12,=heap_p1 - ldr r12,[r12] + lao r12,heap_p1,1 + ldo r12,r12,heap_p1,1 subs r4,r4,r12 add r4,r4,#63*4 lsr r4,r4,#8 str pc,[sp,#-4]! bl zero_bit_vector - ldr r12,=heap_end_after_copy_gc - ldr r7,[r12] - ldr r12,=heap_p1 - ldr r12,[r12] + lao r12,heap_end_after_copy_gc,2 + ldo r7,r12,heap_end_after_copy_gc,2 + lao r12,heap_p1,2 + ldo r12,r12,heap_p1,2 subs r7,r7,r12 lsr r7,r7,#6 and r7,r7,#-4 - ldr r12,=heap_copied_vector - ldr r8,[r12] - ldr r12,=heap_copied_vector_size - ldr r4,[r12] + lao r12,heap_copied_vector,2 + ldo r8,r12,heap_copied_vector,2 + lao r12,heap_copied_vector_size,2 + ldo r4,r12,heap_copied_vector_size,2 add r8,r8,r7 subs r4,r4,r7 lsr r4,r4,#2 - ldr r12,=heap_end_after_copy_gc + lao r12,heap_end_after_copy_gc,3 mov r14,#0 - str r14,[r12] + sto r14,r12,heap_end_after_copy_gc,3 str pc,[sp,#-4]! bl zero_bit_vector b end_zero_bit_vector zero_all: - ldr r12,=heap_copied_vector_size - ldr r4,[r12] + lao r12,heap_copied_vector_size,3 + ldo r4,r12,heap_copied_vector_size,3 lsr r4,r4,#2 str pc,[sp,#-4]! bl zero_bit_vector @@ -1795,8 +2047,8 @@ end_zero_bit_vector: .include "armcopy.s" .if WRITE_HEAP - ldr r12,=heap2_begin_and_end - str r9,[r12] + lao r12,heap2_begin_and_end,0 + sto r9,r12,heap2_begin_and_end,0 .endif sub r8,r9,r10 @@ -1807,16 +2059,16 @@ end_zero_bit_vector: str pc,[sp,#-4]! bl add_garbage_collect_time - ldr r12,=n_allocated_words - ldr r12,[r12] + lao r12,n_allocated_words,2 + ldo r12,r12,n_allocated_words,2 subs r8,r8,r12 mov r5,r8 bls switch_to_mark_scan add r4,r8,r8,lsl #2 lsl r4,r4,#5 - ldr r3,=heap_size - ldr r3,[r3] + lao r3,heap_size,4 + ldo r3,r3,heap_size,4 mov r6,r3 lsl r3,r3,#2 add r3,r3,r6 @@ -1827,65 +2079,65 @@ end_zero_bit_vector: @ b no_mark_scan switch_to_mark_scan: - ldr r12,=heap_size_33 - ldr r4,[r12] + lao r12,heap_size_33,2 + ldo r4,r12,heap_size_33,2 lsl r4,r4,#5 - ldr r12,=heap_p - ldr r3,[r12] + lao r12,heap_p,1 + ldo r3,r12,heap_p,1 - ldr r12,=heap_p1 - ldr r6,[r12] - ldr r12,=heap_p2 - ldr r12,[r12] + lao r12,heap_p1,3 + ldo r6,r12,heap_p1,3 + lao r12,heap_p2,1 + ldo r12,r12,heap_p2,1 cmp r6,r12 bcc vector_at_begin vector_at_end: - ldr r12,=heap_p3 - str r3,[r12] + lao r12,heap_p3,2 + sto r3,r12,heap_p3,2 add r3,r3,r4 - ldr r12,=heap_vector - str r3,[r12] + lao r12,heap_vector,2 + sto r3,r12,heap_vector,2 - ldr r12,=heap_p1 - ldr r4,[r12] - ldr r12,=extra_heap - str r4,[r12] + lao r12,heap_p1,4 + ldo r4,r12,heap_p1,4 + lao r12,extra_heap,1 + sto r4,r12,extra_heap,1 subs r3,r3,r4 lsr r3,r3,#2 - ldr r12,=extra_heap_size - str r3,[r12] + lao r12,extra_heap_size,1 + sto r3,r12,extra_heap_size,1 b switch_to_mark_scan_2 vector_at_begin: - ldr r12,=heap_vector - str r3,[r12] - ldr r12,=heap_size - ldr r12,[r12] + lao r12,heap_vector,3 + sto r3,r12,heap_vector,3 + lao r12,heap_size,5 + ldo r12,r12,heap_size,5 add r3,r3,r12 subs r3,r3,r4 - ldr r12,=heap_p3 - str r3,[r12] + lao r12,heap_p3,3 + sto r3,r12,heap_p3,3 - ldr r12,=extra_heap - str r3,[r12] - ldr r12,=heap_p2 - ldr r6,[r12] + lao r12,extra_heap,2 + sto r3,r12,extra_heap,2 + lao r12,heap_p2,2 + ldo r6,r12,heap_p2,2 subs r6,r6,r3 lsr r6,r6,#2 - ldr r12,=extra_heap_size - str r6,[r12] + lao r12,extra_heap_size,2 + sto r6,r12,extra_heap_size,2 switch_to_mark_scan_2: - ldr r4,=heap_size - ldr r4,[r4] + lao r4,heap_size,6 + ldo r4,r4,heap_size,6 lsr r4,r4,#3 sub r4,r4,r8 lsl r4,r4,#2 - ldr r12,=garbage_collect_flag + lao r12,garbage_collect_flag,5 mov r11,#1 - strb r11,[r12] + stob r11,r12,garbage_collect_flag,5 cmp r8,#0 bpl end_garbage_collect @@ -1893,48 +2145,48 @@ switch_to_mark_scan_2: mov r11,#-1 strb r11,[r12] - ldr r12,=extra_heap_size - ldr r3,[r12] + lao r12,extra_heap_size,3 + ldo r3,r12,extra_heap_size,3 mov r4,r3 - ldr r12,=n_allocated_words - ldr r12,[r12] + lao r12,n_allocated_words,3 + ldo r12,r12,n_allocated_words,3 subs r4,r4,r12 bmi out_of_memory_4 - ldr r12,=extra_heap - ldr r10,[r12] + lao r12,extra_heap,3 + ldo r10,r12,extra_heap,3 lsl r3,r3,#2 add r3,r3,r10 - ldr r12,=heap_end_after_gc - str r3,[r12] + lao r12,heap_end_after_gc,4 + sto r3,r12,heap_end_after_gc,4 .if WRITE_HEAP - ldr r12,=heap_end_write_heap - str r10,[r12] - ldr r12,=d3_flag_write_heap + lao r12,heap_end_write_heap,0 + sto r10,r12,heap_end_write_heap,0 + lao r12,d3_flag_write_heap,0 mov r11,#1 - str r11,[r12] + sto r11,r12,d3_flag_write_heap,0 b end_garbage_collect_ .else b end_garbage_collect .endif no_mark_scan: @ exchange the semi_spaces - ldr r12,=heap_p1 - ldr r4,[r12] - ldr r12,=heap_p2 - ldr r3,[r12] - ldr r12,=heap_p2 - str r4,[r12] - ldr r12,=heap_p1 - str r3,[r12] - - ldr r12,=heap_size_129 - ldr r4,[r12] + lao r12,heap_p1,5 + ldo r4,r12,heap_p1,5 + lao r12,heap_p2,3 + ldo r3,r12,heap_p2,3 + lao r12,heap_p2,4 + sto r4,r12,heap_p2,4 + lao r12,heap_p1,6 + sto r3,r12,heap_p1,6 + + lao r12,heap_size_129,2 + ldo r4,r12,heap_size_129,2 lsl r4,r4,#6-2 .ifdef MUNMAP - ldr r12,=heap_p2 - ldr r3,[r12] + lao r12,heap_p2,5 + ldo r3,r12,heap_p2,5 add r6,r3,r4,lsl #2 add r3,r3,#4095 and r3,r3,#-4096 @@ -1960,8 +2212,8 @@ no_pages: .if ADJUST_HEAP_SIZE mov r6,r4 - ldr r12,=heap_size_multiple - ldr r12,[r12] + lao r12,heap_size_multiple,0 + ldo r12,r12,heap_size_multiple,0 umull r4,r7,r12,r4 lsr r4,r4,#9 orr r4,r4,r7,lsl #32-9 @@ -1977,13 +2229,13 @@ not_too_small1: sub r5,r5,r3 lsl r3,r3,#2 - ldr r12,=heap_end_after_gc - ldr r8,[r12] - ldr r12,=heap_end_after_copy_gc - str r8,[r12] + lao r12,heap_end_after_gc,5 + ldo r8,r12,heap_end_after_gc,5 + lao r12,heap_end_after_copy_gc,4 + sto r8,r12,heap_end_after_copy_gc,4 sub r8,r8,r3 - ldr r12,=heap_end_after_gc - str r8,[r12] + lao r12,heap_end_after_gc,6 + sto r8,r12,heap_end_after_gc,6 no_small_heap1: mov r4,r6 @@ -1994,30 +2246,32 @@ no_small_heap1: end_garbage_collect: .if WRITE_HEAP - ldr r12,=heap_end_write_heap - str r10,[r12] - ldr r12,=d3_flag_write_heap + lao r12,heap_end_write_heap,1 + sto r10,r12,heap_end_write_heap,1 + lao r12,d3_flag_write_heap,1 mov r11,#0 - str r11,[r12] + sto r11,r12,d3_flag_write_heap,1 end_garbage_collect_: .endif str r4,[sp,#-4]! - ldr r12,=flags - ldr r12,[r12] + lao r12,flags,9 + ldo r12,r12,flags,9 tst r12,#2 beq no_heap_use_message str r4,[sp,#-4]! - ldr r0,=heap_use_after_gc_string_1 + lao r0,heap_use_after_gc_string_1,0 + otoa r0,heap_use_after_gc_string_1,0 bl ew_print_string ldr r0,[sp],#4 bl ew_print_int - ldr r0,=heap_use_after_gc_string_2 + lao r0,heap_use_after_gc_string_2,0 + otoa r0,heap_use_after_gc_string_2,0 bl ew_print_string no_heap_use_message: @@ -2031,13 +2285,13 @@ no_heap_use_message: .if WRITE_HEAP @ Check whether memory profiling is on or off - ldr r12,=flags - ldrb r12,[r12] + lao r12,flags,10 + ldo r12,r12,flags,10 tst r12,#32 beq no_write_heap - ldr r12,=min_write_heap_size - ldr r12,[r12] + lao r12,min_write_heap_size,0 + ldo r12,r12,min_write_heap_size,0 cmp r4,r12 blo no_write_heap @@ -2049,28 +2303,31 @@ no_heap_use_message: subs sp,sp,#64 - ldr r12,=d3_flag_write_heap - ldr r4,[r12] + lao r12,d3_flag_write_heap,2 + ldo r4,r12,d3_flag_write_heap,2 tst r4,r4 bne copy_to_compact_with_alloc_in_extra_heap - ldr r4,=garbage_collect_flag - ldrsb r4,[r4] + lao r4,garbage_collect_flag,6 + ldosb r4,r4,garbage_collect_flag,6 - ldr r12,=heap2_begin_and_end - ldr r6,[r12] - ldr r12,=heap2_begin_and_end+4 - ldr r7,[r12] + lao r12,heap2_begin_and_end,1 + ldo r6,r12,heap2_begin_and_end,1 + laol r12,heap2_begin_and_end+4,heap2_begin_and_end_o_4,0 + ldo r7,r12,heap2_begin_and_end_o_4,0 - ldr r3,=heap_p1 + lao r3,heap_p1,7 + otoa r3,heap_p1,7 tst r4,r4 beq gc0 - ldr r3,=heap_p2 + lao r3,heap_p2,6 + otoa r3,heap_p2,6 bgt gc1 - ldr r3,=heap_p3 + lao r3,heap_p3,4 + otoa r3,heap_p3,4 mov r6,#0 mov r7,#0 @@ -2088,8 +2345,8 @@ gc1: ? movl a0,8(d0) // heap2_begin ? movl a1,12(d0) // heap2_end - ldr r12,=stack_p - ldr r3,[r12] + lao r12,stack_p,3 + ldo r3,r12,stack_p,3 ? movl d1,16(d0) // stack_begin ? movl a3,20(d0) // stack_end @@ -2122,15 +2379,130 @@ no_write_heap: ldmia sp!,{r0-r4,pc} +.ifdef PIC + .if MARK_AND_COPY_GC + lto flags,8 + .endif + .if MARK_AND_COPY_GC || !MARK_GC + lto garbage_collect_flag,4 + lto heap_copied_vector,1 + lto heap_end_after_copy_gc,1 + lto heap_p1,1 + lto heap_end_after_copy_gc,2 + lto heap_p1,2 + lto heap_copied_vector,2 + lto heap_copied_vector_size,2 + lto heap_end_after_copy_gc,3 + lto heap_copied_vector_size,3 + .endif + .if WRITE_HEAP + lto heap2_begin_and_end,0 + .endif + lto n_allocated_words,2 + lto heap_size,4 + lto heap_size_33,2 + lto heap_p,1 + lto heap_p1,3 + lto heap_p2,1 + lto heap_p3,2 + lto heap_vector,2 + lto heap_p1,4 + lto extra_heap,1 + lto extra_heap_size,1 + lto heap_vector,3 + lto heap_size,5 + lto heap_p3,3 + lto extra_heap,2 + lto heap_p2,2 + lto extra_heap_size,2 + lto heap_size,6 + lto garbage_collect_flag,5 + lto extra_heap_size,3 + lto n_allocated_words,3 + lto extra_heap,3 + lto heap_end_after_gc,4 + .if WRITE_HEAP + lto heap_end_write_heap,0 + lto d3_flag_write_heap,0 + .endif + lto heap_p1,5 + lto heap_p2,3 + lto heap_p2,4 + lto heap_p1,6 + lto heap_size_129,2 + .ifdef MUNMAP + lto heap_p2,5 + .endif + .if ADJUST_HEAP_SIZE + lto heap_size_multiple,0 + lto heap_end_after_gc,5 + lto heap_end_after_copy_gc,4 + lto heap_end_after_gc,6 + .endif + .if WRITE_HEAP + lto heap_end_write_heap,1 + lto d3_flag_write_heap,1 + .endif + lto flags,9 + lto heap_use_after_gc_string_1,0 + lto heap_use_after_gc_string_2,0 + .if WRITE_HEAP + lto flags,10 + lto min_write_heap_size,0 + lto d3_flag_write_heap,2 + lto garbage_collect_flag,6 + lto heap2_begin_and_end,1 + ltol heap2_begin_and_end+4,heap2_begin_and_end_o_4,0 + lto heap_p1,7 + lto heap_p2,6 + lto heap_p3,4 + lto stack_p,3 + .endif +.endif .ltorg +.ifdef PIC + .if FINALIZERS + lto free_finalizer_list,1 + ltol __Nil-4,__Nil_o_m4,1 + lto free_finalizer_list,2 + ltol __Nil-4,__Nil_o_m4,2 + .endif + .if WRITE_HEAP + lto heap2_begin_and_end,2 + ltol heap2_begin_and_end+4,heap2_begin_and_end_o_4,1 + lto heap_p2,7 + .endif + lto out_of_memory_string_4,0 + lto stack_top,0 + lto heap_vector,4 + .if MARK_GC + .if MARK_AND_COPY_GC + lto flags,11 + .endif + lto zero_bits_before_mark,0 + .endif + lto heap_size_33,3 + .if MARK_GC + .if MARK_AND_COPY_GC + lto flags,12 + .endif + lto n_last_heap_free_bytes,0 + lto n_free_words_after_mark,3 + .endif + .if ADJUST_HEAP_SIZE + lto bit_vector_size,1 + lto heap_size_multiple,1 + .endif +.endif .if FINALIZERS call_finalizers: - ldr r12,=free_finalizer_list - ldr r4,[r12] + lao r12,free_finalizer_list,1 + ldo r4,r12,free_finalizer_list,1 call_finalizers_lp: - ldr r12,=__Nil-4 + laol r12,__Nil-4,__Nil_o_m4,1 + otoa r12,__Nil_o_m4,1 cmp r4,r12 beq end_call_finalizers ldr r12,[r4,#4] @@ -2144,19 +2516,21 @@ call_finalizers_lp: ldr r4,[sp],#4 b call_finalizers_lp end_call_finalizers: - ldr r12,=free_finalizer_list - ldr r11,=__Nil-4 - str r11,[r12] + lao r12,free_finalizer_list,2 + laol r11,__Nil-4,__Nil_o_m4,2 + otoa r11,__Nil_o_m4,2 + sto r11,r12,free_finalizer_list,2 ldr pc,[sp],#4 .endif .if WRITE_HEAP copy_to_compact_with_alloc_in_extra_heap: - ldr r12,=heap2_begin_and_end - ldr r6,[r12] - ldr r12,=heap2_begin_and_end+4 - ldr r7,[r12] - ldr r3,=heap_p2 + lao r12,heap2_begin_and_end,2 + ldo r6,r12,heap2_begin_and_end,2 + laol r12,heap2_begin_and_end+4,heap2_begin_and_end_o_4,1 + ldo r7,r12,heap2_begin_and_end_o_4,1 + lao r3,heap_p2,7 + otoa r3,heap_p2,7 b gc1 .endif @@ -2164,7 +2538,8 @@ out_of_memory_4: str pc,[sp,#-4]! bl add_garbage_collect_time - ldr r8,=out_of_memory_string_4 + lao r8,out_of_memory_string_4,0 + otoa r8,out_of_memory_string_4,0 b print_error zero_bit_vector: @@ -2251,20 +2626,21 @@ st_reorder_lp: compacting_collector: @ zero all mark bits - ldr r12,=stack_top - str r9,[r12] + lao r12,stack_top,0 + sto r9,r12,stack_top,0 - ldr r12,=heap_vector - ldr r10,[r12] + lao r12,heap_vector,4 + ldo r10,r12,heap_vector,4 .if MARK_GC .if MARK_AND_COPY_GC - ldr r12,=flags - ldrb r12,[r12] + lao r12,flags,11 + ldo r12,r12,flags,11 tst r12,#64 beq no_mark4 .endif - ldr r12,=zero_bits_before_mark + lao r12,zero_bits_before_mark,0 + otoa r12,zero_bits_before_mark,0 ldr r11,[r12] cmp r11,#0 beq no_zero_bits @@ -2278,8 +2654,8 @@ no_mark4: .endif mov r8,r10 - ldr r12,=heap_size_33 - ldr r4,[r12] + lao r12,heap_size_33,3 + ldo r4,r12,heap_size_33,3 add r4,r4,#3 lsr r4,r4,#2 @@ -2311,16 +2687,16 @@ zero_bits_5: .if MARK_GC .if MARK_AND_COPY_GC - ldr r12,=flags - ldrb r12,[r12] + lao r12,flags,12 + ldo r12,r12,flags,12 tst r12,#64 beq no_mark5 .endif no_zero_bits: - ldr r12,=n_last_heap_free_bytes - ldr r4,[r12] - ldr r12,=n_free_words_after_mark - ldr r3,[r12] + lao r12,n_last_heap_free_bytes,0 + ldo r4,r12,n_last_heap_free_bytes,0 + lao r12,n_free_words_after_mark,3 + ldo r3,r12,n_free_words_after_mark,3 .if 1 lsr r4,r4,#2 @@ -2335,14 +2711,14 @@ no_zero_bits: bgt compact_gc .if ADJUST_HEAP_SIZE - ldr r12,=bit_vector_size - ldr r3,[r12] + lao r12,bit_vector_size,1 + ldo r3,r12,bit_vector_size,1 lsl r3,r3,#2 sub r4,r3,r4 - ldr r12,=heap_size_multiple - ldr r12,[r12] + lao r12,heap_size_multiple,1 + ldo r12,r12,heap_size_multiple,1 umull r4,r7,r12,r4 lsr r4,r4,#7 orr r4,r4,r7,lsl #32-7 @@ -2361,16 +2737,22 @@ no_smaller_heap: .include "armmark.s" +.ifdef PIC + lto zero_bits_before_mark,1 + lto n_last_heap_free_bytes,1 + lto n_free_words_after_mark,4 +.endif + compact_gc: - ldr r12,=zero_bits_before_mark + lao r12,zero_bits_before_mark,1 mov r11,#1 - str r11,[r12] - ldr r12,=n_last_heap_free_bytes + sto r11,r12,zero_bits_before_mark,1 + lao r12,n_last_heap_free_bytes,1 mov r11,#0 - str r11,[r12] - ldr r12,=n_free_words_after_mark + sto r11,r12,n_last_heap_free_bytes,1 + lao r12,n_free_words_after_mark,4 mov r11,#1000 - str r11,[r12] + sto r11,r12,n_free_words_after_mark,4 .if MARK_AND_COPY_GC no_mark5: .endif @@ -2378,24 +2760,24 @@ no_mark5: .include "armcompact.s" - ldr r12,=stack_top - ldr r9,[r12] + lao r12,stack_top,1 + ldo r9,r12,stack_top,1 - ldr r12,=heap_size_33 - ldr r3,[r12] + lao r12,heap_size_33,4 + ldo r3,r12,heap_size_33,4 lsl r3,r3,#5 - ldr r12,=heap_p3 - ldr r12,[r12] + lao r12,heap_p3,5 + ldo r12,r12,heap_p3,5 add r3,r3,r12 - ldr r12,=heap_end_after_gc - str r3,[r12] + lao r12,heap_end_after_gc,7 + sto r3,r12,heap_end_after_gc,7 subs r3,r3,r10 lsr r3,r3,#2 - ldr r12,=n_allocated_words - ldr r12,[r12] + lao r12,n_allocated_words,4 + ldo r12,r12,n_allocated_words,4 subs r3,r3,r12 mov r5,r3 bcc out_of_memory_4 @@ -2405,8 +2787,8 @@ no_mark5: bhs not_out_of_memory add r4,r3,r3,lsl #2 lsl r4,r4,#3 - ldr r12,=heap_size - ldr r12,[r12] + lao r12,heap_size,7 + ldo r12,r12,heap_size,7 cmp r4,r12 bcc out_of_memory_4 not_out_of_memory: @@ -2414,25 +2796,25 @@ not_out_of_memory: .if MARK_GC || COMPACT_GC_ONLY .if MARK_GC && ADJUST_HEAP_SIZE .if MARK_AND_COPY_GC - ldr r12,=flags - ldrb r12,[r12] + lao r12,flags,13 + ldo r12,r12,flags,13 tst r12,#64 beq no_mark_6 .endif - ldr r12,=heap_p3 - ldr r4,[r12] + lao r12,heap_p3,6 + ldo r4,r12,heap_p3,6 sub r4,r10,r4 - ldr r12,=n_allocated_words - ldr r3,[r12] + lao r12,n_allocated_words,5 + ldo r3,r12,n_allocated_words,5 add r4,r4,r3,lsl #2 - ldr r12,=heap_size_33 - ldr r3,[r12] + lao r12,heap_size_33,5 + ldo r3,r12,heap_size_33,5 lsl r3,r3,#5 - ldr r12,=heap_size_multiple - ldr r12,[r12] + lao r12,heap_size_multiple,2 + ldo r12,r12,heap_size_multiple,2 umull r4,r7,r12,r4 lsr r4,r4,#8 orr r4,r4,r7,lsl #32-8 @@ -2449,7 +2831,8 @@ not_too_small2: subs r6,r6,r4 blo no_small_heap2 - ldr r12,=heap_end_after_gc + lao r12,heap_end_after_gc,8 + otoa r12,heap_end_after_gc,8 ldr r11,[r12] sub r11,r11,r6 str r11,[r12] @@ -2460,8 +2843,8 @@ not_too_small2: no_small_heap2: lsr r3,r3,#2 - ldr r12,=bit_vector_size - str r3,[r12] + lao r12,bit_vector_size,2 + sto r3,r12,bit_vector_size,2 .if MARK_AND_COPY_GC no_mark_6: @@ -2471,57 +2854,57 @@ no_mark_6: .else @ to do prevent overflow lsl r4,r4,#2 - ldr r12,=heap_size - ldr r12,[r12] + lao r12,heap_size,8 + ldo r12,r12,heap_size,8 lsl r6,r12,#5 sub r6,r6,r12 cmp r4,r6 ble no_copy_garbage_collection - ldr r12,=heap_p - ldr r4,[r12] - ldr r12,=heap_p1 - str r4,[r12] + lao r12,heap_p,2 + ldo r4,r12,heap_p,2 + lao r12,heap_p1,8 + sto r4,r12,heap_p1,8 - ldr r12,=heap_size_129 - ldr r3,[r12] + lao r12,heap_size_129,3 + lto r3,r12,heap_size_129,3 lsl r3,r3,#6 add r4,r4,r3 - ldr r12,=heap_copied_vector - str r4,[r12] - ldr r12,=heap_end_after_gc - str r4,[r12] - ldr r12,=heap_copied_vector_size - ldr r3,[r12] + lao r12,heap_copied_vector,3 + sto r4,r12,heap_copied_vector,3 + lao r12,heap_end_after_gc,9 + sto r4,r12,heap_end_after_gc,9 + lao r12,heap_copied_vector_size,4 + ldo r3,r12,heap_copied_vector_size,4 add r3,r3,r4 - ldr r12,=heap_p2 - str r3,[r12] + lao r12,heap_p2,8 + sto r3,r12,heap_p2,8 - ldr r12,=heap_p3 - ldr r4,[r12] - ldr r12,=heap_vector - ldr r12,[r12] + lao r12,heap_p3,7 + ldo r4,r12,heap_p3,7 + lao r12,heap_vector,5 + ldo r12,r12,heap_vector,5 cmp r4,r12 ble vector_at_end_2 - ldr r12,=heap_vector - ldr r3,[r12] - ldr r12,=extra_heap - str r3,[r12] + lao r12,heap_vector,6 + ldo r3,r12,heap_vector,6 + lao r12,extra_heap,4 + sto r3,r12,extra_heap,4 subs r4,r4,r3 lsr r4,r4,#2 - ldr r12,=extra_heap_size - str r4,[r12] + lao r12,extra_heap_size,4 + sto r4,r12,extra_heap_size,4 - ldr r12,=garbage_collect_flag + lao r12,garbage_collect_flag,7 mov r11,#2 - strb r11,[r12] + stob r11,r12,garbage_collect_flag,7 b no_copy_garbage_collection vector_at_end_2: - ldr r12,=garbage_collect_flag + lao r12,garbage_collect_flag,8 mov r11,#0 - strb r11,[r12] + stob r11,r12,garbage_collect_flag,8 .endif no_copy_garbage_collection: @@ -2529,11 +2912,11 @@ no_copy_garbage_collection: bl add_garbage_collect_time mov r4,r10 - ldr r12,=heap_p3 - ldr r12,[r12] + lao r12,heap_p3,8 + ldo r12,r12,heap_p3,8 subs r4,r4,r12 - ldr r12,=n_allocated_words - ldr r3,[r12] + lao r12,n_allocated_words,6 + ldo r3,r12,n_allocated_words,6 add r4,r4,r3,lsl #2 b end_garbage_collect @@ -2541,19 +2924,22 @@ stack_overflow: str pc,[sp,#-4]! bl add_execute_time - ldr r8,=stack_overflow_string + lao r8,stack_overflow_string,0 + otoa r8,stack_overflow_string,0 b print_error IO_error: str r0,[sp] - ldr r0,=IO_error_string + lao r0,IO_error_string,0 + otoa r0,IO_error_string,0 bl ew_print_string ldr r0,[sp],#4 bl ew_print_string - ldr r0,=new_line_string + lao r0,new_line_string,0 + otoa r0,new_line_string,0 bl ew_print_string b halt @@ -2563,8 +2949,8 @@ print_error: bl ew_print_string halt: - ldr r12,=halt_sp - ldr sp,[r12] + lao r12,halt_sp,3 + ldo sp,r12,halt_sp,3 .ifdef PROFILE str pc,[sp,#-4]! @@ -2573,6 +2959,49 @@ halt: b exit +.ifdef PIC + lto stack_top,1 + lto heap_size_33,4 + lto heap_p3,5 + lto heap_end_after_gc,7 + lto n_allocated_words,4 + lto heap_size,7 + .if MARK_GC || COMPACT_GC_ONLY + .if MARK_GC && ADJUST_HEAP_SIZE + .if MARK_AND_COPY_GC + lto flags,13 + .endif + lto heap_p3,6 + lto n_allocated_words,5 + lto heap_size_33,5 + lto heap_size_multiple,2 + lto heap_end_after_gc,8 + lto bit_vector_size,2 + .endif + .else + lto heap_size,8 + lto heap_p,2 + lto heap_p1,8 + lto heap_size_129,3 + lto heap_copied_vector,3 + lto heap_end_after_gc,9 + lto heap_copied_vector_size,4 + lto heap_p2,8 + lto heap_p3,7 + lto heap_vector,5 + lto heap_vector,6 + lto extra_heap,4 + lto extra_heap_size,4 + lto garbage_collect_flag,7 + lto garbage_collect_flag,8 + .endif + lto heap_p3,8 + lto n_allocated_words,6 + lto stack_overflow_string,0 + lto IO_error_string,0 + lto new_line_string,0 + lto halt_sp,3 +.endif .ltorg e__system__eaind: @@ -2598,7 +3027,11 @@ eval_fill: b e__system__eaind nop nop +.ifdef PIC + .long e__system__dind-. +.else .long e__system__dind +.endif .long -2 e__system__nind: __indirection: @@ -2619,12 +3052,13 @@ __indirection: .if MARK_GC eval_fill2: - ldr r12,=__cycle__in__spine + lao r12,__cycle__in__spine,0 + otoa r12,__cycle__in__spine,0 str r12,[r6] str r6,[r9] .if MARK_AND_COPY_GC - ldr r12,=flags - ldrb r12,[r12] + lao r12,flags,14 + ldo r12,r12,flags,14 tst r12,#64 beq __cycle__in__spine .endif @@ -2651,7 +3085,8 @@ eval_fill2: mov r8,r4 .endif eval_upd_0: - ldr r12,=__indirection + lao r12,__indirection,0 + otoa r12,__indirection,0 str r12,[r7] str r6,[r7,#4] mov pc,r11 @@ -2662,7 +3097,8 @@ eval_upd_0: mov r8,r4 .endif eval_upd_1: - ldr r12,=__indirection + lao r12,__indirection,1 + otoa r12,__indirection,1 str r12,[r7] ldr r4,[r7,#4] str r6,[r7,#4] @@ -2675,7 +3111,8 @@ eval_upd_1: mov r8,r4 .endif eval_upd_2: - ldr r12,=__indirection + lao r12,__indirection,2 + otoa r12,__indirection,2 str r12,[r7] ldr r8,[r7,#4] str r6,[r7,#4] @@ -2688,7 +3125,8 @@ eval_upd_2: mov r8,r4 .endif eval_upd_3: - ldr r12,=__indirection + lao r12,__indirection,3 + otoa r12,__indirection,3 str r12,[r7] ldr r8,[r7,#4] str r6,[r7,#4] @@ -2703,7 +3141,8 @@ eval_upd_3: mov r8,r4 .endif eval_upd_4: - ldr r12,=__indirection + lao r12,__indirection,4 + otoa r12,__indirection,4 str r12,[r7] ldr r8,[r7,#4] str r6,[r7,#4] @@ -2721,7 +3160,8 @@ eval_upd_4: mov r8,r4 .endif eval_upd_5: - ldr r12,=__indirection + lao r12,__indirection,5 + otoa r12,__indirection,5 str r12,[r7] ldr r8,[r7,#4] str r6,[r9] @@ -2741,7 +3181,8 @@ eval_upd_5: mov r8,r4 .endif eval_upd_6: - ldr r12,=__indirection + lao r12,__indirection,6 + otoa r12,__indirection,6 str r12,[r7] ldr r8,[r7,#4] str r6,[r9] @@ -2766,7 +3207,8 @@ eval_upd_7: mov r4,#0 mov r3,#20 eval_upd_n: - ldr r12,=__indirection + lao r12,__indirection,7 + otoa r12,__indirection,7 add r2,r7,r3 str r12,[r7] ldr r8,[r7,#4] @@ -3043,7 +3485,6 @@ eval_upd_32: @ @ STRINGS @ - .section .text. (catAC) catAC: ldr r4,[r6,#4] @@ -3061,7 +3502,8 @@ gc_r_3: @ fill_node str r10,[sp,#-4]! - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,1 + otoa r12,__STRING___o_2,1 str r12,[r10] @ store length @@ -3121,9 +3563,15 @@ gc_3: bl collect_2 b gc_r_3 empty_string: - ldr r6,=zero_length_string + lao r6,zero_length_string,0 + otoa r6,zero_length_string,0 ldr pc,[sp],#4 +.ifdef PIC + ltol __STRING__+2,__STRING___o_2,1 + lto zero_length_string,0 +.endif + .section .text.sliceAC,"ax" sliceAC: ldr r8,[r6,#4] @@ -3152,7 +3600,8 @@ r_gc_4: add r12,r6,#8 add r7,r12,r3 - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,2 + otoa r12,__STRING___o_2,2 str r12,[r10] str r4,[r10,#4] @@ -3179,6 +3628,10 @@ gc_4: lsr r8,r8,#2 b r_gc_4 +.ifdef PIC + ltol __STRING__+2,__STRING___o_2,2 +.endif + .section .text.updateAC,"ax" updateAC: ldr r8,[r6,#4] @@ -3198,7 +3651,8 @@ r_gc_5: mov r7,r6 mov r6,r10 - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,3 + otoa r12,__STRING___o_2,3 str r12,[r10] ldr r12,[r7,#4] add r7,r7,#8 @@ -3225,13 +3679,21 @@ gc_5: bl collect_1 b r_gc_5 update_string_error: - ldr r8,=high_index_string + lao r8,high_index_string,0 + otoa r8,high_index_string,0 tst r4,r4 bpl update_string_error_2 - ldr r8,=low_index_string + lao r8,low_index_string,0 + otoa r8,low_index_string,0 update_string_error_2: b print_error +.ifdef PIC + ltol __STRING__+2,__STRING___o_2,3 + lto high_index_string,0 + lto low_index_string,0 +.endif + .section .text.eqAC,"ax" eqAC: ldr r4,[r6,#4] @@ -3364,7 +3826,8 @@ string_to_string_node: blo string_to_string_node_gc string_to_string_node_r: - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,4 + otoa r12,__STRING___o_2,4 str r12,[r10] str r4,[r10,#4] mov r8,r10 @@ -3387,6 +3850,10 @@ string_to_string_node_gc: ldr r6,[sp],#4 b string_to_string_node_r +.ifdef PIC + ltol __STRING__+2,__STRING___o_2,4 +.endif + .section .text.int_array_to_node,"ax" int_array_to_node: ldr r4,[r6,#-8] @@ -3396,12 +3863,14 @@ int_array_to_node: blo int_array_to_node_gc int_array_to_node_r: - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,0 + otoa r12,__ARRAY___o_2,0 str r12,[r10] mov r7,r6 str r4,[r10,#4] mov r6,r10 - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,3 + otoa r12,INT_o_2,3 str r12,[r10,#8] add r10,r10,#12 b int_array_to_node_4 @@ -3421,6 +3890,11 @@ int_array_to_node_gc: ldr r6,[sp],#4 b int_array_to_node_r +.ifdef PIC + ltol __ARRAY__+2,__ARRAY___o_2,0 + ltol INT+2,INT_o_2,3 +.endif + .section .text.real_array_to_node,"ax" real_array_to_node: ldr r4,[r6,#-8] @@ -3434,11 +3908,13 @@ real_array_to_node_r: orr r10,r10,#4 addne r5,r5,#1 mov r7,r6 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,1 + otoa r12,__ARRAY___o_2,1 str r12,[r10] str r4,[r10,#4] mov r6,r10 - ldr r12,=REAL+2 + laol r12,REAL+2,REAL_o_2,2 + otoa r12,REAL_o_2,2 str r12,[r10,#8] add r10,r10,#12 b real_array_to_node_4 @@ -3462,6 +3938,12 @@ real_array_to_node_gc: ldr r6,[sp],#4 b real_array_to_node_r +.ifdef PIC + ltol __ARRAY__+2,__ARRAY___o_2,1 + ltol REAL+2,REAL_o_2,2 +.endif + .text + .p2align 2 .long 3 _c3: b __cycle__in__spine @@ -3568,10 +4050,12 @@ _create_arrayB: bl collect_0 no_collect_4574: mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,2 + otoa r12,__ARRAY___o_2,2 str r12,[r10] str r4,[r10,#4] - ldr r12,=BOOL+2 + laol r12,BOOL+2,BOOL_o_2,2 + otoa r12,BOOL_o_2,2 str r12,[r10,#8] add r12,r10,#12 add r10,r12,r3,lsl #2 @@ -3587,7 +4071,8 @@ _create_arrayC: bl collect_0 no_collect_4573: mov r6,r10 - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,5 + otoa r12,__STRING___o_2,5 str r12,[r10] str r4,[r10,#4] add r12,r10,#8 @@ -3601,10 +4086,12 @@ _create_arrayI: bl collect_0 no_collect_4572: mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,3 + otoa r12,__ARRAY___o_2,3 str r12,[r10] str r4,[r10,#4] - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,4 + otoa r12,INT_o_2,4 str r12,[r10,#8] add r12,r10,#12 add r10,r12,r4,lsl #2 @@ -3621,10 +4108,12 @@ no_collect_4580: orr r10,r10,#4 addne r5,r5,#1 mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,4 + otoa r12,__ARRAY___o_2,4 str r12,[r10] str r4,[r10,#4] - ldr r12,=REAL+2 + laol r12,REAL+2,REAL_o_2,3 + otoa r12,REAL_o_2,3 str r12,[r10,#8] add r12,r10,#12 add r10,r12,r4,lsl #3 @@ -3642,7 +4131,8 @@ _create_r_array: no_collect_4586: mov r8,r6 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,5 + otoa r12,__ARRAY___o_2,5 str r12,[r10] str r4,[r10,#4] str r3,[r10,#8] @@ -3761,10 +4251,12 @@ no_collect_4575: orr r4,r4,r4,lsl #8 orr r4,r4,r4,lsl #16 mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,6 + otoa r12,__ARRAY___o_2,6 str r12,[r10] str r7,[r10,#4] - ldr r12,=BOOL+2 + laol r12,BOOL+2,BOOL_o_2,3 + otoa r12,BOOL_o_2,3 str r12,[r10,#8] add r10,r10,#12 b create_arrayBCI @@ -3786,7 +4278,8 @@ no_collect_4578: orr r4,r4,r4,lsl #8 orr r4,r4,r4,lsl #16 mov r6,r10 - ldr r12,=__STRING__+2 + laol r12,__STRING__+2,__STRING___o_2,6 + otoa r12,__STRING___o_2,6 str r12,[r10] str r7,[r10,#4] add r10,r10,#8 @@ -3801,10 +4294,12 @@ create_arrayI: no_collect_4577: mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,7 + otoa r12,__ARRAY___o_2,7 str r12,[r10] str r3,[r10,#4] - ldr r12,=INT+2 + laol r12,INT+2,INT_o_2,5 + otoa r12,INT_o_2,5 str r12,[r10,#8] add r10,r10,#12 create_arrayBCI: @@ -3844,10 +4339,12 @@ no_collect_4579: addne r5,r5,#1 mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,8 + otoa r12,__ARRAY___o_2,8 str r12,[r10] str r4,[r10,#4] - ldr r12,=REAL+2 + laol r12,REAL+2,REAL_o_2,4 + otoa r12,REAL_o_2,4 str r12,[r10,#8] add r10,r10,#12 b st_fillr_array @@ -3871,7 +4368,8 @@ create_array: no_collect_4576: mov r3,r6 mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,9 + otoa r12,__ARRAY___o_2,9 str r12,[r10] str r4,[r10,#4] mov r12,#0 @@ -3904,7 +4402,8 @@ create_R_array_1: no_collect_4581: mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,10 + otoa r12,__ARRAY___o_2,10 str r12,[r10] str r4,[r10,#4] str r3,[r10,#8] @@ -3950,7 +4449,8 @@ create_R_array_2: no_collect_4582: mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,11 + otoa r12,__ARRAY___o_2,11 str r12,[r10] str r4,[r10,#4] str r3,[r10,#8] @@ -3995,7 +4495,8 @@ create_R_array_3: no_collect_4583: mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,12 + otoa r12,__ARRAY___o_2,12 str r12,[r10] str r4,[r10,#4] str r3,[r10,#8] @@ -4048,7 +4549,8 @@ create_R_array_4: no_collect_4584: mov r6,r10 - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,13 + otoa r12,__ARRAY___o_2,13 str r12,[r10] str r4,[r10,#4] str r3,[r10,#8] @@ -4102,7 +4604,8 @@ create_R_array_5: bl collect_0 no_collect_4585: - ldr r12,=__ARRAY__+2 + laol r12,__ARRAY__+2,__ARRAY___o_2,14 + otoa r12,__ARRAY___o_2,14 str r12,[r10] str r4,[r10,#4] str r3,[r10,#8] @@ -4309,6 +4812,45 @@ r_to_i_real: vmov r4,s0 ldr pc,[sp],#4 + .text + +.ifdef PIC + .if MARK_GC + lto __cycle__in__spine,0 + .if MARK_AND_COPY_GC + lto flags,14 + .endif + .endif + lto __indirection,0 + lto __indirection,1 + lto __indirection,2 + lto __indirection,3 + lto __indirection,4 + lto __indirection,5 + lto __indirection,6 + lto __indirection,7 + ltol __STRING__+2,__STRING___o_2,5 + ltol __STRING__+2,__STRING___o_2,6 + ltol __ARRAY__+2,__ARRAY___o_2,2 + ltol BOOL+2,BOOL_o_2,2 + ltol __ARRAY__+2,__ARRAY___o_2,3 + ltol INT+2,INT_o_2,4 + ltol __ARRAY__+2,__ARRAY___o_2,4 + ltol REAL+2,REAL_o_2,3 + ltol __ARRAY__+2,__ARRAY___o_2,5 + ltol __ARRAY__+2,__ARRAY___o_2,6 + ltol BOOL+2,BOOL_o_2,3 + ltol __ARRAY__+2,__ARRAY___o_2,7 + ltol INT+2,INT_o_2,5 + ltol __ARRAY__+2,__ARRAY___o_2,8 + ltol REAL+2,REAL_o_2,4 + ltol __ARRAY__+2,__ARRAY___o_2,9 + ltol __ARRAY__+2,__ARRAY___o_2,10 + ltol __ARRAY__+2,__ARRAY___o_2,11 + ltol __ARRAY__+2,__ARRAY___o_2,12 + ltol __ARRAY__+2,__ARRAY___o_2,13 + ltol __ARRAY__+2,__ARRAY___o_2,14 +.endif .ltorg .if NEW_DESCRIPTORS -- cgit v1.2.3