Upstream version 10.38.222.0
[platform/framework/web/crosswalk.git] / src / third_party / libvpx / source / libvpx / vp8 / common / arm / neon / vp8_subpixelvariance16x16s_neon.asm
1 ;
2 ;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 ;
4 ;  Use of this source code is governed by a BSD-style license
5 ;  that can be found in the LICENSE file in the root of the source
6 ;  tree. An additional intellectual property rights grant can be found
7 ;  in the file PATENTS.  All contributing project authors may
8 ;  be found in the AUTHORS file in the root of the source tree.
9 ;
10
11
12     EXPORT  |vp8_variance_halfpixvar16x16_h_neon|
13     EXPORT  |vp8_variance_halfpixvar16x16_v_neon|
14     EXPORT  |vp8_variance_halfpixvar16x16_hv_neon|
15     EXPORT  |vp8_sub_pixel_variance16x16s_neon|
16     ARM
17     REQUIRE8
18     PRESERVE8
19
20     AREA ||.text||, CODE, READONLY, ALIGN=2
21
22 ;================================================
23 ;unsigned int vp8_variance_halfpixvar16x16_h_neon
24 ;(
25 ;    unsigned char  *src_ptr, r0
26 ;    int  src_pixels_per_line,  r1
27 ;    unsigned char *dst_ptr,  r2
28 ;    int dst_pixels_per_line,   r3
29 ;    unsigned int *sse
30 ;);
31 ;================================================
32 |vp8_variance_halfpixvar16x16_h_neon| PROC
33     push            {lr}
34     vpush           {d8-d15}
35
36     mov             r12, #4                  ;loop counter
37     ldr             lr, [sp, #68]            ;load *sse from stack
38     vmov.i8         q8, #0                      ;q8 - sum
39     vmov.i8         q9, #0                      ;q9, q10 - sse
40     vmov.i8         q10, #0
41
42 ;First Pass: output_height lines x output_width columns (16x16)
43 vp8_filt_fpo16x16s_4_0_loop_neon
44     vld1.u8         {d0, d1, d2, d3}, [r0], r1      ;load src data
45     vld1.8          {q11}, [r2], r3
46     vld1.u8         {d4, d5, d6, d7}, [r0], r1
47     vld1.8          {q12}, [r2], r3
48     vld1.u8         {d8, d9, d10, d11}, [r0], r1
49     vld1.8          {q13}, [r2], r3
50     vld1.u8         {d12, d13, d14, d15}, [r0], r1
51
52     ;pld                [r0]
53     ;pld                [r0, r1]
54     ;pld                [r0, r1, lsl #1]
55
56     vext.8          q1, q0, q1, #1          ;construct src_ptr[1]
57     vext.8          q3, q2, q3, #1
58     vext.8          q5, q4, q5, #1
59     vext.8          q7, q6, q7, #1
60
61     vrhadd.u8       q0, q0, q1              ;(src_ptr[0]+src_ptr[1])/round/shift right 1
62     vld1.8          {q14}, [r2], r3
63     vrhadd.u8       q1, q2, q3
64     vrhadd.u8       q2, q4, q5
65     vrhadd.u8       q3, q6, q7
66
67     vsubl.u8        q4, d0, d22                 ;diff
68     vsubl.u8        q5, d1, d23
69     vsubl.u8        q6, d2, d24
70     vsubl.u8        q7, d3, d25
71     vsubl.u8        q0, d4, d26
72     vsubl.u8        q1, d5, d27
73     vsubl.u8        q2, d6, d28
74     vsubl.u8        q3, d7, d29
75
76     vpadal.s16      q8, q4                     ;sum
77     vmlal.s16       q9, d8, d8                ;sse
78     vmlal.s16       q10, d9, d9
79
80     subs            r12, r12, #1
81
82     vpadal.s16      q8, q5
83     vmlal.s16       q9, d10, d10
84     vmlal.s16       q10, d11, d11
85     vpadal.s16      q8, q6
86     vmlal.s16       q9, d12, d12
87     vmlal.s16       q10, d13, d13
88     vpadal.s16      q8, q7
89     vmlal.s16       q9, d14, d14
90     vmlal.s16       q10, d15, d15
91
92     vpadal.s16      q8, q0                     ;sum
93     vmlal.s16       q9, d0, d0                ;sse
94     vmlal.s16       q10, d1, d1
95     vpadal.s16      q8, q1
96     vmlal.s16       q9, d2, d2
97     vmlal.s16       q10, d3, d3
98     vpadal.s16      q8, q2
99     vmlal.s16       q9, d4, d4
100     vmlal.s16       q10, d5, d5
101     vpadal.s16      q8, q3
102     vmlal.s16       q9, d6, d6
103     vmlal.s16       q10, d7, d7
104
105     bne             vp8_filt_fpo16x16s_4_0_loop_neon
106
107     vadd.u32        q10, q9, q10                ;accumulate sse
108     vpaddl.s32      q0, q8                      ;accumulate sum
109
110     vpaddl.u32      q1, q10
111     vadd.s64        d0, d0, d1
112     vadd.u64        d1, d2, d3
113
114     vmull.s32       q5, d0, d0
115     vst1.32         {d1[0]}, [lr]               ;store sse
116     vshr.u32        d10, d10, #8
117     vsub.u32        d0, d1, d10
118
119     vmov.32         r0, d0[0]                   ;return
120
121     vpop            {d8-d15}
122     pop             {pc}
123     ENDP
124
125 ;================================================
126 ;unsigned int vp8_variance_halfpixvar16x16_v_neon
127 ;(
128 ;    unsigned char  *src_ptr, r0
129 ;    int  src_pixels_per_line,  r1
130 ;    unsigned char *dst_ptr,  r2
131 ;    int dst_pixels_per_line,   r3
132 ;    unsigned int *sse
133 ;);
134 ;================================================
135 |vp8_variance_halfpixvar16x16_v_neon| PROC
136     push            {lr}
137     vpush           {d8-d15}
138
139     mov             r12, #4                     ;loop counter
140
141     vld1.u8         {q0}, [r0], r1              ;load src data
142     ldr             lr, [sp, #68]               ;load *sse from stack
143
144     vmov.i8         q8, #0                      ;q8 - sum
145     vmov.i8         q9, #0                      ;q9, q10 - sse
146     vmov.i8         q10, #0
147
148 vp8_filt_spo16x16s_0_4_loop_neon
149     vld1.u8         {q2}, [r0], r1
150     vld1.8          {q1}, [r2], r3
151     vld1.u8         {q4}, [r0], r1
152     vld1.8          {q3}, [r2], r3
153     vld1.u8         {q6}, [r0], r1
154     vld1.8          {q5}, [r2], r3
155     vld1.u8         {q15}, [r0], r1
156
157     vrhadd.u8       q0, q0, q2
158     vld1.8          {q7}, [r2], r3
159     vrhadd.u8       q2, q2, q4
160     vrhadd.u8       q4, q4, q6
161     vrhadd.u8       q6, q6, q15
162
163     vsubl.u8        q11, d0, d2                 ;diff
164     vsubl.u8        q12, d1, d3
165     vsubl.u8        q13, d4, d6
166     vsubl.u8        q14, d5, d7
167     vsubl.u8        q0, d8, d10
168     vsubl.u8        q1, d9, d11
169     vsubl.u8        q2, d12, d14
170     vsubl.u8        q3, d13, d15
171
172     vpadal.s16      q8, q11                     ;sum
173     vmlal.s16       q9, d22, d22                ;sse
174     vmlal.s16       q10, d23, d23
175
176     subs            r12, r12, #1
177
178     vpadal.s16      q8, q12
179     vmlal.s16       q9, d24, d24
180     vmlal.s16       q10, d25, d25
181     vpadal.s16      q8, q13
182     vmlal.s16       q9, d26, d26
183     vmlal.s16       q10, d27, d27
184     vpadal.s16      q8, q14
185     vmlal.s16       q9, d28, d28
186     vmlal.s16       q10, d29, d29
187
188     vpadal.s16      q8, q0                     ;sum
189     vmlal.s16       q9, d0, d0                 ;sse
190     vmlal.s16       q10, d1, d1
191     vpadal.s16      q8, q1
192     vmlal.s16       q9, d2, d2
193     vmlal.s16       q10, d3, d3
194     vpadal.s16      q8, q2
195     vmlal.s16       q9, d4, d4
196     vmlal.s16       q10, d5, d5
197
198     vmov            q0, q15
199
200     vpadal.s16      q8, q3
201     vmlal.s16       q9, d6, d6
202     vmlal.s16       q10, d7, d7
203
204     bne             vp8_filt_spo16x16s_0_4_loop_neon
205
206     vadd.u32        q10, q9, q10                ;accumulate sse
207     vpaddl.s32      q0, q8                      ;accumulate sum
208
209     vpaddl.u32      q1, q10
210     vadd.s64        d0, d0, d1
211     vadd.u64        d1, d2, d3
212
213     vmull.s32       q5, d0, d0
214     vst1.32         {d1[0]}, [lr]               ;store sse
215     vshr.u32        d10, d10, #8
216     vsub.u32        d0, d1, d10
217
218     vmov.32         r0, d0[0]                   ;return
219
220     vpop            {d8-d15}
221     pop             {pc}
222     ENDP
223
224 ;================================================
225 ;unsigned int vp8_variance_halfpixvar16x16_hv_neon
226 ;(
227 ;    unsigned char  *src_ptr, r0
228 ;    int  src_pixels_per_line,  r1
229 ;    unsigned char *dst_ptr,  r2
230 ;    int dst_pixels_per_line,   r3
231 ;    unsigned int *sse
232 ;);
233 ;================================================
234 |vp8_variance_halfpixvar16x16_hv_neon| PROC
235     push            {lr}
236     vpush           {d8-d15}
237
238     vld1.u8         {d0, d1, d2, d3}, [r0], r1      ;load src data
239
240     ldr             lr, [sp, #68]           ;load *sse from stack
241     vmov.i8         q13, #0                      ;q8 - sum
242     vext.8          q1, q0, q1, #1          ;construct src_ptr[1]
243
244     vmov.i8         q14, #0                      ;q9, q10 - sse
245     vmov.i8         q15, #0
246
247     mov             r12, #4                  ;loop counter
248     vrhadd.u8       q0, q0, q1              ;(src_ptr[0]+src_ptr[1])/round/shift right 1
249
250 ;First Pass: output_height lines x output_width columns (17x16)
251 vp8_filt16x16s_4_4_loop_neon
252     vld1.u8         {d4, d5, d6, d7}, [r0], r1
253     vld1.u8         {d8, d9, d10, d11}, [r0], r1
254     vld1.u8         {d12, d13, d14, d15}, [r0], r1
255     vld1.u8         {d16, d17, d18, d19}, [r0], r1
256
257     ;pld                [r0]
258     ;pld                [r0, r1]
259     ;pld                [r0, r1, lsl #1]
260
261     vext.8          q3, q2, q3, #1          ;construct src_ptr[1]
262     vext.8          q5, q4, q5, #1
263     vext.8          q7, q6, q7, #1
264     vext.8          q9, q8, q9, #1
265
266     vrhadd.u8       q1, q2, q3              ;(src_ptr[0]+src_ptr[1])/round/shift right 1
267     vrhadd.u8       q2, q4, q5
268     vrhadd.u8       q3, q6, q7
269     vrhadd.u8       q4, q8, q9
270
271     vld1.8          {q5}, [r2], r3
272     vrhadd.u8       q0, q0, q1
273     vld1.8          {q6}, [r2], r3
274     vrhadd.u8       q1, q1, q2
275     vld1.8          {q7}, [r2], r3
276     vrhadd.u8       q2, q2, q3
277     vld1.8          {q8}, [r2], r3
278     vrhadd.u8       q3, q3, q4
279
280     vsubl.u8        q9, d0, d10                 ;diff
281     vsubl.u8        q10, d1, d11
282     vsubl.u8        q11, d2, d12
283     vsubl.u8        q12, d3, d13
284
285     vsubl.u8        q0, d4, d14                 ;diff
286     vsubl.u8        q1, d5, d15
287     vsubl.u8        q5, d6, d16
288     vsubl.u8        q6, d7, d17
289
290     vpadal.s16      q13, q9                     ;sum
291     vmlal.s16       q14, d18, d18                ;sse
292     vmlal.s16       q15, d19, d19
293
294     vpadal.s16      q13, q10                     ;sum
295     vmlal.s16       q14, d20, d20                ;sse
296     vmlal.s16       q15, d21, d21
297
298     vpadal.s16      q13, q11                     ;sum
299     vmlal.s16       q14, d22, d22                ;sse
300     vmlal.s16       q15, d23, d23
301
302     vpadal.s16      q13, q12                     ;sum
303     vmlal.s16       q14, d24, d24                ;sse
304     vmlal.s16       q15, d25, d25
305
306     subs            r12, r12, #1
307
308     vpadal.s16      q13, q0                     ;sum
309     vmlal.s16       q14, d0, d0                ;sse
310     vmlal.s16       q15, d1, d1
311
312     vpadal.s16      q13, q1                     ;sum
313     vmlal.s16       q14, d2, d2                ;sse
314     vmlal.s16       q15, d3, d3
315
316     vpadal.s16      q13, q5                     ;sum
317     vmlal.s16       q14, d10, d10                ;sse
318     vmlal.s16       q15, d11, d11
319
320     vmov            q0, q4
321
322     vpadal.s16      q13, q6                     ;sum
323     vmlal.s16       q14, d12, d12                ;sse
324     vmlal.s16       q15, d13, d13
325
326     bne             vp8_filt16x16s_4_4_loop_neon
327
328     vadd.u32        q15, q14, q15                ;accumulate sse
329     vpaddl.s32      q0, q13                      ;accumulate sum
330
331     vpaddl.u32      q1, q15
332     vadd.s64        d0, d0, d1
333     vadd.u64        d1, d2, d3
334
335     vmull.s32       q5, d0, d0
336     vst1.32         {d1[0]}, [lr]               ;store sse
337     vshr.u32        d10, d10, #8
338     vsub.u32        d0, d1, d10
339
340     vmov.32         r0, d0[0]                   ;return
341
342     vpop            {d8-d15}
343     pop             {pc}
344     ENDP
345
346 ;==============================
347 ; r0    unsigned char  *src_ptr,
348 ; r1    int  src_pixels_per_line,
349 ; r2    int  xoffset,
350 ; r3    int  yoffset,
351 ; stack unsigned char *dst_ptr,
352 ; stack int dst_pixels_per_line,
353 ; stack unsigned int *sse
354 ;note: in vp8_find_best_half_pixel_step()(called when 8<Speed<15), and first call of vp8_find_best_sub_pixel_step()
355 ;(called when speed<=8). xoffset/yoffset can only be 4 or 0, which means either by pass the filter,
356 ;or filter coeff is {64, 64}. This simplified program only works in this situation.
357 ;note: It happens that both xoffset and yoffset are zero. This can be handled in c code later.
358
359 |vp8_sub_pixel_variance16x16s_neon| PROC
360     push            {r4, lr}
361     vpush           {d8-d15}
362
363     ldr             r4, [sp, #72]           ;load *dst_ptr from stack
364     ldr             r12, [sp, #76]          ;load dst_pixels_per_line from stack
365     ldr             lr, [sp, #80]           ;load *sse from stack
366
367     cmp             r2, #0                  ;skip first_pass filter if xoffset=0
368     beq             secondpass_bfilter16x16s_only
369
370     cmp             r3, #0                  ;skip second_pass filter if yoffset=0
371     beq             firstpass_bfilter16x16s_only
372
373     vld1.u8         {d0, d1, d2, d3}, [r0], r1      ;load src data
374     sub             sp, sp, #256            ;reserve space on stack for temporary storage
375     vext.8          q1, q0, q1, #1          ;construct src_ptr[1]
376     mov             r3, sp
377     mov             r2, #4                  ;loop counter
378     vrhadd.u8       q0, q0, q1              ;(src_ptr[0]+src_ptr[1])/round/shift right 1
379
380 ;First Pass: output_height lines x output_width columns (17x16)
381 vp8e_filt_blk2d_fp16x16s_loop_neon
382     vld1.u8         {d4, d5, d6, d7}, [r0], r1
383     vld1.u8         {d8, d9, d10, d11}, [r0], r1
384     vld1.u8         {d12, d13, d14, d15}, [r0], r1
385     vld1.u8         {d16, d17, d18, d19}, [r0], r1
386
387     ;pld                [r0]
388     ;pld                [r0, r1]
389     ;pld                [r0, r1, lsl #1]
390
391     vext.8          q3, q2, q3, #1          ;construct src_ptr[1]
392     vext.8          q5, q4, q5, #1
393     vext.8          q7, q6, q7, #1
394     vext.8          q9, q8, q9, #1
395
396     vrhadd.u8       q1, q2, q3              ;(src_ptr[0]+src_ptr[1])/round/shift right 1
397     vrhadd.u8       q2, q4, q5
398     vrhadd.u8       q3, q6, q7
399     vrhadd.u8       q4, q8, q9
400
401     vrhadd.u8       q0, q0, q1
402     vrhadd.u8       q1, q1, q2
403     vrhadd.u8       q2, q2, q3
404     vrhadd.u8       q3, q3, q4
405
406     subs            r2, r2, #1
407     vst1.u8         {d0, d1 ,d2, d3}, [r3]!         ;store result
408     vmov            q0, q4
409     vst1.u8         {d4, d5, d6, d7}, [r3]!
410
411     bne             vp8e_filt_blk2d_fp16x16s_loop_neon
412
413     b               sub_pixel_variance16x16s_neon
414
415 ;--------------------
416 firstpass_bfilter16x16s_only
417     mov             r2, #2                  ;loop counter
418     sub             sp, sp, #256            ;reserve space on stack for temporary storage
419     mov             r3, sp
420
421 ;First Pass: output_height lines x output_width columns (16x16)
422 vp8e_filt_blk2d_fpo16x16s_loop_neon
423     vld1.u8         {d0, d1, d2, d3}, [r0], r1      ;load src data
424     vld1.u8         {d4, d5, d6, d7}, [r0], r1
425     vld1.u8         {d8, d9, d10, d11}, [r0], r1
426     vld1.u8         {d12, d13, d14, d15}, [r0], r1
427
428     ;pld                [r0]
429     ;pld                [r0, r1]
430     ;pld                [r0, r1, lsl #1]
431
432     vext.8          q1, q0, q1, #1          ;construct src_ptr[1]
433     vld1.u8         {d16, d17, d18, d19}, [r0], r1
434     vext.8          q3, q2, q3, #1
435     vld1.u8         {d20, d21, d22, d23}, [r0], r1
436     vext.8          q5, q4, q5, #1
437     vld1.u8         {d24, d25, d26, d27}, [r0], r1
438     vext.8          q7, q6, q7, #1
439     vld1.u8         {d28, d29, d30, d31}, [r0], r1
440     vext.8          q9, q8, q9, #1
441     vext.8          q11, q10, q11, #1
442     vext.8          q13, q12, q13, #1
443     vext.8          q15, q14, q15, #1
444
445     vrhadd.u8       q0, q0, q1              ;(src_ptr[0]+src_ptr[1])/round/shift right 1
446     vrhadd.u8       q1, q2, q3
447     vrhadd.u8       q2, q4, q5
448     vrhadd.u8       q3, q6, q7
449     vrhadd.u8       q4, q8, q9
450     vrhadd.u8       q5, q10, q11
451     vrhadd.u8       q6, q12, q13
452     vrhadd.u8       q7, q14, q15
453
454     subs            r2, r2, #1
455
456     vst1.u8         {d0, d1, d2, d3}, [r3]!         ;store result
457     vst1.u8         {d4, d5, d6, d7}, [r3]!
458     vst1.u8         {d8, d9, d10, d11}, [r3]!
459     vst1.u8         {d12, d13, d14, d15}, [r3]!
460
461     bne             vp8e_filt_blk2d_fpo16x16s_loop_neon
462
463     b               sub_pixel_variance16x16s_neon
464
465 ;---------------------
466 secondpass_bfilter16x16s_only
467     sub             sp, sp, #256            ;reserve space on stack for temporary storage
468
469     mov             r2, #2                  ;loop counter
470     vld1.u8         {d0, d1}, [r0], r1      ;load src data
471     mov             r3, sp
472
473 vp8e_filt_blk2d_spo16x16s_loop_neon
474     vld1.u8         {d2, d3}, [r0], r1
475     vld1.u8         {d4, d5}, [r0], r1
476     vld1.u8         {d6, d7}, [r0], r1
477     vld1.u8         {d8, d9}, [r0], r1
478
479     vrhadd.u8       q0, q0, q1
480     vld1.u8         {d10, d11}, [r0], r1
481     vrhadd.u8       q1, q1, q2
482     vld1.u8         {d12, d13}, [r0], r1
483     vrhadd.u8       q2, q2, q3
484     vld1.u8         {d14, d15}, [r0], r1
485     vrhadd.u8       q3, q3, q4
486     vld1.u8         {d16, d17}, [r0], r1
487     vrhadd.u8       q4, q4, q5
488     vrhadd.u8       q5, q5, q6
489     vrhadd.u8       q6, q6, q7
490     vrhadd.u8       q7, q7, q8
491
492     subs            r2, r2, #1
493
494     vst1.u8         {d0, d1, d2, d3}, [r3]!         ;store result
495     vmov            q0, q8
496     vst1.u8         {d4, d5, d6, d7}, [r3]!
497     vst1.u8         {d8, d9, d10, d11}, [r3]!           ;store result
498     vst1.u8         {d12, d13, d14, d15}, [r3]!
499
500     bne             vp8e_filt_blk2d_spo16x16s_loop_neon
501
502     b               sub_pixel_variance16x16s_neon
503
504 ;----------------------------
505 ;variance16x16
506 sub_pixel_variance16x16s_neon
507     vmov.i8         q8, #0                      ;q8 - sum
508     vmov.i8         q9, #0                      ;q9, q10 - sse
509     vmov.i8         q10, #0
510
511     sub             r3, r3, #256
512     mov             r2, #4
513
514 sub_pixel_variance16x16s_neon_loop
515     vld1.8          {q0}, [r3]!                 ;Load up source and reference
516     vld1.8          {q1}, [r4], r12
517     vld1.8          {q2}, [r3]!
518     vld1.8          {q3}, [r4], r12
519     vld1.8          {q4}, [r3]!
520     vld1.8          {q5}, [r4], r12
521     vld1.8          {q6}, [r3]!
522     vld1.8          {q7}, [r4], r12
523
524     vsubl.u8        q11, d0, d2                 ;diff
525     vsubl.u8        q12, d1, d3
526     vsubl.u8        q13, d4, d6
527     vsubl.u8        q14, d5, d7
528     vsubl.u8        q0, d8, d10
529     vsubl.u8        q1, d9, d11
530     vsubl.u8        q2, d12, d14
531     vsubl.u8        q3, d13, d15
532
533     vpadal.s16      q8, q11                     ;sum
534     vmlal.s16       q9, d22, d22                ;sse
535     vmlal.s16       q10, d23, d23
536
537     subs            r2, r2, #1
538
539     vpadal.s16      q8, q12
540     vmlal.s16       q9, d24, d24
541     vmlal.s16       q10, d25, d25
542     vpadal.s16      q8, q13
543     vmlal.s16       q9, d26, d26
544     vmlal.s16       q10, d27, d27
545     vpadal.s16      q8, q14
546     vmlal.s16       q9, d28, d28
547     vmlal.s16       q10, d29, d29
548
549     vpadal.s16      q8, q0                     ;sum
550     vmlal.s16       q9, d0, d0                ;sse
551     vmlal.s16       q10, d1, d1
552     vpadal.s16      q8, q1
553     vmlal.s16       q9, d2, d2
554     vmlal.s16       q10, d3, d3
555     vpadal.s16      q8, q2
556     vmlal.s16       q9, d4, d4
557     vmlal.s16       q10, d5, d5
558     vpadal.s16      q8, q3
559     vmlal.s16       q9, d6, d6
560     vmlal.s16       q10, d7, d7
561
562     bne             sub_pixel_variance16x16s_neon_loop
563
564     vadd.u32        q10, q9, q10                ;accumulate sse
565     vpaddl.s32      q0, q8                      ;accumulate sum
566
567     vpaddl.u32      q1, q10
568     vadd.s64        d0, d0, d1
569     vadd.u64        d1, d2, d3
570
571     vmull.s32       q5, d0, d0
572     vst1.32         {d1[0]}, [lr]               ;store sse
573     vshr.u32        d10, d10, #8
574     vsub.u32        d0, d1, d10
575
576     add             sp, sp, #256
577     vmov.32         r0, d0[0]                   ;return
578
579     vpop            {d8-d15}
580     pop             {r4, pc}
581     ENDP
582
583     END