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