]> git.sesse.net Git - x264/blob - common/arm/deblock-a.S
Shrink even more constant arrays
[x264] / common / arm / deblock-a.S
1 /*****************************************************************************
2  * deblock.S: h264 encoder
3  *****************************************************************************
4  * Copyright (C) 2009 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
23 #include "asm.S"
24
25 .fpu neon
26
27 .macro h264_loop_filter_start
28     ldr             ip,  [sp]
29     ldr             ip,  [ip]
30     vmov.32         d24[0], ip
31     and             ip,  ip,  ip, lsl #16
32     ands            ip,  ip,  ip, lsl #8
33     bxlt            lr
34 .endm
35
36 .macro align_push_regs
37     and             ip,  sp,  #15
38     add             ip,  ip,  #32
39     sub             sp,  sp,  ip
40     vst1.64         {d12-d15}, [sp,:128]
41     sub             sp,  sp,  #32
42     vst1.64         {d8-d11},  [sp,:128]
43 .endm
44
45 .macro align_pop_regs
46     vld1.64         {d8-d11},  [sp,:128]!
47     vld1.64         {d12-d15}, [sp,:128], ip
48 .endm
49
50 .macro h264_loop_filter_luma
51     vdup.8          q11, r2         @ alpha
52     vmovl.u8        q12, d24
53     vabd.u8         q6,  q8,  q0    @ abs(p0 - q0)
54     vmovl.u16       q12, d24
55     vabd.u8         q14, q9,  q8    @ abs(p1 - p0)
56     vsli.16         q12, q12, #8
57     vabd.u8         q15, q1,  q0    @ abs(q1 - q0)
58     vsli.32         q12, q12, #16
59     vclt.u8         q6,  q6,  q11   @ < alpha
60     vdup.8          q11, r3         @ beta
61     vclt.s8         q7,  q12, #0
62     vclt.u8         q14, q14, q11   @ < beta
63     vclt.u8         q15, q15, q11   @ < beta
64     vbic            q6,  q6,  q7
65     vabd.u8         q4,  q10, q8    @ abs(p2 - p0)
66     vand            q6,  q6,  q14
67     vabd.u8         q5,  q2,  q0    @ abs(q2 - q0)
68     vclt.u8         q4,  q4,  q11   @ < beta
69     vand            q6,  q6,  q15
70     vclt.u8         q5,  q5,  q11   @ < beta
71     vand            q4,  q4,  q6
72     vand            q5,  q5,  q6
73     vand            q12, q12, q6
74     vrhadd.u8       q14, q8,  q0
75     vsub.i8         q6,  q12, q4
76     vqadd.u8        q7,  q9,  q12
77     vhadd.u8        q10, q10, q14
78     vsub.i8         q6,  q6,  q5
79     vhadd.u8        q14, q2,  q14
80     vmin.u8         q7,  q7,  q10
81     vqsub.u8        q11, q9,  q12
82     vqadd.u8        q2,  q1,  q12
83     vmax.u8         q7,  q7,  q11
84     vqsub.u8        q11, q1,  q12
85     vmin.u8         q14, q2,  q14
86     vmovl.u8        q2,  d0
87     vmax.u8         q14, q14, q11
88     vmovl.u8        q10, d1
89     vsubw.u8        q2,  q2,  d16
90     vsubw.u8        q10, q10, d17
91     vshl.i16        q2,  q2,  #2
92     vshl.i16        q10, q10, #2
93     vaddw.u8        q2,  q2,  d18
94     vaddw.u8        q10, q10, d19
95     vsubw.u8        q2,  q2,  d2
96     vsubw.u8        q10, q10, d3
97     vrshrn.i16      d4,  q2,  #3
98     vrshrn.i16      d5,  q10, #3
99     vbsl            q4,  q7,  q9
100     vbsl            q5,  q14, q1
101     vneg.s8         q7,  q6
102     vmovl.u8        q14, d16
103     vmin.s8         q2,  q2,  q6
104     vmovl.u8        q6,  d17
105     vmax.s8         q2,  q2,  q7
106     vmovl.u8        q11, d0
107     vmovl.u8        q12, d1
108     vaddw.s8        q14, q14, d4
109     vaddw.s8        q6,  q6,  d5
110     vsubw.s8        q11, q11, d4
111     vsubw.s8        q12, q12, d5
112     vqmovun.s16     d16, q14
113     vqmovun.s16     d17, q6
114     vqmovun.s16     d0,  q11
115     vqmovun.s16     d1,  q12
116 .endm
117
118 function x264_deblock_v_luma_neon
119     h264_loop_filter_start
120
121     vld1.64         {d0, d1},  [r0,:128], r1
122     vld1.64         {d2, d3},  [r0,:128], r1
123     vld1.64         {d4, d5},  [r0,:128], r1
124     sub             r0,  r0,  r1, lsl #2
125     sub             r0,  r0,  r1, lsl #1
126     vld1.64         {d20,d21}, [r0,:128], r1
127     vld1.64         {d18,d19}, [r0,:128], r1
128     vld1.64         {d16,d17}, [r0,:128], r1
129
130     align_push_regs
131
132     h264_loop_filter_luma
133
134     sub             r0,  r0,  r1, lsl #1
135     vst1.64         {d8, d9},  [r0,:128], r1
136     vst1.64         {d16,d17}, [r0,:128], r1
137     vst1.64         {d0, d1},  [r0,:128], r1
138     vst1.64         {d10,d11}, [r0,:128]
139
140     align_pop_regs
141     bx              lr
142 .endfunc
143
144 function x264_deblock_h_luma_neon
145     h264_loop_filter_start
146
147     sub             r0,  r0,  #4
148     vld1.64         {d6},  [r0], r1
149     vld1.64         {d20}, [r0], r1
150     vld1.64         {d18}, [r0], r1
151     vld1.64         {d16}, [r0], r1
152     vld1.64         {d0},  [r0], r1
153     vld1.64         {d2},  [r0], r1
154     vld1.64         {d4},  [r0], r1
155     vld1.64         {d26}, [r0], r1
156     vld1.64         {d7},  [r0], r1
157     vld1.64         {d21}, [r0], r1
158     vld1.64         {d19}, [r0], r1
159     vld1.64         {d17}, [r0], r1
160     vld1.64         {d1},  [r0], r1
161     vld1.64         {d3},  [r0], r1
162     vld1.64         {d5},  [r0], r1
163     vld1.64         {d27}, [r0], r1
164
165     TRANSPOSE8x8    q3, q10, q9, q8, q0, q1, q2, q13
166
167     align_push_regs
168
169     h264_loop_filter_luma
170
171     TRANSPOSE4x4    q4, q8, q0, q5
172
173     sub             r0,  r0,  r1, lsl #4
174     add             r0,  r0,  #2
175     vst1.32         {d8[0]},  [r0], r1
176     vst1.32         {d16[0]}, [r0], r1
177     vst1.32         {d0[0]},  [r0], r1
178     vst1.32         {d10[0]}, [r0], r1
179     vst1.32         {d8[1]},  [r0], r1
180     vst1.32         {d16[1]}, [r0], r1
181     vst1.32         {d0[1]},  [r0], r1
182     vst1.32         {d10[1]}, [r0], r1
183     vst1.32         {d9[0]},  [r0], r1
184     vst1.32         {d17[0]}, [r0], r1
185     vst1.32         {d1[0]},  [r0], r1
186     vst1.32         {d11[0]}, [r0], r1
187     vst1.32         {d9[1]},  [r0], r1
188     vst1.32         {d17[1]}, [r0], r1
189     vst1.32         {d1[1]},  [r0], r1
190     vst1.32         {d11[1]}, [r0], r1
191
192     align_pop_regs
193     bx              lr
194 .endfunc
195
196 .macro h264_loop_filter_chroma
197     vdup.8          d22, r2         // alpha
198     vmovl.u8        q12, d24
199     vabd.u8         d26, d16, d0    // abs(p0 - q0)
200     vmovl.u8        q2,  d0
201     vabd.u8         d28, d18, d16   // abs(p1 - p0)
202     vsubw.u8        q2,  q2,  d16
203     vsli.16         d24, d24, #8
204     vshl.i16        q2,  q2,  #2
205     vabd.u8         d30, d2,  d0    // abs(q1 - q0)
206     vaddw.u8        q2,  q2,  d18
207     vclt.u8         d26, d26, d22   // < alpha
208     vsubw.u8        q2,  q2,  d2
209     vdup.8          d22, r3         // beta
210     vclt.s8         d25, d24, #0
211     vrshrn.i16      d4,  q2,  #3
212     vclt.u8         d28, d28, d22   // < beta
213     vbic            d26, d26, d25
214     vclt.u8         d30, d30, d22   // < beta
215     vand            d26, d26, d28
216     vneg.s8         d25, d24
217     vand            d26, d26, d30
218     vmin.s8         d4,  d4,  d24
219     vmovl.u8        q14, d16
220     vand            d4,  d4,  d26
221     vmax.s8         d4,  d4,  d25
222     vmovl.u8        q11, d0
223     vaddw.s8        q14, q14, d4
224     vsubw.s8        q11, q11, d4
225     vqmovun.s16     d16, q14
226     vqmovun.s16     d0,  q11
227 .endm
228
229 function x264_deblock_v_chroma_neon
230     h264_loop_filter_start
231
232     sub             r0,  r0,  r1, lsl #1
233     vld1.64         {d18}, [r0,:64], r1
234     vld1.64         {d16}, [r0,:64], r1
235     vld1.64         {d0},  [r0,:64], r1
236     vld1.64         {d2},  [r0,:64]
237
238     h264_loop_filter_chroma
239
240     sub             r0,  r0,  r1, lsl #1
241     vst1.64         {d16}, [r0,:64], r1
242     vst1.64         {d0},  [r0,:64], r1
243
244     bx              lr
245 .endfunc
246
247 function x264_deblock_h_chroma_neon
248     h264_loop_filter_start
249
250     sub             r0,  r0,  #2
251     vld1.32         {d18[]},  [r0], r1
252     vld1.32         {d16[]},  [r0], r1
253     vld1.32         {d0[]},   [r0], r1
254     vld1.32         {d2[]},   [r0], r1
255     vld1.32         {d18[1]}, [r0], r1
256     vld1.32         {d16[1]}, [r0], r1
257     vld1.32         {d0[1]},  [r0], r1
258     vld1.32         {d2[1]},  [r0], r1
259
260     vtrn.16         d18, d0
261     vtrn.16         d16, d2
262     vtrn.8          d18, d16
263     vtrn.8          d0,  d2
264
265     h264_loop_filter_chroma
266
267     vtrn.16         d18, d0
268     vtrn.16         d16, d2
269     vtrn.8          d18, d16
270     vtrn.8          d0,  d2
271
272     sub             r0,  r0,  r1, lsl #3
273     vst1.32         {d18[0]}, [r0], r1
274     vst1.32         {d16[0]}, [r0], r1
275     vst1.32         {d0[0]},  [r0], r1
276     vst1.32         {d2[0]},  [r0], r1
277     vst1.32         {d18[1]}, [r0], r1
278     vst1.32         {d16[1]}, [r0], r1
279     vst1.32         {d0[1]},  [r0], r1
280     vst1.32         {d2[1]},  [r0], r1
281
282     bx              lr
283 .endfunc