Mercurial > hg > peckfft
comparison kf_bfly4.S @ 11:abdcde012978
backup
author | Peter Meerwald <p.meerwald@bct-electronic.com> |
---|---|
date | Thu, 22 Sep 2011 15:19:18 +0200 |
parents | 05f6ab0a17c0 |
children | 655dc5c14169 |
comparison
equal
deleted
inserted
replaced
10:05f6ab0a17c0 | 11:abdcde012978 |
---|---|
18 stmfd sp!, {r4, r5, r6, r7, r8, sl} | 18 stmfd sp!, {r4, r5, r6, r7, r8, sl} |
19 .save {r4, r5, r6, r7, r8, sl} | 19 .save {r4, r5, r6, r7, r8, sl} |
20 mov r4, r3, asl #1 | 20 mov r4, r3, asl #1 |
21 add r6, r4, r3 | 21 add r6, r4, r3 |
22 add ip, r2, #264 | 22 add ip, r2, #264 |
23 ldr r2, [r2, #4] | 23 |
24 cmp r2, #0 | |
25 beq .forward | |
26 mov r8, r1, asl #4 | 24 mov r8, r1, asl #4 |
27 mov r7, r1, asl #5 | 25 mov r7, r1, asl #5 |
28 add r1, r1, r1, asl #1 | 26 add r1, r1, r1, asl #1 |
29 mov r1, r1, asl #4 | 27 ldr r2, [r2, #4] |
30 add r2, r0, #0 | |
31 add r5, r0, r3, asl #4 | 28 add r5, r0, r3, asl #4 |
32 add r4, r0, r4, asl #4 | 29 add r4, r0, r4, asl #4 |
30 mov r1, r1, asl #4 | |
31 mov sl, ip | |
32 cmp r2, #0 | |
33 beq .forward | |
34 add r2, r0, #0 | |
33 add r0, r0, r6, asl #4 | 35 add r0, r0, r6, asl #4 |
34 mov sl, ip | |
35 mov r6, ip | 36 mov r6, ip |
36 .inverse_loop: | 37 .inverse_loop: |
37 // C_MUL(scratch[0], Fout[m], *tw1); | 38 // C_MUL(scratch[0], Fout[m], *tw1); |
38 vld1.32 {d18,d19}, [r5] | 39 vld1.32 {d18,d19}, [r5] |
39 vld1.32 {d16,d17}, [ip] | 40 vld1.32 {d16,d17}, [ip] |
40 vmul.f32 d20, d18, d16 | 41 vmul.f32 d20, d18, d16 |
42 vmul.f32 d21, d16, d19 | |
43 // load Fout[m2], *tw2 | |
44 vld1.32 {d14,d15}, [r4] | |
45 vld1.32 {d12,d13}, [r6] | |
41 vmls.f32 d20, d19, d17 | 46 vmls.f32 d20, d19, d17 |
42 vmul.f32 d21, d16, d19 | |
43 vmla.f32 d21, d18, d17 | 47 vmla.f32 d21, d18, d17 |
44 | 48 |
45 // C_MUL(scratch[3], Fout[m2], *tw2); | 49 // C_MUL(scratch[3], Fout[m2], *tw2); |
46 vld1.32 {d18,d19}, [r4] | 50 vmul.f32 d22, d14, d12 |
47 vld1.32 {d16,d17}, [r6] | 51 vmul.f32 d23, d12, d15 |
48 vmul.f32 d22, d18, d16 | 52 // load Fout[m3], *tw3 |
49 vmls.f32 d22, d19, d17 | 53 vld1.32 {d18,d19}, [r0] |
50 vmul.f32 d23, d16, d19 | 54 vld1.32 {d16,d17}, [sl] |
51 vmla.f32 d23, d18, d17 | 55 vmls.f32 d22, d15, d13 |
56 vmla.f32 d23, d14, d13 | |
52 | 57 |
53 // C_MUL(scratch[2], Fout[m3], *tw3); | 58 // C_MUL(scratch[2], Fout[m3], *tw3); |
54 vld1.32 {d18,d19}, [r0] | |
55 vld1.32 {d16,d17}, [sl] | |
56 vmul.f32 d24, d18, d16 | 59 vmul.f32 d24, d18, d16 |
60 vmul.f32 d25, d16, d19 | |
61 | |
62 // C_SUB(scratch[1], *Fout, scratch[3]); | |
63 vld1.32 {d14,d15}, [r2] | |
64 vsub.f32 q13, q7, q11 | |
65 | |
57 vmls.f32 d24, d19, d17 | 66 vmls.f32 d24, d19, d17 |
58 vmul.f32 d25, d16, d19 | |
59 vmla.f32 d25, d18, d17 | 67 vmla.f32 d25, d18, d17 |
60 | 68 |
61 // C_SUB(scratch[1], *Fout, scratch[3]); | |
62 vld1.32 {d16,d17}, [r2] | |
63 vsubq.f32 q13, q8, q11 | |
64 | |
65 // C_ADDTO(*Fout, scratch[3]); | 69 // C_ADDTO(*Fout, scratch[3]); |
66 vaddq.f32 q8, q8, q11 | 70 vadd.f32 q7, q7, q11 |
71 // C_ADD(scratch[3], scratch[0], scratch[2]); | |
72 vadd.f32 q11, q10, q12 | |
67 vst1.32 {d16,d17}, [r2] | 73 vst1.32 {d16,d17}, [r2] |
68 | 74 |
69 // C_ADD(scratch[3], scratch[0], scratch[2]); | |
70 vaddq.f32 q11, q10, q12 | |
71 | |
72 // C_SUB(Fout[m2], *Fout, scratch[3]); | 75 // C_SUB(Fout[m2], *Fout, scratch[3]); |
73 vsubq.f32 q9, q8, q11 | 76 vsub.f32 q9, q7, q11 |
74 vst1.32 {d18,d19}, [r4]! | 77 vst1.32 {d18,d19}, [r4]! |
75 | 78 |
76 // C_ADDTO(*Fout, scratch[3]); | 79 // C_ADDTO(*Fout, scratch[3]); |
77 vaddq.f32 q8, q8, q11 | 80 vadd.f32 q7, q7, q11 |
78 vst1.32 {d16,d17}, [r2]! | 81 vst1.32 {d14,d15}, [r2]! |
79 | 82 |
80 add ip, ip, r8 | 83 add ip, ip, r8 |
81 add r6, r6, r7 | 84 add r6, r6, r7 |
82 add sl, sl, r1 | 85 add sl, sl, r1 |
83 | 86 |
84 // C_SUB(scratch[3], scratch[0], scratch[2]); | 87 // C_SUB(scratch[3], scratch[0], scratch[2]); |
85 vsubq.f32 q11, q10, q12 | 88 vsub.f32 q11, q10, q12 |
86 | 89 |
87 // Fout[m].r = scratch[1].r - scratch[3].i; | 90 // Fout[m].r = scratch[1].r - scratch[3].i; |
88 // Fout[m].i = scratch[1].i + scratch[3].r; | 91 // Fout[m].i = scratch[1].i + scratch[3].r; |
89 vsub.f32 d18, d26, d23 | 92 vsub.f32 d18, d26, d23 |
90 vadd.f32 d19, d27, d22 | 93 vadd.f32 d19, d27, d22 |
98 | 101 |
99 subs r3, r3, #1 | 102 subs r3, r3, #1 |
100 bne .inverse_loop | 103 bne .inverse_loop |
101 b .done | 104 b .done |
102 .forward: | 105 .forward: |
103 mov r8, r1, asl #4 | |
104 mov r7, r1, asl #5 | |
105 add r1, r1, r1, asl #1 | |
106 mov r1, r1, asl #4 | |
107 add r2, r0, #0 | 106 add r2, r0, #0 |
108 add r5, r0, r3, asl #4 | |
109 add r4, r0, r4, asl #4 | |
110 add r0, r0, r6, asl #4 | 107 add r0, r0, r6, asl #4 |
111 mov sl, ip | |
112 mov r6, ip | 108 mov r6, ip |
113 .forward_loop: | 109 .forward_loop: |
114 // C_MUL(scratch[0], Fout[m], *tw1); | 110 // C_MUL(scratch[0], Fout[m], *tw1); |
115 vld1.32 {d18,d19}, [r5] | 111 vld1.32 {d18,d19}, [r5] |
116 vld1.32 {d16,d17}, [ip] | 112 vld1.32 {d16,d17}, [ip] |
117 vmul.f32 d20, d18, d16 | 113 vmul.f32 d20, d18, d16 |
114 vmul.f32 d21, d16, d19 | |
115 // load Fout[m2], *tw2 | |
116 vld1.32 {d14,d15}, [r4] | |
117 vld1.32 {d12,d13}, [r6] | |
118 vmls.f32 d20, d19, d17 | 118 vmls.f32 d20, d19, d17 |
119 vmul.f32 d21, d16, d19 | |
120 vmla.f32 d21, d18, d17 | 119 vmla.f32 d21, d18, d17 |
121 | 120 |
122 // C_MUL(scratch[3], Fout[m2], *tw2); | 121 // C_MUL(scratch[3], Fout[m2], *tw2); |
123 vld1.32 {d18,d19}, [r4] | 122 vmul.f32 d22, d14, d12 |
124 vld1.32 {d16,d17}, [r6] | 123 vmul.f32 d23, d12, d15 |
125 vmul.f32 d22, d18, d16 | 124 // load Fout[m3], *tw3 |
126 vmls.f32 d22, d19, d17 | 125 vld1.32 {d18,d19}, [r0] |
127 vmul.f32 d23, d16, d19 | 126 vld1.32 {d16,d17}, [sl] |
128 vmla.f32 d23, d18, d17 | 127 vmls.f32 d22, d15, d13 |
128 vmla.f32 d23, d14, d13 | |
129 | 129 |
130 // C_MUL(scratch[2], Fout[m3], *tw3); | 130 // C_MUL(scratch[2], Fout[m3], *tw3); |
131 vld1.32 {d18,d19}, [r0] | |
132 vld1.32 {d16,d17}, [sl] | |
133 vmul.f32 d24, d18, d16 | 131 vmul.f32 d24, d18, d16 |
132 vmul.f32 d25, d16, d19 | |
133 | |
134 // C_SUB(scratch[1], *Fout, scratch[3]); | |
135 vld1.32 {d14,d15}, [r2] | |
136 vsub.f32 q13, q7, q11 | |
137 | |
134 vmls.f32 d24, d19, d17 | 138 vmls.f32 d24, d19, d17 |
135 vmul.f32 d25, d16, d19 | |
136 vmla.f32 d25, d18, d17 | 139 vmla.f32 d25, d18, d17 |
137 | 140 |
138 // C_SUB(scratch[1], *Fout, scratch[3]); | |
139 vld1.32 {d16,d17}, [r2] | |
140 vsubq.f32 q13, q8, q11 | |
141 | |
142 // C_ADDTO(*Fout, scratch[3]); | 141 // C_ADDTO(*Fout, scratch[3]); |
143 vaddq.f32 q8, q8, q11 | 142 vadd.f32 q7, q7, q11 |
143 // C_ADD(scratch[3], scratch[0], scratch[2]); | |
144 vadd.f32 q11, q10, q12 | |
144 vst1.32 {d16,d17}, [r2] | 145 vst1.32 {d16,d17}, [r2] |
145 | 146 |
146 // C_ADD(scratch[3], scratch[0], scratch[2]); | |
147 vaddq.f32 q11, q10, q12 | |
148 | |
149 // C_SUB(Fout[m2], *Fout, scratch[3]); | 147 // C_SUB(Fout[m2], *Fout, scratch[3]); |
150 vsubq.f32 q9, q8, q11 | 148 vsub.f32 q9, q7, q11 |
151 vst1.32 {d18,d19}, [r4]! | 149 vst1.32 {d18,d19}, [r4]! |
152 | 150 |
153 // C_ADDTO(*Fout, scratch[3]); | 151 // C_ADDTO(*Fout, scratch[3]); |
154 vaddq.f32 q8, q8, q11 | 152 vadd.f32 q7, q7, q11 |
155 vst1.32 {d16,d17}, [r2]! | 153 vst1.32 {d14,d15}, [r2]! |
156 | 154 |
157 add ip, ip, r8 | 155 add ip, ip, r8 |
158 add r6, r6, r7 | 156 add r6, r6, r7 |
159 add sl, sl, r1 | 157 add sl, sl, r1 |
160 | 158 |
161 // C_SUB(scratch[3], scratch[0], scratch[2]); | 159 // C_SUB(scratch[3], scratch[0], scratch[2]); |
162 vsubq.f32 q11, q10, q12 | 160 vsub.f32 q11, q10, q12 |
163 | 161 |
164 // Fout[m].r = scratch[1].r - scratch[3].i; | 162 // Fout[m].r = scratch[1].r - scratch[3].i; |
165 // Fout[m].i = scratch[1].i + scratch[3].r; | 163 // Fout[m].i = scratch[1].i + scratch[3].r; |
166 vadd.f32 d18, d26, d23 | 164 vadd.f32 d18, d26, d23 |
167 vsub.f32 d19, d27, d22 | 165 vsub.f32 d19, d27, d22 |