1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@	File:		R4R8First_v7.s
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@	Content:	Radix8First and Radix4First function armv7 assemble
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	.section .text
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	.global	Radix8First
262857b47a2731579772c76d46285660972c0ba23dBen Cheng	.fnstart
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
28e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardRadix8First:
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	stmdb     		sp!, {r4 - r11, lr}
302857b47a2731579772c76d46285660972c0ba23dBen Cheng	.save	  		{r4 - r11, lr}
312857b47a2731579772c76d46285660972c0ba23dBen Cheng	fstmfdd   		sp!, {d8 - d15}
322857b47a2731579772c76d46285660972c0ba23dBen Cheng	.vsave	  		{d8 - d15}
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ldr       		r3, SQRT1_2
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	cmp       		r1, #0
36b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
37b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VDUP.I32  		Q15, r3
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	beq       		Radix8First_END
39b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
40e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardRadix8First_LOOP:
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VLD1.I32			{d0, d1, d2, d3},	[r0]!
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VLD1.I32			{d8, d9, d10, d11},	[r0]!
43b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			d4, d0, d1		@ r0 = buf[0] + buf[2]@i0 = buf[1] + buf[3]@
45b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VSUB.S32			d5, d0, d1		@ r1 = buf[0] - buf[2]@i1 = buf[1] - buf[3]@
46b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VSUB.S32			d7, d2, d3		@ r2 = buf[4] - buf[6]@i2 = buf[5] - buf[7]@
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			d6, d2, d3		@ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@
48b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VREV64.I32			d7, d7
49b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			Q0, Q2, Q3		@ r4 = (r0 + r2)@i4 = (i0 + i2)@i6 = (i1 + r3)@r7 = (r1 + i3)
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSUB.S32			Q1, Q2, Q3		@ r5 = (r0 - r2)@i5 = (i0 - i2)@r6 = (r1 - i3)@i7 = (i1 - r3)@
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
53b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VREV64.I32			d3, d3
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			d4, d8, d9		@ r0 = buf[ 8] + buf[10]@i0 = buf[ 9] + buf[11]@
56b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VSUB.S32			d7, d10, d11	@ r1 = buf[12] - buf[14]@i1 = buf[13] - buf[15]@
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			d6, d10, d11	@ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@
58b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VREV64.I32			d7, d7
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSUB.S32			d5, d8, d9		@ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@
60b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
61b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VTRN.32				d1, d3
62b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			Q4, Q2, Q3		@ t0 = (r0 + r2) >> 1@t1 = (i0 + i2) >> 1@i0 = i1 + r3@r2 = r1 + i3@
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSUB.S32			Q5, Q2, Q3		@ t2 = (r0 - r2) >> 1@t3 = (i0 - i2) >> 1@r0 = r1 - i3@i2 = i1 - r3@
65b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VREV64.I32			d3, d3
67b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
68b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VSHR.S32			d8, d8, #1
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSHR.S32			Q0, Q0, #1
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VREV64.I32			d10, d10
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VTRN.32				d11, d9
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSHR.S32			Q1, Q1, #1
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSHR.S32			d10, d10, #1
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VREV64.I32			d9, d9
75b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	sub       			r0, r0, #0x40
77b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			d12, d0, d8
79b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VSUB.S32			d16, d0, d8
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			d14, d2, d10
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSUB.S32			d18, d2, d10
82b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSUB.S32			d4, d11, d9
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			d5, d11, d9
85b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VREV64.I32			d18, d18
87b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VQDMULH.S32			Q3, Q2, Q15
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VTRN.32				d14, d18
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VTRN.32				d6, d7
91b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VREV64.I32			d18, d18
92b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSUB.S32			d15, d3, d6
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VREV64.I32			d7, d7
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			d19, d3, d6
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			d13, d1, d7
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSUB.S32			d17, d1, d7
98b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VREV64.I32			d17, d17
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VTRN.32				d13, d17
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VREV64.I32			d17, d17
102b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
103b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	subs       			r1, r1, #1
104b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VST1.I32			{d12, d13, d14, d15}, [r0]!
106b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VST1.I32			{d16, d17, d18, d19}, [r0]!
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	bne       			Radix8First_LOOP
108b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
109e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardRadix8First_END:
1102857b47a2731579772c76d46285660972c0ba23dBen Cheng	fldmfdd   sp!, {d8 - d15}
111b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	ldmia     sp!, {r4 - r11, pc}
112e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardSQRT1_2:
113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	.word      0x2d413ccd
114b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	@ENDP  @ |Radix8First|
1162857b47a2731579772c76d46285660972c0ba23dBen Cheng	.fnend
117b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	.section .text
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	.global	Radix4First
1202857b47a2731579772c76d46285660972c0ba23dBen Cheng	.fnstart
121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
122e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardRadix4First:
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	stmdb     	sp!, {r4 - r11, lr}
1242857b47a2731579772c76d46285660972c0ba23dBen Cheng	.save	  	{r4 - r11, lr}
1252857b47a2731579772c76d46285660972c0ba23dBen Cheng	fstmfdd   	sp!, {d8 - d15}
1262857b47a2731579772c76d46285660972c0ba23dBen Cheng	.vsave	  	{d8 - d15}
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	cmp       	r1, #0
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	beq       	Radix4First_END
130b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
131e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardRadix4First_LOOP:
132b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VLD1.I32			{d0, d1, d2, d3}, [r0]
133b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
134b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VADD.S32			d4, d0, d1							@ r0 = buf[0] + buf[2]@ r1 = buf[1] + buf[3]@
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSUB.S32			d5, d0, d1							@ r2 = buf[0] - buf[2]@ r3 = buf[1] - buf[3]@
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSUB.S32			d7, d2, d3							@ r4 = buf[4] + buf[6]@ r5 = buf[5] + buf[7]@
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			d6, d2, d3							@ r6 = buf[4] - buf[6]@ r7 = buf[5] - buf[7]@
138b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
139b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	VREV64.I32		d7, d7									@
140b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VADD.S32			Q4, Q2, Q3
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VSUB.S32			Q5, Q2, Q3
143b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VREV64.I32		d11, d11
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VTRN.32				d9, d11
146b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	subs       		r1, r1, #1
147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VREV64.I32		d11, d11
148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VST1.I32			{d8, d9, d10, d11}, [r0]!
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	bne       		Radix4First_LOOP
151b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
152e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardRadix4First_END:
1532857b47a2731579772c76d46285660972c0ba23dBen Cheng	fldmfdd   		sp!, {d8 - d15}
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ldmia    		sp!, {r4 - r11, pc}
155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	@ENDP  @ |Radix4First|
1572857b47a2731579772c76d46285660972c0ba23dBen Cheng	.fnend
158