diff options
-rw-r--r-- | armap.s | 444 | ||||
-rw-r--r-- | armcompact.s | 232 | ||||
-rw-r--r-- | armcompact_rmark.s | 102 | ||||
-rw-r--r-- | armcompact_rmarkr.s | 131 | ||||
-rw-r--r-- | armcopy.s | 208 | ||||
-rw-r--r-- | armfileIO3.s | 38 | ||||
-rw-r--r-- | armmacros.s | 76 | ||||
-rw-r--r-- | armmark.s | 476 | ||||
-rw-r--r-- | armstartup.s | 1536 |
9 files changed, 2280 insertions, 963 deletions
@@ -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
@@ -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
@@ -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 |