;some optimized functions (yes!)

	AREA |A$$code|,READONLY, CODE

	EXPORT window_left
	EXPORT window_right
	EXPORT map_zero

;****************************************************************************

 ; r0 d
 ; r1 window in 1<<31 range [0, 1<<31 -1]
 ; r2 n
window_left
	stmfd   r13!, {r4-r12, r14}
window_left_loop
	ldmia   r0, {r3-r6}
	ldmia	r1!, {r7-r10}
	mov     r3, r3, lsl #1
	mov     r4, r4, lsl #1
	mov     r5, r5, lsl #1
	mov     r6, r6, lsl #1
	smull	r11, r3, r7, r3
	smull	r12, r4, r8, r4
	smull	r11, r5, r9, r5
	smull	r12, r6, r10, r6
	subs    r2, r2, #4
	stmia   r0!, {r3-r6}
	bgt	window_left_loop
	[ {CONFIG}=32
	ldmfd   r13!, {r4-r12, pc}
	|
	ldmfd   r13!, {r4-r12, pc}^
	]

 ; r0 d
 ; r1 window in 1<<31 range [0, 1<<31 -1]
 ; r2 n
window_right
	stmfd   r13!, {r4-r12, r14}
	add	r1, r1, r2, lsl #2
window_right_loop
	ldmia   r0, {r3-r6}
	ldmdb	r1!, {r7-r10}
	mov     r3, r3, lsl #1
	mov     r4, r4, lsl #1
	mov     r5, r5, lsl #1
	mov     r6, r6, lsl #1
	smull	r11, r3, r10, r3
	smull	r12, r4, r9, r4
	smull	r11, r5, r8, r5
	smull	r12, r6, r7, r6
	subs    r2, r2, #4
	stmia   r0!, {r3-r6}
	bgt	window_right_loop
	[ {CONFIG}=32
	ldmfd   r13!, {r4-r12, pc}
	|
	ldmfd   r13!, {r4-r12, pc}^
	]

 ; r0 pcm
 ; r1 n
map_zero
        stmfd   r13!, {r4-r9, r14}
        mov     r2, #0
        mov     r3, #0
        mov     r4, #0
        mov     r5, #0
        mov     r6, #0
        mov     r7, #0
        mov     r8, #0
        mov     r9, #0
map_zero_loop
        stmia   r0!, {r2-r9}
        subs    r1, r1, #8
        bgt     map_zero_loop
	[ {CONFIG}=32
	ldmfd   r13!, {r4-r9, pc}
	|
	ldmfd   r13!, {r4-r9, pc}^
	]

	END
