Thu, 15 Jan 2015 15:59:08 +0100
Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
1 ;
2 ; Copyright (c) 2013 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 ;
11 EXPORT |vp9_mb_lpf_horizontal_edge_w_neon|
12 EXPORT |vp9_mb_lpf_vertical_edge_w_neon|
13 ARM
15 AREA ||.text||, CODE, READONLY, ALIGN=2
17 ; void vp9_mb_lpf_horizontal_edge_w_neon(uint8_t *s, int p,
18 ; const uint8_t *blimit,
19 ; const uint8_t *limit,
20 ; const uint8_t *thresh
21 ; int count)
22 ; r0 uint8_t *s,
23 ; r1 int p, /* pitch */
24 ; r2 const uint8_t *blimit,
25 ; r3 const uint8_t *limit,
26 ; sp const uint8_t *thresh,
27 |vp9_mb_lpf_horizontal_edge_w_neon| PROC
28 push {r4-r8, lr}
29 vpush {d8-d15}
30 ldr r4, [sp, #88] ; load thresh
31 ldr r12, [sp, #92] ; load count
33 h_count
34 vld1.8 {d16[]}, [r2] ; load *blimit
35 vld1.8 {d17[]}, [r3] ; load *limit
36 vld1.8 {d18[]}, [r4] ; load *thresh
38 sub r8, r0, r1, lsl #3 ; move src pointer down by 8 lines
40 vld1.u8 {d0}, [r8@64], r1 ; p7
41 vld1.u8 {d1}, [r8@64], r1 ; p6
42 vld1.u8 {d2}, [r8@64], r1 ; p5
43 vld1.u8 {d3}, [r8@64], r1 ; p4
44 vld1.u8 {d4}, [r8@64], r1 ; p3
45 vld1.u8 {d5}, [r8@64], r1 ; p2
46 vld1.u8 {d6}, [r8@64], r1 ; p1
47 vld1.u8 {d7}, [r8@64], r1 ; p0
48 vld1.u8 {d8}, [r8@64], r1 ; q0
49 vld1.u8 {d9}, [r8@64], r1 ; q1
50 vld1.u8 {d10}, [r8@64], r1 ; q2
51 vld1.u8 {d11}, [r8@64], r1 ; q3
52 vld1.u8 {d12}, [r8@64], r1 ; q4
53 vld1.u8 {d13}, [r8@64], r1 ; q5
54 vld1.u8 {d14}, [r8@64], r1 ; q6
55 vld1.u8 {d15}, [r8@64], r1 ; q7
57 bl vp9_wide_mbfilter_neon
59 tst r7, #1
60 beq h_mbfilter
62 ; flat && mask were not set for any of the channels. Just store the values
63 ; from filter.
64 sub r8, r0, r1, lsl #1
66 vst1.u8 {d25}, [r8@64], r1 ; store op1
67 vst1.u8 {d24}, [r8@64], r1 ; store op0
68 vst1.u8 {d23}, [r8@64], r1 ; store oq0
69 vst1.u8 {d26}, [r8@64], r1 ; store oq1
71 b h_next
73 h_mbfilter
74 tst r7, #2
75 beq h_wide_mbfilter
77 ; flat2 was not set for any of the channels. Just store the values from
78 ; mbfilter.
79 sub r8, r0, r1, lsl #1
80 sub r8, r8, r1
82 vst1.u8 {d18}, [r8@64], r1 ; store op2
83 vst1.u8 {d19}, [r8@64], r1 ; store op1
84 vst1.u8 {d20}, [r8@64], r1 ; store op0
85 vst1.u8 {d21}, [r8@64], r1 ; store oq0
86 vst1.u8 {d22}, [r8@64], r1 ; store oq1
87 vst1.u8 {d23}, [r8@64], r1 ; store oq2
89 b h_next
91 h_wide_mbfilter
92 sub r8, r0, r1, lsl #3
93 add r8, r8, r1
95 vst1.u8 {d16}, [r8@64], r1 ; store op6
96 vst1.u8 {d24}, [r8@64], r1 ; store op5
97 vst1.u8 {d25}, [r8@64], r1 ; store op4
98 vst1.u8 {d26}, [r8@64], r1 ; store op3
99 vst1.u8 {d27}, [r8@64], r1 ; store op2
100 vst1.u8 {d18}, [r8@64], r1 ; store op1
101 vst1.u8 {d19}, [r8@64], r1 ; store op0
102 vst1.u8 {d20}, [r8@64], r1 ; store oq0
103 vst1.u8 {d21}, [r8@64], r1 ; store oq1
104 vst1.u8 {d22}, [r8@64], r1 ; store oq2
105 vst1.u8 {d23}, [r8@64], r1 ; store oq3
106 vst1.u8 {d1}, [r8@64], r1 ; store oq4
107 vst1.u8 {d2}, [r8@64], r1 ; store oq5
108 vst1.u8 {d3}, [r8@64], r1 ; store oq6
110 h_next
111 add r0, r0, #8
112 subs r12, r12, #1
113 bne h_count
115 vpop {d8-d15}
116 pop {r4-r8, pc}
118 ENDP ; |vp9_mb_lpf_horizontal_edge_w_neon|
120 ; void vp9_mb_lpf_vertical_edge_w_neon(uint8_t *s, int p,
121 ; const uint8_t *blimit,
122 ; const uint8_t *limit,
123 ; const uint8_t *thresh)
124 ; r0 uint8_t *s,
125 ; r1 int p, /* pitch */
126 ; r2 const uint8_t *blimit,
127 ; r3 const uint8_t *limit,
128 ; sp const uint8_t *thresh,
129 |vp9_mb_lpf_vertical_edge_w_neon| PROC
130 push {r4-r8, lr}
131 vpush {d8-d15}
132 ldr r4, [sp, #88] ; load thresh
134 vld1.8 {d16[]}, [r2] ; load *blimit
135 vld1.8 {d17[]}, [r3] ; load *limit
136 vld1.8 {d18[]}, [r4] ; load *thresh
138 sub r8, r0, #8
140 vld1.8 {d0}, [r8@64], r1
141 vld1.8 {d8}, [r0@64], r1
142 vld1.8 {d1}, [r8@64], r1
143 vld1.8 {d9}, [r0@64], r1
144 vld1.8 {d2}, [r8@64], r1
145 vld1.8 {d10}, [r0@64], r1
146 vld1.8 {d3}, [r8@64], r1
147 vld1.8 {d11}, [r0@64], r1
148 vld1.8 {d4}, [r8@64], r1
149 vld1.8 {d12}, [r0@64], r1
150 vld1.8 {d5}, [r8@64], r1
151 vld1.8 {d13}, [r0@64], r1
152 vld1.8 {d6}, [r8@64], r1
153 vld1.8 {d14}, [r0@64], r1
154 vld1.8 {d7}, [r8@64], r1
155 vld1.8 {d15}, [r0@64], r1
157 sub r0, r0, r1, lsl #3
159 vtrn.32 q0, q2
160 vtrn.32 q1, q3
161 vtrn.32 q4, q6
162 vtrn.32 q5, q7
164 vtrn.16 q0, q1
165 vtrn.16 q2, q3
166 vtrn.16 q4, q5
167 vtrn.16 q6, q7
169 vtrn.8 d0, d1
170 vtrn.8 d2, d3
171 vtrn.8 d4, d5
172 vtrn.8 d6, d7
174 vtrn.8 d8, d9
175 vtrn.8 d10, d11
176 vtrn.8 d12, d13
177 vtrn.8 d14, d15
179 bl vp9_wide_mbfilter_neon
181 tst r7, #1
182 beq v_mbfilter
184 ; flat && mask were not set for any of the channels. Just store the values
185 ; from filter.
186 sub r8, r0, #2
188 vswp d23, d25
190 vst4.8 {d23[0], d24[0], d25[0], d26[0]}, [r8], r1
191 vst4.8 {d23[1], d24[1], d25[1], d26[1]}, [r8], r1
192 vst4.8 {d23[2], d24[2], d25[2], d26[2]}, [r8], r1
193 vst4.8 {d23[3], d24[3], d25[3], d26[3]}, [r8], r1
194 vst4.8 {d23[4], d24[4], d25[4], d26[4]}, [r8], r1
195 vst4.8 {d23[5], d24[5], d25[5], d26[5]}, [r8], r1
196 vst4.8 {d23[6], d24[6], d25[6], d26[6]}, [r8], r1
197 vst4.8 {d23[7], d24[7], d25[7], d26[7]}, [r8], r1
199 b v_end
201 v_mbfilter
202 tst r7, #2
203 beq v_wide_mbfilter
205 ; flat2 was not set for any of the channels. Just store the values from
206 ; mbfilter.
207 sub r8, r0, #3
209 vst3.8 {d18[0], d19[0], d20[0]}, [r8], r1
210 vst3.8 {d21[0], d22[0], d23[0]}, [r0], r1
211 vst3.8 {d18[1], d19[1], d20[1]}, [r8], r1
212 vst3.8 {d21[1], d22[1], d23[1]}, [r0], r1
213 vst3.8 {d18[2], d19[2], d20[2]}, [r8], r1
214 vst3.8 {d21[2], d22[2], d23[2]}, [r0], r1
215 vst3.8 {d18[3], d19[3], d20[3]}, [r8], r1
216 vst3.8 {d21[3], d22[3], d23[3]}, [r0], r1
217 vst3.8 {d18[4], d19[4], d20[4]}, [r8], r1
218 vst3.8 {d21[4], d22[4], d23[4]}, [r0], r1
219 vst3.8 {d18[5], d19[5], d20[5]}, [r8], r1
220 vst3.8 {d21[5], d22[5], d23[5]}, [r0], r1
221 vst3.8 {d18[6], d19[6], d20[6]}, [r8], r1
222 vst3.8 {d21[6], d22[6], d23[6]}, [r0], r1
223 vst3.8 {d18[7], d19[7], d20[7]}, [r8], r1
224 vst3.8 {d21[7], d22[7], d23[7]}, [r0], r1
226 b v_end
228 v_wide_mbfilter
229 sub r8, r0, #8
231 vtrn.32 d0, d26
232 vtrn.32 d16, d27
233 vtrn.32 d24, d18
234 vtrn.32 d25, d19
236 vtrn.16 d0, d24
237 vtrn.16 d16, d25
238 vtrn.16 d26, d18
239 vtrn.16 d27, d19
241 vtrn.8 d0, d16
242 vtrn.8 d24, d25
243 vtrn.8 d26, d27
244 vtrn.8 d18, d19
246 vtrn.32 d20, d1
247 vtrn.32 d21, d2
248 vtrn.32 d22, d3
249 vtrn.32 d23, d15
251 vtrn.16 d20, d22
252 vtrn.16 d21, d23
253 vtrn.16 d1, d3
254 vtrn.16 d2, d15
256 vtrn.8 d20, d21
257 vtrn.8 d22, d23
258 vtrn.8 d1, d2
259 vtrn.8 d3, d15
261 vst1.8 {d0}, [r8@64], r1
262 vst1.8 {d20}, [r0@64], r1
263 vst1.8 {d16}, [r8@64], r1
264 vst1.8 {d21}, [r0@64], r1
265 vst1.8 {d24}, [r8@64], r1
266 vst1.8 {d22}, [r0@64], r1
267 vst1.8 {d25}, [r8@64], r1
268 vst1.8 {d23}, [r0@64], r1
269 vst1.8 {d26}, [r8@64], r1
270 vst1.8 {d1}, [r0@64], r1
271 vst1.8 {d27}, [r8@64], r1
272 vst1.8 {d2}, [r0@64], r1
273 vst1.8 {d18}, [r8@64], r1
274 vst1.8 {d3}, [r0@64], r1
275 vst1.8 {d19}, [r8@64], r1
276 vst1.8 {d15}, [r0@64], r1
278 v_end
279 vpop {d8-d15}
280 pop {r4-r8, pc}
282 ENDP ; |vp9_mb_lpf_vertical_edge_w_neon|
284 ; void vp9_wide_mbfilter_neon();
285 ; This is a helper function for the loopfilters. The invidual functions do the
286 ; necessary load, transpose (if necessary) and store.
287 ;
288 ; r0-r3 PRESERVE
289 ; d16 blimit
290 ; d17 limit
291 ; d18 thresh
292 ; d0 p7
293 ; d1 p6
294 ; d2 p5
295 ; d3 p4
296 ; d4 p3
297 ; d5 p2
298 ; d6 p1
299 ; d7 p0
300 ; d8 q0
301 ; d9 q1
302 ; d10 q2
303 ; d11 q3
304 ; d12 q4
305 ; d13 q5
306 ; d14 q6
307 ; d15 q7
308 |vp9_wide_mbfilter_neon| PROC
309 mov r7, #0
311 ; filter_mask
312 vabd.u8 d19, d4, d5 ; abs(p3 - p2)
313 vabd.u8 d20, d5, d6 ; abs(p2 - p1)
314 vabd.u8 d21, d6, d7 ; abs(p1 - p0)
315 vabd.u8 d22, d9, d8 ; abs(q1 - q0)
316 vabd.u8 d23, d10, d9 ; abs(q2 - q1)
317 vabd.u8 d24, d11, d10 ; abs(q3 - q2)
319 ; only compare the largest value to limit
320 vmax.u8 d19, d19, d20 ; max(abs(p3 - p2), abs(p2 - p1))
321 vmax.u8 d20, d21, d22 ; max(abs(p1 - p0), abs(q1 - q0))
322 vmax.u8 d23, d23, d24 ; max(abs(q2 - q1), abs(q3 - q2))
323 vmax.u8 d19, d19, d20
325 vabd.u8 d24, d7, d8 ; abs(p0 - q0)
327 vmax.u8 d19, d19, d23
329 vabd.u8 d23, d6, d9 ; a = abs(p1 - q1)
330 vqadd.u8 d24, d24, d24 ; b = abs(p0 - q0) * 2
332 ; abs () > limit
333 vcge.u8 d19, d17, d19
335 ; flatmask4
336 vabd.u8 d25, d7, d5 ; abs(p0 - p2)
337 vabd.u8 d26, d8, d10 ; abs(q0 - q2)
338 vabd.u8 d27, d4, d7 ; abs(p3 - p0)
339 vabd.u8 d28, d11, d8 ; abs(q3 - q0)
341 ; only compare the largest value to thresh
342 vmax.u8 d25, d25, d26 ; max(abs(p0 - p2), abs(q0 - q2))
343 vmax.u8 d26, d27, d28 ; max(abs(p3 - p0), abs(q3 - q0))
344 vmax.u8 d25, d25, d26
345 vmax.u8 d20, d20, d25
347 vshr.u8 d23, d23, #1 ; a = a / 2
348 vqadd.u8 d24, d24, d23 ; a = b + a
350 vmov.u8 d30, #1
351 vcge.u8 d24, d16, d24 ; (a > blimit * 2 + limit) * -1
353 vcge.u8 d20, d30, d20 ; flat
355 vand d19, d19, d24 ; mask
357 ; hevmask
358 vcgt.u8 d21, d21, d18 ; (abs(p1 - p0) > thresh)*-1
359 vcgt.u8 d22, d22, d18 ; (abs(q1 - q0) > thresh)*-1
360 vorr d21, d21, d22 ; hev
362 vand d16, d20, d19 ; flat && mask
363 vmov r5, r6, d16
365 ; flatmask5(1, p7, p6, p5, p4, p0, q0, q4, q5, q6, q7)
366 vabd.u8 d22, d3, d7 ; abs(p4 - p0)
367 vabd.u8 d23, d12, d8 ; abs(q4 - q0)
368 vabd.u8 d24, d7, d2 ; abs(p0 - p5)
369 vabd.u8 d25, d8, d13 ; abs(q0 - q5)
370 vabd.u8 d26, d1, d7 ; abs(p6 - p0)
371 vabd.u8 d27, d14, d8 ; abs(q6 - q0)
372 vabd.u8 d28, d0, d7 ; abs(p7 - p0)
373 vabd.u8 d29, d15, d8 ; abs(q7 - q0)
375 ; only compare the largest value to thresh
376 vmax.u8 d22, d22, d23 ; max(abs(p4 - p0), abs(q4 - q0))
377 vmax.u8 d23, d24, d25 ; max(abs(p0 - p5), abs(q0 - q5))
378 vmax.u8 d24, d26, d27 ; max(abs(p6 - p0), abs(q6 - q0))
379 vmax.u8 d25, d28, d29 ; max(abs(p7 - p0), abs(q7 - q0))
381 vmax.u8 d26, d22, d23
382 vmax.u8 d27, d24, d25
383 vmax.u8 d23, d26, d27
385 vcge.u8 d18, d30, d23 ; flat2
387 vmov.u8 d22, #0x80
389 orrs r5, r5, r6 ; Check for 0
390 orreq r7, r7, #1 ; Only do filter branch
392 vand d17, d18, d16 ; flat2 && flat && mask
393 vmov r5, r6, d17
395 ; mbfilter() function
397 ; filter() function
398 ; convert to signed
399 veor d23, d8, d22 ; qs0
400 veor d24, d7, d22 ; ps0
401 veor d25, d6, d22 ; ps1
402 veor d26, d9, d22 ; qs1
404 vmov.u8 d27, #3
406 vsub.s8 d28, d23, d24 ; ( qs0 - ps0)
407 vqsub.s8 d29, d25, d26 ; filter = clamp(ps1-qs1)
408 vmull.s8 q15, d28, d27 ; 3 * ( qs0 - ps0)
409 vand d29, d29, d21 ; filter &= hev
410 vaddw.s8 q15, q15, d29 ; filter + 3 * (qs0 - ps0)
411 vmov.u8 d29, #4
413 ; filter = clamp(filter + 3 * ( qs0 - ps0))
414 vqmovn.s16 d28, q15
416 vand d28, d28, d19 ; filter &= mask
418 vqadd.s8 d30, d28, d27 ; filter2 = clamp(filter+3)
419 vqadd.s8 d29, d28, d29 ; filter1 = clamp(filter+4)
420 vshr.s8 d30, d30, #3 ; filter2 >>= 3
421 vshr.s8 d29, d29, #3 ; filter1 >>= 3
424 vqadd.s8 d24, d24, d30 ; op0 = clamp(ps0 + filter2)
425 vqsub.s8 d23, d23, d29 ; oq0 = clamp(qs0 - filter1)
427 ; outer tap adjustments: ++filter1 >> 1
428 vrshr.s8 d29, d29, #1
429 vbic d29, d29, d21 ; filter &= ~hev
431 vqadd.s8 d25, d25, d29 ; op1 = clamp(ps1 + filter)
432 vqsub.s8 d26, d26, d29 ; oq1 = clamp(qs1 - filter)
434 veor d24, d24, d22 ; *f_op0 = u^0x80
435 veor d23, d23, d22 ; *f_oq0 = u^0x80
436 veor d25, d25, d22 ; *f_op1 = u^0x80
437 veor d26, d26, d22 ; *f_oq1 = u^0x80
439 tst r7, #1
440 bxne lr
442 ; mbfilter flat && mask branch
443 ; TODO(fgalligan): Can I decrease the cycles shifting to consective d's
444 ; and using vibt on the q's?
445 vmov.u8 d29, #2
446 vaddl.u8 q15, d7, d8 ; op2 = p0 + q0
447 vmlal.u8 q15, d4, d27 ; op2 = p0 + q0 + p3 * 3
448 vmlal.u8 q15, d5, d29 ; op2 = p0 + q0 + p3 * 3 + p2 * 2
449 vaddl.u8 q10, d4, d5
450 vaddw.u8 q15, d6 ; op2=p1 + p0 + q0 + p3 * 3 + p2 *2
451 vaddl.u8 q14, d6, d9
452 vqrshrn.u16 d18, q15, #3 ; r_op2
454 vsub.i16 q15, q10
455 vaddl.u8 q10, d4, d6
456 vadd.i16 q15, q14
457 vaddl.u8 q14, d7, d10
458 vqrshrn.u16 d19, q15, #3 ; r_op1
460 vsub.i16 q15, q10
461 vadd.i16 q15, q14
462 vaddl.u8 q14, d8, d11
463 vqrshrn.u16 d20, q15, #3 ; r_op0
465 vsubw.u8 q15, d4 ; oq0 = op0 - p3
466 vsubw.u8 q15, d7 ; oq0 -= p0
467 vadd.i16 q15, q14
468 vaddl.u8 q14, d9, d11
469 vqrshrn.u16 d21, q15, #3 ; r_oq0
471 vsubw.u8 q15, d5 ; oq1 = oq0 - p2
472 vsubw.u8 q15, d8 ; oq1 -= q0
473 vadd.i16 q15, q14
474 vaddl.u8 q14, d10, d11
475 vqrshrn.u16 d22, q15, #3 ; r_oq1
477 vsubw.u8 q15, d6 ; oq2 = oq0 - p1
478 vsubw.u8 q15, d9 ; oq2 -= q1
479 vadd.i16 q15, q14
480 vqrshrn.u16 d27, q15, #3 ; r_oq2
482 ; Filter does not set op2 or oq2, so use p2 and q2.
483 vbif d18, d5, d16 ; t_op2 |= p2 & ~(flat & mask)
484 vbif d19, d25, d16 ; t_op1 |= f_op1 & ~(flat & mask)
485 vbif d20, d24, d16 ; t_op0 |= f_op0 & ~(flat & mask)
486 vbif d21, d23, d16 ; t_oq0 |= f_oq0 & ~(flat & mask)
487 vbif d22, d26, d16 ; t_oq1 |= f_oq1 & ~(flat & mask)
489 vbit d23, d27, d16 ; t_oq2 |= r_oq2 & (flat & mask)
490 vbif d23, d10, d16 ; t_oq2 |= q2 & ~(flat & mask)
492 tst r7, #2
493 bxne lr
495 ; wide_mbfilter flat2 && flat && mask branch
496 vmov.u8 d16, #7
497 vaddl.u8 q15, d7, d8 ; op6 = p0 + q0
498 vaddl.u8 q12, d2, d3
499 vaddl.u8 q13, d4, d5
500 vaddl.u8 q14, d1, d6
501 vmlal.u8 q15, d0, d16 ; op6 += p7 * 3
502 vadd.i16 q12, q13
503 vadd.i16 q15, q14
504 vaddl.u8 q14, d2, d9
505 vadd.i16 q15, q12
506 vaddl.u8 q12, d0, d1
507 vaddw.u8 q15, d1
508 vaddl.u8 q13, d0, d2
509 vadd.i16 q14, q15, q14
510 vqrshrn.u16 d16, q15, #4 ; w_op6
512 vsub.i16 q15, q14, q12
513 vaddl.u8 q14, d3, d10
514 vqrshrn.u16 d24, q15, #4 ; w_op5
516 vsub.i16 q15, q13
517 vaddl.u8 q13, d0, d3
518 vadd.i16 q15, q14
519 vaddl.u8 q14, d4, d11
520 vqrshrn.u16 d25, q15, #4 ; w_op4
522 vadd.i16 q15, q14
523 vaddl.u8 q14, d0, d4
524 vsub.i16 q15, q13
525 vsub.i16 q14, q15, q14
526 vqrshrn.u16 d26, q15, #4 ; w_op3
528 vaddw.u8 q15, q14, d5 ; op2 += p2
529 vaddl.u8 q14, d0, d5
530 vaddw.u8 q15, d12 ; op2 += q4
531 vbif d26, d4, d17 ; op3 |= p3 & ~(f2 & f & m)
532 vqrshrn.u16 d27, q15, #4 ; w_op2
534 vsub.i16 q15, q14
535 vaddl.u8 q14, d0, d6
536 vaddw.u8 q15, d6 ; op1 += p1
537 vaddw.u8 q15, d13 ; op1 += q5
538 vbif d27, d18, d17 ; op2 |= t_op2 & ~(f2 & f & m)
539 vqrshrn.u16 d18, q15, #4 ; w_op1
541 vsub.i16 q15, q14
542 vaddl.u8 q14, d0, d7
543 vaddw.u8 q15, d7 ; op0 += p0
544 vaddw.u8 q15, d14 ; op0 += q6
545 vbif d18, d19, d17 ; op1 |= t_op1 & ~(f2 & f & m)
546 vqrshrn.u16 d19, q15, #4 ; w_op0
548 vsub.i16 q15, q14
549 vaddl.u8 q14, d1, d8
550 vaddw.u8 q15, d8 ; oq0 += q0
551 vaddw.u8 q15, d15 ; oq0 += q7
552 vbif d19, d20, d17 ; op0 |= t_op0 & ~(f2 & f & m)
553 vqrshrn.u16 d20, q15, #4 ; w_oq0
555 vsub.i16 q15, q14
556 vaddl.u8 q14, d2, d9
557 vaddw.u8 q15, d9 ; oq1 += q1
558 vaddl.u8 q4, d10, d15
559 vaddw.u8 q15, d15 ; oq1 += q7
560 vbif d20, d21, d17 ; oq0 |= t_oq0 & ~(f2 & f & m)
561 vqrshrn.u16 d21, q15, #4 ; w_oq1
563 vsub.i16 q15, q14
564 vaddl.u8 q14, d3, d10
565 vadd.i16 q15, q4
566 vaddl.u8 q4, d11, d15
567 vbif d21, d22, d17 ; oq1 |= t_oq1 & ~(f2 & f & m)
568 vqrshrn.u16 d22, q15, #4 ; w_oq2
570 vsub.i16 q15, q14
571 vaddl.u8 q14, d4, d11
572 vadd.i16 q15, q4
573 vaddl.u8 q4, d12, d15
574 vbif d22, d23, d17 ; oq2 |= t_oq2 & ~(f2 & f & m)
575 vqrshrn.u16 d23, q15, #4 ; w_oq3
577 vsub.i16 q15, q14
578 vaddl.u8 q14, d5, d12
579 vadd.i16 q15, q4
580 vaddl.u8 q4, d13, d15
581 vbif d16, d1, d17 ; op6 |= p6 & ~(f2 & f & m)
582 vqrshrn.u16 d1, q15, #4 ; w_oq4
584 vsub.i16 q15, q14
585 vaddl.u8 q14, d6, d13
586 vadd.i16 q15, q4
587 vaddl.u8 q4, d14, d15
588 vbif d24, d2, d17 ; op5 |= p5 & ~(f2 & f & m)
589 vqrshrn.u16 d2, q15, #4 ; w_oq5
591 vsub.i16 q15, q14
592 vbif d25, d3, d17 ; op4 |= p4 & ~(f2 & f & m)
593 vadd.i16 q15, q4
594 vbif d23, d11, d17 ; oq3 |= q3 & ~(f2 & f & m)
595 vqrshrn.u16 d3, q15, #4 ; w_oq6
596 vbif d1, d12, d17 ; oq4 |= q4 & ~(f2 & f & m)
597 vbif d2, d13, d17 ; oq5 |= q5 & ~(f2 & f & m)
598 vbif d3, d14, d17 ; oq6 |= q6 & ~(f2 & f & m)
600 bx lr
601 ENDP ; |vp9_wide_mbfilter_neon|
603 END