]> granicus.if.org Git - libvpx/blob - vp9/common/arm/neon/vp9_reconintra_neon.asm
Merge "update cpplint"
[libvpx] / vp9 / common / arm / neon / vp9_reconintra_neon.asm
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     ARM
22     REQUIRE8
23     PRESERVE8
24
25     AREA ||.text||, CODE, READONLY, ALIGN=2
26
27 ;void vp9_v_predictor_4x4_neon(uint8_t *dst, ptrdiff_t y_stride,
28 ;                              const uint8_t *above,
29 ;                              const uint8_t *left)
30 ; r0  uint8_t *dst
31 ; r1  ptrdiff_t y_stride
32 ; r2  const uint8_t *above
33 ; r3  const uint8_t *left
34
35 |vp9_v_predictor_4x4_neon| PROC
36     vld1.32             {d0[0]}, [r2]
37     vst1.32             {d0[0]}, [r0], r1
38     vst1.32             {d0[0]}, [r0], r1
39     vst1.32             {d0[0]}, [r0], r1
40     vst1.32             {d0[0]}, [r0], r1
41     bx                  lr
42     ENDP                ; |vp9_v_predictor_4x4_neon|
43
44 ;void vp9_v_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride,
45 ;                              const uint8_t *above,
46 ;                              const uint8_t *left)
47 ; r0  uint8_t *dst
48 ; r1  ptrdiff_t y_stride
49 ; r2  const uint8_t *above
50 ; r3  const uint8_t *left
51
52 |vp9_v_predictor_8x8_neon| PROC
53     vld1.8              {d0}, [r2]
54     vst1.8              {d0}, [r0], r1
55     vst1.8              {d0}, [r0], r1
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     bx                  lr
63     ENDP                ; |vp9_v_predictor_8x8_neon|
64
65 ;void vp9_v_predictor_16x16_neon(uint8_t *dst, ptrdiff_t y_stride,
66 ;                                const uint8_t *above,
67 ;                                const uint8_t *left)
68 ; r0  uint8_t *dst
69 ; r1  ptrdiff_t y_stride
70 ; r2  const uint8_t *above
71 ; r3  const uint8_t *left
72
73 |vp9_v_predictor_16x16_neon| PROC
74     vld1.8              {q0}, [r2]
75     vst1.8              {q0}, [r0], r1
76     vst1.8              {q0}, [r0], r1
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     bx                  lr
92     ENDP                ; |vp9_v_predictor_16x16_neon|
93
94 ;void vp9_v_predictor_32x32_neon(uint8_t *dst, ptrdiff_t y_stride,
95 ;                                const uint8_t *above,
96 ;                                const uint8_t *left)
97 ; r0  uint8_t *dst
98 ; r1  ptrdiff_t y_stride
99 ; r2  const uint8_t *above
100 ; r3  const uint8_t *left
101
102 |vp9_v_predictor_32x32_neon| PROC
103     vld1.8              {q0, q1}, [r2]
104     mov                 r2, #2
105 loop_v
106     vst1.8              {q0, q1}, [r0], r1
107     vst1.8              {q0, q1}, [r0], r1
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     subs                r2, r2, #1
123     bgt                 loop_v
124     bx                  lr
125     ENDP                ; |vp9_v_predictor_32x32_neon|
126
127 ;void vp9_h_predictor_4x4_neon(uint8_t *dst, ptrdiff_t y_stride,
128 ;                              const uint8_t *above,
129 ;                              const uint8_t *left)
130 ; r0  uint8_t *dst
131 ; r1  ptrdiff_t y_stride
132 ; r2  const uint8_t *above
133 ; r3  const uint8_t *left
134
135 |vp9_h_predictor_4x4_neon| PROC
136     vld1.32             {d1[0]}, [r3]
137     vdup.8              d0, d1[0]
138     vst1.32             {d0[0]}, [r0], r1
139     vdup.8              d0, d1[1]
140     vst1.32             {d0[0]}, [r0], r1
141     vdup.8              d0, d1[2]
142     vst1.32             {d0[0]}, [r0], r1
143     vdup.8              d0, d1[3]
144     vst1.32             {d0[0]}, [r0], r1
145     bx                  lr
146     ENDP                ; |vp9_h_predictor_4x4_neon|
147
148 ;void vp9_h_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride,
149 ;                              const uint8_t *above,
150 ;                              const uint8_t *left)
151 ; r0  uint8_t *dst
152 ; r1  ptrdiff_t y_stride
153 ; r2  const uint8_t *above
154 ; r3  const uint8_t *left
155
156 |vp9_h_predictor_8x8_neon| PROC
157     vld1.64             {d1}, [r3]
158     vdup.8              d0, d1[0]
159     vst1.64             {d0}, [r0], r1
160     vdup.8              d0, d1[1]
161     vst1.64             {d0}, [r0], r1
162     vdup.8              d0, d1[2]
163     vst1.64             {d0}, [r0], r1
164     vdup.8              d0, d1[3]
165     vst1.64             {d0}, [r0], r1
166     vdup.8              d0, d1[4]
167     vst1.64             {d0}, [r0], r1
168     vdup.8              d0, d1[5]
169     vst1.64             {d0}, [r0], r1
170     vdup.8              d0, d1[6]
171     vst1.64             {d0}, [r0], r1
172     vdup.8              d0, d1[7]
173     vst1.64             {d0}, [r0], r1
174     bx                  lr
175     ENDP                ; |vp9_h_predictor_8x8_neon|
176
177 ;void vp9_h_predictor_16x16_neon(uint8_t *dst, ptrdiff_t y_stride,
178 ;                                const uint8_t *above,
179 ;                                const uint8_t *left)
180 ; r0  uint8_t *dst
181 ; r1  ptrdiff_t y_stride
182 ; r2  const uint8_t *above
183 ; r3  const uint8_t *left
184
185 |vp9_h_predictor_16x16_neon| PROC
186     vld1.8              {q1}, [r3]
187     vdup.8              q0, d2[0]
188     vst1.8              {q0}, [r0], r1
189     vdup.8              q0, d2[1]
190     vst1.8              {q0}, [r0], r1
191     vdup.8              q0, d2[2]
192     vst1.8              {q0}, [r0], r1
193     vdup.8              q0, d2[3]
194     vst1.8              {q0}, [r0], r1
195     vdup.8              q0, d2[4]
196     vst1.8              {q0}, [r0], r1
197     vdup.8              q0, d2[5]
198     vst1.8              {q0}, [r0], r1
199     vdup.8              q0, d2[6]
200     vst1.8              {q0}, [r0], r1
201     vdup.8              q0, d2[7]
202     vst1.8              {q0}, [r0], r1
203     vdup.8              q0, d3[0]
204     vst1.8              {q0}, [r0], r1
205     vdup.8              q0, d3[1]
206     vst1.8              {q0}, [r0], r1
207     vdup.8              q0, d3[2]
208     vst1.8              {q0}, [r0], r1
209     vdup.8              q0, d3[3]
210     vst1.8              {q0}, [r0], r1
211     vdup.8              q0, d3[4]
212     vst1.8              {q0}, [r0], r1
213     vdup.8              q0, d3[5]
214     vst1.8              {q0}, [r0], r1
215     vdup.8              q0, d3[6]
216     vst1.8              {q0}, [r0], r1
217     vdup.8              q0, d3[7]
218     vst1.8              {q0}, [r0], r1
219     bx                  lr
220     ENDP                ; |vp9_h_predictor_16x16_neon|
221
222 ;void vp9_h_predictor_32x32_neon(uint8_t *dst, ptrdiff_t y_stride,
223 ;                                const uint8_t *above,
224 ;                                const uint8_t *left)
225 ; r0  uint8_t *dst
226 ; r1  ptrdiff_t y_stride
227 ; r2  const uint8_t *above
228 ; r3  const uint8_t *left
229
230 |vp9_h_predictor_32x32_neon| PROC
231     sub                 r1, r1, #16
232     mov                 r2, #2
233 loop_h
234     vld1.8              {q1}, [r3]!
235     vdup.8              q0, d2[0]
236     vst1.8              {q0}, [r0]!
237     vst1.8              {q0}, [r0], r1
238     vdup.8              q0, d2[1]
239     vst1.8              {q0}, [r0]!
240     vst1.8              {q0}, [r0], r1
241     vdup.8              q0, d2[2]
242     vst1.8              {q0}, [r0]!
243     vst1.8              {q0}, [r0], r1
244     vdup.8              q0, d2[3]
245     vst1.8              {q0}, [r0]!
246     vst1.8              {q0}, [r0], r1
247     vdup.8              q0, d2[4]
248     vst1.8              {q0}, [r0]!
249     vst1.8              {q0}, [r0], r1
250     vdup.8              q0, d2[5]
251     vst1.8              {q0}, [r0]!
252     vst1.8              {q0}, [r0], r1
253     vdup.8              q0, d2[6]
254     vst1.8              {q0}, [r0]!
255     vst1.8              {q0}, [r0], r1
256     vdup.8              q0, d2[7]
257     vst1.8              {q0}, [r0]!
258     vst1.8              {q0}, [r0], r1
259     vdup.8              q0, d3[0]
260     vst1.8              {q0}, [r0]!
261     vst1.8              {q0}, [r0], r1
262     vdup.8              q0, d3[1]
263     vst1.8              {q0}, [r0]!
264     vst1.8              {q0}, [r0], r1
265     vdup.8              q0, d3[2]
266     vst1.8              {q0}, [r0]!
267     vst1.8              {q0}, [r0], r1
268     vdup.8              q0, d3[3]
269     vst1.8              {q0}, [r0]!
270     vst1.8              {q0}, [r0], r1
271     vdup.8              q0, d3[4]
272     vst1.8              {q0}, [r0]!
273     vst1.8              {q0}, [r0], r1
274     vdup.8              q0, d3[5]
275     vst1.8              {q0}, [r0]!
276     vst1.8              {q0}, [r0], r1
277     vdup.8              q0, d3[6]
278     vst1.8              {q0}, [r0]!
279     vst1.8              {q0}, [r0], r1
280     vdup.8              q0, d3[7]
281     vst1.8              {q0}, [r0]!
282     vst1.8              {q0}, [r0], r1
283     subs                r2, r2, #1
284     bgt                 loop_h
285     bx                  lr
286     ENDP                ; |vp9_h_predictor_32x32_neon|
287
288 ;void vp9_tm_predictor_4x4_neon (uint8_t *dst, ptrdiff_t y_stride,
289 ;                                const uint8_t *above,
290 ;                                const uint8_t *left)
291 ; r0  uint8_t *dst
292 ; r1  ptrdiff_t y_stride
293 ; r2  const uint8_t *above
294 ; r3  const uint8_t *left
295
296 |vp9_tm_predictor_4x4_neon| PROC
297     ; Load ytop_left = above[-1];
298     sub                 r12, r2, #1
299     ldrb                r12, [r12]
300     vdup.u8             d0, r12
301
302     ; Load above 4 pixels
303     vld1.32             {d2[0]}, [r2]
304
305     ; Compute above - ytop_left
306     vsubl.u8            q3, d2, d0
307
308     ; Load left row by row and compute left + (above - ytop_left)
309     ; 1st row and 2nd row
310     ldrb                r12, [r3], #1
311     ldrb                r2, [r3], #1
312     vdup.u16            q1, r12
313     vdup.u16            q2, r2
314     vadd.s16            q1, q1, q3
315     vadd.s16            q2, q2, q3
316     vqshrun.s16         d0, q1, #0
317     vqshrun.s16         d1, q2, #0
318     vst1.32             {d0[0]}, [r0], r1
319     vst1.32             {d1[0]}, [r0], r1
320
321     ; 3rd row and 4th row
322     ldrb                r12, [r3], #1
323     ldrb                r2, [r3], #1
324     vdup.u16            q1, r12
325     vdup.u16            q2, r2
326     vadd.s16            q1, q1, q3
327     vadd.s16            q2, q2, q3
328     vqshrun.s16         d0, q1, #0
329     vqshrun.s16         d1, q2, #0
330     vst1.32             {d0[0]}, [r0], r1
331     vst1.32             {d1[0]}, [r0], r1
332     bx                  lr
333     ENDP                ; |vp9_tm_predictor_4x4_neon|
334
335 ;void vp9_tm_predictor_8x8_neon (uint8_t *dst, ptrdiff_t y_stride,
336 ;                                const uint8_t *above,
337 ;                                const uint8_t *left)
338 ; r0  uint8_t *dst
339 ; r1  ptrdiff_t y_stride
340 ; r2  const uint8_t *above
341 ; r3  const uint8_t *left
342
343 |vp9_tm_predictor_8x8_neon| PROC
344     ; Load ytop_left = above[-1];
345     sub                 r12, r2, #1
346     ldrb                r12, [r12]
347     vdup.u8             d0, r12
348
349     ; Load above 8 pixels
350     vld1.64             {d2}, [r2]
351
352     ; Compute above - ytop_left
353     vsubl.u8            q3, d2, d0
354
355     ; Load left row by row and compute left + (above - ytop_left)
356     ; 1st row and 2nd row
357     ldrb                r12, [r3], #1
358     ldrb                r2, [r3], #1
359     vdup.u16            q1, r12
360     vdup.u16            q2, r2
361     vadd.s16            q1, q1, q3
362     vadd.s16            q2, q2, q3
363     vqshrun.s16         d0, q1, #0
364     vqshrun.s16         d1, q2, #0
365     vst1.64             {d0}, [r0], r1
366     vst1.64             {d1}, [r0], r1
367
368     ; 3rd row and 4th row
369     ldrb                r12, [r3], #1
370     ldrb                r2, [r3], #1
371     vdup.u16            q1, r12
372     vdup.u16            q2, r2
373     vadd.s16            q1, q1, q3
374     vadd.s16            q2, q2, q3
375     vqshrun.s16         d0, q1, #0
376     vqshrun.s16         d1, q2, #0
377     vst1.64             {d0}, [r0], r1
378     vst1.64             {d1}, [r0], r1
379
380     ; 5th row and 6th row
381     ldrb                r12, [r3], #1
382     ldrb                r2, [r3], #1
383     vdup.u16            q1, r12
384     vdup.u16            q2, r2
385     vadd.s16            q1, q1, q3
386     vadd.s16            q2, q2, q3
387     vqshrun.s16         d0, q1, #0
388     vqshrun.s16         d1, q2, #0
389     vst1.64             {d0}, [r0], r1
390     vst1.64             {d1}, [r0], r1
391
392     ; 7rd row and 8th row
393     ldrb                r12, [r3], #1
394     ldrb                r2, [r3], #1
395     vdup.u16            q1, r12
396     vdup.u16            q2, r2
397     vadd.s16            q1, q1, q3
398     vadd.s16            q2, q2, q3
399     vqshrun.s16         d0, q1, #0
400     vqshrun.s16         d1, q2, #0
401     vst1.64             {d0}, [r0], r1
402     vst1.64             {d1}, [r0], r1
403     bx                  lr
404     ENDP                ; |vp9_tm_predictor_8x8_neon|
405
406     END