]> git.sesse.net Git - x264/blob - common/arm/deblock-a.S
21f44a7b415973b6d6756045aedb22e1e6fe0eec
[x264] / common / arm / deblock-a.S
1 /*****************************************************************************
2  * deblock.S: arm deblocking
3  *****************************************************************************
4  * Copyright (C) 2009-2014 x264 project
5  *
6  * Authors: Mans Rullgard <mans@mansr.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
21  *
22  * This program is also available under a commercial proprietary license.
23  * For more information, contact us at licensing@x264.com.
24  *****************************************************************************/
25
26 #include "asm.S"
27
28 .fpu neon
29
30 .macro h264_loop_filter_start
31     ldr             ip,  [sp]
32     ldr             ip,  [ip]
33     vdup.32         d24, ip
34     and             ip,  ip,  ip, lsl #16
35     ands            ip,  ip,  ip, lsl #8
36     bxlt            lr
37 .endm
38
39 .macro align_push_regs
40     and             ip,  sp,  #15
41     add             ip,  ip,  #32
42     sub             sp,  sp,  ip
43     vst1.64         {d12-d15}, [sp,:128]
44     sub             sp,  sp,  #32
45     vst1.64         {d8-d11},  [sp,:128]
46 .endm
47
48 .macro align_pop_regs
49     vld1.64         {d8-d11},  [sp,:128]!
50     vld1.64         {d12-d15}, [sp,:128], ip
51 .endm
52
53 .macro h264_loop_filter_luma
54     vdup.8          q11, r2         @ alpha
55     vmovl.u8        q12, d24
56     vabd.u8         q6,  q8,  q0    @ abs(p0 - q0)
57     vmovl.u16       q12, d24
58     vabd.u8         q14, q9,  q8    @ abs(p1 - p0)
59     vsli.16         q12, q12, #8
60     vabd.u8         q15, q1,  q0    @ abs(q1 - q0)
61     vsli.32         q12, q12, #16
62     vclt.u8         q6,  q6,  q11   @ < alpha
63     vdup.8          q11, r3         @ beta
64     vclt.s8         q7,  q12, #0
65     vclt.u8         q14, q14, q11   @ < beta
66     vclt.u8         q15, q15, q11   @ < beta
67     vbic            q6,  q6,  q7
68     vabd.u8         q4,  q10, q8    @ abs(p2 - p0)
69     vand            q6,  q6,  q14
70     vabd.u8         q5,  q2,  q0    @ abs(q2 - q0)
71     vclt.u8         q4,  q4,  q11   @ < beta
72     vand            q6,  q6,  q15
73     vclt.u8         q5,  q5,  q11   @ < beta
74     vand            q4,  q4,  q6
75     vand            q5,  q5,  q6
76     vand            q12, q12, q6
77     vrhadd.u8       q14, q8,  q0
78     vsub.i8         q6,  q12, q4
79     vqadd.u8        q7,  q9,  q12
80     vhadd.u8        q10, q10, q14
81     vsub.i8         q6,  q6,  q5
82     vhadd.u8        q14, q2,  q14
83     vmin.u8         q7,  q7,  q10
84     vqsub.u8        q11, q9,  q12
85     vqadd.u8        q2,  q1,  q12
86     vmax.u8         q7,  q7,  q11
87     vqsub.u8        q11, q1,  q12
88     vmin.u8         q14, q2,  q14
89     vmovl.u8        q2,  d0
90     vmax.u8         q14, q14, q11
91     vmovl.u8        q10, d1
92     vsubw.u8        q2,  q2,  d16
93     vsubw.u8        q10, q10, d17
94     vshl.i16        q2,  q2,  #2
95     vshl.i16        q10, q10, #2
96     vaddw.u8        q2,  q2,  d18
97     vaddw.u8        q10, q10, d19
98     vsubw.u8        q2,  q2,  d2
99     vsubw.u8        q10, q10, d3
100     vrshrn.i16      d4,  q2,  #3
101     vrshrn.i16      d5,  q10, #3
102     vbsl            q4,  q7,  q9
103     vbsl            q5,  q14, q1
104     vneg.s8         q7,  q6
105     vmovl.u8        q14, d16
106     vmin.s8         q2,  q2,  q6
107     vmovl.u8        q6,  d17
108     vmax.s8         q2,  q2,  q7
109     vmovl.u8        q11, d0
110     vmovl.u8        q12, d1
111     vaddw.s8        q14, q14, d4
112     vaddw.s8        q6,  q6,  d5
113     vsubw.s8        q11, q11, d4
114     vsubw.s8        q12, q12, d5
115     vqmovun.s16     d16, q14
116     vqmovun.s16     d17, q6
117     vqmovun.s16     d0,  q11
118     vqmovun.s16     d1,  q12
119 .endm
120
121 function x264_deblock_v_luma_neon
122     h264_loop_filter_start
123
124     vld1.64         {d0, d1},  [r0,:128], r1
125     vld1.64         {d2, d3},  [r0,:128], r1
126     vld1.64         {d4, d5},  [r0,:128], r1
127     sub             r0,  r0,  r1, lsl #2
128     sub             r0,  r0,  r1, lsl #1
129     vld1.64         {d20,d21}, [r0,:128], r1
130     vld1.64         {d18,d19}, [r0,:128], r1
131     vld1.64         {d16,d17}, [r0,:128], r1
132
133     align_push_regs
134
135     h264_loop_filter_luma
136
137     sub             r0,  r0,  r1, lsl #1
138     vst1.64         {d8, d9},  [r0,:128], r1
139     vst1.64         {d16,d17}, [r0,:128], r1
140     vst1.64         {d0, d1},  [r0,:128], r1
141     vst1.64         {d10,d11}, [r0,:128]
142
143     align_pop_regs
144     bx              lr
145 .endfunc
146
147 function x264_deblock_h_luma_neon
148     h264_loop_filter_start
149
150     sub             r0,  r0,  #4
151     vld1.64         {d6},  [r0], r1
152     vld1.64         {d20}, [r0], r1
153     vld1.64         {d18}, [r0], r1
154     vld1.64         {d16}, [r0], r1
155     vld1.64         {d0},  [r0], r1
156     vld1.64         {d2},  [r0], r1
157     vld1.64         {d4},  [r0], r1
158     vld1.64         {d26}, [r0], r1
159     vld1.64         {d7},  [r0], r1
160     vld1.64         {d21}, [r0], r1
161     vld1.64         {d19}, [r0], r1
162     vld1.64         {d17}, [r0], r1
163     vld1.64         {d1},  [r0], r1
164     vld1.64         {d3},  [r0], r1
165     vld1.64         {d5},  [r0], r1
166     vld1.64         {d27}, [r0], r1
167
168     TRANSPOSE8x8    q3, q10, q9, q8, q0, q1, q2, q13
169
170     align_push_regs
171
172     h264_loop_filter_luma
173
174     TRANSPOSE4x4    q4, q8, q0, q5
175
176     sub             r0,  r0,  r1, lsl #4
177     add             r0,  r0,  #2
178     vst1.32         {d8[0]},  [r0], r1
179     vst1.32         {d16[0]}, [r0], r1
180     vst1.32         {d0[0]},  [r0], r1
181     vst1.32         {d10[0]}, [r0], r1
182     vst1.32         {d8[1]},  [r0], r1
183     vst1.32         {d16[1]}, [r0], r1
184     vst1.32         {d0[1]},  [r0], r1
185     vst1.32         {d10[1]}, [r0], r1
186     vst1.32         {d9[0]},  [r0], r1
187     vst1.32         {d17[0]}, [r0], r1
188     vst1.32         {d1[0]},  [r0], r1
189     vst1.32         {d11[0]}, [r0], r1
190     vst1.32         {d9[1]},  [r0], r1
191     vst1.32         {d17[1]}, [r0], r1
192     vst1.32         {d1[1]},  [r0], r1
193     vst1.32         {d11[1]}, [r0], r1
194
195     align_pop_regs
196     bx              lr
197 .endfunc
198
199 .macro h264_loop_filter_chroma
200     vdup.8          q11, r2         // alpha
201     vmovl.u8        q12, d24
202     vabd.u8         q13, q8,  q0    // abs(p0 - q0)
203     vabd.u8         q14, q9,  q8    // abs(p1 - p0)
204     vsubl.u8        q2,  d0,  d16
205     vsubl.u8        q3,  d1,  d17
206     vsli.16         q12, q12, #8
207     vshl.i16        q2,  q2,  #2
208     vshl.i16        q3,  q3,  #2
209     vabd.u8         q15, q1,  q0    // abs(q1 - q0)
210     vaddw.u8        q2,  q2,  d18
211     vaddw.u8        q3,  q3,  d19
212     vclt.u8         q13, q13, q11   // < alpha
213     vsubw.u8        q2,  q2,  d2
214     vsubw.u8        q3,  q3,  d3
215     vdup.8          q11, r3         // beta
216     vclt.s8         q10, q12, #0
217     vrshrn.i16      d4,  q2,  #3
218     vrshrn.i16      d5,  q3,  #3
219     vclt.u8         q14, q14, q11   // < beta
220     vbic            q13, q13, q10
221     vclt.u8         q15, q15, q11   // < beta
222     vand            q13, q13, q14
223     vneg.s8         q10, q12
224     vand            q13, q13, q15
225     vmin.s8         q2,  q2,  q12
226     vmovl.u8        q14, d16
227     vand            q2,  q2,  q13
228     vmovl.u8        q15, d17
229     vmax.s8         q2,  q2,  q10
230     vmovl.u8        q11, d0
231     vmovl.u8        q12, d1
232     vaddw.s8        q14, q14, d4
233     vaddw.s8        q15, q15, d5
234     vsubw.s8        q11, q11, d4
235     vsubw.s8        q12, q12, d5
236     vqmovun.s16     d16, q14
237     vqmovun.s16     d17, q15
238     vqmovun.s16     d0,  q11
239     vqmovun.s16     d1,  q12
240 .endm
241
242 function x264_deblock_v_chroma_neon
243     h264_loop_filter_start
244
245     sub             r0,  r0,  r1, lsl #1
246     vld2.8          {d18,d19}, [r0,:128], r1
247     vld2.8          {d16,d17}, [r0,:128], r1
248     vld2.8          {d0, d1},  [r0,:128], r1
249     vld2.8          {d2, d3},  [r0,:128]
250
251     h264_loop_filter_chroma
252
253     sub             r0,  r0,  r1, lsl #1
254     vst2.8          {d16,d17}, [r0,:128], r1
255     vst2.8          {d0, d1},  [r0,:128], r1
256
257     bx              lr
258 .endfunc
259
260 function x264_deblock_h_chroma_neon
261     h264_loop_filter_start
262
263     sub             r0,  r0,  #4
264     vld1.8          {d18}, [r0], r1
265     vld1.8          {d16}, [r0], r1
266     vld1.8          {d0},  [r0], r1
267     vld1.8          {d2},  [r0], r1
268     vld1.8          {d19}, [r0], r1
269     vld1.8          {d17}, [r0], r1
270     vld1.8          {d1},  [r0], r1
271     vld1.8          {d3},  [r0], r1
272
273     vuzp.8          d18, d19
274     vuzp.8          d16, d17
275     vuzp.8          d0,  d1
276     vuzp.8          d2,  d3
277
278     vtrn.16         q9,  q0
279     vtrn.16         q8,  q1
280     vtrn.8          q9,  q8
281     vtrn.8          q0,  q1
282
283     h264_loop_filter_chroma
284
285     vtrn.16         q9,  q0
286     vtrn.16         q8,  q1
287     vtrn.8          q9,  q8
288     vtrn.8          q0,  q1
289
290     vzip.8          d18, d19
291     vzip.8          d16, d17
292     vzip.8          d0,  d1
293     vzip.8          d2,  d3
294
295     sub             r0,  r0,  r1, lsl #3
296     vst1.8          {d18}, [r0], r1
297     vst1.8          {d16}, [r0], r1
298     vst1.8          {d0},  [r0], r1
299     vst1.8          {d2},  [r0], r1
300     vst1.8          {d19}, [r0], r1
301     vst1.8          {d17}, [r0], r1
302     vst1.8          {d1},  [r0], r1
303     vst1.8          {d3},  [r0], r1
304
305     bx              lr
306 .endfunc
307
308 function x264_deblock_strength_neon
309     ldr             ip,  [sp]
310     vmov.i8         q8,  #0
311     lsl             ip,  ip,  #8
312     add             r3,  r3,  #32
313     sub             ip,  ip,  #(1<<8)-3
314     vmov.i8         q9,  #0
315     vdup.16         q10, ip
316     ldr             ip,  [sp, #4]
317
318 lists:
319     @ load bytes ref
320     vld1.8          {d31}, [r1]!
321     add             r2,  r2,  #16
322     vld1.8          {q1},  [r1]!
323     vmov.i8         q0,  #0
324     vld1.8          {q2},  [r1]!
325     vext.8          q3,  q0,  q1,  #15
326     vext.8          q0,  q0,  q2,  #15
327     vuzp.32         q1,  q2
328     vuzp.32         q3,  q0
329     vext.8          q1,  q15, q2,  #12
330
331     veor            q0,  q0,  q2
332     veor            q1,  q1,  q2
333     vorr            q8,  q8,  q0
334     vorr            q9,  q9,  q1
335
336     vld1.16         {q11}, [r2,:128]!   @ mv + 0x10
337     vld1.16         {q3},  [r2,:128]!   @ mv + 0x20
338     vld1.16         {q12}, [r2,:128]!   @ mv + 0x30
339     vld1.16         {q2},  [r2,:128]!   @ mv + 0x40
340     vld1.16         {q13}, [r2,:128]!   @ mv + 0x50
341     vext.8          q3,  q3,  q12, #12
342     vext.8          q2,  q2,  q13, #12
343     vabd.s16        q0,  q12, q3
344     vld1.16         {q3},  [r2,:128]!   @ mv + 0x60
345     vabd.s16        q1,  q13, q2
346     vld1.16         {q14}, [r2,:128]!   @ mv + 0x70
347     vqmovn.u16      d0,  q0
348     vld1.16         {q2},  [r2,:128]!   @ mv + 0x80
349     vld1.16         {q15}, [r2,:128]!   @ mv + 0x90
350     vqmovn.u16      d1,  q1
351     vext.8          q3,  q3,  q14, #12
352     vext.8          q2,  q2,  q15, #12
353     vabd.s16        q3,  q14, q3
354     vabd.s16        q2,  q15, q2
355     vqmovn.u16      d2,  q3
356     vqmovn.u16      d3,  q2
357
358     vqsub.u8        q0,  q0,  q10
359     vqsub.u8        q1,  q1,  q10
360     vqmovn.u16      d0,  q0
361     vqmovn.u16      d1,  q1
362
363     vabd.s16        q1,  q12, q13
364     vorr            q8,  q8,  q0
365
366     vabd.s16        q0,  q11, q12
367     vabd.s16        q2,  q13, q14
368     vabd.s16        q3,  q14, q15
369     vqmovn.u16      d0,  q0
370     vqmovn.u16      d1,  q1
371     vqmovn.u16      d2,  q2
372     vqmovn.u16      d3,  q3
373
374     vqsub.u8        q0,  q0,  q10
375     vqsub.u8        q1,  q1,  q10
376     vqmovn.u16      d0,  q0
377     vqmovn.u16      d1,  q1
378     subs            ip,  ip,  #1
379     vorr            q9,  q9,  q0
380     beq             lists
381
382     mov             ip,  #-32
383     @ load bytes nnz
384     vld1.8          {d31}, [r0]!
385     vld1.8          {q1},  [r0]!
386     vmov.i8         q0,  #0
387     vld1.8          {q2},  [r0]
388     vext.8          q3,  q0,  q1,  #15
389     vext.8          q0,  q0,  q2,  #15
390     vuzp.32         q1,  q2
391     vuzp.32         q3,  q0
392     vext.8          q1,  q15, q2,  #12
393
394     vorr            q0,  q0,  q2
395     vorr            q1,  q1,  q2
396     vmov.u8         q10, #1
397     vmin.u8         q0,  q0,  q10
398     vmin.u8         q1,  q1,  q10
399     vmin.u8         q8,  q8,  q10       @ mv ? 1 : 0
400     vmin.u8         q9,  q9,  q10
401     vadd.u8         q0,  q0,  q0        @ nnz ? 2 : 0
402     vadd.u8         q1,  q1,  q1
403     vmax.u8         q8,  q8,  q0
404     vmax.u8         q9,  q9,  q1
405     vzip.16         d16, d17
406     vst1.8          {q9}, [r3,:128], ip @ bs[1]
407     vtrn.8          d16, d17
408     vtrn.32         d16, d17
409
410     vst1.8          {q8}, [r3,:128]     @ bs[0]
411     bx              lr
412 .endfunc