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