]> git.sesse.net Git - x264/blob - common/arm/deblock-a.S
arm: set .arch/.fpu from asm.S
[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 .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     vaddw.u8        q2,  q2,  d18
209     vaddw.u8        q3,  q3,  d19
210     vclt.u8         q13, q13, q11   // < alpha
211     vsubw.u8        q2,  q2,  d2
212     vsubw.u8        q3,  q3,  d3
213     vdup.8          q11, r3         // beta
214     vclt.s8         q10, q12, #0
215     vrshrn.i16      d4,  q2,  #3
216     vrshrn.i16      d5,  q3,  #3
217     vclt.u8         q14, q14, q11   // < beta
218     vbic            q13, q13, q10
219     vclt.u8         q15, q15, q11   // < beta
220     vand            q13, q13, q14
221     vneg.s8         q10, q12
222     vand            q13, q13, q15
223     vmin.s8         q2,  q2,  q12
224     vmovl.u8        q14, d16
225     vand            q2,  q2,  q13
226     vmovl.u8        q15, d17
227     vmax.s8         q2,  q2,  q10
228     vmovl.u8        q11, d0
229     vmovl.u8        q12, d1
230     vaddw.s8        q14, q14, d4
231     vaddw.s8        q15, q15, d5
232     vsubw.s8        q11, q11, d4
233     vsubw.s8        q12, q12, d5
234     vqmovun.s16     d16, q14
235     vqmovun.s16     d17, q15
236     vqmovun.s16     d0,  q11
237     vqmovun.s16     d1,  q12
238 .endm
239
240 function x264_deblock_v_chroma_neon
241     h264_loop_filter_start
242
243     sub             r0,  r0,  r1, lsl #1
244     vld2.8          {d18,d19}, [r0,:128], r1
245     vld2.8          {d16,d17}, [r0,:128], r1
246     vld2.8          {d0, d1},  [r0,:128], r1
247     vld2.8          {d2, d3},  [r0,:128]
248
249     h264_loop_filter_chroma
250
251     sub             r0,  r0,  r1, lsl #1
252     vst2.8          {d16,d17}, [r0,:128], r1
253     vst2.8          {d0, d1},  [r0,:128], r1
254
255     bx              lr
256 .endfunc
257
258 function x264_deblock_h_chroma_neon
259     h264_loop_filter_start
260
261     sub             r0,  r0,  #4
262     vld1.8          {d18}, [r0], r1
263     vld1.8          {d16}, [r0], r1
264     vld1.8          {d0},  [r0], r1
265     vld1.8          {d2},  [r0], r1
266     vld1.8          {d19}, [r0], r1
267     vld1.8          {d17}, [r0], r1
268     vld1.8          {d1},  [r0], r1
269     vld1.8          {d3},  [r0], r1
270
271     vuzp.8          d18, d19
272     vuzp.8          d16, d17
273     vuzp.8          d0,  d1
274     vuzp.8          d2,  d3
275
276     vtrn.16         q9,  q0
277     vtrn.16         q8,  q1
278     vtrn.8          q9,  q8
279     vtrn.8          q0,  q1
280
281     h264_loop_filter_chroma
282
283     vtrn.16         q9,  q0
284     vtrn.16         q8,  q1
285     vtrn.8          q9,  q8
286     vtrn.8          q0,  q1
287
288     vzip.8          d18, d19
289     vzip.8          d16, d17
290     vzip.8          d0,  d1
291     vzip.8          d2,  d3
292
293     sub             r0,  r0,  r1, lsl #3
294     vst1.8          {d18}, [r0], r1
295     vst1.8          {d16}, [r0], r1
296     vst1.8          {d0},  [r0], r1
297     vst1.8          {d2},  [r0], r1
298     vst1.8          {d19}, [r0], r1
299     vst1.8          {d17}, [r0], r1
300     vst1.8          {d1},  [r0], r1
301     vst1.8          {d3},  [r0], r1
302
303     bx              lr
304 .endfunc
305
306 function x264_deblock_strength_neon
307     ldr             ip,  [sp]
308     vmov.i8         q8,  #0
309     lsl             ip,  ip,  #8
310     add             r3,  r3,  #32
311     sub             ip,  ip,  #(1<<8)-3
312     vmov.i8         q9,  #0
313     vdup.16         q10, ip
314     ldr             ip,  [sp, #4]
315
316 lists:
317     @ load bytes ref
318     vld1.8          {d31}, [r1]!
319     add             r2,  r2,  #16
320     vld1.8          {q1},  [r1]!
321     vmov.i8         q0,  #0
322     vld1.8          {q2},  [r1]!
323     vext.8          q3,  q0,  q1,  #15
324     vext.8          q0,  q0,  q2,  #15
325     vuzp.32         q1,  q2
326     vuzp.32         q3,  q0
327     vext.8          q1,  q15, q2,  #12
328
329     veor            q0,  q0,  q2
330     veor            q1,  q1,  q2
331     vorr            q8,  q8,  q0
332     vorr            q9,  q9,  q1
333
334     vld1.16         {q11}, [r2,:128]!   @ mv + 0x10
335     vld1.16         {q3},  [r2,:128]!   @ mv + 0x20
336     vld1.16         {q12}, [r2,:128]!   @ mv + 0x30
337     vld1.16         {q2},  [r2,:128]!   @ mv + 0x40
338     vld1.16         {q13}, [r2,:128]!   @ mv + 0x50
339     vext.8          q3,  q3,  q12, #12
340     vext.8          q2,  q2,  q13, #12
341     vabd.s16        q0,  q12, q3
342     vld1.16         {q3},  [r2,:128]!   @ mv + 0x60
343     vabd.s16        q1,  q13, q2
344     vld1.16         {q14}, [r2,:128]!   @ mv + 0x70
345     vqmovn.u16      d0,  q0
346     vld1.16         {q2},  [r2,:128]!   @ mv + 0x80
347     vld1.16         {q15}, [r2,:128]!   @ mv + 0x90
348     vqmovn.u16      d1,  q1
349     vext.8          q3,  q3,  q14, #12
350     vext.8          q2,  q2,  q15, #12
351     vabd.s16        q3,  q14, q3
352     vabd.s16        q2,  q15, q2
353     vqmovn.u16      d2,  q3
354     vqmovn.u16      d3,  q2
355
356     vqsub.u8        q0,  q0,  q10
357     vqsub.u8        q1,  q1,  q10
358     vqmovn.u16      d0,  q0
359     vqmovn.u16      d1,  q1
360
361     vabd.s16        q1,  q12, q13
362     vorr            q8,  q8,  q0
363
364     vabd.s16        q0,  q11, q12
365     vabd.s16        q2,  q13, q14
366     vabd.s16        q3,  q14, q15
367     vqmovn.u16      d0,  q0
368     vqmovn.u16      d1,  q1
369     vqmovn.u16      d2,  q2
370     vqmovn.u16      d3,  q3
371
372     vqsub.u8        q0,  q0,  q10
373     vqsub.u8        q1,  q1,  q10
374     vqmovn.u16      d0,  q0
375     vqmovn.u16      d1,  q1
376     subs            ip,  ip,  #1
377     vorr            q9,  q9,  q0
378     beq             lists
379
380     mov             ip,  #-32
381     @ load bytes nnz
382     vld1.8          {d31}, [r0]!
383     vld1.8          {q1},  [r0]!
384     vmov.i8         q0,  #0
385     vld1.8          {q2},  [r0]
386     vext.8          q3,  q0,  q1,  #15
387     vext.8          q0,  q0,  q2,  #15
388     vuzp.32         q1,  q2
389     vuzp.32         q3,  q0
390     vext.8          q1,  q15, q2,  #12
391
392     vorr            q0,  q0,  q2
393     vorr            q1,  q1,  q2
394     vmov.u8         q10, #1
395     vmin.u8         q0,  q0,  q10
396     vmin.u8         q1,  q1,  q10
397     vmin.u8         q8,  q8,  q10       @ mv ? 1 : 0
398     vmin.u8         q9,  q9,  q10
399     vadd.u8         q0,  q0,  q0        @ nnz ? 2 : 0
400     vadd.u8         q1,  q1,  q1
401     vmax.u8         q8,  q8,  q0
402     vmax.u8         q9,  q9,  q1
403     vzip.16         d16, d17
404     vst1.8          {q9}, [r3,:128], ip @ bs[1]
405     vtrn.8          d16, d17
406     vtrn.32         d16, d17
407
408     vst1.8          {q8}, [r3,:128]     @ bs[0]
409     bx              lr
410 .endfunc