summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--armap.s444
-rw-r--r--armcompact.s232
-rw-r--r--armcompact_rmark.s102
-rw-r--r--armcompact_rmarkr.s131
-rw-r--r--armcopy.s208
-rw-r--r--armfileIO3.s38
-rw-r--r--armmacros.s76
-rw-r--r--armmark.s476
-rw-r--r--armstartup.s1536
9 files changed, 2280 insertions, 963 deletions
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