e38fee1b |
1 | @@\r |
2 | @@ Copyright (C) 2012 Roman Pauer\r |
3 | @@\r |
4 | @@ Permission is hereby granted, free of charge, to any person obtaining a copy of\r |
5 | @@ this software and associated documentation files (the "Software"), to deal in\r |
6 | @@ the Software without restriction, including without limitation the rights to\r |
7 | @@ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r |
8 | @@ of the Software, and to permit persons to whom the Software is furnished to do\r |
9 | @@ so, subject to the following conditions:\r |
10 | @@\r |
11 | @@ The above copyright notice and this permission notice shall be included in all\r |
12 | @@ copies or substantial portions of the Software.\r |
13 | @@\r |
14 | @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r |
15 | @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r |
16 | @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r |
17 | @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r |
18 | @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r |
19 | @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r |
20 | @@ SOFTWARE.\r |
21 | @@\r |
22 | \r |
23 | \r |
24 | @ A B C --\ E0 E1 E2\r |
25 | @ D E F --/ E3 E4 E5\r |
26 | @ G H I E6 E7 E8\r |
27 | \r |
28 | @ q0 = S1sl < A >\r |
29 | @ q1 = S2sl < D >\r |
30 | @ q2 = S3sl < G >\r |
31 | @ q3 = S1sr < C >\r |
32 | @ q4 = S2sr < F >\r |
33 | @ q5 = S3sr < I >\r |
34 | @ q6 =\r |
35 | @ q7 =\r |
36 | @ q8 = S1\r |
37 | @ q9 = S2\r |
38 | @ q10 = S3\r |
39 | @ q11 =\r |
40 | @ q12 = S2prev < E >\r |
41 | @ q13 =\r |
42 | @ q14 = S1prev < B >\r |
43 | @ q15 = S3prev < H >\r |
44 | \r |
45 | \r |
46 | .macro ___neon_scale3x_8_8_slice counter, dst1, dst2, dst3, reg1, dB0, dB1, dH0, dH1, first15, last16\r |
47 | \r |
48 | @ d12 = E0[0]\r |
49 | @ d13 = E1[0]\r |
50 | @ d14 = E2[0]\r |
51 | @ d15 = tmp0[0]\r |
52 | @ d22 = E3[0]\r |
53 | @ d23 = tmp1[0]\r |
54 | @ d24 = E4[0]\r |
55 | @ d25 = E4[1]\r |
56 | @ d26 = E5[0]\r |
57 | @ d27 = C0[0]\r |
58 | \r |
59 | @ q0 = tmp2\r |
60 | @ q3 = tmp3\r |
61 | @ q2 = tmp4\r |
62 | @ q5 = tmp5\r |
63 | \r |
64 | vceq.i8 d15, \dB0, \dH0 @ tmp0[0] = < B == H >\r |
65 | \r |
66 | vceq.i8 d23, d2, d8 @ tmp1[0] = < D == F >\r |
67 | \r |
68 | .if \first15\r |
69 | cmp \reg1, #8\r |
70 | .endif\r |
71 | \r |
72 | vceq.i8 q0, q12, q0 @ tmp2 = < E == A >\r |
73 | \r |
74 | vceq.i8 q3, q12, q3 @ tmp3 = < E == C >\r |
75 | \r |
76 | .if \first15\r |
77 | add \reg1, \reg1, \reg1, lsl #1 @ reg1 = 3 * (counter & 15)\r |
78 | .endif\r |
79 | \r |
80 | vorr d27, d15, d23 @ C0[0] = < B == H || D == F >\r |
81 | \r |
82 | vceq.i8 d22, d2, \dB0 @ E3[0] = < D == B >\r |
83 | \r |
84 | vceq.i8 d26, \dB0, d8 @ E5[0] = < B == F >\r |
85 | \r |
86 | vceq.i8 q2, q12, q2 @ tmp4 = < E == G >\r |
87 | \r |
88 | vceq.i8 q5, q12, q5 @ tmp5 = < E == I >\r |
89 | \r |
90 | .if \first15\r |
91 | sub \reg1, \reg1, #(3*8) @ reg1 -= 3*8\r |
92 | .endif\r |
93 | \r |
94 | vorn d15, d6, d22 @ tmp0[0] = < (E == C) || !(D == B) >\r |
95 | \r |
96 | vorn d23, d0, d26 @ tmp1[0] = < (E == A) || !(B == F) >\r |
97 | \r |
98 | vorn d12, d27, d22 @ E0[0] = < C0 || !(D == B) >\r |
99 | \r |
100 | vand d13, d15, d23 @ E1[0] = < ((E == C) || !(D == B)) && ((E == A) || !(B == F)) >\r |
101 | \r |
102 | vorn d14, d27, d26 @ E2[0] = < C0 || !(B == F) >\r |
103 | \r |
104 | vorr d13, d27, d13 @ E1[0] = < C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F))) >\r |
105 | \r |
106 | vbsl d12, d24, d2 @ E0[0] = < (C0 || !(D == B)) ? E : D >\r |
107 | \r |
108 | vbsl d14, d24, d8 @ E2[0] = < (C0 || !(B == F)) ? E : F >\r |
109 | \r |
110 | vbsl d13, d24, \dB0 @ E1[0] = < (C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F)))) ? E : B >\r |
111 | \r |
112 | vceq.i8 d15, d2, \dH0 @ tmp0[0] = < D == H >\r |
113 | \r |
114 | vceq.i8 d23, \dH0, d8 @ tmp1[0] = < H == F >\r |
115 | \r |
116 | vorn d22, d4, d22 @ E3[0] = < (E == G) || !(D == B) >\r |
117 | vst3.8 {d12-d14}, [\dst1]! @ [dst] = E0,E1,E2; dst1 += 3*8\r |
118 | \r |
119 | .if \first15\r |
120 | addls \dst1, \dst1, \reg1 @ dst1 += reg1\r |
121 | .endif\r |
122 | \r |
123 | vorn d26, d10, d26 @ E5[0] = < (E == I) || !(B == F) >\r |
124 | \r |
125 | @ d12 = tmp6[0]\r |
126 | @ d13 = tmp7[0]\r |
127 | \r |
128 | vorn d12, d0, d15 @ tmp6[0] = < (E == A) || !(D == H) >\r |
129 | \r |
130 | vorn d13, d6, d23 @ tmp7[0] = < (E == C) || !(H == F) >\r |
131 | \r |
132 | vand d22, d22, d12 @ E3[0] = < ((E == G) || !(D == B)) && ((E == A) || !(D == H)) >\r |
133 | \r |
134 | vand d26, d26, d13 @ E5[0] = < ((E == I) || !(B == F)) && ((E == C) || !(H == F)) >\r |
135 | \r |
136 | @ d12 = E6[0]\r |
137 | @ d13 = E7[0]\r |
138 | @ d14 = E8[0]\r |
139 | \r |
140 | vorr d22, d27, d22 @ E3[0] = < C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H))) >\r |
141 | \r |
142 | vorr d26, d27, d26 @ E5[0] = < C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F))) >\r |
143 | \r |
144 | vbsl d22, d24, d2 @ E3[0] = < (C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H)))) ? E : D >\r |
145 | \r |
146 | vbsl d26, d24, d8 @ E5[0] = < (C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F)))) ? E : F >\r |
147 | \r |
148 | vorn d13, d10, d15 @ E7[0] = < (E == I) || !(D == H) >\r |
149 | \r |
150 | vorn d12, d27, d15 @ E6[0] = < C0 || !(D == H) >\r |
151 | vst3.8 {d22,d24,d26}, [\dst2]! @ [dst + dststride] = E3,E4,E5; dst2 += 3*8\r |
152 | \r |
153 | .if \first15\r |
154 | addls \dst2, \dst2, \reg1 @ dst2 += reg1\r |
155 | .endif\r |
156 | \r |
157 | vorn d15, d4, d23 @ tmp0[0] = < (E == G) || !(H == F) >\r |
158 | \r |
159 | vorn d14, d27, d23 @ E8[0] = < C0 || !(H == F) >\r |
160 | \r |
161 | vand d13, d13, d15 @ E7[0] = < ((E == I) || !(D == H)) && ((E == G) || !(H == F)) >\r |
162 | \r |
163 | vbsl d12, d24, d2 @ E6[0] = < (C0 || !(D == H)) ? E : D >\r |
164 | \r |
165 | vorr d13, d27, d13 @ E7[0] = < C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F))) >\r |
166 | \r |
167 | vbsl d14, d24, d8 @ E8[0] = < (C0 || !(H == F)) ? E : F >\r |
168 | \r |
169 | vbsl d13, d24, \dH0 @ E7[0] = < (C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F)))) ? E : H >\r |
170 | \r |
171 | @ d15 = tmp0[1]\r |
172 | @ d22 = tmp1[1]\r |
173 | @ d23 = E3[1]\r |
174 | @ d24 = E4[0]\r |
175 | @ d25 = E4[1]\r |
176 | @ d26 = C0[1]\r |
177 | @ d27 = E5[1]\r |
178 | \r |
179 | vceq.i8 d15, \dB1, \dH1 @ tmp0[1] = < B == H >\r |
180 | \r |
181 | vceq.i8 d22, d3, d9 @ tmp1[1] = < D == F >\r |
182 | \r |
183 | vceq.i8 d23, d3, \dB1 @ E3[1] = < D == B >\r |
184 | vst3.8 {d12-d14}, [\dst3]! @ [dst + 2 * dststride] = E6,E7,E8; dst3 += 3*8\r |
185 | \r |
186 | .if \first15\r |
187 | addls \dst3, \dst3, \reg1 @ dst3 += reg1\r |
188 | bls 0f\r |
189 | .endif\r |
190 | \r |
191 | @ d12 = E0[1]\r |
192 | @ d13 = E1[1]\r |
193 | @ d14 = E2[1]\r |
194 | \r |
195 | vorr d26, d15, d22 @ C0[1] = < B == H || D == F >\r |
196 | \r |
197 | vceq.i8 d27, \dB1, d9 @ E5[1] = < B == F >\r |
198 | \r |
199 | vorn d15, d7, d23 @ tmp0[1] = < (E == C) || !(D == B) >\r |
200 | \r |
201 | vorn d22, d1, d27 @ tmp1[1] = < (E == A) || !(B == F) >\r |
202 | \r |
203 | vorn d12, d26, d23 @ E0[1] = < C0 || !(D == B) >\r |
204 | \r |
205 | vand d13, d15, d22 @ E1[1] = < ((E == C) || !(D == B)) && ((E == A) || !(B == F)) >\r |
206 | \r |
207 | vorn d14, d26, d27 @ E2[1] = < C0 || !(B == F) >\r |
208 | \r |
209 | vorr d13, d26, d13 @ E1[1] = < C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F))) >\r |
210 | \r |
211 | vbsl d12, d25, d3 @ E0[1] = < (C0 || !(D == B)) ? E : D >\r |
212 | \r |
213 | vbsl d14, d25, d9 @ E2[1] = < (C0 || !(B == F)) ? E : F >\r |
214 | \r |
215 | vbsl d13, d25, \dB1 @ E1[1] = < (C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F)))) ? E : B >\r |
216 | \r |
217 | vceq.i8 d15, d3, \dH1 @ tmp0[1] = < D == H >\r |
218 | \r |
219 | vceq.i8 d22, \dH1, d9 @ tmp1[1] = < H == F >\r |
220 | \r |
221 | vorn d23, d5, d23 @ E3[1] = < (E == G) || !(D == B) >\r |
222 | .ifeq \first15\r |
223 | vst3.8 {d12-d14}, [\dst1]! @ [dst] = E0,E1,E2; dst1 += 3*8\r |
224 | .else\r |
225 | vst3.8 {d12-d14}, [\dst1],\reg1 @ [dst] = E0,E1,E2; dst1 += reg1\r |
226 | .endif\r |
227 | \r |
228 | vorn d27, d11, d27 @ E5[1] = < (E == I) || !(B == F) >\r |
229 | \r |
230 | @ d12 = tmp6[1]\r |
231 | @ d13 = tmp7[1]\r |
232 | \r |
233 | vorn d12, d1, d15 @ tmp6[1] = < (E == A) || !(D == H) >\r |
234 | \r |
235 | vorn d13, d7, d22 @ tmp7[1] = < (E == C) || !(H == F) >\r |
236 | \r |
237 | vand d23, d23, d12 @ E3[1] = < ((E == G) || !(D == B)) && ((E == A) || !(D == H)) >\r |
238 | \r |
239 | vand d27, d27, d13 @ E5[1] = < ((E == I) || !(B == F)) && ((E == C) || !(H == F)) >\r |
240 | \r |
241 | @ d12 = E6[1]\r |
242 | @ d13 = E7[1]\r |
243 | @ d14 = E8[1]\r |
244 | \r |
245 | vorr d23, d26, d23 @ E3[1] = < C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H))) >\r |
246 | \r |
247 | vorr d27, d26, d27 @ E5[1] = < C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F))) >\r |
248 | \r |
249 | vbsl d23, d25, d3 @ E3[1] = < (C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H)))) ? E : D >\r |
250 | \r |
251 | vbsl d27, d25, d9 @ E5[1] = < (C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F)))) ? E : F >\r |
252 | \r |
253 | vorn d13, d11, d15 @ E7[1] = < (E == I) || !(D == H) >\r |
254 | \r |
255 | vorn d12, d26, d15 @ E6[1] = < C0 || !(D == H) >\r |
256 | .ifeq \first15\r |
257 | vst3.8 {d23,d25,d27}, [\dst2]! @ [dst + dststride] = E3,E4,E5; dst2 += 3*8\r |
258 | .else\r |
259 | vst3.8 {d23,d25,d27}, [\dst2],\reg1 @ [dst + dststride] = E3,E4,E5; dst2 += reg1\r |
260 | .endif\r |
261 | \r |
262 | vorn d15, d5, d22 @ tmp0[1] = < (E == G) || !(H == F) >\r |
263 | \r |
264 | vorn d14, d26, d22 @ E8[1] = < C0 || !(H == F) >\r |
265 | \r |
266 | vand d13, d13, d15 @ E7[1] = < ((E == I) || !(D == H)) && ((E == G) || !(H == F)) >\r |
267 | \r |
268 | vbsl d12, d25, d3 @ E6[1] = < (C0 || !(D == H)) ? E : D >\r |
269 | \r |
270 | vorr d13, d26, d13 @ E7[1] = < C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F))) >\r |
271 | \r |
272 | vbsl d14, d25, d9 @ E8[1] = < (C0 || !(H == F)) ? E : F >\r |
273 | \r |
274 | vbsl d13, d25, \dH1 @ E7[1] = < (C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F)))) ? E : H >\r |
275 | \r |
276 | .ifeq \first15\r |
277 | \r |
278 | .ifeq \last16\r |
279 | sub \counter, \counter, #16 @ counter -= 16\r |
280 | cmp \counter, #16\r |
281 | .endif\r |
282 | \r |
283 | vst3.8 {d12-d14}, [\dst3]! @ [dst + 2 * dststride] = E6,E7,E8; dst3 += 3*8\r |
284 | .else\r |
285 | vst3.8 {d12-d14}, [\dst3],\reg1 @ [dst + 2 * dststride] = E6,E7,E8; dst3 += reg1\r |
286 | \r |
287 | 0:\r |
288 | .endif\r |
289 | \r |
290 | .endm\r |
291 | \r |
292 | .macro __neon_scale3x_8_8_line src1, src2, src3, counter, dst1, dst2, dst3, reg1, qB, qH, dB0, dB1, dH0, dH1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
293 | \r |
294 | .ifeqs "\qB", "q14"\r |
295 | vld1.8 {d29[7]}, [\src1] @ S1prev[15] = src[-srcstride]\r |
296 | .endif\r |
297 | vld1.8 {d25[7]}, [\src2] @ S2prev[15] = src[0]\r |
298 | .ifeqs "\qH", "q15"\r |
299 | vld1.8 {d31[7]}, [\src3] @ S3prev[15] = src[srcstride]\r |
300 | .endif\r |
301 | andS \reg1, \counter, #15 @ reg1 = counter & 15\r |
302 | \r |
303 | .ifnes "\qB", "q14"\r |
304 | add \src1, \src1, \counter @ src1 += counter\r |
305 | .endif\r |
306 | .ifnes "\qH", "q15"\r |
307 | add \src3, \src3, \counter @ src3 += counter\r |
308 | .endif\r |
309 | beq 1f\r |
310 | \r |
311 | @ first 1-15 pixels - align counter to 16 bytes\r |
312 | \r |
313 | sub \reg1, \reg1, #1 @ reg1 = (counter & 15) - 1\r |
314 | \r |
315 | .ifeqs "\qB", "q14"\r |
316 | vld1.8 {q8}, [\src1] @ S1 = [src - srcstride]\r |
317 | add \src1, \src1, \reg1 @ src1 += (counter & 15) - 1\r |
318 | .endif\r |
319 | \r |
320 | vld1.8 {q9}, [\src2] @ S2 = [src ]\r |
321 | add \src2, \src2, \reg1 @ src2 += (counter & 15) - 1\r |
322 | \r |
323 | .ifeqs "\qH", "q15"\r |
324 | vld1.8 {q10}, [\src3] @ S3 = [src + srcstride]\r |
325 | add \src3, \src3, \reg1 @ src3 += (counter & 15) - 1\r |
326 | .endif\r |
327 | .ifeqs "\qB", "q14"\r |
328 | vext.8 q0, \qB, q8, #15 @ S1sl = S1prev[15] | (S1 << 8) < S >\r |
329 | \r |
330 | vmov \qB, q8 @ S1prev = S1 < T >\r |
331 | .endif\r |
332 | vext.8 q1, q12, q9, #15 @ S2sl = S2prev[15] | (S2 << 8) < V >\r |
333 | \r |
334 | vmov q12, q9 @ S2prev = S2 < C >\r |
335 | .ifeqs "\qH", "q15"\r |
336 | vext.8 q2, \qH, q10, #15 @ S3sl = S3prev[15] | (S3 << 8) < X >\r |
337 | \r |
338 | vmov \qH, q10 @ S3prev = S3 < Y >\r |
339 | .endif\r |
340 | .ifeqs "\qB", "q14"\r |
341 | vext.8 q3, \qB, q8, #1 @ S1sr = (S1prev >> 8) | ... < U >\r |
342 | .endif\r |
343 | \r |
344 | vext.8 q4, q12, q9, #1 @ S2sr = (S2prev >> 8) | ... < W >\r |
345 | \r |
346 | .ifeqs "\qH", "q15"\r |
347 | vext.8 q5, \qH, q10, #1 @ S3sr = (S3prev >> 8) | ... < Z >\r |
348 | .else\r |
349 | vmov q2, q1 @ S3sl = S2sl < X >\r |
350 | \r |
351 | vmov q5, q4 @ S3sr = S2sr < Z >\r |
352 | .endif\r |
353 | \r |
354 | .ifnes "\qB", "q14"\r |
355 | vmov q0, q1 @ S1sl = S2sl < S >\r |
356 | \r |
357 | vmov q3, q4 @ S1sr = S2sr < U >\r |
358 | .else\r |
359 | vld1.8 {d29[7]}, [\src1]! @ S1prev[15] = src[counter & 15 - 1 - srcstride]; src1++\r |
360 | .endif\r |
361 | \r |
362 | add \reg1, \reg1, #1 @ reg1 = counter & 15\r |
363 | \r |
364 | vld1.8 {d25[7]}, [\src2]! @ S2prev[15] = src[counter & 15 - 1]; src2++\r |
365 | \r |
366 | bic \counter, \counter, #15\r |
367 | \r |
368 | .ifeqs "\qH", "q15"\r |
369 | vld1.8 {d31[7]}, [\src3]! @ S3prev[15] = src[counter & 15 - 1 + srcstride]; src3++\r |
370 | .endif\r |
371 | \r |
372 | ___neon_scale3x_8_8_slice \counter, \dst1, \dst2, \dst3, \reg1, \dB0, \dB1, \dH0, \dH1, 1, 0\r |
373 | \r |
374 | \r |
375 | @ counter is aligned to 16 bytes\r |
376 | \r |
377 | 1:\r |
378 | .ifeqs "\qB", "q14"\r |
379 | vld1.8 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 16\r |
380 | .endif\r |
381 | vld1.8 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 16\r |
382 | .ifeqs "\qH", "q15"\r |
383 | vld1.8 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 16\r |
384 | .endif\r |
385 | \r |
386 | @ inner loop (16 pixels per iteration)\r |
387 | 2:\r |
388 | \r |
389 | .ifeqs "\qB", "q14"\r |
390 | vext.8 q0, \qB, q8, #15 @ S1sl = S1prev[15] | (S1 << 8) < A >\r |
391 | vmov \qB, q8 @ S1prev = S1 < B >\r |
392 | .endif\r |
393 | \r |
394 | vext.8 q1, q12, q9, #15 @ S2sl = S2prev[15] | (S2 << 8) < D >\r |
395 | vmov q12, q9 @ S2prev = S2 < E >\r |
396 | \r |
397 | .ifeqs "\qH", "q15"\r |
398 | vext.8 q2, \qH, q10, #15 @ S3sl = S3prev[15] | (S3 << 8) < G >\r |
399 | vmov \qH, q10 @ S3prev = S3 < H >\r |
400 | .endif\r |
401 | \r |
402 | .ifeqs "\qB", "q14"\r |
403 | vld1.8 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 16\r |
404 | vext.8 q3, \qB, q8, #1 @ S1sr = (S1prev >> 8) | S1[0] < C >\r |
405 | .endif\r |
406 | \r |
407 | vld1.8 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 16\r |
408 | vext.8 q4, q12, q9, #1 @ S2sr = (S2prev >> 8) | S2[0] < F >\r |
409 | \r |
410 | .ifeqs "\qH", "q15"\r |
411 | vld1.8 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 16\r |
412 | vext.8 q5, \qH, q10, #1 @ S3sr = (S3prev >> 8) | S3[0] < I >\r |
413 | .else\r |
414 | vmov q2, q1 @ S3sl = S2sl < G >\r |
415 | \r |
416 | vmov q5, q4 @ S3sr = S2sr < I >\r |
417 | .endif\r |
418 | \r |
419 | .ifnes "\qB", "q14"\r |
420 | vmov q0, q1 @ S1sl = S2sl < A >\r |
421 | \r |
422 | vmov q3, q4 @ S1sr = S2sr < C >\r |
423 | .endif\r |
424 | \r |
425 | ___neon_scale3x_8_8_slice \counter, \aldst1, \aldst2, \aldst3, \reg1, \dB0, \dB1, \dH0, \dH1, 0, 0\r |
426 | \r |
427 | bhi 2b\r |
428 | \r |
429 | @ last 16 pixels\r |
430 | \r |
431 | .ifeqs "\qB", "q14"\r |
432 | vext.8 q0, \qB, q8, #15 @ S1sl = S1prev[15] | (S1 << 8) < A >\r |
433 | vmov \qB, q8 @ S1prev = S1 < B >\r |
434 | .endif\r |
435 | \r |
436 | vext.8 q1, q12, q9, #15 @ S2sl = S2prev[15] | (S2 << 8) < D >\r |
437 | vmov q12, q9 @ S2prev = S2 < E >\r |
438 | \r |
439 | .ifeqs "\qH", "q15"\r |
440 | vext.8 q2, \qH, q10, #15 @ S3sl = S3prev[15] | (S3 << 8) < G >\r |
441 | vmov \qH, q10 @ S3prev = S3 < H >\r |
442 | .endif\r |
443 | \r |
444 | .ifeqs "\qB", "q14"\r |
445 | vshr.u64 d16, d17, #(64-8) @ S1[0] = S1[15] | ...\r |
446 | .endif\r |
447 | \r |
448 | vshr.u64 d18, d19, #(64-8) @ S2[0] = S2[15] | ...\r |
449 | \r |
450 | .ifeqs "\qH", "q15"\r |
451 | vshr.u64 d20, d21, #(64-8) @ S3[0] = S3[15] | ...\r |
452 | .endif\r |
453 | .ifeqs "\qB", "q14"\r |
454 | vext.8 q3, \qB, q8, #1 @ S1sr = (S1prev >> 8) | S1[0] < C >\r |
455 | .endif\r |
456 | \r |
457 | vext.8 q4, q12, q9, #1 @ S2sr = (S2prev >> 8) | S2[0] < F >\r |
458 | \r |
459 | .ifeqs "\qH", "q15"\r |
460 | vext.8 q5, \qH, q10, #1 @ S3sr = (S3prev >> 8) | S3[0] < I >\r |
461 | .else\r |
462 | vmov q2, q1 @ S3sl = S2sl < G >\r |
463 | \r |
464 | vmov q5, q4 @ S3sr = S2sr < I >\r |
465 | .endif\r |
466 | \r |
467 | .ifnes "\qB", "q14"\r |
468 | vmov q0, q1 @ S1sl = S2sl < A >\r |
469 | \r |
470 | vmov q3, q4 @ S1sr = S2sr < C >\r |
471 | .endif\r |
472 | \r |
473 | ___neon_scale3x_8_8_slice \counter, \aldst1, \aldst2, \aldst3, \reg1, \dB0, \dB1, \dH0, \dH1, 0, 1\r |
474 | \r |
475 | .endm\r |
476 | \r |
477 | .macro _neon_scale3x_8_8_line_first src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
478 | __neon_scale3x_8_8_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q12, q15, d24, d25, d30, d31, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
479 | .endm\r |
480 | \r |
481 | .macro _neon_scale3x_8_8_line_middle src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
482 | __neon_scale3x_8_8_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q14, q15, d28, d29, d30, d31, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
483 | .endm\r |
484 | \r |
485 | .macro _neon_scale3x_8_8_line_last src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
486 | __neon_scale3x_8_8_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q14, q12, d28, d29, d24, d25, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
487 | .endm\r |
488 | \r |
489 | .macro neon_scale3x_8_8_line part, src1, src2, src3, counter, dst1, dst2, dst3, reg1, srcalign16, dstalign8\r |
490 | .ifeq \srcalign16\r |
491 | \r |
492 | .ifeq \dstalign8\r |
493 | _neon_scale3x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1, \src2, \src3, \dst1, \dst2, \dst3\r |
494 | .else\r |
495 | _neon_scale3x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1, \src2, \src3, \dst1:64, \dst2:64, \dst3:64\r |
496 | .endif\r |
497 | \r |
498 | .else\r |
499 | \r |
500 | .ifeq \dstalign8\r |
501 | _neon_scale3x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1:128, \src2:128, \src3:128, \dst1, \dst2, \dst3\r |
502 | .else\r |
503 | _neon_scale3x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1:128, \src2:128, \src3:128, \dst1:64, \dst2:64, \dst3:64\r |
504 | .endif\r |
505 | \r |
506 | .endif\r |
507 | .endm\r |
508 | \r |
509 | \r |
510 | .macro ___neon_scale3x_16_16_slice counter, dst1, dst2, dst3, reg1, dB0, dB1, dH0, dH1, first7, last8\r |
511 | \r |
512 | @ d12 = E0[0]\r |
513 | @ d13 = E1[0]\r |
514 | @ d14 = E2[0]\r |
515 | @ d15 = tmp0[0]\r |
516 | @ d22 = E3[0]\r |
517 | @ d23 = tmp1[0]\r |
518 | @ d24 = E4[0]\r |
519 | @ d25 = E4[1]\r |
520 | @ d26 = E5[0]\r |
521 | @ d27 = C0[0]\r |
522 | \r |
523 | @ q0 = tmp2\r |
524 | @ q3 = tmp3\r |
525 | @ q2 = tmp4\r |
526 | @ q5 = tmp5\r |
527 | \r |
528 | vceq.i16 d15, \dB0, \dH0 @ tmp0[0] = < B == H >\r |
529 | \r |
530 | vceq.i16 d23, d2, d8 @ tmp1[0] = < D == F >\r |
531 | \r |
532 | .if \first7\r |
533 | cmp \reg1, #4\r |
534 | .endif\r |
535 | \r |
536 | vceq.i16 q0, q12, q0 @ tmp2 = < E == A >\r |
537 | \r |
538 | vceq.i16 q3, q12, q3 @ tmp3 = < E == C >\r |
539 | \r |
540 | .if \first7\r |
541 | lsl \reg1, #1 @ reg1 = 2 * (counter & 7)\r |
542 | .endif\r |
543 | \r |
544 | vorr d27, d15, d23 @ C0[0] = < B == H || D == F >\r |
545 | \r |
546 | vceq.i16 d22, d2, \dB0 @ E3[0] = < D == B >\r |
547 | \r |
548 | vceq.i16 d26, \dB0, d8 @ E5[0] = < B == F >\r |
549 | \r |
550 | vceq.i16 q2, q12, q2 @ tmp4 = < E == G >\r |
551 | \r |
552 | vceq.i16 q5, q12, q5 @ tmp5 = < E == I >\r |
553 | \r |
554 | .if \first7\r |
555 | add \reg1, \reg1, \reg1, lsl #1 @ reg1 = 2 * 3 * (counter & 7)\r |
556 | .endif\r |
557 | \r |
558 | vorn d15, d6, d22 @ tmp0[0] = < (E == C) || !(D == B) >\r |
559 | \r |
560 | vorn d23, d0, d26 @ tmp1[0] = < (E == A) || !(B == F) >\r |
561 | \r |
562 | vorn d12, d27, d22 @ E0[0] = < C0 || !(D == B) >\r |
563 | \r |
564 | .if \first7\r |
565 | sub \reg1, \reg1, #(3*2*4) @ reg1 -= 3*2*4\r |
566 | .endif\r |
567 | \r |
568 | vand d13, d15, d23 @ E1[0] = < ((E == C) || !(D == B)) && ((E == A) || !(B == F)) >\r |
569 | \r |
570 | vorn d14, d27, d26 @ E2[0] = < C0 || !(B == F) >\r |
571 | \r |
572 | vorr d13, d27, d13 @ E1[0] = < C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F))) >\r |
573 | \r |
574 | vbsl d12, d24, d2 @ E0[0] = < (C0 || !(D == B)) ? E : D >\r |
575 | \r |
576 | vbsl d14, d24, d8 @ E2[0] = < (C0 || !(B == F)) ? E : F >\r |
577 | \r |
578 | vbsl d13, d24, \dB0 @ E1[0] = < (C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F)))) ? E : B >\r |
579 | \r |
580 | vceq.i16 d15, d2, \dH0 @ tmp0[0] = < D == H >\r |
581 | \r |
582 | vceq.i16 d23, \dH0, d8 @ tmp1[0] = < H == F >\r |
583 | \r |
584 | vorn d22, d4, d22 @ E3[0] = < (E == G) || !(D == B) >\r |
585 | vst3.16 {d12-d14}, [\dst1]! @ [dst] = E0,E1,E2; dst1 += 3*2*4\r |
586 | \r |
587 | .if \first7\r |
588 | addls \dst1, \dst1, \reg1 @ dst1 += reg1\r |
589 | .endif\r |
590 | \r |
591 | vorn d26, d10, d26 @ E5[0] = < (E == I) || !(B == F) >\r |
592 | \r |
593 | @ d12 = tmp6[0]\r |
594 | @ d13 = tmp7[0]\r |
595 | \r |
596 | vorn d12, d0, d15 @ tmp6[0] = < (E == A) || !(D == H) >\r |
597 | \r |
598 | vorn d13, d6, d23 @ tmp7[0] = < (E == C) || !(H == F) >\r |
599 | \r |
600 | vand d22, d22, d12 @ E3[0] = < ((E == G) || !(D == B)) && ((E == A) || !(D == H)) >\r |
601 | \r |
602 | vand d26, d26, d13 @ E5[0] = < ((E == I) || !(B == F)) && ((E == C) || !(H == F)) >\r |
603 | \r |
604 | @ d12 = E6[0]\r |
605 | @ d13 = E7[0]\r |
606 | @ d14 = E8[0]\r |
607 | \r |
608 | vorr d22, d27, d22 @ E3[0] = < C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H))) >\r |
609 | \r |
610 | vorr d26, d27, d26 @ E5[0] = < C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F))) >\r |
611 | \r |
612 | vbsl d22, d24, d2 @ E3[0] = < (C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H)))) ? E : D >\r |
613 | \r |
614 | vbsl d26, d24, d8 @ E5[0] = < (C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F)))) ? E : F >\r |
615 | \r |
616 | vorn d13, d10, d15 @ E7[0] = < (E == I) || !(D == H) >\r |
617 | \r |
618 | vorn d12, d27, d15 @ E6[0] = < C0 || !(D == H) >\r |
619 | vst3.16 {d22,d24,d26}, [\dst2]! @ [dst + dststride] = E3,E4,E5; dst2 += 3*2*4\r |
620 | \r |
621 | .if \first7\r |
622 | addls \dst2, \dst2, \reg1 @ dst2 += reg1\r |
623 | .endif\r |
624 | \r |
625 | vorn d15, d4, d23 @ tmp0[0] = < (E == G) || !(H == F) >\r |
626 | \r |
627 | vorn d14, d27, d23 @ E8[0] = < C0 || !(H == F) >\r |
628 | \r |
629 | vand d13, d13, d15 @ E7[0] = < ((E == I) || !(D == H)) && ((E == G) || !(H == F)) >\r |
630 | \r |
631 | vbsl d12, d24, d2 @ E6[0] = < (C0 || !(D == H)) ? E : D >\r |
632 | \r |
633 | vorr d13, d27, d13 @ E7[0] = < C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F))) >\r |
634 | \r |
635 | vbsl d14, d24, d8 @ E8[0] = < (C0 || !(H == F)) ? E : F >\r |
636 | \r |
637 | vbsl d13, d24, \dH0 @ E7[0] = < (C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F)))) ? E : H >\r |
638 | \r |
639 | @ d15 = tmp0[1]\r |
640 | @ d22 = tmp1[1]\r |
641 | @ d23 = E3[1]\r |
642 | @ d24 = E4[0]\r |
643 | @ d25 = E4[1]\r |
644 | @ d26 = C0[1]\r |
645 | @ d27 = E5[1]\r |
646 | \r |
647 | vceq.i16 d15, \dB1, \dH1 @ tmp0[1] = < B == H >\r |
648 | \r |
649 | vceq.i16 d22, d3, d9 @ tmp1[1] = < D == F >\r |
650 | \r |
651 | vceq.i16 d23, d3, \dB1 @ E3[1] = < D == B >\r |
652 | vst3.16 {d12-d14}, [\dst3]! @ [dst + 2 * dststride] = E6,E7,E8; dst3 += 3*2*4\r |
653 | \r |
654 | .if \first7\r |
655 | addls \dst3, \dst3, \reg1 @ dst3 += reg1\r |
656 | bls 0f\r |
657 | .endif\r |
658 | \r |
659 | @ d12 = E0[1]\r |
660 | @ d13 = E1[1]\r |
661 | @ d14 = E2[1]\r |
662 | \r |
663 | vorr d26, d15, d22 @ C0[1] = < B == H || D == F >\r |
664 | \r |
665 | vceq.i16 d27, \dB1, d9 @ E5[1] = < B == F >\r |
666 | \r |
667 | vorn d15, d7, d23 @ tmp0[1] = < (E == C) || !(D == B) >\r |
668 | \r |
669 | vorn d22, d1, d27 @ tmp1[1] = < (E == A) || !(B == F) >\r |
670 | \r |
671 | vorn d12, d26, d23 @ E0[1] = < C0 || !(D == B) >\r |
672 | \r |
673 | vand d13, d15, d22 @ E1[1] = < ((E == C) || !(D == B)) && ((E == A) || !(B == F)) >\r |
674 | \r |
675 | vorn d14, d26, d27 @ E2[1] = < C0 || !(B == F) >\r |
676 | \r |
677 | vorr d13, d26, d13 @ E1[1] = < C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F))) >\r |
678 | \r |
679 | vbsl d12, d25, d3 @ E0[1] = < (C0 || !(D == B)) ? E : D >\r |
680 | \r |
681 | vbsl d14, d25, d9 @ E2[1] = < (C0 || !(B == F)) ? E : F >\r |
682 | \r |
683 | vbsl d13, d25, \dB1 @ E1[1] = < (C0 || (((E == C) || !(D == B)) && ((E == A) || !(B == F)))) ? E : B >\r |
684 | \r |
685 | vceq.i16 d15, d3, \dH1 @ tmp0[1] = < D == H >\r |
686 | \r |
687 | vceq.i16 d22, \dH1, d9 @ tmp1[1] = < H == F >\r |
688 | \r |
689 | vorn d23, d5, d23 @ E3[1] = < (E == G) || !(D == B) >\r |
690 | .ifeq \first7\r |
691 | vst3.16 {d12-d14}, [\dst1]! @ [dst] = E0,E1,E2; dst1 += 3*2*4\r |
692 | .else\r |
693 | vst3.16 {d12-d14}, [\dst1], \reg1 @ [dst] = E0,E1,E2; dst1 += reg1\r |
694 | .endif\r |
695 | \r |
696 | vorn d27, d11, d27 @ E5[1] = < (E == I) || !(B == F) >\r |
697 | \r |
698 | @ d12 = tmp6[1]\r |
699 | @ d13 = tmp7[1]\r |
700 | \r |
701 | vorn d12, d1, d15 @ tmp6[1] = < (E == A) || !(D == H) >\r |
702 | \r |
703 | vorn d13, d7, d22 @ tmp7[1] = < (E == C) || !(H == F) >\r |
704 | \r |
705 | vand d23, d23, d12 @ E3[1] = < ((E == G) || !(D == B)) && ((E == A) || !(D == H)) >\r |
706 | \r |
707 | vand d27, d27, d13 @ E5[1] = < ((E == I) || !(B == F)) && ((E == C) || !(H == F)) >\r |
708 | \r |
709 | @ d12 = E6[1]\r |
710 | @ d13 = E7[1]\r |
711 | @ d14 = E8[1]\r |
712 | \r |
713 | vorr d23, d26, d23 @ E3[1] = < C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H))) >\r |
714 | \r |
715 | vorr d27, d26, d27 @ E5[1] = < C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F))) >\r |
716 | \r |
717 | vbsl d23, d25, d3 @ E3[1] = < (C0 || (((E == G) || !(D == B)) && ((E == A) || !(D == H)))) ? E : D >\r |
718 | \r |
719 | vbsl d27, d25, d9 @ E5[1] = < (C0 || (((E == I) || !(B == F)) && ((E == C) || !(H == F)))) ? E : F >\r |
720 | \r |
721 | vorn d13, d11, d15 @ E7[1] = < (E == I) || !(D == H) >\r |
722 | \r |
723 | vorn d12, d26, d15 @ E6[1] = < C0 || !(D == H) >\r |
724 | .ifeq \first7\r |
725 | vst3.16 {d23,d25,d27}, [\dst2]! @ [dst + dststride] = E3,E4,E5; dst2 += 3*2*4\r |
726 | .else\r |
727 | vst3.16 {d23,d25,d27}, [\dst2], \reg1 @ [dst + dststride] = E3,E4,E5; dst2 += reg1\r |
728 | .endif\r |
729 | \r |
730 | vorn d15, d5, d22 @ tmp0[1] = < (E == G) || !(H == F) >\r |
731 | \r |
732 | vorn d14, d26, d22 @ E8[1] = < C0 || !(H == F) >\r |
733 | \r |
734 | vand d13, d13, d15 @ E7[1] = < ((E == I) || !(D == H)) && ((E == G) || !(H == F)) >\r |
735 | \r |
736 | vbsl d12, d25, d3 @ E6[1] = < (C0 || !(D == H)) ? E : D >\r |
737 | \r |
738 | vorr d13, d26, d13 @ E7[1] = < C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F))) >\r |
739 | \r |
740 | vbsl d14, d25, d9 @ E8[1] = < (C0 || !(H == F)) ? E : F >\r |
741 | \r |
742 | vbsl d13, d25, \dH1 @ E7[1] = < (C0 || (((E == I) || !(D == H)) && ((E == G) || !(H == F)))) ? E : H >\r |
743 | \r |
744 | .ifeq \first7\r |
745 | \r |
746 | .ifeq \last8\r |
747 | sub \counter, \counter, #8 @ counter -= 8\r |
748 | cmp \counter, #8\r |
749 | .endif\r |
750 | \r |
751 | vst3.16 {d12-d14}, [\dst3]! @ [dst + 2 * dststride] = E6,E7,E8; dst3 += 3*2*4\r |
752 | .else\r |
753 | vst3.16 {d12-d14}, [\dst3], \reg1 @ [dst + 2 * dststride] = E6,E7,E8; dst3 += reg1\r |
754 | \r |
755 | 0:\r |
756 | .endif\r |
757 | \r |
758 | .endm\r |
759 | \r |
760 | .macro __neon_scale3x_16_16_line src1, src2, src3, counter, dst1, dst2, dst3, reg1, qB, qH, dB0, dB1, dH0, dH1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
761 | \r |
762 | .ifeqs "\qB", "q14"\r |
763 | vld1.16 {d29[3]}, [\src1] @ S1prev[7] = src[-srcstride]\r |
764 | .endif\r |
765 | vld1.16 {d25[3]}, [\src2] @ S2prev[7] = src[0]\r |
766 | .ifeqs "\qH", "q15"\r |
767 | vld1.16 {d31[3]}, [\src3] @ S3prev[7] = src[srcstride]\r |
768 | .endif\r |
769 | andS \reg1, \counter, #7 @ reg1 = counter & 7\r |
770 | \r |
771 | .ifnes "\qB", "q14"\r |
772 | add \src1, \src1, \counter, lsl #1 @ src1 += 2 * counter\r |
773 | .endif\r |
774 | .ifnes "\qH", "q15"\r |
775 | add \src3, \src3, \counter, lsl #1 @ src3 += 2 * counter\r |
776 | .endif\r |
777 | beq 1f\r |
778 | \r |
779 | @ first 1-7 pixels - align counter to 16 bytes\r |
780 | \r |
781 | sub \reg1, \reg1, #1 @ reg1 = (counter & 7) - 1\r |
782 | \r |
783 | .ifeqs "\qB", "q14"\r |
784 | vld1.16 {q8}, [\src1] @ S1 = [src - srcstride]\r |
785 | add \src1, \src1, \reg1, lsl #1 @ src1 += 2 * ((counter & 7) - 1)\r |
786 | .endif\r |
787 | \r |
788 | vld1.16 {q9}, [\src2] @ S2 = [src ]\r |
789 | add \src2, \src2, \reg1, lsl #1 @ src2 += 2 * ((counter & 7) - 1)\r |
790 | \r |
791 | .ifeqs "\qH", "q15"\r |
792 | vld1.16 {q10}, [\src3] @ S3 = [src + srcstride]\r |
793 | add \src3, \src3, \reg1, lsl #1 @ src3 += 2 * ((counter & 7) - 1)\r |
794 | .endif\r |
795 | .ifeqs "\qB", "q14"\r |
796 | vext.8 q0, \qB, q8, #14 @ S1sl = S1prev[7] | (S1 << 16) < S >\r |
797 | \r |
798 | vmov \qB, q8 @ S1prev = S1 < T >\r |
799 | .endif\r |
800 | vext.8 q1, q12, q9, #14 @ S2sl = S2prev[7] | (S2 << 16) < V >\r |
801 | \r |
802 | vmov q12, q9 @ S2prev = S2 < C >\r |
803 | .ifeqs "\qH", "q15"\r |
804 | vext.8 q2, \qH, q10, #14 @ S3sl = S3prev[7] | (S3 << 16) < X >\r |
805 | \r |
806 | vmov \qH, q10 @ S3prev = S3 < Y >\r |
807 | .endif\r |
808 | .ifeqs "\qB", "q14"\r |
809 | vext.8 q3, \qB, q8, #2 @ S1sr = (S1prev >> 16) | ... < U >\r |
810 | .endif\r |
811 | \r |
812 | vext.8 q4, q12, q9, #2 @ S2sr = (S2prev >> 16) | ... < W >\r |
813 | \r |
814 | .ifeqs "\qH", "q15"\r |
815 | vext.8 q5, \qH, q10, #2 @ S3sr = (S3prev >> 16) | ... < Z >\r |
816 | .else\r |
817 | vmov q2, q1 @ S3sl = S2sl < X >\r |
818 | \r |
819 | vmov q5, q4 @ S3sr = S2sr < Z >\r |
820 | .endif\r |
821 | \r |
822 | .ifnes "\qB", "q14"\r |
823 | vmov q0, q1 @ S1sl = S2sl < S >\r |
824 | \r |
825 | vmov q3, q4 @ S1sr = S2sr < U >\r |
826 | .else\r |
827 | vld1.16 {d29[3]}, [\src1]! @ S1prev[7] = src[counter & 7 - 1 - srcstride]; src1 += 2\r |
828 | .endif\r |
829 | \r |
830 | add \reg1, \reg1, #1 @ reg1 = counter & 7\r |
831 | \r |
832 | vld1.16 {d25[3]}, [\src2]! @ S2prev[7] = src[counter & 7 - 1]; src2 += 2\r |
833 | \r |
834 | bic \counter, \counter, #7\r |
835 | \r |
836 | .ifeqs "\qH", "q15"\r |
837 | vld1.16 {d31[3]}, [\src3]! @ S3prev[7] = src[counter & 7 - 1 + srcstride]; src3 += 2\r |
838 | .endif\r |
839 | \r |
840 | ___neon_scale3x_16_16_slice \counter, \dst1, \dst2, \dst3, \reg1, \dB0, \dB1, \dH0, \dH1, 1, 0\r |
841 | \r |
842 | \r |
843 | @ counter is aligned to 16 bytes\r |
844 | \r |
845 | 1:\r |
846 | .ifeqs "\qB", "q14"\r |
847 | vld1.16 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 2*8\r |
848 | .endif\r |
849 | vld1.16 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 2*8\r |
850 | .ifeqs "\qH", "q15"\r |
851 | vld1.16 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 2*8\r |
852 | .endif\r |
853 | \r |
854 | @ inner loop (8 pixels per iteration)\r |
855 | 2:\r |
856 | \r |
857 | .ifeqs "\qB", "q14"\r |
858 | vext.8 q0, \qB, q8, #14 @ S1sl = S1prev[7] | (S1 << 16) < A >\r |
859 | vmov \qB, q8 @ S1prev = S1 < B >\r |
860 | .endif\r |
861 | \r |
862 | vext.8 q1, q12, q9, #14 @ S2sl = S2prev[7] | (S2 << 16) < D >\r |
863 | vmov q12, q9 @ S2prev = S2 < E >\r |
864 | \r |
865 | .ifeqs "\qH", "q15"\r |
866 | vext.8 q2, \qH, q10, #14 @ S3sl = S3prev[7] | (S3 << 16) < G >\r |
867 | vmov \qH, q10 @ S3prev = S3 < H >\r |
868 | .endif\r |
869 | \r |
870 | .ifeqs "\qB", "q14"\r |
871 | vld1.16 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 2*8\r |
872 | vext.8 q3, \qB, q8, #2 @ S1sr = (S1prev >> 16) | S1[0] < C >\r |
873 | .endif\r |
874 | \r |
875 | vld1.16 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 2*8\r |
876 | vext.8 q4, q12, q9, #2 @ S2sr = (S2prev >> 16) | S2[0] < F >\r |
877 | \r |
878 | .ifeqs "\qH", "q15"\r |
879 | vld1.16 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 2*8\r |
880 | vext.8 q5, \qH, q10, #2 @ S3sr = (S3prev >> 16) | S3[0] < I >\r |
881 | .else\r |
882 | vmov q2, q1 @ S3sl = S2sl < G >\r |
883 | \r |
884 | vmov q5, q4 @ S3sr = S2sr < I >\r |
885 | .endif\r |
886 | \r |
887 | .ifnes "\qB", "q14"\r |
888 | vmov q0, q1 @ S1sl = S2sl < A >\r |
889 | \r |
890 | vmov q3, q4 @ S1sr = S2sr < C >\r |
891 | .endif\r |
892 | \r |
893 | ___neon_scale3x_16_16_slice \counter, \aldst1, \aldst2, \aldst3, \reg1, \dB0, \dB1, \dH0, \dH1, 0, 0\r |
894 | \r |
895 | bhi 2b\r |
896 | \r |
897 | @ last 8 pixels\r |
898 | \r |
899 | .ifeqs "\qB", "q14"\r |
900 | vext.8 q0, \qB, q8, #14 @ S1sl = S1prev[7] | (S1 << 16) < A >\r |
901 | vmov \qB, q8 @ S1prev = S1 < B >\r |
902 | .endif\r |
903 | \r |
904 | vext.8 q1, q12, q9, #14 @ S2sl = S2prev[7] | (S2 << 16) < D >\r |
905 | vmov q12, q9 @ S2prev = S2 < E >\r |
906 | \r |
907 | .ifeqs "\qH", "q15"\r |
908 | vext.8 q2, \qH, q10, #14 @ S3sl = S3prev[7] | (S3 << 16) < G >\r |
909 | vmov \qH, q10 @ S3prev = S3 < H >\r |
910 | .endif\r |
911 | \r |
912 | .ifeqs "\qB", "q14"\r |
913 | vshr.u64 d16, d17, #(64-16) @ S1[0] = S1[7] | ...\r |
914 | .endif\r |
915 | \r |
916 | vshr.u64 d18, d19, #(64-16) @ S2[0] = S2[7] | ...\r |
917 | \r |
918 | .ifeqs "\qH", "q15"\r |
919 | vshr.u64 d20, d21, #(64-16) @ S3[0] = S3[7] | ...\r |
920 | .endif\r |
921 | .ifeqs "\qB", "q14"\r |
922 | vext.8 q3, \qB, q8, #2 @ S1sr = (S1prev >> 16) | S1[0] < C >\r |
923 | .endif\r |
924 | \r |
925 | vext.8 q4, q12, q9, #2 @ S2sr = (S2prev >> 16) | S2[0] < F >\r |
926 | \r |
927 | .ifeqs "\qH", "q15"\r |
928 | vext.8 q5, \qH, q10, #2 @ S3sr = (S3prev >> 16) | S3[0] < I >\r |
929 | .else\r |
930 | vmov q2, q1 @ S3sl = S2sl < G >\r |
931 | \r |
932 | vmov q5, q4 @ S3sr = S2sr < I >\r |
933 | .endif\r |
934 | \r |
935 | .ifnes "\qB", "q14"\r |
936 | vmov q0, q1 @ S1sl = S2sl < A >\r |
937 | \r |
938 | vmov q3, q4 @ S1sr = S2sr < C >\r |
939 | .endif\r |
940 | \r |
941 | ___neon_scale3x_16_16_slice \counter, \aldst1, \aldst2, \aldst3, \reg1, \dB0, \dB1, \dH0, \dH1, 0, 1\r |
942 | \r |
943 | .endm\r |
944 | \r |
945 | .macro _neon_scale3x_16_16_line_first src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
946 | __neon_scale3x_16_16_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q12, q15, d24, d25, d30, d31, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
947 | .endm\r |
948 | \r |
949 | .macro _neon_scale3x_16_16_line_middle src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
950 | __neon_scale3x_16_16_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q14, q15, d28, d29, d30, d31, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
951 | .endm\r |
952 | \r |
953 | .macro _neon_scale3x_16_16_line_last src1, src2, src3, counter, dst1, dst2, dst3, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2, aldst3\r |
954 | __neon_scale3x_16_16_line \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, q14, q12, d28, d29, d24, d25, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2, \aldst3\r |
955 | .endm\r |
956 | \r |
957 | .macro neon_scale3x_16_16_line part, src1, src2, src3, counter, dst1, dst2, dst3, reg1, srcalign16, dstalign8\r |
958 | .ifeq \srcalign16\r |
959 | \r |
960 | .ifeq \dstalign8\r |
961 | _neon_scale3x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1, \src2, \src3, \dst1, \dst2, \dst3\r |
962 | .else\r |
963 | _neon_scale3x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1, \src2, \src3, \dst1:64, \dst2:64, \dst3:64\r |
964 | .endif\r |
965 | \r |
966 | .else\r |
967 | \r |
968 | .ifeq \dstalign8\r |
969 | _neon_scale3x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1:128, \src2:128, \src3:128, \dst1, \dst2, \dst3\r |
970 | .else\r |
971 | _neon_scale3x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \dst3, \reg1, \src1:128, \src2:128, \src3:128, \dst1:64, \dst2:64, \dst3:64\r |
972 | .endif\r |
973 | \r |
974 | .endif\r |
975 | .endm\r |
976 | \r |