2 @@ Copyright (C) 2012 Roman Pauer
\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
11 @@ The above copyright notice and this permission notice shall be included in all
\r
12 @@ copies or substantial portions of the Software.
\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
39 @ q11 = S1prev < T >
\r
40 @ q12 = S2prev < C >
\r
41 @ q13 = S3prev < Y >
\r
46 .macro __neon_eagle2x_8_8_line src1, src2, src3, counter, dst1, dst2, reg1, qT, qY, alsrc1, alsrc2, alsrc3, aldst1, aldst2
\r
49 vld1.8 {d23[7]}, [\src1] @ S1prev[15] = src[-srcstride]
\r
51 vld1.8 {d25[7]}, [\src2] @ S2prev[15] = src[0]
\r
53 vld1.8 {d27[7]}, [\src3] @ S3prev[15] = src[srcstride]
\r
55 andS \reg1, \counter, #15 @ reg1 = counter & 15
\r
58 add \src1, \src1, \counter @ src1 += counter
\r
61 add \src3, \src3, \counter @ src3 += counter
\r
65 @ first 1-15 pixels - align counter to 16 bytes
\r
73 vld1.8 {q8}, [\src1], \reg1 @ S1 = [src - srcstride]; src1 += counter & 15
\r
76 vld1.8 {q9}, [\src2], \reg1 @ S2 = [src ]; src2 += counter & 15
\r
79 vld1.8 {q10}, [\src3], \reg1 @ S3 = [src + srcstride]; src3 += counter & 15
\r
82 vext.8 q0, \qT, q8, #15 @ S1sl = S1prev[15] | (S1 << 8) < S >
\r
84 vmov \qT, q8 @ S1prev = S1 < T >
\r
86 vext.8 q1, q12, q9, #15 @ S2sl = S2prev[15] | (S2 << 8) < V >
\r
88 vmov q12, q9 @ S2prev = S2 < C >
\r
90 vext.8 q2, \qY, q10, #15 @ S3sl = S3prev[15] | (S3 << 8) < X >
\r
92 vmov \qY, q10 @ S3prev = S3 < Y >
\r
95 vext.8 q3, \qT, q8, #1 @ S1sr = (S1prev >> 8) | ... < U >
\r
98 vext.8 q4, q12, q9, #1 @ S2sr = (S2prev >> 8) | ... < W >
\r
100 .ifeqs "\qY", "q13"
\r
101 vext.8 q5, \qY, q10, #1 @ S3sr = (S3prev >> 8) | ... < Z >
\r
103 vmov q2, q1 @ S3sl = S2sl < X >
\r
105 vmov q5, q4 @ S3sr = S2sr < Z >
\r
108 .ifnes "\qT", "q11"
\r
109 vmov q0, q1 @ S1sl = S2sl < S >
\r
111 vmov q3, q4 @ S1sr = S2sr < U >
\r
114 vceq.i8 q14, q0, \qT @ E1 = < S == T >
\r
116 vceq.i8 q15, q0, q1 @ tmp1 = < S == V >
\r
118 vceq.i8 q6, q2, \qY @ E3 = < X == Y >
\r
120 vceq.i8 q7, q2, q1 @ tmp2 = < X == V >
\r
122 vand q14, q14, q15 @ E1 = < S == T && S == V >
\r
127 vceq.i8 q15, q3, \qT @ E2 = < U == T >
\r
129 vceq.i8 q0, q3, q4 @ tmp3 = < U == W >
\r
131 vand q6, q6, q7 @ E3 = < X == Y && X == V >
\r
135 vceq.i8 q7, q5, \qY @ E4 = < Z == Y >
\r
137 vceq.i8 q2, q5, q4 @ tmp4 = < Z == W >
\r
139 vand q15, q15, q0 @ E2 = < U == T && U == W >
\r
141 vbsl q14, \qT, q12 @ E1 = < (S == T && S == V) ? T : C >
\r
143 vbsl q15, \qT, q12 @ E2 = < (U == T && U == W) ? T : C >
\r
145 vand q7, q7, q2 @ E4 = < Z == Y && Z == W >
\r
147 vbsl q6, \qY, q12 @ E3 = < (X == Y && X == V) ? Y : C >
\r
149 .ifeqs "\qT", "q11"
\r
150 sub \reg1, \src1, #1
\r
152 sub \reg1, \src2, #1
\r
155 vbsl q7, \qY, q12 @ E4 = < (Z == Y && Z == W) ? Y : C >
\r
156 .ifeqs "\qT", "q11"
\r
157 vld1.8 {d23[7]}, [\reg1] @ S1prev[15] = src[counter & 15 - 1 - srcstride]
\r
159 sub \reg1, \src2, #1
\r
162 vld1.8 {d25[7]}, [\reg1] @ S2prev[15] = src[counter & 15 - 1]
\r
164 .ifeqs "\qY", "q13"
\r
165 sub \reg1, \src3, #1
\r
167 vld1.8 {d27[7]}, [\reg1] @ S3prev[15] = src[counter & 15 - 1 + srcstride]
\r
170 ubfx \reg1, \counter, #0, #4 @ reg1 = counter & 15
\r
174 vst2.8 {q14-q15}, [\dst1],\reg1 @ [dst] = E1,E2; dst1 += reg1
\r
176 bic \counter, \counter, #15
\r
178 vst2.8 {q6-q7}, [\dst2], \reg1 @ [dst + dststride] = E3,E4; dst2 += reg1
\r
180 @ counter is aligned to 16 bytes
\r
183 .ifeqs "\qT", "q11"
\r
184 vld1.8 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 16
\r
186 vld1.8 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 16
\r
187 .ifeqs "\qY", "q13"
\r
188 vld1.8 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 16
\r
191 @ inner loop (16 pixels per iteration)
\r
199 .ifeqs "\qT", "q11"
\r
200 vext.8 q0, \qT, q8, #15 @ S1sl = S1prev[15] | (S1 << 8) < S >
\r
201 vmov \qT, q8 @ S1prev = S1 < T >
\r
204 vext.8 q1, q12, q9, #15 @ S2sl = S2prev[15] | (S2 << 8) < V >
\r
205 vmov q12, q9 @ S2prev = S2 < C >
\r
207 .ifeqs "\qY", "q13"
\r
208 vext.8 q2, \qY, q10, #15 @ S3sl = S3prev[15] | (S3 << 8) < X >
\r
209 vmov \qY, q10 @ S3prev = S3 < Y >
\r
212 .ifeqs "\qT", "q11"
\r
213 vld1.8 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 16
\r
214 vext.8 q3, \qT, q8, #1 @ S1sr = (S1prev >> 8) | S1[0] < U >
\r
217 vld1.8 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 16
\r
218 vext.8 q4, q12, q9, #1 @ S2sr = (S2prev >> 8) | S2[0] < W >
\r
220 .ifeqs "\qY", "q13"
\r
221 vld1.8 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 16
\r
222 vext.8 q5, \qY, q10, #1 @ S3sr = (S3prev >> 8) | S3[0] < Z >
\r
224 vmov q2, q1 @ S3sl = S2sl < X >
\r
226 vmov q5, q4 @ S3sr = S2sr < Z >
\r
229 .ifnes "\qT", "q11"
\r
230 vmov q0, q1 @ S1sl = S2sl < S >
\r
232 vmov q3, q4 @ S1sr = S2sr < U >
\r
235 sub \counter, \counter, #16 @ counter -= 16
\r
236 vceq.i8 q14, q0, \qT @ E1 = < S == T >
\r
238 vceq.i8 q15, q0, q1 @ tmp1 = < S == V >
\r
240 vceq.i8 q6, q2, \qY @ E3 = < X == Y >
\r
242 vceq.i8 q7, q2, q1 @ tmp2 = < X == V >
\r
244 vand q14, q14, q15 @ E1 = < S == T && S == V >
\r
249 vceq.i8 q15, q3, \qT @ E2 = < U == T >
\r
251 vceq.i8 q0, q3, q4 @ tmp3 = < U == W >
\r
253 vand q6, q6, q7 @ E3 = < X == Y && X == V >
\r
257 vceq.i8 q7, q5, \qY @ E4 = < Z == Y >
\r
259 vceq.i8 q2, q5, q4 @ tmp4 = < Z == W >
\r
261 vand q15, q15, q0 @ E2 = < U == T && U == W >
\r
263 vbsl q14, \qT, q12 @ E1 = < (S == T && S == V) ? T : C >
\r
265 vbsl q15, \qT, q12 @ E2 = < (U == T && U == W) ? T : C >
\r
267 vand q7, q7, q2 @ E4 = < Z == Y && Z == W >
\r
269 vbsl q6, \qY, q12 @ E3 = < (X == Y && X == V) ? Y : C >
\r
271 vbsl q7, \qY, q12 @ E4 = < (Z == Y && Z == W) ? Y : C >
\r
272 vst2.8 {q14-q15}, [\aldst1]! @ [dst] = E1,E2; dst1 += 2*16
\r
276 vst2.8 {q6-q7}, [\aldst2]! @ [dst + dststride] = E3,E4; dst2 += 2*16
\r
286 .ifeqs "\qT", "q11"
\r
287 vext.8 q0, \qT, q8, #15 @ S1sl = S1prev[15] | (S1 << 8) < S >
\r
288 vmov \qT, q8 @ S1prev = S1 < T >
\r
291 vext.8 q1, q12, q9, #15 @ S2sl = S2prev[15] | (S2 << 8) < V >
\r
292 vmov q12, q9 @ S2prev = S2 < C >
\r
294 .ifeqs "\qY", "q13"
\r
295 vext.8 q2, \qY, q10, #15 @ S3sl = S3prev[15] | (S3 << 8) < X >
\r
296 vmov \qY, q10 @ S3prev = S3 < Y >
\r
299 .ifeqs "\qT", "q11"
\r
300 vshr.u64 d16, d17, #(64-8) @ S1[0] = S1[15] | ...
\r
303 vshr.u64 d18, d19, #(64-8) @ S2[0] = S2[15] | ...
\r
305 .ifeqs "\qY", "q13"
\r
306 vshr.u64 d20, d21, #(64-8) @ S3[0] = S3[15] | ...
\r
308 .ifeqs "\qT", "q11"
\r
309 vext.8 q3, \qT, q8, #1 @ S1sr = (S1prev >> 8) | S1[0] < U >
\r
312 vext.8 q4, q12, q9, #1 @ S2sr = (S2prev >> 8) | S2[0] < W >
\r
314 .ifeqs "\qY", "q13"
\r
315 vext.8 q5, \qY, q10, #1 @ S3sr = (S3prev >> 8) | S3[0] < Z >
\r
317 vmov q2, q1 @ S3sl = S2sl < X >
\r
319 vmov q5, q4 @ S3sr = S2sr < Z >
\r
322 .ifnes "\qT", "q11"
\r
323 vmov q0, q1 @ S1sl = S2sl < S >
\r
325 vmov q3, q4 @ S1sr = S2sr < U >
\r
328 vceq.i8 q14, q0, \qT @ E1 = < S == T >
\r
330 vceq.i8 q15, q0, q1 @ tmp1 = < S == V >
\r
332 vceq.i8 q6, q2, \qY @ E3 = < X == Y >
\r
334 vceq.i8 q7, q2, q1 @ tmp2 = < X == V >
\r
336 vand q14, q14, q15 @ E1 = < S == T && S == V >
\r
341 vceq.i8 q15, q3, \qT @ E2 = < U == T >
\r
343 vceq.i8 q0, q3, q4 @ tmp3 = < U == W >
\r
345 vand q6, q6, q7 @ E3 = < X == Y && X == V >
\r
349 vceq.i8 q7, q5, \qY @ E4 = < Z == Y >
\r
351 vceq.i8 q2, q5, q4 @ tmp4 = < Z == W >
\r
353 vand q15, q15, q0 @ E2 = < U == T && U == W >
\r
355 vbsl q14, \qT, q12 @ E1 = < (S == T && S == V) ? T : C >
\r
357 vbsl q15, \qT, q12 @ E2 = < (U == T && U == W) ? T : C >
\r
359 vand q7, q7, q2 @ E4 = < Z == Y && Z == W >
\r
361 vbsl q6, \qY, q12 @ E3 = < (X == Y && X == V) ? Y : C >
\r
363 vbsl q7, \qY, q12 @ E4 = < (Z == Y && Z == W) ? Y : C >
\r
364 vst2.8 {q14-q15}, [\aldst1]! @ [dst] = E1,E2; dst1 += 2*16
\r
366 vst2.8 {q6-q7}, [\aldst2]! @ [dst + dststride] = E3,E4; dst2 += 2*16
\r
370 .macro _neon_eagle2x_8_8_line_first src1, src2, src3, counter, dst1, dst2, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2
\r
371 __neon_eagle2x_8_8_line \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, q12, q13, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2
\r
374 .macro _neon_eagle2x_8_8_line_middle src1, src2, src3, counter, dst1, dst2, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2
\r
375 __neon_eagle2x_8_8_line \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, q11, q13, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2
\r
378 .macro _neon_eagle2x_8_8_line_last src1, src2, src3, counter, dst1, dst2, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2
\r
379 __neon_eagle2x_8_8_line \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, q11, q12, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2
\r
382 .macro neon_eagle2x_8_8_line part, src1, src2, src3, counter, dst1, dst2, reg1, srcalign16, dstalign32
\r
386 _neon_eagle2x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, \src1, \src2, \src3, \dst1, \dst2
\r
388 _neon_eagle2x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, \src1, \src2, \src3, \dst1:256, \dst2:256
\r
394 _neon_eagle2x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, \src1:128, \src2:128, \src3:128, \dst1, \dst2
\r
396 _neon_eagle2x_8_8_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, \src1:128, \src2:128, \src3:128, \dst1:256, \dst2:256
\r
403 .macro __neon_eagle2x_16_16_line src1, src2, src3, counter, dst1, dst2, reg1, qT, qY, alsrc1, alsrc2, alsrc3, aldst1, aldst2
\r
405 .ifeqs "\qT", "q11"
\r
406 vld1.16 {d23[3]}, [\src1] @ S1prev[7] = src[-srcstride]
\r
408 vld1.16 {d25[3]}, [\src2] @ S2prev[7] = src[0]
\r
409 .ifeqs "\qY", "q13"
\r
410 vld1.16 {d27[3]}, [\src3] @ S3prev[7] = src[srcstride]
\r
412 andS \reg1, \counter, #7 @ reg1 = counter & 7
\r
414 .ifnes "\qT", "q11"
\r
415 add \src1, \src1, \counter, lsl #1 @ src1 += 2 * counter
\r
417 .ifnes "\qY", "q13"
\r
418 add \src3, \src3, \counter, lsl #1 @ src3 += 2 * counter
\r
422 @ first 1-7 pixels - align counter to 16 bytes
\r
429 .ifeqs "\qT", "q11"
\r
430 vld1.16 {q8}, [\src1] @ S1 = [src - srcstride]
\r
431 add \src1, \src1, \reg1, lsl #1 @ src1 += 2 * (counter & 7)
\r
434 vld1.16 {q9}, [\src2] @ S2 = [src ]
\r
435 add \src2, \src2, \reg1, lsl #1 @ src2 += 2 * (counter & 7)
\r
437 .ifeqs "\qY", "q13"
\r
438 vld1.16 {q10}, [\src3] @ S3 = [src + srcstride]
\r
439 add \src3, \src3, \reg1, lsl #1 @ src3 += 2 * (counter & 7)
\r
441 .ifeqs "\qT", "q11"
\r
442 vext.8 q0, \qT, q8, #14 @ S1sl = S1prev[7] | (S1 << 16) < S >
\r
444 vmov \qT, q8 @ S1prev = S1 < T >
\r
446 vext.8 q1, q12, q9, #14 @ S2sl = S2prev[7] | (S2 << 16) < V >
\r
448 vmov q12, q9 @ S2prev = S2 < C >
\r
449 .ifeqs "\qY", "q13"
\r
450 vext.8 q2, \qY, q10, #14 @ S3sl = S3prev[7] | (S3 << 16) < X >
\r
452 vmov \qY, q10 @ S3prev = S3 < Y >
\r
454 .ifeqs "\qT", "q11"
\r
455 vext.8 q3, \qT, q8, #2 @ S1sr = (S1prev >> 16) | ... < U >
\r
458 vext.8 q4, q12, q9, #2 @ S2sr = (S2prev >> 16) | ... < W >
\r
460 .ifeqs "\qY", "q13"
\r
461 vext.8 q5, \qY, q10, #2 @ S3sr = (S3prev >> 16) | ... < Z >
\r
463 vmov q2, q1 @ S3sl = S2sl < X >
\r
465 vmov q5, q4 @ S3sr = S2sr < Z >
\r
468 .ifnes "\qT", "q11"
\r
469 vmov q0, q1 @ S1sl = S2sl < S >
\r
471 vmov q3, q4 @ S1sr = S2sr < U >
\r
474 vceq.i16 q14, q0, \qT @ E1 = < S == T >
\r
476 vceq.i16 q15, q0, q1 @ tmp1 = < S == V >
\r
478 vceq.i16 q6, q2, \qY @ E3 = < X == Y >
\r
480 vceq.i16 q7, q2, q1 @ tmp2 = < X == V >
\r
482 vand q14, q14, q15 @ E1 = < S == T && S == V >
\r
487 vceq.i16 q15, q3, \qT @ E2 = < U == T >
\r
489 vceq.i16 q0, q3, q4 @ tmp3 = < U == W >
\r
491 vand q6, q6, q7 @ E3 = < X == Y && X == V >
\r
495 vceq.i16 q7, q5, \qY @ E4 = < Z == Y >
\r
497 vceq.i16 q2, q5, q4 @ tmp4 = < Z == W >
\r
499 vand q15, q15, q0 @ E2 = < U == T && U == W >
\r
501 vbsl q14, \qT, q12 @ E1 = < (S == T && S == V) ? T : C >
\r
503 vbsl q15, \qT, q12 @ E2 = < (U == T && U == W) ? T : C >
\r
505 vand q7, q7, q2 @ E4 = < Z == Y && Z == W >
\r
507 vbsl q6, \qY, q12 @ E3 = < (X == Y && X == V) ? Y : C >
\r
509 .ifeqs "\qT", "q11"
\r
510 sub \reg1, \src1, #2
\r
512 sub \reg1, \src2, #2
\r
515 vbsl q7, \qY, q12 @ E4 = < (Z == Y && Z == W) ? Y : C >
\r
516 .ifeqs "\qT", "q11"
\r
517 vld1.16 {d23[3]}, [\reg1] @ S1prev[7] = src[2 * (counter & 7) - 2 - srcstride]
\r
519 sub \reg1, \src2, #2
\r
522 vld1.16 {d25[3]}, [\reg1] @ S2prev[7] = src[2 * (counter & 7) - 2]
\r
524 .ifeqs "\qY", "q13"
\r
525 sub \reg1, \src3, #2
\r
527 vld1.16 {d27[3]}, [\reg1] @ S3prev[7] = src[2 * (counter & 7) - 2 + srcstride]
\r
530 #ifdef DO_BGR_TO_RGB
\r
531 bgr1555_to_rgb565 q14, q15, q8, q9, q10, \reg1
\r
532 bgr1555_to_rgb565 q6, q7, q8, q9, q10, \reg1
\r
535 ubfx \reg1, \counter, #0, #3 @ reg1 = counter & 7
\r
539 vst2.16 {q14-q15}, [\dst1], \reg1 @ [dst] = E1,E2; dst1 += reg1
\r
541 bic \counter, \counter, #7
\r
543 vst2.16 {q6-q7}, [\dst2], \reg1 @ [dst + dststride] = E3,E4; dst2 += reg1
\r
545 @ counter is aligned to 16 bytes
\r
548 .ifeqs "\qT", "q11"
\r
549 vld1.16 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 2*8
\r
551 vld1.16 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 2*8
\r
552 .ifeqs "\qY", "q13"
\r
553 vld1.16 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 2*8
\r
556 @ inner loop (8 pixels per iteration)
\r
564 .ifeqs "\qT", "q11"
\r
565 vext.8 q0, \qT, q8, #14 @ S1sl = S1prev[7] | (S1 << 16) < S >
\r
566 vmov \qT, q8 @ S1prev = S1 < T >
\r
569 vext.8 q1, q12, q9, #14 @ S2sl = S2prev[7] | (S2 << 16) < V >
\r
570 vmov q12, q9 @ S2prev = S2 < C >
\r
572 .ifeqs "\qY", "q13"
\r
573 vext.8 q2, \qY, q10, #14 @ S3sl = S3prev[7] | (S3 << 16) < X >
\r
574 vmov \qY, q10 @ S3prev = S3 < Y >
\r
577 .ifeqs "\qT", "q11"
\r
578 vld1.16 {q8}, [\alsrc1]! @ S1 = [src - srcstride]; src1 += 2*8
\r
579 vext.8 q3, \qT, q8, #2 @ S1sr = (S1prev >> 16) | S1[0] < U >
\r
582 vld1.16 {q9}, [\alsrc2]! @ S2 = [src ]; src2 += 2*8
\r
583 vext.8 q4, q12, q9, #2 @ S2sr = (S2prev >> 16) | S2[0] < W >
\r
585 .ifeqs "\qY", "q13"
\r
586 vld1.16 {q10}, [\alsrc3]! @ S3 = [src + srcstride]; src3 += 2*8
\r
587 vext.8 q5, \qY, q10, #2 @ S3sr = (S3prev >> 16) | S3[0] < Z >
\r
589 vmov q2, q1 @ S3sl = S2sl < X >
\r
591 vmov q5, q4 @ S3sr = S2sr < Z >
\r
594 .ifnes "\qT", "q11"
\r
595 vmov q0, q1 @ S1sl = S2sl < S >
\r
597 vmov q3, q4 @ S1sr = S2sr < U >
\r
600 sub \counter, \counter, #8 @ counter -= 8
\r
601 vceq.i16 q14, q0, \qT @ E1 = < S == T >
\r
603 vceq.i16 q15, q0, q1 @ tmp1 = < S == V >
\r
605 vceq.i16 q6, q2, \qY @ E3 = < X == Y >
\r
607 vceq.i16 q7, q2, q1 @ tmp2 = < X == V >
\r
609 vand q14, q14, q15 @ E1 = < S == T && S == V >
\r
614 vceq.i16 q15, q3, \qT @ E2 = < U == T >
\r
616 vceq.i16 q0, q3, q4 @ tmp3 = < U == W >
\r
618 vand q6, q6, q7 @ E3 = < X == Y && X == V >
\r
622 vceq.i16 q7, q5, \qY @ E4 = < Z == Y >
\r
624 vceq.i16 q2, q5, q4 @ tmp4 = < Z == W >
\r
626 vand q15, q15, q0 @ E2 = < U == T && U == W >
\r
628 vbsl q14, \qT, q12 @ E1 = < (S == T && S == V) ? T : C >
\r
630 vbsl q15, \qT, q12 @ E2 = < (U == T && U == W) ? T : C >
\r
632 vand q7, q7, q2 @ E4 = < Z == Y && Z == W >
\r
634 vbsl q6, \qY, q12 @ E3 = < (X == Y && X == V) ? Y : C >
\r
636 vbsl q7, \qY, q12 @ E4 = < (Z == Y && Z == W) ? Y : C >
\r
638 #ifdef DO_BGR_TO_RGB
\r
639 bgr1555_to_rgb565 q14, q15, q0, q1, q2, \reg1
\r
640 bgr1555_to_rgb565 q6, q7, q0, q1, q2, \reg1
\r
643 vst2.16 {q14-q15}, [\aldst1]! @ [dst] = E1,E2; dst1 += 2*2*8
\r
647 vst2.16 {q6-q7}, [\aldst2]! @ [dst + dststride] = E3,E4; dst2 += 2*2*8
\r
657 .ifeqs "\qT", "q11"
\r
658 vext.8 q0, \qT, q8, #14 @ S1sl = S1prev[7] | (S1 << 16) < S >
\r
659 vmov \qT, q8 @ S1prev = S1 < T >
\r
662 vext.8 q1, q12, q9, #14 @ S2sl = S2prev[7] | (S2 << 16) < V >
\r
663 vmov q12, q9 @ S2prev = S2 < C >
\r
665 .ifeqs "\qY", "q13"
\r
666 vext.8 q2, \qY, q10, #14 @ S3sl = S3prev[7] | (S3 << 16) < X >
\r
667 vmov \qY, q10 @ S3prev = S3 < Y >
\r
670 .ifeqs "\qT", "q11"
\r
671 vshr.u64 d16, d17, #(64-16) @ S1[0] = S1[7] | ...
\r
674 vshr.u64 d18, d19, #(64-16) @ S2[0] = S2[7] | ...
\r
676 .ifeqs "\qY", "q13"
\r
677 vshr.u64 d20, d21, #(64-16) @ S3[0] = S3[7] | ...
\r
679 .ifeqs "\qT", "q11"
\r
680 vext.8 q3, \qT, q8, #2 @ S1sr = (S1prev >> 16) | S1[0] < U >
\r
683 vext.8 q4, q12, q9, #2 @ S2sr = (S2prev >> 16) | S2[0] < W >
\r
685 .ifeqs "\qY", "q13"
\r
686 vext.8 q5, \qY, q10, #2 @ S3sr = (S3prev >> 16) | S3[0] < Z >
\r
688 vmov q2, q1 @ S3sl = S2sl < X >
\r
690 vmov q5, q4 @ S3sr = S2sr < Z >
\r
693 .ifnes "\qT", "q11"
\r
694 vmov q0, q1 @ S1sl = S2sl < S >
\r
696 vmov q3, q4 @ S1sr = S2sr < U >
\r
699 vceq.i16 q14, q0, \qT @ E1 = < S == T >
\r
701 vceq.i16 q15, q0, q1 @ tmp1 = < S == V >
\r
703 vceq.i16 q6, q2, \qY @ E3 = < X == Y >
\r
705 vceq.i16 q7, q2, q1 @ tmp2 = < X == V >
\r
707 vand q14, q14, q15 @ E1 = < S == T && S == V >
\r
712 vceq.i16 q15, q3, \qT @ E2 = < U == T >
\r
714 vceq.i16 q0, q3, q4 @ tmp3 = < U == W >
\r
716 vand q6, q6, q7 @ E3 = < X == Y && X == V >
\r
720 vceq.i16 q7, q5, \qY @ E4 = < Z == Y >
\r
722 vceq.i16 q2, q5, q4 @ tmp4 = < Z == W >
\r
724 vand q15, q15, q0 @ E2 = < U == T && U == W >
\r
726 vbsl q14, \qT, q12 @ E1 = < (S == T && S == V) ? T : C >
\r
728 vbsl q15, \qT, q12 @ E2 = < (U == T && U == W) ? T : C >
\r
730 vand q7, q7, q2 @ E4 = < Z == Y && Z == W >
\r
732 vbsl q6, \qY, q12 @ E3 = < (X == Y && X == V) ? Y : C >
\r
734 vbsl q7, \qY, q12 @ E4 = < (Z == Y && Z == W) ? Y : C >
\r
736 #ifdef DO_BGR_TO_RGB
\r
737 bgr1555_to_rgb565 q14, q15, q8, q9, q10, \reg1
\r
738 bgr1555_to_rgb565 q6, q7, q8, q9, q10, \reg1
\r
741 vst2.16 {q14-q15}, [\aldst1]! @ [dst] = E1,E2; dst1 += 2*2*8
\r
743 vst2.16 {q6-q7}, [\aldst2]! @ [dst + dststride] = E3,E4; dst2 += 2*2*8
\r
747 .macro _neon_eagle2x_16_16_line_first src1, src2, src3, counter, dst1, dst2, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2
\r
748 __neon_eagle2x_16_16_line \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, q12, q13, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2
\r
751 .macro _neon_eagle2x_16_16_line_middle src1, src2, src3, counter, dst1, dst2, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2
\r
752 __neon_eagle2x_16_16_line \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, q11, q13, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2
\r
755 .macro _neon_eagle2x_16_16_line_last src1, src2, src3, counter, dst1, dst2, reg1, alsrc1, alsrc2, alsrc3, aldst1, aldst2
\r
756 __neon_eagle2x_16_16_line \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, q11, q12, \alsrc1, \alsrc2, \alsrc3, \aldst1, \aldst2
\r
759 .macro neon_eagle2x_16_16_line part, src1, src2, src3, counter, dst1, dst2, reg1, srcalign16, dstalign32
\r
763 _neon_eagle2x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, \src1, \src2, \src3, \dst1, \dst2
\r
765 _neon_eagle2x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, \src1, \src2, \src3, \dst1:256, \dst2:256
\r
771 _neon_eagle2x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, \src1 A128, \src2 A128, \src3 A128, \dst1, \dst2
\r
773 _neon_eagle2x_16_16_line_\part \src1, \src2, \src3, \counter, \dst1, \dst2, \reg1, \src1 A128, \src2 A128, \src3 A128, \dst1 A256, \dst2 A256
\r