Home | History | Annotate | Download | only in src
      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 
     21 pThresholds RN 5
     22 
     23 ;// Pixels
     24 dP_0        DN D4.U8
     25 dP_1        DN D5.U8
     26 dP_2        DN D6.U8
     27 dP_3        DN D7.U8
     28 dQ_0        DN D8.U8
     29 dQ_1        DN D9.U8
     30 dQ_2        DN D10.U8
     31 dQ_3        DN D11.U8
     32 
     33 
     34 ;// Filtering Decision
     35 dAlpha      DN D0.U8
     36 
     37 dFilt       DN D16.U8
     38 dAqflg      DN D12.U8
     39 dApflg      DN D17.U8
     40 
     41 dAp0q0      DN D13.U8
     42 
     43 ;// bSLT4
     44 dTC0        DN D18.U8
     45 dTC1        DN D19.U8
     46 dTC01       DN D18.U8
     47 
     48 dTCs        DN D31.S8
     49 dTC         DN D31.U8
     50 
     51 dMask_0     DN D14.U8
     52 dMask_1     DN D15.U8
     53 
     54 dTemp       DN D19.U8
     55 
     56 ;// Computing P0,Q0
     57 qDq0p0      QN Q10.S16
     58 qDp1q1      QN Q11.S16
     59 qDelta      QN Q10.S16  ; reuse qDq0p0
     60 dDelta      DN D20.S8
     61 
     62 
     63 ;// Computing P1,Q1
     64 dRp0q0      DN D24.U8
     65 
     66 dMaxP       DN D23.U8
     67 dMinP       DN D22.U8
     68 
     69 dMaxQ       DN D19.U8
     70 dMinQ       DN D21.U8
     71 
     72 dDeltaP     DN D26.U8
     73 dDeltaQ     DN D27.U8
     74 
     75 qP_0n       QN Q14.S16
     76 qQ_0n       QN Q12.S16
     77 
     78 dQ_0n       DN D24.U8
     79 dQ_1n       DN D25.U8
     80 dP_0n       DN D29.U8
     81 dP_1n       DN D30.U8
     82 
     83 ;// bSGE4
     84 
     85 qSp0q0      QN Q10.U16
     86 
     87 qSp2q1      QN Q11.U16
     88 qSp0q0p1    QN Q12.U16
     89 qSp3p2      QN Q13.U16
     90 dHSp0q1     DN D28.U8
     91 
     92 qSq2p1      QN Q11.U16
     93 qSp0q0q1    QN Q12.U16
     94 qSq3q2      QN Q13.U16  ;!!
     95 dHSq0p1     DN D28.U8   ;!!
     96 
     97 qTemp1      QN Q11.U16  ;!!;qSp2q1
     98 qTemp2      QN Q12.U16  ;!!;qSp0q0p1
     99 
    100 dP_0t       DN D28.U8   ;!!;dHSp0q1
    101 dQ_0t       DN D22.U8   ;!!;Temp1
    102 
    103 dP_0n       DN D29.U8
    104 dP_1n       DN D30.U8
    105 dP_2n       DN D31.U8
    106 
    107 dQ_0n       DN D24.U8   ;!!;Temp2
    108 dQ_1n       DN D25.U8   ;!!;Temp2
    109 dQ_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