summaryrefslogblamecommitdiff
path: root/thumb2startup.s
blob: 476ff44e34c536e9ea9901723a45fb029b93873f (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489







































































































































































































































































































































































































































































































                                                                           
                   








                                      
              
                        
                            


                          
              
                        
                            




                                
              
                        
                            




                                      
              
                        
                            
                  
              
                        
                            

                       
                   
     
              
                        
                            
                          
                   


                               
                   





                                          
              
                        
                            


                              
              
                        
                            




                                
              
                        
                            











                                        
                   



                             
                   








                                        
              
                        
                            
                          
                   

                               
                   





















































































































                                                      
                   












                                      
                   

































































































                                                 
                   
























                                          
                          
                     







                                           
                          
                     












                                           
                          
                     
 
                   
           
              
                        
                            
                                






                                       
                               


                                     
              
                        
                            


                                  
                               


                                             
              
                        
                            


                                  
                               








                                              
              
                        
                            

                          
                             
 
                   








                                 
              
                        
                            

                                         
                          
                     
 
                   




































































































                                         
                   
























                                        
                               
                     
                            

























                                        
                          
                     
 
                   




                                   
                   


                              
                   
          
                          
                     
 
                   
     
              
                        
                            




































                               
                   


                              
                   





































                                     
                   







                               
                   
                 
                          
                     
 
                   

                           
                          
                     
 
                   

                           
                          
                     
 
                   














                               
                          
                     
 
                   

                            
                          
                     
 
                   


                            
                          
                     
 
                   



                           
                   


                                  
                          
                     
 
                   


                                   
                          
                     
 
                   



                           
                   




                             
                   
                      

                        
                            
                          
                     



                            
                          
                     
 
                   




                                   
                   


                            
                   
               
                          
                     
 
                   
















                                
                   





                                 
                   

                            
                   








                                  
                   

                             
                   




                                  
                   




















                                
                   

                                 
                   





                                 
                   

                             
                   








                                    
                   





                                 
                   

                            
                   



                                    
                          
                     





                                
                          
                     

                                 
                          
                     







                                       

                         











                                      
              
                        
                            





                                        
                   




                           
                   





                               
                   













                                
                   

                       
                   

                          
                   

                         
                   






                              
                          
                     







                                      
                   







                                                         
                   









                                    
                   

                                   
                   




























                                                 
                          
                     






















                                     
                          
                     







                           
                          
                     






                           
                          
                     







                               
                          
                     

                     
                          
                     


                 
                   

















                                             
                          
                     
 
                   












                               
                          
                     
 
                   
                 
              
                        
                            


                                 
                   


                         
                          
                     
 
                   
                         
              
                        
                            




                                         
              
                        
                            











































































































                                                      
              
                        
                            











                             
                          
                     





                                           
              
                        
                            









                            
                          
                     





                                           
              
                        
                            






                            
                          
                     





                                           
              
                        
                            








































                                                
                   








                          
                   





                                  
                   












                                 
                   







                           
                   

























                                                
                   







                                 
                   





                                                
                   

































                                             
                   
        
              
                        
                            





















                                             
                        




                                             
                   






































                                                
              
                        
                            




















                                                
              
                        
                            

                                   
                   


                                                
              
                        
                            
                               
                   












                                            
              
                        
                            



















                                           
                   












                                     
                   















                                        
                   


























































                                              
                   


























                                      
              
                        
                            


                          
                   








































                                               
                   





                                             
                   





















                                               
                   

                    
              
                        
                            





























































































                                                                   
                   

























































































































                                                               
                   


                                            
                   













                                        
                   



                                             
                          
                     

              
                   









                                                                   
              
                        
                            




                                           
                   

























                            
                          
                     
 
                   















                             
                   











                                 
                   




                                 
                   
                  
                   







                          
                          
                     



                                                
                   



































































                                           
                   






































                                                
                   









                                         
                   














































                                                 
                   


















































































































                                                
                   
                           
              
                        
                            









                                          
                   
               
              
                        
                            




















                                          
                   


                               
                   



                                
              
                        
                            
















































                                         
                   
                 
                   


                          
              
                        
                            








                            
                          
                     









                                 
                   
                
                   












                                  
                          
                     














                                        
              
                        
                            








                            
                          
                     

              
              
                        
                            









                                     
              
                        
                            











                                     
              
                        
                            











                                     
              
                        
                            













                                     
              
                        
                            
















                                     
              
                        
                            


















                                     
              
                        
                            




















                                     
              
                        
                            




                         
                   














                                     
                   









                             
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            







                          
              
                        
                            

















































































                                                 
                          
                     


                         
                   

                                       
                          
                     




















































                                                 
                          
                     


















































                                                 
                          
                     


                         
                   


































                                             
                   














                               
                   
                     
                          
                     
                   
                     
                          
                     










                                 
                   

                                
                   










                                
                   

                            
                   



















                                               
                   
              
                          
                     















                                               
                   

                             
                          
                     
                     
                          
                     
                                                 
                   








                                        
                   















                                                 
                          
                     
 
                   









                                             
                   





                                    
                   


















                                               
                          
                     
 
                   










                                              
                   





                                     
                   


























                                               
                          
                     
 
                   





























































































































                                               
                          
                     















                                                 
                          
                     















                                               
                          
                     




















                                               
                          
                     


                                                                
                   

































                                                    
                          
                     








                                
                          
                     









                                
                          
                     










                                
                          
                     











                                
                          
                     






















                                
                          
                     











































































                                                 
                   


                           
                   


                           
                          
                     




























                                               
                   


                           
                   


                           
                          
                     
 
                   










































































                                                   
                          
                     











































                                                
                          
                     


















































































































































































                                                
                   

























                               
                          
                     
 
                   









                                 
                          
                     
 
                   










                                
                          
                     








                          
                          
                     


                           
                   





                           
                   




                                  
                          
                     
 
                   



                                    
                   






                        
                          
                     
                                    
                   






                        
                          
                     
                                    
                   






                        
                          
                     
                                        
                   






                        
                          
                     
                                     
                   






                        
                          
                     
                                     
                   






                        
                          
                     
                                   
                   






                        
                          
                     








                                      
                          
                     
                                    
                   






                        
                          
                     
                                    
                   











                        
                          
                     
                                       
                   







                        
                   

                           
                          
                     











































                                             
@
@	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

	.thumb_func
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
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	init_clean
	tst	r4,r4
	bne	init_error

	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	init_timer

	lao	r12,halt_sp,0
	sto	sp,r12,halt_sp,0

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	init_profiler
.endif

.ifdef DLL
	lao	r12,start_address,1
	ldo	r4,r12,start_address,1
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	blx	r4
.else
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	__start
.endif

	.thumb_func
exit:
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	exit_clean

	.thumb_func
init_error:
	ldmia	sp!,{r4-r11,pc}
	
	.globl	clean_init
	.thumb_func
clean_init:
	stmdb	sp!,{r4-r11,lr}

	lao	r12,dll_initisialised,0
	mov	r0,#1
	sto	r0,r12,dll_initisialised,0

	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	init_clean
	tst	r4,r4
	bne	init_dll_error

	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	init_timer

	lao	r12,halt_sp,1
	sto	sp,r12,halt_sp,1

 .ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[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

	.thumb_func
init_dll_error:
	mov	r4,#0
	b	exit_dll_init

	.globl	clean_fini
	.thumb_func
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

	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	exit_clean

	.thumb_func
exit_dll_init:
	ldmia	sp!,{r4-r11,pc}

	.thumb_func
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

	.thumb_func
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

	.thumb_func
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
	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

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	lr,[sp],#4
	mov	pc,lr

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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
exit_clean:
	.align
	add	lr,pc,#9
	str	lr,[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

	.align
	add	lr,pc,#9
	str	lr,[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

	.align
	add	lr,pc,#9
	str	lr,[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

	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	print_time

	mov	r0,#10
	bl	ew_print_char

	.thumb_func
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
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	write_profile_information
.endif

	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
__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

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
print_sc:
	lao	r12,basic_only,1
	ldo	r8,r12,basic_only,1
	cmp	r8,#0
	bne	end_print

	.thumb_func
print:
	mov	r0,r4
	bl	w_print_string

	.thumb_func
end_print:
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
dump:
	.align
	add	lr,pc,#9
	str	lr,[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

	.thumb_func
print_symbol:
	mov	r3,#0
	b	print_symbol_2

	.thumb_func
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

	.thumb_func
print_record:
	ldr	r8,[r4,#-6]
@.ifdef PIC
.if 0
	add	r12,r4,#-6
	add	r8,r8,r12
.endif
	b	print_string_a2

	.thumb_func
end_print_symbol:
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
print_int_node:
	ldr	r0,[r6,#4]
	bl	w_print_int
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
print_int:
	mov	r0,r4
	bl	w_print_int
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
print_char_node:
	ldr	r0,[r6,#4]
	bl	w_print_char
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
print_char:
	str	r4,[sp,#-4]!
	bl	w_print_char
	add	sp,sp,#4
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
print_bool:
	ldsb	r6,[r6,#4]
	tst	r6,r6
	beq	print_false

	.thumb_func
print_true:
	lao	r0,true_c_string,0
	otoa	r0,true_c_string,0
	bl	w_print_string
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
print_false:
	lao	r0,false_c_string,0
	otoa	r0,false_c_string,0
	bl	w_print_string
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
print_real:
.ifdef SOFT_FP_CC
	vmov	r0,r1,d0
.endif
	b	print_real_
	.thumb_func
print_real_node:
.ifdef SOFT_FP_CC
	ldrd	r0,r1,[r6,#4]
.else
	vldr.f64 d0,[r6,#4]
.endif
	.thumb_func
print_real_:
	mov	r11,sp
	mov	lr,sp
	bic	lr,lr,#7
	mov	sp,lr
	bl	w_print_real
	mov	sp,r11
	ldr	lr,[sp],#4
	mov	pc,lr

print_string_a2:
	ldr	r1,[r8]
	add	r0,r8,#4
	bl	w_print_text
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
print__chars__sc:
	lao	r12,basic_only,3
	ldo	r8,r12,basic_only,3
	cmp	r8,#0
	bne	no_print_chars

	.thumb_func
print__string__:
	ldr	r1,[r6,#4]
	add	r0,r6,#8
	bl	w_print_text
	.thumb_func
no_print_chars:
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
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
	.thumb_func
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
	.thumb_func
push_a_elements_lp:
	ldr	r4,[r6,#-4]!
	str	r4,[r9],#4
	.thumb_func
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
	.thumb_func
push_b_elements_lp:
	ldr	r12,[r6,#-4]!
	str	r12,[sp,#-4]!
	.thumb_func
push_b_elements:
	subs	r7,r7,#1
	bcs	push_b_elements_lp

	mov	pc,r8

	.thumb_func
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
	.thumb_func
small_record:
	b	push_r_b_elements

	.thumb_func
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
	.thumb_func
not_first_arg_b:
	ldr	r12,[r7,#-4]!
	str	r12,[sp,#-4]!
	.thumb_func
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

	.thumb_func
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
	.thumb_func
not_first_arg_a:
	ldr	r8,[r7,#-4]!
	str	r8,[r9],#4
	.thumb_func
push_r_a_elements:
	subs	r3,r3,#1
	bcs	push_r_a_elements_lp

	ldr	r4,[sp],#4
	ldr	lr,[sp],#4
	mov	pc,lr

BtoAC:
	tst	r4,r4
	beq	BtoAC_false
BtoAC_true:
	lao	r6,true_string,0
	otoa	r6,true_string,0
	ldr	lr,[sp],#4
	mov	pc,lr
BtoAC_false:
	lao	r6,false_string,0
	otoa	r6,false_string,0
	ldr	lr,[sp],#4
	mov	pc,lr

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
	mov	lr,sp
	and	lr,lr,#-8
	mov	sp,lr
	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
	.align
	add	lr,pc,#9
	str	lr,[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

	.thumb_func
int_to_string:
	tst	r4,r4
	bpl	no_minus
	mov	r12,#45
	strb	r12,[r6],#1
	neg	r4,r4
	.thumb_func
no_minus:
	add	r8,r6,#12

	beq	zero_digit

	ldr	r2,=0xcccccccd 

	.thumb_func
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

	.thumb_func
last_digit:
	tst	r4,r4
	beq	no_zero
	.thumb_func
zero_digit:
	add	r4,r4,#48
	strb	r4,[r8],#1
	.thumb_func
no_zero:
	add	r7,r6,#12

	.thumb_func
reverse_digits:
	ldrb	r3,[r8,#-1]!
	strb	r3,[r6],#1
	cmp	r7,r8
	bne	reverse_digits

	mov	r12,#0
	strb	r12,[r6]
	ldr	lr,[sp],#4
	mov	pc,lr
.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

	.thumb_func
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
	.thumb_func
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
	.thumb_func
sprintf_buffer_to_string:
	lao	r6,sprintf_buffer,7
	otoa	r6,sprintf_buffer,7
	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

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	lr,[sp],#4
	mov	pc,lr

eqD_CHAR:
eqD_INT:
	ldr	r3,[r6,#4]
	mov	r4,#0
	ldr	r12,[r7,#4]
	cmp	r3,r12
	it eq
	moveq	r4,#1
	ldr	lr,[sp],#4
	mov	pc,lr

eqD_BOOL:
	ldrb	r3,[r6,#4]
	mov	r4,#0
	ldrb	r12,[r7,#4]
	cmp	r3,r12
	it eq
	moveq	r4,#1
	ldr	lr,[sp],#4
	mov	pc,lr

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	lr,[sp],#4
	mov	pc,lr

eqD_false:
	mov	r4,#0
	ldr	lr,[sp],#4
	mov	pc,lr
@
@	the timer
@

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
add_execute_time:
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	get_time_diff
	lao	r6,execute_time,3
	otoa	r6,execute_time,3

	.thumb_func
add_time:
	ldr	r12,[r6]
	add	r4,r4,r12
	str	r4,[r6]
	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
add_garbage_collect_time:
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	get_time_diff
	lao	r6,garbage_collect_time,3
	otoa	r6,garbage_collect_time,3
	b	add_time

add_IO_time:
	.align
	add	lr,pc,#9
	str	lr,[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
	.align
	add	lr,pc,#9
	str	lr,[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	lr,[sp],#4
	mov	pc,lr
.endif

collect_2:
	str	lr,[sp,#-4]!
.ifdef PROFILE
	lao	r8,garbage_collector_name,1
	otoa	r8,garbage_collector_name,1
	.align
	add	lr,pc,#9
	str	lr,[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	lr,[sp],#4
	mov	pc,lr
.endif

collect_1:
	str	lr,[sp,#-4]!
.ifdef PROFILE
	lao	r8,garbage_collector_name,2
	otoa	r8,garbage_collector_name,2
	.align
	add	lr,pc,#9
	str	lr,[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
	mov	pc,lr
.endif

.ifdef PROFILE
collect_0:
	str	lr,[sp,#-4]!
	lao	r8,garbage_collector_name,3
	otoa	r8,garbage_collector_name,3
	.align
	add	lr,pc,#9
	str	lr,[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

	.thumb_func
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

	.thumb_func
zero_bits:
	add	r7,r6,#4
	add	r6,r6,#4
	subs	r8,r8,#1
	bne	skip_zero_bits_lp1
	b	end_bits

	.thumb_func
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

	.thumb_func
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

	.thumb_func
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}

	.thumb_func
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

	.thumb_func
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

	.thumb_func
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}

	.thumb_func
collect:
	.align
	add	lr,pc,#9
	str	lr,[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
	add	r0,sp,#0
	sub	r0,r4,r0
	bl	ew_print_int

	lao	r0,garbage_collect_string_3,0
	otoa	r0,garbage_collect_string_3,0
	bl	ew_print_string

	.thumb_func
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
	.align
	add	lr,pc,#9
	str	lr,[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

	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	zero_bit_vector
	b	end_zero_bit_vector

	.thumb_func
zero_all:
	lao	r12,heap_copied_vector_size,3
	ldo	r4,r12,heap_copied_vector_size,3
	lsr	r4,r4,#2
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	zero_bit_vector

	.thumb_func
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

	.align
	add	lr,pc,#9
	str	lr,[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

	.thumb_func
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

	.thumb_func
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

	.thumb_func
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
	.thumb_func
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]!
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	_munmap
	add	sp,sp,#8

	ldr	r4,[sp],#4
	.thumb_func
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

	.thumb_func
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
	.thumb_func
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

	.thumb_func
no_heap_use_message:

.if FINALIZERS
	.align
	add	lr,pc,#9
	str	lr,[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
	.thumb_func
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
	.thumb_func
call_finalizers:
	lao	r12,free_finalizer_list,1
	ldo	r4,r12,free_finalizer_list,1

	.thumb_func
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
	.thumb_func
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	lr,[sp],#4
	mov	pc,lr
.endif

.if WRITE_HEAP
	.thumb_func
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:
	.align
	add	lr,pc,#9
	str	lr,[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

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
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

	.thumb_func
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
	.thumb_func
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
	.thumb_func
next_a_in_element:
	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

@
@	the sliding compacting garbage collector
@

	.thumb_func
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
	.thumb_func
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
	.thumb_func
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

	.thumb_func
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
	.thumb_func
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

	.thumb_func
no_copy_garbage_collection:
	.align
	add	lr,pc,#9
	str	lr,[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

	.thumb_func
stack_overflow:
	.align
	add	lr,pc,#9
	str	lr,[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

	.thumb_func
print_error:
	mov	r0,r8
	bl	ew_print_string

	.thumb_func
halt:
	lao	r12,halt_sp,3
	ldo	sp,r12,halt_sp,3

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[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

	.thumb_func
e__system__eaind:
	.thumb_func
eval_fill:
	str	r6,[r9],#4
	mov	r6,r7
	ldr	r12,[r7]
	.align
	add	lr,pc,#9
	str	lr,[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	lr,[sp],#4
	mov	pc,lr

	.p2align	2
	b	e__system__eaind
	nop
	nop
.ifdef PIC
	.long	e__system__dind-.
.else
	.long	e__system__dind
.endif
	.long	-2
	.thumb_func
e__system__nind:
	.thumb_func
__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	lr,[sp],#4
	mov	pc,lr

.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
	
	.align
	add	lr,pc,#9
	str	lr,[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	lr,[sp],#4
	mov	pc,lr
.endif

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[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
	.align
	add	lr,pc,#9
	str	lr,[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
	.align
	add	lr,pc,#9
	str	lr,[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
	.align
	add	lr,pc,#9
	str	lr,[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
	.align
	add	lr,pc,#9
	str	lr,[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
	.align
	add	lr,pc,#9
	str	lr,[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
	.align
	add	lr,pc,#9
	str	lr,[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
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_7:
	mov	r4,#0
	mov	r3,#20
	.thumb_func
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

	.thumb_func
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
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_8:
	mov	r4,#1
	mov	r3,#24
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_9:
	mov	r4,#2
	mov	r3,#28
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_10:
	mov	r4,#3
	mov	r3,#32
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_11:
	mov	r4,#4
	mov	r3,#36
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_12:
	mov	r4,#5
	mov	r3,#40
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_13:
	mov	r4,#6
	mov	r3,#44
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_14:
	mov	r4,#7
	mov	r3,#48
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_15:
	mov	r4,#8
	mov	r3,#52
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_16:
	mov	r4,#9
	mov	r3,#56
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_17:
	mov	r4,#10
	mov	r3,#60
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_18:
	mov	r4,#11
	mov	r3,#64
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_19:
	mov	r4,#12
	mov	r3,#68
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_20:
	mov	r4,#13
	mov	r3,#72
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_21:
	mov	r4,#14
	mov	r3,#76
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_22:
	mov	r4,#15
	mov	r3,#80
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_23:
	mov	r4,#16
	mov	r3,#84
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_24:
	mov	r4,#17
	mov	r3,#88
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_25:
	mov	r4,#18
	mov	r3,#92
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_26:
	mov	r4,#19
	mov	r3,#96
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_27:
	mov	r4,#20
	mov	r3,#100
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_28:
	mov	r4,#21
	mov	r3,#104
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_29:
	mov	r4,#22
	mov	r3,#108
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_30:
	mov	r4,#23
	mov	r3,#112
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[sp,#-4]!
	bl	profile_n
	mov	r8,r4
.endif
eval_upd_31:
	mov	r4,#24
	mov	r3,#116
	b	eval_upd_n

.ifdef PROFILE
	.align
	add	lr,pc,#9
	str	lr,[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	lr,[sp],#4
	mov	pc,lr

gc_3:	bl	collect_2
	b	gc_r_3

	.thumb_func
empty_string:
	lao	r6,zero_length_string,0
	otoa	r6,zero_length_string,0
	ldr	lr,[sp],#4
	mov	pc,lr

.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	lr,[sp],#4
	mov	pc,lr

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	lr,[sp],#4
	mov	pc,lr

gc_5:	bl	collect_1
	b	r_gc_5

	.thumb_func
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
	.thumb_func
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
	.thumb_func
equal_string_eq:
	mov	r4,#1
	ldr	lr,[sp],#4
	mov	pc,lr
	.thumb_func
equal_string_ne:
	mov	r4,#0
	ldr	lr,[sp],#4
	mov	pc,lr

	.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
	.thumb_func
cmp_string_more:
	mov	r4,#1
	b	cmp_string_chars
	.thumb_func
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
	.thumb_func
cmp_string_chars:
	subs	r3,r3,#4
	bcs	cmp_string_1
	.thumb_func
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
	.thumb_func
cmp_string_eq:
	ldr	lr,[sp],#4
	mov	pc,lr
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
	.thumb_func
cmp_string_ne:
	bhi	cmp_string_r1
	mov	r4,#-1
	ldr	lr,[sp],#4
	mov	pc,lr
cmp_string_r1:
	mov	r4,#1
	ldr	lr,[sp],#4
	mov	pc,lr

	.section .text.string_to_string_node,"ax"
	.thumb_func
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

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
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"
	.thumb_func
int_array_to_node:
	ldr	r4,[r6,#-8]

	add	r12,r4,#3
	subs	r5,r5,r12
	blo	int_array_to_node_gc

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
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"
	.thumb_func
real_array_to_node:
	ldr	r4,[r6,#-8]

	add	r12,r4,#3+1
	subs	r5,r5,r12
	blo	real_array_to_node_gc

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

_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	lr,[sp],#4
	mov	pc,lr

_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	lr,[sp],#4
	mov	pc,lr

_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	lr,[sp],#4
	mov	pc,lr

@ r4: number of elements, r3: element descriptor
@ r2: element size, r1: element a size, a0:a_element-> a0: array

	.thumb_func
_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	lr,[sp],#4
	mov	pc,lr

_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	lr,[sp],#4
	mov	pc,lr

_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	lr,[sp],#4
	mov	pc,lr

_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	lr,[sp],#4
	mov	pc,lr

_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	lr,[sp],#4
	mov	pc,lr

_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	lr,[sp],#4
	mov	pc,lr

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

	.thumb_func
filli_array:
	str	r4,[r10]
	str	r4,[r10,#4]
	add	r10,r10,#8
	.thumb_func
st_filli_array:
	subs	r3,r3,#1
	bcs	filli_array

	ldr	lr,[sp],#4
	mov	pc,lr

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
	.thumb_func
fillr_array:
	str	r3,[r10]
	str	r7,[r10,#4]
	add	r10,r10,#8
	.thumb_func
st_fillr_array:
	subs	r4,r4,#1
	bcs	fillr_array

	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

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	lr,[sp],#4
	mov	pc,lr

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

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

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	lr,[sp],#4
	mov	pc,lr

del_args_3:
	subs	r5,r5,r4
	blo	del_args_gc
	.thumb_func
del_args_r_gc:
	str	r3,[r7]
	str	r10,[r7,#8]
	ldr	r8,[r6,#4]
	ldr	r6,[r6,#8]
	str	r8,[r7,#4]

	.thumb_func
del_args_copy_args:
	ldr	r8,[r6],#4
	str	r8,[r10],#4
	subs	r4,r4,#1
	bgt	del_args_copy_args

	ldr	lr,[sp],#4
	mov	pc,lr

	.thumb_func
del_args_gc:
	bl	collect_2
	b	del_args_r_gc

	.section .text.sin_real,"ax"
	.thumb_func
sin_real:
.ifdef SOFT_FP_CC
	vmov	r0,r1,d0
.endif
	bl	sin
.ifdef SOFT_FP_CC
	vmov	d0,r0,r1
.endif
	ldr	lr,[sp],#4
	mov	pc,lr

	.section .text.cos_real,"ax"
	.thumb_func
cos_real:
.ifdef SOFT_FP_CC
	vmov	r0,r1,d0
.endif
	bl	cos
.ifdef SOFT_FP_CC
	vmov	d0,r0,r1
.endif
	ldr	lr,[sp],#4
	mov	pc,lr

	.section .text.tan_real,"ax"
	.thumb_func
tan_real:
.ifdef SOFT_FP_CC
	vmov	r0,r1,d0
.endif
	bl	tan
.ifdef SOFT_FP_CC
	vmov	d0,r0,r1
.endif
	ldr	lr,[sp],#4
	mov	pc,lr

	.section .text.asin_real,"ax"	
	.thumb_func
asin_real:
.ifdef SOFT_FP_CC
	vmov	r0,r1,d0
.endif
	bl	asin
.ifdef SOFT_FP_CC
	vmov	d0,r0,r1
.endif
	ldr	lr,[sp],#4
	mov	pc,lr

	.section .text.acos_real,"ax"
	.thumb_func
acos_real:
.ifdef SOFT_FP_CC
	vmov	r0,r1,d0
.endif
	bl	acos
.ifdef SOFT_FP_CC
	vmov	d0,r0,r1
.endif
	ldr	lr,[sp],#4
	mov	pc,lr

	.section .text.atan_real,"ax"
	.thumb_func
atan_real:
.ifdef SOFT_FP_CC
	vmov	r0,r1,d0
.endif
	bl	atan
.ifdef SOFT_FP_CC
	vmov	d0,r0,r1
.endif
	ldr	lr,[sp],#4
	mov	pc,lr

	.section .text.ln_real,"ax"
	.thumb_func
ln_real:
.ifdef SOFT_FP_CC
	vmov	r0,r1,d0
.endif
	bl	log
.ifdef SOFT_FP_CC
	vmov	d0,r0,r1
.endif
	ldr	lr,[sp],#4
	mov	pc,lr

	.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	lr,[sp],#4
	mov	pc,lr

	.section .text.exp_real,"ax"
	.thumb_func
exp_real:
.ifdef SOFT_FP_CC
	vmov	r0,r1,d0
.endif
	bl	exp
.ifdef SOFT_FP_CC
	vmov	d0,r0,r1
.endif
	ldr	lr,[sp],#4
	mov	pc,lr

	.section .text.pow_real,"ax"
	.thumb_func
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	lr,[sp],#4
	mov	pc,lr

	.section .text.entier_real,"ax"
	.thumb_func
entier_real:
.ifdef SOFT_FP_CC
	vmov	r0,r1,d0
.endif
	bl	floor
.ifdef SOFT_FP_CC
	vmov	d0,r0,r1
.endif

	.thumb_func
r_to_i_real:
	vcvtr.s32.f64 s0,d0
	vmov	r4,s0
	ldr	lr,[sp],#4
	mov	pc,lr

	.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