]> git.sesse.net Git - x264/blob - common/aarch64/pixel-a.S
aarch64: pixel metrics NEON asm
[x264] / common / aarch64 / pixel-a.S
1 /*****************************************************************************
2  * pixel.S: aarch64 pixel metrics
3  *****************************************************************************
4  * Copyright (C) 2009-2014 x264 project
5  *
6  * Authors: David Conrad <lessen42@gmail.com>
7  *          Janne Grunau <janne-x264@jannau.net>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
22  *
23  * This program is also available under a commercial proprietary license.
24  * For more information, contact us at licensing@x264.com.
25  *****************************************************************************/
26
27 #include "asm.S"
28
29 const mask
30 .rept 16
31 .byte 0xff
32 .endr
33 .rept 16
34 .byte 0x00
35 .endr
36 endconst
37
38 const mask_ac_4_8
39 .short 0, -1, -1, -1,  0, -1, -1, -1
40 .short 0, -1, -1, -1, -1, -1, -1, -1
41 endconst
42
43 .macro SAD_START_4
44     ld1        {v1.s}[0], [x2], x3
45     ld1        {v0.s}[0], [x0], x1
46     ld1        {v1.s}[1], [x2], x3
47     ld1        {v0.s}[1], [x0], x1
48     uabdl       v16.8h,  v0.8b,  v1.8b
49 .endm
50
51 .macro SAD_4
52     ld1        {v1.s}[0], [x2], x3
53     ld1        {v0.s}[0], [x0], x1
54     ld1        {v1.s}[1], [x2], x3
55     ld1        {v0.s}[1], [x0], x1
56     uabal       v16.8h,  v0.8b,  v1.8b
57 .endm
58
59 .macro SAD_START_8
60     ld1         {v1.8b}, [x2], x3
61     ld1         {v0.8b}, [x0], x1
62     ld1         {v3.8b}, [x2], x3
63     ld1         {v2.8b}, [x0], x1
64     uabdl       v16.8h,  v0.8b,  v1.8b
65     uabdl       v17.8h,  v2.8b,  v3.8b
66 .endm
67
68 .macro SAD_8
69     ld1         {v1.8b}, [x2], x3
70     ld1         {v0.8b}, [x0], x1
71     ld1         {v3.8b}, [x2], x3
72     ld1         {v2.8b}, [x0], x1
73     uabal       v16.8h,  v0.8b,  v1.8b
74     uabal       v17.8h,  v2.8b,  v3.8b
75 .endm
76
77 .macro SAD_START_16
78     ld1         {v1.16b}, [x2], x3
79     ld1         {v0.16b}, [x0], x1
80     ld1         {v3.16b}, [x2], x3
81     ld1         {v2.16b}, [x0], x1
82     uabdl       v16.8h,  v0.8b,  v1.8b
83     uabdl2      v17.8h,  v0.16b, v1.16b
84     uabal       v16.8h,  v2.8b,  v3.8b
85     uabal2      v17.8h,  v2.16b, v3.16b
86 .endm
87
88 .macro SAD_16
89     ld1         {v1.16b}, [x2], x3
90     ld1         {v0.16b}, [x0], x1
91     ld1         {v3.16b}, [x2], x3
92     ld1         {v2.16b}, [x0], x1
93     uabal       v16.8h,  v0.8b,  v1.8b
94     uabal2      v17.8h,  v0.16b, v1.16b
95     uabal       v16.8h,  v2.8b,  v3.8b
96     uabal2      v17.8h,  v2.16b, v3.16b
97 .endm
98
99 .macro SAD_FUNC w, h, name
100 function x264_pixel_sad\name\()_\w\()x\h\()_neon, export=1
101     SAD_START_\w
102
103 .rept \h / 2 - 1
104     SAD_\w
105 .endr
106 .if \w > 4
107     add         v16.8h,  v16.8h,  v17.8h
108 .endif
109     uaddlv      s0,  v16.8h
110     fmov        w0,  s0
111     ret
112 endfunc
113 .endm
114
115 SAD_FUNC  4,  4
116 SAD_FUNC  4,  8
117 SAD_FUNC  8,  4
118 SAD_FUNC  8,  8
119 SAD_FUNC  8,  16
120 SAD_FUNC  16, 8
121 SAD_FUNC  16, 16
122
123 .macro SAD_X_4 x, first=uabal
124     ld1        {v0.s}[0], [x0], x7
125     ld1        {v1.s}[0], [x1], x5
126     ld1        {v0.s}[1], [x0], x7
127     ld1        {v1.s}[1], [x1], x5
128     \first      v16.8h,  v1.8b,  v0.8b
129     ld1        {v2.s}[0], [x2], x5
130     ld1        {v2.s}[1], [x2], x5
131     \first      v17.8h,  v2.8b,  v0.8b
132     ld1        {v3.s}[0], [x3], x5
133     ld1        {v3.s}[1], [x3], x5
134     \first      v18.8h,  v3.8b,  v0.8b
135 .if \x == 4
136     ld1        {v4.s}[0], [x4], x5
137     ld1        {v4.s}[1], [x4], x5
138     \first      v19.8h,  v4.8b,  v0.8b
139 .endif
140 .endm
141
142 .macro SAD_X_8 x, first=uabal
143     ld1        {v0.8b}, [x0], x7
144     ld1        {v1.8b}, [x1], x5
145     \first      v16.8h,  v1.8b,  v0.8b
146     ld1        {v2.8b}, [x2], x5
147     ld1        {v5.8b}, [x0], x7
148     \first      v17.8h,  v2.8b,  v0.8b
149     ld1        {v3.8b}, [x3], x5
150     ld1        {v1.8b}, [x1], x5
151    \first       v18.8h,  v3.8b,  v0.8b
152     uabal       v16.8h,  v1.8b,  v5.8b
153     ld1        {v2.8b}, [x2], x5
154     ld1        {v3.8b}, [x3], x5
155     uabal       v17.8h,  v2.8b,  v5.8b
156     uabal       v18.8h,  v3.8b,  v5.8b
157 .if \x == 4
158     ld1        {v4.8b}, [x4], x5
159     \first      v19.8h,  v4.8b,  v0.8b
160     ld1        {v4.8b}, [x4], x5
161     uabal       v19.8h,  v4.8b,  v5.8b
162 .endif
163 .endm
164
165 .macro SAD_X_16 x, first=uabal
166     ld1        {v0.16b}, [x0], x7
167     ld1        {v1.16b}, [x1], x5
168     \first      v16.8h,  v1.8b,  v0.8b
169     \first\()2  v20.8h,  v1.16b, v0.16b
170     ld1        {v2.16b}, [x2], x5
171     ld1        {v5.16b}, [x0], x7
172     \first      v17.8h,  v2.8b,  v0.8b
173     \first\()2  v21.8h,  v2.16b, v0.16b
174     ld1        {v3.16b}, [x3], x5
175     ld1        {v1.16b}, [x1], x5
176     \first      v18.8h,  v3.8b,  v0.8b
177     \first\()2  v22.8h,  v3.16b, v0.16b
178     uabal       v16.8h,  v1.8b,  v5.8b
179     uabal2      v20.8h,  v1.16b, v5.16b
180     ld1        {v2.16b}, [x2], x5
181     ld1        {v3.16b}, [x3], x5
182     uabal       v17.8h,  v2.8b,  v5.8b
183     uabal2      v21.8h,  v2.16b, v5.16b
184     uabal       v18.8h,  v3.8b,  v5.8b
185     uabal2      v22.8h,  v3.16b, v5.16b
186 .if \x == 4
187     ld1        {v4.16b}, [x4], x5
188     \first      v19.8h,  v4.8b,  v0.8b
189     \first\()2  v23.8h,  v4.16b, v0.16b
190     ld1        {v4.16b}, [x4], x5
191     uabal       v19.8h,  v4.8b,  v5.8b
192     uabal2      v23.8h,  v4.16b, v5.16b
193 .endif
194 .endm
195
196 .macro SAD_X_FUNC x, w, h
197 function x264_pixel_sad_x\x\()_\w\()x\h\()_neon, export=1
198 .if \x == 3
199     mov         x6,  x5
200     mov         x5,  x4
201 .endif
202     mov         x7,  #FENC_STRIDE
203
204     SAD_X_\w \x, uabdl
205
206 .rept \h / 2 - 1
207     SAD_X_\w \x
208 .endr
209
210 .if \w > 8
211     add         v16.8h, v16.8h, v20.8h
212     add         v17.8h, v17.8h, v21.8h
213     add         v18.8h, v18.8h, v22.8h
214 .if \x == 4
215     add         v19.8h, v19.8h, v23.8h
216 .endif
217 .endif
218 // add up the sads
219     uaddlv      s0,  v16.8h
220     uaddlv      s1,  v17.8h
221     uaddlv      s2,  v18.8h
222
223     stp         s0,  s1,  [x6], #8
224 .if \x == 3
225     str         s2,  [x6]
226 .else
227     uaddlv      s3,  v19.8h
228     stp         s2,  s3,  [x6]
229 .endif
230     ret
231 endfunc
232 .endm
233
234 SAD_X_FUNC  3, 4,  4
235 SAD_X_FUNC  3, 4,  8
236 SAD_X_FUNC  3, 8,  4
237 SAD_X_FUNC  3, 8,  8
238 SAD_X_FUNC  3, 8,  16
239 SAD_X_FUNC  3, 16, 8
240 SAD_X_FUNC  3, 16, 16
241
242 SAD_X_FUNC  4, 4,  4
243 SAD_X_FUNC  4, 4,  8
244 SAD_X_FUNC  4, 8,  4
245 SAD_X_FUNC  4, 8,  8
246 SAD_X_FUNC  4, 8,  16
247 SAD_X_FUNC  4, 16, 8
248 SAD_X_FUNC  4, 16, 16
249
250
251 .macro SSD_START_4
252     ld1        {v16.s}[0], [x0], x1
253     ld1        {v17.s}[0], [x2], x3
254     usubl       v2.8h,  v16.8b,  v17.8b
255     ld1        {v16.s}[0], [x0], x1
256     ld1        {v17.s}[0], [x2], x3
257     smull       v0.4s,  v2.4h,   v2.4h
258 .endm
259
260 .macro SSD_4
261     usubl       v2.8h,  v16.8b,  v17.8b
262     ld1        {v16.s}[0], [x0], x1
263     ld1        {v17.s}[0], [x2], x3
264     smlal       v0.4s,  v2.4h,   v2.4h
265 .endm
266
267 .macro SSD_END_4
268     usubl       v2.8h,  v16.8b,  v17.8b
269     smlal       v0.4s,  v2.4h,   v2.4h
270 .endm
271
272 .macro SSD_START_8
273     ld1        {v16.8b}, [x0], x1
274     ld1        {v17.8b}, [x2], x3
275     usubl       v2.8h,  v16.8b,  v17.8b
276     ld1        {v16.8b}, [x0], x1
277     smull       v0.4s,  v2.4h,   v2.4h
278     ld1        {v17.8b}, [x2], x3
279     smlal2      v0.4s,  v2.8h,   v2.8h
280 .endm
281
282 .macro SSD_8
283     usubl       v2.8h,  v16.8b,  v17.8b
284     ld1        {v16.8b}, [x0], x1
285     smlal       v0.4s,  v2.4h,   v2.4h
286     ld1        {v17.8b}, [x2], x3
287     smlal2      v0.4s,  v2.8h,   v2.8h
288 .endm
289
290 .macro SSD_END_8
291     usubl       v2.8h,  v16.8b,  v17.8b
292     smlal       v0.4s,  v2.4h,   v2.4h
293     smlal2      v0.4s,  v2.8h,   v2.8h
294 .endm
295
296 .macro SSD_START_16
297     ld1        {v16.16b}, [x0], x1
298     ld1        {v17.16b}, [x2], x3
299     usubl       v2.8h,  v16.8b,  v17.8b
300     usubl2      v3.8h,  v16.16b, v17.16b
301     ld1         {v16.16b}, [x0], x1
302     smull       v0.4s,  v2.4h,   v2.4h
303     smull2      v1.4s,  v2.8h,   v2.8h
304     ld1         {v17.16b}, [x2], x3
305     smlal       v0.4s,  v3.4h,   v3.4h
306     smlal2      v1.4s,  v3.8h,   v3.8h
307 .endm
308
309 .macro SSD_16
310     usubl       v2.8h,  v16.8b,  v17.8b
311     usubl2      v3.8h,  v16.16b, v17.16b
312     ld1         {v16.16b}, [x0], x1
313     smlal       v0.4s,  v2.4h,   v2.4h
314     smlal2      v1.4s,  v2.8h,   v2.8h
315     ld1         {v17.16b}, [x2], x3
316     smlal       v0.4s,  v3.4h,   v3.4h
317     smlal2      v1.4s,  v3.8h,   v3.8h
318 .endm
319
320 .macro SSD_END_16
321     usubl       v2.8h,  v16.8b,  v17.8b
322     usubl2      v3.8h,  v16.16b, v17.16b
323     smlal       v0.4s,  v2.4h,   v2.4h
324     smlal2      v1.4s,  v2.8h,   v2.8h
325     smlal       v0.4s,  v3.4h,   v3.4h
326     smlal2      v1.4s,  v3.8h,   v3.8h
327     add         v0.4s,  v0.4s,   v1.4s
328 .endm
329
330 .macro SSD_FUNC w h
331 function x264_pixel_ssd_\w\()x\h\()_neon, export=1
332     SSD_START_\w
333 .rept \h-2
334     SSD_\w
335 .endr
336     SSD_END_\w
337
338     addv        s0,  v0.4s
339     mov         w0,  v0.s[0]
340     ret
341 endfunc
342 .endm
343
344 SSD_FUNC   4, 4
345 SSD_FUNC   4, 8
346 SSD_FUNC   8, 4
347 SSD_FUNC   8, 8
348 SSD_FUNC   8, 16
349 SSD_FUNC  16, 8
350 SSD_FUNC  16, 16
351
352 .macro pixel_var_8 h
353 function x264_pixel_var_8x\h\()_neon, export=1
354     ld1            {v16.8b}, [x0], x1
355     ld1            {v17.8b}, [x0], x1
356     mov             x2,  \h - 4
357     umull           v1.8h,  v16.8b, v16.8b
358     uxtl            v0.8h,  v16.8b
359     umull           v2.8h,  v17.8b, v17.8b
360     uaddw           v0.8h,  v0.8h,  v17.8b
361     ld1            {v18.8b}, [x0], x1
362     uaddlp          v1.4s,  v1.8h
363     uaddlp          v2.4s,  v2.8h
364     ld1            {v19.8b}, [x0], x1
365
366 1:  subs            x2,  x2,  #4
367     uaddw           v0.8h,  v0.8h,  v18.8b
368     umull           v24.8h, v18.8b, v18.8b
369     ld1            {v20.8b}, [x0], x1
370     uaddw           v0.8h,  v0.8h,  v19.8b
371     umull           v25.8h, v19.8b, v19.8b
372     uadalp          v1.4s,  v24.8h
373     ld1            {v21.8b}, [x0], x1
374     uaddw           v0.8h,  v0.8h,  v20.8b
375     umull           v26.8h, v20.8b, v20.8b
376     uadalp          v2.4s,  v25.8h
377     ld1            {v18.8b}, [x0], x1
378     uaddw           v0.8h,  v0.8h,  v21.8b
379     umull           v27.8h, v21.8b, v21.8b
380     uadalp          v1.4s,  v26.8h
381     ld1            {v19.8b}, [x0], x1
382     uadalp          v2.4s,  v27.8h
383     b.gt            1b
384
385     uaddw           v0.8h,  v0.8h,  v18.8b
386     umull           v28.8h, v18.8b, v18.8b
387     uaddw           v0.8h,  v0.8h,  v19.8b
388     umull           v29.8h, v19.8b, v19.8b
389     uadalp          v1.4s,  v28.8h
390     uadalp          v2.4s,  v29.8h
391
392     b               x264_var_end
393 endfunc
394 .endm
395
396 pixel_var_8  8
397 pixel_var_8 16
398
399 function x264_pixel_var_16x16_neon, export=1
400     ld1            {v16.16b}, [x0],  x1
401     ld1            {v17.16b}, [x0],  x1
402     mov             x2,  #14
403     umull           v1.8h,  v16.8b,  v16.8b
404     umull2          v2.8h,  v16.16b, v16.16b
405     uxtl            v0.8h,  v16.8b
406     uaddlp          v1.4s,  v1.8h
407     uaddlp          v2.4s,  v2.8h
408     uaddw2          v0.8h,  v0.8h,   v16.16b
409
410 1:  subs            x2,  x2,  #2
411     ld1            {v18.16b}, [x0],  x1
412     uaddw           v0.8h,  v0.8h,   v17.8b
413     umull           v3.8h,  v17.8b,  v17.8b
414     uaddw2          v0.8h,  v0.8h,   v17.16b
415     umull2          v4.8h,  v17.16b, v17.16b
416     uadalp          v1.4s,  v3.8h
417     uadalp          v2.4s,  v4.8h
418
419     ld1            {v17.16b}, [x0],  x1
420     uaddw           v0.8h,  v0.8h,   v18.8b
421     umull           v5.8h,  v18.8b,  v18.8b
422     uaddw2          v0.8h,  v0.8h,   v18.16b
423     umull2          v6.8h,  v18.16b, v18.16b
424     uadalp          v1.4s,  v5.8h
425     uadalp          v2.4s,  v6.8h
426     b.gt            1b
427
428     uaddw           v0.8h,  v0.8h,   v17.8b
429     umull           v3.8h,  v17.8b,  v17.8b
430     uaddw2          v0.8h,  v0.8h,   v17.16b
431     umull2          v4.8h,  v17.16b, v17.16b
432     uadalp          v1.4s,  v3.8h
433     uadalp          v2.4s,  v4.8h
434 endfunc
435
436 function x264_var_end
437     add             v1.4s,  v1.4s,  v2.4s
438     uaddlv          s0,  v0.8h
439     uaddlv          d1,  v1.4s
440     mov             w0,  v0.s[0]
441     mov             x1,  v1.d[0]
442     orr             x0,  x0,  x1,  lsl #32
443     ret
444 endfunc
445
446
447 .macro pixel_var2_8 h
448 function x264_pixel_var2_8x\h\()_neon, export=1
449     ld1            {v16.8b}, [x0], x1
450     ld1            {v18.8b}, [x2], x3
451     ld1            {v17.8b}, [x0], x1
452     ld1            {v19.8b}, [x2], x3
453     mov             x5,  \h - 4
454     usubl           v6.8h,  v16.8b, v18.8b
455     usubl           v7.8h,  v17.8b, v19.8b
456     ld1            {v16.8b}, [x0], x1
457     ld1            {v18.8b}, [x2], x3
458     smull           v2.4s,  v6.4h,  v6.4h
459     smull2          v3.4s,  v6.8h,  v6.8h
460     add             v0.8h,  v6.8h,  v7.8h
461     smlal           v2.4s,  v7.4h,  v7.4h
462     smlal2          v3.4s,  v7.8h,  v7.8h
463
464     usubl           v6.8h,  v16.8b, v18.8b
465
466 1:  subs            x5,  x5,  #2
467     ld1            {v17.8b}, [x0], x1
468     ld1            {v19.8b}, [x2], x3
469     smlal           v2.4s,  v6.4h,  v6.4h
470     smlal2          v3.4s,  v6.8h,  v6.8h
471     usubl           v7.8h,  v17.8b, v19.8b
472     add             v0.8h,  v0.8h,  v6.8h
473     ld1            {v16.8b}, [x0], x1
474     ld1            {v18.8b}, [x2], x3
475     smlal           v2.4s,  v7.4h,  v7.4h
476     smlal2          v3.4s,  v7.8h,  v7.8h
477     usubl           v6.8h,  v16.8b, v18.8b
478     add             v0.8h,  v0.8h,  v7.8h
479     b.gt            1b
480
481     ld1            {v17.8b}, [x0], x1
482     ld1            {v19.8b}, [x2], x3
483     smlal           v2.4s,  v6.4h,  v6.4h
484     smlal2          v3.4s,  v6.8h,  v6.8h
485     usubl           v7.8h,  v17.8b, v19.8b
486     add             v0.8h,  v0.8h,  v6.8h
487     smlal           v2.4s,  v7.4h,  v7.4h
488     add             v0.8h,  v0.8h,  v7.8h
489     smlal2          v3.4s,  v7.8h,  v7.8h
490
491     saddlv          s0,  v0.8h
492     add             v2.4s,  v2.4s,  v3.4s
493     mov             w0,  v0.s[0]
494     addv            s1,  v2.4s
495     sxtw            x0,  w0
496     mov             w1,  v1.s[0]
497     mul             x0,  x0,  x0
498     str             w1,  [x4]
499     sub             x0,  x1,  x0,  lsr # 6 + (\h >> 4)
500
501     ret
502 endfunc
503 .endm
504
505 pixel_var2_8  8
506 pixel_var2_8 16
507
508
509 function x264_pixel_satd_4x4_neon, export=1
510     ld1        {v1.s}[0],  [x2], x3
511     ld1        {v0.s}[0],  [x0], x1
512     ld1        {v3.s}[0],  [x2], x3
513     ld1        {v2.s}[0],  [x0], x1
514     ld1        {v1.s}[1],  [x2], x3
515     ld1        {v0.s}[1],  [x0], x1
516     ld1        {v3.s}[1],  [x2], x3
517     ld1        {v2.s}[1],  [x0], x1
518
519     usubl       v0.8h,  v0.8b,  v1.8b
520     usubl       v1.8h,  v2.8b,  v3.8b
521     SUMSUB_AB   v2.8h,  v3.8h,  v0.8h,  v1.8h
522
523     zip1        v0.2d,  v2.2d,  v3.2d
524     zip2        v1.2d,  v2.2d,  v3.2d
525     SUMSUB_AB   v2.8h,  v3.8h,  v0.8h,  v1.8h
526
527     trn1        v0.8h,  v2.8h,  v3.8h
528     trn2        v1.8h,  v2.8h,  v3.8h
529     SUMSUB_AB   v2.8h,  v3.8h,  v0.8h,  v1.8h
530
531     trn1        v0.4s,  v2.4s,  v3.4s
532     trn2        v1.4s,  v2.4s,  v3.4s
533     abs         v0.8h,  v0.8h
534     abs         v1.8h,  v1.8h
535     umax        v0.8h,  v0.8h,  v1.8h
536
537     uaddlv      s0,  v0.8h
538     mov         w0,  v0.s[0]
539     ret
540 endfunc
541
542 function x264_pixel_satd_4x8_neon, export=1
543     ld1        {v1.s}[0],  [x2], x3
544     ld1        {v0.s}[0],  [x0], x1
545     ld1        {v3.s}[0],  [x2], x3
546     ld1        {v2.s}[0],  [x0], x1
547     ld1        {v5.s}[0],  [x2], x3
548     ld1        {v4.s}[0],  [x0], x1
549     ld1        {v7.s}[0],  [x2], x3
550     ld1        {v6.s}[0],  [x0], x1
551     ld1        {v1.s}[1],  [x2], x3
552     ld1        {v0.s}[1],  [x0], x1
553     ld1        {v3.s}[1],  [x2], x3
554     ld1        {v2.s}[1],  [x0], x1
555     ld1        {v5.s}[1],  [x2], x3
556     ld1        {v4.s}[1],  [x0], x1
557     ld1        {v7.s}[1],  [x2], x3
558     ld1        {v6.s}[1],  [x0], x1
559     b           x264_satd_4x8_8x4_end_neon
560 endfunc
561
562 function x264_pixel_satd_8x4_neon, export=1
563     ld1        {v1.8b},  [x2], x3
564     ld1        {v0.8b},  [x0], x1
565     ld1        {v3.8b},  [x2], x3
566     ld1        {v2.8b},  [x0], x1
567     ld1        {v5.8b},  [x2], x3
568     ld1        {v4.8b},  [x0], x1
569     ld1        {v7.8b},  [x2], x3
570     ld1        {v6.8b},  [x0], x1
571 endfunc
572
573 function x264_satd_4x8_8x4_end_neon
574     usubl       v0.8h,  v0.8b,  v1.8b
575     usubl       v1.8h,  v2.8b,  v3.8b
576     usubl       v2.8h,  v4.8b,  v5.8b
577     usubl       v3.8h,  v6.8b,  v7.8b
578
579     SUMSUB_AB   v16.8h, v17.8h, v0.8h,  v1.8h
580     SUMSUB_AB   v18.8h, v19.8h, v2.8h,  v3.8h
581
582     SUMSUB_AB   v4.8h,  v6.8h,  v16.8h, v18.8h
583     SUMSUB_AB   v5.8h,  v7.8h,  v17.8h, v19.8h
584
585     trn1        v0.8h,  v4.8h,  v5.8h
586     trn2        v1.8h,  v4.8h,  v5.8h
587     trn1        v2.8h,  v6.8h,  v7.8h
588     trn2        v3.8h,  v6.8h,  v7.8h
589
590     SUMSUB_AB   v16.8h, v17.8h, v0.8h,  v1.8h
591     SUMSUB_AB   v18.8h, v19.8h, v2.8h,  v3.8h
592
593     trn1        v0.4s,  v16.4s, v18.4s
594     trn2        v1.4s,  v16.4s, v18.4s
595     trn1        v2.4s,  v17.4s, v19.4s
596     trn2        v3.4s,  v17.4s, v19.4s
597     abs         v0.8h,  v0.8h
598     abs         v1.8h,  v1.8h
599     abs         v2.8h,  v2.8h
600     abs         v3.8h,  v3.8h
601     umax        v0.8h,  v0.8h,  v1.8h
602     umax        v1.8h,  v2.8h,  v3.8h
603     add         v0.8h,  v0.8h,  v1.8h
604     uaddlv      s0,  v0.8h
605     mov         w0,  v0.s[0]
606     ret
607 endfunc
608
609 function x264_pixel_satd_8x8_neon, export=1
610     mov         x4,  x30
611
612     bl x264_satd_8x8_neon
613     add         v0.8h,  v0.8h,  v1.8h
614     add         v1.8h,  v2.8h,  v3.8h
615     add         v0.8h,  v0.8h,  v1.8h
616     uaddlv      s0,  v0.8h
617     mov         w0,  v0.s[0]
618     ret         x4
619 endfunc
620
621 function x264_pixel_satd_8x16_neon, export=1
622     mov         x4,  x30
623
624     bl x264_satd_8x8_neon
625     add         v0.8h,  v0.8h,  v1.8h
626     add         v1.8h,  v2.8h,  v3.8h
627     add         v30.8h, v0.8h,  v1.8h
628
629     bl x264_satd_8x8_neon
630     add         v0.8h,  v0.8h,  v1.8h
631     add         v1.8h,  v2.8h,  v3.8h
632     add         v31.8h, v0.8h,  v1.8h
633     add         v0.8h,  v30.8h, v31.8h
634     uaddlv      s0,  v0.8h
635     mov         w0,  v0.s[0]
636     ret         x4
637 endfunc
638
639 .macro SUMSUBL_AB  sum, sub, a, b
640     uaddl      \sum,  \a,  \b
641     usubl      \sub,  \a,  \b
642 .endm
643
644 .macro load_diff_fly_8x8
645     ld1        {v1.8b},  [x2], x3
646     ld1        {v0.8b},  [x0], x1
647     ld1        {v3.8b},  [x2], x3
648     ld1        {v2.8b},  [x0], x1
649     usubl       v16.8h, v0.8b,  v1.8b
650     ld1        {v5.8b},  [x2], x3
651     ld1        {v4.8b},  [x0], x1
652     usubl       v17.8h, v2.8b,  v3.8b
653     ld1        {v7.8b},  [x2], x3
654     ld1        {v6.8b},  [x0], x1
655     usubl       v18.8h, v4.8b,  v5.8b
656     ld1        {v1.8b},  [x2], x3
657     ld1        {v0.8b},  [x0], x1
658     usubl       v19.8h, v6.8b,  v7.8b
659     ld1        {v3.8b},  [x2], x3
660     ld1        {v2.8b},  [x0], x1
661     usubl       v20.8h, v0.8b,  v1.8b
662     ld1        {v5.8b},  [x2], x3
663     ld1        {v4.8b},  [x0], x1
664     usubl       v21.8h, v2.8b,  v3.8b
665     ld1        {v7.8b},  [x2], x3
666     ld1        {v6.8b},  [x0], x1
667
668     SUMSUB_AB   v0.8h,  v1.8h,  v16.8h, v17.8h
669     SUMSUB_AB   v2.8h,  v3.8h,  v18.8h, v19.8h
670
671     usubl       v22.8h, v4.8b,  v5.8b
672     usubl       v23.8h, v6.8b,  v7.8b
673 .endm
674
675 .macro SUMSUB_ABCD s1, d1, s2, d2, a, b, c, d
676     SUMSUB_AB   \s1, \d1, \a, \b
677     SUMSUB_AB   \s2, \d2, \c, \d
678 .endm
679
680 .macro HADAMARD4_V r1, r2, r3, r4, t1, t2, t3, t4
681     SUMSUB_ABCD \t1, \t2, \t3, \t4, \r1, \r2, \r3, \r4
682     SUMSUB_ABCD \r1, \r3, \r2, \r4, \t1, \t3, \t2, \t4
683 .endm
684
685 function x264_satd_8x8_neon
686     load_diff_fly_8x8
687 endfunc
688
689 // one vertical hadamard pass and two horizontal
690 function x264_satd_8x4v_8x8h_neon
691     SUMSUB_AB   v16.8h, v18.8h, v0.8h,  v2.8h
692     SUMSUB_AB   v17.8h, v19.8h, v1.8h,  v3.8h
693
694     HADAMARD4_V v20.8h, v21.8h, v22.8h, v23.8h, v0.8h,  v1.8h, v2.8h, v3.8h
695
696     transpose   v0.8h,  v1.8h,  v16.8h, v17.8h
697     transpose   v2.8h,  v3.8h,  v18.8h, v19.8h
698     transpose   v4.8h,  v5.8h,  v20.8h, v21.8h
699     transpose   v6.8h,  v7.8h,  v22.8h, v23.8h
700
701     SUMSUB_AB   v16.8h, v17.8h, v0.8h,  v1.8h
702     SUMSUB_AB   v18.8h, v19.8h, v2.8h,  v3.8h
703     SUMSUB_AB   v20.8h, v21.8h, v4.8h,  v5.8h
704     SUMSUB_AB   v22.8h, v23.8h, v6.8h,  v7.8h
705
706     transpose   v0.4s,  v2.4s,  v16.4s, v18.4s
707     transpose   v1.4s,  v3.4s,  v17.4s, v19.4s
708     transpose   v4.4s,  v6.4s,  v20.4s, v22.4s
709     transpose   v5.4s,  v7.4s,  v21.4s, v23.4s
710
711     abs         v0.8h,  v0.8h
712     abs         v1.8h,  v1.8h
713     abs         v2.8h,  v2.8h
714     abs         v3.8h,  v3.8h
715     abs         v4.8h,  v4.8h
716     abs         v5.8h,  v5.8h
717     abs         v6.8h,  v6.8h
718     abs         v7.8h,  v7.8h
719
720     umax        v0.8h,  v0.8h,  v2.8h
721     umax        v1.8h,  v1.8h,  v3.8h
722     umax        v2.8h,  v4.8h,  v6.8h
723     umax        v3.8h,  v5.8h,  v7.8h
724
725     ret
726 endfunc
727
728 function x264_pixel_satd_16x8_neon, export=1
729     mov         x4,  x30
730
731     bl          x264_satd_16x4_neon
732     add         v30.8h, v0.8h,  v1.8h
733     add         v31.8h, v2.8h,  v3.8h
734
735     bl          x264_satd_16x4_neon
736     add         v0.8h,  v0.8h,  v1.8h
737     add         v1.8h,  v2.8h,  v3.8h
738     add         v30.8h, v30.8h, v0.8h
739     add         v31.8h, v31.8h, v1.8h
740
741     add         v0.8h,  v30.8h, v31.8h
742     uaddlv      s0,  v0.8h
743     mov         w0,  v0.s[0]
744     ret         x4
745 endfunc
746
747 function x264_pixel_satd_16x16_neon, export=1
748     mov         x4,  x30
749
750     bl          x264_satd_16x4_neon
751     add         v30.8h, v0.8h,  v1.8h
752     add         v31.8h, v2.8h,  v3.8h
753
754     bl          x264_satd_16x4_neon
755     add         v0.8h,  v0.8h,  v1.8h
756     add         v1.8h,  v2.8h,  v3.8h
757     add         v30.8h, v30.8h, v0.8h
758     add         v31.8h, v31.8h, v1.8h
759
760     bl          x264_satd_16x4_neon
761     add         v0.8h,  v0.8h,  v1.8h
762     add         v1.8h,  v2.8h,  v3.8h
763     add         v30.8h, v30.8h, v0.8h
764     add         v31.8h, v31.8h, v1.8h
765
766     bl          x264_satd_16x4_neon
767     add         v0.8h,  v0.8h,  v1.8h
768     add         v1.8h,  v2.8h,  v3.8h
769     add         v30.8h, v30.8h, v0.8h
770     add         v31.8h, v31.8h, v1.8h
771
772     add         v0.8h,  v30.8h, v31.8h
773     uaddlv      s0,  v0.8h
774     mov         w0,  v0.s[0]
775     ret         x4
776 endfunc
777
778 function x264_satd_16x4_neon
779     ld1        {v1.16b},  [x2], x3
780     ld1        {v0.16b},  [x0], x1
781     ld1        {v3.16b},  [x2], x3
782     ld1        {v2.16b},  [x0], x1
783     usubl       v16.8h, v0.8b,  v1.8b
784     usubl2      v20.8h, v0.16b, v1.16b
785     ld1        {v5.16b},  [x2], x3
786     ld1        {v4.16b},  [x0], x1
787     usubl       v17.8h, v2.8b,  v3.8b
788     usubl2      v21.8h, v2.16b, v3.16b
789     ld1        {v7.16b},  [x2], x3
790     ld1        {v6.16b},  [x0], x1
791
792     usubl       v18.8h, v4.8b,  v5.8b
793     usubl2      v22.8h, v4.16b, v5.16b
794     usubl       v19.8h, v6.8b,  v7.8b
795     usubl2      v23.8h, v6.16b, v7.16b
796
797     SUMSUB_AB   v0.8h,  v1.8h,  v16.8h, v17.8h
798     SUMSUB_AB   v2.8h,  v3.8h,  v18.8h, v19.8h
799
800     b           x264_satd_8x4v_8x8h_neon
801 endfunc
802
803
804 function x264_pixel_sa8d_8x8_neon, export=1
805     mov         x4,  x30
806     bl          x264_sa8d_8x8_neon
807     add         v0.8h,  v0.8h,  v1.8h
808     uaddlv      s0,  v0.8h
809     mov         w0,  v0.s[0]
810     add         w0,  w0,  #1
811     lsr         w0,  w0,  #1
812     ret         x4
813 endfunc
814
815 function x264_pixel_sa8d_16x16_neon, export=1
816     mov         x4,  x30
817     bl          x264_sa8d_8x8_neon
818     uaddlp      v30.4s, v0.8h
819     uaddlp      v31.4s, v1.8h
820     bl          x264_sa8d_8x8_neon
821     uadalp      v30.4s, v0.8h
822     uadalp      v31.4s, v1.8h
823     sub         x0,  x0,  x1,  lsl #4
824     sub         x2,  x2,  x3,  lsl #4
825     add         x0,  x0,  #8
826     add         x2,  x2,  #8
827     bl          x264_sa8d_8x8_neon
828     uadalp      v30.4s, v0.8h
829     uadalp      v31.4s, v1.8h
830     bl          x264_sa8d_8x8_neon
831     uadalp      v30.4s, v0.8h
832     uadalp      v31.4s, v1.8h
833     add         v0.4s,  v30.4s, v31.4s
834     addv        s0,  v0.4s
835     mov         w0,  v0.s[0]
836     add         w0,  w0,  #1
837     lsr         w0,  w0,  #1
838     ret         x4
839 endfunc
840
841 function x264_sa8d_8x8_neon
842     load_diff_fly_8x8
843
844     SUMSUB_AB   v16.8h, v18.8h, v0.8h,  v2.8h
845     SUMSUB_AB   v17.8h, v19.8h, v1.8h,  v3.8h
846
847     HADAMARD4_V v20.8h, v21.8h, v22.8h, v23.8h, v0.8h,  v1.8h, v2.8h, v3.8h
848     SUMSUB_AB   v0.8h,  v16.8h, v16.8h, v20.8h
849     SUMSUB_AB   v1.8h,  v17.8h, v17.8h, v21.8h
850     SUMSUB_AB   v2.8h,  v18.8h, v18.8h, v22.8h
851     SUMSUB_AB   v3.8h,  v19.8h, v19.8h, v23.8h
852
853     transpose   v20.8h, v21.8h, v16.8h, v17.8h
854     transpose   v4.8h,  v5.8h,  v0.8h,  v1.8h
855     transpose   v22.8h, v23.8h, v18.8h, v19.8h
856     transpose   v6.8h,  v7.8h,  v2.8h,  v3.8h
857
858     SUMSUB_AB   v28.8h, v29.8h, v20.8h, v21.8h
859     SUMSUB_AB   v24.8h, v25.8h, v4.8h,  v5.8h
860     SUMSUB_AB   v0.8h,  v1.8h,  v22.8h, v23.8h
861     SUMSUB_AB   v26.8h, v27.8h, v6.8h,  v7.8h
862
863     transpose   v20.4s, v22.4s, v28.4s, v0.4s
864     transpose   v21.4s, v23.4s, v29.4s, v1.4s
865     transpose   v16.4s, v18.4s, v24.4s, v26.4s
866     transpose   v17.4s, v19.4s, v25.4s, v27.4s
867
868     SUMSUB_AB   v0.8h,  v2.8h,  v20.8h, v22.8h
869     SUMSUB_AB   v1.8h,  v3.8h,  v21.8h, v23.8h
870     SUMSUB_AB   v4.8h,  v6.8h, v16.8h, v18.8h
871     SUMSUB_AB   v5.8h,  v7.8h, v17.8h, v19.8h
872
873     transpose   v16.2d, v20.2d,  v0.2d,  v4.2d
874     transpose   v17.2d, v21.2d,  v1.2d,  v5.2d
875     transpose   v18.2d, v22.2d,  v2.2d,  v6.2d
876     transpose   v19.2d, v23.2d,  v3.2d,  v7.2d
877
878     abs         v16.8h, v16.8h
879     abs         v20.8h, v20.8h
880     abs         v17.8h, v17.8h
881     abs         v21.8h, v21.8h
882     abs         v18.8h, v18.8h
883     abs         v22.8h, v22.8h
884     abs         v19.8h, v19.8h
885     abs         v23.8h, v23.8h
886
887     umax        v16.8h, v16.8h, v20.8h
888     umax        v17.8h, v17.8h, v21.8h
889     umax        v18.8h, v18.8h, v22.8h
890     umax        v19.8h, v19.8h, v23.8h
891
892     add         v0.8h,  v16.8h, v17.8h
893     add         v1.8h,  v18.8h, v19.8h
894
895     ret
896 endfunc
897
898
899 .macro HADAMARD_AC w h
900 function x264_pixel_hadamard_ac_\w\()x\h\()_neon, export=1
901     movrel      x5, mask_ac_4_8
902     mov         x4,  x30
903     ld1         {v30.8h,v31.8h}, [x5]
904     movi        v28.16b, #0
905     movi        v29.16b, #0
906
907     bl          x264_hadamard_ac_8x8_neon
908 .if \h > 8
909     bl          x264_hadamard_ac_8x8_neon
910 .endif
911 .if \w > 8
912     sub         x0,  x0,  x1,  lsl #3
913     add         x0,  x0,  #8
914     bl          x264_hadamard_ac_8x8_neon
915 .endif
916 .if \w * \h == 256
917     sub         x0,  x0,  x1,  lsl #4
918     bl          x264_hadamard_ac_8x8_neon
919 .endif
920
921     addv        s1,  v29.4s
922     addv        s0,  v28.4s
923     mov         w1,  v1.s[0]
924     mov         w0,  v0.s[0]
925     lsr         w1,  w1,  #2
926     lsr         w0,  w0,  #1
927     orr         x0,  x0,  x1, lsl #32
928     ret         x4
929 endfunc
930 .endm
931
932 HADAMARD_AC  8, 8
933 HADAMARD_AC  8, 16
934 HADAMARD_AC 16, 8
935 HADAMARD_AC 16, 16
936
937 // v28: satd  v29: sa8d  v30: mask_ac4  v31: mask_ac8
938 function x264_hadamard_ac_8x8_neon
939     ld1         {v16.8b}, [x0], x1
940     ld1         {v17.8b}, [x0], x1
941     ld1         {v18.8b}, [x0], x1
942     ld1         {v19.8b}, [x0], x1
943     SUMSUBL_AB  v0.8h,  v1.8h, v16.8b, v17.8b
944     ld1         {v20.8b}, [x0], x1
945     ld1         {v21.8b}, [x0], x1
946     SUMSUBL_AB  v2.8h,  v3.8h, v18.8b, v19.8b
947     ld1         {v22.8b}, [x0], x1
948     ld1         {v23.8b}, [x0], x1
949     SUMSUBL_AB  v4.8h,  v5.8h, v20.8b, v21.8b
950     SUMSUBL_AB  v6.8h,  v7.8h, v22.8b, v23.8b
951
952     SUMSUB_ABCD v16.8h, v18.8h, v17.8h, v19.8h, v0.8h,  v2.8h,  v1.8h,  v3.8h
953     SUMSUB_ABCD v20.8h, v22.8h, v21.8h, v23.8h, v4.8h,  v6.8h,  v5.8h,  v7.8h
954
955     transpose   v0.8h,  v1.8h,  v16.8h,  v17.8h
956     transpose   v2.8h,  v3.8h,  v18.8h,  v19.8h
957     transpose   v4.8h,  v5.8h,  v20.8h,  v21.8h
958     transpose   v6.8h,  v7.8h,  v22.8h,  v23.8h
959
960     SUMSUB_AB   v16.8h, v17.8h, v0.8h,  v1.8h
961     SUMSUB_AB   v18.8h, v19.8h, v2.8h,  v3.8h
962     SUMSUB_AB   v20.8h, v21.8h, v4.8h,  v5.8h
963     SUMSUB_AB   v22.8h, v23.8h, v6.8h,  v7.8h
964
965     transpose   v0.4s,  v2.4s,  v16.4s, v18.4s
966     transpose   v1.4s,  v3.4s,  v17.4s, v19.4s
967     transpose   v4.4s,  v6.4s,  v20.4s, v22.4s
968     transpose   v5.4s,  v7.4s,  v21.4s, v23.4s
969
970     SUMSUB_AB   v16.8h, v18.8h, v0.8h,  v2.8h
971     SUMSUB_AB   v17.8h, v19.8h, v1.8h,  v3.8h
972     SUMSUB_ABCD v20.8h, v22.8h, v21.8h, v23.8h, v4.8h,  v6.8h,  v5.8h,  v7.8h
973
974     abs         v0.8h,  v16.8h
975     abs         v4.8h,  v20.8h
976     abs         v1.8h,  v17.8h
977     abs         v5.8h,  v21.8h
978     abs         v2.8h,  v18.8h
979     abs         v6.8h,  v22.8h
980     abs         v3.8h,  v19.8h
981     abs         v7.8h,  v23.8h
982
983     add         v0.8h,  v0.8h,  v4.8h
984     add         v1.8h,  v1.8h,  v5.8h
985     and         v0.16b, v0.16b, v30.16b
986     add         v2.8h,  v2.8h,  v6.8h
987     add         v3.8h,  v3.8h,  v7.8h
988     add         v0.8h,  v0.8h,  v2.8h
989     add         v1.8h,  v1.8h,  v3.8h
990     uadalp      v28.4s, v0.8h
991     uadalp      v28.4s, v1.8h
992
993     SUMSUB_AB   v6.8h,  v7.8h,  v23.8h, v19.8h
994     SUMSUB_AB   v4.8h,  v5.8h,  v22.8h, v18.8h
995     SUMSUB_AB   v2.8h,  v3.8h,  v21.8h, v17.8h
996     SUMSUB_AB   v1.8h,  v0.8h,  v16.8h,  v20.8h
997
998     transpose   v16.2d, v17.2d,  v6.2d,  v7.2d
999     transpose   v18.2d, v19.2d,  v4.2d,  v5.2d
1000     transpose   v20.2d, v21.2d,  v2.2d,  v3.2d
1001
1002     abs         v16.8h,  v16.8h
1003     abs         v17.8h,  v17.8h
1004     abs         v18.8h,  v18.8h
1005     abs         v19.8h,  v19.8h
1006     abs         v20.8h,  v20.8h
1007     abs         v21.8h,  v21.8h
1008
1009     transpose   v7.2d,  v6.2d,  v1.2d,  v0.2d
1010
1011     umax        v3.8h,  v16.8h,  v17.8h
1012     umax        v2.8h,  v18.8h,  v19.8h
1013     umax        v1.8h,  v20.8h,  v21.8h
1014
1015     SUMSUB_AB   v4.8h,  v5.8h,  v7.8h,  v6.8h
1016
1017     add         v2.8h,  v2.8h,  v3.8h
1018     add         v2.8h,  v2.8h,  v1.8h
1019     and         v4.16b, v4.16b, v31.16b
1020     add         v2.8h,  v2.8h,  v2.8h
1021     abs         v5.8h,  v5.8h
1022     abs         v4.8h,  v4.8h
1023     add         v2.8h,  v2.8h,  v5.8h
1024     add         v2.8h,  v2.8h,  v4.8h
1025     uadalp      v29.4s, v2.8h
1026     ret
1027 endfunc
1028
1029
1030 function x264_pixel_ssim_4x4x2_core_neon, export=1
1031     ld1        {v0.8b},  [x0], x1
1032     ld1        {v2.8b},  [x2], x3
1033     umull       v16.8h, v0.8b,  v0.8b
1034     umull       v17.8h, v0.8b,  v2.8b
1035     umull       v18.8h, v2.8b,  v2.8b
1036
1037     ld1        {v28.8b}, [x0], x1
1038     ld1        {v29.8b}, [x2], x3
1039     umull       v20.8h, v28.8b, v28.8b
1040     umull       v21.8h, v28.8b, v29.8b
1041     umull       v22.8h, v29.8b, v29.8b
1042
1043     uaddlp      v16.4s, v16.8h
1044     uaddlp      v17.4s, v17.8h
1045     uaddl       v0.8h,  v0.8b,  v28.8b
1046     uadalp      v16.4s, v18.8h
1047     uaddl       v1.8h,  v2.8b,  v29.8b
1048
1049     ld1        {v26.8b}, [x0], x1
1050     ld1        {v27.8b}, [x2], x3
1051     umull       v23.8h, v26.8b, v26.8b
1052     umull       v24.8h, v26.8b, v27.8b
1053     umull       v25.8h, v27.8b, v27.8b
1054
1055     uadalp      v16.4s, v20.8h
1056     uaddw       v0.8h,  v0.8h,  v26.8b
1057     uadalp      v17.4s, v21.8h
1058     uaddw       v1.8h,  v1.8h,  v27.8b
1059     uadalp      v16.4s, v22.8h
1060
1061     ld1        {v28.8b}, [x0], x1
1062     ld1        {v29.8b}, [x2], x3
1063     umull       v20.8h, v28.8b, v28.8b
1064     umull       v21.8h, v28.8b, v29.8b
1065     umull       v22.8h, v29.8b, v29.8b
1066
1067     uadalp      v16.4s, v23.8h
1068     uaddw       v0.8h,  v0.8h,  v28.8b
1069     uadalp      v17.4s, v24.8h
1070     uaddw       v1.8h,  v1.8h,  v29.8b
1071     uadalp      v16.4s, v25.8h
1072
1073     uadalp      v16.4s, v20.8h
1074     uadalp      v17.4s, v21.8h
1075     uadalp      v16.4s, v22.8h
1076
1077     uaddlp      v0.4s,  v0.8h
1078     uaddlp      v1.4s,  v1.8h
1079
1080     addp        v0.4s,  v0.4s,  v0.4s
1081     addp        v1.4s,  v1.4s,  v1.4s
1082     addp        v2.4s,  v16.4s, v16.4s
1083     addp        v3.4s,  v17.4s, v17.4s
1084
1085     st4        {v0.2s,v1.2s,v2.2s,v3.2s}, [x4]
1086     ret
1087 endfunc
1088
1089 function x264_pixel_ssim_end4_neon, export=1
1090     mov         x5,  #4
1091     ld1        {v16.4s,v17.4s}, [x0], #32
1092     ld1        {v18.4s,v19.4s}, [x1], #32
1093     mov         w4,  #0x99bb
1094     subs        x2,  x5,  w2, uxtw
1095     mov         w3,  #416                       // ssim_c1 = .01*.01*255*255*64
1096     movk        w4,  #0x03, lsl #16             // ssim_c2 = .03*.03*255*255*64*63
1097     add         v0.4s,  v16.4s,  v18.4s
1098     add         v1.4s,  v17.4s,  v19.4s
1099     add         v0.4s,  v0.4s,  v1.4s
1100     ld1        {v20.4s,v21.4s}, [x0], #32
1101     ld1        {v22.4s,v23.4s}, [x1], #32
1102     add         v2.4s,  v20.4s, v22.4s
1103     add         v3.4s,  v21.4s, v23.4s
1104     add         v1.4s,  v1.4s,  v2.4s
1105     ld1        {v16.4s}, [x0], #16
1106     ld1        {v18.4s}, [x1], #16
1107     add         v16.4s, v16.4s, v18.4s
1108     add         v2.4s,  v2.4s,  v3.4s
1109     add         v3.4s,  v3.4s,  v16.4s
1110
1111     dup         v30.4s, w3
1112     dup         v31.4s, w4
1113
1114     transpose   v4.4s,  v5.4s,  v0.4s,  v1.4s
1115     transpose   v6.4s,  v7.4s,  v2.4s,  v3.4s
1116     transpose   v0.2d,  v2.2d,  v4.2d,  v6.2d
1117     transpose   v1.2d,  v3.2d,  v5.2d,  v7.2d
1118
1119     mul         v16.4s, v0.4s, v1.4s    // s1*s2
1120     mul         v0.4s,  v0.4s, v0.4s
1121     mla         v0.4s,  v1.4s, v1.4s    // s1*s1 + s2*s2
1122
1123     shl         v3.4s,  v3.4s,  #7
1124     shl         v2.4s,  v2.4s,  #6
1125     add         v1.4s,  v16.4s, v16.4s
1126
1127     sub         v2.4s,  v2.4s,  v0.4s    // vars
1128     sub         v3.4s,  v3.4s,  v1.4s    // covar*2
1129     add         v0.4s,  v0.4s,  v30.4s
1130     add         v2.4s,  v2.4s,  v31.4s
1131     add         v1.4s,  v1.4s,  v30.4s
1132     add         v3.4s,  v3.4s,  v31.4s
1133
1134     scvtf       v0.4s,  v0.4s
1135     scvtf       v2.4s,  v2.4s
1136     scvtf       v1.4s,  v1.4s
1137     scvtf       v3.4s,  v3.4s
1138
1139     fmul        v0.4s,  v0.4s,  v2.4s
1140     fmul        v1.4s,  v1.4s,  v3.4s
1141
1142     fdiv        v0.4s,  v1.4s,  v0.4s
1143
1144     b.eq        1f
1145     movrel      x3,  mask
1146     add         x3,  x3,  x2,  lsl #2
1147     ld1        {v29.4s}, [x3]
1148     and         v0.16b, v0.16b, v29.16b
1149 1:
1150     faddp       v0.4s,  v0.4s,  v0.4s
1151     faddp       s0,  v0.2s
1152     ret
1153 endfunc