summaryrefslogtreecommitdiff
path: root/thumb2compact_rmark.s
diff options
context:
space:
mode:
Diffstat (limited to 'thumb2compact_rmark.s')
-rw-r--r--thumb2compact_rmark.s1012
1 files changed, 1012 insertions, 0 deletions
diff --git a/thumb2compact_rmark.s b/thumb2compact_rmark.s
new file mode 100644
index 0000000..9c2726c
--- /dev/null
+++ b/thumb2compact_rmark.s
@@ -0,0 +1,1012 @@
+
+ZERO_ARITY_DESCRIPTOR_OFFSET = -4
+
+rmark_stack_nodes1:
+ ldr r3,[r6]
+ add r4,r9,#1
+ str r3,[r9]
+ str r4,[r6]
+
+rmark_next_stack_node:
+ add r9,r9,#4
+rmark_stack_nodes:
+ lao r12,end_vector,16
+ ldo r12,r12,end_vector,16
+ cmp r9,r12
+ beq end_rmark_nodes
+
+rmark_more_stack_nodes:
+ ldr r6,[r9]
+
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_stack_node
+
+ lsr r3,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r8,[r10,r3,lsl #2]
+ tst r8,r4
+ bne rmark_stack_nodes1
+
+ orr r8,r8,r4
+ str r8,[r10,r3,lsl #2]
+
+ ldr r4,[r6]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl rmark_stack_node
+
+ add r9,r9,#4
+ lao r12,end_vector,17
+ ldo r12,r12,end_vector,17
+ cmp r9,r12
+ bne rmark_more_stack_nodes
+ ldr pc,[sp],#4
+
+rmark_stack_node:
+ subs sp,sp,#8
+ str r4,[r9]
+ add r8,r9,#1
+ str r9,[sp,#4]
+ mov r3,#-1
+ mov r12,#0
+ str r12,[sp]
+ str r8,[r6]
+ b rmark_no_reverse
+
+rmark_node_d1:
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_node
+
+ b rmark_node_
+
+rmark_hnf_2:
+ add r3,r6,#4
+ ldr r4,[r6,#4]
+ sub sp,sp,#8
+
+ mov r9,r6
+ ldr r6,[r6]
+
+ str r3,[sp,#4]
+ str r4,[sp]
+
+ cmp sp,r0
+ blo rmark_using_reversal
+
+rmark_node:
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_node
+
+ mov r3,r9
+
+rmark_node_:
+ lsr r7,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ ldr r8,[r10,r7,lsl #2]
+ mov r12,#1
+ lsl r4,r12,r4
+ tst r8,r4
+ bne rmark_reverse_and_mark_next_node
+
+ orr r8,r8,r4
+ str r8,[r10,r7,lsl #2]
+
+ ldr r4,[r6]
+rmark_arguments:
+ cmp r6,r3
+ bhi rmark_no_reverse
+
+ add r8,r9,#1
+ str r4,[r9]
+ str r8,[r6]
+
+rmark_no_reverse:
+ tst r4,#2
+ beq rmark_lazy_node
+
+ ldrh r8,[r4,#-2]
+ tst r8,r8
+ beq rmark_hnf_0
+
+ add r6,r6,#4
+
+ cmp r8,#256
+ bhs rmark_record
+
+ subs r8,r8,#2
+ beq rmark_hnf_2
+ bcc rmark_hnf_1
+
+rmark_hnf_3:
+ ldr r7,[r6,#4]
+rmark_hnf_3_:
+ cmp sp,r0
+ blo rmark_using_reversal_
+
+ sub r4,r7,r11
+
+ lsr r3,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r3,lsl #2]
+ tst r4,r12
+ bne rmark_shared_argument_part
+
+ ldr r12,[r10,r3,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r3,lsl #2]
+
+rmark_no_shared_argument_part:
+ subs sp,sp,#8
+ str r6,[sp,#4]
+ add r9,r6,#4
+ ldr r6,[r6]
+ add r7,r7,r8,lsl #2
+ str r6,[sp]
+
+rmark_push_hnf_args:
+ ldr r3,[r7]
+ subs sp,sp,#8
+ str r7,[sp,#4]
+ subs r7,r7,#4
+ str r3,[sp]
+
+ subs r8,r8,#1
+ bgt rmark_push_hnf_args
+
+ ldr r6,[r7]
+
+ cmp r7,r9
+ bhi rmark_no_reverse_argument_pointer
+
+ add r8,r9,#3
+ str r6,[r9]
+ str r8,[r7]
+
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_node
+
+ mov r3,r7
+ b rmark_node_
+
+rmark_no_reverse_argument_pointer:
+ mov r9,r7
+ b rmark_node
+
+rmark_shared_argument_part:
+ cmp r7,r6
+ bhi rmark_hnf_1
+
+ ldr r3,[r7]
+ add r4,r6,#4+2+1
+ str r4,[r7]
+ str r3,[r6,#4]
+ b rmark_hnf_1
+
+rmark_record:
+ mov r12,#258/2
+ subs r8,r8,r12,lsl #1
+ beq rmark_record_2
+ blo rmark_record_1
+
+rmark_record_3:
+ ldrh r8,[r4,#-2+2]
+ ldr r7,[r6,#4]
+ subs r8,r8,#1
+ blo rmark_record_3_bb
+ beq rmark_record_3_ab
+ subs r8,r8,#1
+ beq rmark_record_3_aab
+ b rmark_hnf_3_
+
+rmark_record_3_bb:
+ subs r6,r6,#4
+
+ sub r4,r7,r11
+
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ cmp r7,r6
+ bhi rmark_next_node
+
+ add r4,r4,r4
+ bne rmark_bit_in_same_word1
+ add r8,r8,#1
+ mov r4,#1
+rmark_bit_in_same_word1:
+ ldr r12,[r10,r8,lsl #2]
+ tst r4,r12
+ beq rmark_not_yet_linked_bb
+
+ sub r4,r6,r11
+
+ add r4,r4,#2*4
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+rmark_not_yet_linked_bb:
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ ldr r8,[r7]
+ add r4,r6,#8+2+1
+ str r8,[r6,#8]
+ str r4,[r7]
+ b rmark_next_node
+
+rmark_record_3_ab:
+ sub r4,r7,r11
+
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ cmp r7,r6
+ bhi rmark_hnf_1
+
+ adds r4,r4,r4
+ bne rmark_bit_in_same_word2
+ add r8,r8,#1
+ mov r4,#1
+rmark_bit_in_same_word2:
+ ldr r12,[r10,r8,lsl #2]
+ tst r4,r12
+ beq rmark_not_yet_linked_ab
+
+ sub r4,r6,r11
+
+ add r4,r4,#4
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+
+ ldr r12,[r10,r8,lsl #2]
+rmark_not_yet_linked_ab:
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ ldr r8,[r7]
+ add r4,r6,#4+2+1
+ str r8,[r6,#4]
+ str r4,[r7]
+ b rmark_hnf_1
+
+rmark_record_3_aab:
+ cmp sp,r0
+ blo rmark_using_reversal_
+
+ sub r4,r7,r11
+
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ tst r4,r12
+ bne rmark_shared_argument_part
+
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+
+ subs sp,sp,#8
+ str r6,[sp,#4]
+ add r9,r6,#4
+ ldr r6,[r6]
+ str r6,[sp]
+
+ ldr r6,[r7]
+
+ cmp r7,r9
+ bhi rmark_no_reverse_argument_pointer
+
+ add r8,r9,#3
+ str r6,[r9]
+ str r8,[r7]
+
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_node
+
+ mov r3,r7
+ b rmark_node_
+
+rmark_record_2:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#1
+ bhi rmark_hnf_2
+ beq rmark_hnf_1
+ b rmark_next_node
+
+rmark_record_1:
+ ldrh r12,[r4,#-2+2]
+ cmp r12,#0
+ bne rmark_hnf_1
+ b rmark_next_node
+
+rmark_lazy_node_1:
+@ selectors:
+ bne rmark_selector_node_1
+
+rmark_hnf_1:
+ mov r9,r6
+ ldr r6,[r6]
+ b rmark_node
+
+@ selectors
+rmark_indirection_node:
+ subs r6,r6,#4
+ sub r7,r6,r11
+
+ and r8,r7,#31*4
+ lsr r7,r7,#7
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r12,[r10,r7,lsl #2]
+ bic r12,r12,r8
+ str r12,[r10,r7,lsl #2]
+
+ mov r7,r6
+ cmp r6,r3
+ ldr r6,[r6,#4]
+ str r6,[r9]
+ bhi rmark_node_d1
+ str r4,[r7]
+ b rmark_node_d1
+
+rmark_selector_node_1:
+ cmp r8,#(-2)-1
+ beq rmark_indirection_node
+
+ ldr r7,[r6]
+ mov r1,r3
+
+ sub r3,r7,r11
+ lsr r3,r3,#2
+
+ cmp r8,#(-3)-1
+ ble rmark_record_selector_node_1
+
+ and r8,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+ ldr r3,[r7]
+ tst r3,#2
+ beq rmark_hnf_1
+
+ ldrh r12,[r3,#-2]
+ cmp r12,#2
+ bls rmark_small_tuple_or_record
+
+rmark_large_tuple_or_record:
+ ldr r3,[r7,#8]
+ sub r3,r3,r11
+ lsr r3,r3,#2
+
+ and r8,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+ add r12,r6,#-4
+ sub r3,r12,r11
+
+ str r6,[sp,#-4]!
+
+.ifdef PIC
+ add r12,r4,#-8+4
+.endif
+ ldr r4,[r4,#-8]
+
+ and r6,r3,#31*4
+ lsr r3,r3,#7
+ lsr r6,r6,#2
+.ifdef PIC
+ ldrh r4,[r12,r4]
+.endif
+ mov r12,#1
+ lsl r6,r12,r6
+ ldr r12,[r10,r3,lsl #2]
+ bic r12,r12,r6
+ str r12,[r10,r3,lsl #2]
+
+.ifndef PIC
+ ldrh r4,[r4,#4]
+.endif
+ mov r3,r1
+
+ cmp r4,#8
+ blt rmark_tuple_or_record_selector_node_2
+ ldr r7,[r7,#8]
+ beq rmark_tuple_selector_node_2
+ add r6,r4,#-12
+ ldr r6,[r7,r6]
+ ldr r7,[sp],#4
+ str r6,[r9]
+ lao r12,e__system__nind,17
+ otoa r12,e__system__nind,17
+ str r12,[r7,#-4]
+ str r6,[r7]
+ b rmark_node_d1
+
+rmark_tuple_selector_node_2:
+ ldr r6,[r7]
+ ldr r7,[sp],#4
+ str r6,[r9]
+ lao r12,e__system__nind,18
+ otoa r12,e__system__nind,18
+ str r12,[r7,#-4]
+ str r6,[r7]
+ b rmark_node_d1
+
+rmark_record_selector_node_1:
+ beq rmark_strict_record_selector_node_1
+
+ and r8,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+ ldr r3,[r7]
+ tst r3,#2
+ beq rmark_hnf_1
+
+ ldrh r12,[r3,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls rmark_small_tuple_or_record
+
+ ldr r3,[r7,#8]
+ sub r3,r3,r11
+ lsr r3,r3,#2
+
+ and r8,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+rmark_small_tuple_or_record:
+ add r12,r6,#-4
+ sub r3,r12,r11
+
+ str r6,[sp,#-4]!
+
+.ifdef PIC
+ add r12,r4,#-8+4
+.endif
+ ldr r4,[r4,#-8]
+
+ and r6,r3,#31*4
+ lsr r3,r3,#7
+ lsr r6,r6,#2
+.ifdef PIC
+ ldrh r4,[r12,r4]
+.endif
+ mov r12,#1
+ lsl r6,r12,r6
+ ldr r12,[r10,r3,lsl #2]
+ bic r12,r12,r6
+ str r12,[r10,r3,lsl #2]
+
+.ifndef PIC
+ ldrh r4,[r4,#4]
+.endif
+ mov r3,r1
+
+ cmp r4,#8
+ ble rmark_tuple_or_record_selector_node_2
+ ldr r7,[r7,#8]
+ subs r4,r4,#12
+rmark_tuple_or_record_selector_node_2:
+ ldr r6,[r7,r4]
+ ldr r7,[sp],#4
+ str r6,[r9]
+ lao r12,e__system__nind,19
+ otoa r12,e__system__nind,19
+ str r12,[r7,#-4]
+ str r6,[r7]
+ b rmark_node_d1
+
+rmark_strict_record_selector_node_1:
+ and r8,r3,#31
+ lsr r3,r3,#5
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+ ldr r3,[r7]
+ tst r3,#2
+ beq rmark_hnf_1
+
+ ldrh r12,[r3,#-2]
+ mov r3,#258/2
+ cmp r12,r3,lsl #1
+ bls rmark_select_from_small_record
+
+ ldr r3,[r7,#8]
+ sub r3,r3,r11
+
+ and r8,r3,#31*4
+ lsr r3,r3,#7
+ lsr r8,r8,#2
+ mov r12,#1
+ lsl r8,r12,r8
+ ldr r3,[r10,r3,lsl #2]
+ and r3,r3,r8
+ bne rmark_hnf_1
+
+rmark_select_from_small_record:
+ ldr r3,[r4,#-8]
+.ifdef PIC
+ add r12,r4,#-8+4
+.endif
+ subs r6,r6,#4
+
+ cmp r6,r1
+ bhi rmark_selector_pointer_not_reversed
+
+.ifdef PIC
+ ldrh r4,[r3,r12]!
+.else
+ ldrh r4,[r3,#4]
+.endif
+ cmp r4,#8
+ ble rmark_strict_record_selector_node_2
+ ldr r12,[r7,#8]
+ add r4,r4,r12
+ ldr r4,[r4,#-12]
+ b rmark_strict_record_selector_node_3
+rmark_strict_record_selector_node_2:
+ ldr r4,[r7,r4]
+rmark_strict_record_selector_node_3:
+ str r4,[r6,#4]
+
+.ifdef PIC
+ ldrh r4,[r3,#6-4]
+.else
+ ldrh r4,[r3,#6]
+.endif
+ tst r4,r4
+ beq rmark_strict_record_selector_node_5
+ cmp r4,#8
+ ble rmark_strict_record_selector_node_4
+ ldr r7,[r7,#8]
+ sub r4,r4,#12
+rmark_strict_record_selector_node_4:
+ ldr r4,[r7,r4]
+ str r4,[r6,#8]
+rmark_strict_record_selector_node_5:
+
+.ifdef PIC
+ ldr r4,[r3,#-4-4]
+.else
+ ldr r4,[r3,#-4]
+.endif
+ add r9,r9,#1
+ str r9,[r6]
+ str r4,[r9,#-1]
+ b rmark_next_node
+
+rmark_selector_pointer_not_reversed:
+.ifdef PIC
+ ldrh r4,[r3,r12]!
+.else
+ ldrh r4,[r3,#4]
+.endif
+ cmp r4,#8
+ ble rmark_strict_record_selector_node_6
+ ldr r12,[r7,#8]
+ add r4,r4,r12
+ ldr r4,[r4,#-12]
+ b rmark_strict_record_selector_node_7
+rmark_strict_record_selector_node_6:
+ ldr r4,[r7,r4]
+rmark_strict_record_selector_node_7:
+ str r4,[r6,#4]
+
+.ifdef PIC
+ ldrh r4,[r3,#6-4]
+.else
+ ldrh r4,[r3,#6]
+.endif
+ tst r4,r4
+ beq rmark_strict_record_selector_node_9
+ cmp r4,#8
+ ble rmark_strict_record_selector_node_8
+ ldr r7,[r7,#8]
+ subs r4,r4,#12
+rmark_strict_record_selector_node_8:
+ ldr r4,[r7,r4]
+ str r4,[r6,#8]
+rmark_strict_record_selector_node_9:
+
+.ifdef PIC
+ ldr r4,[r3,#-4-4]
+.else
+ ldr r4,[r3,#-4]
+.endif
+ str r4,[r6]
+ b rmark_next_node
+
+rmark_reverse_and_mark_next_node:
+ cmp r6,r3
+ bhi rmark_next_node
+
+ ldr r4,[r6]
+ str r4,[r9]
+ add r9,r9,#1
+ str r9,[r6]
+
+@ a2,d1: free
+
+rmark_next_node:
+ ldr r6,[sp]
+ ldr r9,[sp,#4]
+ add sp,sp,#8
+
+ cmp r6,#1
+ bhi rmark_node
+
+rmark_next_node_:
+end_rmark_nodes:
+ ldr pc,[sp],#4
+
+rmark_lazy_node:
+ ldr r8,[r4,#-4]
+ cmp r8,#0
+ beq rmark_next_node
+
+ add r6,r6,#4
+
+ subs r8,r8,#1
+ ble rmark_lazy_node_1
+
+ cmp r8,#255
+ bge rmark_closure_with_unboxed_arguments
+
+rmark_closure_with_unboxed_arguments_:
+ add r6,r6,r8,lsl #2
+
+rmark_push_lazy_args:
+ ldr r3,[r6]
+ sub sp,sp,#8
+ str r6,[sp,#4]
+ sub r6,r6,#4
+ str r3,[sp]
+ subs r8,r8,#1
+ bgt rmark_push_lazy_args
+
+ mov r9,r6
+ ldr r6,[r6]
+ cmp sp,r0
+ bhs rmark_node
+
+ b rmark_using_reversal
+
+rmark_closure_with_unboxed_arguments:
+@ (a_size+b_size)+(b_size<<8)
+@ addl $1,a2
+ mov r4,r8
+ and r8,r8,#255
+ lsr r4,r4,#8
+ subs r8,r8,r4
+@ subl $1,a2
+ bgt rmark_closure_with_unboxed_arguments_
+ beq rmark_hnf_1
+ b rmark_next_node
+
+rmark_hnf_0:
+ laol r12,INT+2,INT_o_2,11
+ otoa r12,INT_o_2,11
+ cmp r4,r12
+ beq rmark_int_3
+
+ laol r12,CHAR+2,CHAR_o_2,6
+ otoa r12,CHAR_o_2,6
+ cmp r4,r12
+ beq rmark_char_3
+
+ blo rmark_no_normal_hnf_0
+
+ sub r8,r6,r11
+
+ and r7,r8,#31*4
+ lsr r8,r8,#7
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ ldr r12,[r10,r8,lsl #2]
+ bic r12,r12,r7
+ str r12,[r10,r8,lsl #2]
+
+ add r7,r4,#ZERO_ARITY_DESCRIPTOR_OFFSET-2
+ str r7,[r9]
+ cmp r6,r3
+ bhi rmark_next_node
+ str r4,[r6]
+ b rmark_next_node
+
+rmark_int_3:
+ ldr r8,[r6,#4]
+ cmp r8,#33
+ bcs rmark_next_node
+
+ lao r12,small_integers,3
+ otoa r12,small_integers,3
+ add r7,r12,r8,lsl #3
+ str r7,[r9]
+ sub r8,r6,r11
+
+ and r7,r8,#31*4
+ lsr r8,r8,#7
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ ldr r12,[r10,r8,lsl #2]
+ bic r12,r12,r7
+ str r12,[r10,r8,lsl #2]
+
+ cmp r6,r3
+ bhi rmark_next_node
+ str r4,[r6]
+ b rmark_next_node
+
+rmark_char_3:
+ ldrb r7,[r6,#4]
+
+ lao r12,static_characters,3
+ otoa r12,static_characters,3
+ add r7,r12,r7,lsl #3
+ sub r8,r6,r11
+
+ str r7,[r9]
+
+ and r7,r8,#31*4
+ lsr r8,r8,#7
+ lsr r7,r7,#2
+ mov r12,#1
+ lsl r7,r12,r7
+ ldr r12,[r10,r8,lsl #2]
+ bic r12,r12,r7
+ str r12,[r10,r8,lsl #2]
+
+ cmp r6,r3
+ bhi rmark_next_node
+ str r4,[r6]
+ b rmark_next_node
+
+rmark_no_normal_hnf_0:
+ laol r12,__ARRAY__+2,__ARRAY___o_2,17
+ otoa r12,__ARRAY___o_2,17
+ cmp r4,r12
+ bne rmark_next_node
+
+ ldr r4,[r6,#8]
+ tst r4,r4
+ beq rmark_lazy_array
+
+ ldrh r7,[r4,#-2+2]
+ tst r7,r7
+ beq rmark_b_array
+
+ ldrh r4,[r4,#-2]
+ tst r4,r4
+ beq rmark_b_array
+
+ cmp sp,r0
+ blo rmark_array_using_reversal
+
+ subs r4,r4,#256
+ cmp r7,r4
+ mov r3,r7
+ beq rmark_a_record_array
+
+rmark_ab_record_array:
+ ldr r7,[r6,#4]
+ add r6,r6,#8
+ str r6,[sp,#-4]!
+
+ mul r7,r4,r7
+ lsl r7,r7,#2
+
+ subs r4,r4,r3
+ add r6,r6,#4
+ add r7,r7,r6
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl reorder
+
+ ldr r6,[sp],#4
+ mov r4,r3
+ ldr r12,[r6,#-4]
+ mul r4,r12,r4
+ b rmark_lr_array
+
+rmark_b_array:
+ sub r4,r6,r11
+
+ add r4,r4,#4
+ lsr r8,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r12,[r10,r8,lsl #2]
+ orr r12,r12,r4
+ str r12,[r10,r8,lsl #2]
+ b rmark_next_node
+
+rmark_a_record_array:
+ ldr r4,[r6,#4]
+ add r6,r6,#8
+ cmp r3,#2
+ blo rmark_lr_array
+
+ mul r4,r3,r4
+ b rmark_lr_array
+
+rmark_lazy_array:
+ cmp sp,r0
+ blo rmark_array_using_reversal
+
+ ldr r4,[r6,#4]
+ add r6,r6,#8
+
+rmark_lr_array:
+ sub r3,r6,r11
+ lsr r3,r3,#2
+ add r3,r3,r4
+
+ lsr r7,r3,#5
+ and r3,r3,#31
+ mov r12,#1
+ lsl r3,r12,r3
+ ldr r12,[r10,r7,lsl #2]
+ orr r12,r12,r3
+ str r12,[r10,r7,lsl #2]
+
+ cmp r4,#1
+ bls rmark_array_length_0_1
+ mov r7,r6
+ add r6,r6,r4,lsl #2
+
+ ldr r4,[r6]
+ ldr r3,[r7]
+ str r4,[r7]
+ str r3,[r6]
+
+ ldr r4,[r6,#-4]!
+ ldr r3,[r7,#-4]!
+ str r3,[r6]
+ str r4,[r7]
+ str r6,[sp,#-4]!
+ mov r9,r7
+ b rmark_array_nodes
+
+rmark_array_nodes1:
+ cmp r6,r9
+ bhi rmark_next_array_node
+
+ ldr r3,[r6]
+ add r4,r9,#1
+ str r3,[r9]
+ str r4,[r6]
+
+rmark_next_array_node:
+ add r9,r9,#4
+ ldr r12,[sp]
+ cmp r9,r12
+ beq end_rmark_array_node
+
+rmark_array_nodes:
+ ldr r6,[r9]
+
+ sub r4,r6,r11
+ cmp r4,r2
+ bcs rmark_next_array_node
+
+ lsr r3,r4,#7
+ lsr r4,r4,#2
+ and r4,r4,#31
+ mov r12,#1
+ lsl r4,r12,r4
+ ldr r8,[r10,r3,lsl #2]
+ tst r8,r4
+ bne rmark_array_nodes1
+
+ orr r8,r8,r4
+ str r8,[r10,r3,lsl #2]
+
+ ldr r4,[r6]
+ add r12,pc,#0
+ str r12,[sp,#-4]!
+ bl rmark_array_node
+
+ add r9,r9,#4
+ ldr r12,[sp]
+ cmp r9,r12
+ bne rmark_array_nodes
+
+end_rmark_array_node:
+ add sp,sp,#4
+ b rmark_next_node
+
+rmark_array_node:
+ sub sp,sp,#8
+ str r9,[sp,#4]
+ mov r3,r9
+ mov r12,#1
+ str r12,[sp]
+ b rmark_arguments
+
+rmark_array_length_0_1:
+ add r6,r6,#-8
+ blo rmark_next_node
+
+ ldr r3,[r6,#12]
+ ldr r8,[r6,#8]
+ str r8,[r6,#12]
+ ldr r8,[r6,#4]
+ str r8,[r6,#8]
+ str r3,[r6,#4]
+ add r6,r6,#4
+ b rmark_hnf_1
+
+.ifdef PIC
+ lto end_vector,16
+ lto end_vector,17
+ lto e__system__nind,17
+ lto e__system__nind,18
+ lto e__system__nind,19
+ ltol INT+2,INT_o_2,11
+ ltol CHAR+2,CHAR_o_2,6
+ lto small_integers,3
+ lto static_characters,3
+ ltol __ARRAY__+2,__ARRAY___o_2,17
+.endif
+ .ltorg