summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2016-09-18 13:11:31 +0000
committerCamil Staps2016-09-18 13:16:54 +0000
commit640f6da450a9f088cf4b60f054d55b8380a12645 (patch)
tree551b0ab23966731bdf7bb1e86419e016811ee053
parentfix more *_real functions for ARM softfp calling convention (define SOFT_FP_CC) (diff)
.gitignore; Makefile; Add thumb2*.s as copies of arm*.s, adapt str pc,[sp,#-4]! and conditional instructions for Thumb-2
-rw-r--r--.gitignore3
-rw-r--r--Makefile.linux_thumb232
-rw-r--r--thumb2ap.s2963
-rw-r--r--thumb2compact.s1218
-rw-r--r--thumb2compact_rmark.s1012
-rw-r--r--thumb2compact_rmarkr.s1045
-rw-r--r--thumb2copy.s1332
-rw-r--r--thumb2divmod.s169
-rw-r--r--thumb2mark.s2468
-rw-r--r--thumb2startup.s5067
10 files changed, 15309 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..28c2148
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+*.o
+scon.s
+scon.s.copy
diff --git a/Makefile.linux_thumb2 b/Makefile.linux_thumb2
new file mode 100644
index 0000000..d938380
--- /dev/null
+++ b/Makefile.linux_thumb2
@@ -0,0 +1,32 @@
+
+SDIR = ./
+ODIR = ./
+
+ASFLAGS=-mfloat-abi=hard -mfpu=crypto-neon-fp-armv8 -march=armv8-a+crc -mthumb
+CFLAGS=-mfloat-abi=hard -mfpu=crypto-neon-fp-armv8 -march=armv8-a+crc -mtune=cortex-a53 -mthumb
+DEFINES=-DUSE_CLIB -DLINUX -DARM -DGNU_C -DELF
+
+all: $(ODIR)_startup.o
+
+$(ODIR)_startup.o: $(ODIR)thumb2startup.o $(ODIR)thumb2fileIO3.o $(ODIR)scon.o $(ODIR)ufileIO2.o $(ODIR)thumb2divmod.o
+ ld -r -o $(ODIR)_startup.o $(ODIR)thumb2startup.o $(ODIR)thumb2divmod.o $(ODIR)scon.o $(ODIR)thumb2fileIO3.o $(ODIR)ufileIO2.o
+
+$(ODIR)scon.o: $(SDIR)scon.c
+# gcc -c -O $(DEFINES) -o $(ODIR)scon.o $(SDIR)scon.c
+ $(CC) -O $(DEFINES) $(CFLAGS) -ffunction-sections -fdata-sections $(SDIR)scon.c -S -o $(ODIR)scon.s
+ mv $(ODIR)scon.s $(ODIR)scon.s.copy
+ grep -v -w ___main $(ODIR)scon.s.copy > $(ODIR)scon.s
+ as $(ASFLAGS) $(DEFINES_A) $(ODIR)scon.s -o $(ODIR)scon.o
+
+$(ODIR)ufileIO2.o: $(SDIR)ufileIO2.c
+ gcc -c -O $(DEFINES) -ffunction-sections -fdata-sections -o $(ODIR)ufileIO2.o $(SDIR)ufileIO2.c
+
+$(ODIR)thumb2startup.o: $(SDIR)thumb2startup.s
+ as $(ODIR)thumb2startup.s -o $(ODIR)thumb2startup.o $(ASFLAGS)
+
+$(ODIR)thumb2fileIO3.o: $(SDIR)thumb2fileIO3.s
+ as $(ODIR)thumb2fileIO3.s -o $(ODIR)thumb2fileIO3.o $(ASFLAGS)
+
+$(ODIR)thumb2divmod.o: $(SDIR)thumb2divmod.s
+ as $(ODIR)thumb2divmod.s -o $(ODIR)thumb2divmod.o $(ASFLAGS)
+
diff --git a/thumb2ap.s b/thumb2ap.s
new file mode 100644
index 0000000..db28353
--- /dev/null
+++ b/thumb2ap.s
@@ -0,0 +1,2963 @@
+
+ .text
+
+ .globl ap_2
+ .globl ap_3
+ .globl ap_4
+ .globl ap_5
+ .globl ap_6
+ .globl ap_7
+ .globl ap_8
+ .globl ap_9
+ .globl ap_10
+ .globl ap_11
+ .globl ap_12
+ .globl ap_13
+ .globl ap_14
+ .globl ap_15
+ .globl ap_16
+ .globl ap_17
+ .globl ap_18
+ .globl ap_19
+ .globl ap_20
+ .globl ap_21
+ .globl ap_22
+ .globl ap_23
+ .globl ap_24
+ .globl ap_25
+ .globl ap_26
+ .globl ap_27
+ .globl ap_28
+ .globl ap_29
+ .globl ap_30
+ .globl ap_31
+ .globl ap_32
+
+ .globl add_empty_node_2
+ .globl add_empty_node_3
+ .globl add_empty_node_4
+ .globl add_empty_node_5
+ .globl add_empty_node_6
+ .globl add_empty_node_7
+ .globl add_empty_node_8
+ .globl add_empty_node_9
+ .globl add_empty_node_10
+ .globl add_empty_node_11
+ .globl add_empty_node_12
+ .globl add_empty_node_13
+ .globl add_empty_node_14
+ .globl add_empty_node_15
+ .globl add_empty_node_16
+ .globl add_empty_node_17
+ .globl add_empty_node_18
+ .globl add_empty_node_19
+ .globl add_empty_node_20
+ .globl add_empty_node_21
+ .globl add_empty_node_22
+ .globl add_empty_node_23
+ .globl add_empty_node_24
+ .globl add_empty_node_25
+ .globl add_empty_node_26
+ .globl add_empty_node_27
+ .globl add_empty_node_28
+ .globl add_empty_node_29
+ .globl add_empty_node_30
+ .globl add_empty_node_31
+ .globl add_empty_node_32
+
+ .globl yet_args_needed
+ .globl yet_args_needed_0
+ .globl yet_args_needed_1
+ .globl yet_args_needed_2
+ .globl yet_args_needed_3
+ .globl yet_args_needed_4
+ .globl yet_args_needed_5
+ .globl yet_args_needed_6
+ .globl yet_args_needed_7
+ .globl yet_args_needed_8
+ .globl yet_args_needed_9
+ .globl yet_args_needed_10
+ .globl yet_args_needed_11
+ .globl yet_args_needed_12
+ .globl yet_args_needed_13
+ .globl yet_args_needed_14
+ .globl yet_args_needed_15
+ .globl yet_args_needed_16
+ .globl yet_args_needed_17
+ .globl yet_args_needed_18
+ .globl yet_args_needed_19
+ .globl yet_args_needed_20
+ .globl yet_args_needed_21
+ .globl yet_args_needed_22
+ .globl yet_args_needed_23
+ .globl yet_args_needed_24
+ .globl yet_args_needed_25
+ .globl yet_args_needed_26
+ .globl yet_args_needed_27
+ .globl yet_args_needed_28
+ .globl yet_args_needed_29
+ .globl yet_args_needed_30
+ .globl yet_args_needed_31
+
+ap_32:
+ ldr r11,[r8]
+ mov r3,#32*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap32
+
+ap_31:
+ ldr r11,[r8]
+ mov r3,#31*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap31
+
+ap_30:
+ ldr r11,[r8]
+ mov r3,#30*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap30
+
+ap_29:
+ ldr r11,[r8]
+ mov r3,#29*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap29
+
+ap_28:
+ ldr r11,[r8]
+ mov r3,#28*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap28
+
+ap_27:
+ ldr r11,[r8]
+ mov r3,#27*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap27
+
+ap_26:
+ ldr r11,[r8]
+ mov r3,#26*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap26
+
+ap_25:
+ ldr r11,[r8]
+ mov r3,#25*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap25
+
+ap_24:
+ ldr r11,[r8]
+ mov r3,#24*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap24
+
+ap_23:
+ ldr r11,[r8]
+ mov r3,#23*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap23
+
+ap_22:
+ ldr r11,[r8]
+ mov r3,#22*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap22
+
+ap_21:
+ ldr r11,[r8]
+ mov r3,#21*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap21
+
+ap_20:
+ ldr r11,[r8]
+ mov r3,#20*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap20
+
+ap_19:
+ ldr r11,[r8]
+ mov r3,#19*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap19
+
+ap_18:
+ ldr r11,[r8]
+ mov r3,#18*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap18
+
+ap_17:
+ ldr r11,[r8]
+ mov r3,#17*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap17
+
+ap_16:
+ ldr r11,[r8]
+ mov r3,#16*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap16
+
+ap_15:
+ ldr r11,[r8]
+ mov r3,#15*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap15
+
+ap_14:
+ ldr r11,[r8]
+ mov r3,#14*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap14
+
+ap_13:
+ ldr r11,[r8]
+ mov r3,#13*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap13
+
+ap_12:
+ ldr r11,[r8]
+ mov r3,#12*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap12
+
+ap_11:
+ ldr r11,[r8]
+ mov r3,#11*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap11
+
+ap_10:
+ ldr r11,[r8]
+ mov r3,#10*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap10
+
+ap_9:
+ ldr r11,[r8]
+ mov r3,#9*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap9
+
+ap_8:
+ ldr r11,[r8]
+ mov r3,#8*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap8
+
+ap_7:
+ ldr r11,[r8]
+ mov r3,#7*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap7
+
+ap_6:
+ ldr r11,[r8]
+ mov r3,#6*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap6
+
+ap_5:
+ ldr r11,[r8]
+ mov r3,#5*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap5
+
+ap_4:
+ ldr r11,[r8]
+ mov r3,#4*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap4
+
+ap_3:
+ ldr r11,[r8]
+ mov r3,#3*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap
+
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap3
+
+ap_2:
+ ldr r11,[r8]
+ mov r3,#2*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ bne no_fast_ap2_
+
+fast_ap_2_2_:
+ add r3,r3,r11
+ ldrh r4,[r11,#-2]
+ ldr r2,[r3,#-6]
+.ifdef PROFILE
+ sub r2,r2,#16
+.else
+ sub r2,r2,#8
+.endif
+ cmp r4,#1
+ blo repl_args_0_2
+ beq repl_args_1
+
+ cmp r4,#3
+ blo repl_args_2
+
+ str r7,[r9,#4]
+ str r6,[r9],#8
+
+ ldr r7,[r8,#8]
+
+ b fast_ap_
+
+no_fast_ap2_:
+ str r6,[r9],#4
+ mov r6,r7
+ mov r7,r8
+ b no_fast_ap2
+
+fast_ap_2_2:
+ mov r8,r7
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+ b fast_ap_2_2_
+
+fast_ap_2:
+ mov r8,r7
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+fast_ap:
+ add r3,r3,r11
+ ldrh r4,[r11,#-2]
+ ldr r2,[r3,#-6]
+.ifdef PROFILE
+ sub r2,r2,#16
+.else
+ sub r2,r2,#8
+.endif
+ cmp r4,#1
+ blo repl_args_0
+ beq repl_args_1
+
+ cmp r4,#3
+ blo repl_args_2
+
+ str r7,[r9,#4]
+ str r6,[r9],#8
+
+ ldr r7,[r8,#8]
+
+fast_ap_:
+ ldr r8,[r8,#4]
+ beq repl_args_3
+
+ cmp r4,#5
+ blo repl_args_4
+ beq repl_args_5
+
+ cmp r4,#7
+ blo repl_args_6
+
+ sub r4,r4,#2
+
+repl_args_7_:
+ ldr r1,[r7,r4,lsl #2]
+ str r1,[r9],#4
+ sub r4,r4,#1
+ cmp r4,#6-2
+ bne repl_args_7_
+
+repl_args_6:
+ ldr r4,[r7,#16]
+ str r4,[r9],#12
+ ldr r4,[r7,#12]
+ str r4,[r9,#-8]
+ ldr r4,[r7,#8]
+ str r4,[r9,#-4]
+ ldr r6,[r7,#4]
+ ldr r7,[r7]
+ bx r2
+
+repl_args_0:
+ mov r8,r7
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+repl_args_0_2:
+ bx r2
+
+repl_args_1:
+ ldr r8,[r8,#4]
+ bx r2
+
+repl_args_2:
+ str r6,[r9],#4
+ mov r6,r7
+ ldr r7,[r8,#8]
+ ldr r8,[r8,#4]
+ bx r2
+
+repl_args_3:
+ ldr r6,[r7,#4]
+ ldr r7,[r7]
+ bx r2
+
+repl_args_4:
+ ldr r4,[r7,#8]
+ str r4,[r9],#4
+ ldr r6,[r7,#4]
+ ldr r7,[r7]
+ bx r2
+
+repl_args_5:
+ ldr r4,[r7,#12]
+ str r4,[r9],#8
+ ldr r4,[r7,#8]
+ str r4,[r9,#-4]
+ ldr r6,[r7,#4]
+ ldr r7,[r7]
+ bx r2
+
+no_fast_ap32:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#31*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap31:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#30*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap30:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#29*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap29:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#28*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap28:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#27*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap27:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#26*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap26:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#25*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap25:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#24*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap24:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#23*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap23:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#22*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap22:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#21*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap21:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#20*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap20:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#19*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap19:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#18*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap18:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#17*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap17:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#16*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap16:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#15*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap15:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#14*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap14:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#13*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap13:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#12*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap12:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#11*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap11:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#10*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap10:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#9*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap9:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#8*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap8:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#7*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap7:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#6*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap6:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#5*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap5:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#4*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap4:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#3*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2
+
+no_fast_ap3:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r11,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ mov r3,#2*8
+ ldrh r12,[r11]
+ cmp r12,r3
+ beq fast_ap_2_2
+
+no_fast_ap2:
+ ldr r12,[r11,#2]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ ldr r8,[r6]
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+ ldr r12,[r8,#2]
+ bx r12
+
+ .ltorg
+
+add_empty_node_2:
+ subs r5,r5,#3
+ blo add_empty_node_2_gc
+add_empty_node_2_gc_:
+ 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:
+ str lr,[sp,#-4]!
+ bl collect_2
+ ldr lr,[sp],#4
+ b add_empty_node_2_gc_
+
+add_empty_node_3:
+ subs r5,r5,#3
+ blo add_empty_node_3_gc
+add_empty_node_3_gc_:
+ 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:
+ str lr,[sp,#-4]!
+ bl collect_3
+ ldr lr,[sp],#4
+ b add_empty_node_3_gc_
+
+add_empty_node_4:
+ subs r5,r5,#3
+ blo add_empty_node_4_gc
+add_empty_node_4_gc_:
+ ldr r11,[r9,#-4]
+ str r11,[r9]
+ str r10,[r9,#-4]
+ 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:
+ str lr,[sp,#-4]!
+ bl collect_3
+ ldr lr,[sp],#4
+ b add_empty_node_4_gc_
+
+add_empty_node_5:
+ subs r5,r5,#3
+ blo add_empty_node_5_gc
+add_empty_node_5_gc_:
+ ldr r11,[r9,#-4]
+ str r11,[r9]
+ ldr r11,[r9,#-8]
+ str r11,[r9,#-4]
+ str r10,[r9,#-8]
+ 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:
+ str lr,[sp,#-4]!
+ bl collect_3
+ ldr lr,[sp],#4
+ b add_empty_node_5_gc_
+
+add_empty_node_6:
+ subs r5,r5,#3
+ blo add_empty_node_6_gc
+add_empty_node_6_gc_:
+ ldr r11,[r9,#-4]
+ str r11,[r9]
+ ldr r11,[r9,#-8]
+ str r11,[r9,#-4]
+ ldr r11,[r9,#-12]
+ str r11,[r9,#-8]
+ str r10,[r9,#-12]
+ 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:
+ bl collect_3
+ b add_empty_node_6_gc_
+
+add_empty_node_7:
+ subs r5,r5,#3
+ blo add_empty_node_7_gc
+add_empty_node_7_gc_:
+ ldr r11,[r9,#-4]
+ str r11,[r9]
+ ldr r11,[r9,#-8]
+ str r11,[r9,#-4]
+ ldr r11,[r9,#-12]
+ str r11,[r9,#-8]
+ ldr r11,[r9,#-16]
+ str r11,[r9,#-12]
+ str r10,[r9,#-16]
+ 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:
+ bl collect_3
+ b add_empty_node_7_gc_
+
+add_empty_node_8:
+ subs r5,r5,#3
+ blo add_empty_node_8_gc
+add_empty_node_8_gc_:
+ ldr r11,[r9,#-4]
+ str r11,[r9]
+ ldr r11,[r9,#-8]
+ str r11,[r9,#-4]
+ ldr r11,[r9,#-12]
+ str r11,[r9,#-8]
+ ldr r11,[r9,#-16]
+ str r11,[r9,#-12]
+ ldr r11,[r9,#-20]
+ str r11,[r9,#-16]
+ str r10,[r9,#-20]
+ 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:
+ bl collect_3
+ b add_empty_node_8_gc_
+
+add_empty_node_9:
+ subs r5,r5,#3
+ blo add_empty_node_9_gc
+add_empty_node_9_gc_:
+ ldr r11,[r9,#-4]
+ str r11,[r9]
+ ldr r11,[r9,#-8]
+ str r11,[r9,#-4]
+ ldr r11,[r9,#-12]
+ str r11,[r9,#-8]
+ ldr r11,[r9,#-16]
+ str r11,[r9,#-12]
+ ldr r11,[r9,#-20]
+ str r11,[r9,#-16]
+ ldr r11,[r9,#-24]
+ str r11,[r9,#-20]
+ str r10,[r9,#-24]
+ 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:
+ bl collect_3
+ b add_empty_node_9_gc_
+
+add_empty_node_10:
+ subs r5,r5,#3
+ blo add_empty_node_10_gc
+add_empty_node_10_gc_:
+ ldr r11,[r9,#-4]
+ str r11,[r9]
+ ldr r11,[r9,#-8]
+ str r11,[r9,#-4]
+ ldr r11,[r9,#-12]
+ str r11,[r9,#-8]
+ ldr r11,[r9,#-16]
+ str r11,[r9,#-12]
+ ldr r11,[r9,#-20]
+ str r11,[r9,#-16]
+ ldr r11,[r9,#-24]
+ str r11,[r9,#-20]
+ ldr r11,[r9,#-28]
+ str r11,[r9,#-24]
+ str r10,[r9,#-28]
+ 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:
+ bl collect_3
+ b add_empty_node_10_gc_
+
+add_empty_node_31:
+ mov r3,#7
+ b add_empty_node_11_
+add_empty_node_27:
+ mov r3,#6
+ b add_empty_node_11_
+add_empty_node_23:
+ mov r3,#5
+ b add_empty_node_11_
+add_empty_node_19:
+ mov r3,#4
+ b add_empty_node_11_
+add_empty_node_15:
+ mov r3,#3
+ b add_empty_node_11_
+add_empty_node_11:
+ mov r3,#2
+add_empty_node_11_:
+ subs r5,r5,#3
+ blo add_empty_node_11_gc
+add_empty_node_11_gc_:
+ mov r4,r9
+add_empty_node_11_lp:
+ ldr r11,[r4,#-4]
+ str r11,[r4]
+ ldr r11,[r4,#-8]
+ str r11,[r4,#-4]
+ ldr r11,[r4,#-12]
+ str r11,[r4,#-8]
+ ldr r11,[r4,#-16]
+ str r11,[r4,#-12]
+ sub r4,r4,#16
+ subs r3,r3,#1
+ bne add_empty_node_11_lp
+ str r10,[r4]
+ 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:
+ bl collect_3
+ b add_empty_node_11_gc_
+
+add_empty_node_32:
+ mov r3,#7
+ b add_empty_node_12_
+add_empty_node_28:
+ mov r3,#6
+ b add_empty_node_12_
+add_empty_node_24:
+ mov r3,#5
+ b add_empty_node_12_
+add_empty_node_20:
+ mov r3,#4
+ b add_empty_node_12_
+add_empty_node_16:
+ mov r3,#3
+ b add_empty_node_12_
+add_empty_node_12:
+ mov r3,#2
+add_empty_node_12_:
+ subs r5,r5,#3
+ blo add_empty_node_12_gc
+add_empty_node_12_gc_:
+ mov r4,r9
+ ldr r11,[r9,#-4]
+ str r11,[r9]
+add_empty_node_12_lp:
+ ldr r11,[r4,#-8]
+ str r11,[r4,#-4]
+ ldr r11,[r4,#-12]
+ str r11,[r4,#-8]
+ ldr r11,[r4,#-16]
+ str r11,[r4,#-12]
+ ldr r11,[r4,#-20]
+ str r11,[r4,#-16]!
+ subs r3,r3,#1
+ bne add_empty_node_12_lp
+ str r10,[r4,#-4]
+ 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:
+ bl collect_3
+ b add_empty_node_12_gc_
+
+add_empty_node_29:
+ mov r3,#6
+ b add_empty_node_13_
+add_empty_node_25:
+ mov r3,#5
+ b add_empty_node_13_
+add_empty_node_21:
+ mov r3,#4
+ b add_empty_node_13_
+add_empty_node_17:
+ mov r3,#3
+ b add_empty_node_13_
+add_empty_node_13:
+ mov r3,#2
+add_empty_node_13_:
+ subs r5,r5,#3
+ blo add_empty_node_13_gc
+add_empty_node_13_gc_:
+ mov r4,r9
+ ldr r11,[r9,#-4]
+ str r11,[r9]
+ ldr r11,[r9,#-8]
+ str r11,[r9,#-4]
+add_empty_node_13_lp:
+ ldr r11,[r4,#-12]
+ str r11,[r4,#-8]
+ ldr r11,[r4,#-16]
+ str r11,[r4,#-12]
+ ldr r11,[r4,#-20]
+ str r11,[r4,#-16]
+ ldr r11,[r4,#-24]
+ str r11,[r4,#-20]
+ sub r4,r4,#16
+ subs r3,r3,#1
+ bne add_empty_node_13_lp
+ str r10,[r4,#-8]
+ 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:
+ bl collect_3
+ b add_empty_node_13_gc_
+
+add_empty_node_30:
+ mov r3,#6
+ b add_empty_node_14_
+add_empty_node_26:
+ mov r3,#5
+ b add_empty_node_14_
+add_empty_node_22:
+ mov r3,#4
+ b add_empty_node_14_
+add_empty_node_18:
+ mov r3,#3
+ b add_empty_node_14_
+add_empty_node_14:
+ mov r3,#2
+ b add_empty_node_14_
+add_empty_node_14_:
+ subs r5,r5,#3
+ blo add_empty_node_14_gc
+add_empty_node_14_gc:
+ mov r4,r9
+ ldr r11,[r9,#-4]
+ str r11,[r9]
+ ldr r11,[r9,#-8]
+ str r11,[r9,#-4]
+ ldr r11,[r9,#-12]
+ str r11,[r9,#-8]
+add_empty_node_14_lp:
+ ldr r11,[r4,#-16]
+ str r11,[r4,#-12]
+ ldr r11,[r4,#-20]
+ str r11,[r4,#-16]
+ ldr r11,[r4,#-24]
+ str r11,[r4,#-20]
+ ldr r11,[r4,#-28]
+ str r11,[r4,#-24]
+ sub r4,r4,#16
+ subs r3,r3,#1
+ bne add_empty_node_14_lp
+ str r10,[r4,#-12]
+ 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:
+ subs r5,r5,#2
+ blo yet_args_needed_0_gc
+yet_args_needed_0_gc_r:
+ str r6,[r10,#4]
+ ldr r4,[r7]
+ mov r6,r10
+ add r4,r4,#8
+ str r4,[r10],#8
+ ldr pc,[sp],#4
+
+yet_args_needed_0_gc:
+ bl collect_2
+ b yet_args_needed_0_gc_r
+
+
+ .p2align 2
+ subs r5,r5,#3
+ b build_node_2
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_1:
+ subs r5,r5,#3
+ blo yet_args_needed_1_gc
+yet_args_needed_1_gc_r:
+ str r6,[r10,#8]
+ ldr r4,[r7]
+ mov r6,r10
+ add r4,r4,#8
+ str r4,[r10]
+ ldr r3,[r7,#4]
+ str r3,[r10,#4]
+ add r10,r10,#12
+ ldr pc,[sp],#4
+
+yet_args_needed_1_gc:
+ bl collect_2
+ b yet_args_needed_1_gc_r
+
+build_node_2:
+ blo build_node_2_gc
+build_node_2_gc_r:
+ str r3,[r10]
+ str r7,[r10,#4]
+ str r6,[r10,#8]
+ mov r6,r10
+ add r10,r10,#12
+ ldr pc,[sp],#4
+
+build_node_2_gc:
+ bl collect_2
+ b build_node_2_gc_r
+
+
+ .p2align 2
+ subs r5,r5,#5
+ b build_node_3
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_2:
+ subs r5,r5,#5
+ blo gc_22
+gc_r_22:
+ ldr r4,[r7]
+ str r6,[r10,#4]
+ add r4,r4,#8
+ ldr r8,[r7,#4]
+ str r4,[r10,#8]
+ add r6,r10,#8
+ str r8,[r10,#12]
+ ldr r8,[r7,#8]
+ str r8,[r10]
+ str r10,[r10,#16]
+ add r10,r10,#20
+ ldr pc,[sp],#4
+
+gc_22: bl collect_2
+ b gc_r_22
+
+build_node_3:
+ blo build_node_3_gc
+build_node_3_gc_r:
+ str r3,[r10]
+ add r8,r10,#12
+ str r7,[r10,#4]
+ str r8,[r10,#8]
+ str r6,[r10,#12]
+ mov r6,r10
+ ldr r8,[r9,#-4]
+ subs r9,r9,#4
+ str r8,[r10,#16]
+ add r10,r10,#20
+ ldr pc,[sp],#4
+
+build_node_3_gc:
+ bl collect_2
+ b build_node_3_gc_r
+
+
+ .p2align 2
+ subs r5,r5,#6
+ b build_node_4
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_3:
+ subs r5,r5,#6
+ blo gc_23
+gc_r_23:
+ ldr r4,[r7]
+ str r6,[r10,#8]
+ add r4,r4,#8
+ ldr r8,[r7,#4]
+ str r4,[r10,#12]
+ ldr r7,[r7,#8]
+ str r8,[r10,#16]
+ ldr r8,[r7]
+ str r10,[r10,#20]
+ str r8,[r10]
+ ldr r8,[r7,#4]
+ add r6,r10,#12
+ str r8,[r10,#4]
+ add r10,r10,#24
+ ldr pc,[sp],#4
+
+gc_23: bl collect_2
+ b gc_r_23
+
+build_node_4:
+ blo build_node_4_gc
+build_node_4_gc_r:
+ str r3,[r10]
+ add r8,r10,#12
+ str r7,[r10,#4]
+ str r8,[r10,#8]
+ str r6,[r10,#12]
+ mov r6,r10
+ ldr r8,[r9,#-4]
+ str r8,[r10,#16]
+ ldr r8,[r9,#-8]
+ subs r9,r9,#8
+ str r8,[r10,#20]
+ add r10,r10,#24
+ ldr pc,[sp],#4
+
+build_node_4_gc:
+ bl collect_2
+ b build_node_4_gc_r
+
+
+ .p2align 2
+ subs r5,r5,#7
+ b build_node_5
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_4:
+ subs r5,r5,#7
+ blo gc_24
+gc_r_24:
+ ldr r4,[r7]
+ str r6,[r10,#12]
+ add r4,r4,#8
+ ldr r8,[r7,#4]
+ str r4,[r10,#16]
+ ldr r7,[r7,#8]
+ str r8,[r10,#20]
+ ldr r8,[r7]
+ str r10,[r10,#24]
+ str r8,[r10]
+ ldr r8,[r7,#4]
+ add r6,r10,#16
+ str r8,[r10,#4]
+ ldr r8,[r7,#8]
+ str r8,[r10,#8]
+ add r10,r10,#28
+ ldr pc,[sp],#4
+
+gc_24: bl collect_2
+ b gc_r_24
+
+build_node_5:
+ blo build_node_5_gc
+build_node_5_gc_r:
+ str r3,[r10]
+ add r8,r10,#12
+ str r7,[r10,#4]
+ str r8,[r10,#8]
+ str r6,[r10,#12]
+ mov r6,r10
+ ldr r8,[r9,#-4]
+ str r8,[r10,#16]
+ ldr r8,[r9,#-8]
+ str r8,[r10,#20]
+ ldr r8,[r9,#-12]
+ subs r9,r9,#12
+ str r8,[r10,#24]
+ add r10,r10,#28
+ ldr pc,[sp],#4
+
+build_node_5_gc:
+ bl collect_2
+ b build_node_5_gc_r
+
+
+ .p2align 2
+ mov r4,#8
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_5:
+ ldr r3,[r7]
+ mov r4,#8
+ b yet_args_needed_
+
+
+ .p2align 2
+ mov r4,#9
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_6:
+ ldr r3,[r7]
+ mov r4,#9
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#10
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_7:
+ ldr r3,[r7]
+ mov r4,#10
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#11
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_8:
+ ldr r3,[r7]
+ mov r4,#11
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#12
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_9:
+ ldr r3,[r7]
+ mov r4,#12
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#13
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_10:
+ ldr r3,[r7]
+ mov r4,#13
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#14
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_11:
+ ldr r3,[r7]
+ mov r4,#14
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#15
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_12:
+ ldr r3,[r7]
+ mov r4,#15
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#16
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_13:
+ ldr r3,[r7]
+ mov r4,#16
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#17
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_14:
+ ldr r3,[r7]
+ mov r4,#17
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#18
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_15:
+ ldr r3,[r7]
+ mov r4,#18
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#19
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_16:
+ ldr r3,[r7]
+ mov r4,#19
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#20
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_17:
+ ldr r3,[r7]
+ mov r4,#20
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#21
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_18:
+ ldr r3,[r7]
+ mov r4,#21
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#22
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_19:
+ ldr r3,[r7]
+ mov r4,#22
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#23
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_20:
+ ldr r3,[r7]
+ mov r4,#23
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#24
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_21:
+ ldr r3,[r7]
+ mov r4,#24
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#25
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_22:
+ ldr r3,[r7]
+ mov r4,#25
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#26
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_23:
+ ldr r3,[r7]
+ mov r4,#26
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#27
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_24:
+ ldr r3,[r7]
+ mov r4,#27
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#28
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_25:
+ ldr r3,[r7]
+ mov r4,#28
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#29
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_26:
+ ldr r3,[r7]
+ mov r4,#29
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#30
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_27:
+ ldr r3,[r7]
+ mov r4,#30
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#31
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_28:
+ ldr r3,[r7]
+ mov r4,#31
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#32
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_29:
+ ldr r3,[r7]
+ mov r4,#32
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#33
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_30:
+ ldr r3,[r7]
+ mov r4,#33
+ b yet_args_needed_
+
+ .p2align 2
+ mov r4,#34
+ b build_node_
+.ifdef PROFILE
+ nop
+ nop
+.endif
+yet_args_needed_31:
+ ldr r3,[r7]
+ mov r4,#34
+ b yet_args_needed_
+
+yet_args_needed:
+@ for more than 4 arguments
+ ldr r3,[r7]
+ ldrh r4,[r3,#-2]
+ add r4,r4,#3
+yet_args_needed_:
+ subs r5,r5,r4
+ blo yet_args_needed_gc
+yet_args_needed_gc_r:
+ subs r4,r4,#3+1+4
+ str r3,[sp,#-4]!
+ str r6,[sp,#-4]!
+ ldr r3,[r7,#4]
+ ldr r7,[r7,#8]
+ mov r8,r10
+ ldr r6,[r7]
+ str r6,[r10]
+ ldr r6,[r7,#4]
+ str r6,[r10,#4]
+ ldr r6,[r7,#8]
+ str r6,[r10,#8]
+ add r7,r7,#12
+ add r10,r10,#12
+
+yet_args_needed_cp_a:
+ ldr r6,[r7],#4
+ str r6,[r10],#4
+ subs r4,r4,#1
+ bge yet_args_needed_cp_a
+
+ ldr r6,[sp],#4
+ str r6,[r10]
+ ldr r4,[sp],#4
+ add r4,r4,#8
+ str r4,[r10,#4]
+ add r6,r10,#4
+ str r3,[r10,#8]
+ str r8,[r10,#12]
+ add r10,r10,#16
+ ldr pc,[sp],#4
+
+yet_args_needed_gc:
+ bl collect_2
+ b yet_args_needed_gc_r
+
+build_node_:
+ subs r5,r5,r4
+ blo build_node_gc
+build_node_gc_r:
+ str r3,[r10]
+ add r8,r10,#12
+ str r7,[r10,#4]
+ str r8,[r10,#8]
+ str r6,[r10,#12]
+ mov r6,r10
+ ldr r8,[r9,#-4]
+ str r8,[r10,#16]
+ ldr r8,[r9,#-8]
+ str r8,[r10,#20]
+ ldr r8,[r9,#-12]
+ subs r9,r9,#12
+ str r8,[r10,#24]
+ add r10,r10,#28
+
+ subs r4,r4,#5+2
+build_node_cp_a:
+ ldr r8,[r9,#-4]!
+ str r8,[r10],#4
+ subs r4,r4,#1
+ bne build_node_cp_a
+
+ ldr pc,[sp],#4
+
+build_node_gc:
+ bl collect_2
+ b build_node_gc_r
+
+ .globl apupd_1
+ .globl apupd_2
+ .globl apupd_3
+ .globl apupd_4
+ .globl apupd_5
+ .globl apupd_6
+ .globl apupd_7
+ .globl apupd_8
+ .globl apupd_9
+ .globl apupd_10
+ .globl apupd_11
+ .globl apupd_12
+ .globl apupd_13
+ .globl apupd_14
+ .globl apupd_15
+ .globl apupd_16
+ .globl apupd_17
+ .globl apupd_18
+ .globl apupd_19
+ .globl apupd_20
+ .globl apupd_21
+ .globl apupd_22
+ .globl apupd_23
+ .globl apupd_24
+ .globl apupd_25
+ .globl apupd_26
+ .globl apupd_27
+ .globl apupd_28
+ .globl apupd_29
+ .globl apupd_30
+ .globl apupd_31
+ .globl apupd_32
+ .globl e__system__nind
+
+apupd_1:
+ ldr r12,[sp]
+ lao r8,apupd_upd,0
+ otoa r8,apupd_upd,0
+ cmp r12,r8
+ lao r8,ap_1,0
+ bne ap_upd
+
+ ldr r8,[r9,#-4]
+ ldr r4,[r9,#-8]
+ lao r12,e__system__nind,23
+ subs r9,r9,#4
+ otoa r12,e__system__nind,23
+ str r12,[r8]
+ str r4,[r8,#4]
+ap_1:
+ ldr r8,[r7]
+ ldr r12,[r8,#2]
+ bx r12
+
+apupd_2:
+ ldr r12,[sp]
+ lao r8,apupd_upd,1
+ otoa r8,apupd_upd,1
+ cmp r12,r8
+ 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,e__system__nind,24
+ subs r9,r9,#4
+ otoa r12,e__system__nind,24
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_2
+
+apupd_3:
+ ldr r12,[sp]
+ lao r8,apupd_upd,2
+ otoa r8,apupd_upd,2
+ cmp r12,r8
+ lao r8,ap_3,0
+ bne ap_upd
+
+ ldr r8,[r9,#-12]
+ ldr r4,[r9,#-16]
+ ldr r3,[r9,#-8]
+ str r3,[r9,#-12]
+ ldr r3,[r9,#-4]
+ str r3,[r9,#-8]
+ lao r12,e__system__nind,25
+ subs r9,r9,#4
+ otoa r12,e__system__nind,25
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_3
+
+apupd_4:
+ ldr r12,[sp]
+ lao r8,apupd_upd,3
+ otoa r8,apupd_upd,3
+ cmp r12,r8
+ lao r8,ap_4,0
+ bne ap_upd
+
+ ldr r8,[r9,#-16]
+ ldr r4,[r9,#-20]
+ ldr r3,[r9,#-12]
+ str r3,[r9,#-16]
+ ldr r3,[r9,#-8]
+ str r3,[r9,#-12]
+ ldr r3,[r9,#-4]
+ str r3,[r9,#-8]
+ lao r12,e__system__nind,26
+ subs r9,r9,#4
+ otoa r12,e__system__nind,26
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_4
+
+apupd_5:
+ ldr r12,[sp]
+ lao r8,apupd_upd,4
+ otoa r8,apupd_upd,4
+ cmp r12,r8
+ lao r8,ap_5,0
+ bne ap_upd
+
+ ldr r8,[r9,#-20]
+ ldr r4,[r9,#-24]
+ ldr r3,[r9,#-16]
+ str r3,[r9,#-20]
+ ldr r3,[r9,#-12]
+ str r3,[r9,#-16]
+ ldr r3,[r9,#-8]
+ str r3,[r9,#-12]
+ ldr r3,[r9,#-4]
+ str r3,[r9,#-8]
+ lao r12,e__system__nind,27
+ subs r9,r9,#4
+ otoa r12,e__system__nind,27
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_5
+
+apupd_6:
+ ldr r12,[sp]
+ lao r8,apupd_upd,5
+ otoa r8,apupd_upd,5
+ cmp r12,r8
+ lao r8,ap_6,0
+ bne ap_upd
+
+ ldr r8,[r9,#-24]
+ ldr r4,[r9,#-28]
+ ldr r3,[r9,#-20]
+ str r3,[r9,#-24]
+ ldr r3,[r9,#-16]
+ str r3,[r9,#-20]
+ ldr r3,[r9,#-12]
+ str r3,[r9,#-16]
+ ldr r3,[r9,#-8]
+ str r3,[r9,#-12]
+ ldr r3,[r9,#-4]
+ str r3,[r9,#-8]
+ lao r12,e__system__nind,28
+ subs r9,r9,#4
+ otoa r12,e__system__nind,28
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_6
+
+apupd_7:
+ ldr r12,[sp]
+ lao r8,apupd_upd,6
+ otoa r8,apupd_upd,6
+ cmp r12,r8
+ lao r8,ap_7,0
+ bne ap_upd
+
+ ldr r8,[r9,#-28]
+ ldr r4,[r9,#-32]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_8
+ lao r12,e__system__nind,29
+ subs r9,r9,#4
+ otoa r12,e__system__nind,29
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_7
+
+apupd_8:
+ ldr r12,[sp]
+ lao r8,apupd_upd,7
+ otoa r8,apupd_upd,7
+ cmp r12,r8
+ lao r8,ap_8,0
+ bne ap_upd
+
+ ldr r8,[r9,#-32]
+ ldr r4,[r9,#-36]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_9
+ lao r12,e__system__nind,30
+ subs r9,r9,#4
+ otoa r12,e__system__nind,30
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_8
+
+apupd_9:
+ ldr r12,[sp]
+ lao r8,apupd_upd,8
+ otoa r8,apupd_upd,8
+ cmp r12,r8
+ lao r8,ap_9,0
+ bne ap_upd
+
+ ldr r8,[r9,#-36]
+ ldr r4,[r9,#-40]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_10
+ lao r12,e__system__nind,31
+ subs r9,r9,#4
+ otoa r12,e__system__nind,31
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_9
+
+apupd_10:
+ ldr r12,[sp]
+ lao r8,apupd_upd,9
+ otoa r8,apupd_upd,9
+ cmp r12,r8
+ lao r8,ap_10,0
+ bne ap_upd
+
+ ldr r8,[r9,#-40]
+ ldr r4,[r9,#-44]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_11
+ lao r12,e__system__nind,32
+ subs r9,r9,#4
+ otoa r12,e__system__nind,32
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_10
+
+apupd_11:
+ ldr r12,[sp]
+ lao r8,apupd_upd,10
+ otoa r8,apupd_upd,10
+ cmp r12,r8
+ lao r8,ap_11,0
+ bne ap_upd
+
+ ldr r8,[r9,#-44]
+ ldr r4,[r9,#-48]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_12
+ lao r12,e__system__nind,33
+ subs r9,r9,#4
+ otoa r12,e__system__nind,33
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_11
+
+apupd_12:
+ ldr r12,[sp]
+ lao r8,apupd_upd,11
+ otoa r8,apupd_upd,11
+ cmp r12,r8
+ lao r8,ap_12,0
+ bne ap_upd
+
+ ldr r8,[r9,#-48]
+ ldr r4,[r9,#-52]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_13
+ lao r12,e__system__nind,34
+ subs r9,r9,#4
+ otoa r12,e__system__nind,34
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_12
+
+apupd_13:
+ ldr r12,[sp]
+ lao r8,apupd_upd,12
+ otoa r8,apupd_upd,12
+ cmp r12,r8
+ lao r8,ap_13,0
+ bne ap_upd
+
+ ldr r8,[r9,#-52]
+ ldr r4,[r9,#-56]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_14
+ lao r12,e__system__nind,35
+ subs r9,r9,#4
+ otoa r12,e__system__nind,35
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_13
+
+apupd_14:
+ ldr r12,[sp]
+ lao r8,apupd_upd,13
+ otoa r8,apupd_upd,13
+ cmp r12,r8
+ lao r8,ap_14,0
+ bne ap_upd
+
+ ldr r8,[r9,#-56]
+ ldr r4,[r9,#-60]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_15
+ lao r12,e__system__nind,36
+ subs r9,r9,#4
+ otoa r12,e__system__nind,36
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_14
+
+apupd_15:
+ ldr r12,[sp]
+ lao r8,apupd_upd,14
+ otoa r8,apupd_upd,14
+ cmp r12,r8
+ lao r8,ap_15,0
+ bne ap_upd
+
+ ldr r8,[r9,#-60]
+ ldr r4,[r9,#-64]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_16
+ lao r12,e__system__nind,37
+ subs r9,r9,#4
+ otoa r12,e__system__nind,37
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_15
+
+apupd_16:
+ ldr r12,[sp]
+ lao r8,apupd_upd,15
+ otoa r8,apupd_upd,15
+ cmp r12,r8
+ lao r8,ap_16,0
+ bne ap_upd
+
+ ldr r8,[r9,#-64]
+ ldr r4,[r9,#-68]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_17
+ lao r12,e__system__nind,38
+ subs r9,r9,#4
+ otoa r12,e__system__nind,38
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_16
+
+apupd_17:
+ ldr r12,[sp]
+ lao r8,apupd_upd,16
+ otoa r8,apupd_upd,16
+ cmp r12,r8
+ lao r8,ap_17,0
+ bne ap_upd
+
+ ldr r8,[r9,#-68]
+ ldr r4,[r9,#-72]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_18
+ lao r12,e__system__nind,39
+ subs r9,r9,#4
+ otoa r12,e__system__nind,39
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_17
+
+apupd_18:
+ ldr r12,[sp]
+ lao r8,apupd_upd,17
+ otoa r8,apupd_upd,17
+ cmp r12,r8
+ lao r8,ap_18,0
+ bne ap_upd
+
+ ldr r8,[r9,#-72]
+ ldr r4,[r9,#-76]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_19
+ lao r12,e__system__nind,40
+ subs r9,r9,#4
+ otoa r12,e__system__nind,40
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_18
+
+apupd_19:
+ ldr r12,[sp]
+ lao r8,apupd_upd,18
+ otoa r8,apupd_upd,18
+ cmp r12,r8
+ lao r8,ap_19,0
+ bne ap_upd
+
+ ldr r8,[r9,#-76]
+ ldr r4,[r9,#-80]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_20
+ lao r12,e__system__nind,41
+ subs r9,r9,#4
+ otoa r12,e__system__nind,41
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_19
+
+apupd_20:
+ ldr r12,[sp]
+ lao r8,apupd_upd,19
+ otoa r8,apupd_upd,19
+ cmp r12,r8
+ lao r8,ap_20,0
+ bne ap_upd
+
+ ldr r8,[r9,#-80]
+ ldr r4,[r9,#-84]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_21
+ lao r12,e__system__nind,42
+ subs r9,r9,#4
+ otoa r12,e__system__nind,42
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_20
+
+apupd_21:
+ ldr r12,[sp]
+ lao r8,apupd_upd,20
+ otoa r8,apupd_upd,20
+ cmp r12,r8
+ lao r8,ap_21,0
+ bne ap_upd
+
+ ldr r8,[r9,#-84]
+ ldr r4,[r9,#-88]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_22
+ lao r12,e__system__nind,43
+ subs r9,r9,#4
+ otoa r12,e__system__nind,43
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_21
+
+apupd_22:
+ ldr r12,[sp]
+ lao r8,apupd_upd,21
+ otoa r8,apupd_upd,21
+ cmp r12,r8
+ lao r8,ap_22,0
+ bne ap_upd
+
+ ldr r8,[r9,#-88]
+ ldr r4,[r9,#-92]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_23
+ lao r12,e__system__nind,44
+ subs r9,r9,#4
+ otoa r12,e__system__nind,44
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_22
+
+apupd_23:
+ ldr r12,[sp]
+ lao r8,apupd_upd,22
+ otoa r8,apupd_upd,22
+ cmp r12,r8
+ lao r8,ap_23,0
+ bne ap_upd
+
+ ldr r8,[r9,#-92]
+ ldr r4,[r9,#-96]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_24
+ lao r12,e__system__nind,45
+ subs r9,r9,#4
+ otoa r12,e__system__nind,45
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_23
+
+apupd_24:
+ ldr r12,[sp]
+ lao r8,apupd_upd,23
+ otoa r8,apupd_upd,23
+ cmp r12,r8
+ lao r8,ap_24,0
+ bne ap_upd
+
+ ldr r8,[r9,#-96]
+ ldr r4,[r9,#-100]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_25
+ lao r12,e__system__nind,46
+ subs r9,r9,#4
+ otoa r12,e__system__nind,46
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_24
+
+apupd_25:
+ ldr r12,[sp]
+ lao r8,apupd_upd,24
+ otoa r8,apupd_upd,24
+ cmp r12,r8
+ lao r8,ap_25,0
+ bne ap_upd
+
+ ldr r8,[r9,#-100]
+ ldr r4,[r9,#-104]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_26
+ lao r12,e__system__nind,47
+ subs r9,r9,#4
+ otoa r12,e__system__nind,47
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_25
+
+apupd_26:
+ ldr r12,[sp]
+ lao r8,apupd_upd,25
+ otoa r8,apupd_upd,25
+ cmp r12,r8
+ lao r8,ap_26,0
+ bne ap_upd
+
+ ldr r8,[r9,#-104]
+ ldr r4,[r9,#-108]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_27
+ lao r12,e__system__nind,48
+ subs r9,r9,#4
+ otoa r12,e__system__nind,48
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_26
+
+apupd_27:
+ ldr r12,[sp]
+ lao r8,apupd_upd,26
+ otoa r8,apupd_upd,26
+ cmp r12,r8
+ lao r8,ap_27,0
+ bne ap_upd
+
+ ldr r8,[r9,#-108]
+ ldr r4,[r9,#-112]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_28
+ lao r12,e__system__nind,49
+ subs r9,r9,#4
+ otoa r12,e__system__nind,49
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_27
+
+apupd_28:
+ ldr r12,[sp]
+ lao r8,apupd_upd,27
+ otoa r8,apupd_upd,27
+ cmp r12,r8
+ lao r8,ap_28,0
+ bne ap_upd
+
+ ldr r8,[r9,#-112]
+ ldr r4,[r9,#-116]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_29
+ lao r12,e__system__nind,50
+ subs r9,r9,#4
+ otoa r12,e__system__nind,50
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_28
+
+apupd_29:
+ ldr r12,[sp]
+ lao r8,apupd_upd,28
+ otoa r8,apupd_upd,28
+ cmp r12,r8
+ lao r8,ap_29,0
+ bne ap_upd
+
+ ldr r8,[r9,#-116]
+ ldr r4,[r9,#-120]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_30
+ lao r12,e__system__nind,51
+ subs r9,r9,#4
+ otoa r12,e__system__nind,51
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_29
+
+apupd_30:
+ ldr r12,[sp]
+ lao r8,apupd_upd,29
+ otoa r8,apupd_upd,29
+ cmp r12,r8
+ lao r8,ap_30,0
+ bne ap_upd
+
+ ldr r8,[r9,#-120]
+ ldr r4,[r9,#-124]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_31
+ lao r12,e__system__nind,52
+ subs r9,r9,#4
+ otoa r12,e__system__nind,52
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_30
+
+apupd_31:
+ ldr r12,[sp]
+ lao r8,apupd_upd,30
+ otoa r8,apupd_upd,30
+ cmp r12,r8
+ lao r8,ap_31,0
+ bne ap_upd
+
+ ldr r8,[r9,#-124]
+ ldr r4,[r9,#-128]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_32
+ lao r12,e__system__nind,53
+ subs r9,r9,#4
+ otoa r12,e__system__nind,53
+ str r12,[r8]
+ str r4,[r8,#4]
+ b ap_31
+
+apupd_32:
+ ldr r12,[sp]
+ lao r8,apupd_upd,31
+ otoa r8,apupd_upd,31
+ cmp r12,r8
+ lao r8,ap_32,0
+ bne ap_upd
+
+ ldr r8,[r9,#-128]
+ ldr r4,[r9,#-132]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl move_33
+ lao r12,e__system__nind,54
+ subs r9,r9,#4
+ otoa r12,e__system__nind,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
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r8
+apupd_upd:
+ ldr r7,[r9,#-4]
+ subs r9,r9,#4
+ ldr r4,[r6]
+ str r4,[r7]
+ ldr r4,[r6,#4]
+ str r4,[r7,#4]
+ ldr r4,[r6,#8]
+ mov r6,r7
+ str r4,[r7,#8]
+ ldr pc,[sp],#4
+
+move_33:
+ ldr r3,[r9,#-124]
+ str r3,[r9,#-128]
+move_32:
+ ldr r3,[r9,#-120]
+ str r3,[r9,#-124]
+move_31:
+ ldr r3,[r9,#-116]
+ str r3,[r9,#-120]
+move_30:
+ ldr r3,[r9,#-112]
+ str r3,[r9,#-116]
+move_29:
+ ldr r3,[r9,#-108]
+ str r3,[r9,#-112]
+move_28:
+ ldr r3,[r9,#-104]
+ str r3,[r9,#-108]
+move_27:
+ ldr r3,[r9,#-100]
+ str r3,[r9,#-104]
+move_26:
+ ldr r3,[r9,#-96]
+ str r3,[r9,#-100]
+move_25:
+ ldr r3,[r9,#-92]
+ str r3,[r9,#-96]
+move_24:
+ ldr r3,[r9,#-88]
+ str r3,[r9,#-92]
+move_23:
+ ldr r3,[r9,#-84]
+ str r3,[r9,#-88]
+move_22:
+ ldr r3,[r9,#-80]
+ str r3,[r9,#-84]
+move_21:
+ ldr r3,[r9,#-76]
+ str r3,[r9,#-80]
+move_20:
+ ldr r3,[r9,#-72]
+ str r3,[r9,#-76]
+move_19:
+ ldr r3,[r9,#-68]
+ str r3,[r9,#-72]
+move_18:
+ ldr r3,[r9,#-64]
+ str r3,[r9,#-68]
+move_17:
+ ldr r3,[r9,#-60]
+ str r3,[r9,#-64]
+move_16:
+ ldr r3,[r9,#-56]
+ str r3,[r9,#-60]
+move_15:
+ ldr r3,[r9,#-52]
+ str r3,[r9,#-56]
+move_14:
+ ldr r3,[r9,#-48]
+ str r3,[r9,#-52]
+move_13:
+ ldr r3,[r9,#-44]
+ str r3,[r9,#-48]
+move_12:
+ ldr r3,[r9,#-40]
+ str r3,[r9,#-44]
+move_11:
+ ldr r3,[r9,#-36]
+ str r3,[r9,#-40]
+move_10:
+ ldr r3,[r9,#-32]
+ str r3,[r9,#-36]
+move_9:
+ ldr r3,[r9,#-28]
+ str r3,[r9,#-32]
+move_8:
+ ldr r3,[r9,#-24]
+ str r3,[r9,#-28]
+move_7:
+ ldr r3,[r9,#-20]
+ str r3,[r9,#-24]
+ ldr r3,[r9,#-16]
+ str r3,[r9,#-20]
+ ldr r3,[r9,#-12]
+ str r3,[r9,#-16]
+ ldr r3,[r9,#-8]
+ str r3,[r9,#-12]
+ ldr r3,[r9,#-4]
+ str r3,[r9,#-8]
+ ldr pc,[sp],#4
+
+.ifdef PIC
+ lto apupd_upd,0
+ lto ap_1,0
+ lto e__system__nind,23
+ lto apupd_upd,1
+ lto ap_2,0
+ lto e__system__nind,24
+ lto apupd_upd,2
+ lto ap_3,0
+ lto e__system__nind,25
+ lto apupd_upd,3
+ lto ap_4,0
+ lto e__system__nind,26
+ lto apupd_upd,4
+ lto ap_5,0
+ lto e__system__nind,27
+ lto apupd_upd,5
+ lto ap_6,0
+ lto e__system__nind,28
+ lto apupd_upd,6
+ lto ap_7,0
+ lto e__system__nind,29
+ lto apupd_upd,7
+ lto ap_8,0
+ lto e__system__nind,30
+ lto apupd_upd,8
+ lto ap_9,0
+ lto e__system__nind,31
+ lto apupd_upd,9
+ lto ap_10,0
+ lto e__system__nind,32
+ lto apupd_upd,10
+ lto ap_11,0
+ lto e__system__nind,33
+ lto apupd_upd,11
+ lto ap_12,0
+ lto e__system__nind,34
+ lto apupd_upd,12
+ lto ap_13,0
+ lto e__system__nind,35
+ lto apupd_upd,13
+ lto ap_14,0
+ lto e__system__nind,36
+ lto apupd_upd,14
+ lto ap_15,0
+ lto e__system__nind,37
+ lto apupd_upd,15
+ lto ap_16,0
+ lto e__system__nind,38
+ lto apupd_upd,16
+ lto ap_17,0
+ lto e__system__nind,39
+ lto apupd_upd,17
+ lto ap_18,0
+ lto e__system__nind,40
+ lto apupd_upd,18
+ lto ap_19,0
+ lto e__system__nind,41
+ lto apupd_upd,19
+ lto ap_20,0
+ lto e__system__nind,42
+ lto apupd_upd,20
+ lto ap_21,0
+ lto e__system__nind,43
+ lto apupd_upd,21
+ lto ap_22,0
+ lto e__system__nind,44
+ lto apupd_upd,22
+ lto ap_23,0
+ lto e__system__nind,45
+ lto apupd_upd,23
+ lto ap_24,0
+ lto e__system__nind,46
+ lto apupd_upd,24
+ lto ap_25,0
+ lto e__system__nind,47
+ lto apupd_upd,25
+ lto ap_26,0
+ lto e__system__nind,48
+ lto apupd_upd,26
+ lto ap_27,0
+ lto e__system__nind,49
+ lto apupd_upd,27
+ lto ap_28,0
+ lto e__system__nind,50
+ lto apupd_upd,28
+ lto ap_29,0
+ lto e__system__nind,51
+ lto apupd_upd,29
+ lto ap_30,0
+ lto e__system__nind,52
+ lto apupd_upd,30
+ lto ap_31,0
+ lto e__system__nind,53
+ lto apupd_upd,31
+ lto ap_32,0
+ lto e__system__nind,54
+.endif
diff --git a/thumb2compact.s b/thumb2compact.s
new file mode 100644
index 0000000..517c29a
--- /dev/null
+++ b/thumb2compact.s
@@ -0,0 +1,1218 @@
+
+COMPACT_MARK_WITH_STACK = 1
+NO_BIT_INSTRUCTIONS = 1
+
+@ mark used nodes and pointers in argument parts and link backward pointers
+
+ lao r12,heap_size_33,10
+ ldo r4,r12,heap_size_33,10
+ lsl r4,r4,#5
+ lao r12,heap_size_32_33,1
+ sto r4,r12,heap_size_32_33,1
+@ heap_size_32_33 in r2
+ mov r2,r4
+
+ 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
+ lao r12,caf_list,2
+ ldo r4,r12,caf_list,2
+.if COMPACT_MARK_WITH_STACK
+ lao r12,end_stack,1
+ sto r9,r12,end_stack,1
+@ end_stack in r0
+ mov r0,r9
+.endif
+ cmp r4,#0
+ beq end_mark_cafs
+
+mark_cafs_lp:
+ ldr r12,[r4,#-4]
+ str r12,[sp,#-4]!
+.if COMPACT_MARK_WITH_STACK
+ add r9,r4,#4
+ ldr r4,[r4]
+ add r6,r9,r4,lsl #2
+.else
+ add r8,r4,#4
+ ldr r4,[r4]
+ add r6,r8,r4,lsl #2
+.endif
+ lao r12,end_vector,13
+ sto r6,r12,end_vector,13
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+.if COMPACT_MARK_WITH_STACK
+ bl rmark_stack_nodes
+.else
+ bl mark_stack_nodes
+.endif
+
+ ldr r4,[sp],#4
+ tst r4,r4
+ bne mark_cafs_lp
+
+end_mark_cafs:
+.if COMPACT_MARK_WITH_STACK
+ lao r12,stack_p,6
+ ldo r9,r12,stack_p,6
+.else
+ lao r12,stack_p,6
+ ldo r8,r12,stack_p,6
+.endif
+
+ lao r12,stack_top,4
+ ldo r6,r12,stack_top,4
+ lao r12,end_vector,14
+ sto r6,r12,end_vector,14
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+.if COMPACT_MARK_WITH_STACK
+ bl rmark_stack_nodes
+.else
+ bl mark_stack_nodes
+.endif
+
+.ifdef MEASURE_GC
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl add_mark_compact_garbage_collect_time
+.endif
+
+ 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
+ .include "thumb2compact_rmark.s"
+ .include "thumb2compact_rmarkr.s"
+.else
+ .include "thumb2compact_mark.s"
+.endif
+
+@ compact the heap
+
+compact_heap:
+
+.ifdef FINALIZERS
+ 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:
+ laol r12,__Nil-4,__Nil_o_m4,5
+ otoa r12,__Nil_o_m4,5
+ cmp r8,r12
+ beq end_finalizers_after_compact1
+
+ lao r12,heap_p3,12
+ ldo r4,r12,heap_p3,12
+ sub r4,r8,r4
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+ lsr r9,r4,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ beq finalizer_not_used_after_compact1
+
+ ldr r4,[r8]
+ mov r9,r8
+ b finalizer_find_descriptor
+
+finalizer_find_descriptor_lp:
+ and r4,r4,#-4
+ mov r9,r4
+ ldr r4,[r4]
+finalizer_find_descriptor:
+ tst r4,#1
+ bne finalizer_find_descriptor_lp
+
+ 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
+
+ ldr r4,[r8]
+ add r9,r6,#1
+ str r9,[r8]
+ str r4,[r6]
+
+finalizer_no_reverse:
+ add r6,r8,#4
+ ldr r8,[r8,#4]
+ b determine_free_finalizers_after_compact1
+
+finalizer_not_used_after_compact1:
+ 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
+
+ ldr r8,[r8,#4]
+ str r8,[r6]
+
+ b determine_free_finalizers_after_compact1
+
+end_finalizers_after_compact1:
+ str r8,[r7]
+
+ 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]
+ laol r12,finalizer_list+1,finalizer_list_o_1,0
+ otoa r12,finalizer_list_o_1,0
+ str r12,[r6]
+ lao r12,finalizer_list,5
+ sto r4,r12,finalizer_list,5
+finalizer_list_already_reversed:
+finalizer_list_empty:
+
+ .if COMPACT_MARK_WITH_STACK
+ lao r9,free_finalizer_list,6
+ otoa r9,free_finalizer_list,6
+ ldr r6,[r9]
+ .else
+ lao r8,free_finalizer_list,6
+ otoa r8,free_finalizer_list,6
+ ldr r6,[r8]
+ .endif
+ laol r12,__Nil-4,__Nil_o_m4,7
+ otoa r12,__Nil_o_m4,7
+ cmp r6,r12
+ beq free_finalizer_list_empty
+ 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
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl rmark_stack_nodes
+ .else
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl mark_stack_nodes
+ .endif
+free_finalizer_list_empty:
+.endif
+
+ lao r12,heap_size_33,11
+ ldo r4,r12,heap_size_33,11
+ mov r3,r4
+ lsl r3,r3,#5
+
+ lao r12,heap_p3,13
+ ldo r12,r12,heap_p3,13
+ add r3,r3,r12
+
+ lao r12,end_heap_p3,0
+ sto r3,r12,end_heap_p3,0
+@ end_heap_p3 in r0
+ mov r0,r3
+
+ add r4,r4,#3
+ lsr r4,r4,#2
+@ vector_counter in r2
+ mov r2,r4
+
+ 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
+ lao r12,neg_heap_vector_plus_4,0
+ sto r3,r12,neg_heap_vector_plus_4,0
+
+ lao r12,heap_p3,14
+ ldo r10,r12,heap_p3,14
+ mov r9,#0
+@ heap_p3 in r11
+ mov r11,r10
+ b skip_zeros
+
+@ d0,a0,a2: free
+find_non_zero_long:
+skip_zeros:
+ subs r2,r2,#1
+ bcc end_copy
+ ldr r9,[r1],#4
+ cmp r9,#0
+ beq skip_zeros
+@ a2: free
+end_skip_zeros:
+ 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
+
+bsf_and_copy_nodes:
+ neg r12,r9
+ and r12,r12,r9
+ clz r3,r12
+ rsb r3,r3,#31
+
+copy_nodes:
+ ldr r4,[r8,r3,lsl #2]
+
+ bic r9,r9,r12
+
+ add r12,r8,#4
+ add r6,r12,r3,lsl #2
+ sub r4,r4,#1
+
+ tst r4,#2
+ beq begin_update_list_2
+
+ ldr r3,[r4,#-10]
+ subs r4,r4,#2
+
+ tst r3,#1
+ beq end_list_2
+find_descriptor_2:
+ and r3,r3,#-4
+ ldr r3,[r3]
+ tst r3,#1
+ bne find_descriptor_2
+
+end_list_2:
+ mov r7,r3
+ ldrh r3,[r3,#-2]
+ cmp r3,#256
+ blo no_record_arguments
+
+ ldrh r7,[r7,#-2+2]
+ subs r7,r7,#2
+ bhs copy_record_arguments_aa
+
+ sub r3,r3,#256
+ sub r3,r3,#3
+
+copy_record_arguments_all_b:
+ str r3,[sp,#-4]!
+ lao r12,heap_vector,10
+ ldo r3,r12,heap_vector,10
+
+update_up_list_1r:
+ mov r7,r4
+ sub r4,r4,r11
+
+ str r6,[sp,#-4]!
+
+ and r6,r4,#31*4
+ lsr r4,r4,#7
+ lsr r6,r6,#2
+ mov r12,#1
+ lsl r6,r12,r6
+
+ ldr r4,[r3,r4,lsl #2]
+
+ ands r4,r4,r6
+
+ ldr r6,[sp],#4
+ beq copy_argument_part_1r
+
+ ldr r4,[r7]
+ str r10,[r7]
+ subs r4,r4,#3
+ b update_up_list_1r
+
+copy_argument_part_1r:
+ ldr r4,[r7]
+ str r10,[r7]
+ str r4,[r10],#4
+
+ sub r4,r6,r11
+ lsr r4,r4,#2
+
+ mov r3,r4
+ and r3,r3,#31
+ cmp r3,#1
+ bhs bit_in_this_word
+
+ sub r2,r2,#1
+ ldr r9,[r1],#4
+
+ 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
+
+bit_in_this_word:
+ mov r12,#1
+ lsl r12,r12,r3
+ bic r9,r9,r12
+
+ ldr r3,[sp],#4
+
+copy_b_record_argument_part_arguments:
+ ldr r4,[r6],#4
+ str r4,[r10],#4
+ subs r3,r3,#1
+ bcs copy_b_record_argument_part_arguments
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+copy_record_arguments_aa:
+ mov r12,#(256+2)/2
+ sub r3,r3,r7
+ sub r3,r3,r12,lsl #1
+
+ str r3,[sp,#-4]!
+ str r7,[sp,#-4]!
+
+update_up_list_2r:
+ mov r7,r4
+ ldr r4,[r7]
+ and r3,r4,#3
+ subs r3,r3,#3
+ bne copy_argument_part_2r
+
+ str r10,[r7]
+ subs r4,r4,#3
+ b update_up_list_2r
+
+copy_argument_part_2r:
+ str r10,[r7]
+ cmp r4,r6
+ blo copy_record_argument_2
+.ifdef SHARE_CHAR_INT
+ cmp r4,r0
+ bhs copy_record_argument_2
+.endif
+ mov r7,r4
+ ldr r4,[r7]
+ add r3,r10,#1
+ str r3,[r7]
+copy_record_argument_2:
+ str r4,[r10],#4
+
+ ldr r3,[sp],#4
+ subs r3,r3,#1
+ bcc no_pointers_in_record
+
+copy_record_pointers:
+ ldr r7,[r6],#4
+ cmp r7,r6
+ blo copy_record_pointers_2
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bhs copy_record_pointers_2
+.endif
+ ldr r4,[r7]
+ add r10,r10,#1
+ str r10,[r7]
+ subs r10,r10,#1
+ mov r7,r4
+copy_record_pointers_2:
+ str r7,[r10],#4
+ subs r3,r3,#1
+ bcs copy_record_pointers
+
+no_pointers_in_record:
+ ldr r3,[sp],#4
+
+ subs r3,r3,#1
+ bcc no_non_pointers_in_record
+
+copy_non_pointers_in_record:
+ ldr r4,[r6],#4
+ str r4,[r10],#4
+ subs r3,r3,#1
+ bcs copy_non_pointers_in_record
+
+no_non_pointers_in_record:
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+no_record_arguments:
+ subs r3,r3,#3
+update_up_list_2:
+ mov r7,r4
+ ldr r4,[r4]
+ add r4,r4,#1
+ str r10,[r7]
+ tst r4,#3
+ bne copy_argument_part_2
+
+ subs r4,r4,#4
+ b update_up_list_2
+
+copy_argument_part_2:
+ sub r4,r4,#1
+ cmp r4,r6
+ bcc copy_arguments_1
+.ifdef SHARE_CHAR_INT
+ cmp r4,r0
+ bcs copy_arguments_1
+.endif
+ mov r7,r4
+ ldr r4,[r4]
+ add r10,r10,#1
+ str r10,[r7]
+ subs r10,r10,#1
+copy_arguments_1:
+ str r4,[r10],#4
+
+copy_argument_part_arguments:
+ ldr r7,[r6],#4
+ cmp r7,r6
+ bcc copy_arguments_2
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bcs copy_arguments_2
+.endif
+ ldr r4,[r7]
+ add r10,r10,#1
+ str r10,[r7]
+ subs r10,r10,#1
+ mov r7,r4
+copy_arguments_2:
+ str r7,[r10],#4
+ subs r3,r3,#1
+ bcs copy_argument_part_arguments
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+update_list_2_:
+ subs r4,r4,#1
+update_list_2:
+ str r10,[r7]
+begin_update_list_2:
+ mov r7,r4
+ ldr r4,[r4]
+update_list__2:
+ tst r4,#1
+ beq end_update_list_2
+ tst r4,#2
+ beq update_list_2_
+ add r7,r4,#-3
+ ldr r4,[r4,#-3]
+ b update_list__2
+
+end_update_list_2:
+ str r10,[r7]
+
+ str r4,[r10],#4
+
+ tst r4,#2
+ beq move_lazy_node
+
+ ldrh r3,[r4,#-2]
+ tst r3,r3
+ beq move_hnf_0
+
+ cmp r3,#256
+ bhs move_record
+
+ subs r3,r3,#2
+ bcc move_hnf_1
+ beq move_hnf_2
+
+move_hnf_3:
+ ldr r7,[r6],#4
+ cmp r7,r6
+ bcc move_hnf_3_1
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bcs move_hnf_3_1
+.endif
+ add r4,r10,#1
+ ldr r3,[r7]
+ str r4,[r7]
+ mov r7,r3
+move_hnf_3_1:
+ str r7,[r10]
+
+ ldr r7,[r6],#4
+ cmp r7,r6
+ bcc move_hnf_3_2
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bcs move_hnf_3_2
+.endif
+ add r4,r10,#4+2+1
+ ldr r3,[r7]
+ str r4,[r7]
+ mov r7,r3
+move_hnf_3_2:
+ str r7,[r10,#4]
+ add r10,r10,#8
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_hnf_2:
+ ldr r7,[r6],#4
+ cmp r7,r6
+ bcc move_hnf_2_1
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bcs move_hnf_2_1
+.endif
+ add r4,r10,#1
+ ldr r3,[r7]
+ str r4,[r7]
+ mov r7,r3
+move_hnf_2_1:
+ str r7,[r10]
+
+ ldr r7,[r6],#4
+ cmp r7,r6
+ bcc move_hnf_2_2
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bcs move_hnf_2_2
+.endif
+ add r4,r10,#4+1
+ ldr r3,[r7]
+ str r4,[r7]
+ mov r7,r3
+move_hnf_2_2:
+ str r7,[r10,#4]
+ add r10,r10,#8
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_hnf_1:
+ ldr r7,[r6],#4
+ cmp r7,r6
+ bcc move_hnf_1_
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bcs move_hnf_1_
+.endif
+ add r4,r10,#1
+ ldr r3,[r7]
+ str r4,[r7]
+ mov r7,r3
+move_hnf_1_:
+ str r7,[r10],#4
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_record:
+ mov r12,#258/2
+ subs r3,r3,r12,lsl #1
+ blo move_record_1
+ beq move_record_2
+
+move_record_3:
+ ldrh r3,[r4,#-2+2]
+ subs r3,r3,#1
+ bhi move_hnf_3
+
+ ldr r7,[r6],#4
+ blo move_record_3_1b
+
+move_record_3_1a:
+ cmp r7,r6
+ blo move_record_3_1b
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bhs move_record_3_1b
+.endif
+ add r4,r10,#1
+ ldr r3,[r7]
+ str r4,[r7]
+ mov r7,r3
+move_record_3_1b:
+ str r7,[r10],#4
+
+ ldr r7,[r6],#4
+ cmp r7,r6
+ blo move_record_3_2
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bhs move_record_3_2
+.endif
+ str r8,[sp,#-4]!
+ sub r4,r7,r11
+
+ lao r12,heap_vector,11
+ ldo r3,r12,heap_vector,11
+ add r4,r4,#4
+ and r8,r4,#31*4
+ lsr r4,r4,#7
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r3,r4,lsl #2]
+ tst r8,r12
+ beq not_linked_record_argument_part_3_b
+
+ sub r4,r10,r11
+
+ and r8,r4,#31*4
+ lsr r4,r4,#7
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r12,[r3,r4,lsl #2]
+ orr r12,r12,r8
+ str r12,[r3,r4,lsl #2]
+ ldr r8,[sp],#4
+ b linked_record_argument_part_3_b
+
+not_linked_record_argument_part_3_b:
+ ldr r12,[r3,r4,lsl #2]
+ orr r12,r12,r8
+ str r12,[r3,r4,lsl #2]
+
+ sub r4,r10,r11
+
+ and r8,r4,#31*4
+ lsr r4,r4,#7
+
+ lsr r8,r8,#2
+ mov r12,#1
+ mvn r8,r12,lsl r8
+
+ ldr r12,[r3,r4,lsl #2]
+ and r12,r12,r8
+ str r12,[r3,r4,lsl #2]
+ ldr r8,[sp],#4
+
+linked_record_argument_part_3_b:
+ ldr r3,[r7]
+ add r4,r10,#2+1
+ str r4,[r7]
+ mov r7,r3
+move_record_3_2:
+ str r7,[r10],#4
+
+ sub r3,r6,r11
+ lsr r3,r3,#2
+ subs r3,r3,#1
+ and r3,r3,#31
+ cmp r3,#2
+ blo bit_in_next_word
+
+ mov r12,#1
+ lsl r12,r12,r3
+ bic r9,r9,r12
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+bit_in_next_word:
+ sub r2,r2,#1
+ ldr r9,[r1],#4
+
+ mov r12,#1
+ lsl r12,r12,r3
+ bic r9,r9,r12
+
+ cmp r9,#0
+ beq skip_zeros
+ b end_skip_zeros
+
+move_record_2:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#1
+ bhi move_hnf_2
+ blo move_real_or_file
+
+move_record_2_ab:
+ ldr r7,[r6],#4
+ cmp r7,r6
+ blo move_record_2_1
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bhs move_record_2_1
+.endif
+ add r4,r10,#1
+ ldr r3,[r7]
+ str r4,[r7]
+ mov r7,r3
+move_record_2_1:
+ str r7,[r10]
+ ldr r3,[r6],#4
+ str r3,[r10,#4]
+ add r10,r10,#8
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_record_1:
+ ldrh r3,[r4,#-2+2]
+ tst r3,r3
+ bne move_hnf_1
+ b move_int_bool_or_char
+
+move_real_or_file:
+ ldr r4,[r6],#4
+ str r4,[r10],#4
+move_int_bool_or_char:
+ ldr r4,[r6],#4
+ str r4,[r10],#4
+copy_normal_hnf_0:
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_hnf_0:
+ laol r12,INT+2,INT_o_2,13
+ otoa r12,INT_o_2,13
+ cmp r4,r12
+ blo move_real_file_string_or_array
+ 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
+move_normal_hnf_0:
+.endif
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_real_file_string_or_array:
+ 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
+
+ ldr r4,[r6]
+ add r4,r4,#3
+ lsr r4,r4,#2
+
+cp_s_arg_lp3:
+ ldr r3,[r6],#4
+ str r3,[r10],#4
+ subs r4,r4,#1
+ bcs cp_s_arg_lp3
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_array:
+.ifdef DLL
+ laol r12,__ARRAY__+2,__ARRAY___o_2,2
+ otoa r12,__ARRAY___o_2,2
+ cmp r4,r12
+ blo move_normal_hnf_0
+.endif
+ cmp r9,#0
+ bne bsf_and_end_array_bit
+
+skip_zeros_a:
+ ldr r9,[r1],#4
+ sub r2,r2,#1
+ cmp r9,#0
+ beq skip_zeros_a
+
+ 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
+
+bsf_and_end_array_bit:
+ neg r12,r9
+ and r12,r12,r9
+ clz r3,r12
+ rsb r3,r3,#31
+
+end_array_bit:
+ bic r9,r9,r12
+
+ add r3,r8,r3,lsl #2
+
+ cmp r6,r3
+ bne move_a_array
+
+move_b_array:
+ ldr r7,[r6]
+ str r7,[r10]
+ ldr r3,[r6,#4]!
+ ldrh r4,[r3,#-2]
+ add r10,r10,#4
+ tst r4,r4
+ beq move_strict_basic_array
+
+ subs r4,r4,#256
+ mul r7,r4,r7
+ mov r4,r7
+ b cp_s_arg_lp3
+
+move_strict_basic_array:
+ mov r4,r7
+ laol r12,INT+2,INT_o_2,14
+ otoa r12,INT_o_2,14
+ cmp r3,r12
+ beq cp_s_arg_lp3
+
+ laol r12,BOOL+2,BOOL_o_2,7
+ otoa r12,BOOL_o_2,7
+ cmp r3,r12
+ beq move_bool_array
+
+ add r4,r4,r4
+ b cp_s_arg_lp3
+
+move_bool_array:
+ add r4,r4,#3
+ lsr r4,r4,#2
+ b cp_s_arg_lp3
+
+move_a_array:
+ mov r7,r3
+ subs r3,r3,r6
+ lsr r3,r3,#2
+
+ str r9,[sp,#-4]!
+
+ subs r3,r3,#1
+ blo end_array
+
+ ldr r9,[r6]
+ ldr r4,[r7,#-4]
+ str r9,[r7,#-4]
+ str r4,[r10]
+ ldr r4,[r7]
+ ldr r9,[r6,#4]
+ add r6,r6,#8
+ str r9,[r7]
+ str r4,[r10,#4]
+ add r10,r10,#8
+ tst r4,r4
+ beq st_move_array_lp
+
+ ldrh r9,[r4,#-2+2]
+ ldrh r4,[r4,#-2]
+ subs r4,r4,#256
+ cmp r4,r9
+ beq st_move_array_lp
+
+move_array_ab:
+ str r6,[sp,#-4]!
+
+ ldr r7,[r10,#-8]
+ mov r3,r9
+ mul r7,r4,r7
+ lsl r7,r7,#2
+
+ subs r4,r4,r3
+ add r7,r7,r6
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl reorder
+
+ ldr r6,[sp],#4
+ subs r3,r3,#1
+ subs r4,r4,#1
+
+ str r3,[sp,#-4]!
+ str r4,[sp,#-4]!
+ ldr r12,[r10,#-8]
+ str r12,[sp,#-4]!
+ b st_move_array_lp_ab
+
+move_array_ab_lp1:
+ ldr r4,[sp,#8]
+move_array_ab_a_elements:
+ ldr r3,[r6],#4
+ cmp r3,r6
+ blo move_array_element_ab
+.ifdef SHARE_CHAR_INT
+ cmp r3,r0
+ bcs move_array_element_ab
+.endif
+ mov r7,r3
+ ldr r3,[r7]
+ add r10,r10,#1
+ str r10,[r7]
+ subs r10,r10,#1
+move_array_element_ab:
+ str r3,[r10],#4
+ subs r4,r4,#1
+ bcs move_array_ab_a_elements
+
+ ldr r4,[sp,#4]
+move_array_ab_b_elements:
+ ldr r3,[r6],#4
+ str r3,[r10],#4
+ subs r4,r4,#1
+ bcs move_array_ab_b_elements
+
+st_move_array_lp_ab:
+ ldr r12,[sp]
+ subs r12,r12,#1
+ str r12,[sp]
+ bcs move_array_ab_lp1
+
+ add sp,sp,#12
+ b end_array
+
+move_array_lp1:
+ ldr r4,[r6],#4
+ add r10,r10,#4
+ cmp r4,r6
+ blo move_array_element
+.ifdef SHARE_CHAR_INT
+ cmp r4,r0
+ bcs move_array_element
+.endif
+ ldr r9,[r4]
+ mov r7,r4
+ str r9,[r10,#-4]
+ add r4,r10,#-4+1
+ str r4,[r7]
+
+ subs r3,r3,#1
+ bcs move_array_lp1
+
+ b end_array
+
+move_array_element:
+ str r4,[r10,#-4]
+st_move_array_lp:
+ subs r3,r3,#1
+ bcs move_array_lp1
+
+end_array:
+ ldr r9,[sp],#4
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_lazy_node:
+ mov r7,r4
+ ldr r3,[r7,#-4]
+ tst r3,r3
+ beq move_lazy_node_0
+
+ subs r3,r3,#1
+ ble move_lazy_node_1
+
+ cmp r3,#256
+ bge move_closure_with_unboxed_arguments
+
+move_lazy_node_arguments:
+ ldr r7,[r6],#4
+ cmp r7,r6
+ bcc move_lazy_node_arguments_
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bcs move_lazy_node_arguments_
+.endif
+ ldr r4,[r7]
+ str r4,[r10]
+ add r4,r10,#1
+ add r10,r10,#4
+ str r4,[r7]
+ subs r3,r3,#1
+ bcs move_lazy_node_arguments
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_lazy_node_arguments_:
+ str r7,[r10],#4
+ subs r3,r3,#1
+ bcs move_lazy_node_arguments
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_lazy_node_1:
+ ldr r7,[r6],#4
+ cmp r7,r6
+ bcc move_lazy_node_1_
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bcs move_lazy_node_1_
+.endif
+ add r4,r10,#1
+ ldr r3,[r7]
+ str r4,[r7]
+ mov r7,r3
+move_lazy_node_1_:
+ str r7,[r10]
+ add r10,r10,#8
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_lazy_node_0:
+ add r10,r10,#8
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_closure_with_unboxed_arguments:
+ beq move_closure_with_unboxed_arguments_1
+ add r3,r3,#1
+ mov r4,r3
+ and r3,r3,#255
+ lsr r4,r4,#8
+ subs r3,r3,r4
+ beq move_non_pointers_of_closure
+
+ str r4,[sp,#-4]!
+
+move_closure_with_unboxed_arguments_lp:
+ ldr r7,[r6],#4
+ cmp r7,r6
+ bcc move_closure_with_unboxed_arguments_
+.ifdef SHARE_CHAR_INT
+ cmp r7,r0
+ bcs move_closure_with_unboxed_arguments_
+.endif
+ ldr r4,[r7]
+ str r4,[r10]
+ add r4,r10,#1
+ add r10,r10,#4
+ str r4,[r7]
+ subs r3,r3,#1
+ bne move_closure_with_unboxed_arguments_lp
+
+ ldr r4,[sp],#4
+ b move_non_pointers_of_closure
+
+move_closure_with_unboxed_arguments_:
+ str r7,[r10],#4
+ subs r3,r3,#1
+ bne move_closure_with_unboxed_arguments_lp
+
+ ldr r4,[sp],#4
+
+move_non_pointers_of_closure:
+ ldr r3,[r6],#4
+ str r3,[r10],#4
+ subs r4,r4,#1
+ bne move_non_pointers_of_closure
+
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+move_closure_with_unboxed_arguments_1:
+ ldr r4,[r6]
+ str r4,[r10]
+ add r10,r10,#8
+ cmp r9,#0
+ bne bsf_and_copy_nodes
+ b find_non_zero_long
+
+.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
+ lao r12,finalizer_list,6
+ ldo r6,r12,finalizer_list,6
+
+restore_finalizer_descriptors:
+ laol r12,__Nil-4,__Nil_o_m4,8
+ otoa r12,__Nil_o_m4,8
+ cmp r6,r12
+ beq end_restore_finalizer_descriptors
+
+ 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
+
+end_restore_finalizer_descriptors:
+.endif
diff --git a/thumb2compact_rmark.s b/thumb2compact_rmark.s
new file mode 100644
index 0000000..9c2726c
--- /dev/null
+++ b/thumb2compact_rmark.s
@@ -0,0 +1,1012 @@
+
+ZERO_ARITY_DESCRIPTOR_OFFSET = -4
+
+rmark_stack_nodes1:
+ ldr r3,[r6]
+ add r4,r9,#1
+ str r3,[r9]
+ str r4,[r6]
+
+rmark_next_stack_node:
+ add r9,r9,#4
+rmark_stack_nodes:
+ lao r12,end_vector,16
+ ldo r12,r12,end_vector,16
+ cmp r9,r12
+ beq end_rmark_nodes
+
+rmark_more_stack_nodes:
+ ldr r6,[r9]
+
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_stack_node
+
+ lsr r3,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r8,[r10,r3,lsl #2]
+ tst r8,r4
+ bne rmark_stack_nodes1
+
+ orr r8,r8,r4
+ str r8,[r10,r3,lsl #2]
+
+ ldr r4,[r6]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl rmark_stack_node
+
+ add r9,r9,#4
+ lao r12,end_vector,17
+ ldo r12,r12,end_vector,17
+ cmp r9,r12
+ bne rmark_more_stack_nodes
+ ldr pc,[sp],#4
+
+rmark_stack_node:
+ subs sp,sp,#8
+ str r4,[r9]
+ add r8,r9,#1
+ str r9,[sp,#4]
+ mov r3,#-1
+ mov r12,#0
+ str r12,[sp]
+ str r8,[r6]
+ b rmark_no_reverse
+
+rmark_node_d1:
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_node
+
+ b rmark_node_
+
+rmark_hnf_2:
+ add r3,r6,#4
+ ldr r4,[r6,#4]
+ sub sp,sp,#8
+
+ mov r9,r6
+ ldr r6,[r6]
+
+ str r3,[sp,#4]
+ str r4,[sp]
+
+ cmp sp,r0
+ blo rmark_using_reversal
+
+rmark_node:
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_node
+
+ mov r3,r9
+
+rmark_node_:
+ lsr r7,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ ldr r8,[r10,r7,lsl #2]
+ mov r12,#1
+ lsl r4,r12,r4
+ tst r8,r4
+ bne rmark_reverse_and_mark_next_node
+
+ orr r8,r8,r4
+ str r8,[r10,r7,lsl #2]
+
+ ldr r4,[r6]
+rmark_arguments:
+ cmp r6,r3
+ bhi rmark_no_reverse
+
+ add r8,r9,#1
+ str r4,[r9]
+ str r8,[r6]
+
+rmark_no_reverse:
+ tst r4,#2
+ beq rmark_lazy_node
+
+ ldrh r8,[r4,#-2]
+ tst r8,r8
+ beq rmark_hnf_0
+
+ add r6,r6,#4
+
+ cmp r8,#256
+ bhs rmark_record
+
+ subs r8,r8,#2
+ beq rmark_hnf_2
+ bcc rmark_hnf_1
+
+rmark_hnf_3:
+ ldr r7,[r6,#4]
+rmark_hnf_3_:
+ cmp sp,r0
+ blo rmark_using_reversal_
+
+ sub r4,r7,r11
+
+ lsr r3,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r3,lsl #2]
+ tst r4,r12
+ bne rmark_shared_argument_part
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r3,lsl #2]
+
+rmark_no_shared_argument_part:
+ subs sp,sp,#8
+ str r6,[sp,#4]
+ add r9,r6,#4
+ ldr r6,[r6]
+ add r7,r7,r8,lsl #2
+ str r6,[sp]
+
+rmark_push_hnf_args:
+ ldr r3,[r7]
+ subs sp,sp,#8
+ str r7,[sp,#4]
+ subs r7,r7,#4
+ str r3,[sp]
+
+ subs r8,r8,#1
+ bgt rmark_push_hnf_args
+
+ ldr r6,[r7]
+
+ cmp r7,r9
+ bhi rmark_no_reverse_argument_pointer
+
+ add r8,r9,#3
+ str r6,[r9]
+ str r8,[r7]
+
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_node
+
+ mov r3,r7
+ b rmark_node_
+
+rmark_no_reverse_argument_pointer:
+ mov r9,r7
+ b rmark_node
+
+rmark_shared_argument_part:
+ cmp r7,r6
+ bhi rmark_hnf_1
+
+ ldr r3,[r7]
+ add r4,r6,#4+2+1
+ str r4,[r7]
+ str r3,[r6,#4]
+ b rmark_hnf_1
+
+rmark_record:
+ mov r12,#258/2
+ subs r8,r8,r12,lsl #1
+ beq rmark_record_2
+ blo rmark_record_1
+
+rmark_record_3:
+ ldrh r8,[r4,#-2+2]
+ ldr r7,[r6,#4]
+ subs r8,r8,#1
+ blo rmark_record_3_bb
+ beq rmark_record_3_ab
+ subs r8,r8,#1
+ beq rmark_record_3_aab
+ b rmark_hnf_3_
+
+rmark_record_3_bb:
+ subs r6,r6,#4
+
+ sub r4,r7,r11
+
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ cmp r7,r6
+ bhi rmark_next_node
+
+ add r4,r4,r4
+ bne rmark_bit_in_same_word1
+ add r8,r8,#1
+ mov r4,#1
+rmark_bit_in_same_word1:
+ ldr r12,[r10,r8,lsl #2]
+ tst r4,r12
+ beq rmark_not_yet_linked_bb
+
+ sub r4,r6,r11
+
+ add r4,r4,#2*4
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+rmark_not_yet_linked_bb:
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ ldr r8,[r7]
+ add r4,r6,#8+2+1
+ str r8,[r6,#8]
+ str r4,[r7]
+ b rmark_next_node
+
+rmark_record_3_ab:
+ sub r4,r7,r11
+
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ cmp r7,r6
+ bhi rmark_hnf_1
+
+ adds r4,r4,r4
+ bne rmark_bit_in_same_word2
+ add r8,r8,#1
+ mov r4,#1
+rmark_bit_in_same_word2:
+ ldr r12,[r10,r8,lsl #2]
+ tst r4,r12
+ beq rmark_not_yet_linked_ab
+
+ sub r4,r6,r11
+
+ add r4,r4,#4
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r10,r8,lsl #2]
+rmark_not_yet_linked_ab:
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ ldr r8,[r7]
+ add r4,r6,#4+2+1
+ str r8,[r6,#4]
+ str r4,[r7]
+ b rmark_hnf_1
+
+rmark_record_3_aab:
+ cmp sp,r0
+ blo rmark_using_reversal_
+
+ sub r4,r7,r11
+
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ tst r4,r12
+ bne rmark_shared_argument_part
+
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ subs sp,sp,#8
+ str r6,[sp,#4]
+ add r9,r6,#4
+ ldr r6,[r6]
+ str r6,[sp]
+
+ ldr r6,[r7]
+
+ cmp r7,r9
+ bhi rmark_no_reverse_argument_pointer
+
+ add r8,r9,#3
+ str r6,[r9]
+ str r8,[r7]
+
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_node
+
+ mov r3,r7
+ b rmark_node_
+
+rmark_record_2:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#1
+ bhi rmark_hnf_2
+ beq rmark_hnf_1
+ b rmark_next_node
+
+rmark_record_1:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#0
+ bne rmark_hnf_1
+ b rmark_next_node
+
+rmark_lazy_node_1:
+@ selectors:
+ bne rmark_selector_node_1
+
+rmark_hnf_1:
+ mov r9,r6
+ ldr r6,[r6]
+ b rmark_node
+
+@ selectors
+rmark_indirection_node:
+ subs r6,r6,#4
+ sub r7,r6,r11
+
+ and r8,r7,#31*4
+ lsr r7,r7,#7
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r12,[r10,r7,lsl #2]
+ bic r12,r12,r8
+ str r12,[r10,r7,lsl #2]
+
+ mov r7,r6
+ cmp r6,r3
+ ldr r6,[r6,#4]
+ str r6,[r9]
+ bhi rmark_node_d1
+ str r4,[r7]
+ b rmark_node_d1
+
+rmark_selector_node_1:
+ cmp r8,#(-2)-1
+ beq rmark_indirection_node
+
+ ldr r7,[r6]
+ mov r1,r3
+
+ sub r3,r7,r11
+ lsr r3,r3,#2
+
+ cmp r8,#(-3)-1
+ ble rmark_record_selector_node_1
+
+ and r8,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+ ldr r3,[r7]
+ tst r3,#2
+ beq rmark_hnf_1
+
+ ldrh r12,[r3,#-2]
+ cmp r12,#2
+ bls rmark_small_tuple_or_record
+
+rmark_large_tuple_or_record:
+ ldr r3,[r7,#8]
+ sub r3,r3,r11
+ lsr r3,r3,#2
+
+ and r8,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+ add r12,r6,#-4
+ sub r3,r12,r11
+
+ str r6,[sp,#-4]!
+
+.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
+ blt rmark_tuple_or_record_selector_node_2
+ ldr r7,[r7,#8]
+ beq rmark_tuple_selector_node_2
+ add r6,r4,#-12
+ ldr r6,[r7,r6]
+ ldr r7,[sp],#4
+ str r6,[r9]
+ lao r12,e__system__nind,17
+ otoa r12,e__system__nind,17
+ str r12,[r7,#-4]
+ str r6,[r7]
+ b rmark_node_d1
+
+rmark_tuple_selector_node_2:
+ ldr r6,[r7]
+ ldr r7,[sp],#4
+ str r6,[r9]
+ lao r12,e__system__nind,18
+ otoa r12,e__system__nind,18
+ str r12,[r7,#-4]
+ str r6,[r7]
+ b rmark_node_d1
+
+rmark_record_selector_node_1:
+ beq rmark_strict_record_selector_node_1
+
+ and r8,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+ ldr r3,[r7]
+ tst r3,#2
+ beq rmark_hnf_1
+
+ ldrh r12,[r3,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls rmark_small_tuple_or_record
+
+ ldr r3,[r7,#8]
+ sub r3,r3,r11
+ lsr r3,r3,#2
+
+ and r8,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+rmark_small_tuple_or_record:
+ add r12,r6,#-4
+ sub r3,r12,r11
+
+ str r6,[sp,#-4]!
+
+.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
+ ble rmark_tuple_or_record_selector_node_2
+ ldr r7,[r7,#8]
+ subs r4,r4,#12
+rmark_tuple_or_record_selector_node_2:
+ ldr r6,[r7,r4]
+ ldr r7,[sp],#4
+ str r6,[r9]
+ lao r12,e__system__nind,19
+ otoa r12,e__system__nind,19
+ str r12,[r7,#-4]
+ str r6,[r7]
+ b rmark_node_d1
+
+rmark_strict_record_selector_node_1:
+ and r8,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+ ldr r3,[r7]
+ tst r3,#2
+ beq rmark_hnf_1
+
+ ldrh r12,[r3,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls rmark_select_from_small_record
+
+ ldr r3,[r7,#8]
+ sub r3,r3,r11
+
+ and r8,r3,#31*4
+ lsr r3,r3,#7
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+rmark_select_from_small_record:
+ ldr r3,[r4,#-8]
+.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]
+ add r4,r4,r12
+ ldr r4,[r4,#-12]
+ b rmark_strict_record_selector_node_3
+rmark_strict_record_selector_node_2:
+ ldr r4,[r7,r4]
+rmark_strict_record_selector_node_3:
+ str r4,[r6,#4]
+
+.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]
+ 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]
+ add r4,r4,r12
+ ldr r4,[r4,#-12]
+ b rmark_strict_record_selector_node_7
+rmark_strict_record_selector_node_6:
+ ldr r4,[r7,r4]
+rmark_strict_record_selector_node_7:
+ str r4,[r6,#4]
+
+.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
+ ble rmark_strict_record_selector_node_8
+ ldr r7,[r7,#8]
+ subs r4,r4,#12
+rmark_strict_record_selector_node_8:
+ ldr r4,[r7,r4]
+ str r4,[r6,#8]
+rmark_strict_record_selector_node_9:
+
+.ifdef PIC
+ ldr r4,[r3,#-4-4]
+.else
+ ldr r4,[r3,#-4]
+.endif
+ str r4,[r6]
+ b rmark_next_node
+
+rmark_reverse_and_mark_next_node:
+ cmp r6,r3
+ bhi rmark_next_node
+
+ ldr r4,[r6]
+ str r4,[r9]
+ add r9,r9,#1
+ str r9,[r6]
+
+@ a2,d1: free
+
+rmark_next_node:
+ ldr r6,[sp]
+ ldr r9,[sp,#4]
+ add sp,sp,#8
+
+ cmp r6,#1
+ bhi rmark_node
+
+rmark_next_node_:
+end_rmark_nodes:
+ ldr pc,[sp],#4
+
+rmark_lazy_node:
+ ldr r8,[r4,#-4]
+ cmp r8,#0
+ beq rmark_next_node
+
+ add r6,r6,#4
+
+ subs r8,r8,#1
+ ble rmark_lazy_node_1
+
+ cmp r8,#255
+ bge rmark_closure_with_unboxed_arguments
+
+rmark_closure_with_unboxed_arguments_:
+ add r6,r6,r8,lsl #2
+
+rmark_push_lazy_args:
+ ldr r3,[r6]
+ sub sp,sp,#8
+ str r6,[sp,#4]
+ sub r6,r6,#4
+ str r3,[sp]
+ subs r8,r8,#1
+ bgt rmark_push_lazy_args
+
+ mov r9,r6
+ ldr r6,[r6]
+ cmp sp,r0
+ bhs rmark_node
+
+ b rmark_using_reversal
+
+rmark_closure_with_unboxed_arguments:
+@ (a_size+b_size)+(b_size<<8)
+@ addl $1,a2
+ mov r4,r8
+ and r8,r8,#255
+ lsr r4,r4,#8
+ subs r8,r8,r4
+@ subl $1,a2
+ bgt rmark_closure_with_unboxed_arguments_
+ beq rmark_hnf_1
+ b rmark_next_node
+
+rmark_hnf_0:
+ laol r12,INT+2,INT_o_2,11
+ otoa r12,INT_o_2,11
+ cmp r4,r12
+ beq rmark_int_3
+
+ laol r12,CHAR+2,CHAR_o_2,6
+ otoa r12,CHAR_o_2,6
+ cmp r4,r12
+ beq rmark_char_3
+
+ blo rmark_no_normal_hnf_0
+
+ sub r8,r6,r11
+
+ and r7,r8,#31*4
+ lsr r8,r8,#7
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ ldr r12,[r10,r8,lsl #2]
+ bic r12,r12,r7
+ str r12,[r10,r8,lsl #2]
+
+ add r7,r4,#ZERO_ARITY_DESCRIPTOR_OFFSET-2
+ str r7,[r9]
+ cmp r6,r3
+ bhi rmark_next_node
+ str r4,[r6]
+ b rmark_next_node
+
+rmark_int_3:
+ ldr r8,[r6,#4]
+ cmp r8,#33
+ bcs rmark_next_node
+
+ lao r12,small_integers,3
+ otoa r12,small_integers,3
+ add r7,r12,r8,lsl #3
+ str r7,[r9]
+ sub r8,r6,r11
+
+ and r7,r8,#31*4
+ lsr r8,r8,#7
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ ldr r12,[r10,r8,lsl #2]
+ bic r12,r12,r7
+ str r12,[r10,r8,lsl #2]
+
+ cmp r6,r3
+ bhi rmark_next_node
+ str r4,[r6]
+ b rmark_next_node
+
+rmark_char_3:
+ ldrb r7,[r6,#4]
+
+ lao r12,static_characters,3
+ otoa r12,static_characters,3
+ add r7,r12,r7,lsl #3
+ sub r8,r6,r11
+
+ str r7,[r9]
+
+ and r7,r8,#31*4
+ lsr r8,r8,#7
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ ldr r12,[r10,r8,lsl #2]
+ bic r12,r12,r7
+ str r12,[r10,r8,lsl #2]
+
+ cmp r6,r3
+ bhi rmark_next_node
+ str r4,[r6]
+ b rmark_next_node
+
+rmark_no_normal_hnf_0:
+ laol r12,__ARRAY__+2,__ARRAY___o_2,17
+ otoa r12,__ARRAY___o_2,17
+ cmp r4,r12
+ bne rmark_next_node
+
+ ldr r4,[r6,#8]
+ tst r4,r4
+ beq rmark_lazy_array
+
+ ldrh r7,[r4,#-2+2]
+ tst r7,r7
+ beq rmark_b_array
+
+ ldrh r4,[r4,#-2]
+ tst r4,r4
+ beq rmark_b_array
+
+ cmp sp,r0
+ blo rmark_array_using_reversal
+
+ subs r4,r4,#256
+ cmp r7,r4
+ mov r3,r7
+ beq rmark_a_record_array
+
+rmark_ab_record_array:
+ ldr r7,[r6,#4]
+ add r6,r6,#8
+ str r6,[sp,#-4]!
+
+ mul r7,r4,r7
+ lsl r7,r7,#2
+
+ subs r4,r4,r3
+ add r6,r6,#4
+ add r7,r7,r6
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl reorder
+
+ ldr r6,[sp],#4
+ mov r4,r3
+ ldr r12,[r6,#-4]
+ mul r4,r12,r4
+ b rmark_lr_array
+
+rmark_b_array:
+ sub r4,r6,r11
+
+ add r4,r4,#4
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+ b rmark_next_node
+
+rmark_a_record_array:
+ ldr r4,[r6,#4]
+ add r6,r6,#8
+ cmp r3,#2
+ blo rmark_lr_array
+
+ mul r4,r3,r4
+ b rmark_lr_array
+
+rmark_lazy_array:
+ cmp sp,r0
+ blo rmark_array_using_reversal
+
+ ldr r4,[r6,#4]
+ add r6,r6,#8
+
+rmark_lr_array:
+ sub r3,r6,r11
+ lsr r3,r3,#2
+ add r3,r3,r4
+
+ lsr r7,r3,#5
+ and r3,r3,#31
+ mov r12,#1
+ lsl r3,r12,r3
+ ldr r12,[r10,r7,lsl #2]
+ orr r12,r12,r3
+ str r12,[r10,r7,lsl #2]
+
+ cmp r4,#1
+ bls rmark_array_length_0_1
+ mov r7,r6
+ add r6,r6,r4,lsl #2
+
+ ldr r4,[r6]
+ ldr r3,[r7]
+ str r4,[r7]
+ str r3,[r6]
+
+ ldr r4,[r6,#-4]!
+ ldr r3,[r7,#-4]!
+ str r3,[r6]
+ str r4,[r7]
+ str r6,[sp,#-4]!
+ mov r9,r7
+ b rmark_array_nodes
+
+rmark_array_nodes1:
+ cmp r6,r9
+ bhi rmark_next_array_node
+
+ ldr r3,[r6]
+ add r4,r9,#1
+ str r3,[r9]
+ str r4,[r6]
+
+rmark_next_array_node:
+ add r9,r9,#4
+ ldr r12,[sp]
+ cmp r9,r12
+ beq end_rmark_array_node
+
+rmark_array_nodes:
+ ldr r6,[r9]
+
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_array_node
+
+ lsr r3,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r8,[r10,r3,lsl #2]
+ tst r8,r4
+ bne rmark_array_nodes1
+
+ orr r8,r8,r4
+ str r8,[r10,r3,lsl #2]
+
+ ldr r4,[r6]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl rmark_array_node
+
+ add r9,r9,#4
+ ldr r12,[sp]
+ cmp r9,r12
+ bne rmark_array_nodes
+
+end_rmark_array_node:
+ add sp,sp,#4
+ b rmark_next_node
+
+rmark_array_node:
+ sub sp,sp,#8
+ str r9,[sp,#4]
+ mov r3,r9
+ mov r12,#1
+ str r12,[sp]
+ b rmark_arguments
+
+rmark_array_length_0_1:
+ add r6,r6,#-8
+ blo rmark_next_node
+
+ ldr r3,[r6,#12]
+ ldr r8,[r6,#8]
+ str r8,[r6,#12]
+ ldr r8,[r6,#4]
+ str r8,[r6,#8]
+ str r3,[r6,#4]
+ add r6,r6,#4
+ b rmark_hnf_1
+
+.ifdef PIC
+ lto end_vector,16
+ lto end_vector,17
+ lto e__system__nind,17
+ lto e__system__nind,18
+ lto e__system__nind,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/thumb2compact_rmarkr.s b/thumb2compact_rmarkr.s
new file mode 100644
index 0000000..e9f986f
--- /dev/null
+++ b/thumb2compact_rmarkr.s
@@ -0,0 +1,1045 @@
+
+ZERO_ARITY_DESCRIPTOR_OFFSET = -4
+NO_BIT_INSTRUCTIONS = 1
+
+rmark_using_reversal:
+ str r9,[sp,#-4]!
+ str r9,[sp,#-4]!
+ mov r9,#1
+ b rmarkr_node
+
+rmark_using_reversal_:
+ subs r6,r6,#4
+ str r3,[sp,#-4]!
+ str r9,[sp,#-4]!
+ cmp r6,r3
+ bhi rmark_no_undo_reverse_1
+ str r6,[r9]
+ str r4,[r6]
+rmark_no_undo_reverse_1:
+ mov r9,#1
+ b rmarkr_arguments
+
+rmark_array_using_reversal:
+ str r3,[sp,#-4]!
+ str r9,[sp,#-4]!
+ cmp r6,r3
+ bhi rmark_no_undo_reverse_2
+ str r6,[r9]
+ 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
+ b rmarkr_arguments
+
+rmarkr_hnf_2:
+ ldr r12,[r6]
+ orr r12,r12,#2
+ str r12,[r6]
+ ldr r8,[r6,#4]
+ str r9,[r6,#4]
+ add r9,r6,#4
+ mov r6,r8
+
+rmarkr_node:
+ sub r4,r6,r11
+ cmp r4,r2
+ bhs rmarkr_next_node_after_static
+
+ lsr r3,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r8,[r10,r3,lsl #2]
+ tst r8,r4
+ bne rmarkr_next_node
+
+ orr r8,r8,r4
+ str r8,[r10,r3,lsl #2]
+
+rmarkr_arguments:
+ ldr r4,[r6]
+ tst r4,#2
+ beq rmarkr_lazy_node
+
+ ldrh r8,[r4,#-2]
+ tst r8,r8
+ beq rmarkr_hnf_0
+
+ add r6,r6,#4
+
+ cmp r8,#256
+ bhs rmarkr_record
+
+ subs r8,r8,#2
+ beq rmarkr_hnf_2
+ blo rmarkr_hnf_1
+
+rmarkr_hnf_3:
+ ldr r7,[r6,#4]
+
+ sub r4,r7,r11
+
+ lsr r3,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r3,lsl #2]
+ tst r4,r12
+ bne rmarkr_shared_argument_part
+
+ orr r12,r12,r4
+ str r12,[r10,r3,lsl #2]
+
+rmarkr_no_shared_argument_part:
+ ldr r12,[r6]
+ orr r12,r12,#2
+ str r12,[r6]
+ str r9,[r6,#4]
+ add r6,r6,#4
+
+ ldr r12,[r7]
+ orr r12,r12,#1
+ str r12,[r7]
+ add r7,r7,r8,lsl #2
+
+ ldr r8,[r7]
+ str r6,[r7]
+ mov r9,r7
+ mov r6,r8
+ b rmarkr_node
+
+rmarkr_shared_argument_part:
+ cmp r7,r6
+ bhi rmarkr_hnf_1
+
+ ldr r3,[r7]
+ add r4,r6,#4+2+1
+ str r4,[r7]
+ str r3,[r6,#4]
+ b rmarkr_hnf_1
+
+rmarkr_record:
+ mov r12,#258/2
+ subs r8,r8,r12,lsl #1
+ beq rmarkr_record_2
+ blo rmarkr_record_1
+
+rmarkr_record_3:
+ ldrh r8,[r4,#-2+2]
+ subs r8,r8,#1
+ blo rmarkr_record_3_bb
+ beq rmarkr_record_3_ab
+ subs r8,r8,#1
+ beq rmarkr_record_3_aab
+ b rmarkr_hnf_3
+
+rmarkr_record_3_bb:
+ ldr r7,[r6,#8-4]
+ subs r6,r6,#4
+
+ sub r4,r7,r11
+
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ cmp r7,r6
+ bhi rmarkr_next_node
+
+ add r4,r4,r4
+ bne rmarkr_bit_in_same_word1
+ add r8,r8,#1
+ mov r4,#1
+rmarkr_bit_in_same_word1:
+ ldr r12,[r10,r8,lsl #2]
+ tst r4,r12
+ beq rmarkr_not_yet_linked_bb
+
+ sub r4,r6,r11
+
+ add r4,r4,#2*4
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+rmarkr_not_yet_linked_bb:
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ ldr r8,[r7]
+ add r4,r6,#8+2+1
+ str r8,[r6,#8]
+ str r4,[r7]
+ b rmarkr_next_node
+
+rmarkr_record_3_ab:
+ ldr r7,[r6,#4]
+
+ sub r4,r7,r11
+
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ cmp r7,r6
+ bhi rmarkr_hnf_1
+
+ add r4,r4,r4
+ bne rmarkr_bit_in_same_word2
+ add r8,r8,#1
+ mov r4,#1
+rmarkr_bit_in_same_word2:
+ ldr r12,[r10,r8,lsl #2]
+ tst r4,r12
+ beq rmarkr_not_yet_linked_ab
+
+ sub r4,r6,r11
+
+ add r4,r4,#4
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+rmarkr_not_yet_linked_ab:
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ ldr r8,[r7]
+ add r4,r6,#4+2+1
+ str r8,[r6,#4]
+ str r4,[r7]
+ b rmarkr_hnf_1
+
+rmarkr_record_3_aab:
+ ldr r7,[r6,#4]
+
+ sub r4,r7,r11
+
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ tst r4,r12
+ bne rmarkr_shared_argument_part
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ ldr r12,[r6]
+ add r12,r12,#2
+ str r12,[r6]
+ str r9,[r6,#4]
+ add r6,r6,#4
+
+ ldr r9,[r7]
+ str r6,[r7]
+ mov r6,r9
+ add r9,r7,#1
+ b rmarkr_node
+
+rmarkr_record_2:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#1
+ bhi rmarkr_hnf_2
+ beq rmarkr_hnf_1
+ subs r6,r6,#4
+ b rmarkr_next_node
+
+rmarkr_record_1:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#0
+ bne rmarkr_hnf_1
+ subs r6,r6,#4
+ b rmarkr_next_node
+
+rmarkr_lazy_node_1:
+@ selectors:
+ bne rmarkr_selector_node_1
+
+rmarkr_hnf_1:
+ ldr r8,[r6]
+ str r9,[r6]
+
+ add r9,r6,#2
+ mov r6,r8
+ b rmarkr_node
+
+@ selectors
+rmarkr_indirection_node:
+ add r12,r6,#-4
+ sub r3,r12,r11
+
+ and r4,r3,#31*4
+ lsr r3,r3,#7
+ lsr r12,r4,#2
+ mov r4,#1
+ lsl r4,r4,r12
+ ldr r12,[r10,r3,lsl #2]
+ bic r12,r12,r4
+ str r12,[r10,r3,lsl #2]
+
+ ldr r6,[r6]
+ b rmarkr_node
+
+rmarkr_selector_node_1:
+ cmp r8,#(-2)-1
+ beq rmarkr_indirection_node
+
+ ldr r7,[r6]
+
+ sub r3,r7,r11
+ lsr r3,r3,#2
+
+ cmp r8,#(-3)-1
+ ble rmarkr_record_selector_node_1
+
+ str r4,[sp,#-4]!
+ and r4,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r4
+ ldr r4,[sp],#4
+ bne rmarkr_hnf_1
+
+ ldr r3,[r7]
+ tst r3,#2
+ beq rmarkr_hnf_1
+
+ ldrh r12,[r3,#-2]
+ cmp r12,#2
+ bls rmarkr_small_tuple_or_record
+
+rmarkr_large_tuple_or_record:
+ ldr r3,[r7,#8]
+ sub r3,r3,r11
+ lsr r3,r3,#2
+
+ str r4,[sp,#-4]!
+ and r4,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r4
+ ldr r4,[sp],#4
+ bne rmarkr_hnf_1
+
+ add r12,r6,#-4
+ sub r3,r12,r11
+
+ str r6,[sp,#-4]!
+
+.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
+ cmp r4,#8
+ blt rmarkr_tuple_or_record_selector_node_2
+ ldr r7,[r7,#8]
+ beq rmarkr_tuple_selector_node_2
+ add r12,r4,#-12
+ ldr r6,[r7,r12]
+ ldr r7,[sp],#4
+ lao r12,e__system__nind,20
+ otoa r12,e__system__nind,20
+ str r12,[r7,#-4]
+ str r6,[r7]
+ b rmarkr_node
+
+rmarkr_tuple_selector_node_2:
+ ldr r6,[r7]
+ ldr r7,[sp],#4
+ lao r12,e__system__nind,21
+ otoa r12,e__system__nind,21
+ str r12,[r7,#-4]
+ str r6,[r7]
+ b rmarkr_node
+
+rmarkr_record_selector_node_1:
+ beq rmarkr_strict_record_selector_node_1
+
+ str r4,[sp,#-4]!
+ and r4,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r4
+ ldr r4,[sp],#4
+ bne rmarkr_hnf_1
+
+ ldr r3,[r7]
+ tst r3,#2
+ beq rmarkr_hnf_1
+
+ ldrh r12,[r3,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls rmarkr_small_tuple_or_record
+
+ ldr r3,[r7,#8]
+ sub r3,r3,r11
+ lsr r3,r3,#2
+
+ str r4,[sp,#-4]!
+ and r4,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r4
+ ldr r4,[sp],#4
+ bne rmarkr_hnf_1
+
+rmarkr_small_tuple_or_record:
+ add r12,r6,#-4
+ sub r3,r12,r11
+
+ str r6,[sp,#-4]!
+.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
+ cmp r4,#8
+ ble rmarkr_tuple_or_record_selector_node_2
+ ldr r7,[r7,#8]
+ sub r4,r4,#12
+rmarkr_tuple_or_record_selector_node_2:
+ ldr r6,[r7,r4]
+ ldr r7,[sp],#4
+ lao r12,e__system__nind,22
+ otoa r12,e__system__nind,22
+ str r12,[r7,#-4]
+ str r6,[r7]
+ b rmarkr_node
+
+rmarkr_strict_record_selector_node_1:
+ str r4,[sp,#-4]!
+ and r4,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r4
+ ldr r4,[sp],#4
+ bne rmarkr_hnf_1
+
+ ldr r3,[r7]
+ tst r3,#2
+ beq rmarkr_hnf_1
+
+ ldrh r12,[r3,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls rmarkr_select_from_small_record
+
+ ldr r3,[r7,#8]
+ sub r3,r3,r11
+
+ str r4,[sp,#-4]!
+ and r4,r3,#31*4
+ lsr r3,r3,#7
+ lsr r4,r4,#2
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r4
+ ldr r4,[sp],#4
+ bne rmarkr_hnf_1
+
+rmarkr_select_from_small_record:
+.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 rmarkr_strict_record_selector_node_2
+ ldr r12,[r7,#8]
+ add r3,r3,r12
+ ldr r3,[r3,#-12]
+ b rmarkr_strict_record_selector_node_3
+rmarkr_strict_record_selector_node_2:
+ ldr r3,[r7,r3]
+rmarkr_strict_record_selector_node_3:
+ str r3,[r6,#4]
+
+.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
+ ble rmarkr_strict_record_selector_node_4
+ ldr r7,[r7,#8]
+ subs r3,r3,#12
+rmarkr_strict_record_selector_node_4:
+ ldr r3,[r7,r3]
+ str r3,[r6,#8]
+rmarkr_strict_record_selector_node_5:
+
+.ifdef PIC
+ ldr r4,[r4,#-4-4]
+.else
+ ldr r4,[r4,#-4]
+.endif
+ str r4,[r6]
+ b rmarkr_next_node
+
+@ a2,d1: free
+
+rmarkr_next_node:
+ tst r9,#3
+ bne rmarkr_parent
+
+ ldr r8,[r9,#-4]
+ mov r3,#3
+
+ and r3,r3,r8
+ subs r9,r9,#4
+
+ cmp r3,#3
+ beq rmarkr_argument_part_cycle1
+
+ ldr r7,[r9,#4]
+ str r7,[r9]
+
+rmarkr_c_argument_part_cycle1:
+ cmp r6,r9
+ bhi rmarkr_no_reverse_1
+
+ ldr r7,[r6]
+ add r4,r9,#4+1
+ str r7,[r9,#4]
+ str r4,[r6]
+
+ orr r9,r9,r3
+ mov r6,r8
+ eor r6,r6,r3
+ b rmarkr_node
+
+rmarkr_no_reverse_1:
+ str r6,[r9,#4]
+ mov r6,r8
+ orr r9,r9,r3
+ eor r6,r6,r3
+ b rmarkr_node
+
+rmarkr_lazy_node:
+ ldr r8,[r4,#-4]
+ tst r8,r8
+ beq rmarkr_next_node
+
+ add r6,r6,#4
+
+ subs r8,r8,#1
+ ble rmarkr_lazy_node_1
+
+ cmp r8,#255
+ bge rmarkr_closure_with_unboxed_arguments
+
+rmarkr_closure_with_unboxed_arguments_:
+ ldr r12,[r6]
+ orr r12,r12,#2
+ str r12,[r6]
+ add r6,r6,r8,lsl #2
+
+ ldr r8,[r6]
+ str r9,[r6]
+ mov r9,r6
+ mov r6,r8
+ b rmarkr_node
+
+rmarkr_closure_with_unboxed_arguments:
+@ (a_size+b_size)+(b_size<<8)
+@ addl $1,a2
+ mov r4,r8
+ and r8,r8,#255
+ lsr r4,r4,#8
+ subs r8,r8,r4
+@ subl $1,a2
+ bgt rmarkr_closure_with_unboxed_arguments_
+ beq rmarkr_hnf_1
+ subs r6,r6,#4
+ b rmarkr_next_node
+
+rmarkr_hnf_0:
+ laol r12,INT+2,INT_o_2,12
+ otoa r12,INT_o_2,12
+ cmp r4,r12
+ beq rmarkr_int_3
+
+ 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
+
+ and r6,r3,#31*4
+ lsr r3,r3,#7
+ lsr r12,r6,#2
+ mov r6,#1
+ lsl r6,r6,r12
+ ldr r12,[r10,r3,lsl #2]
+ bic r12,r12,r6
+ str r12,[r10,r3,lsl #2]
+
+ add r6,r4,#ZERO_ARITY_DESCRIPTOR_OFFSET-2
+ b rmarkr_next_node_after_static
+
+rmarkr_int_3:
+ ldr r8,[r6,#4]
+ cmp r8,#33
+ bhs rmarkr_next_node
+
+ sub r3,r6,r11
+
+ and r6,r3,#31*4
+ lsr r3,r3,#7
+ lsr r12,r6,#2
+ mov r6,#1
+ lsl r6,r6,r12
+ ldr r12,[r10,r3,lsl #2]
+ bic r12,r12,r6
+ str r12,[r10,r3,lsl #2]
+
+ lao r12,small_integers,4
+ otoa r12,small_integers,4
+ add r6,r12,r8,lsl #3
+ b rmarkr_next_node_after_static
+
+rmarkr_char_3:
+ ldrb r4,[r6,#4]
+ sub r3,r6,r11
+
+ and r8,r3,#31*4
+ lsr r3,r3,#7
+ lsr r12,r8,#2
+ mov r8,#1
+ lsl r8,r8,r12
+ ldr r12,[r10,r3,lsl #2]
+ bic r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+
+ 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:
+ laol r12,__ARRAY__+2,__ARRAY___o_2,19
+ otoa r12,__ARRAY___o_2,19
+ cmp r4,r12
+ bne rmarkr_next_node
+
+ ldr r4,[r6,#8]
+ cmp r4,#0
+ beq rmarkr_lazy_array
+
+ ldrh r3,[r4,#-2+2]
+ cmp r3,#0
+ beq rmarkr_b_array
+
+ ldrh r4,[r4,#-2]
+ cmp r4,#0
+ beq rmarkr_b_array
+
+ subs r4,r4,#256
+ cmp r3,r4
+ beq rmarkr_a_record_array
+
+rmarkr_ab_record_array:
+ ldr r7,[r6,#4]
+ add r6,r6,#8
+ str r6,[sp,#-4]!
+
+ mul r7,r4,r7
+ lsl r7,r7,#2
+
+ subs r4,r4,r3
+ add r6,r6,#4
+ add r7,r7,r6
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl reorder
+
+ ldr r6,[sp],#4
+ mov r4,r3
+ ldr r12,[r6,#-4]
+ mul r4,r12,r4
+ b rmarkr_lr_array
+
+rmarkr_b_array:
+ sub r4,r6,r11
+
+ add r4,r4,#4
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ b rmarkr_next_node
+
+rmarkr_a_record_array:
+ ldr r4,[r6,#4]
+ add r6,r6,#8
+ cmp r3,#2
+ blo rmarkr_lr_array
+
+ mul r4,r3,r4
+ b rmarkr_lr_array
+
+rmarkr_lazy_array:
+ ldr r4,[r6,#4]
+ add r6,r6,#8
+
+rmarkr_lr_array:
+ sub r3,r6,r11
+ lsr r3,r3,#2
+ add r3,r3,r4
+
+ lsr r7,r3,#5
+ and r3,r3,#31
+ mov r12,#1
+ lsl r3,r12,r3
+ ldr r12,[r10,r7,lsl #2]
+ orr r12,r12,r3
+ str r12,[r10,r7,lsl #2]
+
+ cmp r4,#1
+ bls rmarkr_array_length_0_1
+
+ mov r7,r6
+ add r6,r6,r4,lsl #2
+
+ ldr r4,[r6]
+ ldr r3,[r7]
+ str r4,[r7]
+ str r3,[r6]
+
+ ldr r4,[r6,#-4]
+ subs r6,r6,#4
+ add r4,r4,#2
+ ldr r3,[r7,#-4]
+ subs r7,r7,#4
+ str r3,[r6]
+ str r4,[r7]
+
+ ldr r4,[r6,#-4]
+ subs r6,r6,#4
+ str r9,[r6]
+ mov r9,r6
+ mov r6,r4
+ b rmarkr_node
+
+rmarkr_array_length_0_1:
+ add r6,r6,#-8
+ blo rmarkr_next_node
+
+ ldr r3,[r6,#12]
+ ldr r8,[r6,#8]
+ str r8,[r6,#12]
+ ldr r8,[r6,#4]
+ str r8,[r6,#8]
+ str r3,[r6,#4]
+ add r6,r6,#4
+ b rmarkr_hnf_1
+
+@ a2: free
+
+rmarkr_parent:
+ and r3,r9,#3
+
+ bics r9,r9,#3
+ beq end_rmarkr
+
+ subs r3,r3,#1
+ beq rmarkr_argument_part_parent
+
+ ldr r8,[r9]
+
+ cmp r6,r9
+ bhi rmarkr_no_reverse_2
+
+ mov r7,r6
+ add r4,r9,#1
+ ldr r6,[r7]
+ str r4,[r7]
+
+rmarkr_no_reverse_2:
+ str r6,[r9]
+ add r6,r9,#-4
+ mov r9,r8
+ b rmarkr_next_node
+
+
+rmarkr_argument_part_parent:
+ ldr r8,[r9]
+
+ mov r7,r9
+ mov r9,r6
+ mov r6,r7
+
+rmarkr_skip_upward_pointers:
+ mov r4,r8
+ and r4,r4,#3
+ cmp r4,#3
+ bne rmarkr_no_upward_pointer
+
+ add r7,r8,#-3
+ ldr r8,[r8,#-3]
+ b rmarkr_skip_upward_pointers
+
+rmarkr_no_upward_pointer:
+ cmp r9,r6
+ bhi rmarkr_no_reverse_3
+
+ mov r3,r9
+ ldr r9,[r9]
+ add r4,r6,#1
+ str r4,[r3]
+
+rmarkr_no_reverse_3:
+ str r9,[r7]
+ add r9,r8,#-4
+
+ and r9,r9,#-4
+
+ mov r7,r9
+ mov r3,#3
+
+ ldr r8,[r9]
+
+ and r3,r3,r8
+ ldr r4,[r7,#4]
+
+ orr r9,r9,r3
+ str r4,[r7]
+
+ cmp r6,r7
+ bhi rmarkr_no_reverse_4
+
+ ldr r4,[r6]
+ str r4,[r7,#4]
+ add r4,r7,#4+2+1
+ str r4,[r6]
+ mov r6,r8
+ and r6,r6,#-4
+ b rmarkr_node
+
+rmarkr_no_reverse_4:
+ str r6,[r7,#4]
+ mov r6,r8
+ and r6,r6,#-4
+ b rmarkr_node
+
+rmarkr_argument_part_cycle1:
+ ldr r4,[r9,#4]
+ str r7,[sp,#-4]!
+
+rmarkr_skip_pointer_list1:
+ mov r7,r8
+ and r7,r7,#-4
+ ldr r8,[r7]
+ mov r3,#3
+ and r3,r3,r8
+ cmp r3,#3
+ beq rmarkr_skip_pointer_list1
+
+ str r4,[r7]
+ ldr r7,[sp],#4
+ b rmarkr_c_argument_part_cycle1
+
+rmarkr_next_node_after_static:
+ tst r9,#3
+ bne rmarkr_parent_after_static
+
+ ldr r8,[r9,#-4]
+ mov r3,#3
+
+ and r3,r3,r8
+ subs r9,r9,#4
+
+ cmp r3,#3
+ beq rmarkr_argument_part_cycle2
+
+ ldr r4,[r9,#4]
+ str r4,[r9]
+
+rmarkr_c_argument_part_cycle2:
+ str r6,[r9,#4]
+ mov r6,r8
+ orr r9,r9,r3
+ eor r6,r6,r3
+ b rmarkr_node
+
+rmarkr_parent_after_static:
+ and r3,r9,#3
+
+ ands r9,r9,#-4
+ beq end_rmarkr_after_static
+
+ subs r3,r3,#1
+ beq rmarkr_argument_part_parent_after_static
+
+ ldr r8,[r9]
+ str r6,[r9]
+ add r6,r9,#-4
+ mov r9,r8
+ b rmarkr_next_node
+
+rmarkr_argument_part_parent_after_static:
+ ldr r8,[r9]
+
+ mov r7,r9
+ mov r9,r6
+ mov r6,r7
+
+@ movl (a1),a2
+rmarkr_skip_upward_pointers_2:
+ mov r4,r8
+ and r4,r4,#3
+ cmp r4,#3
+ bne rmarkr_no_reverse_3
+
+@ movl a2,a1
+@ andl $-4,a1
+@ movl (a1),a2
+ add r7,r8,#-3
+ ldr r8,[r8,#-3]
+ b rmarkr_skip_upward_pointers_2
+
+rmarkr_argument_part_cycle2:
+ ldr r4,[r9,#4]
+ str r7,[sp,#-4]!
+
+rmarkr_skip_pointer_list2:
+ mov r7,r8
+ and r7,r7,#-4
+ ldr r8,[r7]
+ mov r3,#3
+ and r3,r3,r8
+ cmp r3,#3
+ beq rmarkr_skip_pointer_list2
+
+ str r4,[r7]
+ ldr r7,[sp],#4
+ b rmarkr_c_argument_part_cycle2
+
+end_rmarkr_after_static:
+ ldr r9,[sp]
+ add sp,sp,#8
+ str r6,[r9]
+ b rmarkr_next_stack_node
+
+end_rmarkr:
+ ldr r9,[sp],#4
+ ldr r3,[sp],#4
+
+ cmp r6,r3
+ bhi rmark_no_reverse_4
+
+ mov r7,r6
+ add r4,r9,#1
+ ldr r6,[r6]
+ str r4,[r7]
+
+rmark_no_reverse_4:
+ str r6,[r9]
+
+rmarkr_next_stack_node:
+ cmp sp,r0
+ bhs rmark_next_node
+
+ ldr r6,[sp]
+ ldr r9,[sp,#4]
+ add sp,sp,#8
+
+ cmp r6,#1
+ bhi rmark_using_reversal
+
+ b rmark_next_node_
+
+.ifdef PIC
+ ltol __ARRAY__+2,__ARRAY___o_2,18
+ lto e__system__nind,20
+ lto e__system__nind,21
+ lto e__system__nind,22
+ ltol INT+2,INT_o_2,12
+ ltol CHAR+2,CHAR_o_2,7
+ lto small_integers,4
+ lto static_characters,4
+ ltol __ARRAY__+2,__ARRAY___o_2,19
+.endif
+ .ltorg
diff --git a/thumb2copy.s b/thumb2copy.s
new file mode 100644
index 0000000..160ff03
--- /dev/null
+++ b/thumb2copy.s
@@ -0,0 +1,1332 @@
+
+ZERO_ARITY_DESCRIPTOR_OFFSET = -4
+COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP = 1
+
+ str r9,[sp,#-4]!
+
+ lao r12,heap_p2,9
+ ldo r10,r12,heap_p2,9
+
+ lao r12,heap_size_129,4
+ ldo r4,r12,heap_size_129,4
+ lsl r4,r4,#6
+
+ lao r12,semi_space_size,0
+ sto r4,r12,semi_space_size,0
+
+ add r9,r10,r4
+
+@ r0 = INT+2
+@ 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
+ 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
+
+ lao r12,caf_list,0
+ ldo r4,r12,caf_list,0
+ tst r4,r4
+ beq end_copy_cafs
+
+copy_cafs_lp:
+ ldr r12,[r4,#-4]
+ str r12,[sp,#-4]!
+
+ add r8,r4,#4
+ ldr r3,[r4]
+ mov r2,#-2
+ bl copy_lp2
+
+ ldr r4,[sp],#4
+ cmp r4,#0
+ bne copy_cafs_lp
+
+end_copy_cafs:
+ ldr r3,[sp,#16]
+ lao r12,stack_p,4
+ ldo r8,r12,stack_p,4
+ sub r3,r3,r8
+ lsr r3,r3,#2
+
+ cmp r3,#0
+ beq end_copy0
+ mov r2,#-2
+ bl copy_lp2
+end_copy0:
+ lao r12,heap_p2,10
+ ldo r8,r12,heap_p2,10
+
+ bl copy_lp1
+
+ add sp,sp,#16
+
+ lao r12,heap_end_after_gc,10
+ sto r9,r12,heap_end_after_gc,10
+
+.ifdef FINALIZERS
+ 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:
+ ldr r4,[r8]
+ tst r4,#1
+ beq finalizer_not_used_after_copy
+
+ ldr r8,[r8,#4]
+ sub r4,r4,#1
+ str r4,[r6]
+ add r6,r4,#4
+ b determine_free_finalizers_after_copy
+
+finalizer_not_used_after_copy:
+ laol r12,__Nil-4,__Nil_o_m4,3
+ otoa r12,__Nil_o_m4,3
+ cmp r8,r12
+ beq end_finalizers_after_copy
+
+ str r8,[r7]
+ add r7,r8,#4
+ ldr r8,[r8,#4]
+ b determine_free_finalizers_after_copy
+
+end_finalizers_after_copy:
+ str r8,[r6]
+ str r8,[r7]
+.endif
+
+ b skip_copy_gc
+
+.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
+@
+
+copy_lp2_lp1_all_pointers:
+ add r2,r8,r3,lsl #2
+
+copy_lp2_lp1:
+copy_lp2:
+ ldr r7,[r8],#4
+ sub r5,r8,#4
+
+copy_lp2__lp1:
+copy_lp2_:
+@ selectors:
+continue_after_selector_2:
+ ldr r6,[r7]
+ tst r6,#2
+ beq not_in_hnf_2
+
+in_hnf_2:
+ ldrh r4,[r6,#-2]
+ cmp r4,#0
+ beq copy_arity_0_node2
+
+ cmp r4,#256
+ bhs copy_record_2
+
+ subs r4,r4,#2
+ str r10,[r5]
+ bhi copy_hnf_node2_3
+
+ str r6,[r10],#1
+ blo copy_hnf_node2_1
+
+ ldr r6,[r7,#4]
+
+ str r10,[r7]
+ ldr r4,[r7,#8]
+
+ subs r3,r3,#1
+ str r6,[r10,#4-1]
+
+ str r4,[r10,#8-1]
+ add r10,r10,#12-1
+
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_hnf_node2_1:
+ ldr r4,[r7,#4]
+
+ subs r3,r3,#1
+ str r10,[r7]
+
+ str r4,[r10,#4-1]
+ add r10,r10,#8-1
+
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_hnf_node2_3:
+ str r6,[r10],#1
+
+ str r10,[r7]
+ ldr r6,[r7,#4]
+
+ str r6,[r10,#4-1]
+ ldr r6,[r7,#8]
+
+ add r10,r10,#12-1
+ ldr r7,[r6]
+
+ tst r7,#1
+ bne arguments_already_copied_2
+
+ str r10,[r10,#-4]
+
+ str r7,[r10],#1
+
+ str r10,[r6],#4
+ add r10,r10,#4-1
+
+cp_hnf_arg_lp2:
+ ldr r7,[r6],#4
+ str r7,[r10],#4
+ subs r4,r4,#1
+ bne cp_hnf_arg_lp2
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+arguments_already_copied_2:
+ str r7,[r10,#-4]
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_arity_0_node2:
+ cmp r6,r0 @ INT+2
+ blo copy_real_file_or_string_2
+
+ cmp r6,r1 @ CHAR+2
+ bhi copy_normal_hnf_0_2
+
+copy_int_bool_or_char_2:
+ ldr r4,[r7,#4]
+ beq copy_char_2
+
+ cmp r6,r0 @ INT+2
+ bne no_small_int_or_char_2
+
+copy_int_2:
+ cmp r4,#33
+ bhs no_small_int_or_char_2
+
+ 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
+
+ mov r8,r2
+ b copy_lp1
+
+copy_char_2:
+ and r4,r4,#255
+
+ 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
+ mov r8,r2
+ b copy_lp1
+
+no_small_int_or_char_2:
+copy_record_node2_1_b:
+ str r6,[r9,#-8]
+
+ str r4,[r9,#-4]
+ sub r9,r9,#7
+
+ str r9,[r7]
+ sub r9,r9,#1
+
+ str r9,[r5]
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_normal_hnf_0_2:
+ sub r6,r6,#2-ZERO_ARITY_DESCRIPTOR_OFFSET
+ subs r3,r3,#1
+
+ str r6,[r5]
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_real_file_or_string_2:
+ laol r12,__STRING__+2,__STRING___o_2,7
+ otoa r12,__STRING___o_2,7
+ cmp r6,r12
+ bls copy_string_or_array_2
+
+copy_real_or_file_2:
+ str r6,[r9,#-12]
+ sub r9,r9,#12-1
+
+ str r9,[r7]
+ sub r9,r9,#1
+
+ ldr r4,[r7,#4]
+ ldr r6,[r7,#8]
+
+ str r9,[r5]
+
+ str r4,[r9,#4]
+ subs r3,r3,#1
+
+ str r6,[r9,#8]
+
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+already_copied_2:
+ sub r6,r6,#1
+ subs r3,r3,#1
+
+ str r6,[r5]
+
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_record_2:
+ ldrh r12,[r6,#-2+2]
+ sub r4,r4,#256
+ subs r4,#2
+ bhi copy_record_node2_3
+ blo copy_record_node2_1
+
+ cmp r12,#0
+ beq copy_real_or_file_2
+
+ str r10,[r5]
+ str r6,[r10]
+
+ add r6,r10,#1
+ ldr r4,[r7,#4]
+
+ str r6,[r7]
+
+ str r4,[r10,#4]
+ ldr r4,[r7,#8]
+
+ str r4,[r10,#8]
+
+ add r10,r10,#12
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_record_node2_1:
+ ldr r4,[r7,#4]
+
+ cmp r12,#0
+ beq copy_record_node2_1_b
+
+ str r10,[r5]
+ str r6,[r10]
+
+ add r6,r10,#1
+ str r4,[r10,#4]
+
+ str r6,[r7]
+
+ add r10,r10,#8
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_record_node2_3:
+ cmp r12,#1
+ bls copy_record_node2_3_ab_or_b
+
+ str r4,[sp,#-4]!
+ add r4,r10,#1
+
+ str r4,[r7]
+ ldr r4,[r7,#8]
+
+ str r6,[r10]
+ ldr r7,[r7,#4]
+
+ str r7,[r10,#4]
+ str r10,[r5]
+
+ ldr r12,[r4]
+ mov r6,r4
+ tst r12,#1
+ bne record_arguments_already_copied_2
+
+ add r7,r10,#12
+
+ ldr r4,[sp],#4
+ str r7,[r10,#8]
+
+ add r10,r10,#13
+ ldr r7,[r6]
+
+ str r10,[r6],#4
+
+ str r7,[r10,#-1]
+ add r10,r10,#3
+
+cp_record_arg_lp2:
+ ldr r7,[r6],#4
+
+ str r7,[r10],#4
+
+ subs r4,r4,#1
+ bne cp_record_arg_lp2
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+record_arguments_already_copied_2:
+ ldr r7,[r6]
+ ldr r4,[sp],#4
+
+ str r7,[r10,#8]
+ add r10,r10,#12
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_record_node2_3_ab_or_b:
+ blo copy_record_node2_3_b
+
+copy_record_node2_3_ab:
+ str r4,[sp,#-4]!
+ add r4,r10,#1
+
+ lao r12,heap_p1,9
+
+ str r4,[r7]
+ ldr r4,[r7,#8]
+
+ ldo r12,r12,heap_p1,9
+
+ str r6,[r10]
+ ldr r7,[r7,#4]
+
+ mov r6,r4
+ sub r4,r4,r12
+
+ lao r12,heap_copied_vector,4
+
+ str r7,[r10,#4]
+
+ lsr r7,r4,#6
+ lsr r4,r4,#3
+
+ and r4,r4,#31
+
+ ldo r12,r12,heap_copied_vector,4
+ and r7,r7,#-4
+
+ str r10,[r5]
+
+ add r7,r7,r12
+
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r7]
+ tst r4,r12
+ bne record_arguments_already_copied_2
+
+ orr r12,r12,r4
+ str r12,[r7]
+ ldr r4,[sp],#4
+
+ sub r9,r9,#4
+
+ lsl r4,r4,#2
+ sub r9,r9,r4
+
+ str r9,[sp,#-4]!
+ add r9,r9,#1
+
+ str r9,[r10,#8]
+ add r10,r10,#12
+
+ ldr r7,[r6]
+ b cp_record_arg_lp3_c
+
+copy_record_node2_3_b:
+ str r4,[sp,#-4]!
+ add r4,r9,#-12+1
+
+ lao r12,heap_p1,10
+
+ str r4,[r7]
+ ldr r4,[r7,#8]
+
+ ldo r12,r12,heap_p1,10
+
+ str r6,[r9,#-12]
+ ldr r7,[r7,#4]
+
+ mov r6,r4
+ sub r4,r4,r12
+
+ lao r12,heap_copied_vector,5
+
+ str r7,[r9,#-8]
+
+ lsr r7,r4,#6
+ sub r9,r9,#12
+ lsr r4,r4,#3
+
+ and r4,r4,#31
+
+ ldo r12,r12,heap_copied_vector,5
+ and r7,r7,#-4
+
+ str r9,[r5]
+
+ add r7,r7,r12
+
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r7]
+ tst r4,r12
+ bne record_arguments_already_copied_3_b
+
+ orr r12,r12,r4
+ str r12,[r7]
+ ldr r4,[sp],#4
+
+ mov r7,r9
+ sub r9,r9,#4
+
+ lsl r4,r4,#2
+ sub r9,r9,r4
+
+ str r9,[r7,#8]
+
+ ldr r7,[r6]
+
+ str r9,[sp,#-4]!
+ add r9,r9,#1
+
+cp_record_arg_lp3_c:
+ str r9,[r6],#4
+
+ str r7,[r9,#-1]
+ add r9,r9,#3
+
+cp_record_arg_lp3:
+ ldr r7,[r6],#4
+
+ str r7,[r9],#4
+
+ subs r4,r4,#4
+ bne cp_record_arg_lp3
+
+ ldr r9,[sp],#4
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+record_arguments_already_copied_3_b:
+ ldr r7,[r6]
+ ldr r4,[sp],#4
+
+ sub r7,r7,#1
+ str r7,[r9,#8]
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+not_in_hnf_2:
+ tst r6,#1
+ bne already_copied_2
+
+ ldr r4,[r6,#-4]
+ cmp r4,#0
+ ble copy_arity_0_node2_
+
+copy_node2_1_:
+ and r4,r4,#255
+ subs r4,r4,#2
+ blt copy_arity_1_node2
+copy_node2_3:
+ str r10,[r5]
+ str r6,[r10]
+ add r10,r10,#1
+ str r10,[r7]
+ ldr r6,[r7,#4]
+ add r7,r7,#8
+ str r6,[r10,#4-1]
+ add r10,r10,#8-1
+
+cp_arg_lp2:
+ ldr r6,[r7],#4
+ str r6,[r10],#4
+ subs r4,r4,#1
+ bhs cp_arg_lp2
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_arity_1_node2__:
+ ldr r3,[sp],#4
+copy_arity_1_node2:
+copy_arity_1_node2_:
+ str r10,[r5]
+ add r10,r10,#1
+
+ str r10,[r7]
+
+ ldr r4,[r7,#4]
+ str r6,[r10,#-1]
+
+ str r4,[r10,#4-1]
+ add r10,r10,#12-1
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_indirection_2:
+ mov r4,r7
+ ldr r7,[r7,#4]
+
+ ldr r6,[r7]
+ tst r6,#2
+ bne in_hnf_2
+
+ tst r6,#1
+ bne already_copied_2
+
+ ldr r12,[r6,#-4]
+ cmp r12,#-2
+ beq skip_indirections_2
+
+ movs r4,r12
+ ble copy_arity_0_node2_
+ b copy_node2_1_
+
+skip_indirections_2:
+ ldr r7,[r7,#4]
+
+ ldr r6,[r7]
+ tst r6,#2
+ bne update_indirection_list_2
+ tst r6,#1
+ bne update_indirection_list_2
+
+ ldr r12,[r6,#-4]
+ cmp r12,#-2
+ beq skip_indirections_2
+
+update_indirection_list_2:
+ add r6,r4,#4
+ ldr r4,[r4,#4]
+ str r7,[r6]
+ cmp r7,r4
+ bne update_indirection_list_2
+
+ b continue_after_selector_2
+
+copy_selector_2:
+ cmp r4,#-2
+ beq copy_indirection_2
+ blt copy_record_selector_2
+
+ ldr r4,[r7,#4]
+
+ str r3,[sp,#-4]!
+
+ ldr r3,[r4]
+ tst r3,#2
+ beq copy_arity_1_node2__
+
+ ldrh r12,[r3,#-2]
+ cmp r12,#2
+ bls copy_selector_2_
+
+ ldr r3,[r4,#8]
+ ldrb r12,[r3]
+ tst r12,#1
+ bne copy_arity_1_node2__
+
+.ifdef PIC
+ add r11,r6,#-8+4
+.endif
+ ldr r6,[r6,#-8]
+ lao r12,e__system__nind,8
+.ifdef PIC
+ ldrh r6,[r11,r6]
+.else
+ ldrh r6,[r6,#4]
+.endif
+ otoa r12,e__system__nind,8
+ str r12,[r7]
+
+ cmp r6,#8
+ blt copy_selector_2_1
+ beq copy_selector_2_2
+
+ sub r3,r3,#12
+ ldr r6,[r6,r3]
+ ldr r3,[sp],#4
+ str r6,[r7,#4]
+ mov r7,r6
+ b continue_after_selector_2
+
+copy_selector_2_1:
+ ldr r6,[r4,#4]
+ ldr r3,[sp],#4
+ str r6,[r7,#4]
+ mov r7,r6
+ b continue_after_selector_2
+
+copy_selector_2_2:
+ ldr r6,[r3]
+ ldr r3,[sp],#4
+ str r6,[r7,#4]
+ mov r7,r6
+ b continue_after_selector_2
+
+copy_selector_2_:
+.ifdef PIC
+ add r11,r6,#-8+4
+.endif
+ ldr r6,[r6,#-8]
+ ldr r3,[sp],#4
+
+ lao r12,e__system__nind,9
+.ifdef PIC
+ ldrh r6,[r11,r6]
+.else
+ ldrh r6,[r6,#4]
+.endif
+ otoa r12,e__system__nind,9
+ str r12,[r7]
+
+ ldr r6,[r4,r6]
+ str r6,[r7,#4]
+ mov r7,r6
+ b continue_after_selector_2
+
+copy_record_selector_2:
+ cmp r4,#-3
+ ldr r4,[r7,#4]
+ ldr r4,[r4]
+ beq copy_strict_record_selector_2
+
+ tst r4,#2
+ beq copy_arity_1_node2_
+
+ ldrh r12,[r4,#-2]
+ mov r11,#258/2
+ cmp r12,r11,lsl #1
+ bls copy_record_selector_2_
+
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#2
+ bhs copy_selector_2__
+
+ lao r12,heap_p1,11
+
+ ldr r4,[r7,#4]
+ str r7,[sp,#-4]!
+
+ ldo r12,r12,heap_p1,11
+
+ ldr r4,[r4,#8]
+
+ sub r4,r4,r12
+
+ lao r12,heap_copied_vector,6
+
+ lsr r7,r4,#6
+ lsr r4,r4,#3
+
+ ldo r12,r12,heap_copied_vector,6
+
+ and r7,r7,#-4
+ and r4,r4,#31
+
+ add r7,r7,r12
+
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r7]
+ ands r4,r4,r12
+ ldr r7,[sp],#4
+ beq copy_record_selector_2_
+ b copy_arity_1_node2_
+copy_selector_2__:
+ ldr r4,[r7,#4]
+ ldr r4,[r4,#8]
+ ldrb r12,[r4]
+ tst r12,#1
+ bne copy_arity_1_node2_
+copy_record_selector_2_:
+.ifdef PIC
+ add r11,r6,#-8+4
+.endif
+ ldr r4,[r6,#-8]
+ lao r12,e__system__nind,10
+ ldr r6,[r7,#4]
+ otoa r12,e__system__nind,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]
+ sub r4,r4,#12
+copy_record_selector_3:
+ ldr r6,[r6,r4]
+
+ str r6,[r7,#4]
+
+ mov r7,r6
+ b continue_after_selector_2
+
+copy_strict_record_selector_2:
+ tst r4,#2
+ beq copy_arity_1_node2_
+
+ ldrh r12,[r4,#-2]
+ mov r11,#258/2
+ cmp r12,r11,lsl #1
+ bls copy_strict_record_selector_2_
+
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#2
+ blo copy_strict_record_selector_2_b
+
+ ldr r4,[r7,#4]
+ ldr r4,[r4,#8]
+ ldrb r12,[r4]
+ tst r12,#1
+ bne copy_arity_1_node2_
+
+ b copy_strict_record_selector_2_
+
+copy_strict_record_selector_2_b:
+ lao r12,heap_p1,12
+
+ ldr r4,[r7,#4]
+ str r7,[sp,#-4]!
+
+ ldo r12,r12,heap_p1,12
+
+ ldr r4,[r4,#8]
+
+ sub r4,r4,r12
+
+ lao r12,heap_copied_vector,7
+
+ lsr r7,r4,#6
+ lsr r4,r4,#3
+
+ ldo r12,r12,heap_copied_vector,7
+
+ and r7,r7,#-4
+ and r4,r4,#31
+
+ add r7,r7,r12
+
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r7]
+ ands r4,r4,r12
+ ldr r7,[sp],#4
+
+ bne copy_arity_1_node2_
+
+copy_strict_record_selector_2_:
+.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]
+ add r3,r3,r12
+ ldr r3,[r3,#-12]
+ b copy_strict_record_selector_4
+copy_strict_record_selector_3:
+ ldr r3,[r6,r3]
+copy_strict_record_selector_4:
+ str r3,[r7,#4]
+
+.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
+ ble copy_strict_record_selector_5
+ ldr r6,[r6,#8]
+ sub r3,r3,#12
+copy_strict_record_selector_5:
+ ldr r3,[r6,r3]
+ str r3,[r7,#8]
+copy_strict_record_selector_6:
+
+.ifdef PIC
+ ldr r6,[r4,#-4-4]
+.else
+ ldr r6,[r4,#-4]
+.endif
+ str r6,[r7]
+ ldr r3,[sp],#4
+ tst r6,#2
+ bne in_hnf_2
+hlt: b hlt
+
+copy_arity_0_node2_:
+ blt copy_selector_2
+
+ str r6,[r9,#-12]!
+ str r9,[r5]
+ add r4,r9,#1
+
+ str r4,[r7]
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_string_or_array_2:
+.ifdef DLL
+ beq copy_string_2
+ 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
+ b copy_array_2
+copy_string_2:
+ mov r6,r7
+.else
+ mov r6,r7
+ bne copy_array_2
+.endif
+ lao r12,heap_p1,13
+ ldo r12,r12,heap_p1,13
+ sub r7,r7,r12
+
+ lao r12,semi_space_size,1
+ ldo r12,r12,semi_space_size,1
+ cmp r7,r12
+ bhs copy_string_or_array_constant
+
+ ldr r7,[r6,#4]
+
+ add r7,r7,#3
+ str r3,[sp,#-4]!
+
+ lsr r4,r7,#2
+ and r7,r7,#-4
+
+ sub r9,r9,r7
+
+ ldr r3,[r6],#4
+
+ str r3,[r9,#-8]!
+
+ str r9,[r5]
+ add r7,r9,#1
+
+ str r7,[r6,#-4]
+ add r7,r9,#4
+
+cp_s_arg_lp2:
+ ldr r3,[r6],#4
+
+ str r3,[r7],#4
+
+ subs r4,r4,#1
+ bge cp_s_arg_lp2
+
+ ldr r3,[sp],#4
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+copy_array_2:
+ lao r12,heap_p1,14
+ ldo r12,r12,heap_p1,14
+ sub r7,r7,r12
+
+ lao r12,semi_space_size,2
+ ldo r12,r12,semi_space_size,2
+ cmp r7,r12
+ bhs copy_string_or_array_constant
+
+ str r3,[sp,#-4]!
+
+ ldr r4,[r6,#8]
+ cmp r4,#0
+ beq copy_array_a2
+
+ ldrh r3,[r4,#-2]
+
+ cmp r3,#0
+ beq copy_strict_basic_array_2
+
+ sub r3,r3,#256
+ ldr r12,[r6,#4]
+ mul r3,r12,r3
+ b copy_array_a3
+
+copy_array_a2:
+ ldr r3,[r6,#4]
+copy_array_a3:
+ mov r7,r10
+
+ add r10,r10,#12
+ add r10,r10,r3,lsl #2
+
+ str r7,[r5]
+ ldr r4,[r6]
+
+ str r4,[r7]
+
+ add r4,r7,#1
+ add r7,r7,#4
+
+ str r4,[r6],#4
+
+ add r4,r3,#1
+ b cp_s_arg_lp2
+
+copy_strict_basic_array_2:
+ ldr r3,[r6,#4]
+ cmp r4,r0 @ INT+2
+ beq copy_int_array_2
+
+ laol r12,BOOL+2,BOOL_o_2,4
+ otoa r12,BOOL_o_2,4
+ cmp r4,r12
+ beq copy_bool_array_2
+
+ add r3,r3,r3
+copy_int_array_2:
+ add r7,r9,#-12
+
+ sub r7,r7,r3,lsl #2
+ ldr r4,[r6]
+
+ str r7,[r5]
+
+ mov r9,r7
+
+ str r4,[r7]
+ add r4,r7,#1
+
+ add r7,r7,#4
+ str r4,[r6],#4
+
+ add r4,r3,#1
+ b cp_s_arg_lp2
+
+copy_bool_array_2:
+ add r3,r3,#3
+ lsr r3,r3,#2
+ b copy_int_array_2
+
+copy_string_or_array_constant:
+ str r6,[r5]
+
+ subs r3,r3,#1
+ bne copy_lp2
+ mov r8,r2
+ b copy_lp1
+
+@
+@ Copy all referenced nodes to the other semi space
+@
+
+copy_lp1:
+ cmp r8,r10
+ bhs end_copy1
+
+ ldr r4,[r8],#4
+ tst r4,#2
+ beq not_in_hnf_1
+in_hnf_1:
+ ldrh r3,[r4,#-2]
+
+ cmp r3,#0
+ beq copy_array_21
+
+ cmp r3,#2
+ bls copy_lp2_lp1_all_pointers
+
+ cmp r3,#256
+ bhs copy_record_21
+
+ ldr r12,[r8,#4]
+ tst r12,#1
+ bne node_without_arguments_part
+
+ ldr r7,[r8],#8
+ sub r5,r8,#8
+ sub r2,r8,#4
+ add r2,r2,r3,lsl #2
+ b copy_lp2__lp1
+
+copy_record_21:
+ sub r3,r3,#256
+ subs r3,r3,#2
+ bhi copy_record_arguments_3
+
+ ldrh r3,[r4,#-2+2]
+ blo copy_record_arguments_1
+
+ add r2,r8,#8
+
+ cmp r3,#1
+ bhi copy_lp2_lp1
+ b copy_node_arity1
+
+copy_record_arguments_1:
+ add r2,r8,#4
+ b copy_lp2_lp1
+
+copy_record_arguments_3:
+ ldr r12,[r8,#4]
+ tst r12,#1
+ bne record_node_without_arguments_part
+
+ ldrh r7,[r4,#-2+2]
+
+ add r6,r8,r3,lsl #2
+ add r2,r6,#3*4
+ mov r3,r7
+
+ ldr r7,[r8],#8
+ sub r5,r8,#8
+ b copy_lp2__lp1
+
+node_without_arguments_part:
+record_node_without_arguments_part:
+ ldr r7,[r8],#8
+ sub r4,r12,#1
+
+ mov r3,#1
+ sub r5,r8,#8
+ str r4,[r8,#-4]
+ mov r2,r8
+ b copy_lp2__lp1
+
+not_in_hnf_1:
+ ldr r3,[r4,#-4]
+ cmp r3,#256
+ bgt copy_unboxed_closure_arguments
+
+ cmp r3,#1
+ bgt copy_lp2_lp1_all_pointers
+
+copy_node_arity1:
+ ldr r7,[r8],#8
+ mov r3,#1
+ sub r5,r8,#8
+ mov r2,r8
+ b copy_lp2__lp1
+
+copy_unboxed_closure_arguments:
+ ldr r12,=257
+ cmp r3,r12
+ beq copy_unboxed_closure_arguments1
+
+ uxtb r4,r3,ror #8
+ and r2,r3,#255
+
+ subs r3,r2,r4
+ add r2,r8,r2,lsl #2
+ bne copy_lp2_lp1
+
+copy_unboxed_closure_arguments_without_pointers:
+ mov r8,r2
+ b copy_lp1
+
+copy_unboxed_closure_arguments1:
+ add r8,r8,#8
+ b copy_lp1
+
+copy_array_21:
+ ldr r3,[r8,#4]
+ add r8,r8,#8
+ cmp r3,#0
+ beq copy_array_21_a
+
+ ldrh r4,[r3,#-2]
+ ldrh r3,[r3,#-2+2]
+ sub r4,r4,#256
+ cmp r3,#0
+ beq copy_array_21_b
+
+ cmp r3,r4
+ bne copy_array_21_ab
+
+copy_array_21_r_a:
+ ldr r3,[r8,#-8]
+ mul r3,r4,r3
+ cmp r3,#0
+ beq copy_lp1
+ b copy_lp2_lp1_all_pointers
+
+copy_array_21_a:
+ ldr r3,[r8,#-8]
+ cmp r3,#0
+ beq copy_lp1
+ b copy_lp2_lp1_all_pointers
+
+copy_array_21_b:
+ ldr r3,[r8,#-8]
+ mul r3,r4,r3
+ add r8,r8,r3,lsl #2
+ b copy_lp1
+
+copy_array_21_ab:
+ ldr r12,[r8,#-8]
+ cmp r12,#0
+ beq copy_lp1
+
+ str r12,[sp,#0]
+ lsl r4,r4,#2
+ str r3,[sp,#8]
+ str r4,[sp,#4]
+
+copy_array_21_lp_ab:
+ add r2,r8,r4
+ str r2,[sp,#12]
+ mov r2,#-1
+ b copy_lp2
+
+end_copy1:
+ cmp r8,#-1
+ it ne
+ bxne lr
+
+copy_array_21_lp_ab_next:
+ ldr r8,[sp,#12]
+ ldr r12,[sp]
+ ldr r3,[sp,#8]
+ ldr r4,[sp,#4]
+ subs r12,r12,#1
+ str r12,[sp]
+ bne copy_array_21_lp_ab
+
+ b copy_lp1
+
+.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 e__system__nind,8
+ lto e__system__nind,9
+ lto heap_p1,11
+ lto heap_copied_vector,6
+ lto e__system__nind,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/thumb2divmod.s b/thumb2divmod.s
new file mode 100644
index 0000000..c2c205f
--- /dev/null
+++ b/thumb2divmod.s
@@ -0,0 +1,169 @@
+
+ .arch armv7-a
+ .fpu vfpv3-d16
+ .text
+
+ .globl divide
+divide:
+ eor r12,r3,r4
+ cmp r4,#0
+ neglt r4,r4
+ cmp r3,#0
+ neglt r3,r3
+
+ cmp r4,#32
+ bls divide_by_small_number
+
+ clz r1,r4
+ clz r2,r3
+ rsb r1,r1,#31-5-11
+ add r1,r1,r2
+ mov r2,#0
+
+ cmp r1,#32-5-11
+ bhs divide_large_result
+
+ add r1,r1,r1,lsl #1
+ add pc,pc,r1,lsl #2
+ nop
+
+ .set shift,32-5-11
+ .rept 32-5-11
+ .set shift,shift-1
+ subs r1,r3,r4,lsl #shift
+ movcs r3,r1
+ orrcs r2,r2,#1<<shift
+ .endr
+
+ mov r4,r2
+ cmp r12,#0
+ neglt r4,r4
+ ldr pc,[sp],#4
+
+divide_large_result:
+ bpl divide_result_0
+
+ vmov s13,r3
+ vmov s15,r4
+ vcvt.f64.u32 d6,s13
+ vcvt.f64.u32 d7,s15
+ vdiv.f64 d7,d6,d7
+ vcvt.u32.f64 s15,d7
+ vmov r4,s15
+ cmp r12,#0
+ neglt r4,r4
+ ldr pc,[sp],#4
+
+divide_result_0:
+ mov r4,#0
+ ldr pc,[sp],#4
+
+divide_by_small_number:
+ add r1,pc,r4,lsl #3
+ ldrb r4,[r1,#(div_mod_table+1)-(divide_by_small_number+8)]
+ ldr r2,[r1,#(div_mod_table+4)-(divide_by_small_number+8)]
+ ldrb r1,[r1,#div_mod_table-(divide_by_small_number+8)]
+ adds r3,r3,r4
+ umullcc r4,r2,r3,r2
+ lsr r4,r2,r1
+ cmp r12,#0
+ neglt r4,r4
+ ldr pc,[sp],#4
+
+ .globl modulo
+modulo:
+ cmp r4,#0
+ neglt r4,r4
+ movs r12,r3
+ neglt r3,r3
+
+ cmp r4,#32
+ bls modulo_of_small_number
+
+ clz r1,r4
+ clz r2,r3
+ rsb r1,r1,#31-5-11
+ add r1,r1,r2
+
+ cmp r1,#32-5-11
+ bhs modulo_large_divide_result
+
+ add pc,pc,r1,lsl #3
+ nop
+
+ .set shift,32
+ .rept 32
+ .set shift,shift-1
+ subs r1,r3,r4,lsl #shift
+ movcs r3,r1
+ .endr
+
+modulo_large_divide_result:
+ bpl modulo_divide_result_0
+
+ vmov s13,r3
+ vmov s15,r4
+ vcvt.f64.u32 d6,s13
+ vcvt.f64.u32 d7,s15
+ vdiv.f64 d7,d6,d7
+ vcvt.u32.f64 s15,d7
+ vmov r2,s15
+ b modulo_from_quotient
+
+modulo_divide_result_0:
+ mov r4,r3
+ cmp r12,#0
+ neglt r4,r4
+ ldr pc,[sp],#4
+
+modulo_of_small_number:
+ add r1,pc,r4,lsl #3
+ ldrb r0,[r1,#(div_mod_table+1)-(modulo_of_small_number+8)]
+ ldr r2,[r1,#(div_mod_table+4)-(modulo_of_small_number+8)]
+ ldrb r1,[r1,#div_mod_table-(modulo_of_small_number+8)]
+ adds r14,r3,r0
+ umullcc r0,r2,r14,r2
+ lsr r2,r2,r1
+modulo_from_quotient:
+@ mls r4,r4,r2,r3
+ neg r3,r3
+ mla r4,r4,r2,r3
+ cmp r12,#0
+ neglt r4,r4
+ ldr pc,[sp],#4
+
+div_mod_table:
+ .long 0,0
+ .long 0x100,0xffffffff
+ .long 0,0x80000000
+ .long 1,0xaaaaaaab
+ .long 0,0x40000000
+ .long 2,0xcccccccd
+ .long 2,0xaaaaaaab
+ .long 0x102,0x92492492
+ .long 0,0x20000000
+ .long 1,0x38e38e39
+ .long 3,0xcccccccd
+ .long 3,0xba2e8ba3
+ .long 3,0xaaaaaaab
+ .long 2,0x4ec4ec4f
+ .long 0x103,0x92492492
+ .long 3,0x88888889
+ .long 0,0x10000000
+ .long 4,0xf0f0f0f1
+ .long 2,0x38e38e39
+ .long 0x104,0xd79435e5
+ .long 4,0xcccccccd
+ .long 0x104,0xc30c30c3
+ .long 4,0xba2e8ba3
+ .long 4,0xb21642c9
+ .long 4,0xaaaaaaab
+ .long 3,0x51eb851f
+ .long 3,0x4ec4ec4f
+ .long 0x104,0x97b425ed
+ .long 0x104,0x92492492
+ .long 4,0x8d3dcb09
+ .long 4,0x88888889
+ .long 0x104,0x84210842
+ .long 0,0x08000000
+
diff --git a/thumb2mark.s b/thumb2mark.s
new file mode 100644
index 0000000..0ad6930
--- /dev/null
+++ b/thumb2mark.s
@@ -0,0 +1,2468 @@
+
+ZERO_ARITY_DESCRIPTOR_OFFSET = -4
+
+#undef COUNT_GARBAGE_COLLECTIONS
+#undef MARK_USING_REVERSAL
+#undef COMPARE_HEAP_AFTER_MARK
+#undef DEBUG_MARK_COLLECT
+
+ lao r12,heap_size_33,6
+ ldo r4,r12,heap_size_33,6
+ mov r3,#0
+
+@ heap_p3 in r0
+
+ lao r12,heap_p3,9
+ ldo r0,r12,heap_p3,9
+
+@ n_marked_words in r2
+
+ mov r2,#0
+
+ lsl r1,r4,#5
+@ heap_size_32_33 in r1
+ lao r12,heap_size_32_33,0
+ sto r1,r12,heap_size_32_33,0
+
+ lao r12,lazy_array_list,0
+ sto r3,r12,lazy_array_list,0
+
+ add r9,sp,#-2000
+
+ lao r12,caf_list,1
+ ldo r4,r12,caf_list,1
+
+ lao r12,end_stack,0
+@ end_stack in r11
+ mov r11,r9
+ sto r9,r12,end_stack,0
+
+ tst r4,r4
+ beq _end_mark_cafs
+
+_mark_cafs_lp:
+ ldr r3,[r4]
+ ldr r8,[r4,#-4]
+
+ str r8,[sp,#-4]!
+ add r8,r4,#4
+ add r12,r4,#4
+ add r4,r12,r3,lsl #2
+ lao r12,end_vector,0
+ sto r4,r12,end_vector,0
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _mark_stack_nodes
+
+ ldr r4,[sp],#4
+ tst r4,r4
+ bne _mark_cafs_lp
+
+_end_mark_cafs:
+ lao r12,stack_top,2
+ ldo r9,r12,stack_top,2
+ lao r12,stack_p,5
+ ldo r8,r12,stack_p,5
+
+ lao r12,end_vector,1
+ sto r9,r12,end_vector,1
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _mark_stack_nodes
+
+ 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]
+ laol r12,__ARRAY__+2,__ARRAY___o_2,16
+ otoa r12,__ARRAY___o_2,16
+ str r12,[r6]
+
+ cmp r3,#1
+ beq restore_array_size_1
+
+ add r7,r6,r3,lsl #2
+ ldr r4,[r7,#8]
+ cmp r4,#0
+ beq restore_lazy_array
+
+ ldrh r8,[r4,#-2+2]
+
+ neg r12,r8
+ and r12,r12,r8
+@ r12 contains lowest 1 bit of r8
+ clz r12,r12
+ rsb r12,r12,#31
+ lsr r8,r8,r12
+ lsr r3,r3,r12
+ sub r8,r8,#1
+ add r8,r8,r8
+ ldr r8,[pc,r8]
+ b skip_mod_inverse_table
+
+ .word 1
+ .word -1431655765
+ .word -858993459
+ .word -1227133513
+ .word 954437177
+ .word -1171354717
+ .word -991146299
+ .word -286331153
+ .word -252645135
+ .word 678152731
+ .word 1022611261
+ .word -373475417
+ .word -1030792151
+ .word 1749801491
+ .word 1332920885
+ .word -1108378657
+
+skip_mod_inverse_table:
+ mul r3,r8,r3
+
+restore_lazy_array:
+ ldr r10,[r6,#8]
+ ldr r8,[r6,#4]
+ str r3,[r6,#4]
+ ldr r9,[r7,#4]
+ str r4,[r6,#8]
+ str r8,[r7,#4]
+ str r10,[r7,#8]
+
+ cmp r4,#0
+ beq no_reorder_array
+
+ ldrh r7,[r4,#-2]
+ sub r7,r7,#256
+ ldrh r8,[r4,#-2+2]
+ cmp r8,r7
+ beq no_reorder_array
+
+ add r6,r6,#12
+ mul r3,r7,r3
+ mov r4,r7
+ add r7,r6,r3,lsl #2
+ mov r3,r8
+ sub r4,r4,r8
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl reorder
+
+no_reorder_array:
+ mov r6,r9
+ cmp r6,#0
+ bne restore_arrays
+
+ b end_restore_arrays
+
+restore_array_size_1:
+ ldr r8,[r6,#4]
+ ldr r7,[r6,#8]
+ str r3,[r6,#4]
+ ldr r4,[r6,#12]
+ str r8,[r6,#12]
+ str r4,[r6,#8]
+
+ mov r6,r7
+ tst r6,r6
+ bne restore_arrays
+
+end_restore_arrays:
+
+.ifdef FINALIZERS
+ 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:
+ laol r12,__Nil-4,__Nil_o_m4,4
+ otoa r12,__Nil_o_m4,4
+ cmp r8,r12
+ beq end_finalizers_after_mark
+
+ sub r4,r8,r0
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+ lsr r9,r4,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ beq finalizer_not_used_after_mark
+
+ add r6,r8,#4
+ ldr r8,[r8,#4]
+ b determine_free_finalizers_after_mark
+
+finalizer_not_used_after_mark:
+ str r8,[r7]
+ add r7,r8,#4
+
+ ldr r8,[r8,#4]
+ str r8,[r6]
+ b determine_free_finalizers_after_mark
+
+end_finalizers_after_mark:
+ str r8,[r7]
+.endif
+
+ str r2,[sp,#-4]!
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl add_garbage_collect_time
+
+ ldr r2,[sp],#4
+
+.ifdef ADJUST_HEAP_SIZE
+ lao r12,bit_vector_size,3
+ ldo r4,r12,bit_vector_size,3
+.else
+ lao r12,heap_size_33,7
+ ldo r4,r12,heap_size_33,7
+ lsl r4,r4,#3
+.endif
+
+.ifdef ADJUST_HEAP_SIZE
+ lao r12,n_allocated_words,7
+ ldo r10,r12,n_allocated_words,7
+ add r10,r10,r2
+ lsl r10,r10,#2
+
+ lsl r9,r4,#2
+
+ str r7,[sp,#-4]!
+ str r4,[sp,#-4]!
+
+ 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
+ lsr r7,r7,#8
+
+ mov r3,r4
+ cmp r7,#0
+
+ ldr r4,[sp],#4
+ ldr r7,[sp],#4
+
+ beq not_largest_heap
+
+ 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
+
+ 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
+ lao r12,bit_vector_size,4
+ sto r4,r12,bit_vector_size,4
+no_larger_heap:
+.endif
+ mov r8,r4
+
+ lao r12,heap_vector,8
+ ldo r10,r12,heap_vector,8
+
+ lsr r8,r8,#5
+
+ tst r4,#31
+ beq no_extra_word
+
+ mov r12,#0
+ str r12,[r10,r8,lsl #2]
+
+no_extra_word:
+ sub r4,r4,r2
+ lsl r4,r4,#2
+ lao r12,n_last_heap_free_bytes,2
+ sto r4,r12,n_last_heap_free_bytes,2
+
+ lao r12,flags,15
+ ldo r12,r12,flags,15
+ tst r12,#2
+ beq _no_heap_use_message2
+
+ str r2,[sp,#-4]!
+
+ 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
+
+ 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
+
+_no_heap_use_message2:
+
+.ifdef FINALIZERS
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl call_finalizers
+.endif
+
+ lao r12,n_allocated_words,8
+ ldo r9,r12,n_allocated_words,8
+ mov r3,#0
+
+@ n_free_words_after_mark in r2
+ mov r6,r10
+ mov r2,#0
+
+_scan_bits:
+ ldr r12,[r6]
+ cmp r3,r12
+ beq _zero_bits
+ str r3,[r6],#4
+ subs r8,r8,#1
+ bne _scan_bits
+
+ lao r12,n_free_words_after_mark,5
+ sto r2,r12,n_free_words_after_mark,5
+ b _end_scan
+
+_zero_bits:
+ add r7,r6,#4
+ add r6,r6,#4
+ subs r8,r8,#1
+ bne _skip_zero_bits_lp1
+
+ lao r12,n_free_words_after_mark,6
+ sto r2,r12,n_free_words_after_mark,6
+ b _end_bits
+
+_skip_zero_bits_lp:
+ cmp r4,#0
+ bne _end_zero_bits
+_skip_zero_bits_lp1:
+ ldr r4,[r6],#4
+ subs r8,r8,#1
+ bne _skip_zero_bits_lp
+
+ lao r12,n_free_words_after_mark,7
+ sto r2,r12,n_free_words_after_mark,7
+
+ cmp r4,#0
+ beq _end_bits
+ mov r4,r6
+ str r3,[r6,#-4]
+ subs r4,r4,r7
+ b _end_bits2
+
+_end_zero_bits:
+ sub r4,r6,r7
+ lsl r4,r4,#3
+ add r2,r2,r4
+ str r3,[r6,#-4]
+
+ cmp r4,r9
+ blo _scan_bits
+
+@ n_free_words_after_mark updated
+_found_free_memory:
+ 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
+ lao r12,heap_p3,10
+ ldo r10,r12,heap_p3,10
+ add r10,r10,r3
+
+ lao r12,stack_top,3
+ ldo r9,r12,stack_top,3
+
+ add r3,r10,r4,lsl #2
+ lao r12,heap_end_after_gc,11
+ sto r3,r12,heap_end_after_gc,11
+
+ ldmia sp!,{r0-r4,pc}
+
+@ n_free_words_after_mark updated
+_end_bits:
+ sub r4,r6,r7
+ add r4,r4,#4
+_end_bits2:
+ lsl r4,r4,#3
+ add r2,r2,r4
+
+ cmp r4,r9
+ bhs _found_free_memory
+
+ 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:
+ 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
+@ a4: heap_vector
+@ d0,d1,a0,a1,a3: free
+
+_mark_stack_nodes:
+ lao r12,end_vector,2
+ ldo r12,r12,end_vector,2
+ cmp r8,r12
+ beq _end_mark_nodes
+_mark_stack_nodes_:
+ ldr r6,[r8],#4
+
+ sub r7,r6,r0
+ cmp r7,r1
+ bcs _mark_stack_nodes
+
+ lsr r3,r7,#7
+ and r7,r7,#31*4
+ lsr r9,r7,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _mark_stack_nodes
+
+ str r8,[sp,#-4]!
+
+.ifdef MARK_USING_REVERSAL
+ mov r9,#1
+ b __mark_node
+
+__end_mark_using_reversal:
+ ldr r8,[sp],#4
+ str r6,[r8,#-4]
+ b _mark_stack_nodes
+.else
+ mov r12,#0
+ str r12,[sp,#-4]!
+
+ b _mark_arguments
+
+_mark_hnf_2:
+ cmp r9,#0x20000000
+ bls fits_in_word_6
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_6:
+ add r2,r2,#3
+
+_mark_record_2_c:
+ ldr r3,[r6,#4]
+ str r3,[sp,#-4]!
+
+ cmp sp,r11
+ blo __mark_using_reversal
+
+_mark_node2:
+_shared_argument_part:
+ ldr r6,[r6]
+
+_mark_node:
+ sub r7,r6,r0
+ cmp r7,r1
+ bcs _mark_next_node
+
+ lsr r3,r7,#7
+ and r7,r7,#31*4
+ lsr r9,r7,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _mark_next_node
+
+_mark_arguments:
+ ldr r4,[r6]
+ tst r4,#2
+ beq _mark_lazy_node
+
+ ldrh r8,[r4,#-2]
+
+ cmp r8,#0
+ beq _mark_hnf_0
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ add r6,r6,#4
+
+ cmp r8,#256
+ bhs _mark_record
+
+ subs r8,r8,#2
+ beq _mark_hnf_2
+ blo _mark_hnf_1
+
+_mark_hnf_3:
+ ldr r7,[r6,#4]
+
+ cmp r9,#0x20000000
+ bls fits_in_word_1
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_1:
+
+ sub r4,r7,r0
+ add r2,r2,#3
+
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+
+ lsr r9,r4,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _shared_argument_part
+
+_no_shared_argument_part:
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ add r8,r8,#1
+
+ add r2,r2,r8
+ add r4,r4,r8,lsl #2
+ add r12,r7,#-4
+ add r7,r12,r8,lsl #2
+
+ cmp r4,#32*4
+ bls fits_in_word_2
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_2:
+
+ ldr r3,[r7]
+ sub r8,r8,#2
+ str r3,[sp,#-4]!
+
+_push_hnf_args:
+ ldr r3,[r7,#-4]!
+ str r3,[sp,#-4]!
+ subs r8,r8,#1
+ bge _push_hnf_args
+
+ cmp sp,r11
+ bhs _mark_node2
+
+ b __mark_using_reversal
+
+_mark_hnf_1:
+ cmp r9,#0x40000000
+ bls fits_in_word_4
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_4:
+ add r2,r2,#2
+ ldr r6,[r6]
+ b _mark_node
+
+_mark_lazy_node_1:
+ add r6,r6,#4
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ cmp r9,#0x20000000
+ bls fits_in_word_3
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_3:
+ add r2,r2,#3
+
+ cmp r8,#1
+ beq _mark_node2
+
+_mark_selector_node_1:
+ cmp r8,#-2
+ ldr r7,[r6]
+ beq _mark_indirection_node
+
+ sub r9,r7,r0
+
+ lsr r3,r9,#7
+ and r9,r9,#31*4
+
+ cmp r8,#-3
+
+ lsr r9,r9,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ble _mark_record_selector_node_1
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _mark_node3
+
+ ldr r8,[r7]
+ tst r8,#2
+ beq _mark_node3
+
+ ldrh r12,[r8,#-2]
+ cmp r12,#2
+ bls _small_tuple_or_record
+
+_large_tuple_or_record:
+ ldr r8,[r7,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ bne _mark_node3
+
+ lao r8,e__system__nind,11
+.ifdef PIC
+ add r12,r4,#-8+4
+.endif
+ ldr r4,[r4,#-8]
+ otoa r8,e__system__nind,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]
+ beq _mark_tuple_selector_node_2
+ add r12,r4,#-12
+ ldr r6,[r7,r12]
+ str r6,[r8]
+ b _mark_node
+
+_mark_tuple_selector_node_2:
+ ldr r6,[r7]
+ str r6,[r8]
+ b _mark_node
+
+_small_tuple_or_record:
+ lao r8,e__system__nind,12
+.ifdef PIC
+ add r12,r4,#-8+4
+.endif
+ ldr r4,[r4,#-8]
+ otoa r8,e__system__nind,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]
+ b _mark_node
+
+_mark_record_selector_node_1:
+ beq _mark_strict_record_selector_node_1
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _mark_node3
+
+ ldr r8,[r7]
+ tst r8,#2
+ beq _mark_node3
+
+ ldrh r12,[r8,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls _small_tuple_or_record
+
+ ldr r8,[r7,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ bne _mark_node3
+
+ lao r8,e__system__nind,13
+.ifdef PIC
+ add r12,r4,#-8+4
+.endif
+ ldr r4,[r4,#-8]
+ otoa r8,e__system__nind,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]
+ sub r4,r4,#12
+_mark_record_selector_node_2:
+ ldr r6,[r7,r4]
+
+ str r6,[r8]
+ b _mark_node
+
+_mark_strict_record_selector_node_1:
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _mark_node3
+
+ ldr r8,[r7]
+ tst r8,#2
+ beq _mark_node3
+
+ ldrh r12,[r8,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls _select_from_small_record
+
+ ldr r8,[r7,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ 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]
+ add r3,r3,r12
+ ldr r3,[r3,#-12]
+ b _mark_strict_record_selector_node_3
+_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
+ ble _mark_strict_record_selector_node_4
+ ldr r7,[r7,#8]
+ sub r3,r3,#12
+_mark_strict_record_selector_node_4:
+ ldr r3,[r7,r3]
+ 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
+
+_mark_indirection_node:
+_mark_node3:
+ mov r6,r7
+ b _mark_node
+
+_mark_next_node:
+ ldr r6,[sp],#4
+ tst r6,r6
+ bne _mark_node
+
+ lao r12,end_vector,3
+ ldr r8,[sp],#4
+ ldo r12,r12,end_vector,3
+ cmp r8,r12
+ bne _mark_stack_nodes_
+
+_end_mark_nodes:
+ ldr pc,[sp],#4
+
+_mark_lazy_node:
+ ldr r8,[r4,#-4]
+ tst r8,r8
+ beq _mark_real_or_file
+
+ cmp r8,#1
+ ble _mark_lazy_node_1
+
+ cmp r8,#256
+ bge _mark_closure_with_unboxed_arguments
+ add r8,r8,#1
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+
+ add r2,r2,r8
+ add r7,r7,r8,lsl #2
+ add r6,r6,r8,lsl #2
+
+ cmp r7,#32*4
+ bls fits_in_word_7
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits_in_word_7:
+ sub r8,r8,#3
+_push_lazy_args:
+ ldr r3,[r6,#-4]!
+ str r3,[sp,#-4]!
+ subs r8,r8,#1
+ bge _push_lazy_args
+
+ sub r6,r6,#4
+
+ cmp sp,r11
+ bhs _mark_node2
+
+ b __mark_using_reversal
+
+_mark_closure_with_unboxed_arguments:
+ mov r4,r8
+ and r8,r8,#255
+ subs r8,r8,#1
+ beq _mark_real_or_file
+
+ lsr r4,r4,#8
+ add r8,r8,#2
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ add r2,r2,r8
+ add r7,r7,r8,lsl #2
+
+ sub r8,r8,r4
+
+ cmp r7,#32*4
+ bls fits_in_word_7_
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits_in_word_7_:
+ subs r8,r8,#2
+ blt _mark_next_node
+
+ add r12,r6,#8
+ add r6,r12,r8,lsl #2
+ bne _push_lazy_args
+
+_mark_closure_with_one_boxed_argument:
+ ldr r6,[r6,#-4]
+ b _mark_node
+
+_mark_hnf_0:
+ laol r12,INT+2,INT_o_2,7
+ otoa r12,INT_o_2,7
+ cmp r4,r12
+ blo _mark_real_file_or_string
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+
+ laol r12,CHAR+2,CHAR_o_2,3
+ otoa r12,CHAR_o_2,3
+ cmp r4,r12
+ bhi _mark_normal_hnf_0
+
+_mark_bool:
+ add r2,r2,#2
+
+ cmp r9,#0x40000000
+ bls _mark_next_node
+
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+ b _mark_next_node
+
+_mark_normal_hnf_0:
+ add r2,r2,#1
+ b _mark_next_node
+
+_mark_real_file_or_string:
+ laol r12,__STRING__+2,__STRING___o_2,8
+ otoa r12,__STRING___o_2,8
+ cmp r4,r12
+ bls _mark_string_or_array
+
+_mark_real_or_file:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ add r2,r2,#3
+
+ cmp r9,#0x20000000
+ bls _mark_next_node
+
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+ b _mark_next_node
+
+_mark_record:
+ mov r12,#258/2
+ subs r8,r8,r12,lsl #1
+ beq _mark_record_2
+ blt _mark_record_1
+
+_mark_record_3:
+ add r2,r2,#3
+
+ cmp r9,#0x20000000
+ bls fits_in_word_13
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_13:
+ ldr r7,[r6,#4]
+
+ ldrh r3,[r4,#-2+2]
+ sub r9,r7,r0
+
+ lsr r4,r9,#7
+ and r9,r9,#31*4
+
+ subs r3,r3,#1
+
+ lsr r7,r9,#2
+ mov r12,#1
+ lsl r7,r12,r7
+
+ blo _mark_record_3_bb
+
+ ldr r12,[r10,r4,lsl #2]
+ tst r7,r12
+ bne _mark_node2
+
+ add r8,r8,#1
+ ldr r12,[r10,r4,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r4,lsl #2]
+ add r2,r2,r8
+ add r9,r9,r8,lsl #2
+
+ cmp r9,#32*4
+ bls _push_record_arguments
+ add r12,r10,#4
+ ldr r7,[r12,r4,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r4,lsl #2]
+_push_record_arguments:
+ ldr r7,[r6,#4]
+ mov r8,r3
+ lsl r3,r3,#2
+ add r7,r7,r3
+ subs r8,r8,#1
+ bge _push_hnf_args
+
+ b _mark_node2
+
+_mark_record_3_bb:
+ ldr r12,[r10,r4,lsl #2]
+ tst r7,r12
+ bne _mark_next_node
+
+ add r8,r8,#1
+ ldr r12,[r10,r4,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r4,lsl #2]
+ add r2,r2,r8
+ add r9,r9,r8,lsl #2
+
+ cmp r9,#32*4
+ bls _mark_next_node
+
+ add r12,r10,#4
+ ldr r7,[r12,r4,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r4,lsl #2]
+ b _mark_next_node
+
+_mark_record_2:
+ cmp r9,#0x20000000
+ bls fits_in_word_12
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits_in_word_12:
+ add r2,r2,#3
+
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#1
+ bhi _mark_record_2_c
+ beq _mark_node2
+ b _mark_next_node
+
+_mark_record_1:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#0
+ bne _mark_hnf_1
+
+ b _mark_bool
+
+_mark_string_or_array:
+ beq _mark_string_
+
+_mark_array:
+ ldr r8,[r6,#8]
+ cmp r8,#0
+ beq _mark_lazy_array
+
+ ldrh r4,[r8,#-2]
+
+ cmp r4,#0
+ beq _mark_strict_basic_array
+
+ ldrh r8,[r8,#-2+2]
+ cmp r8,#0
+ beq _mark_b_record_array
+
+ cmp sp,r11
+ blo _mark_array_using_reversal
+
+ sub r4,r4,#256
+ cmp r4,r8
+ beq _mark_a_record_array
+
+_mark_ab_record_array:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ ldr r8,[r6,#4]
+
+ mul r4,r8,r4
+ add r4,r4,#3
+
+ add r2,r2,r4
+ add r12,r6,#-4
+ add r4,r12,r4,lsl #2
+
+ sub r4,r4,r0
+ lsr r4,r4,#7
+
+ cmp r3,r4
+ bhs _end_set_ab_array_bits
+
+ add r3,r3,#1
+ mov r8,#1
+ cmp r3,r4
+ bhs _last_ab_array_bits
+
+_mark_ab_array_lp:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r4
+ blo _mark_ab_array_lp
+
+_last_ab_array_bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+
+_end_set_ab_array_bits:
+ ldr r4,[r6,#4]
+ ldr r7,[r6,#8]
+ ldrh r3,[r7,#-2+2]
+ ldrh r7,[r7,#-2]
+ lsl r3,r3,#2
+ sub r7,r7,#256
+ lsl r7,r7,#2
+ str r3,[sp,#-4]!
+ str r7,[sp,#-4]!
+ add r8,r6,#12
+
+ lao r12,end_vector,4
+ ldo r12,r12,end_vector,4
+ str r12,[sp,#-4]!
+ b _mark_ab_array_begin
+
+_mark_ab_array:
+ ldr r3,[sp,#8]
+ str r4,[sp,#-4]!
+ str r8,[sp,#-4]!
+ add r4,r8,r3
+
+ lao r12,end_vector,5
+ sto r4,r12,end_vector,5
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _mark_stack_nodes
+
+ ldr r3,[sp,#4+8]
+ ldr r8,[sp],#4
+ ldr r4,[sp],#4
+ add r8,r8,r3
+_mark_ab_array_begin:
+ subs r4,r4,#1
+ bcs _mark_ab_array
+
+ ldr r6,[sp]
+ lao r12,end_vector,6
+ sto r6,r12,end_vector,6
+ add sp,sp,#12
+ b _mark_next_node
+
+_mark_a_record_array:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ ldr r8,[r6,#4]
+
+ mul r4,r8,r4
+ str r4,[sp,#-4]!
+
+ add r4,r4,#3
+
+ add r2,r2,r4
+ add r12,r6,#-4
+ add r4,r12,r4,lsl #2
+
+ sub r4,r4,r0
+ lsr r4,r4,#7
+
+ cmp r3,r4
+ bhs _end_set_a_array_bits
+
+ add r3,r3,#1
+ mov r8,#1
+ cmp r3,r4
+ bhs _last_a_array_bits
+
+_mark_a_array_lp:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r4
+ blo _mark_a_array_lp
+
+_last_a_array_bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+
+_end_set_a_array_bits:
+ ldr r4,[sp],#4
+ add r8,r6,#12
+
+ 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
+
+ lao r12,end_vector,8
+ sto r4,r12,end_vector,8
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _mark_stack_nodes
+
+ ldr r6,[sp],#4
+ lao r12,end_vector,9
+ sto r6,r12,end_vector,9
+ b _mark_next_node
+
+_mark_lazy_array:
+ cmp sp,r11
+ blo _mark_array_using_reversal
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ ldr r4,[r6,#4]
+
+ add r4,r4,#3
+
+ add r2,r2,r4
+ add r12,r6,#-4
+ add r4,r12,r4,lsl #2
+
+ sub r4,r4,r0
+ lsr r4,r4,#7
+
+ cmp r3,r4
+ bhs _end_set_lazy_array_bits
+
+ add r3,r3,#1
+ mov r8,#1
+ cmp r3,r4
+ bhs _last_lazy_array_bits
+
+_mark_lazy_array_lp:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r4
+ blo _mark_lazy_array_lp
+
+_last_lazy_array_bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+
+_end_set_lazy_array_bits:
+ ldr r4,[r6,#4]
+ add r8,r6,#12
+
+ 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
+
+ lao r12,end_vector,11
+ sto r4,r12,end_vector,11
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _mark_stack_nodes
+
+ ldr r6,[sp],#4
+ lao r12,end_vector,12
+ sto r6,r12,end_vector,12
+ b _mark_next_node
+
+_mark_array_using_reversal:
+ mov r12,#0
+ str r12,[sp,#-4]!
+ mov r9,#1
+ b __mark_node
+
+_mark_strict_basic_array:
+ ldr r4,[r6,#4]
+ laol r12,INT+2,INT_o_2,8
+ otoa r12,INT_o_2,8
+ cmp r8,r12
+ beq _mark_strict_int_array
+ 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:
+ add r4,r4,r4
+_mark_strict_int_array:
+ add r4,r4,#3
+ b _mark_basic_array_
+_mark_strict_bool_array:
+ add r4,r4,#12+3
+ lsr r4,r4,#2
+ b _mark_basic_array_
+
+_mark_b_record_array:
+ ldr r8,[r6,#4]
+ sub r4,r4,#256
+ mul r4,r8,r4
+ add r4,r4,#3
+ b _mark_basic_array_
+
+_mark_string_:
+ ldr r4,[r6,#4]
+ add r4,r4,#8+3
+ lsr r4,r4,#2
+
+_mark_basic_array_:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+
+ add r2,r2,r4
+ add r12,r6,#-4
+ add r4,r12,r4,lsl #2
+
+ sub r4,r4,r0
+ lsr r4,r4,#7
+
+ cmp r3,r4
+ bhs _mark_next_node
+
+ add r3,r3,#1
+ mov r8,#1
+ cmp r3,r4
+ bhs _last_string_bits
+
+_mark_string_lp:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r4
+ blo _mark_string_lp
+
+_last_string_bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ b _mark_next_node
+
+__end_mark_using_reversal:
+ ldr r7,[sp],#4
+ tst r7,r7
+ beq _mark_next_node
+ str r6,[r7]
+ b _mark_next_node
+.endif
+
+.ifdef PIC
+ lto end_vector,2
+ lto e__system__nind,11
+ lto e__system__nind,12
+ lto e__system__nind,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:
+ str r6,[sp,#-4]!
+ mov r9,#1
+ ldr r6,[r6]
+ b __mark_node
+
+__mark_arguments:
+ ldr r4,[r6]
+ tst r4,#2
+ beq __mark_lazy_node
+
+ ldrh r8,[r4,#-2]
+ tst r8,r8
+ beq __mark_hnf_0
+
+ add r6,r6,#4
+
+ cmp r8,#256
+ bhs __mark__record
+
+ subs r8,r8,#2
+ beq __mark_hnf_2
+ blo __mark_hnf_1
+
+__mark_hnf_3:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+
+ cmp r7,#0x20000000
+ bls fits__in__word__1
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in__word__1:
+ ldr r12,[r6,#4]
+ sub r4,r12,r0
+
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+
+ lsr r7,r4,#2
+ mov r12,#1
+ lsl r7,r12,r7
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r7,r12
+ bne __shared_argument_part
+
+__no_shared_argument_part:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ ldr r7,[r6,#4]
+
+ add r8,r8,#1
+ str r9,[r6,#4]
+
+ add r2,r2,r8
+ add r6,r6,#4
+
+ lsl r8,r8,#2
+ ldr r12,[r7]
+ orr r12,r12,#1
+ str r12,[r7]
+
+ add r4,r4,r8
+ add r7,r7,r8
+
+ cmp r4,#32*4
+ bls fits__in__word__2
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits__in__word__2:
+
+ ldr r8,[r7,#-4]
+ str r6,[r7,#-4]
+ add r9,r7,#-4
+ mov r6,r8
+ b __mark_node
+
+__mark_hnf_1:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#2
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x40000000
+ bls __shared_argument_part
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+__shared_argument_part:
+ ldr r8,[r6]
+ str r9,[r6]
+ add r9,r6,#2
+ mov r6,r8
+ b __mark_node
+
+__mark_no_selector_2:
+ ldr r3,[sp],#4
+__mark_no_selector_1:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x20000000
+ bls __shared_argument_part
+
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+ b __shared_argument_part
+
+__mark_lazy_node_1:
+ beq __mark_no_selector_1
+
+__mark_selector_node_1:
+ cmp r8,#-2
+ beq __mark_indirection_node
+
+ cmp r8,#-3
+
+ str r3,[sp,#-4]!
+ ldr r8,[r6]
+ str r4,[sp,#-4]!
+
+ ble __mark_record_selector_node_1
+
+ sub r4,r8,r0
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+ lsr r4,r4,#2
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r4,r12
+ ldr r4,[sp],#4
+ bne __mark_no_selector_2
+
+ ldr r3,[r8]
+ tst r3,#2
+ beq __mark_no_selector_2
+
+ ldrh r12,[r3,#-2]
+ cmp r12,#2
+ bls __small_tuple_or_record
+
+__large_tuple_or_record:
+ ldr r8,[r8,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ 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,e__system__nind,14
+ ldr r7,[r6]
+ otoa r8,e__system__nind,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]
+ beq __mark_tuple_selector_node_2
+ sub r4,r4,#12
+ ldr r6,[r7,r4]
+ str r6,[r8]
+ b __mark_node
+
+__mark_tuple_selector_node_2:
+ ldr r6,[r7]
+ str r6,[r8]
+ 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,e__system__nind,15
+ ldr r7,[r6]
+ otoa r8,e__system__nind,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]
+ b __mark_node
+
+__mark_record_selector_node_1:
+ beq __mark_strict_record_selector_node_1
+
+ sub r4,r8,r0
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+ lsr r4,r4,#2
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r4,r12
+ ldr r4,[sp],#4
+ bne __mark_no_selector_2
+
+ ldr r3,[r8]
+ tst r3,#2
+ beq __mark_no_selector_2
+
+ ldrh r12,[r3,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls __small_record
+
+ ldr r8,[r8,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ 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,e__system__nind,16
+ ldr r7,[r6]
+ otoa r8,e__system__nind,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]
+ sub r4,r4,#12
+__mark_record_selector_node_2:
+ ldr r6,[r7,r4]
+
+ str r6,[r8]
+ b __mark_node
+
+__mark_strict_record_selector_node_1:
+ sub r4,r8,r0
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+ lsr r4,r4,#2
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r4,r12
+ ldr r4,[sp],#4
+ bne __mark_no_selector_2
+
+ ldr r3,[r8]
+ tst r3,#2
+ beq __mark_no_selector_2
+
+ ldrh r12,[r3,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ ble __select_from_small_record
+
+ ldr r8,[r8,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ 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]
+ add r3,r3,r12
+ ldr r3,[r3,#-12]
+ b __mark_strict_record_selector_node_3
+__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
+ ble __mark_strict_record_selector_node_4
+ ldr r7,[r7,#8]
+ sub r3,r3,#12
+__mark_strict_record_selector_node_4:
+ ldr r3,[r7,r3]
+ 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
+
+__mark_indirection_node:
+ ldr r6,[r6]
+ b __mark_node
+
+__mark_hnf_2:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x20000000
+ bls fits__in__word__6
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in__word__6:
+
+__mark_record_2_c:
+ ldr r4,[r6]
+ ldr r8,[r6,#4]
+ orr r4,r4,#2
+ str r9,[r6,#4]
+ str r4,[r6]
+ add r9,r6,#4
+ mov r6,r8
+
+__mark_node:
+ sub r7,r6,r0
+ cmp r7,r1
+ bhs __mark_next_node
+
+ lsr r3,r7,#7
+ and r7,r7,#31*4
+ lsr r8,r7,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ beq __mark_arguments
+
+__mark_next_node:
+ tst r9,#3
+ bne __mark_parent
+
+ ldr r8,[r9,#-4]
+ ldr r7,[r9]
+ str r6,[r9]
+ str r7,[r9,#-4]
+ sub r9,r9,#4
+
+ mov r6,r8
+ and r8,r8,#3
+ and r6,r6,#-4
+ orr r9,r9,r8
+ b __mark_node
+
+__mark_parent:
+ mov r3,r9
+ bics r9,r9,#3
+ beq __end_mark_using_reversal
+
+ and r3,r3,#3
+ ldr r8,[r9]
+ str r6,[r9]
+
+ subs r3,r3,#1
+ beq __argument_part_parent
+
+ add r6,r9,#-4
+ mov r9,r8
+ b __mark_next_node
+
+__argument_part_parent:
+ and r8,r8,#-4
+ mov r7,r9
+ ldr r6,[r8,#-4]
+ ldr r3,[r8]
+ str r3,[r8,#-4]
+ str r7,[r8]
+ add r9,r8,#2-4
+ b __mark_node
+
+__mark_lazy_node:
+ ldr r8,[r4,#-4]
+ tst r8,r8
+ beq __mark_real_or_file
+
+ add r6,r6,#4
+ cmp r8,#1
+ ble __mark_lazy_node_1
+ cmp r8,#256
+ bge __mark_closure_with_unboxed_arguments
+
+ add r8,r8,#1
+ mov r4,r7
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,r8
+
+ add r4,r4,r8,lsl #2
+ sub r8,r8,#2
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+
+ cmp r4,#32*4
+ bls fits__in__word__7
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in__word__7:
+__mark_closure_with_unboxed_arguments__2:
+ add r7,r6,r8,lsl #2
+ ldr r4,[r6]
+ orr r4,r4,#2
+ str r4,[r6]
+ ldr r6,[r7]
+ str r9,[r7]
+ mov r9,r7
+ b __mark_node
+
+__mark_closure_with_unboxed_arguments:
+ mov r4,r8
+ and r8,r8,#255
+
+ subs r8,r8,#1
+ beq __mark_closure_1_with_unboxed_argument
+ add r8,r8,#2
+
+ lsr r4,r4,#8
+ add r2,r2,r8
+
+ str r6,[sp,#-4]!
+ add r6,r7,r8,lsl #2
+
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ sub r8,r8,r4
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r6,#32*4
+ bls fits__in_word_7_
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in_word_7_:
+ ldr r6,[sp],#4
+ subs r8,r8,#2
+ bgt __mark_closure_with_unboxed_arguments__2
+ beq __shared_argument_part
+ sub r6,r6,#4
+ b __mark_next_node
+
+__mark_closure_1_with_unboxed_argument:
+ sub r6,r6,#4
+ b __mark_real_or_file
+
+__mark_hnf_0:
+ laol r12,INT+2,INT_o_2,9
+ otoa r12,INT_o_2,9
+ cmp r4,r12
+ bne __no_int_3
+
+ ldr r8,[r6,#4]
+ cmp r8,#33
+ blo ____small_int
+
+__mark_bool_or_small_string:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#2
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x40000000
+ bls __mark_next_node
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+ b __mark_next_node
+
+____small_int:
+ 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
+
+ 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]
+ lao r6,static_characters,2
+ otoa r6,static_characters,2
+ add r6,r6,r8,lsl #3
+ b __mark_next_node
+
+__no_char_3:
+ blo __mark_bool_or_small_string
+
+ add r6,r4,#ZERO_ARITY_DESCRIPTOR_OFFSET-2
+ b __mark_next_node
+
+__mark_real_file_or_string:
+ laol r12,__STRING__+2,__STRING___o_2,9
+ otoa r12,__STRING___o_2,9
+ cmp r4,r12
+ bls __mark_string_or_array
+
+__mark_real_or_file:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+
+ cmp r7,#0x20000000
+ bls __mark_next_node
+
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+ b __mark_next_node
+
+__mark__record:
+ mov r12,#258/2
+ subs r8,r8,r12,lsl #1
+ beq __mark_record_2
+ blt __mark_record_1
+
+__mark_record_3:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x20000000
+ bls fits__in__word__13
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in__word__13:
+ ldrh r3,[r4,#-2+2]
+
+ ldr r7,[r6,#4]
+ sub r7,r7,r0
+ mov r4,r7
+ and r7,r7,#31*4
+ lsr r4,r4,#7
+
+ str r9,[sp,#-4]!
+
+ lsr r9,r7,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r4,lsl #2]
+ tst r9,r12
+ bne __shared_record_argument_part
+
+ add r8,r8,#1
+ ldr r12,[r10,r4,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r4,lsl #2]
+
+ add r7,r7,r8,lsl #2
+ add r2,r2,r8
+
+ ldr r9,[sp],#4
+
+ cmp r7,#32*4
+ bls fits__in__word__14
+ add r12,r10,#4
+ ldr r7,[r12,r4,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r4,lsl #2]
+fits__in__word__14:
+ subs r3,r3,#1
+ ldr r7,[r6,#4]
+ blt __mark_record_3_bb
+ beq __shared_argument_part
+
+ str r9,[r6,#4]
+ add r6,r6,#4
+
+ subs r3,r3,#1
+ beq __mark_record_3_aab
+
+ add r9,r7,r3,lsl #2
+ ldr r4,[r7]
+ orr r4,r4,#1
+ ldr r8,[r9]
+ str r4,[r7]
+ str r6,[r9]
+ mov r6,r8
+ b __mark_node
+
+__mark_record_3_bb:
+ sub r6,r6,#4
+ b __mark_next_node
+
+__mark_record_3_aab:
+ ldr r8,[r7]
+ str r6,[r7]
+ add r9,r7,#1
+ mov r6,r8
+ b __mark_node
+
+__shared_record_argument_part:
+ ldr r7,[r6,#4]
+
+ ldr r9,[sp],#4
+
+ tst r3,r3
+ bne __shared_argument_part
+ sub r6,r6,#4
+ b __mark_next_node
+
+__mark_record_2:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x20000000
+ bls fits__in__word_12
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in__word_12:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#1
+ bhi __mark_record_2_c
+ beq __shared_argument_part
+ sub r6,r6,#4
+ b __mark_next_node
+
+__mark_record_1:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#0
+ bne __mark_hnf_1
+ sub r6,r6,#4
+ b __mark_bool_or_small_string
+
+__mark_string_or_array:
+ beq __mark_string_
+
+__mark_array:
+ ldr r8,[r6,#8]
+ cmp r8,#0
+ beq __mark_lazy_array
+
+ ldrh r4,[r8,#-2]
+ cmp r4,#0
+ beq __mark_strict_basic_array
+
+ ldrh r8,[r8,#-2+2]
+ tst r8,r8
+ beq __mark_b_record_array
+
+ sub r4,r4,#256
+ cmp r4,r8
+ beq __mark_a_record_array
+
+__mark__ab__record__array:
+ str r7,[sp,#-4]!
+ str r3,[sp,#-4]!
+ mov r3,r8
+
+ ldr r8,[r6,#4]
+ add r6,r6,#8
+ str r6,[sp,#-4]!
+
+ lsl r8,r8,#2
+ mov r7,r4
+ mul r7,r8,r7
+
+ sub r4,r4,r3
+ add r6,r6,#4
+ add r7,r7,r6
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl reorder
+
+ ldr r6,[sp],#4
+
+ mov r12,r4
+ mov r4,r3
+ mov r3,r12
+ ldr r8,[r6,#-4]
+ mul r4,r8,r4
+ mul r3,r8,r3
+ add r2,r2,r3
+ add r3,r3,r4
+
+ lsl r3,r3,#2
+ sub r8,r6,r0
+ add r8,r8,r3
+
+ ldr r3,[sp],#4
+ ldr r7,[sp],#4
+
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+
+ add r7,r6,r4,lsl #2
+ b __mark_r_array
+
+__mark_a_record_array:
+ ldr r12,[r6,#4]
+ mul r4,r12,r4
+ add r6,r6,#8
+ b __mark_lr_array
+
+__mark_lazy_array:
+ ldr r4,[r6,#4]
+ add r6,r6,#8
+
+__mark_lr_array:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ add r7,r6,r4,lsl #2
+ sub r8,r7,r0
+__mark_r_array:
+ lsr r8,r8,#7
+
+ cmp r3,r8
+ bhs __skip_mark_lazy_array_bits
+
+ add r3,r3,#1
+
+__mark_lazy_array_bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,#1
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r8
+ bls __mark_lazy_array_bits
+
+__skip_mark_lazy_array_bits:
+ add r2,r2,#3
+ add r2,r2,r4
+
+ cmp r4,#1
+ bls __mark_array_length_0_1
+
+ ldr r8,[r7]
+ ldr r3,[r6]
+ str r3,[r7]
+ str r8,[r6]
+
+ ldr r8,[r7,#-4]
+ sub r7,r7,#4
+ 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
+ lao r12,lazy_array_list,3
+ sto r6,r12,lazy_array_list,3
+
+ ldr r6,[r7,#-4]
+ str r9,[r7,#-4]
+ add r9,r7,#-4
+ b __mark_node
+
+__mark_array_length_0_1:
+ add r6,r6,#-8
+ blo __mark_next_node
+
+ ldr r3,[r6,#12]
+ ldr r8,[r6,#8]
+ lao r12,lazy_array_list,4
+ ldo r7,r12,lazy_array_list,4
+ str r8,[r6,#12]
+ str r7,[r6,#8]
+ str r4,[r6]
+ lao r12,lazy_array_list,5
+ sto r6,r12,lazy_array_list,5
+ str r3,[r6,#4]
+ add r6,r6,#4
+
+ ldr r8,[r6]
+ str r9,[r6]
+ add r9,r6,#2
+ mov r6,r8
+ b __mark_node
+
+__mark_b_record_array:
+ ldr r8,[r6,#4]
+ sub r4,r4,#256
+ mul r4,r8,r4
+ add r4,r4,#3
+ b __mark_basic_array
+
+__mark_strict_basic_array:
+ ldr r4,[r6,#4]
+ laol r12,INT+2,INT_o_2,10
+ otoa r12,INT_o_2,10
+ cmp r8,r12
+ beq __mark__strict__int__array
+ 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:
+ add r4,r4,r4
+__mark__strict__int__array:
+ add r4,r4,#3
+ b __mark_basic_array
+__mark__strict__bool__array:
+ add r4,r4,#12+3
+ lsr r4,r4,#2
+ b __mark_basic_array
+
+__mark_string_:
+ ldr r4,[r6,#4]
+ add r4,r4,#8+3
+ lsr r4,r4,#2
+
+__mark_basic_array:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,r4
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ add r12,r6,#-4
+ add r4,r12,r4,lsl #2
+
+ sub r4,r4,r0
+ lsr r4,r4,#7
+
+ cmp r3,r4
+ bhs __mark_next_node
+
+ add r3,r3,#1
+ mov r8,#1
+
+ cmp r3,r4
+ bhs __last__string__bits
+
+__mark_string_lp:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r4
+ blo __mark_string_lp
+
+__last__string__bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ b __mark_next_node
+
+.ifdef PIC
+ lto e__system__nind,14
+ lto e__system__nind,15
+ lto e__system__nind,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/thumb2startup.s b/thumb2startup.s
new file mode 100644
index 0000000..b66a5a5
--- /dev/null
+++ b/thumb2startup.s
@@ -0,0 +1,5067 @@
+@
+@ File: thumb2startup.s
+@ Author: John van Groningen, adapted for Thumb-2 by Camil Staps
+@ Machine: ARM
+
+@ B stack registers: r4 r3 r2 r1 r0
+@ A stack registers: r6 r7 r8 r11 (fp)
+@ n free heap words: r5
+@ A stack pointer: r9 (sb)
+@ heap pointer: r10 (sl)
+@ scratch register: r12 (ip)
+@ B stack pointer: r13 (sp)
+@ link/scratch register: r14 (lr)
+
+ .fpu vfp3
+ .thumb
+ .syntax unified
+ .include "armmacros.s"
+
+USE_CLIB = 1
+
+SHARE_CHAR_INT = 1
+MY_ITOS = 1
+FINALIZERS = 1
+STACK_OVERFLOW_EXCEPTION_HANDLER = 0
+WRITE_HEAP = 0
+
+@ DEBUG = 0
+PREFETCH2 = 0
+
+NO_BIT_INSTRUCTIONS = 1
+ADJUST_HEAP_SIZE = 1
+MARK_GC = 1
+MARK_AND_COPY_GC = 1
+
+NEW_DESCRIPTORS = 1
+
+@ #define PROFILE
+MODULE_NAMES_IN_TIME_PROFILER = 1
+
+COMPACT_GC_ONLY = 0
+
+MINIMUM_HEAP_SIZE = 8000
+MINIMUM_HEAP_SIZE_2 = 4000
+
+.ifdef LINUX
+# define section(n) .section .text.n,"ax"
+.else
+# define section(n) .text
+.endif
+
+DESCRIPTOR_ARITY_OFFSET = (-2)
+ZERO_ARITY_DESCRIPTOR_OFFSET = (-4)
+
+ .hidden semi_space_size
+ .comm semi_space_size,4
+
+ .hidden heap_mbp
+ .comm heap_mbp,4
+ .hidden stack_mbp
+ .comm stack_mbp,4
+ .hidden heap_p
+ .comm heap_p,4
+ .hidden heap_p1
+ .comm heap_p1,4
+ .hidden heap_p2
+ .comm heap_p2,4
+ .hidden heap_p3
+ .comm heap_p3,4
+ .hidden end_heap_p3
+ .comm end_heap_p3,4
+ .hidden heap_size_33
+ .comm heap_size_33,4
+ .hidden vector_p
+ .comm vector_p,4
+ .hidden vector_counter
+ .comm vector_counter,4
+ .hidden neg_heap_vector_plus_4
+ .comm neg_heap_vector_plus_4,4
+
+ .hidden heap_size_32_33
+ .comm heap_size_32_33,4
+ .hidden heap_vector
+ .comm heap_vector,4
+ .hidden stack_top
+ .comm stack_top,4
+ .hidden end_vector
+ .comm end_vector,4
+
+ .hidden heap_size_129
+ .comm heap_size_129,4
+ .hidden heap_copied_vector
+ .comm heap_copied_vector,4
+ .hidden heap_copied_vector_size
+ .comm heap_copied_vector_size,4
+ .hidden heap_end_after_copy_gc
+ .comm heap_end_after_copy_gc,4
+
+ .hidden heap_end_after_gc
+ .comm heap_end_after_gc,4
+ .hidden extra_heap
+ .comm extra_heap,4
+ .hidden extra_heap_size
+ .comm extra_heap_size,4
+ .hidden stack_p
+ .comm stack_p,4
+ .hidden halt_sp
+ .comm halt_sp,4
+
+ .hidden n_allocated_words
+ .comm n_allocated_words,4
+ .hidden basic_only
+ .comm basic_only,4
+
+ .hidden last_time
+ .comm last_time,4
+ .hidden execute_time
+ .comm execute_time,4
+ .hidden garbage_collect_time
+ .comm garbage_collect_time,4
+ .hidden IO_time
+ .comm IO_time,4
+
+ .globl saved_heap_p
+ .hidden saved_heap_p
+ .comm saved_heap_p,8
+
+ .globl saved_a_stack_p
+ .hidden saved_a_stack_p
+ .comm saved_a_stack_p,4
+
+ .globl end_a_stack
+ .hidden end_a_stack
+ .comm end_a_stack,4
+
+ .globl end_b_stack
+ .hidden end_b_stack
+ .comm end_b_stack,4
+
+ .hidden dll_initisialised
+ .comm dll_initisialised,4
+
+.if WRITE_HEAP
+ .comm heap_end_write_heap,4
+ .comm d3_flag_write_heap,4
+ .comm heap2_begin_and_end,8
+.endif
+
+.if STACK_OVERFLOW_EXCEPTION_HANDLER
+ .comm a_stack_guard_page,4
+.endif
+
+ .globl profile_stack_pointer
+ .hidden profile_stack_pointer
+ .comm profile_stack_pointer,4
+
+ .data
+ .p2align 2
+
+.if MARK_GC
+bit_counter:
+ .long 0
+bit_vector_p:
+ .long 0
+zero_bits_before_mark:
+ .long 1
+n_free_words_after_mark:
+ .long 1000
+n_last_heap_free_bytes:
+ .long 0
+lazy_array_list:
+ .long 0
+n_marked_words:
+ .long 0
+end_stack:
+ .long 0
+ .if ADJUST_HEAP_SIZE
+bit_vector_size:
+ .long 0
+ .endif
+.endif
+
+caf_list:
+ .long 0
+ .globl caf_listp
+ .hidden caf_listp
+caf_listp:
+ .long 0
+
+zero_length_string:
+ .long __STRING__+2
+ .long 0
+true_string:
+ .long __STRING__+2
+ .long 4
+true_c_string:
+ .ascii "True"
+ .byte 0,0,0,0
+false_string:
+ .long __STRING__+2
+ .long 5
+false_c_string:
+ .ascii "False"
+ .byte 0,0,0
+file_c_string:
+ .ascii "File"
+ .byte 0,0,0,0
+garbage_collect_flag:
+ .byte 0
+ .byte 0,0,0
+
+ .hidden sprintf_buffer
+ .comm sprintf_buffer,32
+
+out_of_memory_string_1:
+ .ascii "Not enough memory to allocate heap and stack"
+ .byte 10,0
+printf_int_string:
+ .ascii "%d"
+ .byte 0
+printf_real_string:
+ .ascii "%.15g"
+ .byte 0
+printf_string_string:
+ .ascii "%s"
+ .byte 0
+printf_char_string:
+ .ascii "%c"
+ .byte 0
+garbage_collect_string_1:
+ .asciz "A stack: "
+garbage_collect_string_2:
+ .asciz " bytes. BC stack: "
+garbage_collect_string_3:
+ .ascii " bytes."
+ .byte 10,0
+heap_use_after_gc_string_1:
+ .ascii "Heap use after garbage collection: "
+ .byte 0
+heap_use_after_gc_string_2:
+ .ascii " Bytes."
+ .byte 10,0
+stack_overflow_string:
+ .ascii "Stack overflow."
+ .byte 10,0
+out_of_memory_string_4:
+ .ascii "Heap full."
+ .byte 10,0
+time_string_1:
+ .ascii "Execution: "
+ .byte 0
+time_string_2:
+ .ascii " Garbage collection: "
+ .byte 0
+time_string_4:
+ .ascii " Total: "
+ .byte 0
+high_index_string:
+ .ascii "Index too high in UPDATE string."
+ .byte 10,0
+low_index_string:
+ .ascii "Index negative in UPDATE string."
+ .byte 10,0
+IO_error_string:
+ .ascii "IO error: "
+ .byte 0
+new_line_string:
+ .byte 10,0
+
+sprintf_time_string:
+ .ascii "%d.%02d"
+ .byte 0
+
+.if MARK_GC
+marked_gc_string_1:
+ .ascii "Marked: "
+ .byte 0
+.endif
+.ifdef PROFILE
+ .p2align 2
+ .if MODULE_NAMES_IN_TIME_PROFILER
+ .ifdef LINUX
+ .globl m_system
+ .endif
+m_system:
+ .long 6
+ .ascii "System"
+ .byte 0
+ .byte 0
+ .long m_system
+
+ .endif
+garbage_collector_name:
+ .long 0
+ .asciz "garbage_collector"
+ .p2align 2
+.endif
+
+.ifdef DLL
+start_address:
+ .long 0
+.endif
+ .p2align 2
+ .hidden sprintf_time_buffer
+ .comm sprintf_time_buffer,20
+
+ .p2align 2
+.if SHARE_CHAR_INT
+ .globl small_integers
+ .hidden small_integers
+ .comm small_integers,33*8
+ .globl static_characters
+ .hidden static_characters
+ .comm static_characters,256*8
+.endif
+
+.ifdef SHARED_LIBRARY
+ .section .init_array
+ .long clean_init
+
+ .section .fini_array
+ .long clean_fini
+.endif
+
+ .text
+
+ .globl abc_main
+ .globl print
+ .globl print_char
+ .globl print_int
+ .globl print_real
+ .globl print__string__
+ .globl print__chars__sc
+ .globl print_sc
+ .globl print_symbol
+ .globl print_symbol_sc
+ .globl printD
+ .globl DtoAC
+ .globl push_t_r_args
+ .globl push_a_r_args
+ .globl halt
+ .globl dump
+
+ .globl catAC
+ .globl sliceAC
+ .globl updateAC
+ .globl eqAC
+ .globl cmpAC
+
+ .globl string_to_string_node
+ .globl int_array_to_node
+ .globl real_array_to_node
+
+ .globl _create_arrayB
+ .globl _create_arrayC
+ .globl _create_arrayI
+ .globl _create_arrayR
+ .globl _create_r_array
+ .globl create_array
+ .globl create_arrayB
+ .globl create_arrayC
+ .globl create_arrayI
+ .globl create_arrayR
+ .globl create_R_array
+
+ .globl BtoAC
+ .globl ItoAC
+ .globl RtoAC
+ .globl eqD
+
+ .globl collect_0
+ .globl collect_1
+ .globl collect_2
+ .globl collect_3
+
+ .globl _c3,_c4,_c5,_c6,_c7,_c8,_c9,_c10,_c11,_c12
+ .hidden _c3,_c4,_c5,_c6,_c7,_c8,_c9,_c10,_c11,_c12
+ .globl _c13,_c14,_c15,_c16,_c17,_c18,_c19,_c20,_c21,_c22
+ .hidden _c13,_c14,_c15,_c16,_c17,_c18,_c19,_c20,_c21,_c22
+ .globl _c23,_c24,_c25,_c26,_c27,_c28,_c29,_c30,_c31,_c32
+ .hidden _c23,_c24,_c25,_c26,_c27,_c28,_c29,_c30,_c31,_c32
+
+ .globl e__system__eaind
+ .hidden e__system__eaind
+ .globl e__system__nind
+ .hidden e__system__nind
+@ old name of the previous label for compatibility, remove later
+ .globl __indirection
+ .hidden __indirection
+ .globl e__system__dind
+ .hidden e__system__dind
+ .globl eval_fill
+
+ .globl eval_upd_0,eval_upd_1,eval_upd_2,eval_upd_3,eval_upd_4
+ .globl eval_upd_5,eval_upd_6,eval_upd_7,eval_upd_8,eval_upd_9
+ .globl eval_upd_10,eval_upd_11,eval_upd_12,eval_upd_13,eval_upd_14
+ .globl eval_upd_15,eval_upd_16,eval_upd_17,eval_upd_18,eval_upd_19
+ .globl eval_upd_20,eval_upd_21,eval_upd_22,eval_upd_23,eval_upd_24
+ .globl eval_upd_25,eval_upd_26,eval_upd_27,eval_upd_28,eval_upd_29
+ .globl eval_upd_30,eval_upd_31,eval_upd_32
+
+ .globl repl_args_b
+ .globl push_arg_b
+ .globl del_args
+
+ .globl add_IO_time
+ .globl add_execute_time
+ .globl IO_error
+ .globl stack_overflow
+
+ .globl out_of_memory_4
+ .globl print_error
+.ifndef DLL
+ .global _start
+.endif
+ .globl sin_real
+ .globl cos_real
+ .globl tan_real
+ .globl asin_real
+ .globl acos_real
+ .globl atan_real
+ .globl ln_real
+ .globl log10_real
+ .globl exp_real
+ .globl pow_real
+ .globl r_to_i_real
+ .globl entier_real
+
+.ifdef PROFILE
+ .globl init_profiler
+ .globl profile_s,profile_n,profile_r,profile_t
+ .globl write_profile_information,write_profile_stack
+.endif
+ .globl __driver
+
+@ from system.abc:
+ .globl INT
+ .globl CHAR
+ .globl BOOL
+ .globl REAL
+ .globl FILE
+ .globl __STRING__
+ .globl __ARRAY__
+ .globl __cycle__in__spine
+ .globl __print__graph
+ .globl __eval__to__nf
+
+@ from wcon.c:
+ .globl w_print_char
+ .globl w_print_string
+ .globl w_print_text
+ .globl w_print_int
+ .globl w_print_real
+
+ .globl ew_print_char
+ .globl ew_print_text
+ .globl ew_print_string
+ .globl ew_print_int
+
+ .globl ab_stack_size
+ .globl heap_size
+ .globl flags
+
+@ from standard c library:
+ .globl malloc
+ .globl free
+ .globl sprintf
+ .globl strlen
+
+.if STACK_OVERFLOW_EXCEPTION_HANDLER
+ .globl allocate_memory_with_guard_page_at_end
+.endif
+.if ADJUST_HEAP_SIZE
+ .global heap_size_multiple
+ .global initial_heap_size
+.endif
+.if WRITE_HEAP
+ .global min_write_heap_size
+.endif
+.if FINALIZERS
+ .global __Nil
+ .globl finalizer_list
+ .hidden finalizer_list
+ .comm finalizer_list,4
+ .globl free_finalizer_list
+ .hidden free_finalizer_list
+ .comm free_finalizer_list,4
+.endif
+
+abc_main:
+ str lr,[sp,#-4]!
+
+ stmdb sp!,{r4-r11}
+
+.ifdef DLL
+ ldr r4,[sp,#28]
+ lao r12,start_address,0
+ sto r4,r12,start_address,0
+.endif
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl init_clean
+ tst r4,r4
+ bne init_error
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl init_timer
+
+ lao r12,halt_sp,0
+ sto sp,r12,halt_sp,0
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl init_profiler
+.endif
+
+.ifdef DLL
+ lao r12,start_address,1
+ ldo r4,r12,start_address,1
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r4
+.else
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl __start
+.endif
+
+exit:
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl exit_clean
+
+init_error:
+ ldmia sp!,{r4-r11,pc}
+
+ .globl clean_init
+clean_init:
+ stmdb sp!,{r4-r11,lr}
+
+ lao r12,dll_initisialised,0
+ mov r0,#1
+ sto r0,r12,dll_initisialised,0
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl init_clean
+ tst r4,r4
+ bne init_dll_error
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl init_timer
+
+ lao r12,halt_sp,1
+ sto sp,r12,halt_sp,1
+
+ .ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl init_profiler
+ .endif
+
+ lao r12,saved_heap_p,0
+ otoa r12,saved_heap_p,0
+ str r10,[r12]
+ str r5,[r12,#4]
+ lao r12,saved_a_stack_p,0
+ sto r9,r12,saved_a_stack_p,0
+
+ mov r4,#1
+ b exit_dll_init
+
+init_dll_error:
+ mov r4,#0
+ b exit_dll_init
+
+ .globl clean_fini
+clean_fini:
+ stmdb sp!,{r4-r11,lr}
+
+ lao r12,saved_heap_p,1
+ otoa r12,saved_heap_p,1
+ ldr r10,[r12]
+ ldr r5,[r12,#4]
+ lao r12,saved_a_stack_p,1
+ ldo r9,r12,saved_a_stack_p,1
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl exit_clean
+
+exit_dll_init:
+ ldmia sp!,{r4-r11,pc}
+
+init_clean:
+ add r4,sp,#128
+ lao r12,ab_stack_size,0
+ ldo r12,r12,ab_stack_size,0
+ sub r4,r4,r12
+ lao r12,end_b_stack,0
+ sto r4,r12,end_b_stack,0
+
+ lao r12,flags,0
+ ldo r4,r12,flags,0
+ and r4,r4,#1
+ lao r12,basic_only,0
+ sto r4,r12,basic_only,0
+
+ lao r12,heap_size,0
+ ldo r4,r12,heap_size,0
+.if PREFETCH2
+ subs r4,r4,#63
+.else
+ subs r4,r4,#3
+.endif
+@ divide by 33
+ ldr r12,=1041204193
+ umull r11,r4,r12,r4
+ lsr r4,r4,#3
+ lao r12,heap_size_33,0
+ sto r4,r12,heap_size_33,0
+
+ 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
+ lao r12,heap_size_129,0
+ sto r4,r12,heap_size_129,0
+ add r4,r4,#3
+ and r4,r4,#-4
+ 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
+ sto r11,r12,heap_end_after_copy_gc,0
+
+ lao r12,heap_size,2
+ ldo r4,r12,heap_size,2
+ add r4,r4,#7
+ and r4,r4,#-8
+.ifdef PIC
+ lao r12,heap_size,3
+.endif
+ sto r4,r12,heap_size,3
+ add r4,r4,#7
+
+ mov r0,r4
+ bl malloc
+
+ movs r4,r0
+ beq no_memory_2
+
+ lao r12,heap_mbp,0
+ sto r4,r12,heap_mbp,0
+ add r10,r4,#3
+ and r10,r10,#-4
+ lao r12,heap_p,0
+ sto r10,r12,heap_p,0
+
+ lao r8,ab_stack_size,1
+ ldo r8,r8,ab_stack_size,1
+ add r8,r8,#3
+
+ mov r0,r8
+.if STACK_OVERFLOW_EXCEPTION_HANDLER
+ bl allocate_memory_with_guard_page_at_end
+.else
+ bl malloc
+.endif
+
+ movs r4,r0
+ beq no_memory_3
+
+ lao r12,stack_mbp,0
+ sto r4,r12,stack_mbp,0
+.if STACK_OVERFLOW_EXCEPTION_HANDLER
+ lao r12,ab_stack_size,2
+ ldo r12,r12,ab_stack_size,2
+ add r4,r4,r12
+ 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
+ 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
+ lao r12,stack_p,0
+ sto r4,r12,stack_p,0
+
+ lao r12,ab_stack_size,4
+ ldo r12,r12,ab_stack_size,4
+ add r4,r4,r12
+ subs r4,r4,#64
+ lao r12,end_a_stack,0
+ sto r4,r12,end_a_stack,0
+
+.if SHARE_CHAR_INT
+ lao r6,small_integers,0
+ otoa r6,small_integers,0
+ mov r4,#0
+ laol r3,INT+2,INT_o_2,0
+ otoa r3,INT_o_2,0
+
+make_small_integers_lp:
+ str r3,[r6]
+ str r4,[r6,#4]
+ add r4,r4,#1
+ add r6,r6,#8
+ cmp r4,#33
+ bne make_small_integers_lp
+
+ lao r6,static_characters,0
+ otoa r6,static_characters,0
+ mov r4,#0
+ laol r3,CHAR+2,CHAR_O_2,0
+ otoa r3,CHAR_O_2,0
+
+make_static_characters_lp:
+ str r3,[r6]
+ str r4,[r6,#4]
+ add r4,r4,#1
+ add r6,r6,#8
+ cmp r4,#256
+ bne make_static_characters_lp
+.endif
+
+ 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
+ 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
+
+ lao r12,heap_p1,0
+ sto r10,r12,heap_p1,0
+
+ lao r12,heap_size_129,1
+ ldo r8,r12,heap_size_129,1
+ lsl r8,r8,#4
+ add r4,r10,r8,lsl #2
+ 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
+ lao r12,heap_p2,0
+ sto r4,r12,heap_p2,0
+
+ lao r12,garbage_collect_flag,0
+ mov r11,#0
+ stob r11,r12,garbage_collect_flag,0
+
+ .if MARK_AND_COPY_GC
+ lao r12,flags,1
+ ldo r12,r12,flags,1
+ tst r12,#64
+ beq no_mark1
+ .endif
+
+ .if MARK_GC || COMPACT_GC_ONLY
+ 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
+ and r10,r10,#-64
+ .else
+ add r10,r10,#3
+ and r10,r10,#-4
+ .endif
+ lao r12,heap_p3,0
+ sto r10,r12,heap_p3,0
+ lsl r8,r4,#3
+ lao r12,garbage_collect_flag,1
+ mov r11,#-1
+ stob r11,r12,garbage_collect_flag,1
+ .endif
+
+ .if MARK_AND_COPY_GC
+no_mark1:
+ .endif
+
+ .if ADJUST_HEAP_SIZE
+ lao r4,initial_heap_size,0
+ ldo r4,r4,initial_heap_size,0
+ .if MARK_AND_COPY_GC
+ mov r3,#MINIMUM_HEAP_SIZE_2
+ lao r12,flags,2
+ ldo r12,r12,flags,2
+ tst r12,#64
+ bne no_mark9
+ add r3,r3,r3
+no_mark9:
+ .else
+ .if MARK_GC || COMPACT_GC_ONLY
+ mov r3,#MINIMUM_HEAP_SIZE
+ .else
+ mov r3,#MINIMUM_HEAP_SIZE_2
+ .endif
+ .endif
+
+ cmp r4,r3
+ ble too_large_or_too_small
+ lsr r4,r4,#2
+ cmp r4,r8
+ bge too_large_or_too_small
+ mov r8,r4
+too_large_or_too_small:
+ .endif
+
+ add r4,r10,r8,lsl #2
+ lao r12,heap_end_after_gc,0
+ sto r4,r12,heap_end_after_gc,0
+
+ mov r5,r8
+
+ .if MARK_AND_COPY_GC
+ lao r12,flags,3
+ ldo r12,r12,flags,3
+ tst r12,#64
+ beq no_mark2
+ .endif
+
+ .if MARK_GC && ADJUST_HEAP_SIZE
+ lao r12,bit_vector_size,0
+ sto r8,r12,bit_vector_size,0
+ .endif
+
+ .if MARK_AND_COPY_GC
+no_mark2:
+ .endif
+
+ mov r4,#0
+ ldr pc,[sp],#4
+
+no_memory_2:
+ 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
+.endif
+ mov r0,#1
+ ldr pc,[sp],#4
+
+no_memory_3:
+ 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
+
+ lao r0,heap_mbp,1
+ ldo r0,r0,heap_mbp,1
+ bl free
+
+ mov r0,#1
+ ldr pc,[sp],#4
+
+exit_clean:
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl add_execute_time
+
+ lao r4,flags,4
+ ldo r4,r4,flags,4
+ tst r4,#8
+ beq no_print_execution_time
+
+ lao r0,time_string_1,0
+ otoa r0,time_string_1,0
+ bl ew_print_string
+
+ lao r12,execute_time,0
+ ldo r4,r12,execute_time,0
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl print_time
+
+ lao r0,time_string_2,0
+ otoa r0,time_string_2,0
+ bl ew_print_string
+
+ lao r12,garbage_collect_time,0
+ ldo r4,r12,garbage_collect_time,0
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl print_time
+
+ lao r0,time_string_4,0
+ otoa r0,time_string_4,0
+ bl ew_print_string
+
+ 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
+ lao r12,IO_time,0
+ ldo r12,r12,IO_time,0
+ add r4,r12
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl print_time
+
+ mov r0,#10
+ bl ew_print_char
+
+no_print_execution_time:
+ lao r0,stack_mbp,1
+ ldo r0,r0,stack_mbp,1
+ bl free
+
+ lao r0,heap_mbp,2
+ ldo r0,r0,heap_mbp,2
+ bl free
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl write_profile_information
+.endif
+
+ ldr pc,[sp],#4
+
+__driver:
+ 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:
+@ divide by 1000
+ ldr r12,=274877907
+ umull r11,r6,r12,r4
+ lsr r6,r6,#6
+
+ mov r11,#-1025
+ add r11,r11,#-1000-(-1025)
+ mla r4,r6,r11,r4
+
+@ divide by 10
+ ldr r12,=-858993459
+ umull r11,r4,r12,r4
+ lsr r4,r4,#3
+
+.if USE_CLIB
+ mov r3,r4
+ mov r2,r6
+ 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
+
+ lao r0,sprintf_time_buffer,1
+ otoa r0,sprintf_time_buffer,1
+ bl ew_print_string
+.else
+ mov r0,r6
+ bl ew_print_int
+
+ lao r6,sprintf_time_buffer,0
+ otoa r6,sprintf_time_buffer,0
+
+ eor r7,r7,r7
+ mov r3,#10
+
+ mov r12,#46
+ strb r12,[r6]
+
+@ divide by 10
+ ldr r12,=-858993459
+ umull r11,r0,r12,r4
+ lsr r0,r0,#3
+
+ sub r4,r4,r0,lsl #1
+ sub r4,r4,r0,lsl #3
+
+ add r4,r4,#48
+ add r7,r7,#48
+ strb r0,[r6,#1]
+ strb r4,[r6,#2]
+
+ mov r1,#3
+ mov r0,r6
+ bl ew_print_text
+.endif
+ ldr pc,[sp],#4
+
+print_sc:
+ lao r12,basic_only,1
+ ldo r8,r12,basic_only,1
+ cmp r8,#0
+ bne end_print
+
+print:
+ mov r0,r4
+ bl w_print_string
+
+end_print:
+ ldr pc,[sp],#4
+
+dump:
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl print
+ b halt
+
+printD: tst r4,#2
+ bne printD_
+
+ mov r8,r4
+ b print_string_a2
+
+DtoAC_record:
+ ldr r8,[r4,#-6]
+@.ifdef PIC
+.if 0
+ add r12,r4,#-6
+ add r8,r8,r12
+.endif
+ b DtoAC_string_a2
+
+DtoAC: tst r4,#2
+ bne DtoAC_
+
+ mov r8,r4
+ b DtoAC_string_a2
+
+DtoAC_:
+ ldrh r12,[r4,#-2]
+ cmp r12,#256
+ bhs DtoAC_record
+
+ ldrh r3,[r4]
+ add r12,r4,#10
+ add r8,r12,r3
+
+DtoAC_string_a2:
+ ldr r4,[r8]
+ add r6,r8,#4
+ b build_string
+
+print_symbol:
+ mov r3,#0
+ b print_symbol_2
+
+print_symbol_sc:
+ lao r12,basic_only,2
+ ldo r3,r12,basic_only,2
+print_symbol_2:
+ ldr r4,[r6]
+
+ laol r12,INT+2,INT_o_2,1
+ otoa r12,INT_o_2,1
+ cmp r4,r12
+ beq print_int_node
+
+ laol r12,CHAR+2,CHAR_o_2,0
+ otoa r12,CHAR_o_2,0
+ cmp r4,r12
+ beq print_char_denotation
+
+ laol r12,BOOL+2,BOOL_o_2,0
+ otoa r12,BOOL_o_2,0
+ cmp r4,r12
+ beq print_bool
+
+ laol r12,REAL+2,REAL_o_2,0
+ otoa r12,REAL_o_2,0
+ cmp r4,r12
+ beq print_real_node
+
+ cmp r3,#0
+ bne end_print_symbol
+
+printD_:
+ ldrh r12,[r4,#-2]
+ cmp r12,#256
+ bhs print_record
+
+ ldrh r3,[r4]
+ add r12,r4,#10
+ add r8,r12,r3
+ b print_string_a2
+
+print_record:
+ ldr r8,[r4,#-6]
+@.ifdef PIC
+.if 0
+ add r12,r4,#-6
+ add r8,r8,r12
+.endif
+ b print_string_a2
+
+end_print_symbol:
+ ldr pc,[sp],#4
+
+print_int_node:
+ ldr r0,[r6,#4]
+ bl w_print_int
+ ldr pc,[sp],#4
+
+print_int:
+ mov r0,r4
+ bl w_print_int
+ ldr pc,[sp],#4
+
+print_char_denotation:
+ tst r3,r3
+ bne print_char_node
+
+ ldr r12,[r6,#4]
+ str r12,[sp,#-4]!
+
+ mov r0,#0x27
+ bl w_print_char
+
+ ldr r0,[sp],#4
+ bl w_print_char
+
+ mov r0,#0x27
+ bl w_print_char
+
+ ldr pc,[sp],#4
+
+print_char_node:
+ ldr r0,[r6,#4]
+ bl w_print_char
+ ldr pc,[sp],#4
+
+print_char:
+ str r4,[sp,#-4]!
+ bl w_print_char
+ add sp,sp,#4
+ ldr pc,[sp],#4
+
+print_bool:
+ ldsb r6,[r6,#4]
+ tst r6,r6
+ beq print_false
+
+print_true:
+ lao r0,true_c_string,0
+ otoa r0,true_c_string,0
+ bl w_print_string
+ ldr pc,[sp],#4
+
+print_false:
+ lao r0,false_c_string,0
+ otoa r0,false_c_string,0
+ bl w_print_string
+ ldr pc,[sp],#4
+
+print_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ b print_real_
+print_real_node:
+.ifdef SOFT_FP_CC
+ ldrd r0,r1,[r6,#4]
+.else
+ vldr.f64 d0,[r6,#4]
+.endif
+print_real_:
+ mov r11,sp
+ @bic sp,sp,#7 @ TODO
+ bl w_print_real
+ mov sp,r11
+ ldr pc,[sp],#4
+
+print_string_a2:
+ ldr r1,[r8]
+ add r0,r8,#4
+ bl w_print_text
+ ldr pc,[sp],#4
+
+print__chars__sc:
+ lao r12,basic_only,3
+ ldo r8,r12,basic_only,3
+ cmp r8,#0
+ bne no_print_chars
+
+print__string__:
+ ldr r1,[r6,#4]
+ add r0,r6,#8
+ bl w_print_text
+no_print_chars:
+ ldr pc,[sp],#4
+
+push_a_r_args:
+ str r10,[sp,#-4]!
+
+ ldr r7,[r6,#8]
+ subs r7,r7,#2
+ ldrh r10,[r7]
+ subs r10,r10,#256
+ ldrh r3,[r7,#2]
+ add r7,r7,#4
+ str r7,[sp,#-4]!
+
+ mov r7,r10
+ subs r7,r7,r3
+
+ lsl r4,r4,#2
+ add r12,r6,#12
+ add r6,r12,r3,lsl #2
+ subs r10,r10,#1
+mul_array_size_lp:
+ add r6,r6,r4
+ subs r10,r10,#1
+ bcs mul_array_size_lp
+
+ add r10,r6,r7,lsl #2
+ b push_a_elements
+push_a_elements_lp:
+ ldr r4,[r6,#-4]!
+ str r4,[r9],#4
+push_a_elements:
+ subs r3,r3,#1
+ bcs push_a_elements_lp
+
+ mov r6,r10
+ ldr r4,[sp],#4
+ ldr r10,[sp],#4
+
+ ldr r8,[sp],#4
+ b push_b_elements
+push_b_elements_lp:
+ ldr r12,[r6,#-4]!
+ str r12,[sp,#-4]!
+push_b_elements:
+ subs r7,r7,#1
+ bcs push_b_elements_lp
+
+ mov pc,r8
+
+push_t_r_args:
+ ldr r8,[sp],#4
+
+ ldr r7,[r6]
+ add r6,r6,#4
+ subs r7,r7,#2
+ ldrh r4,[r7]
+ subs r4,r4,#256
+ ldrh r3,[r7,#2]
+ add r7,r7,#4
+
+ str r7,[r9]
+ str r3,[r9,#4]
+
+ sub r3,r4,r3
+
+ add r7,r6,r4,lsl #2
+ cmp r4,#2
+ bls small_record
+ ldr r7,[r6,#4]
+ add r12,r7,#-4
+ add r7,r12,r4,lsl #2
+small_record:
+ b push_r_b_elements
+
+push_r_b_elements_lp:
+ subs r4,r4,#1
+ bne not_first_arg_b
+
+ ldr r12,[r6]
+ str r12,[sp,#-4]!
+ b push_r_b_elements
+not_first_arg_b:
+ ldr r12,[r7,#-4]!
+ str r12,[sp,#-4]!
+push_r_b_elements:
+ subs r3,r3,#1
+ bcs push_r_b_elements_lp
+
+ ldr r3,[r9,#4]
+ str r8,[sp,#-4]!
+ ldr r12,[r9]
+ str r12,[sp,#-4]!
+ b push_r_a_elements
+
+push_r_a_elements_lp:
+ subs r4,r4,#1
+ bne not_first_arg_a
+
+ ldr r8,[r6]
+ str r8,[r9],#4
+ b push_r_a_elements
+not_first_arg_a:
+ ldr r8,[r7,#-4]!
+ str r8,[r9],#4
+push_r_a_elements:
+ subs r3,r3,#1
+ bcs push_r_a_elements_lp
+
+ ldr r4,[sp],#4
+ ldr pc,[sp],#4
+
+BtoAC:
+ tst r4,r4
+ beq BtoAC_false
+BtoAC_true:
+ lao r6,true_string,0
+ otoa r6,true_string,0
+ ldr pc,[sp],#4
+BtoAC_false:
+ lao r6,false_string,0
+ otoa r6,false_string,0
+ ldr pc,[sp],#4
+
+RtoAC:
+.if USE_CLIB
+ vmov r2,r3,d0
+ lao r1,printf_real_string,0
+ lao r0,sprintf_buffer,0
+ otoa r1,printf_real_string,0
+ otoa r0,sprintf_buffer,0
+ mov r4,sp
+ @and sp,sp,#-8 @ TODO
+ bl sprintf
+ mov sp,r4
+.else
+ lao r0,sprintf_buffer,1
+ otoa r0,sprintf_buffer,1
+ bl convert_real_to_string
+.endif
+ b return_sprintf_buffer
+
+ItoAC:
+.if MY_ITOS
+ lao r6,sprintf_buffer,2
+ otoa r6,sprintf_buffer,2
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl int_to_string
+
+ lao r12,sprintf_buffer,3
+ otoa r12,sprintf_buffer,3
+ sub r4,r6,r12
+ b sprintf_buffer_to_string
+
+int_to_string:
+ tst r4,r4
+ bpl no_minus
+ mov r12,#45
+ strb r12,[r6],#1
+ neg r4,r4
+no_minus:
+ add r8,r6,#12
+
+ beq zero_digit
+
+ ldr r2,=0xcccccccd
+
+calculate_digits:
+ cmp r4,#10
+ blo last_digit
+
+ umull r12,r7,r2,r4
+ add r3,r4,#48
+
+ lsr r4,r7,#3
+
+ and r7,r7,#-8
+ sub r3,r3,r7
+ sub r3,r3,r7,lsr #2
+ strb r3,[r8],#1
+ b calculate_digits
+
+last_digit:
+ tst r4,r4
+ beq no_zero
+zero_digit:
+ add r4,r4,#48
+ strb r4,[r8],#1
+no_zero:
+ add r7,r6,#12
+
+reverse_digits:
+ ldrb r3,[r8,#-1]!
+ strb r3,[r6],#1
+ cmp r7,r8
+ bne reverse_digits
+
+ mov r12,#0
+ strb r12,[r6]
+ ldr pc,[sp],#4
+.else
+ mov r2,r4
+ 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
+ lao r0,sprintf_buffer,5
+ otoa r0,sprintf_buffer,5
+ bl strlen
+ mov r4,r0
+.else
+ 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
+
+ lao r12,sprintf_buffer,6
+ otoa r12,sprintf_buffer,6
+ sub r4,r4,r12
+.endif
+
+.if MY_ITOS
+sprintf_buffer_to_string:
+ lao r6,sprintf_buffer,7
+ otoa r6,sprintf_buffer,7
+build_string:
+.endif
+ add r3,r4,#3
+ lsr r3,r3,#2
+ add r3,r3,#2
+
+ subs r5,r5,r3
+ bhs D_to_S_no_gc
+
+ str r6,[sp,#-4]!
+ bl collect_0
+ ldr r6,[sp],#4
+
+D_to_S_no_gc:
+ subs r3,r3,#2
+ mov r8,r10
+ 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
+
+D_to_S_cp_str_1:
+ ldr r4,[r6],#4
+ str r4,[r10],#4
+D_to_S_cp_str_2:
+ subs r3,r3,#1
+ bcs D_to_S_cp_str_1
+
+ mov r6,r8
+ ldr pc,[sp],#4
+
+eqD: ldr r4,[r6]
+ ldr r12,[r7]
+ cmp r4,r12
+ bne eqD_false
+
+ laol r12,INT+2,INT_o_2,2
+ otoa r12,INT_o_2,2
+ cmp r4,r12
+ beq eqD_INT
+ laol r12,CHAR+2,CHAR_o_2,1
+ otoa r12,CHAR_o_2,1
+ cmp r4,r12
+ beq eqD_CHAR
+ laol r12,BOOL+2,BOOL_o_2,1
+ otoa r12,BOOL_o_2,1
+ cmp r4,r12
+ beq eqD_BOOL
+ laol r12,REAL+2,REAL_o_2,1
+ otoa r12,REAL_o_2,1
+ cmp r4,r12
+ beq eqD_REAL
+
+ mov r4,#1
+ ldr pc,[sp],#4
+
+eqD_CHAR:
+eqD_INT:
+ ldr r3,[r6,#4]
+ mov r4,#0
+ ldr r12,[r7,#4]
+ cmp r3,r12
+ it eq
+ moveq r4,#1
+ ldr pc,[sp],#4
+
+eqD_BOOL:
+ ldrb r3,[r6,#4]
+ mov r4,#0
+ ldrb r12,[r7,#4]
+ cmp r3,r12
+ it eq
+ moveq r4,#1
+ ldr pc,[sp],#4
+
+eqD_REAL:
+ vldr.f64 d0,[r6,#4]
+ vldr.f64 d1,[r7,#4]
+ mov r4,#0
+ vcmp.f64 d1,d0
+ vmrs APSR_nzcv,fpscr
+ it eq
+ moveq r4,#1
+ ldr pc,[sp],#4
+
+eqD_false:
+ mov r4,#0
+ ldr pc,[sp],#4
+@
+@ the timer
+@
+
+init_timer:
+ sub sp,sp,#20
+ mov r0,sp
+ bl times
+ ldr r4,[sp]
+ add r4,r4,r4
+ add r4,r4,r4,lsl #2
+ add sp,sp,#20
+
+ lao r12,last_time,0
+ sto r4,r12,last_time,0
+ eor r4,r4,r4
+ 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
+
+get_time_diff:
+ sub sp,sp,#20
+ mov r0,sp
+ bl times
+ ldr r4,[sp]
+ add r4,r4,r4
+ add r4,r4,r4,lsl #2
+ add sp,sp,#20
+
+ lao r6,last_time,1
+ otoa r6,last_time,1
+ ldr r7,[r6]
+ str r4,[r6]
+ subs r4,r4,r7
+ ldr pc,[sp],#4
+
+add_execute_time:
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl get_time_diff
+ lao r6,execute_time,3
+ otoa r6,execute_time,3
+
+add_time:
+ ldr r12,[r6]
+ add r4,r4,r12
+ str r4,[r6]
+ ldr pc,[sp],#4
+
+add_garbage_collect_time:
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl get_time_diff
+ lao r6,garbage_collect_time,3
+ otoa r6,garbage_collect_time,3
+ b add_time
+
+add_IO_time:
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl get_time_diff
+ 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
+@
+
+collect_3:
+ str lr,[sp,#-4]!
+.ifdef PROFILE
+ lao r8,garbage_collector_name,0
+ otoa r8,garbage_collector_name,0
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_s
+.endif
+ str r6,[r9]
+ str r7,[r9,#4]
+ str r8,[r9,#8]
+ add r9,r9,#12
+ bl collect_0_
+ ldr r8,[r9,#-4]
+ ldr r7,[r9,#-8]
+ ldr r6,[r9,#-12]!
+.ifdef PROFILE
+ b profile_r
+.else
+ ldr pc,[sp],#4
+.endif
+
+collect_2:
+ str lr,[sp,#-4]!
+.ifdef PROFILE
+ lao r8,garbage_collector_name,1
+ otoa r8,garbage_collector_name,1
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_s
+.endif
+ str r6,[r9]
+ str r7,[r9,#4]
+ add r9,r9,#8
+ bl collect_0_
+ ldr r7,[r9,#-4]
+ ldr r6,[r9,#-8]!
+.ifdef PROFILE
+ b profile_r
+.else
+ ldr pc,[sp],#4
+.endif
+
+collect_1:
+ str lr,[sp,#-4]!
+.ifdef PROFILE
+ lao r8,garbage_collector_name,2
+ otoa r8,garbage_collector_name,2
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_s
+.endif
+ str r6,[r9],#4
+ bl collect_0_
+ ldr r6,[r9,#-4]!
+.ifdef PROFILE
+ b profile_r
+.else
+ ldr pc,[sp],#4
+.endif
+
+.ifdef PROFILE
+collect_0:
+ str lr,[sp,#-4]!
+ lao r8,garbage_collector_name,3
+ otoa r8,garbage_collector_name,3
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_s
+ bl collect_0_
+ b profile_r
+.endif
+
+.ifndef PROFILE
+collect_0:
+.endif
+collect_0_:
+ stmdb sp!,{r0-r4,lr}
+
+ 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
+ lao r12,n_allocated_words,0
+ sto r8,r12,n_allocated_words,0
+
+.if MARK_AND_COPY_GC
+ lao r12,flags,6
+ ldo r12,r12,flags,6
+ tst r12,#64
+ beq no_mark3
+.endif
+
+.if MARK_GC
+ lao r12,bit_counter,0
+ ldo r8,r12,bit_counter,0
+ cmp r8,#0
+ beq no_scan
+
+ mov r3,#0
+ str r9,[sp,#-4]!
+
+ 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]
+ cmp r3,r12
+ beq zero_bits
+ str r3,[r6],#4
+ subs r8,r8,#1
+ bne scan_bits
+
+ b end_scan
+
+zero_bits:
+ add r7,r6,#4
+ add r6,r6,#4
+ subs r8,r8,#1
+ bne skip_zero_bits_lp1
+ b end_bits
+
+skip_zero_bits_lp:
+ cmp r4,#0
+ bne end_zero_bits
+skip_zero_bits_lp1:
+ ldr r4,[r6],#4
+ subs r8,r8,#1
+ bne skip_zero_bits_lp
+
+ cmp r4,#0
+ beq end_bits
+ str r3,[r6,#-4]
+ subs r4,r6,r7
+ b end_bits2
+
+end_zero_bits:
+ sub r4,r6,r7
+ lsl r4,r4,#3
+ str r3,[r6,#-4]
+ add r2,r2,r4
+
+ cmp r4,r9
+ blo scan_bits
+
+found_free_memory:
+ 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
+ lao r12,heap_vector,1
+ ldo r12,r12,heap_vector,1
+ subs r8,r8,r12
+ lsl r8,r8,#5
+ lao r12,heap_p3,1
+ ldo r10,r12,heap_p3,1
+ add r10,r10,r8
+
+ add r8,r10,r4,lsl #2
+ lao r12,heap_end_after_gc,2
+ sto r8,r12,heap_end_after_gc,2
+
+ ldr r9,[sp],#4
+
+ ldmia sp!,{r0-r4,pc}
+
+end_bits:
+ sub r4,r6,r7
+ add r4,r4,#4
+end_bits2:
+ lsl r4,r4,#3
+ add r2,r2,r4
+ cmp r4,r9
+ bhs found_free_memory
+
+end_scan:
+ ldr r9,[sp],#4
+ 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
+
+@ to do: check value in r8
+
+.if MARK_AND_COPY_GC
+no_mark3:
+.endif
+
+ 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
+ stob r4,r12,garbage_collect_flag,3
+
+ lao r12,extra_heap_size,0
+ ldo r3,r12,extra_heap_size,0
+ cmp r8,r3
+ bhi collect
+
+ sub r5,r3,r8
+
+ lao r12,extra_heap,0
+ ldo r10,r12,extra_heap,0
+ add r3,r10,r3,lsl #2
+ lao r12,heap_end_after_gc,3
+ sto r3,r12,heap_end_after_gc,3
+
+ ldmia sp!,{r0-r4,pc}
+
+collect:
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl add_execute_time
+
+ lao r12,flags,7
+ ldo r12,r12,flags,7
+ tst r12,#4
+ beq no_print_stack_sizes
+
+ lao r0,garbage_collect_string_1,0
+ otoa r0,garbage_collect_string_1,0
+ bl ew_print_string
+
+ mov r4,r9
+ lao r12,stack_p,1
+ ldo r12,r12,stack_p,1
+ sub r0,r4,r12
+ bl ew_print_int
+
+ lao r0,garbage_collect_string_2,0
+ otoa r0,garbage_collect_string_2,0
+ bl ew_print_string
+
+ lao r12,halt_sp,2
+ ldo r4,r12,halt_sp,2
+ sub r0,r4,sp
+ bl ew_print_int
+
+ lao r0,garbage_collect_string_3,0
+ otoa r0,garbage_collect_string_3,0
+ bl ew_print_string
+
+no_print_stack_sizes:
+ 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
+ lao r12,flags,8
+ ldo r12,r12,flags,8
+ tst r12,#64
+ bne compacting_collector
+.else
+ .if MARK_GC
+ b compacting_collector
+ .endif
+.endif
+
+.if MARK_AND_COPY_GC || !MARK_GC
+ lao r12,garbage_collect_flag,4
+ ldosb r12,r12,garbage_collect_flag,4
+ cmp r12,#0
+ bne compacting_collector
+
+ lao r12,heap_copied_vector,1
+ ldo r8,r12,heap_copied_vector,1
+
+ 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
+ lao r12,heap_p1,1
+ ldo r12,r12,heap_p1,1
+ subs r4,r4,r12
+ add r4,r4,#63*4
+ lsr r4,r4,#8
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl zero_bit_vector
+
+ 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
+
+ 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
+
+ lao r12,heap_end_after_copy_gc,3
+ mov r14,#0
+ sto r14,r12,heap_end_after_copy_gc,3
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl zero_bit_vector
+ b end_zero_bit_vector
+
+zero_all:
+ lao r12,heap_copied_vector_size,3
+ ldo r4,r12,heap_copied_vector_size,3
+ lsr r4,r4,#2
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl zero_bit_vector
+
+end_zero_bit_vector:
+
+ .include "thumb2copy.s"
+
+.if WRITE_HEAP
+ lao r12,heap2_begin_and_end,0
+ sto r9,r12,heap2_begin_and_end,0
+.endif
+
+ sub r8,r9,r10
+ lsr r8,r8,#2
+
+ ldr r9,[sp],#4
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl add_garbage_collect_time
+
+ 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
+ lao r3,heap_size,4
+ ldo r3,r3,heap_size,4
+ mov r6,r3
+ lsl r3,r3,#2
+ add r3,r3,r6
+ add r3,r3,r3
+ add r3,r3,r6
+ cmp r4,r3
+ bhs no_mark_scan
+@ b no_mark_scan
+
+switch_to_mark_scan:
+ lao r12,heap_size_33,2
+ ldo r4,r12,heap_size_33,2
+ lsl r4,r4,#5
+ lao r12,heap_p,1
+ ldo r3,r12,heap_p,1
+
+ 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:
+ lao r12,heap_p3,2
+ sto r3,r12,heap_p3,2
+ add r3,r3,r4
+ lao r12,heap_vector,2
+ sto r3,r12,heap_vector,2
+
+ 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
+ lao r12,extra_heap_size,1
+ sto r3,r12,extra_heap_size,1
+ b switch_to_mark_scan_2
+
+vector_at_begin:
+ 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
+ lao r12,heap_p3,3
+ sto r3,r12,heap_p3,3
+
+ 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
+ lao r12,extra_heap_size,2
+ sto r6,r12,extra_heap_size,2
+
+switch_to_mark_scan_2:
+ lao r4,heap_size,6
+ ldo r4,r4,heap_size,6
+ lsr r4,r4,#3
+ sub r4,r4,r8
+ lsl r4,r4,#2
+
+ lao r12,garbage_collect_flag,5
+ mov r11,#1
+ stob r11,r12,garbage_collect_flag,5
+
+ cmp r8,#0
+ bpl end_garbage_collect
+
+ mov r11,#-1
+ strb r11,[r12]
+
+ lao r12,extra_heap_size,3
+ ldo r3,r12,extra_heap_size,3
+ mov r4,r3
+ lao r12,n_allocated_words,3
+ ldo r12,r12,n_allocated_words,3
+ subs r4,r4,r12
+ bmi out_of_memory_4
+
+ lao r12,extra_heap,3
+ ldo r10,r12,extra_heap,3
+ lsl r3,r3,#2
+ add r3,r3,r10
+ lao r12,heap_end_after_gc,4
+ sto r3,r12,heap_end_after_gc,4
+.if 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
+ 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
+ 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
+ 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
+ and r6,r6,#-4096
+ subs r6,r6,r3
+ bls no_pages
+ str r4,[sp,#-4]!
+
+ str r6,[sp,#-4]!
+ str r3,[sp,#-4]!
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _munmap
+ add sp,sp,#8
+
+ ldr r4,[sp],#4
+no_pages:
+ .endif
+
+ .if ADJUST_HEAP_SIZE
+ mov r3,r4
+ .endif
+ subs r4,r4,r8
+
+ .if ADJUST_HEAP_SIZE
+ mov r6,r4
+ 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
+ lsrs r7,r7,#9
+ bne no_small_heap1
+
+ cmp r4,#MINIMUM_HEAP_SIZE_2
+ bhs not_too_small1
+ mov r4,#MINIMUM_HEAP_SIZE_2
+not_too_small1:
+ subs r3,r3,r4
+ blo no_small_heap1
+
+ sub r5,r5,r3
+ lsl r3,r3,#2
+ 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
+ lao r12,heap_end_after_gc,6
+ sto r8,r12,heap_end_after_gc,6
+
+no_small_heap1:
+ mov r4,r6
+ .endif
+
+ lsl r4,r4,#2
+.endif
+
+end_garbage_collect:
+.if 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
+ sto r11,r12,d3_flag_write_heap,1
+end_garbage_collect_:
+.endif
+
+ str r4,[sp,#-4]!
+
+ lao r12,flags,9
+ ldo r12,r12,flags,9
+ tst r12,#2
+ beq no_heap_use_message
+
+ str r4,[sp,#-4]!
+
+ 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
+
+ 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:
+
+.if FINALIZERS
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl call_finalizers
+.endif
+
+ ldr r4,[sp],#4
+
+.if WRITE_HEAP
+ @ Check whether memory profiling is on or off
+ lao r12,flags,10
+ ldo r12,r12,flags,10
+ tst r12,#32
+ beq no_write_heap
+
+ lao r12,min_write_heap_size,0
+ ldo r12,r12,min_write_heap_size,0
+ cmp r4,r12
+ blo no_write_heap
+
+ str r6,[sp,#-4]!
+ str r7,[sp,#-4]!
+ str r8,[sp,#-4]!
+ str r9,[sp,#-4]!
+ str r10,[sp,#-4]!
+
+ subs sp,sp,#64
+
+ 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
+
+ lao r4,garbage_collect_flag,6
+ ldosb r4,r4,garbage_collect_flag,6
+
+ 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
+
+ lao r3,heap_p1,7
+ otoa r3,heap_p1,7
+
+ tst r4,r4
+ beq gc0
+
+ lao r3,heap_p2,6
+ otoa r3,heap_p2,6
+ bgt gc1
+
+ lao r3,heap_p3,4
+ otoa r3,heap_p3,4
+ mov r6,#0
+ mov r7,#0
+
+gc0:
+gc1:
+ ldr r3,[r3]
+
+? /* fill record */
+
+ mov r4,sp
+
+ str r3,[r4,#0]
+? movl a4,4(d0) // klop dit?
+
+? movl a0,8(d0) // heap2_begin
+? movl a1,12(d0) // heap2_end
+
+ lao r12,stack_p,3
+ ldo r3,r12,stack_p,3
+? movl d1,16(d0) // stack_begin
+
+? movl a3,20(d0) // stack_end
+? movl $0,24(d0) // text_begin
+? movl $0,28(d0) // data_begin
+
+? movl $small_integers,32(d0) // small_integers
+? movl $static_characters,36(d0) // small_characters
+
+? movl $INT+2,40(d0) // INT-descP
+? movl $CHAR+2,44(d0) // CHAR-descP
+? movl $REAL+2,48(d0) // REAL-descP
+? movl $BOOL+2,52(d0) // BOOL-descP
+? movl $__STRING__+2,56(d0) // STRING-descP
+? movl $__ARRAY__+2,60(d0) // ARRAY-descP
+
+ str r4,[sp,#-4]!
+ bl write_heap
+
+ add sp,sp,#68
+
+ ldr r10,[sp],#4
+ ldr r9,[sp],#4
+ ldr r8,[sp],#4
+ ldr r7,[sp],#4
+ ldr r6,[sp],#4
+no_write_heap:
+
+.endif
+
+ 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:
+ lao r12,free_finalizer_list,1
+ ldo r4,r12,free_finalizer_list,1
+
+call_finalizers_lp:
+ 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]
+ str r12,[sp,#-4]!
+ ldr r3,[r4,#8]
+ ldr r12,[r3,#4]
+ str r12,[sp,#-4]!
+ ldr r12,[r3]
+ blx r12
+ add sp,sp,#4
+ ldr r4,[sp],#4
+ b call_finalizers_lp
+end_call_finalizers:
+ 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:
+ 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
+
+out_of_memory_4:
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl add_garbage_collect_time
+
+ lao r8,out_of_memory_string_4,0
+ otoa r8,out_of_memory_string_4,0
+ b print_error
+
+zero_bit_vector:
+ eor r7,r7,r7
+ tst r4,#1
+ beq zero_bits1_1
+ str r7,[r8]
+ add r8,r8,#4
+zero_bits1_1:
+ lsr r4,r4,#1
+
+ mov r3,r4
+ lsr r4,r4,#1
+ tst r3,#1
+ beq zero_bits1_5
+
+ subs r8,r8,#8
+ b zero_bits1_2
+
+zero_bits1_4:
+ str r7,[r8]
+ str r7,[r8,#4]
+zero_bits1_2:
+ str r7,[r8,#8]
+ str r7,[r8,#12]
+ add r8,r8,#16
+zero_bits1_5:
+ subs r4,r4,#1
+ bhs zero_bits1_4
+ ldr pc,[sp],#4
+
+reorder:
+ str r9,[sp,#-4]!
+ str r8,[sp,#-4]!
+
+ mov r8,r4
+ lsl r8,r8,#2
+ mov r9,r3
+ lsl r9,r9,#2
+ add r6,r6,r9
+ subs r7,r7,r8
+
+ str r9,[sp,#-4]!
+ str r8,[sp,#-4]!
+ str r3,[sp,#-4]!
+ str r4,[sp,#-4]!
+ b st_reorder_lp
+
+reorder_lp:
+ ldr r8,[r6]
+ ldr r9,[r7,#-4]
+ str r8,[r7,#-4]
+ subs r7,r7,#4
+ str r9,[r6]
+ add r6,r6,#4
+
+ subs r4,r4,#1
+ bne next_b_in_element
+ ldr r4,[sp]
+ ldr r12,[sp,#12]
+ add r6,r6,r12
+next_b_in_element:
+ subs r3,r3,#1
+ bne next_a_in_element
+ ldr r3,[sp,#4]
+ ldr r12,[sp,#8]
+ subs r7,r7,r12
+next_a_in_element:
+st_reorder_lp:
+ cmp r7,r6
+ bhi reorder_lp
+
+ ldr r4,[sp],#4
+ ldr r3,[sp],#4
+ add sp,sp,#8
+ ldr r8,[sp],#4
+ ldr r9,[sp],#4
+ ldr pc,[sp],#4
+
+@
+@ the sliding compacting garbage collector
+@
+
+compacting_collector:
+@ zero all mark bits
+
+ lao r12,stack_top,0
+ sto r9,r12,stack_top,0
+
+ lao r12,heap_vector,4
+ ldo r10,r12,heap_vector,4
+
+.if MARK_GC
+ .if MARK_AND_COPY_GC
+ lao r12,flags,11
+ ldo r12,r12,flags,11
+ tst r12,#64
+ beq no_mark4
+ .endif
+ lao r12,zero_bits_before_mark,0
+ otoa r12,zero_bits_before_mark,0
+ ldr r11,[r12]
+ cmp r11,#0
+ beq no_zero_bits
+
+ mov r11,#0
+ str r11,[r12]
+
+ .if MARK_AND_COPY_GC
+no_mark4:
+ .endif
+.endif
+
+ mov r8,r10
+ lao r12,heap_size_33,3
+ ldo r4,r12,heap_size_33,3
+ add r4,r4,#3
+ lsr r4,r4,#2
+
+ mov r3,#0
+
+ tst r4,#1
+ beq zero_bits_1
+ str r3,[r8],#4
+zero_bits_1:
+ mov r6,r4
+ lsr r4,r4,#2
+
+ tst r6,#2
+ beq zero_bits_5
+
+ subs r8,r8,#8
+ b zero_bits_2
+
+zero_bits_4:
+ str r3,[r8]
+ str r3,[r8,#4]
+zero_bits_2:
+ str r3,[r8,#8]
+ str r3,[r8,#12]
+ add r8,r8,#16
+zero_bits_5:
+ subs r4,r4,#1
+ bcs zero_bits_4
+
+.if MARK_GC
+ .if MARK_AND_COPY_GC
+ lao r12,flags,12
+ ldo r12,r12,flags,12
+ tst r12,#64
+ beq no_mark5
+ .endif
+no_zero_bits:
+ 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
+.else
+ lsl r3,r3,#2
+.endif
+
+ add r8,r3,r3,lsl #3
+ lsr r8,r8,#2
+
+ cmp r4,r8
+ bgt compact_gc
+
+ .if ADJUST_HEAP_SIZE
+ lao r12,bit_vector_size,1
+ ldo r3,r12,bit_vector_size,1
+ lsl r3,r3,#2
+
+ sub r4,r3,r4
+
+ 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
+ lsrs r7,r7,#7
+ bne no_smaller_heap
+
+ cmp r4,r3
+ bhs no_smaller_heap
+
+ cmp r3,#MINIMUM_HEAP_SIZE
+ bls no_smaller_heap
+
+ b compact_gc
+no_smaller_heap:
+ .endif
+
+ .include "thumb2mark.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:
+ lao r12,zero_bits_before_mark,1
+ mov r11,#1
+ sto r11,r12,zero_bits_before_mark,1
+ lao r12,n_last_heap_free_bytes,1
+ mov r11,#0
+ sto r11,r12,n_last_heap_free_bytes,1
+ lao r12,n_free_words_after_mark,4
+ mov r11,#1000
+ sto r11,r12,n_free_words_after_mark,4
+ .if MARK_AND_COPY_GC
+no_mark5:
+ .endif
+.endif
+
+ .include "thumb2compact.s"
+
+ lao r12,stack_top,1
+ ldo r9,r12,stack_top,1
+
+ lao r12,heap_size_33,4
+ ldo r3,r12,heap_size_33,4
+ lsl r3,r3,#5
+ lao r12,heap_p3,5
+ ldo r12,r12,heap_p3,5
+ add r3,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
+
+ 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
+
+ ldr r12,=107374182
+ cmp r3,r12
+ bhs not_out_of_memory
+ add r4,r3,r3,lsl #2
+ lsl r4,r4,#3
+ lao r12,heap_size,7
+ ldo r12,r12,heap_size,7
+ cmp r4,r12
+ bcc out_of_memory_4
+not_out_of_memory:
+
+.if MARK_GC || COMPACT_GC_ONLY
+ .if MARK_GC && ADJUST_HEAP_SIZE
+ .if MARK_AND_COPY_GC
+ lao r12,flags,13
+ ldo r12,r12,flags,13
+ tst r12,#64
+ beq no_mark_6
+ .endif
+
+ lao r12,heap_p3,6
+ ldo r4,r12,heap_p3,6
+ sub r4,r10,r4
+ lao r12,n_allocated_words,5
+ ldo r3,r12,n_allocated_words,5
+ add r4,r4,r3,lsl #2
+
+ lao r12,heap_size_33,5
+ ldo r3,r12,heap_size_33,5
+ lsl r3,r3,#5
+
+ 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
+ lsrs r7,r7,#8
+ bne no_small_heap2
+
+ and r4,r4,#-4
+
+ cmp r4,#MINIMUM_HEAP_SIZE
+ bhs not_too_small2
+ mov r4,#MINIMUM_HEAP_SIZE
+not_too_small2:
+ mov r6,r3
+ subs r6,r6,r4
+ blo no_small_heap2
+
+ lao r12,heap_end_after_gc,8
+ otoa r12,heap_end_after_gc,8
+ ldr r11,[r12]
+ sub r11,r11,r6
+ str r11,[r12]
+
+ sub r5,r5,r6,lsr #2
+
+ mov r3,r4
+
+no_small_heap2:
+ lsr r3,r3,#2
+ lao r12,bit_vector_size,2
+ sto r3,r12,bit_vector_size,2
+
+ .if MARK_AND_COPY_GC
+no_mark_6:
+ .endif
+ .endif
+ b no_copy_garbage_collection
+.else
+@ to do prevent overflow
+ lsl r4,r4,#2
+ 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
+
+ lao r12,heap_p,2
+ ldo r4,r12,heap_p,2
+ lao r12,heap_p1,8
+ sto r4,r12,heap_p1,8
+
+ lao r12,heap_size_129,3
+ lto r3,r12,heap_size_129,3
+ lsl r3,r3,#6
+ add r4,r4,r3
+ 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
+ lao r12,heap_p2,8
+ sto r3,r12,heap_p2,8
+
+ 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
+
+ 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
+ lao r12,extra_heap_size,4
+ sto r4,r12,extra_heap_size,4
+
+ lao r12,garbage_collect_flag,7
+ mov r11,#2
+ stob r11,r12,garbage_collect_flag,7
+ b no_copy_garbage_collection
+
+vector_at_end_2:
+ lao r12,garbage_collect_flag,8
+ mov r11,#0
+ stob r11,r12,garbage_collect_flag,8
+.endif
+
+no_copy_garbage_collection:
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl add_garbage_collect_time
+
+ mov r4,r10
+ lao r12,heap_p3,8
+ ldo r12,r12,heap_p3,8
+ subs r4,r4,r12
+ lao r12,n_allocated_words,6
+ ldo r3,r12,n_allocated_words,6
+ add r4,r4,r3,lsl #2
+ b end_garbage_collect
+
+stack_overflow:
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl add_execute_time
+
+ lao r8,stack_overflow_string,0
+ otoa r8,stack_overflow_string,0
+ b print_error
+
+IO_error:
+ str r0,[sp]
+
+ lao r0,IO_error_string,0
+ otoa r0,IO_error_string,0
+ bl ew_print_string
+
+ ldr r0,[sp],#4
+ bl ew_print_string
+
+ lao r0,new_line_string,0
+ otoa r0,new_line_string,0
+ bl ew_print_string
+
+ b halt
+
+print_error:
+ mov r0,r8
+ bl ew_print_string
+
+halt:
+ lao r12,halt_sp,3
+ ldo sp,r12,halt_sp,3
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl write_profile_stack
+.endif
+
+ 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:
+eval_fill:
+ str r6,[r9],#4
+ mov r6,r7
+ ldr r12,[r7]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r12
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ ldr r8,[r7]
+ str r8,[r6]
+ ldr r8,[r7,#4]
+ str r8,[r6,#4]
+ ldr r8,[r7,#8]
+ str r8,[r6,#8]
+ ldr pc,[sp],#4
+
+ .p2align 2
+ b e__system__eaind
+ nop
+ nop
+.ifdef PIC
+ .long e__system__dind-.
+.else
+ .long e__system__dind
+.endif
+ .long -2
+e__system__nind:
+__indirection:
+ ldr r7,[r6,#4]
+ ldr r4,[r7]
+ tst r4,#2
+.if MARK_GC
+ beq eval_fill2
+.else
+ beq __cycle__in__spine
+.endif
+ str r4,[r6]
+ ldr r8,[r7,#4]
+ str r8,[r6,#4]
+ ldr r8,[r7,#8]
+ str r8,[r6,#8]
+ ldr pc,[sp],#4
+
+.if MARK_GC
+eval_fill2:
+ lao r12,__cycle__in__spine,0
+ otoa r12,__cycle__in__spine,0
+ str r12,[r6]
+ str r6,[r9]
+ .if MARK_AND_COPY_GC
+ lao r12,flags,14
+ ldo r12,r12,flags,14
+ tst r12,#64
+ beq __cycle__in__spine
+ .endif
+ add r9,r9,#4
+ mov r6,r7
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ blx r4
+ mov r7,r6
+ ldr r6,[r9,#-4]!
+
+ ldr r8,[r7]
+ str r8,[r6]
+ ldr r8,[r7,#4]
+ str r8,[r6,#4]
+ ldr r8,[r7,#8]
+ str r8,[r6,#8]
+ ldr pc,[sp],#4
+.endif
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_0:
+ lao r12,e__system__nind,0
+ otoa r12,e__system__nind,0
+ str r12,[r7]
+ str r6,[r7,#4]
+ mov pc,r11
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_1:
+ lao r12,e__system__nind,1
+ otoa r12,e__system__nind,1
+ str r12,[r7]
+ ldr r4,[r7,#4]
+ str r6,[r7,#4]
+ mov r7,r4
+ mov pc,r11
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_2:
+ lao r12,e__system__nind,2
+ otoa r12,e__system__nind,2
+ str r12,[r7]
+ ldr r8,[r7,#4]
+ str r6,[r7,#4]
+ ldr r7,[r7,#8]
+ mov pc,r11
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_3:
+ lao r12,e__system__nind,3
+ otoa r12,e__system__nind,3
+ str r12,[r7]
+ ldr r8,[r7,#4]
+ str r6,[r7,#4]
+ str r6,[r9],#4
+ ldr r6,[r7,#12]
+ ldr r7,[r7,#8]
+ mov pc,r11
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_4:
+ lao r12,e__system__nind,4
+ otoa r12,e__system__nind,4
+ str r12,[r7]
+ ldr r8,[r7,#4]
+ str r6,[r7,#4]
+ str r6,[r9]
+ ldr r3,[r7,#16]
+ str r3,[r9,#4]
+ add r9,r9,#8
+ ldr r6,[r7,#12]
+ ldr r7,[r7,#8]
+ mov pc,r11
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_5:
+ lao r12,e__system__nind,5
+ otoa r12,e__system__nind,5
+ str r12,[r7]
+ ldr r8,[r7,#4]
+ str r6,[r9]
+ str r6,[r7,#4]
+ ldr r3,[r7,#20]
+ str r3,[r9,#4]
+ ldr r3,[r7,#16]
+ str r3,[r9,#8]
+ add r9,r9,#12
+ ldr r6,[r7,#12]
+ ldr r7,[r7,#8]
+ mov pc,r11
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_6:
+ lao r12,e__system__nind,6
+ otoa r12,e__system__nind,6
+ str r12,[r7]
+ ldr r8,[r7,#4]
+ str r6,[r9]
+ str r6,[r7,#4]
+ ldr r3,[r7,#24]
+ str r3,[r9,#4]
+ ldr r3,[r7,#20]
+ str r3,[r9,#8]
+ ldr r3,[r7,#16]
+ str r3,[r9,#12]
+ add r9,r9,#16
+ ldr r6,[r7,#12]
+ ldr r7,[r7,#8]
+ mov pc,r11
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_7:
+ mov r4,#0
+ mov r3,#20
+eval_upd_n:
+ lao r12,e__system__nind,7
+ otoa r12,e__system__nind,7
+ add r2,r7,r3
+ str r12,[r7]
+ ldr r8,[r7,#4]
+ str r6,[r9]
+ str r6,[r7,#4]
+ ldr r3,[r2,#8]
+ str r3,[r9,#4]
+ ldr r3,[r2,#4]
+ str r3,[r9,#8]
+ ldr r3,[r2]
+ str r3,[r9,#12]
+ add r9,r9,#16
+
+eval_upd_n_lp:
+ ldr r3,[r2,#-4]!
+ str r3,[r9],#4
+ subs r4,r4,#1
+ bcs eval_upd_n_lp
+
+ ldr r6,[r7,#12]
+ ldr r7,[r7,#8]
+ mov pc,r11
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_8:
+ mov r4,#1
+ mov r3,#24
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_9:
+ mov r4,#2
+ mov r3,#28
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_10:
+ mov r4,#3
+ mov r3,#32
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_11:
+ mov r4,#4
+ mov r3,#36
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_12:
+ mov r4,#5
+ mov r3,#40
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_13:
+ mov r4,#6
+ mov r3,#44
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_14:
+ mov r4,#7
+ mov r3,#48
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_15:
+ mov r4,#8
+ mov r3,#52
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_16:
+ mov r4,#9
+ mov r3,#56
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_17:
+ mov r4,#10
+ mov r3,#60
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_18:
+ mov r4,#11
+ mov r3,#64
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_19:
+ mov r4,#12
+ mov r3,#68
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_20:
+ mov r4,#13
+ mov r3,#72
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_21:
+ mov r4,#14
+ mov r3,#76
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_22:
+ mov r4,#15
+ mov r3,#80
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_23:
+ mov r4,#16
+ mov r3,#84
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_24:
+ mov r4,#17
+ mov r3,#88
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_25:
+ mov r4,#18
+ mov r3,#92
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_26:
+ mov r4,#19
+ mov r3,#96
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_27:
+ mov r4,#20
+ mov r3,#100
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_28:
+ mov r4,#21
+ mov r3,#104
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_29:
+ mov r4,#22
+ mov r3,#108
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_30:
+ mov r4,#23
+ mov r3,#112
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_31:
+ mov r4,#24
+ mov r3,#116
+ b eval_upd_n
+
+.ifdef PROFILE
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl profile_n
+ mov r8,r4
+.endif
+eval_upd_32:
+ mov r4,#25
+ mov r3,#120
+ b eval_upd_n
+
+@
+@ STRINGS
+@
+ .section .text. (catAC)
+catAC:
+ ldr r4,[r6,#4]
+ ldr r3,[r7,#4]
+ add r8,r4,r3
+ add r8,r8,#8+3
+ lsr r8,r8,#2
+
+ subs r5,r5,r8
+ blo gc_3
+gc_r_3:
+ add r6,r6,#8
+ add r7,r7,#8
+
+@ fill_node
+
+ str r10,[sp,#-4]!
+ laol r12,__STRING__+2,__STRING___o_2,1
+ otoa r12,__STRING___o_2,1
+ str r12,[r10]
+
+@ store length
+
+ add r8,r4,r3
+ str r8,[r10,#4]
+ add r10,r10,#8
+
+@ copy string 1
+
+ add r8,r3,#3
+ add r3,r3,r10
+ lsrs r8,r8,#2
+ beq catAC_after_copy_lp1
+
+catAC_copy_lp1:
+ ldr r12,[r7],#4
+ str r12,[r10],#4
+ subs r8,r8,#1
+ bne catAC_copy_lp1
+
+catAC_after_copy_lp1:
+ mov r10,r3
+
+@ copy_string 2
+
+cat_string_6:
+ lsrs r8,r4,#2
+ beq cat_string_9
+
+cat_string_7:
+ ldr r3,[r6],#4
+@ store not aligned
+ str r3,[r10],#4
+ subs r8,r8,#1
+ bne cat_string_7
+
+cat_string_9:
+ tst r4,#2
+ beq cat_string_10
+ ldrh r3,[r6],#2
+ strh r3,[r10],#2
+cat_string_10:
+ tst r4,#1
+ beq cat_string_11
+ ldrb r3,[r6]
+ strb r3,[r10],#1
+cat_string_11:
+
+ ldr r6,[sp],#4
+@ align heap pointer
+ add r10,r10,#3
+ and r10,r10,#-4
+ ldr pc,[sp],#4
+
+gc_3: bl collect_2
+ b gc_r_3
+
+empty_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]
+ tst r3,r3
+ bpl slice_string_1
+ mov r3,#0
+slice_string_1:
+ cmp r3,r8
+ bge empty_string
+ cmp r4,r3
+ blt empty_string
+ add r4,r4,#1
+ cmp r4,r8
+ ble slice_string_2
+ mov r4,r8
+slice_string_2:
+ subs r4,r4,r3
+
+ add r8,r4,#8+3
+ lsr r8,r8,#2
+
+ subs r5,r5,r8
+ blo gc_4
+r_gc_4:
+ subs r8,r8,#2
+ add r12,r6,#8
+ add r7,r12,r3
+
+ laol r12,__STRING__+2,__STRING___o_2,2
+ otoa r12,__STRING___o_2,2
+ str r12,[r10]
+ str r4,[r10,#4]
+
+@ copy part of string
+ mov r6,r10
+ add r10,r10,#8
+
+ cmp r8,#0
+ beq sliceAC_after_copy_lp
+
+sliceAC_copy_lp:
+@ load not aligned
+ ldr r12,[r7],#4
+ str r12,[r10],#4
+ subs r8,r8,#1
+ bne sliceAC_copy_lp
+
+sliceAC_after_copy_lp:
+ ldr pc,[sp],#4
+
+gc_4:
+ bl collect_1
+ add r8,r4,#8+3
+ 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]
+ cmp r3,r8
+ bhs update_string_error
+
+ add r8,r8,#8+3
+ lsr r8,r8,#2
+
+ subs r5,r5,r8
+ blo gc_5
+r_gc_5:
+ ldr r8,[r6,#4]
+ add r8,r8,#3
+ lsr r8,r8,#2
+
+ mov r7,r6
+ mov r6,r10
+
+ 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
+ str r12,[r10,#4]
+ add r10,r10,#8
+
+ add r3,r3,r10
+
+ cmp r8,#0
+ beq updateAC_after_copy_lp
+
+updateAC_copy_lp:
+ ldr r12,[r7],#4
+ str r12,[r10],#4
+ subs r8,r8,#1
+ bne updateAC_copy_lp
+
+updateAC_after_copy_lp:
+ strb r4,[r3]
+
+ ldr pc,[sp],#4
+
+gc_5: bl collect_1
+ b r_gc_5
+
+update_string_error:
+ lao r8,high_index_string,0
+ otoa r8,high_index_string,0
+ tst r4,r4
+ bpl update_string_error_2
+ 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]
+ ldr r12,[r7,#4]
+ cmp r4,r12
+ bne equal_string_ne
+ add r6,r6,#8
+ add r7,r7,#8
+ and r3,r4,#3
+ lsrs r4,r4,#2
+ beq equal_string_b
+equal_string_1:
+ ldr r8,[r6]
+ ldr r12,[r7]
+ cmp r8,r12
+ bne equal_string_ne
+ add r6,r6,#4
+ add r7,r7,#4
+ subs r4,r4,#1
+ bne equal_string_1
+equal_string_b:
+ tst r3,#2
+ beq equal_string_2
+ ldrh r4,[r6]
+ ldrh r12,[r7]
+ cmp r4,r12
+ bne equal_string_ne
+ add r6,r6,#2
+ add r7,r7,#2
+equal_string_2:
+ tst r3,#1
+ beq equal_string_eq
+ ldrb r3,[r6]
+ ldrb r12,[r7]
+ cmp r3,r12
+ bne equal_string_ne
+equal_string_eq:
+ mov r4,#1
+ ldr pc,[sp],#4
+equal_string_ne:
+ mov r4,#0
+ ldr pc,[sp],#4
+
+ .section .text.cmpAC,"ax"
+cmpAC:
+ ldr r3,[r6,#4]
+ ldr r8,[r7,#4]
+ add r6,r6,#8
+ add r7,r7,#8
+ cmp r8,r3
+ blo cmp_string_less
+ bhi cmp_string_more
+ mov r4,#0
+ b cmp_string_chars
+cmp_string_more:
+ mov r4,#1
+ b cmp_string_chars
+cmp_string_less:
+ mov r4,#-1
+ mov r3,r8
+ b cmp_string_chars
+
+cmp_string_1:
+ ldr r8,[r7]
+ ldr r12,[r6]
+ cmp r8,r12
+ bne cmp_string_ne4
+ add r7,r7,#4
+ add r6,r6,#4
+cmp_string_chars:
+ subs r3,r3,#4
+ bcs cmp_string_1
+cmp_string_b:
+@ to do compare bytes using and instead of ldrb
+ tst r3,#2
+ beq cmp_string_2
+ ldrb r8,[r7]
+ ldrb r12,[r6]
+ cmp r8,r12
+ bne cmp_string_ne
+ ldrb r8,[r7,#1]
+ ldrb r12,[r6,#1]
+ cmp r8,r12
+ bne cmp_string_ne
+ add r7,r7,#2
+ add r6,r6,#2
+cmp_string_2:
+ tst r3,#1
+ beq cmp_string_eq
+ ldrb r8,[r7]
+ ldrb r12,[r6]
+ cmp r8,r12
+ bne cmp_string_ne
+cmp_string_eq:
+ ldr pc,[sp],#4
+cmp_string_ne4:
+@ to do compare bytes using and instead of ldrb
+ ldrb r3,[r7]
+ ldrb r12,[r6]
+ cmp r3,r12
+ bne cmp_string_ne
+ ldrb r3,[r7,#1]
+ ldrb r12,[r6,#1]
+ cmp r3,r12
+ bne cmp_string_ne
+ ldrb r3,[r7,#2]
+ ldrb r12,[r6,#2]
+ cmp r3,r12
+ bne cmp_string_ne
+ ldrb r3,[r7,#3]
+ ldrb r12,[r6,#3]
+ cmp r3,r12
+cmp_string_ne:
+ bhi cmp_string_r1
+ mov r4,#-1
+ ldr pc,[sp],#4
+cmp_string_r1:
+ mov r4,#1
+ ldr pc,[sp],#4
+
+ .section .text.string_to_string_node,"ax"
+string_to_string_node:
+ ldr r8,[r6],#4
+
+ add r4,r8,#3
+ lsr r4,r4,#2
+
+ add r12,r4,#2
+ subs r5,r5,r12
+ blo string_to_string_node_gc
+
+string_to_string_node_r:
+ laol r12,__STRING__+2,__STRING___o_2,4
+ otoa r12,__STRING___o_2,4
+ str r12,[r10]
+ str r8,[r10,#4]
+ mov r8,r10
+ add r10,r10,#8
+ b string_to_string_node_4
+
+string_to_string_node_2:
+ ldr r12,[r6],#4
+ str r12,[r10],#4
+string_to_string_node_4:
+ subs r4,r4,#1
+ bge string_to_string_node_2
+
+ mov r6,r8
+ ldr pc,[sp],#4
+
+string_to_string_node_gc:
+ stmdb sp!,{r6,r8}
+ bl collect_0
+ ldmia sp!,{r6,r8}
+ 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]
+
+ add r12,r4,#3
+ subs r5,r5,r12
+ blo int_array_to_node_gc
+
+int_array_to_node_r:
+ 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
+ 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
+
+int_array_to_node_2:
+ ldr r12,[r7],#4
+ str r12,[r10],#4
+int_array_to_node_4:
+ subs r4,r4,#1
+ bge int_array_to_node_2
+
+ ldr pc,[sp],#4
+
+int_array_to_node_gc:
+ str r6,[sp,#-4]!
+ bl collect_0
+ 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]
+
+ add r12,r4,#3+1
+ subs r5,r5,r12
+ blo real_array_to_node_gc
+
+real_array_to_node_r:
+ tst r10,#4
+ orr r10,r10,#4
+ it ne
+ addne r5,r5,#1
+ mov r7,r6
+ laol r12,__ARRAY__+2,__ARRAY___o_2,1
+ otoa r12,__ARRAY___o_2,1
+ str r12,[r10]
+ str r4,[r10,#4]
+ mov r6,r10
+ 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
+
+real_array_to_node_2:
+ ldr r12,[r7]
+ str r12,[r10]
+ ldr r8,[r7,#4]
+ add r7,r7,#8
+ str r8,[r10,#4]
+ add r10,r10,#8
+real_array_to_node_4:
+ subs r4,r4,#1
+ bge real_array_to_node_2
+
+ ldr pc,[sp],#4
+
+real_array_to_node_gc:
+ str r6,[sp,#-4]!
+ bl collect_0
+ 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
+ .p2align 2
+
+ .long 4
+_c4: b __cycle__in__spine
+ .p2align 2
+ .long 5
+_c5: b __cycle__in__spine
+ .p2align 2
+ .long 6
+_c6: b __cycle__in__spine
+ .p2align 2
+ .long 7
+_c7: b __cycle__in__spine
+ .p2align 2
+ .long 8
+_c8: b __cycle__in__spine
+ .p2align 2
+ .long 9
+_c9: b __cycle__in__spine
+ .p2align 2
+ .long 10
+_c10: b __cycle__in__spine
+ .p2align 2
+ .long 11
+_c11: b __cycle__in__spine
+ .p2align 2
+ .long 12
+_c12: b __cycle__in__spine
+ .p2align 2
+ .long 13
+_c13: b __cycle__in__spine
+ .p2align 2
+ .long 14
+_c14: b __cycle__in__spine
+ .p2align 2
+ .long 15
+_c15: b __cycle__in__spine
+ .p2align 2
+ .long 16
+_c16: b __cycle__in__spine
+ .p2align 2
+ .long 17
+_c17: b __cycle__in__spine
+ .p2align 2
+ .long 18
+_c18: b __cycle__in__spine
+ .p2align 2
+ .long 19
+_c19: b __cycle__in__spine
+ .p2align 2
+ .long 20
+_c20: b __cycle__in__spine
+ .p2align 2
+ .long 21
+_c21: b __cycle__in__spine
+ .p2align 2
+ .long 22
+_c22: b __cycle__in__spine
+ .p2align 2
+ .long 23
+_c23: b __cycle__in__spine
+ .p2align 2
+ .long 24
+_c24: b __cycle__in__spine
+ .p2align 2
+ .long 25
+_c25: b __cycle__in__spine
+ .p2align 2
+ .long 26
+_c26: b __cycle__in__spine
+ .p2align 2
+ .long 27
+_c27: b __cycle__in__spine
+ .p2align 2
+ .long 28
+_c28: b __cycle__in__spine
+ .p2align 2
+ .long 29
+_c29: b __cycle__in__spine
+ .p2align 2
+ .long 30
+_c30: b __cycle__in__spine
+ .p2align 2
+ .long 31
+_c31: b __cycle__in__spine
+ .p2align 2
+ .long 32
+_c32: b __cycle__in__spine
+
+@
+@ ARRAYS
+@
+
+_create_arrayB:
+ add r3,r4,#3
+ lsr r3,r3,#2
+
+ add r12,r3,#3
+ subs r5,r5,r12
+ bhs no_collect_4574
+ bl collect_0
+no_collect_4574:
+ mov r6,r10
+ laol r12,__ARRAY__+2,__ARRAY___o_2,2
+ otoa r12,__ARRAY___o_2,2
+ str r12,[r10]
+ str r4,[r10,#4]
+ 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
+ ldr pc,[sp],#4
+
+_create_arrayC:
+ add r3,r4,#3
+ lsr r3,r3,#2
+
+ add r12,r3,#2
+ subs r5,r5,r12
+ bhs no_collect_4573
+ bl collect_0
+no_collect_4573:
+ mov r6,r10
+ 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
+ add r10,r12,r3,lsl #2
+ ldr pc,[sp],#4
+
+_create_arrayI:
+ add r12,r4,#3
+ subs r5,r5,r12
+ bhs no_collect_4572
+ bl collect_0
+no_collect_4572:
+ mov r6,r10
+ laol r12,__ARRAY__+2,__ARRAY___o_2,3
+ otoa r12,__ARRAY___o_2,3
+ str r12,[r10]
+ str r4,[r10,#4]
+ 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
+ ldr pc,[sp],#4
+
+_create_arrayR:
+ add r12,r4,r4
+ add r12,r12,#3+1
+ subs r5,r5,r12
+ bhs no_collect_4580
+ bl collect_0
+no_collect_4580:
+ tst r10,#4
+ orr r10,r10,#4
+ it ne
+ addne r5,r5,#1
+ mov r6,r10
+ laol r12,__ARRAY__+2,__ARRAY___o_2,4
+ otoa r12,__ARRAY___o_2,4
+ str r12,[r10]
+ str r4,[r10,#4]
+ 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
+ ldr pc,[sp],#4
+
+@ r4: number of elements, r3: element descriptor
+@ r2: element size, r1: element a size, a0:a_element-> a0: array
+
+_create_r_array:
+ mul r12,r4,r2
+ add r12,r12,#3
+ subs r5,r5,r12
+ bhs no_collect_4586
+ bl collect_1
+no_collect_4586:
+ mov r8,r6
+
+ 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]
+
+ mov r6,r10
+ add r10,r10,#12
+
+@ r4: number of elements, a0: array
+@ r2: element size, r1: element a size, a2:a_element
+
+ cmp r1,#0
+ beq _create_r_array_0
+ cmp r1,#2
+ blo _create_r_array_1
+ beq _create_r_array_2
+ cmp r1,#4
+ blo _create_r_array_3
+ beq _create_r_array_4
+ b _create_r_array_5
+
+_create_r_array_0:
+ lsl r2,r2,#2
+ mul r12,r4,r2
+ add r10,r10,r12
+ ldr pc,[sp],#4
+
+_create_r_array_1:
+ lsl r2,r2,#2
+ b _st_fillr1_array
+_fillr1_array:
+ str r8,[r10]
+ add r10,r10,r2
+_st_fillr1_array:
+ subs r4,r4,#1
+ bcs _fillr1_array
+ ldr pc,[sp],#4
+
+_create_r_array_2:
+ lsl r2,r2,#2
+ b _st_fillr2_array
+_fillr2_array:
+ str r8,[r10]
+ str r8,[r10,#4]
+ add r10,r10,r2
+_st_fillr2_array:
+ subs r4,r4,#1
+ bcs _fillr2_array
+ ldr pc,[sp],#4
+
+_create_r_array_3:
+ lsl r2,r2,#2
+ b _st_fillr3_array
+_fillr3_array:
+ str r8,[r10]
+ str r8,[r10,#4]
+ str r8,[r10,#8]
+ add r10,r10,r2
+_st_fillr3_array:
+ subs r4,r4,#1
+ bcs _fillr3_array
+ ldr pc,[sp],#4
+
+_create_r_array_4:
+ lsl r2,r2,#2
+ b _st_fillr4_array
+_fillr4_array:
+ str r8,[r10]
+ str r8,[r10,#4]
+ str r8,[r10,#8]
+ str r8,[r10,#12]
+ add r10,r10,r2
+_st_fillr4_array:
+ subs r4,r4,#1
+ bcs _fillr4_array
+ ldr pc,[sp],#4
+
+_create_r_array_5:
+ sub r2,r2,r1
+ lsl r2,r2,#2
+ b _st_fillr5_array
+
+_fillr5_array:
+ str r8,[r10]
+ str r8,[r10,#4]
+ str r8,[r10,#8]
+ str r8,[r10,#12]
+ add r10,r10,#16
+
+ sub r3,r1,#5
+_copy_elem_5_lp:
+ str r8,[r10],#4
+ subs r3,r3,#1
+ bcs _copy_elem_5_lp
+
+ add r10,r10,r2
+_st_fillr5_array:
+ subs r4,r4,#1
+ bcs _fillr5_array
+
+ ldr pc,[sp],#4
+
+create_arrayB:
+ mov r7,r3
+ add r3,r3,#3
+ lsr r3,r3,#2
+
+ add r12,r3,#3
+ subs r5,r5,r12
+ bhs no_collect_4575
+
+ str r7,[sp,#-4]!
+ bl collect_0
+ ldr r7,[sp],#4
+
+no_collect_4575:
+ orr r4,r4,r4,lsl #8
+ orr r4,r4,r4,lsl #16
+ mov r6,r10
+ laol r12,__ARRAY__+2,__ARRAY___o_2,6
+ otoa r12,__ARRAY___o_2,6
+ str r12,[r10]
+ str r7,[r10,#4]
+ 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
+
+create_arrayC:
+ mov r7,r3
+ add r3,r3,#3
+ lsr r3,r3,#2
+
+ add r12,r3,#2
+ subs r5,r5,r12
+ bhs no_collect_4578
+
+ str r7,[sp,#-4]!
+ bl collect_0
+ ldr r7,[sp],#4
+
+no_collect_4578:
+ orr r4,r4,r4,lsl #8
+ orr r4,r4,r4,lsl #16
+ mov r6,r10
+ 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
+ b create_arrayBCI
+
+create_arrayI:
+ add r12,r3,#3
+ subs r5,r5,r12
+ bhs no_collect_4577
+
+ bl collect_0
+
+no_collect_4577:
+ mov r6,r10
+ laol r12,__ARRAY__+2,__ARRAY___o_2,7
+ otoa r12,__ARRAY___o_2,7
+ str r12,[r10]
+ str r3,[r10,#4]
+ laol r12,INT+2,INT_o_2,5
+ otoa r12,INT_o_2,5
+ str r12,[r10,#8]
+ add r10,r10,#12
+create_arrayBCI:
+ tst r3,#1
+ lsr r3,r3,#1
+ beq st_filli_array
+
+ str r4,[r10],#4
+ b st_filli_array
+
+filli_array:
+ str r4,[r10]
+ str r4,[r10,#4]
+ add r10,r10,#8
+st_filli_array:
+ subs r3,r3,#1
+ bcs filli_array
+
+ ldr pc,[sp],#4
+
+create_arrayR:
+ add r12,r4,r4
+ add r12,r12,#3+1
+
+ vmov r3,r7,d0
+
+ subs r5,r5,r12
+ bhs no_collect_4579
+
+ str r7,[sp,#-4]!
+ bl collect_0
+ ldr r7,[sp],#4
+
+no_collect_4579:
+ tst r10,#4
+ orr r10,r10,#4
+ it ne
+ addne r5,r5,#1
+
+ mov r6,r10
+ laol r12,__ARRAY__+2,__ARRAY___o_2,8
+ otoa r12,__ARRAY___o_2,8
+ str r12,[r10]
+ str r4,[r10,#4]
+ 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
+fillr_array:
+ str r3,[r10]
+ str r7,[r10,#4]
+ add r10,r10,#8
+st_fillr_array:
+ subs r4,r4,#1
+ bcs fillr_array
+
+ ldr pc,[sp],#4
+
+create_array:
+ add r12,r4,#3
+ subs r5,r5,r12
+ bhs no_collect_4576
+
+ bl collect_1
+
+no_collect_4576:
+ mov r3,r6
+ mov r6,r10
+ laol r12,__ARRAY__+2,__ARRAY___o_2,9
+ otoa r12,__ARRAY___o_2,9
+ str r12,[r10]
+ str r4,[r10,#4]
+ mov r12,#0
+ str r12,[r10,#8]
+ add r10,r10,#12
+ mov r1,r4
+ b fillr1_array
+
+@ in r4: number of elements, r3: element descriptor
+@ r2: element size, r1: element a size -> a0: array
+
+create_R_array:
+ cmp r2,#2
+ blo create_R_array_1
+ beq create_R_array_2
+ cmp r2,#4
+ blo create_R_array_3
+ beq create_R_array_4
+ b create_R_array_5
+
+create_R_array_1:
+@ r4: number of elements, r3: element descriptor
+@ r1: element a size
+
+ add r12,r4,#3
+ subs r5,r5,r12
+ bhs no_collect_4581
+
+ bl collect_0
+
+no_collect_4581:
+ mov r6,r10
+ 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]
+ add r10,r10,#12
+
+ cmp r1,#0
+ beq r_array_1_b
+
+ ldr r3,[r9,#-4]
+ b fillr1_array
+
+r_array_1_b:
+ ldr r3,[sp,#4]
+
+fillr1_array:
+ tst r4,#1
+ lsr r4,r4,#1
+ beq st_fillr1_array_1
+
+ str r3,[r10],#4
+ b st_fillr1_array_1
+
+fillr1_array_lp:
+ str r3,[r10]
+ str r3,[r10,#4]
+ add r10,r10,#8
+st_fillr1_array_1:
+ subs r4,r4,#1
+ bcs fillr1_array_lp
+
+ ldr pc,[sp],#4
+
+create_R_array_2:
+@ r4: number of elements, r3: element descriptor
+@ r1: element a size
+
+ add r12,r4,r4
+ add r12,r12,#3
+ subs r5,r5,r12
+ bhs no_collect_4582
+
+ bl collect_0
+
+no_collect_4582:
+ mov r6,r10
+ 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]
+ add r10,r10,#12
+
+ subs r1,r1,#1
+ blo r_array_2_bb
+ beq r_array_2_ab
+r_array_2_aa:
+ ldr r3,[r9,#-4]
+ ldr r8,[r9,#-8]
+ b st_fillr2_array
+r_array_2_ab:
+ ldr r3,[r9,#-4]
+ ldr r8,[sp,#4]
+ b st_fillr2_array
+r_array_2_bb:
+ ldr r3,[sp,#4]
+ ldr r8,[sp,#8]
+ b st_fillr2_array
+
+fillr2_array_1:
+ str r3,[r10]
+ str r8,[r10,#4]
+ add r10,r10,#8
+st_fillr2_array:
+ subs r4,r4,#1
+ bcs fillr2_array_1
+
+ ldr pc,[sp],#4
+
+create_R_array_3:
+@ r4: number of elements, r3: element descriptor
+@ r1: element a size
+
+ add r12,r4,r4,lsl #1
+ add r12,r12,#3
+ subs r5,r5,r12
+ bhs no_collect_4583
+
+ bl collect_0
+
+no_collect_4583:
+ mov r6,r10
+ 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]
+ add r10,r10,#12
+
+ ldr lr,[sp],#4
+ mov r2,sp
+
+ cmp r1,#0
+ beq r_array_3
+
+ sub r8,r9,r1,lsl #2
+ subs r1,r1,#1
+
+copy_a_to_b_lp3:
+ ldr r12,[r8],#4
+ str r12,[sp,#-4]!
+ subs r1,r1,#1
+ bcs copy_a_to_b_lp3
+
+r_array_3:
+ ldr r3,[sp]
+ ldr r7,[sp,#4]
+ ldr r8,[sp,#8]
+
+ mov sp,r2
+ b st_fillr3_array
+
+fillr3_array_1:
+ str r3,[r10]
+ str r7,[r10,#4]
+ str r8,[r10,#8]
+ add r10,r10,#12
+st_fillr3_array:
+ subs r4,r4,#1
+ bcs fillr3_array_1
+
+ bx lr
+
+create_R_array_4:
+@ r4: number of elements, r3: element descriptor
+@ r1: element a size
+
+ lsl r12,r4,#2
+ add r12,r12,#3
+ subs r5,r5,r12
+ bhs no_collect_4584
+
+ bl collect_0
+
+no_collect_4584:
+ mov r6,r10
+ 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]
+ add r10,r10,#12
+
+ ldr lr,[sp],#4
+ mov r2,sp
+
+ cmp r1,#0
+ beq r_array_4
+
+ sub r8,r9,r1,lsl #2
+ subs r1,r1,#1
+
+copy_a_to_b_lp4:
+ ldr r12,[r8],#4
+ str r12,[sp,#-4]!
+ subs r1,r1,#1
+ bcs copy_a_to_b_lp4
+
+r_array_4:
+ ldr r0,[sp]
+ ldr r3,[sp,#4]
+ ldr r7,[sp,#8]
+ ldr r8,[sp,#12]
+
+ mov sp,r2
+ b st_fillr4_array
+
+fillr4_array:
+ str r0,[r10]
+ str r3,[r10,#4]
+ str r7,[r10,#8]
+ str r8,[r10,#12]
+ add r10,r10,#16
+st_fillr4_array:
+ subs r4,r4,#1
+ bcs fillr4_array
+
+ bx lr
+
+create_R_array_5:
+@ r4: number of elements, r3: element descriptor
+@ r1: element a size, r2: element size
+
+ mul r12,r4,r2
+ add r12,r12,#3
+ subs r5,r5,r12
+ bhs no_collect_4585
+
+ bl collect_0
+
+no_collect_4585:
+ 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]
+
+ ldr lr,[sp],#4
+ mov r11,sp
+
+ cmp r1,#0
+ beq r_array_5
+
+ sub r8,r9,r1,lsl #2
+ subs r1,r1,#1
+
+copy_a_to_b_lp5:
+ ldr r12,[r8],#4
+ str r12,[sp,#-4]!
+ subs r1,r1,#1
+ bcs copy_a_to_b_lp5
+
+r_array_5:
+ mov r6,r10
+ add r10,r10,#12
+
+ ldr r3,[sp]
+ ldr r7,[sp,#4]
+ b st_fillr5_array
+
+fillr5_array_1:
+ str r3,[r10]
+ str r7,[r10,#4]
+
+ sub r12,r2,#5
+
+ ldr r8,[sp,#8]
+ str r8,[r10,#8]
+
+ ldr r8,[sp,#12]
+ add r0,sp,#16
+ str r8,[r10,#12]
+ add r10,r10,#16
+
+copy_elem_lp5:
+ ldr r8,[r0],#4
+ str r8,[r10],#4
+ subs r12,r12,#1
+ bcs copy_elem_lp5
+
+st_fillr5_array:
+ subs r4,r4,#1
+ bcs fillr5_array_1
+
+ mov sp,r11
+
+ bx lr
+
+repl_args_b:
+ cmp r4,#0
+ ble repl_args_b_1
+
+ subs r4,r4,#1
+ beq repl_args_b_4
+
+ ldr r7,[r6,#8]
+ subs r3,r3,#2
+ bne repl_args_b_2
+
+ str r7,[r9],#4
+ b repl_args_b_4
+
+repl_args_b_2:
+ add r7,r7,r4,lsl #2
+
+repl_args_b_3:
+ ldr r8,[r7,#-4]!
+ str r8,[r9],#4
+ subs r4,r4,#1
+ bne repl_args_b_3
+
+repl_args_b_4:
+ ldr r8,[r6,#4]
+ str r8,[r9],#4
+repl_args_b_1:
+ ldr pc,[sp],#4
+
+push_arg_b:
+ cmp r3,#2
+ blo push_arg_b_1
+ bne push_arg_b_2
+ cmp r3,r4
+ beq push_arg_b_1
+push_arg_b_2:
+ ldr r6,[r6,#8]
+ subs r3,r3,#2
+push_arg_b_1:
+ ldr r6,[r6,r3,lsl #2]
+ ldr pc,[sp],#4
+
+del_args:
+ ldr r3,[r6]
+ subs r3,r3,r4
+ ldrsh r4,[r3,#-2]
+ subs r4,r4,#2
+ bge del_args_2
+
+ str r3,[r7]
+ ldr r8,[r6,#4]
+ str r8,[r7,#4]
+ ldr r8,[r6,#8]
+ str r8,[r7,#8]
+ ldr pc,[sp],#4
+
+del_args_2:
+ bne del_args_3
+
+ str r3,[r7]
+ ldr r8,[r6,#4]
+ str r8,[r7,#4]
+ ldr r8,[r6,#8]
+ ldr r8,[r8]
+ str r8,[r7,#8]
+ ldr pc,[sp],#4
+
+del_args_3:
+ subs r5,r5,r4
+ blo del_args_gc
+del_args_r_gc:
+ str r3,[r7]
+ str r10,[r7,#8]
+ ldr r8,[r6,#4]
+ ldr r6,[r6,#8]
+ str r8,[r7,#4]
+
+del_args_copy_args:
+ ldr r8,[r6],#4
+ str r8,[r10],#4
+ subs r4,r4,#1
+ bgt del_args_copy_args
+
+ ldr pc,[sp],#4
+
+del_args_gc:
+ bl collect_2
+ b del_args_r_gc
+
+ .section .text.sin_real,"ax"
+sin_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ bl sin
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+ ldr pc,[sp],#4
+
+ .section .text.cos_real,"ax"
+cos_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ bl cos
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+ ldr pc,[sp],#4
+
+ .section .text.tan_real,"ax"
+tan_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ bl tan
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+ ldr pc,[sp],#4
+
+ .section .text.asin_real,"ax"
+asin_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ bl asin
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+ ldr pc,[sp],#4
+
+ .section .text.acos_real,"ax"
+acos_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ bl acos
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+ ldr pc,[sp],#4
+
+ .section .text.atan_real,"ax"
+atan_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ bl atan
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+ ldr pc,[sp],#4
+
+ .section .text.ln_real,"ax"
+ln_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ bl log
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+ ldr pc,[sp],#4
+
+ .section .text.log10_real,"ax"
+log10_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ bl log10
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+ ldr pc,[sp],#4
+
+ .section .text.exp_real,"ax"
+exp_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ bl exp
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+ ldr pc,[sp],#4
+
+ .section .text.pow_real,"ax"
+pow_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d1
+ vmov r2,r3,d0
+.else
+ vmov.f64 d2,d0
+ vmov.f64 d0,d1
+ vmov.f64 d1,d2
+.endif
+ bl pow
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+ ldr pc,[sp],#4
+
+ .section .text.entier_real,"ax"
+entier_real:
+.ifdef SOFT_FP_CC
+ vmov r0,r1,d0
+.endif
+ bl floor
+.ifdef SOFT_FP_CC
+ vmov d0,r0,r1
+.endif
+
+r_to_i_real:
+ vcvtr.s32.f64 s0,d0
+ 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 e__system__nind,0
+ lto e__system__nind,1
+ lto e__system__nind,2
+ lto e__system__nind,3
+ lto e__system__nind,4
+ lto e__system__nind,5
+ lto e__system__nind,6
+ lto e__system__nind,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
+ .include "thumb2ap.s"
+.endif