Radix4FFT_v7.s revision 41050cdb033641ddf26831d9272c0930f7b40a2d
1@/*
2@ ** Copyright 2003-2010, VisualOn, Inc.
3@ **
4@ ** Licensed under the Apache License, Version 2.0 (the "License");
5@ ** you may not use this file except in compliance with the License.
6@ ** You may obtain a copy of the License at
7@ **
8@ **     http://www.apache.org/licenses/LICENSE-2.0
9@ **
10@ ** Unless required by applicable law or agreed to in writing, software
11@ ** distributed under the License is distributed on an "AS IS" BASIS,
12@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13@ ** See the License for the specific language governing permissions and
14@ ** limitations under the License.
15@ */
16
17@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
18@	File:		Radix4FFT_v7.s
19@
20@	Content:	Radix4FFT armv7 assemble
21@
22@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
23
24	.section .text
25	.global	Radix4FFT
26
27Radix4FFT:
28	stmdb    sp!, {r4 - r11, lr}
29
30	mov			r1, r1, asr #2
31	cmp     	r1, #0
32	beq     	Radix4FFT_END
33
34Radix4FFT_LOOP1:
35	mov     	r5, r2, lsl #1
36	mov     	r8, r0
37	mov     	r7, r1
38	mov     	r5, r5, lsl #2
39	cmp     	r1, #0
40	rsbeq   	r12, r5, r5, lsl #2
41	beq     	Radix4FFT_LOOP1_END
42
43	rsb     	r12, r5, r5, lsl #2
44
45Radix4FFT_LOOP2:
46	mov     	r6, r3
47	mov     	r4, r2
48	cmp     	r2, #0
49	beq     	Radix4FFT_LOOP2_END
50
51Radix4FFT_LOOP3:
52	@r0 = xptr[0]@
53	@r1 = xptr[1]@
54	VLD2.I32			{D0, D1, D2, D3}, [r8]
55	VLD2.I32			{D28, D29, D30, D31}, [r6]!		@ cosx = csptr[0]@ sinx = csptr[1]@
56
57	add					r8, r8, r5										@ xptr += step@
58	VLD2.I32			{D4, D5, D6,D7}, [r8]					@ r2 = xptr[0]@ r3 = xptr[1]@
59
60	VQDMULH.S32		Q10, Q2, Q14									@ MULHIGH(cosx, t0)
61	VQDMULH.S32		Q11, Q3, Q15									@ MULHIGH(sinx, t1)
62	VQDMULH.S32		Q12, Q3, Q14									@ MULHIGH(cosx, t1)
63	VQDMULH.S32		Q13, Q2, Q15									@ MULHIGH(sinx, t0)
64
65	VADD.S32			Q2, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
66	VSUB.S32			Q3, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
67
68	add					r8, r8, r5										@ xptr += step@
69	VSHR.S32			Q10, Q0, #2										@ t0 = r0 >> 2@
70	VSHR.S32			Q11, Q1, #2										@ t1 = r1 >> 2@
71
72	VSUB.S32			Q0,	Q10, Q2										@ r0 = t0 - r2@
73	VSUB.S32			Q1,	Q11, Q3										@ r1 = t1 - r3@
74	VADD.S32			Q2, Q10, Q2										@ r2 = t0 + r2@
75	VADD.S32			Q3, Q11, Q3										@ r3 = t1 + r3@
76
77	VLD2.I32			{D8, D9, D10, D11}, [r8]
78	VLD2.I32			{D28, D29, D30, D31}, [r6]!
79	add						r8, r8, r5
80
81	VQDMULH.S32		Q10, Q4, Q14									@ MULHIGH(cosx, t0)
82	VQDMULH.S32		Q11, Q5, Q15									@ MULHIGH(sinx, t1)
83	VQDMULH.S32		Q12, Q5, Q14									@ MULHIGH(cosx, t1)
84	VQDMULH.S32		Q13, Q4, Q15									@ MULHIGH(sinx, t0)
85
86	VADD.S32			Q8, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
87	VSUB.S32			Q9, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
88
89	VLD2.I32		{D12, D13, D14, D15}, [r8]
90	VLD2.I32		{D28, D29, D30, D31}, [r6]!
91
92	VQDMULH.S32		Q10, Q6, Q14									@ MULHIGH(cosx, t0)
93	VQDMULH.S32		Q11, Q7, Q15									@ MULHIGH(sinx, t1)
94	VQDMULH.S32		Q12, Q7, Q14									@ MULHIGH(cosx, t1)
95	VQDMULH.S32		Q13, Q6, Q15									@ MULHIGH(sinx, t0)
96
97	VADD.S32			Q6, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
98	VSUB.S32			Q7, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
99
100	VADD.S32			Q4, Q8, Q6										@ r4 = t0 + r6@
101	VSUB.S32			Q5, Q7, Q9										@ r5 = r7 - t1@
102	VSUB.S32			Q6, Q8, Q6										@ r6 = t0 - r6@
103	VADD.S32			Q7, Q7, Q9										@ r7 = r7 + t1@
104
105	VADD.S32			Q8, Q0, Q5										@ xptr[0] = r0 + r5@
106	VADD.S32			Q9, Q1, Q6										@ xptr[1] = r1 + r6@
107	VST2.I32			{D16, D17, D18, D19}, [r8]
108
109	VSUB.S32			Q10, Q2, Q4										@ xptr[0] = r2 - r4@
110	sub					r8, r8, r5										@ xptr -= step@
111	VSUB.S32			Q11, Q3, Q7										@ xptr[1] = r3 - r7@
112	VST2.I32			{D20, D21, D22, D23}, [r8]
113
114	VSUB.S32			Q8, Q0, Q5										@ xptr[0] = r0 - r5@
115	sub					r8, r8, r5										@ xptr -= step@
116	VSUB.S32			Q9, Q1, Q6										@ xptr[1] = r1 - r6@
117	VST2.I32			{D16, D17, D18, D19}, [r8]
118
119	VADD.S32			Q10, Q2, Q4										@ xptr[0] = r2 + r4@
120	sub					r8, r8, r5										@ xptr -= step@
121	VADD.S32			Q11, Q3, Q7										@ xptr[1] = r3 + r7@
122	VST2.I32			{D20, D21, D22, D23}, [r8]!
123
124	subs    			r4, r4, #4
125	bne     			Radix4FFT_LOOP3
126
127Radix4FFT_LOOP2_END:
128	add     			r8, r8, r12
129	sub    				r7, r7, #1
130	cmp					r7, #0
131	bhi     			Radix4FFT_LOOP2
132
133Radix4FFT_LOOP1_END:
134	add     			r3, r12, r3
135	mov     			r2, r2, lsl #2
136	movs    			r1, r1, asr #2
137	bne     			Radix4FFT_LOOP1
138
139Radix4FFT_END:
140	ldmia   			sp!, {r4 - r11, pc}
141
142	@ENDP  @ |Radix4FFT|
143	.end