summaryrefslogtreecommitdiff
path: root/thumb2mark.s
diff options
context:
space:
mode:
Diffstat (limited to 'thumb2mark.s')
-rw-r--r--thumb2mark.s2468
1 files changed, 2468 insertions, 0 deletions
diff --git a/thumb2mark.s b/thumb2mark.s
new file mode 100644
index 0000000..0ad6930
--- /dev/null
+++ b/thumb2mark.s
@@ -0,0 +1,2468 @@
+
+ZERO_ARITY_DESCRIPTOR_OFFSET = -4
+
+#undef COUNT_GARBAGE_COLLECTIONS
+#undef MARK_USING_REVERSAL
+#undef COMPARE_HEAP_AFTER_MARK
+#undef DEBUG_MARK_COLLECT
+
+ lao r12,heap_size_33,6
+ ldo r4,r12,heap_size_33,6
+ mov r3,#0
+
+@ heap_p3 in r0
+
+ lao r12,heap_p3,9
+ ldo r0,r12,heap_p3,9
+
+@ n_marked_words in r2
+
+ mov r2,#0
+
+ lsl r1,r4,#5
+@ heap_size_32_33 in r1
+ lao r12,heap_size_32_33,0
+ sto r1,r12,heap_size_32_33,0
+
+ lao r12,lazy_array_list,0
+ sto r3,r12,lazy_array_list,0
+
+ add r9,sp,#-2000
+
+ lao r12,caf_list,1
+ ldo r4,r12,caf_list,1
+
+ lao r12,end_stack,0
+@ end_stack in r11
+ mov r11,r9
+ sto r9,r12,end_stack,0
+
+ tst r4,r4
+ beq _end_mark_cafs
+
+_mark_cafs_lp:
+ ldr r3,[r4]
+ ldr r8,[r4,#-4]
+
+ str r8,[sp,#-4]!
+ add r8,r4,#4
+ add r12,r4,#4
+ add r4,r12,r3,lsl #2
+ lao r12,end_vector,0
+ sto r4,r12,end_vector,0
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _mark_stack_nodes
+
+ ldr r4,[sp],#4
+ tst r4,r4
+ bne _mark_cafs_lp
+
+_end_mark_cafs:
+ lao r12,stack_top,2
+ ldo r9,r12,stack_top,2
+ lao r12,stack_p,5
+ ldo r8,r12,stack_p,5
+
+ lao r12,end_vector,1
+ sto r9,r12,end_vector,1
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _mark_stack_nodes
+
+ lao r12,lazy_array_list,1
+ ldo r6,r12,lazy_array_list,1
+
+ cmp r6,#0
+ beq end_restore_arrays
+
+restore_arrays:
+ ldr r3,[r6]
+ laol r12,__ARRAY__+2,__ARRAY___o_2,16
+ otoa r12,__ARRAY___o_2,16
+ str r12,[r6]
+
+ cmp r3,#1
+ beq restore_array_size_1
+
+ add r7,r6,r3,lsl #2
+ ldr r4,[r7,#8]
+ cmp r4,#0
+ beq restore_lazy_array
+
+ ldrh r8,[r4,#-2+2]
+
+ neg r12,r8
+ and r12,r12,r8
+@ r12 contains lowest 1 bit of r8
+ clz r12,r12
+ rsb r12,r12,#31
+ lsr r8,r8,r12
+ lsr r3,r3,r12
+ sub r8,r8,#1
+ add r8,r8,r8
+ ldr r8,[pc,r8]
+ b skip_mod_inverse_table
+
+ .word 1
+ .word -1431655765
+ .word -858993459
+ .word -1227133513
+ .word 954437177
+ .word -1171354717
+ .word -991146299
+ .word -286331153
+ .word -252645135
+ .word 678152731
+ .word 1022611261
+ .word -373475417
+ .word -1030792151
+ .word 1749801491
+ .word 1332920885
+ .word -1108378657
+
+skip_mod_inverse_table:
+ mul r3,r8,r3
+
+restore_lazy_array:
+ ldr r10,[r6,#8]
+ ldr r8,[r6,#4]
+ str r3,[r6,#4]
+ ldr r9,[r7,#4]
+ str r4,[r6,#8]
+ str r8,[r7,#4]
+ str r10,[r7,#8]
+
+ cmp r4,#0
+ beq no_reorder_array
+
+ ldrh r7,[r4,#-2]
+ sub r7,r7,#256
+ ldrh r8,[r4,#-2+2]
+ cmp r8,r7
+ beq no_reorder_array
+
+ add r6,r6,#12
+ mul r3,r7,r3
+ mov r4,r7
+ add r7,r6,r3,lsl #2
+ mov r3,r8
+ sub r4,r4,r8
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl reorder
+
+no_reorder_array:
+ mov r6,r9
+ cmp r6,#0
+ bne restore_arrays
+
+ b end_restore_arrays
+
+restore_array_size_1:
+ ldr r8,[r6,#4]
+ ldr r7,[r6,#8]
+ str r3,[r6,#4]
+ ldr r4,[r6,#12]
+ str r8,[r6,#12]
+ str r4,[r6,#8]
+
+ mov r6,r7
+ tst r6,r6
+ bne restore_arrays
+
+end_restore_arrays:
+
+.ifdef FINALIZERS
+ lao r12,heap_vector,7
+ ldo r10,r12,heap_vector,7
+ lao r6,finalizer_list,2
+ lao r7,free_finalizer_list,4
+ otoa r6,finalizer_list,2
+ otoa r7,free_finalizer_list,4
+
+ ldr r8,[r6]
+determine_free_finalizers_after_mark:
+ laol r12,__Nil-4,__Nil_o_m4,4
+ otoa r12,__Nil_o_m4,4
+ cmp r8,r12
+ beq end_finalizers_after_mark
+
+ sub r4,r8,r0
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+ lsr r9,r4,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ beq finalizer_not_used_after_mark
+
+ add r6,r8,#4
+ ldr r8,[r8,#4]
+ b determine_free_finalizers_after_mark
+
+finalizer_not_used_after_mark:
+ str r8,[r7]
+ add r7,r8,#4
+
+ ldr r8,[r8,#4]
+ str r8,[r6]
+ b determine_free_finalizers_after_mark
+
+end_finalizers_after_mark:
+ str r8,[r7]
+.endif
+
+ str r2,[sp,#-4]!
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl add_garbage_collect_time
+
+ ldr r2,[sp],#4
+
+.ifdef ADJUST_HEAP_SIZE
+ lao r12,bit_vector_size,3
+ ldo r4,r12,bit_vector_size,3
+.else
+ lao r12,heap_size_33,7
+ ldo r4,r12,heap_size_33,7
+ lsl r4,r4,#3
+.endif
+
+.ifdef ADJUST_HEAP_SIZE
+ lao r12,n_allocated_words,7
+ ldo r10,r12,n_allocated_words,7
+ add r10,r10,r2
+ lsl r10,r10,#2
+
+ lsl r9,r4,#2
+
+ str r7,[sp,#-4]!
+ str r4,[sp,#-4]!
+
+ lao r12,heap_size_multiple,3
+ ldo r12,r12,heap_size_multiple,3
+ umull r4,r7,r12,r10
+ lsr r4,r4,#8
+ orr r4,r4,r7,lsl #32-8
+ lsr r7,r7,#8
+
+ mov r3,r4
+ cmp r7,#0
+
+ ldr r4,[sp],#4
+ ldr r7,[sp],#4
+
+ beq not_largest_heap
+
+ lao r12,heap_size_33,8
+ ldo r3,r12,heap_size_33,8
+ lsl r3,r3,#5
+
+not_largest_heap:
+ cmp r3,r9
+ bls no_larger_heap
+
+ lao r12,heap_size_33,9
+ ldo r9,r12,heap_size_33,9
+ lsl r9,r9,#5
+ cmp r3,r9
+ bls not_larger_then_heap
+ mov r3,r9
+not_larger_then_heap:
+ lsr r4,r3,#2
+ lao r12,bit_vector_size,4
+ sto r4,r12,bit_vector_size,4
+no_larger_heap:
+.endif
+ mov r8,r4
+
+ lao r12,heap_vector,8
+ ldo r10,r12,heap_vector,8
+
+ lsr r8,r8,#5
+
+ tst r4,#31
+ beq no_extra_word
+
+ mov r12,#0
+ str r12,[r10,r8,lsl #2]
+
+no_extra_word:
+ sub r4,r4,r2
+ lsl r4,r4,#2
+ lao r12,n_last_heap_free_bytes,2
+ sto r4,r12,n_last_heap_free_bytes,2
+
+ lao r12,flags,15
+ ldo r12,r12,flags,15
+ tst r12,#2
+ beq _no_heap_use_message2
+
+ str r2,[sp,#-4]!
+
+ lao r0,marked_gc_string_1,0
+ otoa r0,marked_gc_string_1,0
+ bl ew_print_string
+
+ ldr r2,[sp]
+ lsl r0,r2,#2
+ bl ew_print_int
+
+ lao r0,heap_use_after_gc_string_2,1
+ otoa r0,heap_use_after_gc_string_2,1
+ bl ew_print_string
+
+ ldr r2,[sp],#4
+
+_no_heap_use_message2:
+
+.ifdef FINALIZERS
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl call_finalizers
+.endif
+
+ lao r12,n_allocated_words,8
+ ldo r9,r12,n_allocated_words,8
+ mov r3,#0
+
+@ n_free_words_after_mark in r2
+ mov r6,r10
+ mov r2,#0
+
+_scan_bits:
+ ldr r12,[r6]
+ cmp r3,r12
+ beq _zero_bits
+ str r3,[r6],#4
+ subs r8,r8,#1
+ bne _scan_bits
+
+ lao r12,n_free_words_after_mark,5
+ sto r2,r12,n_free_words_after_mark,5
+ b _end_scan
+
+_zero_bits:
+ add r7,r6,#4
+ add r6,r6,#4
+ subs r8,r8,#1
+ bne _skip_zero_bits_lp1
+
+ lao r12,n_free_words_after_mark,6
+ sto r2,r12,n_free_words_after_mark,6
+ b _end_bits
+
+_skip_zero_bits_lp:
+ cmp r4,#0
+ bne _end_zero_bits
+_skip_zero_bits_lp1:
+ ldr r4,[r6],#4
+ subs r8,r8,#1
+ bne _skip_zero_bits_lp
+
+ lao r12,n_free_words_after_mark,7
+ sto r2,r12,n_free_words_after_mark,7
+
+ cmp r4,#0
+ beq _end_bits
+ mov r4,r6
+ str r3,[r6,#-4]
+ subs r4,r4,r7
+ b _end_bits2
+
+_end_zero_bits:
+ sub r4,r6,r7
+ lsl r4,r4,#3
+ add r2,r2,r4
+ str r3,[r6,#-4]
+
+ cmp r4,r9
+ blo _scan_bits
+
+@ n_free_words_after_mark updated
+_found_free_memory:
+ lao r12,n_free_words_after_mark,8
+ sto r2,r12,n_free_words_after_mark,8
+ lao r12,bit_counter,3
+ sto r8,r12,bit_counter,3
+ lao r12,bit_vector_p,2
+ sto r6,r12,bit_vector_p,2
+
+ sub r5,r4,r9
+
+ add r3,r7,#-4
+ sub r3,r3,r10
+ lsl r3,r3,#5
+ lao r12,heap_p3,10
+ ldo r10,r12,heap_p3,10
+ add r10,r10,r3
+
+ lao r12,stack_top,3
+ ldo r9,r12,stack_top,3
+
+ add r3,r10,r4,lsl #2
+ lao r12,heap_end_after_gc,11
+ sto r3,r12,heap_end_after_gc,11
+
+ ldmia sp!,{r0-r4,pc}
+
+@ n_free_words_after_mark updated
+_end_bits:
+ sub r4,r6,r7
+ add r4,r4,#4
+_end_bits2:
+ lsl r4,r4,#3
+ add r2,r2,r4
+
+ cmp r4,r9
+ bhs _found_free_memory
+
+ lao r12,n_free_words_after_mark,9
+ sto r2,r12,n_free_words_after_mark,9
+
+@ n_free_words_after_mark updated
+_end_scan:
+ lao r12,bit_counter,4
+ sto r8,r12,bit_counter,4
+ b compact_gc
+
+.ifdef PIC
+ lto heap_size_33,6
+ lto heap_p3,9
+ lto heap_size_32_33,0
+ lto lazy_array_list,0
+ lto caf_list,1
+ lto end_stack,0
+ lto end_vector,0
+ lto stack_top,2
+ lto stack_p,5
+ lto end_vector,1
+ lto lazy_array_list,1
+ ltol __ARRAY__+2,__ARRAY___o_2,16
+.ifdef FINALIZERS
+ lto heap_vector,7
+ lto finalizer_list,2
+ lto free_finalizer_list,4
+ ltol __Nil-4,__Nil_o_m4,4
+.endif
+.ifdef ADJUST_HEAP_SIZE
+ lto bit_vector_size,3
+.else
+ lto heap_size_33,7
+.endif
+.ifdef ADJUST_HEAP_SIZE
+ lto n_allocated_words,7
+ lto heap_size_multiple,3
+ lto heap_size_33,8
+ lto heap_size_33,9
+ lto bit_vector_size,4
+.endif
+ lto heap_vector,8
+ lto n_last_heap_free_bytes,2
+ lto flags,15
+ lto marked_gc_string_1,0
+ lto heap_use_after_gc_string_2,1
+ lto n_allocated_words,8
+ lto n_free_words_after_mark,5
+ lto n_free_words_after_mark,6
+ lto n_free_words_after_mark,7
+ lto n_free_words_after_mark,8
+ lto bit_counter,3
+ lto bit_vector_p,2
+ lto heap_p3,10
+ lto stack_top,3
+ lto heap_end_after_gc,11
+ lto n_free_words_after_mark,9
+ lto bit_counter,4
+.endif
+ .ltorg
+
+@ a2: pointer to stack element
+@ a4: heap_vector
+@ d0,d1,a0,a1,a3: free
+
+_mark_stack_nodes:
+ lao r12,end_vector,2
+ ldo r12,r12,end_vector,2
+ cmp r8,r12
+ beq _end_mark_nodes
+_mark_stack_nodes_:
+ ldr r6,[r8],#4
+
+ sub r7,r6,r0
+ cmp r7,r1
+ bcs _mark_stack_nodes
+
+ lsr r3,r7,#7
+ and r7,r7,#31*4
+ lsr r9,r7,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _mark_stack_nodes
+
+ str r8,[sp,#-4]!
+
+.ifdef MARK_USING_REVERSAL
+ mov r9,#1
+ b __mark_node
+
+__end_mark_using_reversal:
+ ldr r8,[sp],#4
+ str r6,[r8,#-4]
+ b _mark_stack_nodes
+.else
+ mov r12,#0
+ str r12,[sp,#-4]!
+
+ b _mark_arguments
+
+_mark_hnf_2:
+ cmp r9,#0x20000000
+ bls fits_in_word_6
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_6:
+ add r2,r2,#3
+
+_mark_record_2_c:
+ ldr r3,[r6,#4]
+ str r3,[sp,#-4]!
+
+ cmp sp,r11
+ blo __mark_using_reversal
+
+_mark_node2:
+_shared_argument_part:
+ ldr r6,[r6]
+
+_mark_node:
+ sub r7,r6,r0
+ cmp r7,r1
+ bcs _mark_next_node
+
+ lsr r3,r7,#7
+ and r7,r7,#31*4
+ lsr r9,r7,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _mark_next_node
+
+_mark_arguments:
+ ldr r4,[r6]
+ tst r4,#2
+ beq _mark_lazy_node
+
+ ldrh r8,[r4,#-2]
+
+ cmp r8,#0
+ beq _mark_hnf_0
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ add r6,r6,#4
+
+ cmp r8,#256
+ bhs _mark_record
+
+ subs r8,r8,#2
+ beq _mark_hnf_2
+ blo _mark_hnf_1
+
+_mark_hnf_3:
+ ldr r7,[r6,#4]
+
+ cmp r9,#0x20000000
+ bls fits_in_word_1
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_1:
+
+ sub r4,r7,r0
+ add r2,r2,#3
+
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+
+ lsr r9,r4,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _shared_argument_part
+
+_no_shared_argument_part:
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ add r8,r8,#1
+
+ add r2,r2,r8
+ add r4,r4,r8,lsl #2
+ add r12,r7,#-4
+ add r7,r12,r8,lsl #2
+
+ cmp r4,#32*4
+ bls fits_in_word_2
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_2:
+
+ ldr r3,[r7]
+ sub r8,r8,#2
+ str r3,[sp,#-4]!
+
+_push_hnf_args:
+ ldr r3,[r7,#-4]!
+ str r3,[sp,#-4]!
+ subs r8,r8,#1
+ bge _push_hnf_args
+
+ cmp sp,r11
+ bhs _mark_node2
+
+ b __mark_using_reversal
+
+_mark_hnf_1:
+ cmp r9,#0x40000000
+ bls fits_in_word_4
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_4:
+ add r2,r2,#2
+ ldr r6,[r6]
+ b _mark_node
+
+_mark_lazy_node_1:
+ add r6,r6,#4
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ cmp r9,#0x20000000
+ bls fits_in_word_3
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_3:
+ add r2,r2,#3
+
+ cmp r8,#1
+ beq _mark_node2
+
+_mark_selector_node_1:
+ cmp r8,#-2
+ ldr r7,[r6]
+ beq _mark_indirection_node
+
+ sub r9,r7,r0
+
+ lsr r3,r9,#7
+ and r9,r9,#31*4
+
+ cmp r8,#-3
+
+ lsr r9,r9,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ble _mark_record_selector_node_1
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _mark_node3
+
+ ldr r8,[r7]
+ tst r8,#2
+ beq _mark_node3
+
+ ldrh r12,[r8,#-2]
+ cmp r12,#2
+ bls _small_tuple_or_record
+
+_large_tuple_or_record:
+ ldr r8,[r7,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ bne _mark_node3
+
+ lao r8,e__system__nind,11
+.ifdef PIC
+ add r12,r4,#-8+4
+.endif
+ ldr r4,[r4,#-8]
+ otoa r8,e__system__nind,11
+ str r8,[r6,#-4]
+ mov r8,r6
+
+.ifdef PIC
+ ldrh r4,[r12,r4]
+.else
+ ldrh r4,[r4,#4]
+.endif
+ cmp r4,#8
+ blt _mark_tuple_selector_node_1
+ ldr r7,[r7,#8]
+ beq _mark_tuple_selector_node_2
+ add r12,r4,#-12
+ ldr r6,[r7,r12]
+ str r6,[r8]
+ b _mark_node
+
+_mark_tuple_selector_node_2:
+ ldr r6,[r7]
+ str r6,[r8]
+ b _mark_node
+
+_small_tuple_or_record:
+ lao r8,e__system__nind,12
+.ifdef PIC
+ add r12,r4,#-8+4
+.endif
+ ldr r4,[r4,#-8]
+ otoa r8,e__system__nind,12
+ str r8,[r6,#-4]
+ mov r8,r6
+
+.ifdef PIC
+ ldrh r4,[r12,r4]
+.else
+ ldrh r4,[r4,#4]
+.endif
+_mark_tuple_selector_node_1:
+ ldr r6,[r7,r4]
+ str r6,[r8]
+ b _mark_node
+
+_mark_record_selector_node_1:
+ beq _mark_strict_record_selector_node_1
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _mark_node3
+
+ ldr r8,[r7]
+ tst r8,#2
+ beq _mark_node3
+
+ ldrh r12,[r8,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls _small_tuple_or_record
+
+ ldr r8,[r7,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ bne _mark_node3
+
+ lao r8,e__system__nind,13
+.ifdef PIC
+ add r12,r4,#-8+4
+.endif
+ ldr r4,[r4,#-8]
+ otoa r8,e__system__nind,13
+ str r8,[r6,#-4]
+ mov r8,r6
+
+.ifdef PIC
+ ldrh r4,[r12,r4]
+.else
+ ldrh r4,[r4,#4]
+.endif
+ cmp r4,#8
+ ble _mark_record_selector_node_2
+ ldr r7,[r7,#8]
+ sub r4,r4,#12
+_mark_record_selector_node_2:
+ ldr r6,[r7,r4]
+
+ str r6,[r8]
+ b _mark_node
+
+_mark_strict_record_selector_node_1:
+ ldr r12,[r10,r3,lsl #2]
+ tst r9,r12
+ bne _mark_node3
+
+ ldr r8,[r7]
+ tst r8,#2
+ beq _mark_node3
+
+ ldrh r12,[r8,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls _select_from_small_record
+
+ ldr r8,[r7,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ bne _mark_node3
+
+_select_from_small_record:
+.ifdef PIC
+ ldr r12,[r4,#-8]
+ add r4,r4,#-8+4
+.else
+ ldr r4,[r4,#-8]
+.endif
+
+ sub r6,r6,#4
+
+.ifdef PIC
+ ldrh r3,[r4,r12]!
+.else
+ ldrh r3,[r4,#4]
+.endif
+ cmp r3,#8
+ ble _mark_strict_record_selector_node_2
+ ldr r12,[r7,#8]
+ add r3,r3,r12
+ ldr r3,[r3,#-12]
+ b _mark_strict_record_selector_node_3
+_mark_strict_record_selector_node_2:
+ ldr r3,[r7,r3]
+_mark_strict_record_selector_node_3:
+ str r3,[r6,#4]
+.ifdef PIC
+ ldrh r3,[r4,#6-4]
+.else
+ ldrh r3,[r4,#6]
+.endif
+ tst r3,r3
+ beq _mark_strict_record_selector_node_5
+ cmp r3,#8
+ ble _mark_strict_record_selector_node_4
+ ldr r7,[r7,#8]
+ sub r3,r3,#12
+_mark_strict_record_selector_node_4:
+ ldr r3,[r7,r3]
+ str r3,[r6,#8]
+_mark_strict_record_selector_node_5:
+
+.ifdef PIC
+ ldr r4,[r4,#-4-4]
+.else
+ ldr r4,[r4,#-4]
+.endif
+ str r4,[r6]
+ b _mark_next_node
+
+_mark_indirection_node:
+_mark_node3:
+ mov r6,r7
+ b _mark_node
+
+_mark_next_node:
+ ldr r6,[sp],#4
+ tst r6,r6
+ bne _mark_node
+
+ lao r12,end_vector,3
+ ldr r8,[sp],#4
+ ldo r12,r12,end_vector,3
+ cmp r8,r12
+ bne _mark_stack_nodes_
+
+_end_mark_nodes:
+ ldr pc,[sp],#4
+
+_mark_lazy_node:
+ ldr r8,[r4,#-4]
+ tst r8,r8
+ beq _mark_real_or_file
+
+ cmp r8,#1
+ ble _mark_lazy_node_1
+
+ cmp r8,#256
+ bge _mark_closure_with_unboxed_arguments
+ add r8,r8,#1
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+
+ add r2,r2,r8
+ add r7,r7,r8,lsl #2
+ add r6,r6,r8,lsl #2
+
+ cmp r7,#32*4
+ bls fits_in_word_7
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits_in_word_7:
+ sub r8,r8,#3
+_push_lazy_args:
+ ldr r3,[r6,#-4]!
+ str r3,[sp,#-4]!
+ subs r8,r8,#1
+ bge _push_lazy_args
+
+ sub r6,r6,#4
+
+ cmp sp,r11
+ bhs _mark_node2
+
+ b __mark_using_reversal
+
+_mark_closure_with_unboxed_arguments:
+ mov r4,r8
+ and r8,r8,#255
+ subs r8,r8,#1
+ beq _mark_real_or_file
+
+ lsr r4,r4,#8
+ add r8,r8,#2
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ add r2,r2,r8
+ add r7,r7,r8,lsl #2
+
+ sub r8,r8,r4
+
+ cmp r7,#32*4
+ bls fits_in_word_7_
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits_in_word_7_:
+ subs r8,r8,#2
+ blt _mark_next_node
+
+ add r12,r6,#8
+ add r6,r12,r8,lsl #2
+ bne _push_lazy_args
+
+_mark_closure_with_one_boxed_argument:
+ ldr r6,[r6,#-4]
+ b _mark_node
+
+_mark_hnf_0:
+ laol r12,INT+2,INT_o_2,7
+ otoa r12,INT_o_2,7
+ cmp r4,r12
+ blo _mark_real_file_or_string
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+
+ laol r12,CHAR+2,CHAR_o_2,3
+ otoa r12,CHAR_o_2,3
+ cmp r4,r12
+ bhi _mark_normal_hnf_0
+
+_mark_bool:
+ add r2,r2,#2
+
+ cmp r9,#0x40000000
+ bls _mark_next_node
+
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+ b _mark_next_node
+
+_mark_normal_hnf_0:
+ add r2,r2,#1
+ b _mark_next_node
+
+_mark_real_file_or_string:
+ laol r12,__STRING__+2,__STRING___o_2,8
+ otoa r12,__STRING___o_2,8
+ cmp r4,r12
+ bls _mark_string_or_array
+
+_mark_real_or_file:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ add r2,r2,#3
+
+ cmp r9,#0x20000000
+ bls _mark_next_node
+
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+ b _mark_next_node
+
+_mark_record:
+ mov r12,#258/2
+ subs r8,r8,r12,lsl #1
+ beq _mark_record_2
+ blt _mark_record_1
+
+_mark_record_3:
+ add r2,r2,#3
+
+ cmp r9,#0x20000000
+ bls fits_in_word_13
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits_in_word_13:
+ ldr r7,[r6,#4]
+
+ ldrh r3,[r4,#-2+2]
+ sub r9,r7,r0
+
+ lsr r4,r9,#7
+ and r9,r9,#31*4
+
+ subs r3,r3,#1
+
+ lsr r7,r9,#2
+ mov r12,#1
+ lsl r7,r12,r7
+
+ blo _mark_record_3_bb
+
+ ldr r12,[r10,r4,lsl #2]
+ tst r7,r12
+ bne _mark_node2
+
+ add r8,r8,#1
+ ldr r12,[r10,r4,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r4,lsl #2]
+ add r2,r2,r8
+ add r9,r9,r8,lsl #2
+
+ cmp r9,#32*4
+ bls _push_record_arguments
+ add r12,r10,#4
+ ldr r7,[r12,r4,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r4,lsl #2]
+_push_record_arguments:
+ ldr r7,[r6,#4]
+ mov r8,r3
+ lsl r3,r3,#2
+ add r7,r7,r3
+ subs r8,r8,#1
+ bge _push_hnf_args
+
+ b _mark_node2
+
+_mark_record_3_bb:
+ ldr r12,[r10,r4,lsl #2]
+ tst r7,r12
+ bne _mark_next_node
+
+ add r8,r8,#1
+ ldr r12,[r10,r4,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r4,lsl #2]
+ add r2,r2,r8
+ add r9,r9,r8,lsl #2
+
+ cmp r9,#32*4
+ bls _mark_next_node
+
+ add r12,r10,#4
+ ldr r7,[r12,r4,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r4,lsl #2]
+ b _mark_next_node
+
+_mark_record_2:
+ cmp r9,#0x20000000
+ bls fits_in_word_12
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits_in_word_12:
+ add r2,r2,#3
+
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#1
+ bhi _mark_record_2_c
+ beq _mark_node2
+ b _mark_next_node
+
+_mark_record_1:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#0
+ bne _mark_hnf_1
+
+ b _mark_bool
+
+_mark_string_or_array:
+ beq _mark_string_
+
+_mark_array:
+ ldr r8,[r6,#8]
+ cmp r8,#0
+ beq _mark_lazy_array
+
+ ldrh r4,[r8,#-2]
+
+ cmp r4,#0
+ beq _mark_strict_basic_array
+
+ ldrh r8,[r8,#-2+2]
+ cmp r8,#0
+ beq _mark_b_record_array
+
+ cmp sp,r11
+ blo _mark_array_using_reversal
+
+ sub r4,r4,#256
+ cmp r4,r8
+ beq _mark_a_record_array
+
+_mark_ab_record_array:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ ldr r8,[r6,#4]
+
+ mul r4,r8,r4
+ add r4,r4,#3
+
+ add r2,r2,r4
+ add r12,r6,#-4
+ add r4,r12,r4,lsl #2
+
+ sub r4,r4,r0
+ lsr r4,r4,#7
+
+ cmp r3,r4
+ bhs _end_set_ab_array_bits
+
+ add r3,r3,#1
+ mov r8,#1
+ cmp r3,r4
+ bhs _last_ab_array_bits
+
+_mark_ab_array_lp:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r4
+ blo _mark_ab_array_lp
+
+_last_ab_array_bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+
+_end_set_ab_array_bits:
+ ldr r4,[r6,#4]
+ ldr r7,[r6,#8]
+ ldrh r3,[r7,#-2+2]
+ ldrh r7,[r7,#-2]
+ lsl r3,r3,#2
+ sub r7,r7,#256
+ lsl r7,r7,#2
+ str r3,[sp,#-4]!
+ str r7,[sp,#-4]!
+ add r8,r6,#12
+
+ lao r12,end_vector,4
+ ldo r12,r12,end_vector,4
+ str r12,[sp,#-4]!
+ b _mark_ab_array_begin
+
+_mark_ab_array:
+ ldr r3,[sp,#8]
+ str r4,[sp,#-4]!
+ str r8,[sp,#-4]!
+ add r4,r8,r3
+
+ lao r12,end_vector,5
+ sto r4,r12,end_vector,5
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _mark_stack_nodes
+
+ ldr r3,[sp,#4+8]
+ ldr r8,[sp],#4
+ ldr r4,[sp],#4
+ add r8,r8,r3
+_mark_ab_array_begin:
+ subs r4,r4,#1
+ bcs _mark_ab_array
+
+ ldr r6,[sp]
+ lao r12,end_vector,6
+ sto r6,r12,end_vector,6
+ add sp,sp,#12
+ b _mark_next_node
+
+_mark_a_record_array:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ ldr r8,[r6,#4]
+
+ mul r4,r8,r4
+ str r4,[sp,#-4]!
+
+ add r4,r4,#3
+
+ add r2,r2,r4
+ add r12,r6,#-4
+ add r4,r12,r4,lsl #2
+
+ sub r4,r4,r0
+ lsr r4,r4,#7
+
+ cmp r3,r4
+ bhs _end_set_a_array_bits
+
+ add r3,r3,#1
+ mov r8,#1
+ cmp r3,r4
+ bhs _last_a_array_bits
+
+_mark_a_array_lp:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r4
+ blo _mark_a_array_lp
+
+_last_a_array_bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+
+_end_set_a_array_bits:
+ ldr r4,[sp],#4
+ add r8,r6,#12
+
+ lao r12,end_vector,7
+ ldo r12,r12,end_vector,7
+ str r12,[sp,#-4]!
+ add r12,r6,#12
+ add r4,r12,r4,lsl #2
+
+ lao r12,end_vector,8
+ sto r4,r12,end_vector,8
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _mark_stack_nodes
+
+ ldr r6,[sp],#4
+ lao r12,end_vector,9
+ sto r6,r12,end_vector,9
+ b _mark_next_node
+
+_mark_lazy_array:
+ cmp sp,r11
+ blo _mark_array_using_reversal
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+ ldr r4,[r6,#4]
+
+ add r4,r4,#3
+
+ add r2,r2,r4
+ add r12,r6,#-4
+ add r4,r12,r4,lsl #2
+
+ sub r4,r4,r0
+ lsr r4,r4,#7
+
+ cmp r3,r4
+ bhs _end_set_lazy_array_bits
+
+ add r3,r3,#1
+ mov r8,#1
+ cmp r3,r4
+ bhs _last_lazy_array_bits
+
+_mark_lazy_array_lp:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r4
+ blo _mark_lazy_array_lp
+
+_last_lazy_array_bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+
+_end_set_lazy_array_bits:
+ ldr r4,[r6,#4]
+ add r8,r6,#12
+
+ lao r12,end_vector,10
+ ldo r12,r12,end_vector,10
+ str r12,[sp,#-4]!
+ add r12,r6,#12
+ add r4,r12,r4,lsl #2
+
+ lao r12,end_vector,11
+ sto r4,r12,end_vector,11
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl _mark_stack_nodes
+
+ ldr r6,[sp],#4
+ lao r12,end_vector,12
+ sto r6,r12,end_vector,12
+ b _mark_next_node
+
+_mark_array_using_reversal:
+ mov r12,#0
+ str r12,[sp,#-4]!
+ mov r9,#1
+ b __mark_node
+
+_mark_strict_basic_array:
+ ldr r4,[r6,#4]
+ laol r12,INT+2,INT_o_2,8
+ otoa r12,INT_o_2,8
+ cmp r8,r12
+ beq _mark_strict_int_array
+ laol r12,BOOL+2,BOOL_o_2,5
+ otoa r12,BOOL_o_2,5
+ cmp r8,r12
+ beq _mark_strict_bool_array
+_mark_strict_real_array:
+ add r4,r4,r4
+_mark_strict_int_array:
+ add r4,r4,#3
+ b _mark_basic_array_
+_mark_strict_bool_array:
+ add r4,r4,#12+3
+ lsr r4,r4,#2
+ b _mark_basic_array_
+
+_mark_b_record_array:
+ ldr r8,[r6,#4]
+ sub r4,r4,#256
+ mul r4,r8,r4
+ add r4,r4,#3
+ b _mark_basic_array_
+
+_mark_string_:
+ ldr r4,[r6,#4]
+ add r4,r4,#8+3
+ lsr r4,r4,#2
+
+_mark_basic_array_:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r3,lsl #2]
+
+ add r2,r2,r4
+ add r12,r6,#-4
+ add r4,r12,r4,lsl #2
+
+ sub r4,r4,r0
+ lsr r4,r4,#7
+
+ cmp r3,r4
+ bhs _mark_next_node
+
+ add r3,r3,#1
+ mov r8,#1
+ cmp r3,r4
+ bhs _last_string_bits
+
+_mark_string_lp:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r4
+ blo _mark_string_lp
+
+_last_string_bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ b _mark_next_node
+
+__end_mark_using_reversal:
+ ldr r7,[sp],#4
+ tst r7,r7
+ beq _mark_next_node
+ str r6,[r7]
+ b _mark_next_node
+.endif
+
+.ifdef PIC
+ lto end_vector,2
+ lto e__system__nind,11
+ lto e__system__nind,12
+ lto e__system__nind,13
+ lto end_vector,3
+ ltol INT+2,INT_o_2,7
+ ltol CHAR+2,CHAR_o_2,3
+ ltol __STRING__+2,__STRING___o_2,8
+ lto end_vector,4
+ lto end_vector,5
+ lto end_vector,6
+ lto end_vector,7
+ lto end_vector,8
+ lto end_vector,9
+ lto end_vector,10
+ lto end_vector,11
+ lto end_vector,12
+ ltol INT+2,INT_o_2,8
+ ltol BOOL+2,BOOL_o_2,5
+.endif
+ .ltorg
+
+__mark_using_reversal:
+ str r6,[sp,#-4]!
+ mov r9,#1
+ ldr r6,[r6]
+ b __mark_node
+
+__mark_arguments:
+ ldr r4,[r6]
+ tst r4,#2
+ beq __mark_lazy_node
+
+ ldrh r8,[r4,#-2]
+ tst r8,r8
+ beq __mark_hnf_0
+
+ add r6,r6,#4
+
+ cmp r8,#256
+ bhs __mark__record
+
+ subs r8,r8,#2
+ beq __mark_hnf_2
+ blo __mark_hnf_1
+
+__mark_hnf_3:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+
+ cmp r7,#0x20000000
+ bls fits__in__word__1
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in__word__1:
+ ldr r12,[r6,#4]
+ sub r4,r12,r0
+
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+
+ lsr r7,r4,#2
+ mov r12,#1
+ lsl r7,r12,r7
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r7,r12
+ bne __shared_argument_part
+
+__no_shared_argument_part:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ ldr r7,[r6,#4]
+
+ add r8,r8,#1
+ str r9,[r6,#4]
+
+ add r2,r2,r8
+ add r6,r6,#4
+
+ lsl r8,r8,#2
+ ldr r12,[r7]
+ orr r12,r12,#1
+ str r12,[r7]
+
+ add r4,r4,r8
+ add r7,r7,r8
+
+ cmp r4,#32*4
+ bls fits__in__word__2
+ add r12,r10,#4
+ ldr r9,[r12,r3,lsl #2]
+ orr r9,r9,#1
+ str r9,[r12,r3,lsl #2]
+fits__in__word__2:
+
+ ldr r8,[r7,#-4]
+ str r6,[r7,#-4]
+ add r9,r7,#-4
+ mov r6,r8
+ b __mark_node
+
+__mark_hnf_1:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#2
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x40000000
+ bls __shared_argument_part
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+__shared_argument_part:
+ ldr r8,[r6]
+ str r9,[r6]
+ add r9,r6,#2
+ mov r6,r8
+ b __mark_node
+
+__mark_no_selector_2:
+ ldr r3,[sp],#4
+__mark_no_selector_1:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x20000000
+ bls __shared_argument_part
+
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+ b __shared_argument_part
+
+__mark_lazy_node_1:
+ beq __mark_no_selector_1
+
+__mark_selector_node_1:
+ cmp r8,#-2
+ beq __mark_indirection_node
+
+ cmp r8,#-3
+
+ str r3,[sp,#-4]!
+ ldr r8,[r6]
+ str r4,[sp,#-4]!
+
+ ble __mark_record_selector_node_1
+
+ sub r4,r8,r0
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+ lsr r4,r4,#2
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r4,r12
+ ldr r4,[sp],#4
+ bne __mark_no_selector_2
+
+ ldr r3,[r8]
+ tst r3,#2
+ beq __mark_no_selector_2
+
+ ldrh r12,[r3,#-2]
+ cmp r12,#2
+ bls __small_tuple_or_record
+
+__large_tuple_or_record:
+ ldr r8,[r8,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ bne __mark_no_selector_2
+
+.ifdef PIC
+ ldr r12,[r4,#-8]
+ add r4,r4,#-8+4
+.else
+ ldr r4,[r4,#-8]
+.endif
+ lao r8,e__system__nind,14
+ ldr r7,[r6]
+ otoa r8,e__system__nind,14
+ str r8,[r6,#-4]
+ mov r8,r6
+
+ ldr r3,[sp],#4
+
+.ifdef PIC
+ ldrh r4,[r4,r12]
+.else
+ ldrh r4,[r4,#4]
+.endif
+ cmp r4,#8
+ blt __mark_tuple_selector_node_1
+ ldr r7,[r7,#8]
+ beq __mark_tuple_selector_node_2
+ sub r4,r4,#12
+ ldr r6,[r7,r4]
+ str r6,[r8]
+ b __mark_node
+
+__mark_tuple_selector_node_2:
+ ldr r6,[r7]
+ str r6,[r8]
+ b __mark_node
+
+__small_tuple_or_record:
+.ifdef PIC
+ ldr r12,[r4,#-8]
+ add r4,r4,#-8+4
+.else
+ ldr r4,[r4,#-8]
+.endif
+ lao r8,e__system__nind,15
+ ldr r7,[r6]
+ otoa r8,e__system__nind,15
+ str r8,[r6,#-4]
+ mov r8,r6
+
+ ldr r3,[sp],#4
+
+.ifdef PIC
+ ldrh r4,[r4,r12]
+.else
+ ldrh r4,[r4,#4]
+.endif
+__mark_tuple_selector_node_1:
+ ldr r6,[r7,r4]
+ str r6,[r8]
+ b __mark_node
+
+__mark_record_selector_node_1:
+ beq __mark_strict_record_selector_node_1
+
+ sub r4,r8,r0
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+ lsr r4,r4,#2
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r4,r12
+ ldr r4,[sp],#4
+ bne __mark_no_selector_2
+
+ ldr r3,[r8]
+ tst r3,#2
+ beq __mark_no_selector_2
+
+ ldrh r12,[r3,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls __small_record
+
+ ldr r8,[r8,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ bne __mark_no_selector_2
+
+__small_record:
+.ifdef PIC
+ ldr r12,[r4,#-8]
+ add r4,r4,#-8+4
+.else
+ ldr r4,[r4,#-8]
+.endif
+ lao r8,e__system__nind,16
+ ldr r7,[r6]
+ otoa r8,e__system__nind,16
+ str r8,[r6,#-4]
+ mov r8,r6
+
+ ldr r3,[sp],#4
+
+.ifdef PIC
+ ldrh r4,[r4,r12]
+.else
+ ldrh r4,[r4,#4]
+.endif
+ cmp r4,#8
+ ble __mark_record_selector_node_2
+ ldr r7,[r7,#8]
+ sub r4,r4,#12
+__mark_record_selector_node_2:
+ ldr r6,[r7,r4]
+
+ str r6,[r8]
+ b __mark_node
+
+__mark_strict_record_selector_node_1:
+ sub r4,r8,r0
+ lsr r3,r4,#7
+ and r4,r4,#31*4
+ lsr r4,r4,#2
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r4,r12
+ ldr r4,[sp],#4
+ bne __mark_no_selector_2
+
+ ldr r3,[r8]
+ tst r3,#2
+ beq __mark_no_selector_2
+
+ ldrh r12,[r3,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ ble __select_from_small_record
+
+ ldr r8,[r8,#8]
+ sub r8,r8,r0
+ lsr r3,r8,#7
+ and r8,r8,#31*4
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ bne __mark_no_selector_2
+
+__select_from_small_record:
+.ifdef PIC
+ ldr r4,[r4,#-8]
+ add r12,r4,#-8+4
+.else
+ ldr r4,[r4,#-8]
+.endif
+ ldr r7,[r6]
+ ldr r3,[sp],#4
+ sub r6,r6,#4
+
+.ifdef PIC
+ ldrh r3,[r4,r12]!
+.else
+ ldrh r3,[r4,#4]
+.endif
+ cmp r3,#8
+ ble __mark_strict_record_selector_node_2
+ ldr r12,[r7,#8]
+ add r3,r3,r12
+ ldr r3,[r3,#-12]
+ b __mark_strict_record_selector_node_3
+__mark_strict_record_selector_node_2:
+ ldr r3,[r7,r3]
+__mark_strict_record_selector_node_3:
+ str r3,[r6,#4]
+
+.ifdef PIC
+ ldrh r3,[r4,#6-4]
+.else
+ ldrh r3,[r4,#6]
+.endif
+ tst r3,r3
+ beq __mark_strict_record_selector_node_5
+ cmp r3,#8
+ ble __mark_strict_record_selector_node_4
+ ldr r7,[r7,#8]
+ sub r3,r3,#12
+__mark_strict_record_selector_node_4:
+ ldr r3,[r7,r3]
+ str r3,[r6,#8]
+__mark_strict_record_selector_node_5:
+
+.ifdef PIC
+ ldr r4,[r4,#-4-4]
+.else
+ ldr r4,[r4,#-4]
+.endif
+ str r4,[r6]
+ b __mark_node
+
+__mark_indirection_node:
+ ldr r6,[r6]
+ b __mark_node
+
+__mark_hnf_2:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x20000000
+ bls fits__in__word__6
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in__word__6:
+
+__mark_record_2_c:
+ ldr r4,[r6]
+ ldr r8,[r6,#4]
+ orr r4,r4,#2
+ str r9,[r6,#4]
+ str r4,[r6]
+ add r9,r6,#4
+ mov r6,r8
+
+__mark_node:
+ sub r7,r6,r0
+ cmp r7,r1
+ bhs __mark_next_node
+
+ lsr r3,r7,#7
+ and r7,r7,#31*4
+ lsr r8,r7,#2
+ mov r12,#1
+ lsl r8,r12,r8
+
+ ldr r12,[r10,r3,lsl #2]
+ tst r8,r12
+ beq __mark_arguments
+
+__mark_next_node:
+ tst r9,#3
+ bne __mark_parent
+
+ ldr r8,[r9,#-4]
+ ldr r7,[r9]
+ str r6,[r9]
+ str r7,[r9,#-4]
+ sub r9,r9,#4
+
+ mov r6,r8
+ and r8,r8,#3
+ and r6,r6,#-4
+ orr r9,r9,r8
+ b __mark_node
+
+__mark_parent:
+ mov r3,r9
+ bics r9,r9,#3
+ beq __end_mark_using_reversal
+
+ and r3,r3,#3
+ ldr r8,[r9]
+ str r6,[r9]
+
+ subs r3,r3,#1
+ beq __argument_part_parent
+
+ add r6,r9,#-4
+ mov r9,r8
+ b __mark_next_node
+
+__argument_part_parent:
+ and r8,r8,#-4
+ mov r7,r9
+ ldr r6,[r8,#-4]
+ ldr r3,[r8]
+ str r3,[r8,#-4]
+ str r7,[r8]
+ add r9,r8,#2-4
+ b __mark_node
+
+__mark_lazy_node:
+ ldr r8,[r4,#-4]
+ tst r8,r8
+ beq __mark_real_or_file
+
+ add r6,r6,#4
+ cmp r8,#1
+ ble __mark_lazy_node_1
+ cmp r8,#256
+ bge __mark_closure_with_unboxed_arguments
+
+ add r8,r8,#1
+ mov r4,r7
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,r8
+
+ add r4,r4,r8,lsl #2
+ sub r8,r8,#2
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+
+ cmp r4,#32*4
+ bls fits__in__word__7
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in__word__7:
+__mark_closure_with_unboxed_arguments__2:
+ add r7,r6,r8,lsl #2
+ ldr r4,[r6]
+ orr r4,r4,#2
+ str r4,[r6]
+ ldr r6,[r7]
+ str r9,[r7]
+ mov r9,r7
+ b __mark_node
+
+__mark_closure_with_unboxed_arguments:
+ mov r4,r8
+ and r8,r8,#255
+
+ subs r8,r8,#1
+ beq __mark_closure_1_with_unboxed_argument
+ add r8,r8,#2
+
+ lsr r4,r4,#8
+ add r2,r2,r8
+
+ str r6,[sp,#-4]!
+ add r6,r7,r8,lsl #2
+
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ sub r8,r8,r4
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r6,#32*4
+ bls fits__in_word_7_
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in_word_7_:
+ ldr r6,[sp],#4
+ subs r8,r8,#2
+ bgt __mark_closure_with_unboxed_arguments__2
+ beq __shared_argument_part
+ sub r6,r6,#4
+ b __mark_next_node
+
+__mark_closure_1_with_unboxed_argument:
+ sub r6,r6,#4
+ b __mark_real_or_file
+
+__mark_hnf_0:
+ laol r12,INT+2,INT_o_2,9
+ otoa r12,INT_o_2,9
+ cmp r4,r12
+ bne __no_int_3
+
+ ldr r8,[r6,#4]
+ cmp r8,#33
+ blo ____small_int
+
+__mark_bool_or_small_string:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#2
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x40000000
+ bls __mark_next_node
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+ b __mark_next_node
+
+____small_int:
+ lao r6,small_integers,2
+ otoa r6,small_integers,2
+ add r6,r6,r8,lsl #3
+ b __mark_next_node
+
+__no_int_3:
+ blo __mark_real_file_or_string
+
+ laol r12,CHAR+2,CHAR_o_2,4
+ otoa r12,CHAR_o_2,4
+ cmp r4,r12
+ bne __no_char_3
+
+ ldrb r8,[r6,#4]
+ lao r6,static_characters,2
+ otoa r6,static_characters,2
+ add r6,r6,r8,lsl #3
+ b __mark_next_node
+
+__no_char_3:
+ blo __mark_bool_or_small_string
+
+ add r6,r4,#ZERO_ARITY_DESCRIPTOR_OFFSET-2
+ b __mark_next_node
+
+__mark_real_file_or_string:
+ laol r12,__STRING__+2,__STRING___o_2,9
+ otoa r12,__STRING___o_2,9
+ cmp r4,r12
+ bls __mark_string_or_array
+
+__mark_real_or_file:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+
+ cmp r7,#0x20000000
+ bls __mark_next_node
+
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+ b __mark_next_node
+
+__mark__record:
+ mov r12,#258/2
+ subs r8,r8,r12,lsl #1
+ beq __mark_record_2
+ blt __mark_record_1
+
+__mark_record_3:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x20000000
+ bls fits__in__word__13
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in__word__13:
+ ldrh r3,[r4,#-2+2]
+
+ ldr r7,[r6,#4]
+ sub r7,r7,r0
+ mov r4,r7
+ and r7,r7,#31*4
+ lsr r4,r4,#7
+
+ str r9,[sp,#-4]!
+
+ lsr r9,r7,#2
+ mov r12,#1
+ lsl r9,r12,r9
+
+ ldr r12,[r10,r4,lsl #2]
+ tst r9,r12
+ bne __shared_record_argument_part
+
+ add r8,r8,#1
+ ldr r12,[r10,r4,lsl #2]
+ orr r12,r12,r9
+ str r12,[r10,r4,lsl #2]
+
+ add r7,r7,r8,lsl #2
+ add r2,r2,r8
+
+ ldr r9,[sp],#4
+
+ cmp r7,#32*4
+ bls fits__in__word__14
+ add r12,r10,#4
+ ldr r7,[r12,r4,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r4,lsl #2]
+fits__in__word__14:
+ subs r3,r3,#1
+ ldr r7,[r6,#4]
+ blt __mark_record_3_bb
+ beq __shared_argument_part
+
+ str r9,[r6,#4]
+ add r6,r6,#4
+
+ subs r3,r3,#1
+ beq __mark_record_3_aab
+
+ add r9,r7,r3,lsl #2
+ ldr r4,[r7]
+ orr r4,r4,#1
+ ldr r8,[r9]
+ str r4,[r7]
+ str r6,[r9]
+ mov r6,r8
+ b __mark_node
+
+__mark_record_3_bb:
+ sub r6,r6,#4
+ b __mark_next_node
+
+__mark_record_3_aab:
+ ldr r8,[r7]
+ str r6,[r7]
+ add r9,r7,#1
+ mov r6,r8
+ b __mark_node
+
+__shared_record_argument_part:
+ ldr r7,[r6,#4]
+
+ ldr r9,[sp],#4
+
+ tst r3,r3
+ bne __shared_argument_part
+ sub r6,r6,#4
+ b __mark_next_node
+
+__mark_record_2:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,#3
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ cmp r7,#0x20000000
+ bls fits__in__word_12
+ add r12,r10,#4
+ ldr r7,[r12,r3,lsl #2]
+ orr r7,r7,#1
+ str r7,[r12,r3,lsl #2]
+fits__in__word_12:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#1
+ bhi __mark_record_2_c
+ beq __shared_argument_part
+ sub r6,r6,#4
+ b __mark_next_node
+
+__mark_record_1:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#0
+ bne __mark_hnf_1
+ sub r6,r6,#4
+ b __mark_bool_or_small_string
+
+__mark_string_or_array:
+ beq __mark_string_
+
+__mark_array:
+ ldr r8,[r6,#8]
+ cmp r8,#0
+ beq __mark_lazy_array
+
+ ldrh r4,[r8,#-2]
+ cmp r4,#0
+ beq __mark_strict_basic_array
+
+ ldrh r8,[r8,#-2+2]
+ tst r8,r8
+ beq __mark_b_record_array
+
+ sub r4,r4,#256
+ cmp r4,r8
+ beq __mark_a_record_array
+
+__mark__ab__record__array:
+ str r7,[sp,#-4]!
+ str r3,[sp,#-4]!
+ mov r3,r8
+
+ ldr r8,[r6,#4]
+ add r6,r6,#8
+ str r6,[sp,#-4]!
+
+ lsl r8,r8,#2
+ mov r7,r4
+ mul r7,r8,r7
+
+ sub r4,r4,r3
+ add r6,r6,#4
+ add r7,r7,r6
+
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl reorder
+
+ ldr r6,[sp],#4
+
+ mov r12,r4
+ mov r4,r3
+ mov r3,r12
+ ldr r8,[r6,#-4]
+ mul r4,r8,r4
+ mul r3,r8,r3
+ add r2,r2,r3
+ add r3,r3,r4
+
+ lsl r3,r3,#2
+ sub r8,r6,r0
+ add r8,r8,r3
+
+ ldr r3,[sp],#4
+ ldr r7,[sp],#4
+
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+
+ add r7,r6,r4,lsl #2
+ b __mark_r_array
+
+__mark_a_record_array:
+ ldr r12,[r6,#4]
+ mul r4,r12,r4
+ add r6,r6,#8
+ b __mark_lr_array
+
+__mark_lazy_array:
+ ldr r4,[r6,#4]
+ add r6,r6,#8
+
+__mark_lr_array:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ add r7,r6,r4,lsl #2
+ sub r8,r7,r0
+__mark_r_array:
+ lsr r8,r8,#7
+
+ cmp r3,r8
+ bhs __skip_mark_lazy_array_bits
+
+ add r3,r3,#1
+
+__mark_lazy_array_bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,#1
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r8
+ bls __mark_lazy_array_bits
+
+__skip_mark_lazy_array_bits:
+ add r2,r2,#3
+ add r2,r2,r4
+
+ cmp r4,#1
+ bls __mark_array_length_0_1
+
+ ldr r8,[r7]
+ ldr r3,[r6]
+ str r3,[r7]
+ str r8,[r6]
+
+ ldr r8,[r7,#-4]
+ sub r7,r7,#4
+ lao r12,lazy_array_list,2
+ ldo r3,r12,lazy_array_list,2
+ add r8,r8,#2
+ str r3,[r7]
+ str r8,[r6,#-4]
+ str r4,[r6,#-8]
+ sub r6,r6,#8
+ lao r12,lazy_array_list,3
+ sto r6,r12,lazy_array_list,3
+
+ ldr r6,[r7,#-4]
+ str r9,[r7,#-4]
+ add r9,r7,#-4
+ b __mark_node
+
+__mark_array_length_0_1:
+ add r6,r6,#-8
+ blo __mark_next_node
+
+ ldr r3,[r6,#12]
+ ldr r8,[r6,#8]
+ lao r12,lazy_array_list,4
+ ldo r7,r12,lazy_array_list,4
+ str r8,[r6,#12]
+ str r7,[r6,#8]
+ str r4,[r6]
+ lao r12,lazy_array_list,5
+ sto r6,r12,lazy_array_list,5
+ str r3,[r6,#4]
+ add r6,r6,#4
+
+ ldr r8,[r6]
+ str r9,[r6]
+ add r9,r6,#2
+ mov r6,r8
+ b __mark_node
+
+__mark_b_record_array:
+ ldr r8,[r6,#4]
+ sub r4,r4,#256
+ mul r4,r8,r4
+ add r4,r4,#3
+ b __mark_basic_array
+
+__mark_strict_basic_array:
+ ldr r4,[r6,#4]
+ laol r12,INT+2,INT_o_2,10
+ otoa r12,INT_o_2,10
+ cmp r8,r12
+ beq __mark__strict__int__array
+ laol r12,BOOL+2,BOOL_o_2,6
+ otoa r12,BOOL_o_2,6
+ cmp r8,r12
+ beq __mark__strict__bool__array
+__mark__strict__real__array:
+ add r4,r4,r4
+__mark__strict__int__array:
+ add r4,r4,#3
+ b __mark_basic_array
+__mark__strict__bool__array:
+ add r4,r4,#12+3
+ lsr r4,r4,#2
+ b __mark_basic_array
+
+__mark_string_:
+ ldr r4,[r6,#4]
+ add r4,r4,#8+3
+ lsr r4,r4,#2
+
+__mark_basic_array:
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ add r2,r2,r4
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r7
+ str r12,[r10,r3,lsl #2]
+ add r12,r6,#-4
+ add r4,r12,r4,lsl #2
+
+ sub r4,r4,r0
+ lsr r4,r4,#7
+
+ cmp r3,r4
+ bhs __mark_next_node
+
+ add r3,r3,#1
+ mov r8,#1
+
+ cmp r3,r4
+ bhs __last__string__bits
+
+__mark_string_lp:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ add r3,r3,#1
+ cmp r3,r4
+ blo __mark_string_lp
+
+__last__string__bits:
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r8
+ str r12,[r10,r3,lsl #2]
+ b __mark_next_node
+
+.ifdef PIC
+ lto e__system__nind,14
+ lto e__system__nind,15
+ lto e__system__nind,16
+ lto small_integers,2
+ lto static_characters,2
+ lto lazy_array_list,2
+ lto lazy_array_list,3
+ lto lazy_array_list,4
+ lto lazy_array_list,5
+.endif
+
+.ifdef PIC
+ ltol INT+2,INT_o_2,9
+ ltol CHAR+2,CHAR_o_2,4
+ ltol __STRING__+2,__STRING___o_2,9
+ ltol INT+2,INT_o_2,10
+ ltol BOOL+2,BOOL_o_2,6
+.endif
+ .ltorg