]> git.sesse.net Git - x264/blob - common/arm/deblock-a.S
446e6780a16cf57194a393ba22b8965d762f2438
[x264] / common / arm / deblock-a.S
1 /*****************************************************************************
2  * deblock.S: arm deblocking
3  *****************************************************************************
4  * Copyright (C) 2009-2015 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 .macro h264_loop_filter_start
29     ldr             ip,  [sp]
30     ldr             ip,  [ip]
31     vdup.32         d24, ip
32     and             ip,  ip,  ip, lsl #16
33     ands            ip,  ip,  ip, lsl #8
34     bxlt            lr
35 .endm
36
37 .macro align_push_regs
38     and             ip,  sp,  #15
39     add             ip,  ip,  #32
40     sub             sp,  sp,  ip
41     vst1.64         {d12-d15}, [sp,:128]
42     sub             sp,  sp,  #32
43     vst1.64         {d8-d11},  [sp,:128]
44 .endm
45
46 .macro align_pop_regs
47     vld1.64         {d8-d11},  [sp,:128]!
48     vld1.64         {d12-d15}, [sp,:128], ip
49 .endm
50
51 .macro h264_loop_filter_luma
52     vdup.8          q11, r2         @ alpha
53     vmovl.u8        q12, d24
54     vabd.u8         q6,  q8,  q0    @ abs(p0 - q0)
55     vmovl.u16       q12, d24
56     vabd.u8         q14, q9,  q8    @ abs(p1 - p0)
57     vsli.16         q12, q12, #8
58     vabd.u8         q15, q1,  q0    @ abs(q1 - q0)
59     vsli.32         q12, q12, #16
60     vclt.u8         q6,  q6,  q11   @ < alpha
61     vdup.8          q11, r3         @ beta
62     vclt.s8         q7,  q12, #0
63     vclt.u8         q14, q14, q11   @ < beta
64     vclt.u8         q15, q15, q11   @ < beta
65     vbic            q6,  q6,  q7
66     vabd.u8         q4,  q10, q8    @ abs(p2 - p0)
67     vand            q6,  q6,  q14
68     vabd.u8         q5,  q2,  q0    @ abs(q2 - q0)
69     vclt.u8         q4,  q4,  q11   @ < beta
70     vand            q6,  q6,  q15
71     vclt.u8         q5,  q5,  q11   @ < beta
72     vand            q4,  q4,  q6
73     vand            q5,  q5,  q6
74     vand            q12, q12, q6
75     vrhadd.u8       q14, q8,  q0
76     vsub.i8         q6,  q12, q4
77     vqadd.u8        q7,  q9,  q12
78     vhadd.u8        q10, q10, q14
79     vsub.i8         q6,  q6,  q5
80     vhadd.u8        q14, q2,  q14
81     vmin.u8         q7,  q7,  q10
82     vqsub.u8        q11, q9,  q12
83     vqadd.u8        q2,  q1,  q12
84     vmax.u8         q7,  q7,  q11
85     vqsub.u8        q11, q1,  q12
86     vmin.u8         q14, q2,  q14
87     vmovl.u8        q2,  d0
88     vmax.u8         q14, q14, q11
89     vmovl.u8        q10, d1
90     vsubw.u8        q2,  q2,  d16
91     vsubw.u8        q10, q10, d17
92     vshl.i16        q2,  q2,  #2
93     vshl.i16        q10, q10, #2
94     vaddw.u8        q2,  q2,  d18
95     vaddw.u8        q10, q10, d19
96     vsubw.u8        q2,  q2,  d2
97     vsubw.u8        q10, q10, d3
98     vrshrn.i16      d4,  q2,  #3
99     vrshrn.i16      d5,  q10, #3
100     vbsl            q4,  q7,  q9
101     vbsl            q5,  q14, q1
102     vneg.s8         q7,  q6
103     vmovl.u8        q14, d16
104     vmin.s8         q2,  q2,  q6
105     vmovl.u8        q6,  d17
106     vmax.s8         q2,  q2,  q7
107     vmovl.u8        q11, d0
108     vmovl.u8        q12, d1
109     vaddw.s8        q14, q14, d4
110     vaddw.s8        q6,  q6,  d5
111     vsubw.s8        q11, q11, d4
112     vsubw.s8        q12, q12, d5
113     vqmovun.s16     d16, q14
114     vqmovun.s16     d17, q6
115     vqmovun.s16     d0,  q11
116     vqmovun.s16     d1,  q12
117 .endm
118
119 function x264_deblock_v_luma_neon
120     h264_loop_filter_start
121
122     vld1.64         {d0, d1},  [r0,:128], r1
123     vld1.64         {d2, d3},  [r0,:128], r1
124     vld1.64         {d4, d5},  [r0,:128], r1
125     sub             r0,  r0,  r1, lsl #2
126     sub             r0,  r0,  r1, lsl #1
127     vld1.64         {d20,d21}, [r0,:128], r1
128     vld1.64         {d18,d19}, [r0,:128], r1
129     vld1.64         {d16,d17}, [r0,:128], r1
130
131     align_push_regs
132
133     h264_loop_filter_luma
134
135     sub             r0,  r0,  r1, lsl #1
136     vst1.64         {d8, d9},  [r0,:128], r1
137     vst1.64         {d16,d17}, [r0,:128], r1
138     vst1.64         {d0, d1},  [r0,:128], r1
139     vst1.64         {d10,d11}, [r0,:128]
140
141     align_pop_regs
142     bx              lr
143 endfunc
144
145 function x264_deblock_h_luma_neon
146     h264_loop_filter_start
147
148     sub             r0,  r0,  #4
149     vld1.64         {d6},  [r0], r1
150     vld1.64         {d20}, [r0], r1
151     vld1.64         {d18}, [r0], r1
152     vld1.64         {d16}, [r0], r1
153     vld1.64         {d0},  [r0], r1
154     vld1.64         {d2},  [r0], r1
155     vld1.64         {d4},  [r0], r1
156     vld1.64         {d26}, [r0], r1
157     vld1.64         {d7},  [r0], r1
158     vld1.64         {d21}, [r0], r1
159     vld1.64         {d19}, [r0], r1
160     vld1.64         {d17}, [r0], r1
161     vld1.64         {d1},  [r0], r1
162     vld1.64         {d3},  [r0], r1
163     vld1.64         {d5},  [r0], r1
164     vld1.64         {d27}, [r0], r1
165
166     TRANSPOSE8x8    q3, q10, q9, q8, q0, q1, q2, q13
167
168     align_push_regs
169
170     h264_loop_filter_luma
171
172     TRANSPOSE4x4    q4, q8, q0, q5
173
174     sub             r0,  r0,  r1, lsl #4
175     add             r0,  r0,  #2
176     vst1.32         {d8[0]},  [r0], r1
177     vst1.32         {d16[0]}, [r0], r1
178     vst1.32         {d0[0]},  [r0], r1
179     vst1.32         {d10[0]}, [r0], r1
180     vst1.32         {d8[1]},  [r0], r1
181     vst1.32         {d16[1]}, [r0], r1
182     vst1.32         {d0[1]},  [r0], r1
183     vst1.32         {d10[1]}, [r0], r1
184     vst1.32         {d9[0]},  [r0], r1
185     vst1.32         {d17[0]}, [r0], r1
186     vst1.32         {d1[0]},  [r0], r1
187     vst1.32         {d11[0]}, [r0], r1
188     vst1.32         {d9[1]},  [r0], r1
189     vst1.32         {d17[1]}, [r0], r1
190     vst1.32         {d1[1]},  [r0], r1
191     vst1.32         {d11[1]}, [r0], r1
192
193     align_pop_regs
194     bx              lr
195 endfunc
196
197 .macro h264_loop_filter_chroma
198     vdup.8          q11, r2         // alpha
199     vmovl.u8        q12, d24
200     vabd.u8         q13, q8,  q0    // abs(p0 - q0)
201     vabd.u8         q14, q9,  q8    // abs(p1 - p0)
202     vsubl.u8        q2,  d0,  d16
203     vsubl.u8        q3,  d1,  d17
204     vsli.16         q12, q12, #8
205     vshl.i16        q2,  q2,  #2
206     vshl.i16        q3,  q3,  #2
207     vabd.u8         q15, q1,  q0    // abs(q1 - q0)
208     vmovl.u8        q12, d24
209     vaddw.u8        q2,  q2,  d18
210     vaddw.u8        q3,  q3,  d19
211     vclt.u8         q13, q13, q11   // < alpha
212     vsubw.u8        q2,  q2,  d2
213     vsubw.u8        q3,  q3,  d3
214     vsli.16         q12, q12, #8
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     vld1.8          {d18,d19}, [r0,:128], r1
247     vld1.8          {d16,d17}, [r0,:128], r1
248     vld1.8          {d0, d1},  [r0,:128], r1
249     vld1.8          {d2, d3},  [r0,:128]
250
251     h264_loop_filter_chroma
252
253     sub             r0,  r0,  r1, lsl #1
254     vst1.8          {d16,d17}, [r0,:128], r1
255     vst1.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     TRANSPOSE4x4_16 q9, q8, q0, q1
274
275     h264_loop_filter_chroma
276
277     vtrn.16         q8,  q0
278
279     sub             r0,  r0,  r1, lsl #3
280     add             r0,  r0,  #2
281     vst1.32         {d16[0]}, [r0], r1
282     vst1.32         {d0[0]},  [r0], r1
283     vst1.32         {d16[1]}, [r0], r1
284     vst1.32         {d0[1]},  [r0], r1
285     vst1.32         {d17[0]}, [r0], r1
286     vst1.32         {d1[0]},  [r0], r1
287     vst1.32         {d17[1]}, [r0], r1
288     vst1.32         {d1[1]},  [r0], r1
289
290     bx              lr
291 endfunc
292
293 function x264_deblock_strength_neon
294     ldr             ip,  [sp]
295     vmov.i8         q8,  #0
296     lsl             ip,  ip,  #8
297     add             r3,  r3,  #32
298     sub             ip,  ip,  #(1<<8)-3
299     vmov.i8         q9,  #0
300     vdup.16         q10, ip
301     ldr             ip,  [sp, #4]
302
303 lists:
304     @ load bytes ref
305     vld1.8          {d31}, [r1]!
306     add             r2,  r2,  #16
307     vld1.8          {q1},  [r1]!
308     vmov.i8         q0,  #0
309     vld1.8          {q2},  [r1]!
310     vext.8          q3,  q0,  q1,  #15
311     vext.8          q0,  q0,  q2,  #15
312     vuzp.32         q1,  q2
313     vuzp.32         q3,  q0
314     vext.8          q1,  q15, q2,  #12
315
316     veor            q0,  q0,  q2
317     veor            q1,  q1,  q2
318     vorr            q8,  q8,  q0
319     vorr            q9,  q9,  q1
320
321     vld1.16         {q11}, [r2,:128]!   @ mv + 0x10
322     vld1.16         {q3},  [r2,:128]!   @ mv + 0x20
323     vld1.16         {q12}, [r2,:128]!   @ mv + 0x30
324     vld1.16         {q2},  [r2,:128]!   @ mv + 0x40
325     vld1.16         {q13}, [r2,:128]!   @ mv + 0x50
326     vext.8          q3,  q3,  q12, #12
327     vext.8          q2,  q2,  q13, #12
328     vabd.s16        q0,  q12, q3
329     vld1.16         {q3},  [r2,:128]!   @ mv + 0x60
330     vabd.s16        q1,  q13, q2
331     vld1.16         {q14}, [r2,:128]!   @ mv + 0x70
332     vqmovn.u16      d0,  q0
333     vld1.16         {q2},  [r2,:128]!   @ mv + 0x80
334     vld1.16         {q15}, [r2,:128]!   @ mv + 0x90
335     vqmovn.u16      d1,  q1
336     vext.8          q3,  q3,  q14, #12
337     vext.8          q2,  q2,  q15, #12
338     vabd.s16        q3,  q14, q3
339     vabd.s16        q2,  q15, q2
340     vqmovn.u16      d2,  q3
341     vqmovn.u16      d3,  q2
342
343     vqsub.u8        q0,  q0,  q10
344     vqsub.u8        q1,  q1,  q10
345     vqmovn.u16      d0,  q0
346     vqmovn.u16      d1,  q1
347
348     vabd.s16        q1,  q12, q13
349     vorr            q8,  q8,  q0
350
351     vabd.s16        q0,  q11, q12
352     vabd.s16        q2,  q13, q14
353     vabd.s16        q3,  q14, q15
354     vqmovn.u16      d0,  q0
355     vqmovn.u16      d1,  q1
356     vqmovn.u16      d2,  q2
357     vqmovn.u16      d3,  q3
358
359     vqsub.u8        q0,  q0,  q10
360     vqsub.u8        q1,  q1,  q10
361     vqmovn.u16      d0,  q0
362     vqmovn.u16      d1,  q1
363     subs            ip,  ip,  #1
364     vorr            q9,  q9,  q0
365     beq             lists
366
367     mov             ip,  #-32
368     @ load bytes nnz
369     vld1.8          {d31}, [r0]!
370     vld1.8          {q1},  [r0]!
371     vmov.i8         q0,  #0
372     vld1.8          {q2},  [r0]
373     vext.8          q3,  q0,  q1,  #15
374     vext.8          q0,  q0,  q2,  #15
375     vuzp.32         q1,  q2
376     vuzp.32         q3,  q0
377     vext.8          q1,  q15, q2,  #12
378
379     vorr            q0,  q0,  q2
380     vorr            q1,  q1,  q2
381     vmov.u8         q10, #1
382     vmin.u8         q0,  q0,  q10
383     vmin.u8         q1,  q1,  q10
384     vmin.u8         q8,  q8,  q10       @ mv ? 1 : 0
385     vmin.u8         q9,  q9,  q10
386     vadd.u8         q0,  q0,  q0        @ nnz ? 2 : 0
387     vadd.u8         q1,  q1,  q1
388     vmax.u8         q8,  q8,  q0
389     vmax.u8         q9,  q9,  q1
390     vzip.16         d16, d17
391     vst1.8          {q9}, [r3,:128], ip @ bs[1]
392     vtrn.8          d16, d17
393     vtrn.32         d16, d17
394
395     vst1.8          {q8}, [r3,:128]     @ bs[0]
396     bx              lr
397 endfunc