• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*!
2 * \copy
3 *     Copyright (c)  2013, Cisco Systems
4 *     All rights reserved.
5 *
6 *     Redistribution and use in source and binary forms, with or without
7 *     modification, are permitted provided that the following conditions
8 *     are met:
9 *
10 *        * Redistributions of source code must retain the above copyright
11 *          notice, this list of conditions and the following disclaimer.
12 *
13 *        * Redistributions in binary form must reproduce the above copyright
14 *          notice, this list of conditions and the following disclaimer in
15 *          the documentation and/or other materials provided with the
16 *          distribution.
17 *
18 *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 *     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 *     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 *     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 *     COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 *     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 *     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 *     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 *     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 *     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 *     POSSIBILITY OF SUCH DAMAGE.
30 *
31 */
32
33#ifdef HAVE_NEON
34#include "arm_arch_common_macro.S"
35
36.macro SATD_16x4
37    vld1.64     {q0}, [r0,:128], r1
38    vld1.64     {q1}, [r2], r3
39
40    vsubl.u8    q8,  d0,  d2
41    vld1.64     {q2}, [r0,:128], r1
42
43    vsubl.u8    q10, d1,  d3
44    vld1.64     {q3}, [r2], r3
45
46    vsubl.u8    q9,  d4,  d6
47    vld1.64     {q0}, [r0,:128], r1
48
49    vsubl.u8    q11, d5,  d7
50    vld1.64     {q1}, [r2], r3
51
52    vsubl.u8    q12, d0,  d2
53    vld1.64     {q2}, [r0,:128], r1
54
55    vsubl.u8    q14, d1,  d3
56    vadd.s16    q0,  q8,  q9
57
58    vld1.64     {q3}, [r2], r3
59    vsub.s16    q1,  q8,  q9
60
61    vsubl.u8    q13, d4,  d6
62    vsubl.u8    q15, d5,  d7
63
64    vadd.s16    q2, q12, q13
65    vsub.s16    q3, q12, q13
66
67    vadd.s16    q8, q10, q11
68    vsub.s16    q9, q10, q11
69
70    vadd.s16    q10, q14, q15
71    vsub.s16    q11, q14, q15
72
73    vadd.s16    q12, q0, q2
74    vsub.s16    q14, q0, q2
75
76    vadd.s16    q13, q8, q10
77    vsub.s16    q15, q8, q10
78
79    vsub.s16    q0, q1, q3
80    vadd.s16    q2, q1, q3
81
82    vsub.s16    q1, q9, q11
83    vadd.s16    q3, q9, q11
84
85    vtrn.16 q12, q14
86    vtrn.16 q13, q15
87
88    vadd.s16 q8, q12, q14
89    vabd.s16 q10, q12, q14
90
91    vadd.s16 q9, q13, q15
92    vabd.s16 q11, q13, q15
93
94    vabs.s16 q8, q8
95    vabs.s16 q9, q9
96
97    vtrn.16 q0, q2
98    vtrn.16 q1, q3
99
100    vadd.s16 q12, q0, q2
101    vabd.s16 q14, q0, q2
102
103    vadd.s16 q13, q1, q3
104    vabd.s16 q15, q1, q3
105
106    vabs.s16 q12, q12
107    vabs.s16 q13, q13
108
109    vtrn.32 q8, q10
110    vtrn.32 q9, q11
111
112    vtrn.32 q12, q14
113    vtrn.32 q13, q15
114
115    vmax.s16    q0, q8,  q10
116    vmax.s16    q1, q9,  q11
117    vmax.s16    q2, q12,  q14
118    vmax.s16    q3, q13,  q15
119
120    vadd.u16 q0, q0, q1
121    vadd.u16 q2, q2, q3
122.endm
123
124.macro SATD_8x4
125
126    vld1.64     {d0}, [r0,:64], r1
127    vld1.64     {d1}, [r2], r3
128
129    vld1.64     {d2}, [r0,:64], r1
130    vsubl.u8    q8, d0, d1
131
132    vld1.64     {d3}, [r2], r3
133    vsubl.u8    q9, d2, d3
134
135    vld1.64     {d4}, [r0,:64], r1
136    vld1.64     {d5}, [r2], r3
137
138    vadd.s16    q12, q8, q9
139    vsubl.u8    q10, d4, d5
140
141    vld1.64     {d6}, [r0,:64], r1
142    vld1.64     {d7}, [r2], r3
143
144    vsubl.u8    q11, d6,  d7
145    vsub.s16    q13, q8, q9
146
147    vadd.s16    q14, q10, q11
148    vsub.s16    q15, q10, q11
149
150    vadd.s16    q0, q12, q14
151    vsub.s16    q1, q12, q14
152
153    vsub.s16    q2, q13, q15
154    vadd.s16    q3, q13, q15
155
156    vtrn.16     q0, q1
157    vtrn.16     q2, q3
158
159    vadd.s16    q8, q0, q1
160    vabd.s16    q9, q0, q1
161
162    vabs.s16    q8, q8
163    vadd.s16    q10, q2, q3
164
165    vabd.s16    q11, q2, q3
166    vabs.s16    q10, q10
167
168    vtrn.32     q8, q9
169    vtrn.32     q10, q11
170
171    vmax.s16    q0, q8, q9
172    vmax.s16    q1, q10, q11
173.endm
174
175.macro SAD_16x4
176    vld1.64 {q6}, [r0, :128], r1
177    vabal.u8 q10, d8, d10
178
179    vld1.64 {q7}, [r2], r3
180    vabal.u8 q11, d9, d11
181
182    vld1.64 {q0}, [r0, :128], r1
183    vabal.u8 q12, d12, d14
184
185    vld1.64 {q1}, [r2], r3
186    vabal.u8 q13, d13, d15
187
188    vld1.64 {q2}, [r0, :128], r1
189    vabal.u8 q10, d0, d2
190
191    vld1.64 {q3}, [r2], r3
192    vabal.u8 q11, d1, d3
193
194    vld1.64 {q4}, [r0, :128], r1
195    vabal.u8 q12, d4, d6
196
197    vld1.64 {q5}, [r2], r3
198    vabal.u8 q13, d5, d7
199.endm
200
201.macro SAD_8x4
202    vld1.64 {d0}, [r0, :64], r1
203    vld1.64 {d1}, [r2], r3
204
205    vabal.u8 q10, d0, d1
206    vld1.64 {d2}, [r0, :64], r1
207
208    vld1.64 {d3}, [r2], r3
209    vabal.u8 q11, d2, d3
210
211    vld1.64 {d4}, [r0, :64], r1
212    vld1.64 {d5}, [r2], r3
213
214    vabal.u8 q12, d4, d5
215    vld1.64 {d6}, [r0, :64], r1
216
217    vld1.64 {d7}, [r2], r3
218    vabal.u8 q13, d6, d7
219.endm
220
221
222WELS_ASM_FUNC_BEGIN WelsSampleSad16x16_neon
223    vpush {q4-q7}
224
225    vld1.64 {q0}, [r0, :128], r1
226    vld1.64 {q1}, [r2], r3
227
228    vabdl.u8 q10, d0, d2
229    vld1.64 {q2}, [r0, :128], r1
230
231    vabdl.u8 q11, d1, d3
232    vld1.64 {q3}, [r2], r3
233
234    vld1.64 {q4}, [r0, :128], r1
235    vabdl.u8 q12, d4, d6
236    vld1.64 {q5}, [r2], r3
237    vabdl.u8 q13, d5, d7
238
239    SAD_16x4
240    SAD_16x4
241    SAD_16x4
242
243    vld1.64 {q6}, [r0, :128], r1
244    vabal.u8 q10, d8, d10
245
246    vld1.64 {q7}, [r2], r3
247    vabal.u8 q11, d9, d11
248
249    vabal.u8 q12, d12, d14
250    vabal.u8 q13, d13, d15
251
252    vadd.u16 q14, q10, q11
253    vadd.u16 q15, q12, q13
254
255    vadd.u16 q15, q14, q15
256    vadd.u16 d0, d30, d31
257    vpaddl.u16 d0, d0
258    vpaddl.u32 d0, d0
259    vmov.u32   r0, d0[0]
260
261    vpop {q4-q7}
262WELS_ASM_FUNC_END
263
264
265WELS_ASM_FUNC_BEGIN WelsSampleSad16x8_neon
266    vpush {q4-q7}
267
268    vld1.64 {q0}, [r0, :128], r1
269    vld1.64 {q1}, [r2], r3
270
271    vabdl.u8 q10, d0, d2
272    vld1.64 {q2}, [r0, :128], r1
273
274    vabdl.u8 q11, d1, d3
275    vld1.64 {q3}, [r2], r3
276
277    vld1.64 {q4}, [r0, :128], r1
278    vabdl.u8 q12, d4, d6
279    vld1.64 {q5}, [r2], r3
280    vabdl.u8 q13, d5, d7
281
282    SAD_16x4
283
284    vld1.64 {q6}, [r0, :128], r1
285    vabal.u8 q10, d8, d10
286
287    vld1.64 {q7}, [r2], r3
288    vabal.u8 q11, d9, d11
289
290    vabal.u8 q12, d12, d14
291    vabal.u8 q13, d13, d15
292
293    vadd.u16 q14, q10, q11
294    vadd.u16 q15, q12, q13
295
296    vadd.u16 q15, q14, q15
297    vadd.u16 d0, d30, d31
298    vpaddl.u16 d0, d0
299    vpaddl.u32 d0, d0
300    vmov.u32   r0, d0[0]
301    vpop {q4-q7}
302WELS_ASM_FUNC_END
303
304
305WELS_ASM_FUNC_BEGIN WelsSampleSad8x16_neon
306
307    vld1.64 {d0}, [r0, :64], r1
308    vld1.64 {d1}, [r2], r3
309
310    vabdl.u8 q10, d0, d1
311    vld1.64 {d2}, [r0, :64], r1
312
313    vld1.64 {d3}, [r2], r3
314    vabdl.u8 q11, d2, d3
315
316    vld1.64 {d4}, [r0, :64], r1
317    vld1.64 {d5}, [r2], r3
318
319    vabdl.u8 q12, d4, d5
320    vld1.64 {d6}, [r0, :64], r1
321
322    vld1.64 {d7}, [r2], r3
323    vabdl.u8 q13, d6, d7
324
325    SAD_8x4
326    SAD_8x4
327    SAD_8x4
328
329    vadd.u16 q14, q10, q11
330    vadd.u16 q15, q12, q13
331    vadd.u16 q15, q15, q14
332    vadd.u16 d0, d30, d31
333    vpaddl.u16 d0, d0
334    vpaddl.u32 d0, d0
335    vmov.u32   r0, d0[0]
336WELS_ASM_FUNC_END
337
338
339WELS_ASM_FUNC_BEGIN WelsSampleSad8x8_neon
340
341    vld1.64 {d0}, [r0, :64], r1
342    vld1.64 {d1}, [r2], r3
343
344    vabdl.u8 q10, d0, d1
345    vld1.64 {d2}, [r0, :64], r1
346
347    vld1.64 {d3}, [r2], r3
348    vabdl.u8 q11, d2, d3
349
350    vld1.64 {d4}, [r0, :64], r1
351    vld1.64 {d5}, [r2], r3
352
353    vabdl.u8 q12, d4, d5
354    vld1.64 {d6}, [r0, :64], r1
355
356    vld1.64 {d7}, [r2], r3
357    vabdl.u8 q13, d6, d7
358
359    SAD_8x4
360
361    vadd.u16 q14, q10, q11
362    vadd.u16 q15, q12, q13
363    vadd.u16 q15, q15, q14
364    vadd.u16 d0, d30, d31
365    vpaddl.u16 d0, d0
366    vpaddl.u32 d0, d0
367    vmov.u32   r0, d0[0]
368WELS_ASM_FUNC_END
369
370
371WELS_ASM_FUNC_BEGIN WelsSampleSad4x4_neon
372    stmdb sp!, {r4-r5, lr}
373
374    //Loading a horizontal line data (4 bytes)
375    //line 0
376    ldr r4, [r0], r1
377    ldr r5, [r2], r3
378    usad8  lr, r4, r5
379
380    //line 1
381    ldr r4, [r0], r1
382    ldr r5, [r2], r3
383    usada8  lr, r4, r5, lr
384
385    //line 2
386    ldr r4, [r0], r1
387    ldr r5, [r2], r3
388    usada8  lr, r4, r5, lr
389
390    //line 3
391    ldr r4, [r0]
392    ldr r5, [r2]
393    usada8  r0, r4, r5, lr
394
395    ldmia sp!, {r4-r5, lr}
396WELS_ASM_FUNC_END
397
398
399WELS_ASM_FUNC_BEGIN WelsSampleSadFour16x16_neon
400
401    stmdb sp!, {r4-r5, lr}
402
403    //Generate the pix2 start addr
404    sub   r4, r2, #1
405    add   r5, r2, #1
406    sub   r2, r3
407
408    //Loading a horizontal line data (16 bytes)
409    vld1.8 {q0}, [r0], r1 //save pix1
410
411    vld1.8 {q1}, [r2], r3 //save pix2 - stride
412    vld1.8 {q10}, [r2], r3 //save pix2
413    vld1.8 {q2}, [r2], r3 //save pix2 + stride
414
415    vld1.8 {q3}, [r4], r3 //save pix2 - 1
416    vld1.8 {q8}, [r5], r3 //save pix2 + 1
417
418    //Do the SAD for 16 bytes
419    vabdl.u8  q15, d0, d2
420    vabal.u8  q15, d1, d3
421
422    vabdl.u8  q13, d0, d4
423    vabal.u8  q13, d1, d5
424
425    vabdl.u8  q11, d0, d6
426    vabal.u8  q11, d1, d7
427
428    vabdl.u8  q9, d0, d16
429    vabal.u8  q9, d1, d17
430
431    mov lr, #15
432pixel_sad_4_16x16_loop_0:
433
434    //Loading a horizontal line data (16 bytes)
435    vld1.8 {q0}, [r0], r1 //save pix1
436    vmov.8 q1,   q10      //save pix2 - stride
437    vmov.8 q10,  q2
438    vabal.u8  q15, d0, d2
439    vld1.8 {q2}, [r2], r3 //save pix2 + stride
440    vabal.u8  q15, d1, d3
441    vld1.8 {q3}, [r4], r3 //save pix2 - 1
442    vabal.u8  q13, d0, d4
443    vld1.8 {q8}, [r5], r3 //save pix2 + 1
444    vabal.u8  q13, d1, d5
445    subs lr, #1
446
447    vabal.u8  q11, d0, d6
448    vabal.u8  q11, d1, d7
449
450    vabal.u8  q9, d0, d16
451    vabal.u8  q9, d1, d17
452
453    bne pixel_sad_4_16x16_loop_0
454
455
456    //Save SAD to 'r0'
457    ldr   r0, [sp, #12]
458
459    vadd.u16   d0, d30, d31
460    vadd.u16   d1, d26, d27
461    vadd.u16   d2, d22, d23
462    vadd.u16   d3, d18, d19
463
464    vpaddl.u16 q0, q0
465    vpaddl.u16 q1, q1
466
467    vpaddl.u32 q0, q0
468    vpaddl.u32 q1, q1
469
470    vst4.32    {d0[0],d1[0],d2[0],d3[0]}, [r0]
471
472    ldmia sp!, {r4-r5, lr}
473WELS_ASM_FUNC_END
474
475
476WELS_ASM_FUNC_BEGIN WelsSampleSadFour16x8_neon
477    stmdb sp!, {r4-r5, lr}
478
479    //Generate the pix2 start addr
480    sub   r4, r2, #1
481    add   r5, r2, #1
482    sub   r2, r3
483
484    //Loading a horizontal line data (16 bytes)
485    vld1.8 {q0}, [r0], r1 //save pix1
486
487    vld1.8 {q1}, [r2], r3 //save pix2 - stride
488    vld1.8 {q10}, [r2], r3 //save pix2
489    vld1.8 {q2}, [r2], r3 //save pix2 + stride
490
491    vld1.8 {q3}, [r4], r3 //save pix2 - 1
492    vld1.8 {q8}, [r5], r3 //save pix2 + 1
493
494    //Do the SAD for 16 bytes
495    vabdl.u8  q15, d0, d2
496    vabal.u8  q15, d1, d3
497
498    vabdl.u8  q13, d0, d4
499    vabal.u8  q13, d1, d5
500
501    vabdl.u8  q11, d0, d6
502    vabal.u8  q11, d1, d7
503
504    vabdl.u8  q9, d0, d16
505    vabal.u8  q9, d1, d17
506
507    mov lr, #7
508pixel_sad_4_16x8_loop_0:
509
510    //Loading a horizontal line data (16 bytes)
511    vld1.8 {q0}, [r0], r1 //save pix1
512    vmov.8 q1,   q10      //save pix2 - stride
513    vmov.8 q10,  q2
514    vabal.u8  q15, d0, d2
515    vld1.8 {q2}, [r2], r3 //save pix2 + stride
516    vabal.u8  q15, d1, d3
517    vld1.8 {q3}, [r4], r3 //save pix2 - 1
518    vabal.u8  q13, d0, d4
519    vld1.8 {q8}, [r5], r3 //save pix2 + 1
520    vabal.u8  q13, d1, d5
521    subs lr, #1
522
523    vabal.u8  q11, d0, d6
524    vabal.u8  q11, d1, d7
525
526    vabal.u8  q9, d0, d16
527    vabal.u8  q9, d1, d17
528
529    bne pixel_sad_4_16x8_loop_0
530
531    //Save SAD to 'r0'
532    ldr   r0, [sp, #12]
533
534    vadd.u16   d0, d30, d31
535    vadd.u16   d1, d26, d27
536    vadd.u16   d2, d22, d23
537    vadd.u16   d3, d18, d19
538
539    vpaddl.u16 q0, q0
540    vpaddl.u16 q1, q1
541
542    vpaddl.u32 q0, q0
543    vpaddl.u32 q1, q1
544
545    vst4.32    {d0[0],d1[0],d2[0],d3[0]}, [r0]
546
547    ldmia sp!, {r4-r5, lr}
548WELS_ASM_FUNC_END
549
550
551WELS_ASM_FUNC_BEGIN WelsSampleSadFour8x16_neon
552    stmdb sp!, {r4-r5, lr}
553
554    //Generate the pix2 start addr
555    sub   r4, r2, #1
556    add   r5, r2, #1
557    sub   r2, r3
558
559    //Loading a horizontal line data (8 bytes)
560    vld1.8 {d0}, [r0], r1 //save pix1
561
562    vld1.8 {d1}, [r2], r3 //save pix2 - stride
563    vld1.8 {d6}, [r2], r3 //save pix2
564    vld1.8 {d2}, [r2], r3 //save pix2 + stride
565
566    vld1.8 {d3}, [r4], r3 //save pix2 - 1
567    vld1.8 {d4}, [r5], r3 //save pix2 + 1
568
569    //Do the SAD for 8 bytes
570    vabdl.u8  q15, d0, d1
571    vabdl.u8  q14, d0, d2
572    vabdl.u8  q13, d0, d3
573    vabdl.u8  q12, d0, d4
574
575    mov lr, #15
576pixel_sad_4_8x16_loop_0:
577
578    //Loading a horizontal line data (8 bytes)
579    vld1.8 {d0}, [r0], r1 //save pix1
580    vmov.8 d1,   d6       //save pix2 - stride
581    vmov.8 d6,   d2
582    vld1.8 {d2}, [r2], r3 //save pix2 + stride
583    vld1.8 {d3}, [r4], r3 //save pix2 - 1
584    vabal.u8  q15, d0, d1
585
586    vld1.8 {d4}, [r5], r3 //save pix2 + 1
587    //Do the SAD for 8 bytes
588    vabal.u8  q14, d0, d2
589    vabal.u8  q13, d0, d3
590    vabal.u8  q12, d0, d4
591    subs lr, #1
592
593    bne pixel_sad_4_8x16_loop_0
594
595    //Save SAD to 'r0'
596    ldr   r0, [sp, #12]
597
598    vadd.u16   d0, d30, d31
599    vadd.u16   d1, d28, d29
600    vadd.u16   d2, d26, d27
601    vadd.u16   d3, d24, d25
602
603    vpaddl.u16 q0, q0
604    vpaddl.u16 q1, q1
605
606    vpaddl.u32 q0, q0
607    vpaddl.u32 q1, q1
608
609    vst4.32    {d0[0],d1[0],d2[0],d3[0]}, [r0]
610
611    ldmia sp!, {r4-r5, lr}
612WELS_ASM_FUNC_END
613
614
615WELS_ASM_FUNC_BEGIN WelsSampleSadFour8x8_neon
616    stmdb sp!, {r4-r5, lr}
617
618    //Generate the pix2 start addr
619    sub   r4, r2, #1
620    add   r5, r2, #1
621    sub   r2, r3
622
623    //Loading a horizontal line data (8 bytes)
624    vld1.8 {d0}, [r0], r1 //save pix1
625
626    vld1.8 {d1}, [r2], r3 //save pix2 - stride
627    vld1.8 {d6}, [r2], r3 //save pix2
628    vld1.8 {d2}, [r2], r3 //save pix2 + stride
629
630    vld1.8 {d3}, [r4], r3 //save pix2 - 1
631    vld1.8 {d4}, [r5], r3 //save pix2 + 1
632
633    //Do the SAD for 8 bytes
634    vabdl.u8  q15, d0, d1
635    vabdl.u8  q14, d0, d2
636    vabdl.u8  q13, d0, d3
637    vabdl.u8  q12, d0, d4
638
639    mov lr, #7
640pixel_sad_4_8x8_loop_0:
641
642    //Loading a horizontal line data (8 bytes)
643    vld1.8 {d0}, [r0], r1 //save pix1
644    vmov.8 d1,   d6       //save pix2 - stride
645    vmov.8 d6,   d2
646    vld1.8 {d2}, [r2], r3 //save pix2 + stride
647    vld1.8 {d3}, [r4], r3 //save pix2 - 1
648    vabal.u8  q15, d0, d1
649
650    vld1.8 {d4}, [r5], r3 //save pix2 + 1
651    //Do the SAD for 8 bytes
652    vabal.u8  q14, d0, d2
653    vabal.u8  q13, d0, d3
654    vabal.u8  q12, d0, d4
655    subs lr, #1
656    bne pixel_sad_4_8x8_loop_0
657
658    //Save SAD to 'r0'
659    ldr   r0, [sp, #12]
660
661    vadd.u16   d0, d30, d31
662    vadd.u16   d1, d28, d29
663    vadd.u16   d2, d26, d27
664    vadd.u16   d3, d24, d25
665
666    vpaddl.u16 q0, q0
667    vpaddl.u16 q1, q1
668
669    vpaddl.u32 q0, q0
670    vpaddl.u32 q1, q1
671
672    vst4.32    {d0[0],d1[0],d2[0],d3[0]}, [r0]
673
674    ldmia sp!, {r4-r5, lr}
675WELS_ASM_FUNC_END
676
677
678WELS_ASM_FUNC_BEGIN WelsSampleSadFour4x4_neon
679
680    vld1.32  {d0[0]}, [r0], r1
681    vld1.32  {d0[1]}, [r0], r1
682    vld1.32  {d1[0]}, [r0], r1
683    vld1.32  {d1[1]}, [r0]
684
685
686    sub   r0, r2, r3
687    vld1.32  {d2[0]}, [r0], r3
688    vld1.32  {d2[1]}, [r0], r3
689    vld1.32  {d3[0]}, [r0], r3
690    vld1.32  {d3[1]}, [r0], r3
691    vld1.32  {d4[0]}, [r0], r3
692    vld1.32  {d4[1]}, [r0]
693
694    sub   r0,  r2, #1
695    vld1.32  {d5[0]}, [r0], r3
696    vld1.32  {d5[1]}, [r0], r3
697    vld1.32  {d6[0]}, [r0], r3
698    vld1.32  {d6[1]}, [r0]
699
700    add   r0,  r2, #1
701    vld1.32  {d7[0]}, [r0], r3
702    vld1.32  {d7[1]}, [r0], r3
703    vld1.32  {d8[0]}, [r0], r3
704    vld1.32  {d8[1]}, [r0]
705
706    vabdl.u8  q15, d0, d2
707    vabdl.u8  q14, d1, d3
708
709    vabdl.u8  q13, d0, d3
710    vabdl.u8  q12, d1, d4
711
712    vabdl.u8  q11, d0, d5
713    vabdl.u8  q10, d1, d6
714
715    vabdl.u8  q9, d0, d7
716    vabdl.u8  q8, d1, d8
717
718    //Save SAD to 'r4'
719    ldr   r0, [sp]
720    vadd.u16   q0, q14, q15
721    vadd.u16   q1, q12, q13
722    vadd.u16   q2, q10, q11
723    vadd.u16   q3, q8 , q9
724
725    vadd.u16   d0, d1
726    vadd.u16   d1, d2, d3
727    vadd.u16   d2, d4, d5
728    vadd.u16   d3, d6, d7
729
730    vpaddl.u16 q0, q0
731    vpaddl.u16 q1, q1
732
733    vpaddl.u32 q0, q0
734    vpaddl.u32 q1, q1
735
736    vst4.32    {d0[0],d1[0],d2[0],d3[0]}, [r0]
737
738WELS_ASM_FUNC_END
739
740
741WELS_ASM_FUNC_BEGIN WelsSampleSatd16x16_neon
742    vpush       {q7}
743
744    SATD_16x4
745    vadd.u16    q7,  q0, q2
746
747    SATD_16x4
748    vadd.u16    q7,  q7, q0
749    vadd.u16    q7,  q7, q2
750
751    SATD_16x4
752    vadd.u16    q7,  q7, q0
753    vadd.u16    q7,  q7, q2
754
755    SATD_16x4
756    vadd.u16    q7,  q7, q0
757    vadd.u16    q7,  q7, q2
758
759    vadd.u16  d0, d14, d15
760    vpaddl.u16  d0, d0
761    vpaddl.u32  d0, d0
762
763    vmov.32     r0,  d0[0]
764    vpop        {q7}
765WELS_ASM_FUNC_END
766
767
768WELS_ASM_FUNC_BEGIN WelsSampleSatd16x8_neon
769    vpush       {q7}
770
771    SATD_16x4
772    vadd.u16    q7,  q0, q2
773
774    SATD_16x4
775    vadd.u16    q7,  q7, q0
776    vadd.u16    q7,  q7, q2
777
778    vadd.u16  d0, d14, d15
779    vpaddl.u16  d0, d0
780    vpaddl.u32  d0, d0
781
782    vmov.32     r0,  d0[0]
783    vpop        {q7}
784WELS_ASM_FUNC_END
785
786
787WELS_ASM_FUNC_BEGIN WelsSampleSatd8x16_neon
788    vpush       {q7}
789
790    SATD_8x4
791    vadd.u16    q7,  q0, q1
792
793    SATD_8x4
794    vadd.u16    q7,  q7, q0
795    vadd.u16    q7,  q7, q1
796
797    SATD_8x4
798    vadd.u16    q7,  q7, q0
799    vadd.u16    q7,  q7, q1
800
801    SATD_8x4
802    vadd.u16    q7,  q7, q0
803    vadd.u16    q7,  q7, q1
804
805    vadd.u16  d0, d14, d15
806    vpaddl.u16  d0, d0
807    vpaddl.u32  d0, d0
808
809    vmov.32     r0,  d0[0]
810    vpop        {q7}
811WELS_ASM_FUNC_END
812
813
814WELS_ASM_FUNC_BEGIN WelsSampleSatd8x8_neon
815    vpush       {q7}
816
817    SATD_8x4
818    vadd.u16    q7,  q0, q1
819
820    SATD_8x4
821    vadd.u16    q7,  q7, q0
822    vadd.u16    q7,  q7, q1
823
824    vadd.u16  d0, d14, d15
825    vpaddl.u16  d0, d0
826    vpaddl.u32  d0, d0
827
828    vmov.32     r0,  d0[0]
829    vpop        {q7}
830WELS_ASM_FUNC_END
831
832
833WELS_ASM_FUNC_BEGIN WelsSampleSatd4x4_neon
834
835    //Load the pix1 data --- 16 bytes
836    vld1.32  {d0[0]}, [r0], r1
837    vld1.32  {d0[1]}, [r0], r1
838    vld1.32  {d1[0]}, [r0], r1
839    vld1.32  {d1[1]}, [r0]
840
841    //Load the pix2 data --- 16 bytes
842    vld1.32  {d2[0]}, [r2], r3
843    vld1.32  {d2[1]}, [r2], r3
844    vld1.32  {d3[0]}, [r2], r3
845    vld1.32  {d3[1]}, [r2]
846
847    //Get the difference
848    vsubl.u8 q15, d0, d2 //{0,1,2,3,4,5,6,7}
849    vsubl.u8 q14, d1, d3 //{8,9,10,11,12,13,14,15}
850
851    //Do the vertical transform
852    vadd.s16 q13, q15, q14 //{0,4,8,12,1,5,9,13}
853    vsub.s16 q12, q15, q14 //{2,6,10,14,3,7,11,15}
854    vswp  d27, d24
855    vadd.s16 q15, q13, q12 //{0,1,2,3,4,5,6,7}
856    vsub.s16 q14, q13, q12 //{12,13,14,15,8,9,10,11}
857
858    //Do the horizontal transform
859    vtrn.32 q15, q14
860    vadd.s16 q13, q15, q14
861    vsub.s16 q12, q15, q14
862
863    vtrn.16 q13, q12
864    vadd.s16 q15, q13, q12
865
866    //Do the SAD
867    vabs.s16 q15, q15
868    vabd.s16 q14, q13, q12
869
870    vadd.u16 q0, q15, q14
871
872    vrhadd.u16 d0, d1
873    vpaddl.u16 d0, d0
874    vpaddl.u32 d0, d0
875
876    vmov.u32   r0, d0[0]
877
878WELS_ASM_FUNC_END
879
880#endif
881
882
883