summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/armVCM4P10_DeblockingLuma_unsafe_s.s
blob: 0afe4fd73af73f3d77294daf1349feac88a25917 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
;//
;// 
;// File Name:  armVCM4P10_DeblockingLuma_unsafe_s.s
;// OpenMAX DL: v1.0.2
;// Revision:   12290
;// Date:       Wednesday, April 9, 2008
;// 
;// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
;// 
;// 
;//

        INCLUDE omxtypes_s.h
        INCLUDE armCOMM_s.h
        
        M_VARIANTS CortexA8


    IF  CortexA8
        
pThresholds RN 5

;// Pixels
dP_0        DN D4.U8
dP_1        DN D5.U8  
dP_2        DN D6.U8  
dP_3        DN D7.U8  
dQ_0        DN D8.U8  
dQ_1        DN D9.U8  
dQ_2        DN D10.U8 
dQ_3        DN D11.U8 


;// Filtering Decision
dAlpha      DN D0.U8

dFilt       DN D16.U8
dAqflg      DN D12.U8
dApflg      DN D17.U8 

dAp0q0      DN D13.U8

;// bSLT4
dTC0        DN D18.U8   
dTC1        DN D19.U8   
dTC01       DN D18.U8   

dTCs        DN D31.S8
dTC         DN D31.U8

dMask_0     DN D14.U8
dMask_1     DN D15.U8    

dTemp       DN D19.U8

;// Computing P0,Q0
qDq0p0      QN Q10.S16
qDp1q1      QN Q11.S16
qDelta      QN Q10.S16  ; reuse qDq0p0
dDelta      DN D20.S8


;// Computing P1,Q1
dRp0q0      DN D24.U8

dMaxP       DN D23.U8
dMinP       DN D22.U8

dMaxQ       DN D19.U8
dMinQ       DN D21.U8

dDeltaP     DN D26.U8
dDeltaQ     DN D27.U8

qP_0n       QN Q14.S16
qQ_0n       QN Q12.S16

dQ_0n       DN D24.U8
dQ_1n       DN D25.U8
dP_0n       DN D29.U8
dP_1n       DN D30.U8

;// bSGE4

qSp0q0      QN Q10.U16

qSp2q1      QN Q11.U16
qSp0q0p1    QN Q12.U16
qSp3p2      QN Q13.U16
dHSp0q1     DN D28.U8

qSq2p1      QN Q11.U16
qSp0q0q1    QN Q12.U16
qSq3q2      QN Q13.U16  ;!!
dHSq0p1     DN D28.U8   ;!!

qTemp1      QN Q11.U16  ;!!;qSp2q1 
qTemp2      QN Q12.U16  ;!!;qSp0q0p1        

dP_0t       DN D28.U8   ;!!;dHSp0q1        
dQ_0t       DN D22.U8   ;!!;Temp1        

dP_0n       DN D29.U8
dP_1n       DN D30.U8
dP_2n       DN D31.U8

dQ_0n       DN D24.U8   ;!!;Temp2        
dQ_1n       DN D25.U8   ;!!;Temp2        
dQ_2n       DN D28.U8   ;!!;dQ_0t        

;// Register usage for - armVCM4P10_DeblockingLumabSLT4_unsafe
;//
;// Inputs - Pixels             - p0-p3: D4-D7, q0-q3: D8-D11
;//        - Filter masks       - filt: D16, aqflg: D12, apflg: D17
;//        - Additional Params  - pThresholds: r5
;//         
;// Outputs - Pixels            - P0-P1: D29-D30, Q0-Q1: D24-D25
;//         - Additional Params - pThresholds: r5

;// Registers Corrupted         - D18-D31


        M_START armVCM4P10_DeblockingLumabSLT4_unsafe

        
        ;// qDq0p0-10
        VSUBL       qDp1q1, dP_1, dQ_1      
        VLD1        {dTC0[]}, [pThresholds]!
        ;// qDp1q1-11
        VSUBL       qDq0p0, dQ_0, dP_0      
        VLD1        {dTC1[]}, [pThresholds]!

        ;// dRp0q0-24
        VSHR        qDp1q1, qDp1q1, #2      
    
        ;// dTC01 = (dTC1 << 4) | dTC0
        ;// dTC01-18
        VEXT        dTC01, dTC0, dTC1, #4
        ;// dTemp-19
        VAND        dTemp, dApflg, dMask_1
        
        VBIF        dTC01, dMask_0, dFilt
    

        ;// delta = (((q0-p0)<<2) + (p1-q1) + 4) >> 3;
        ;// dDelta = (qDp1q1 >> 2 + qDq0p0 + 1)>> 1

        ;// qDelta-qDq0p0-10
        VRHADD      qDelta, qDp1q1, qDq0p0  
        VRHADD      dRp0q0, dP_0, dQ_0      
        VADD        dTC, dTC01, dTemp

        ;// dTC = dTC01 + (dAplg & 1) + (dAqflg & 1)
        
        VAND        dTemp, dAqflg, dMask_1
        VQADD       dMaxP, dP_1, dTC01      
        VQMOVN      dDelta, qDelta
        VADD        dTC, dTC, dTemp

        ;// dMaxP = QADD(dP_1, dTC01)
        ;// dMinP = QSUB(dP_1, dTC01)
 
        ;// dMaxP-d23
        ;// dMinP-d22
        VQSUB       dMinP, dP_1, dTC01      

        ;// dDelta-d20

        ;// dMaxQ = QADD(dQ_1, dTC01)
        ;// dMinQ = QSUB(dQ_1, dTC01)
 
        ;// dMaxQ-19
        ;// dMinQ-21
        VQADD       dMaxQ, dQ_1, dTC01
        VHADD       dDeltaP, dRp0q0, dP_2   
        VMIN        dDelta, dDelta, dTCs

        ;// dDelta = (OMX_U8)armClip(0, 255, q0 - delta);
        VNEG        dTCs, dTCs
        
        VQSUB       dMinQ, dQ_1, dTC01

        ;// delta = (p2 + ((p0+q0+1)>>1) - (p1<<1))>>1;
        ;// delta = armClip(-tC0, tC0, delta);
        ;// pQ0[-2*Step] = (OMX_U8)(p1 + delta);

        ;// dDeltaP = (dP_2 + dRp0q0)>>1;
        ;// dP_1n = armClip(dP_1 - dTC01, dP_1 + dTC01, dDeltaP);
        ;// dP_1n = armClip(MinP, MaxP, dDeltaP);
        
        ;// delta = (q2 + ((p0+q0+1)>>1) - (q1<<1))>>1;
        ;// delta = armClip(-tC0, tC0, delta);
        ;// pQ0[1*Step] = (OMX_U8)(q1 + delta);

        ;// dDeltaQ = (dQ_2 + dRp0q0)>>1;
        ;// dQ_1n = armClip(dQ_1 - dTC01, dQ_1 + dTC01, dDeltaQ);
        ;// dQ_1n = armClip(MinQ, MaxQ, dDeltaQ);
        
        ;// dDeltaP-26
        VHADD       dDeltaQ, dRp0q0, dQ_2   

        ;// dDeltaQ-27
        
        ;// dP_0n - 29
        ;// dP_1n - 30
        ;// dQ_0n - 24
        ;// dQ_1n - 25
        
        ;// delta = (q2 + ((p0+q0+1)>>1) - (q1<<1))>>1;
        ;// dDeltaQ = (dQ_2 + dRp0q0)>>1;

        VMAX        dP_1n, dDeltaP, dMinP   
        VMAX        dDelta, dDelta, dTCs

        ;// pQ0[-1*Step] = (OMX_U8)armClip(0, 255, dP_0 - delta);
        ;// pQ0[0*Step] = (OMX_U8)armClip(0, 255, dQ_0 - delta);

        ;// dP_0n = (OMX_U8)armClip(0, 255, dP_0 - dDelta);
        ;// dQ_0n = (OMX_U8)armClip(0, 255, dP_0 - dDelta);
        
        ;// qP_0n - 14
        ;// qQ_0n - 12
        
        VMOVL       qP_0n, dP_0
        VMOVL       qQ_0n, dQ_0

        VADDW       qP_0n, qP_0n, dDelta
        VSUBW       qQ_0n, qQ_0n, dDelta
        
        VQMOVUN     dP_0n, qP_0n
        VQMOVUN     dQ_0n, qQ_0n
        
        VMAX        dQ_1n, dDeltaQ, dMinQ

        VMIN        dP_1n, dP_1n, dMaxP
        VMIN        dQ_1n, dQ_1n, dMaxQ
        VBIF        dP_0n, dP_0, dFilt      

        VBIF        dP_1n, dP_1, dApflg
        VBIF        dQ_0n, dQ_0, dFilt  
        VBIF        dQ_1n, dQ_1, dAqflg

        M_END

;// Register usage for - armVCM4P10_DeblockingLumabSGE4_unsafe()
;//
;// Inputs - Pixels             - p0-p3: D4-D7, q0-q3: D8-D11
;//        - Filter masks       - filt: D16, aqflg: D12, apflg: D17
;//        - Additional Params  - alpha: D0, dMask_1: D15
;//         
;// Outputs - Pixels            - P0-P2: D29-D31, Q0-Q2: D24,D25,D28

;// Registers Corrupted         - D18-D31

        M_START armVCM4P10_DeblockingLumabSGE4_unsafe
    

        ;// ap<beta && armAbs(p0-q0)<((alpha>>2)+2)        
        ;// aq<beta && armAbs(p0-q0)<((alpha>>2)+2)        

        ;// ( dApflg & dAp0q0 < (dAlpha >> 2 + 2) )
        ;// ( dAqflg & dAp0q0 < (dAlpha >> 2 + 2) )

        ;// ( dApflg = dApflg & dAp0q0 < (dTemp + dMask_1 + dMask_1) )
        ;// ( dAqflg = dAqflg & dAp0q0 < (dTemp + dMask_1 + dMask_1) )

        ;// P Filter

        VSHR        dTemp, dAlpha, #2
        VADD        dTemp, dTemp, dMask_1

        ;// qSp0q0-10
        VADDL       qSp0q0, dQ_0, dP_0      
        VADD        dTemp, dTemp, dMask_1

        ;// qSp2q1-11
        ;// qSp0q0p1-12
        VADDL       qSp2q1, dP_2, dQ_1      
        VADDW       qSp0q0p1, qSp0q0, dP_1  

        VCGT        dTemp, dTemp, dAp0q0
        VSHR        qSp2q1, #1              

        ;// pQ0[-1*Step] = (OMX_U8)((p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4)>>3);
        ;// pQ0[-1*Step] = ( ( (p0 + q0 + p1) + (p2 + q1)>>1 ) >> 1 + 1 ) >> 1

        ;// dP_0n = ( ( (qSp0q0 + dP_1) + qSp2q1>>1 ) >> 1 + 1 ) >> 1
        ;// dP_0n = ( ( qSp0q0p1 + qSp2q1>>1 ) >> 1 + 1 ) >> 1
        ;// dP_0n = ( qTemp1 + 1 ) >> 1
        
        ;// pQ0[-2*Step] = (OMX_U8)((p2 + p1 + p0 + q0 + 2)>>2);
        
        ;// dP_1n = (OMX_U8)((dP_2 + qSp0q0p1 + 2)>>2);
        ;// dP_1n = (OMX_U8)((qTemp2 + 2)>>2);
        
        ;// pQ0[-3*Step] = (OMX_U8)((2*p3 + 3*p2 + p1 + p0 + q0 + 4)>>3);
        ;// pQ0[-3*Step] = (OMX_U8)(( (p3 + p2) + (p1 + p0 + q0 + p2) >> 1 + 2)>>2);

        ;// dP_2n = (OMX_U8)(( qSp3p2 + (dP_2 + qSp0q0p1) >> 1 + 2) >> 2);
        ;// dP_2n = (OMX_U8)(( qSp3p2 + qTemp2 >> 1 + 2) >> 2);

        ;// qTemp1-qSp2q1-11
        ;// qTemp2-qSp0q0p1-12
        VHADD       qTemp1, qSp0q0p1, qSp2q1
        VADDW       qTemp2, qSp0q0p1, dP_2  
        
        ;// qSp3p2-13
        VADDL       qSp3p2, dP_3, dP_2      

        VAND        dApflg, dApflg, dTemp
        VHADD       dHSp0q1, dP_0, dQ_1     
        VSRA        qSp3p2, qTemp2, #1      
        ;// dHSp0q1-28
        VAND        dAqflg, dAqflg, dTemp

        ;// dP_0n-29
        ;// dP_0t-dHSp0q1-28
        VQRSHRN     dP_0n, qTemp1, #1
        VRHADD      dP_0t, dHSp0q1, dP_1    

        ;// dP_1n-30
        VQRSHRN     dP_1n, qTemp2, #2
        
        VADDL       qSq2p1, dQ_2, dP_1          
        VADDW       qSp0q0q1, qSp0q0, dQ_1      
        
        VBIF        dP_0n, dP_0t, dApflg    

        ;// Q Filter

        ;// pQ0[0*Step] = (OMX_U8)((q2 + 2*q1 + 2*q0 + 2*p0 + p1 + 4)>>3);
        ;// pQ0[0*Step] = ( ( (p0 + q0 + q1) + (q2 + p1)>>1 ) >> 1 + 1 ) >> 1

        ;// dQ_0n = ( ( (qSp0q0 + dQ_1) + qSq2p1>>1 ) >> 1 + 1 ) >> 1
        ;// dQ_0n = ( ( qSp0q0q1 + qSq2p1>>1 ) >> 1 + 1 ) >> 1
        ;// dQ_0n = ( qTemp1 + 1 ) >> 1
        
        ;// pQ0[1*Step] = (OMX_U8)((q2 + q1 + q0 + q0 + 2)>>2);
        
        ;// dQ_1n = (OMX_U8)((dQ_2 + qSp0q0q1 + 2)>>2);
        ;// dQ_1n = (OMX_U8)((qTemp2 + 2)>>2);
        
        ;// pQ0[2*Step] = (OMX_U8)((2*q3 + 3*q2 + q1 + q0 + p0 + 4)>>3);
        ;// pQ0[2*Step] = (OMX_U8)(( (q3 + q2) + (q1 + p0 + q0 + q2) >> 1 + 2)>>2);

        ;// dQ_2n = (OMX_U8)(( qSq3q2 + (dQ_2 + qSp0q0q1) >> 1 + 2) >> 2);
        ;// dQ_2n = (OMX_U8)(( qSq3q2 + qTemp2 >> 1 + 2) >> 2);

        ;// qTemp1-qSp2q1-11
        ;// qTemp2-qSp0q0p1-12
        ;// qSq2p1-11
        ;// qSp0q0q1-12


        ;// qTemp2-qSp0q0p1-12
        ;// qTemp1-qSq2p1-11
        ;// qSq3q2-13
        ;// dP_2n-31
        
        VQRSHRN     dP_2n, qSp3p2, #2
        VADDL       qSq3q2, dQ_3, dQ_2          

        VSHR        qSq2p1, #1                  

        VHADD       qTemp1, qSp0q0q1, qSq2p1
        VADDW       qTemp2, qSp0q0q1, dQ_2      

        ;// dHSq0p1-28
        VHADD       dHSq0p1, dQ_0, dP_1         

        VBIF        dP_0n, dP_0, dFilt
        VBIF        dP_1n, dP_1, dApflg

        VSRA        qSq3q2, qTemp2, #1          

        ;// dQ_1-Temp2-25
        ;// dQ_0-Temp2-24
        VQRSHRN     dQ_1n, qTemp2, #2
        VQRSHRN     dQ_0n, qTemp1, #1

        ;// dQ_0t-Temp1-22
        VRHADD      dQ_0t, dHSq0p1, dQ_1
        VBIF        dQ_1n, dQ_1, dAqflg         

        VBIF        dP_2n, dP_2, dApflg        
        VBIF        dQ_0n, dQ_0t, dAqflg        
        VQRSHRN     dQ_2n, qSq3q2, #2
        VBIF        dQ_0n, dQ_0, dFilt
        VBIF        dQ_2n, dQ_2, dAqflg       

        M_END
        
    ENDIF  


        END