integrate M-HT's neon scalers
[gpsp.git] / arm / neon_scale3x.Sinc
CommitLineData
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