OLD | NEW |
| (Empty) |
1 ; | |
2 ; Copyright (c) 2014 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 EXPORT |vp9_v_predictor_4x4_neon| | |
12 EXPORT |vp9_v_predictor_8x8_neon| | |
13 EXPORT |vp9_v_predictor_16x16_neon| | |
14 EXPORT |vp9_v_predictor_32x32_neon| | |
15 EXPORT |vp9_h_predictor_4x4_neon| | |
16 EXPORT |vp9_h_predictor_8x8_neon| | |
17 EXPORT |vp9_h_predictor_16x16_neon| | |
18 EXPORT |vp9_h_predictor_32x32_neon| | |
19 EXPORT |vp9_tm_predictor_4x4_neon| | |
20 EXPORT |vp9_tm_predictor_8x8_neon| | |
21 EXPORT |vp9_tm_predictor_16x16_neon| | |
22 EXPORT |vp9_tm_predictor_32x32_neon| | |
23 ARM | |
24 REQUIRE8 | |
25 PRESERVE8 | |
26 | |
27 AREA ||.text||, CODE, READONLY, ALIGN=2 | |
28 | |
29 ;void vp9_v_predictor_4x4_neon(uint8_t *dst, ptrdiff_t y_stride, | |
30 ; const uint8_t *above, | |
31 ; const uint8_t *left) | |
32 ; r0 uint8_t *dst | |
33 ; r1 ptrdiff_t y_stride | |
34 ; r2 const uint8_t *above | |
35 ; r3 const uint8_t *left | |
36 | |
37 |vp9_v_predictor_4x4_neon| PROC | |
38 vld1.32 {d0[0]}, [r2] | |
39 vst1.32 {d0[0]}, [r0], r1 | |
40 vst1.32 {d0[0]}, [r0], r1 | |
41 vst1.32 {d0[0]}, [r0], r1 | |
42 vst1.32 {d0[0]}, [r0], r1 | |
43 bx lr | |
44 ENDP ; |vp9_v_predictor_4x4_neon| | |
45 | |
46 ;void vp9_v_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride, | |
47 ; const uint8_t *above, | |
48 ; const uint8_t *left) | |
49 ; r0 uint8_t *dst | |
50 ; r1 ptrdiff_t y_stride | |
51 ; r2 const uint8_t *above | |
52 ; r3 const uint8_t *left | |
53 | |
54 |vp9_v_predictor_8x8_neon| PROC | |
55 vld1.8 {d0}, [r2] | |
56 vst1.8 {d0}, [r0], r1 | |
57 vst1.8 {d0}, [r0], r1 | |
58 vst1.8 {d0}, [r0], r1 | |
59 vst1.8 {d0}, [r0], r1 | |
60 vst1.8 {d0}, [r0], r1 | |
61 vst1.8 {d0}, [r0], r1 | |
62 vst1.8 {d0}, [r0], r1 | |
63 vst1.8 {d0}, [r0], r1 | |
64 bx lr | |
65 ENDP ; |vp9_v_predictor_8x8_neon| | |
66 | |
67 ;void vp9_v_predictor_16x16_neon(uint8_t *dst, ptrdiff_t y_stride, | |
68 ; const uint8_t *above, | |
69 ; const uint8_t *left) | |
70 ; r0 uint8_t *dst | |
71 ; r1 ptrdiff_t y_stride | |
72 ; r2 const uint8_t *above | |
73 ; r3 const uint8_t *left | |
74 | |
75 |vp9_v_predictor_16x16_neon| PROC | |
76 vld1.8 {q0}, [r2] | |
77 vst1.8 {q0}, [r0], r1 | |
78 vst1.8 {q0}, [r0], r1 | |
79 vst1.8 {q0}, [r0], r1 | |
80 vst1.8 {q0}, [r0], r1 | |
81 vst1.8 {q0}, [r0], r1 | |
82 vst1.8 {q0}, [r0], r1 | |
83 vst1.8 {q0}, [r0], r1 | |
84 vst1.8 {q0}, [r0], r1 | |
85 vst1.8 {q0}, [r0], r1 | |
86 vst1.8 {q0}, [r0], r1 | |
87 vst1.8 {q0}, [r0], r1 | |
88 vst1.8 {q0}, [r0], r1 | |
89 vst1.8 {q0}, [r0], r1 | |
90 vst1.8 {q0}, [r0], r1 | |
91 vst1.8 {q0}, [r0], r1 | |
92 vst1.8 {q0}, [r0], r1 | |
93 bx lr | |
94 ENDP ; |vp9_v_predictor_16x16_neon| | |
95 | |
96 ;void vp9_v_predictor_32x32_neon(uint8_t *dst, ptrdiff_t y_stride, | |
97 ; const uint8_t *above, | |
98 ; const uint8_t *left) | |
99 ; r0 uint8_t *dst | |
100 ; r1 ptrdiff_t y_stride | |
101 ; r2 const uint8_t *above | |
102 ; r3 const uint8_t *left | |
103 | |
104 |vp9_v_predictor_32x32_neon| PROC | |
105 vld1.8 {q0, q1}, [r2] | |
106 mov r2, #2 | |
107 loop_v | |
108 vst1.8 {q0, q1}, [r0], r1 | |
109 vst1.8 {q0, q1}, [r0], r1 | |
110 vst1.8 {q0, q1}, [r0], r1 | |
111 vst1.8 {q0, q1}, [r0], r1 | |
112 vst1.8 {q0, q1}, [r0], r1 | |
113 vst1.8 {q0, q1}, [r0], r1 | |
114 vst1.8 {q0, q1}, [r0], r1 | |
115 vst1.8 {q0, q1}, [r0], r1 | |
116 vst1.8 {q0, q1}, [r0], r1 | |
117 vst1.8 {q0, q1}, [r0], r1 | |
118 vst1.8 {q0, q1}, [r0], r1 | |
119 vst1.8 {q0, q1}, [r0], r1 | |
120 vst1.8 {q0, q1}, [r0], r1 | |
121 vst1.8 {q0, q1}, [r0], r1 | |
122 vst1.8 {q0, q1}, [r0], r1 | |
123 vst1.8 {q0, q1}, [r0], r1 | |
124 subs r2, r2, #1 | |
125 bgt loop_v | |
126 bx lr | |
127 ENDP ; |vp9_v_predictor_32x32_neon| | |
128 | |
129 ;void vp9_h_predictor_4x4_neon(uint8_t *dst, ptrdiff_t y_stride, | |
130 ; const uint8_t *above, | |
131 ; const uint8_t *left) | |
132 ; r0 uint8_t *dst | |
133 ; r1 ptrdiff_t y_stride | |
134 ; r2 const uint8_t *above | |
135 ; r3 const uint8_t *left | |
136 | |
137 |vp9_h_predictor_4x4_neon| PROC | |
138 vld1.32 {d1[0]}, [r3] | |
139 vdup.8 d0, d1[0] | |
140 vst1.32 {d0[0]}, [r0], r1 | |
141 vdup.8 d0, d1[1] | |
142 vst1.32 {d0[0]}, [r0], r1 | |
143 vdup.8 d0, d1[2] | |
144 vst1.32 {d0[0]}, [r0], r1 | |
145 vdup.8 d0, d1[3] | |
146 vst1.32 {d0[0]}, [r0], r1 | |
147 bx lr | |
148 ENDP ; |vp9_h_predictor_4x4_neon| | |
149 | |
150 ;void vp9_h_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride, | |
151 ; const uint8_t *above, | |
152 ; const uint8_t *left) | |
153 ; r0 uint8_t *dst | |
154 ; r1 ptrdiff_t y_stride | |
155 ; r2 const uint8_t *above | |
156 ; r3 const uint8_t *left | |
157 | |
158 |vp9_h_predictor_8x8_neon| PROC | |
159 vld1.64 {d1}, [r3] | |
160 vdup.8 d0, d1[0] | |
161 vst1.64 {d0}, [r0], r1 | |
162 vdup.8 d0, d1[1] | |
163 vst1.64 {d0}, [r0], r1 | |
164 vdup.8 d0, d1[2] | |
165 vst1.64 {d0}, [r0], r1 | |
166 vdup.8 d0, d1[3] | |
167 vst1.64 {d0}, [r0], r1 | |
168 vdup.8 d0, d1[4] | |
169 vst1.64 {d0}, [r0], r1 | |
170 vdup.8 d0, d1[5] | |
171 vst1.64 {d0}, [r0], r1 | |
172 vdup.8 d0, d1[6] | |
173 vst1.64 {d0}, [r0], r1 | |
174 vdup.8 d0, d1[7] | |
175 vst1.64 {d0}, [r0], r1 | |
176 bx lr | |
177 ENDP ; |vp9_h_predictor_8x8_neon| | |
178 | |
179 ;void vp9_h_predictor_16x16_neon(uint8_t *dst, ptrdiff_t y_stride, | |
180 ; const uint8_t *above, | |
181 ; const uint8_t *left) | |
182 ; r0 uint8_t *dst | |
183 ; r1 ptrdiff_t y_stride | |
184 ; r2 const uint8_t *above | |
185 ; r3 const uint8_t *left | |
186 | |
187 |vp9_h_predictor_16x16_neon| PROC | |
188 vld1.8 {q1}, [r3] | |
189 vdup.8 q0, d2[0] | |
190 vst1.8 {q0}, [r0], r1 | |
191 vdup.8 q0, d2[1] | |
192 vst1.8 {q0}, [r0], r1 | |
193 vdup.8 q0, d2[2] | |
194 vst1.8 {q0}, [r0], r1 | |
195 vdup.8 q0, d2[3] | |
196 vst1.8 {q0}, [r0], r1 | |
197 vdup.8 q0, d2[4] | |
198 vst1.8 {q0}, [r0], r1 | |
199 vdup.8 q0, d2[5] | |
200 vst1.8 {q0}, [r0], r1 | |
201 vdup.8 q0, d2[6] | |
202 vst1.8 {q0}, [r0], r1 | |
203 vdup.8 q0, d2[7] | |
204 vst1.8 {q0}, [r0], r1 | |
205 vdup.8 q0, d3[0] | |
206 vst1.8 {q0}, [r0], r1 | |
207 vdup.8 q0, d3[1] | |
208 vst1.8 {q0}, [r0], r1 | |
209 vdup.8 q0, d3[2] | |
210 vst1.8 {q0}, [r0], r1 | |
211 vdup.8 q0, d3[3] | |
212 vst1.8 {q0}, [r0], r1 | |
213 vdup.8 q0, d3[4] | |
214 vst1.8 {q0}, [r0], r1 | |
215 vdup.8 q0, d3[5] | |
216 vst1.8 {q0}, [r0], r1 | |
217 vdup.8 q0, d3[6] | |
218 vst1.8 {q0}, [r0], r1 | |
219 vdup.8 q0, d3[7] | |
220 vst1.8 {q0}, [r0], r1 | |
221 bx lr | |
222 ENDP ; |vp9_h_predictor_16x16_neon| | |
223 | |
224 ;void vp9_h_predictor_32x32_neon(uint8_t *dst, ptrdiff_t y_stride, | |
225 ; const uint8_t *above, | |
226 ; const uint8_t *left) | |
227 ; r0 uint8_t *dst | |
228 ; r1 ptrdiff_t y_stride | |
229 ; r2 const uint8_t *above | |
230 ; r3 const uint8_t *left | |
231 | |
232 |vp9_h_predictor_32x32_neon| PROC | |
233 sub r1, r1, #16 | |
234 mov r2, #2 | |
235 loop_h | |
236 vld1.8 {q1}, [r3]! | |
237 vdup.8 q0, d2[0] | |
238 vst1.8 {q0}, [r0]! | |
239 vst1.8 {q0}, [r0], r1 | |
240 vdup.8 q0, d2[1] | |
241 vst1.8 {q0}, [r0]! | |
242 vst1.8 {q0}, [r0], r1 | |
243 vdup.8 q0, d2[2] | |
244 vst1.8 {q0}, [r0]! | |
245 vst1.8 {q0}, [r0], r1 | |
246 vdup.8 q0, d2[3] | |
247 vst1.8 {q0}, [r0]! | |
248 vst1.8 {q0}, [r0], r1 | |
249 vdup.8 q0, d2[4] | |
250 vst1.8 {q0}, [r0]! | |
251 vst1.8 {q0}, [r0], r1 | |
252 vdup.8 q0, d2[5] | |
253 vst1.8 {q0}, [r0]! | |
254 vst1.8 {q0}, [r0], r1 | |
255 vdup.8 q0, d2[6] | |
256 vst1.8 {q0}, [r0]! | |
257 vst1.8 {q0}, [r0], r1 | |
258 vdup.8 q0, d2[7] | |
259 vst1.8 {q0}, [r0]! | |
260 vst1.8 {q0}, [r0], r1 | |
261 vdup.8 q0, d3[0] | |
262 vst1.8 {q0}, [r0]! | |
263 vst1.8 {q0}, [r0], r1 | |
264 vdup.8 q0, d3[1] | |
265 vst1.8 {q0}, [r0]! | |
266 vst1.8 {q0}, [r0], r1 | |
267 vdup.8 q0, d3[2] | |
268 vst1.8 {q0}, [r0]! | |
269 vst1.8 {q0}, [r0], r1 | |
270 vdup.8 q0, d3[3] | |
271 vst1.8 {q0}, [r0]! | |
272 vst1.8 {q0}, [r0], r1 | |
273 vdup.8 q0, d3[4] | |
274 vst1.8 {q0}, [r0]! | |
275 vst1.8 {q0}, [r0], r1 | |
276 vdup.8 q0, d3[5] | |
277 vst1.8 {q0}, [r0]! | |
278 vst1.8 {q0}, [r0], r1 | |
279 vdup.8 q0, d3[6] | |
280 vst1.8 {q0}, [r0]! | |
281 vst1.8 {q0}, [r0], r1 | |
282 vdup.8 q0, d3[7] | |
283 vst1.8 {q0}, [r0]! | |
284 vst1.8 {q0}, [r0], r1 | |
285 subs r2, r2, #1 | |
286 bgt loop_h | |
287 bx lr | |
288 ENDP ; |vp9_h_predictor_32x32_neon| | |
289 | |
290 ;void vp9_tm_predictor_4x4_neon (uint8_t *dst, ptrdiff_t y_stride, | |
291 ; const uint8_t *above, | |
292 ; const uint8_t *left) | |
293 ; r0 uint8_t *dst | |
294 ; r1 ptrdiff_t y_stride | |
295 ; r2 const uint8_t *above | |
296 ; r3 const uint8_t *left | |
297 | |
298 |vp9_tm_predictor_4x4_neon| PROC | |
299 ; Load ytop_left = above[-1]; | |
300 sub r12, r2, #1 | |
301 ldrb r12, [r12] | |
302 vdup.u8 d0, r12 | |
303 | |
304 ; Load above 4 pixels | |
305 vld1.32 {d2[0]}, [r2] | |
306 | |
307 ; Compute above - ytop_left | |
308 vsubl.u8 q3, d2, d0 | |
309 | |
310 ; Load left row by row and compute left + (above - ytop_left) | |
311 ; 1st row and 2nd row | |
312 ldrb r12, [r3], #1 | |
313 ldrb r2, [r3], #1 | |
314 vdup.u16 q1, r12 | |
315 vdup.u16 q2, r2 | |
316 vadd.s16 q1, q1, q3 | |
317 vadd.s16 q2, q2, q3 | |
318 vqmovun.s16 d0, q1 | |
319 vqmovun.s16 d1, q2 | |
320 vst1.32 {d0[0]}, [r0], r1 | |
321 vst1.32 {d1[0]}, [r0], r1 | |
322 | |
323 ; 3rd row and 4th row | |
324 ldrb r12, [r3], #1 | |
325 ldrb r2, [r3], #1 | |
326 vdup.u16 q1, r12 | |
327 vdup.u16 q2, r2 | |
328 vadd.s16 q1, q1, q3 | |
329 vadd.s16 q2, q2, q3 | |
330 vqmovun.s16 d0, q1 | |
331 vqmovun.s16 d1, q2 | |
332 vst1.32 {d0[0]}, [r0], r1 | |
333 vst1.32 {d1[0]}, [r0], r1 | |
334 bx lr | |
335 ENDP ; |vp9_tm_predictor_4x4_neon| | |
336 | |
337 ;void vp9_tm_predictor_8x8_neon (uint8_t *dst, ptrdiff_t y_stride, | |
338 ; const uint8_t *above, | |
339 ; const uint8_t *left) | |
340 ; r0 uint8_t *dst | |
341 ; r1 ptrdiff_t y_stride | |
342 ; r2 const uint8_t *above | |
343 ; r3 const uint8_t *left | |
344 | |
345 |vp9_tm_predictor_8x8_neon| PROC | |
346 ; Load ytop_left = above[-1]; | |
347 sub r12, r2, #1 | |
348 ldrb r12, [r12] | |
349 vdup.u8 d0, r12 | |
350 | |
351 ; preload 8 left | |
352 vld1.8 {d30}, [r3] | |
353 | |
354 ; Load above 8 pixels | |
355 vld1.64 {d2}, [r2] | |
356 | |
357 vmovl.u8 q10, d30 | |
358 | |
359 ; Compute above - ytop_left | |
360 vsubl.u8 q3, d2, d0 | |
361 | |
362 ; Load left row by row and compute left + (above - ytop_left) | |
363 ; 1st row and 2nd row | |
364 vdup.16 q0, d20[0] | |
365 vdup.16 q1, d20[1] | |
366 vadd.s16 q0, q3, q0 | |
367 vadd.s16 q1, q3, q1 | |
368 | |
369 ; 3rd row and 4th row | |
370 vdup.16 q8, d20[2] | |
371 vdup.16 q9, d20[3] | |
372 vadd.s16 q8, q3, q8 | |
373 vadd.s16 q9, q3, q9 | |
374 | |
375 vqmovun.s16 d0, q0 | |
376 vqmovun.s16 d1, q1 | |
377 vqmovun.s16 d2, q8 | |
378 vqmovun.s16 d3, q9 | |
379 | |
380 vst1.64 {d0}, [r0], r1 | |
381 vst1.64 {d1}, [r0], r1 | |
382 vst1.64 {d2}, [r0], r1 | |
383 vst1.64 {d3}, [r0], r1 | |
384 | |
385 ; 5th row and 6th row | |
386 vdup.16 q0, d21[0] | |
387 vdup.16 q1, d21[1] | |
388 vadd.s16 q0, q3, q0 | |
389 vadd.s16 q1, q3, q1 | |
390 | |
391 ; 7th row and 8th row | |
392 vdup.16 q8, d21[2] | |
393 vdup.16 q9, d21[3] | |
394 vadd.s16 q8, q3, q8 | |
395 vadd.s16 q9, q3, q9 | |
396 | |
397 vqmovun.s16 d0, q0 | |
398 vqmovun.s16 d1, q1 | |
399 vqmovun.s16 d2, q8 | |
400 vqmovun.s16 d3, q9 | |
401 | |
402 vst1.64 {d0}, [r0], r1 | |
403 vst1.64 {d1}, [r0], r1 | |
404 vst1.64 {d2}, [r0], r1 | |
405 vst1.64 {d3}, [r0], r1 | |
406 | |
407 bx lr | |
408 ENDP ; |vp9_tm_predictor_8x8_neon| | |
409 | |
410 ;void vp9_tm_predictor_16x16_neon (uint8_t *dst, ptrdiff_t y_stride, | |
411 ; const uint8_t *above, | |
412 ; const uint8_t *left) | |
413 ; r0 uint8_t *dst | |
414 ; r1 ptrdiff_t y_stride | |
415 ; r2 const uint8_t *above | |
416 ; r3 const uint8_t *left | |
417 | |
418 |vp9_tm_predictor_16x16_neon| PROC | |
419 ; Load ytop_left = above[-1]; | |
420 sub r12, r2, #1 | |
421 ldrb r12, [r12] | |
422 vdup.u8 q0, r12 | |
423 | |
424 ; Load above 8 pixels | |
425 vld1.8 {q1}, [r2] | |
426 | |
427 ; preload 8 left into r12 | |
428 vld1.8 {d18}, [r3]! | |
429 | |
430 ; Compute above - ytop_left | |
431 vsubl.u8 q2, d2, d0 | |
432 vsubl.u8 q3, d3, d1 | |
433 | |
434 vmovl.u8 q10, d18 | |
435 | |
436 ; Load left row by row and compute left + (above - ytop_left) | |
437 ; Process 8 rows in each single loop and loop 2 times to process 16 rows. | |
438 mov r2, #2 | |
439 | |
440 loop_16x16_neon | |
441 ; Process two rows. | |
442 vdup.16 q0, d20[0] | |
443 vdup.16 q8, d20[1] | |
444 vadd.s16 q1, q0, q2 | |
445 vadd.s16 q0, q0, q3 | |
446 vadd.s16 q11, q8, q2 | |
447 vadd.s16 q8, q8, q3 | |
448 vqmovun.s16 d2, q1 | |
449 vqmovun.s16 d3, q0 | |
450 vqmovun.s16 d22, q11 | |
451 vqmovun.s16 d23, q8 | |
452 vdup.16 q0, d20[2] ; proload next 2 rows data | |
453 vdup.16 q8, d20[3] | |
454 vst1.64 {d2,d3}, [r0], r1 | |
455 vst1.64 {d22,d23}, [r0], r1 | |
456 | |
457 ; Process two rows. | |
458 vadd.s16 q1, q0, q2 | |
459 vadd.s16 q0, q0, q3 | |
460 vadd.s16 q11, q8, q2 | |
461 vadd.s16 q8, q8, q3 | |
462 vqmovun.s16 d2, q1 | |
463 vqmovun.s16 d3, q0 | |
464 vqmovun.s16 d22, q11 | |
465 vqmovun.s16 d23, q8 | |
466 vdup.16 q0, d21[0] ; proload next 2 rows data | |
467 vdup.16 q8, d21[1] | |
468 vst1.64 {d2,d3}, [r0], r1 | |
469 vst1.64 {d22,d23}, [r0], r1 | |
470 | |
471 vadd.s16 q1, q0, q2 | |
472 vadd.s16 q0, q0, q3 | |
473 vadd.s16 q11, q8, q2 | |
474 vadd.s16 q8, q8, q3 | |
475 vqmovun.s16 d2, q1 | |
476 vqmovun.s16 d3, q0 | |
477 vqmovun.s16 d22, q11 | |
478 vqmovun.s16 d23, q8 | |
479 vdup.16 q0, d21[2] ; proload next 2 rows data | |
480 vdup.16 q8, d21[3] | |
481 vst1.64 {d2,d3}, [r0], r1 | |
482 vst1.64 {d22,d23}, [r0], r1 | |
483 | |
484 | |
485 vadd.s16 q1, q0, q2 | |
486 vadd.s16 q0, q0, q3 | |
487 vadd.s16 q11, q8, q2 | |
488 vadd.s16 q8, q8, q3 | |
489 vqmovun.s16 d2, q1 | |
490 vqmovun.s16 d3, q0 | |
491 vqmovun.s16 d22, q11 | |
492 vqmovun.s16 d23, q8 | |
493 vld1.8 {d18}, [r3]! ; preload 8 left into r12 | |
494 vmovl.u8 q10, d18 | |
495 vst1.64 {d2,d3}, [r0], r1 | |
496 vst1.64 {d22,d23}, [r0], r1 | |
497 | |
498 subs r2, r2, #1 | |
499 bgt loop_16x16_neon | |
500 | |
501 bx lr | |
502 ENDP ; |vp9_tm_predictor_16x16_neon| | |
503 | |
504 ;void vp9_tm_predictor_32x32_neon (uint8_t *dst, ptrdiff_t y_stride, | |
505 ; const uint8_t *above, | |
506 ; const uint8_t *left) | |
507 ; r0 uint8_t *dst | |
508 ; r1 ptrdiff_t y_stride | |
509 ; r2 const uint8_t *above | |
510 ; r3 const uint8_t *left | |
511 | |
512 |vp9_tm_predictor_32x32_neon| PROC | |
513 ; Load ytop_left = above[-1]; | |
514 sub r12, r2, #1 | |
515 ldrb r12, [r12] | |
516 vdup.u8 q0, r12 | |
517 | |
518 ; Load above 32 pixels | |
519 vld1.8 {q1}, [r2]! | |
520 vld1.8 {q2}, [r2] | |
521 | |
522 ; preload 8 left pixels | |
523 vld1.8 {d26}, [r3]! | |
524 | |
525 ; Compute above - ytop_left | |
526 vsubl.u8 q8, d2, d0 | |
527 vsubl.u8 q9, d3, d1 | |
528 vsubl.u8 q10, d4, d0 | |
529 vsubl.u8 q11, d5, d1 | |
530 | |
531 vmovl.u8 q3, d26 | |
532 | |
533 ; Load left row by row and compute left + (above - ytop_left) | |
534 ; Process 8 rows in each single loop and loop 4 times to process 32 rows. | |
535 mov r2, #4 | |
536 | |
537 loop_32x32_neon | |
538 ; Process two rows. | |
539 vdup.16 q0, d6[0] | |
540 vdup.16 q2, d6[1] | |
541 vadd.s16 q12, q0, q8 | |
542 vadd.s16 q13, q0, q9 | |
543 vadd.s16 q14, q0, q10 | |
544 vadd.s16 q15, q0, q11 | |
545 vqmovun.s16 d0, q12 | |
546 vqmovun.s16 d1, q13 | |
547 vadd.s16 q12, q2, q8 | |
548 vadd.s16 q13, q2, q9 | |
549 vqmovun.s16 d2, q14 | |
550 vqmovun.s16 d3, q15 | |
551 vadd.s16 q14, q2, q10 | |
552 vadd.s16 q15, q2, q11 | |
553 vst1.64 {d0-d3}, [r0], r1 | |
554 vqmovun.s16 d24, q12 | |
555 vqmovun.s16 d25, q13 | |
556 vqmovun.s16 d26, q14 | |
557 vqmovun.s16 d27, q15 | |
558 vdup.16 q1, d6[2] | |
559 vdup.16 q2, d6[3] | |
560 vst1.64 {d24-d27}, [r0], r1 | |
561 | |
562 ; Process two rows. | |
563 vadd.s16 q12, q1, q8 | |
564 vadd.s16 q13, q1, q9 | |
565 vadd.s16 q14, q1, q10 | |
566 vadd.s16 q15, q1, q11 | |
567 vqmovun.s16 d0, q12 | |
568 vqmovun.s16 d1, q13 | |
569 vadd.s16 q12, q2, q8 | |
570 vadd.s16 q13, q2, q9 | |
571 vqmovun.s16 d2, q14 | |
572 vqmovun.s16 d3, q15 | |
573 vadd.s16 q14, q2, q10 | |
574 vadd.s16 q15, q2, q11 | |
575 vst1.64 {d0-d3}, [r0], r1 | |
576 vqmovun.s16 d24, q12 | |
577 vqmovun.s16 d25, q13 | |
578 vqmovun.s16 d26, q14 | |
579 vqmovun.s16 d27, q15 | |
580 vdup.16 q0, d7[0] | |
581 vdup.16 q2, d7[1] | |
582 vst1.64 {d24-d27}, [r0], r1 | |
583 | |
584 ; Process two rows. | |
585 vadd.s16 q12, q0, q8 | |
586 vadd.s16 q13, q0, q9 | |
587 vadd.s16 q14, q0, q10 | |
588 vadd.s16 q15, q0, q11 | |
589 vqmovun.s16 d0, q12 | |
590 vqmovun.s16 d1, q13 | |
591 vadd.s16 q12, q2, q8 | |
592 vadd.s16 q13, q2, q9 | |
593 vqmovun.s16 d2, q14 | |
594 vqmovun.s16 d3, q15 | |
595 vadd.s16 q14, q2, q10 | |
596 vadd.s16 q15, q2, q11 | |
597 vst1.64 {d0-d3}, [r0], r1 | |
598 vqmovun.s16 d24, q12 | |
599 vqmovun.s16 d25, q13 | |
600 vqmovun.s16 d26, q14 | |
601 vqmovun.s16 d27, q15 | |
602 vdup.16 q0, d7[2] | |
603 vdup.16 q2, d7[3] | |
604 vst1.64 {d24-d27}, [r0], r1 | |
605 | |
606 ; Process two rows. | |
607 vadd.s16 q12, q0, q8 | |
608 vadd.s16 q13, q0, q9 | |
609 vadd.s16 q14, q0, q10 | |
610 vadd.s16 q15, q0, q11 | |
611 vqmovun.s16 d0, q12 | |
612 vqmovun.s16 d1, q13 | |
613 vadd.s16 q12, q2, q8 | |
614 vadd.s16 q13, q2, q9 | |
615 vqmovun.s16 d2, q14 | |
616 vqmovun.s16 d3, q15 | |
617 vadd.s16 q14, q2, q10 | |
618 vadd.s16 q15, q2, q11 | |
619 vst1.64 {d0-d3}, [r0], r1 | |
620 vqmovun.s16 d24, q12 | |
621 vqmovun.s16 d25, q13 | |
622 vld1.8 {d0}, [r3]! ; preload 8 left pixels | |
623 vqmovun.s16 d26, q14 | |
624 vqmovun.s16 d27, q15 | |
625 vmovl.u8 q3, d0 | |
626 vst1.64 {d24-d27}, [r0], r1 | |
627 | |
628 subs r2, r2, #1 | |
629 bgt loop_32x32_neon | |
630 | |
631 bx lr | |
632 ENDP ; |vp9_tm_predictor_32x32_neon| | |
633 | |
634 END | |
OLD | NEW |