1;//
2;//
3;// File Name:  armVCM4P10_DeblockingLuma_unsafe_s.s
4;// OpenMAX DL: v1.0.2
5;// Revision:   12290
6;// Date:       Wednesday, April 9, 2008
7;//
8;// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
9;//
10;//
11;//
12
13        INCLUDE omxtypes_s.h
14        INCLUDE armCOMM_s.h
15
16        M_VARIANTS CortexA8
17
18
19    IF  CortexA8
20
21pThresholds RN 5
22
23;// Pixels
24dP_0        DN D4.U8
25dP_1        DN D5.U8
26dP_2        DN D6.U8
27dP_3        DN D7.U8
28dQ_0        DN D8.U8
29dQ_1        DN D9.U8
30dQ_2        DN D10.U8
31dQ_3        DN D11.U8
32
33
34;// Filtering Decision
35dAlpha      DN D0.U8
36
37dFilt       DN D16.U8
38dAqflg      DN D12.U8
39dApflg      DN D17.U8
40
41dAp0q0      DN D13.U8
42
43;// bSLT4
44dTC0        DN D18.U8
45dTC1        DN D19.U8
46dTC01       DN D18.U8
47
48dTCs        DN D31.S8
49dTC         DN D31.U8
50
51dMask_0     DN D14.U8
52dMask_1     DN D15.U8
53
54dTemp       DN D19.U8
55
56;// Computing P0,Q0
57qDq0p0      QN Q10.S16
58qDp1q1      QN Q11.S16
59qDelta      QN Q10.S16  ; reuse qDq0p0
60dDelta      DN D20.S8
61
62
63;// Computing P1,Q1
64dRp0q0      DN D24.U8
65
66dMaxP       DN D23.U8
67dMinP       DN D22.U8
68
69dMaxQ       DN D19.U8
70dMinQ       DN D21.U8
71
72dDeltaP     DN D26.U8
73dDeltaQ     DN D27.U8
74
75qP_0n       QN Q14.S16
76qQ_0n       QN Q12.S16
77
78dQ_0n       DN D24.U8
79dQ_1n       DN D25.U8
80dP_0n       DN D29.U8
81dP_1n       DN D30.U8
82
83;// bSGE4
84
85qSp0q0      QN Q10.U16
86
87qSp2q1      QN Q11.U16
88qSp0q0p1    QN Q12.U16
89qSp3p2      QN Q13.U16
90dHSp0q1     DN D28.U8
91
92qSq2p1      QN Q11.U16
93qSp0q0q1    QN Q12.U16
94qSq3q2      QN Q13.U16  ;!!
95dHSq0p1     DN D28.U8   ;!!
96
97qTemp1      QN Q11.U16  ;!!;qSp2q1
98qTemp2      QN Q12.U16  ;!!;qSp0q0p1
99
100dP_0t       DN D28.U8   ;!!;dHSp0q1
101dQ_0t       DN D22.U8   ;!!;Temp1
102
103dP_0n       DN D29.U8
104dP_1n       DN D30.U8
105dP_2n       DN D31.U8
106
107dQ_0n       DN D24.U8   ;!!;Temp2
108dQ_1n       DN D25.U8   ;!!;Temp2
109dQ_2n       DN D28.U8   ;!!;dQ_0t
110
111;// Register usage for - armVCM4P10_DeblockingLumabSLT4_unsafe
112;//
113;// Inputs - Pixels             - p0-p3: D4-D7, q0-q3: D8-D11
114;//        - Filter masks       - filt: D16, aqflg: D12, apflg: D17
115;//        - Additional Params  - pThresholds: r5
116;//
117;// Outputs - Pixels            - P0-P1: D29-D30, Q0-Q1: D24-D25
118;//         - Additional Params - pThresholds: r5
119
120;// Registers Corrupted         - D18-D31
121
122
123        M_START armVCM4P10_DeblockingLumabSLT4_unsafe
124
125
126        ;// qDq0p0-10
127        VSUBL       qDp1q1, dP_1, dQ_1
128        VLD1        {dTC0[]}, [pThresholds]!
129        ;// qDp1q1-11
130        VSUBL       qDq0p0, dQ_0, dP_0
131        VLD1        {dTC1[]}, [pThresholds]!
132
133        ;// dRp0q0-24
134        VSHR        qDp1q1, qDp1q1, #2
135
136        ;// dTC01 = (dTC1 << 4) | dTC0
137        ;// dTC01-18
138        VEXT        dTC01, dTC0, dTC1, #4
139        ;// dTemp-19
140        VAND        dTemp, dApflg, dMask_1
141
142        VBIF        dTC01, dMask_0, dFilt
143
144
145        ;// delta = (((q0-p0)<<2) + (p1-q1) + 4) >> 3;
146        ;// dDelta = (qDp1q1 >> 2 + qDq0p0 + 1)>> 1
147
148        ;// qDelta-qDq0p0-10
149        VRHADD      qDelta, qDp1q1, qDq0p0
150        VRHADD      dRp0q0, dP_0, dQ_0
151        VADD        dTC, dTC01, dTemp
152
153        ;// dTC = dTC01 + (dAplg & 1) + (dAqflg & 1)
154
155        VAND        dTemp, dAqflg, dMask_1
156        VQADD       dMaxP, dP_1, dTC01
157        VQMOVN      dDelta, qDelta
158        VADD        dTC, dTC, dTemp
159
160        ;// dMaxP = QADD(dP_1, dTC01)
161        ;// dMinP = QSUB(dP_1, dTC01)
162
163        ;// dMaxP-d23
164        ;// dMinP-d22
165        VQSUB       dMinP, dP_1, dTC01
166
167        ;// dDelta-d20
168
169        ;// dMaxQ = QADD(dQ_1, dTC01)
170        ;// dMinQ = QSUB(dQ_1, dTC01)
171
172        ;// dMaxQ-19
173        ;// dMinQ-21
174        VQADD       dMaxQ, dQ_1, dTC01
175        VHADD       dDeltaP, dRp0q0, dP_2
176        VMIN        dDelta, dDelta, dTCs
177
178        ;// dDelta = (OMX_U8)armClip(0, 255, q0 - delta);
179        VNEG        dTCs, dTCs
180
181        VQSUB       dMinQ, dQ_1, dTC01
182
183        ;// delta = (p2 + ((p0+q0+1)>>1) - (p1<<1))>>1;
184        ;// delta = armClip(-tC0, tC0, delta);
185        ;// pQ0[-2*Step] = (OMX_U8)(p1 + delta);
186
187        ;// dDeltaP = (dP_2 + dRp0q0)>>1;
188        ;// dP_1n = armClip(dP_1 - dTC01, dP_1 + dTC01, dDeltaP);
189        ;// dP_1n = armClip(MinP, MaxP, dDeltaP);
190
191        ;// delta = (q2 + ((p0+q0+1)>>1) - (q1<<1))>>1;
192        ;// delta = armClip(-tC0, tC0, delta);
193        ;// pQ0[1*Step] = (OMX_U8)(q1 + delta);
194
195        ;// dDeltaQ = (dQ_2 + dRp0q0)>>1;
196        ;// dQ_1n = armClip(dQ_1 - dTC01, dQ_1 + dTC01, dDeltaQ);
197        ;// dQ_1n = armClip(MinQ, MaxQ, dDeltaQ);
198
199        ;// dDeltaP-26
200        VHADD       dDeltaQ, dRp0q0, dQ_2
201
202        ;// dDeltaQ-27
203
204        ;// dP_0n - 29
205        ;// dP_1n - 30
206        ;// dQ_0n - 24
207        ;// dQ_1n - 25
208
209        ;// delta = (q2 + ((p0+q0+1)>>1) - (q1<<1))>>1;
210        ;// dDeltaQ = (dQ_2 + dRp0q0)>>1;
211
212        VMAX        dP_1n, dDeltaP, dMinP
213        VMAX        dDelta, dDelta, dTCs
214
215        ;// pQ0[-1*Step] = (OMX_U8)armClip(0, 255, dP_0 - delta);
216        ;// pQ0[0*Step] = (OMX_U8)armClip(0, 255, dQ_0 - delta);
217
218        ;// dP_0n = (OMX_U8)armClip(0, 255, dP_0 - dDelta);
219        ;// dQ_0n = (OMX_U8)armClip(0, 255, dP_0 - dDelta);
220
221        ;// qP_0n - 14
222        ;// qQ_0n - 12
223
224        VMOVL       qP_0n, dP_0
225        VMOVL       qQ_0n, dQ_0
226
227        VADDW       qP_0n, qP_0n, dDelta
228        VSUBW       qQ_0n, qQ_0n, dDelta
229
230        VQMOVUN     dP_0n, qP_0n
231        VQMOVUN     dQ_0n, qQ_0n
232
233        VMAX        dQ_1n, dDeltaQ, dMinQ
234
235        VMIN        dP_1n, dP_1n, dMaxP
236        VMIN        dQ_1n, dQ_1n, dMaxQ
237        VBIF        dP_0n, dP_0, dFilt
238
239        VBIF        dP_1n, dP_1, dApflg
240        VBIF        dQ_0n, dQ_0, dFilt
241        VBIF        dQ_1n, dQ_1, dAqflg
242
243        M_END
244
245;// Register usage for - armVCM4P10_DeblockingLumabSGE4_unsafe()
246;//
247;// Inputs - Pixels             - p0-p3: D4-D7, q0-q3: D8-D11
248;//        - Filter masks       - filt: D16, aqflg: D12, apflg: D17
249;//        - Additional Params  - alpha: D0, dMask_1: D15
250;//
251;// Outputs - Pixels            - P0-P2: D29-D31, Q0-Q2: D24,D25,D28
252
253;// Registers Corrupted         - D18-D31
254
255        M_START armVCM4P10_DeblockingLumabSGE4_unsafe
256
257
258        ;// ap<beta && armAbs(p0-q0)<((alpha>>2)+2)
259        ;// aq<beta && armAbs(p0-q0)<((alpha>>2)+2)
260
261        ;// ( dApflg & dAp0q0 < (dAlpha >> 2 + 2) )
262        ;// ( dAqflg & dAp0q0 < (dAlpha >> 2 + 2) )
263
264        ;// ( dApflg = dApflg & dAp0q0 < (dTemp + dMask_1 + dMask_1) )
265        ;// ( dAqflg = dAqflg & dAp0q0 < (dTemp + dMask_1 + dMask_1) )
266
267        ;// P Filter
268
269        VSHR        dTemp, dAlpha, #2
270        VADD        dTemp, dTemp, dMask_1
271
272        ;// qSp0q0-10
273        VADDL       qSp0q0, dQ_0, dP_0
274        VADD        dTemp, dTemp, dMask_1
275
276        ;// qSp2q1-11
277        ;// qSp0q0p1-12
278        VADDL       qSp2q1, dP_2, dQ_1
279        VADDW       qSp0q0p1, qSp0q0, dP_1
280
281        VCGT        dTemp, dTemp, dAp0q0
282        VSHR        qSp2q1, #1
283
284        ;// pQ0[-1*Step] = (OMX_U8)((p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4)>>3);
285        ;// pQ0[-1*Step] = ( ( (p0 + q0 + p1) + (p2 + q1)>>1 ) >> 1 + 1 ) >> 1
286
287        ;// dP_0n = ( ( (qSp0q0 + dP_1) + qSp2q1>>1 ) >> 1 + 1 ) >> 1
288        ;// dP_0n = ( ( qSp0q0p1 + qSp2q1>>1 ) >> 1 + 1 ) >> 1
289        ;// dP_0n = ( qTemp1 + 1 ) >> 1
290
291        ;// pQ0[-2*Step] = (OMX_U8)((p2 + p1 + p0 + q0 + 2)>>2);
292
293        ;// dP_1n = (OMX_U8)((dP_2 + qSp0q0p1 + 2)>>2);
294        ;// dP_1n = (OMX_U8)((qTemp2 + 2)>>2);
295
296        ;// pQ0[-3*Step] = (OMX_U8)((2*p3 + 3*p2 + p1 + p0 + q0 + 4)>>3);
297        ;// pQ0[-3*Step] = (OMX_U8)(( (p3 + p2) + (p1 + p0 + q0 + p2) >> 1 + 2)>>2);
298
299        ;// dP_2n = (OMX_U8)(( qSp3p2 + (dP_2 + qSp0q0p1) >> 1 + 2) >> 2);
300        ;// dP_2n = (OMX_U8)(( qSp3p2 + qTemp2 >> 1 + 2) >> 2);
301
302        ;// qTemp1-qSp2q1-11
303        ;// qTemp2-qSp0q0p1-12
304        VHADD       qTemp1, qSp0q0p1, qSp2q1
305        VADDW       qTemp2, qSp0q0p1, dP_2
306
307        ;// qSp3p2-13
308        VADDL       qSp3p2, dP_3, dP_2
309
310        VAND        dApflg, dApflg, dTemp
311        VHADD       dHSp0q1, dP_0, dQ_1
312        VSRA        qSp3p2, qTemp2, #1
313        ;// dHSp0q1-28
314        VAND        dAqflg, dAqflg, dTemp
315
316        ;// dP_0n-29
317        ;// dP_0t-dHSp0q1-28
318        VQRSHRN     dP_0n, qTemp1, #1
319        VRHADD      dP_0t, dHSp0q1, dP_1
320
321        ;// dP_1n-30
322        VQRSHRN     dP_1n, qTemp2, #2
323
324        VADDL       qSq2p1, dQ_2, dP_1
325        VADDW       qSp0q0q1, qSp0q0, dQ_1
326
327        VBIF        dP_0n, dP_0t, dApflg
328
329        ;// Q Filter
330
331        ;// pQ0[0*Step] = (OMX_U8)((q2 + 2*q1 + 2*q0 + 2*p0 + p1 + 4)>>3);
332        ;// pQ0[0*Step] = ( ( (p0 + q0 + q1) + (q2 + p1)>>1 ) >> 1 + 1 ) >> 1
333
334        ;// dQ_0n = ( ( (qSp0q0 + dQ_1) + qSq2p1>>1 ) >> 1 + 1 ) >> 1
335        ;// dQ_0n = ( ( qSp0q0q1 + qSq2p1>>1 ) >> 1 + 1 ) >> 1
336        ;// dQ_0n = ( qTemp1 + 1 ) >> 1
337
338        ;// pQ0[1*Step] = (OMX_U8)((q2 + q1 + q0 + q0 + 2)>>2);
339
340        ;// dQ_1n = (OMX_U8)((dQ_2 + qSp0q0q1 + 2)>>2);
341        ;// dQ_1n = (OMX_U8)((qTemp2 + 2)>>2);
342
343        ;// pQ0[2*Step] = (OMX_U8)((2*q3 + 3*q2 + q1 + q0 + p0 + 4)>>3);
344        ;// pQ0[2*Step] = (OMX_U8)(( (q3 + q2) + (q1 + p0 + q0 + q2) >> 1 + 2)>>2);
345
346        ;// dQ_2n = (OMX_U8)(( qSq3q2 + (dQ_2 + qSp0q0q1) >> 1 + 2) >> 2);
347        ;// dQ_2n = (OMX_U8)(( qSq3q2 + qTemp2 >> 1 + 2) >> 2);
348
349        ;// qTemp1-qSp2q1-11
350        ;// qTemp2-qSp0q0p1-12
351        ;// qSq2p1-11
352        ;// qSp0q0q1-12
353
354
355        ;// qTemp2-qSp0q0p1-12
356        ;// qTemp1-qSq2p1-11
357        ;// qSq3q2-13
358        ;// dP_2n-31
359
360        VQRSHRN     dP_2n, qSp3p2, #2
361        VADDL       qSq3q2, dQ_3, dQ_2
362
363        VSHR        qSq2p1, #1
364
365        VHADD       qTemp1, qSp0q0q1, qSq2p1
366        VADDW       qTemp2, qSp0q0q1, dQ_2
367
368        ;// dHSq0p1-28
369        VHADD       dHSq0p1, dQ_0, dP_1
370
371        VBIF        dP_0n, dP_0, dFilt
372        VBIF        dP_1n, dP_1, dApflg
373
374        VSRA        qSq3q2, qTemp2, #1
375
376        ;// dQ_1-Temp2-25
377        ;// dQ_0-Temp2-24
378        VQRSHRN     dQ_1n, qTemp2, #2
379        VQRSHRN     dQ_0n, qTemp1, #1
380
381        ;// dQ_0t-Temp1-22
382        VRHADD      dQ_0t, dHSq0p1, dQ_1
383        VBIF        dQ_1n, dQ_1, dAqflg
384
385        VBIF        dP_2n, dP_2, dApflg
386        VBIF        dQ_0n, dQ_0t, dAqflg
387        VQRSHRN     dQ_2n, qSq3q2, #2
388        VBIF        dQ_0n, dQ_0, dFilt
389        VBIF        dQ_2n, dQ_2, dAqflg
390
391        M_END
392
393    ENDIF
394
395
396        END
397