1@/****************************************************************************** 2@ * 3@ * Copyright (C) 2018 The Android Open Source Project 4@ * 5@ * Licensed under the Apache License, Version 2.0 (the "License"); 6@ * you may not use this file except in compliance with the License. 7@ * You may obtain a copy of the License at: 8@ * 9@ * http://www.apache.org/licenses/LICENSE-2.0 10@ * 11@ * Unless required by applicable law or agreed to in writing, software 12@ * distributed under the License is distributed on an "AS IS" BASIS, 13@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14@ * See the License for the specific language governing permissions and 15@ * limitations under the License. 16@ * 17@ ***************************************************************************** 18@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19@*/ 20 21 22.text 23.p2align 2 24.global ixheaacd_pretwiddle_compute_armv7 25 26ixheaacd_pretwiddle_compute_armv7: 27 28 STMFD sp!, {R4-R12} 29 VPUSH {d8 - d15} 30 31 MOVW R8, #7500 32 ADD R3, R3, R8 33 LDR R4, [sp, #100] 34 LDR R5, [sp, #104] 35 36 LSL R7, R4, #4 37 ADD R7, R2, R7 38 SUB R7, R7, #4 39 40 MVN R5, R5 41 ADD R5, R5, #1 42 43ARM_PROLOGUE: 44 LDR R8, [R3], #4 45 LDR R9, [R0], #4 46 47 SMULWB R12, R9, R8 48 LDR R10, [R1], #-4 49 SMULWT R11, R9, R8 50 SMLAWT R9, R10, R8, R12 51 SMULWB R6, R10, R8 52 53 MVN R9, R9 54 ADD R9, R9, #1 55 56 SUB R11, R11, R6 57 58 CMP R5, #0 59 BGT NEXT 60 MVN R8, R5 61 ADD R8, R8, #1 62 ASR R11, R11, R8 63 ASR R9, R9, R8 64 B NEXT1 65 66NEXT: 67 LSL R11, R11, R5 68 LSL R9, R9, R5 69 70 71 72NEXT1: 73 STR R9, [R2], #4 74 STR R11, [R2], #4 75 76 CMP R4, #0x100 77 BNE NXT 78 MOV R6, #4 79 B NXT1 80NXT: 81 MOV R6, #32 82 ADD R3, R3, #28 83 84NXT1: 85 SUB R4, R4, #1 86 ASR R4, R4, #2 87 SUB R7, R7, #28 88 89 90 91 92 93 94 95 96 97 98 99 100NEON_PROLOGUE: 101 102 MOV R8, #-32 103 VDUP.32 Q7, R5 104 SUB R1, R1, #28 105 106 VLD2.16 {D8[0], D9[0]}, [R3], R6 107 VLD2.16 {D8[1], D9[1]}, [R3], R6 108 VLD2.16 {D8[2], D9[2]}, [R3], R6 109 VLD2.16 {D8[3], D9[3]}, [R3], R6 110 111 VREV64.16 Q5, Q4 112 113 VLD4.16 {D0, D1, D2, D3}, [R0]! 114 VLD4.16 {D4, D5, D6, D7}, [R1], R8 115 116 VREV64.16 Q0, Q0 117 VREV64.16 Q2, Q2 118 119 120 121 122 123 124 VMULL.U16 Q15, D2, D9 125 VMULL.U16 Q14, D4, D9 126 VMULL.U16 Q13, D2, D8 127 VMULL.U16 Q12, D4, D8 128 129 VSHR.U32 Q15, Q15, #16 130 VSHR.U32 Q14, Q14, #16 131 VSHR.U32 Q13, Q13, #16 132 VSHR.U32 Q12, Q12, #16 133 134 VMLAL.S16 Q15, D3, D9 135 VMLAL.S16 Q14, D5, D9 136 VMLAL.S16 Q13, D3, D8 137 VMLAL.S16 Q12, D5, D8 138 139 VADD.I32 Q14, Q13, Q14 140 VNEG.S32 Q14, Q14 141 VSUB.I32 Q15, Q15, Q12 142 143 VMULL.U16 Q11, D0, D11 144 VMULL.U16 Q10, D6, D11 145 VMULL.U16 Q9, D0, D10 146 VMULL.U16 Q8, D6, D10 147 148 VSHR.U32 Q11, Q11, #16 149 VSHR.U32 Q10, Q10, #16 150 VSHR.U32 Q9, Q9, #16 151 VSHR.U32 Q8, Q8, #16 152 153 VMLAL.S16 Q11, D1, D11 154 VLD2.16 {D8[0], D9[0]}, [R3], R6 155 156 VMLAL.S16 Q10, D7, D11 157 VLD2.16 {D8[1], D9[1]}, [R3], R6 158 159 VMLAL.S16 Q9, D1, D10 160 VLD2.16 {D8[2], D9[2]}, [R3], R6 161 162 VMLAL.S16 Q8, D7, D10 163 VLD2.16 {D8[3], D9[3]}, [R3], R6 164 165 VADD.I32 Q10, Q10, Q9 166 167 VNEG.S32 Q10, Q10 168 VREV64.16 Q5, Q4 169 170 VSUB.I32 Q11, Q8, Q11 171 VLD4.16 {D0, D1, D2, D3}, [R0]! 172 173 174 175 VSHL.S32 Q10, Q10, Q7 176 VLD4.16 {D4, D5, D6, D7}, [R1], R8 177 178 VREV64.16 Q0, Q0 179 VSHL.S32 Q11, Q11, Q7 180 181 VREV64.16 Q2, Q2 182 VSHL.S32 Q9, Q15, Q7 183 VSHL.S32 Q8, Q14, Q7 184 185 186 187 SUB R4, R4, #2 188 189CORE_LOOP_PTC: 190 VMULL.U16 Q15, D2, D9 191 VST2.32 {Q8, Q9}, [R2]! 192 VMULL.U16 Q14, D4, D9 193 194 VMULL.U16 Q13, D2, D8 195 VST2.32 {Q10, Q11}, [R7], R8 196 VMULL.U16 Q12, D4, D8 197 198 VSHR.U32 Q15, Q15, #16 199 VSHR.U32 Q14, Q14, #16 200 VSHR.U32 Q13, Q13, #16 201 VSHR.U32 Q12, Q12, #16 202 203 VMLAL.S16 Q15, D3, D9 204 VMLAL.S16 Q14, D5, D9 205 VMLAL.S16 Q13, D3, D8 206 VMLAL.S16 Q12, D5, D8 207 208 VADD.I32 Q14, Q13, Q14 209 VNEG.S32 Q14, Q14 210 VSUB.I32 Q15, Q15, Q12 211 212 VMULL.U16 Q11, D0, D11 213 VLD2.16 {D8[0], D9[0]}, [R3], R6 214 VMULL.U16 Q10, D6, D11 215 216 VMULL.U16 Q9, D0, D10 217 VLD2.16 {D8[1], D9[1]}, [R3], R6 218 VMULL.U16 Q8, D6, D10 219 220 VSHR.U32 Q11, Q11, #16 221 VLD2.16 {D8[2], D9[2]}, [R3], R6 222 VSHR.U32 Q10, Q10, #16 223 224 VSHR.U32 Q9, Q9, #16 225 VLD2.16 {D8[3], D9[3]}, [R3], R6 226 VSHR.U32 Q8, Q8, #16 227 228 VMLAL.S16 Q11, D1, D11 229 VMLAL.S16 Q10, D7, D11 230 VMLAL.S16 Q9, D1, D10 231 VMLAL.S16 Q8, D7, D10 232 233 VLD4.16 {D0, D1, D2, D3}, [R0]! 234 VADD.I32 Q10, Q10, Q9 235 236 VNEG.S32 Q10, Q10 237 VREV64.16 Q5, Q4 238 239 VSUB.I32 Q11, Q8, Q11 240 VLD4.16 {D4, D5, D6, D7}, [R1], R8 241 VSHL.S32 Q10, Q10, Q7 242 VSHL.S32 Q11, Q11, Q7 243 244 VREV64.16 Q0, Q0 245 VSHL.S32 Q9, Q15, Q7 246 247 VREV64.16 Q2, Q2 248 VSHL.S32 Q8, Q14, Q7 249 250 SUBS R4, R4, #1 251 BNE CORE_LOOP_PTC 252 253NEON_EPILOGUE: 254 VMULL.U16 Q15, D2, D9 255 VST2.32 {Q8, Q9}, [R2]! 256 VMULL.U16 Q14, D4, D9 257 258 VMULL.U16 Q13, D2, D8 259 VST2.32 {Q10, Q11}, [R7], R8 260 VMULL.U16 Q12, D4, D8 261 262 VSHR.U32 Q15, Q15, #16 263 VSHR.U32 Q14, Q14, #16 264 VSHR.U32 Q13, Q13, #16 265 VSHR.U32 Q12, Q12, #16 266 267 VMLAL.S16 Q15, D3, D9 268 VMLAL.S16 Q14, D5, D9 269 VMLAL.S16 Q13, D3, D8 270 VMLAL.S16 Q12, D5, D8 271 272 VADD.I32 Q14, Q13, Q14 273 VNEG.S32 Q14, Q14 274 VSUB.I32 Q15, Q15, Q12 275 276 VMULL.U16 Q11, D0, D11 277 VMULL.U16 Q10, D6, D11 278 VMULL.U16 Q9, D0, D10 279 VMULL.U16 Q8, D6, D10 280 281 VSHR.U32 Q11, Q11, #16 282 VSHR.U32 Q10, Q10, #16 283 VSHR.U32 Q9, Q9, #16 284 VSHR.U32 Q8, Q8, #16 285 286 VMLAL.S16 Q11, D1, D11 287 VMLAL.S16 Q10, D7, D11 288 VMLAL.S16 Q9, D1, D10 289 VMLAL.S16 Q8, D7, D10 290 291 VADD.I32 Q10, Q10, Q9 292 VNEG.S32 Q10, Q10 293 VSUB.I32 Q11, Q8, Q11 294 295 296 VSHL.S32 Q10, Q10, Q7 297 VSHL.S32 Q11, Q11, Q7 298 VSHL.S32 Q9, Q15, Q7 299 VSHL.S32 Q8, Q14, Q7 300 301 VST2.32 {Q8, Q9}, [R2]! 302 VST2.32 {Q10, Q11}, [R7], R8 303 304 305RESIDUE_NEON: 306 MOV R10, #-16 307 VMOV.S32 D3, #0x00000000 308 VMOV.S32 D4, #0x00000000 309 310 VLD2.32 {D0, D2}, [R0]! 311 VLD2.32 {D1[0], D3[0]}, [R0]! 312 VLD1.32 D1[1], [R0] 313 314 VUZP.16 D0, D1 315 VUZP.16 D2, D3 316 317 ADD R1, R1, #4 318 319 VLD1.32 D6[0], [R1]! 320 VLD2.32 {D4[1], D6[1]}, [R1]! 321 VLD2.32 {D5, D7}, [R1]! 322 323 VUZP.16 D4, D5 324 VUZP.16 D6, D7 325 326 VREV64.16 Q0, Q0 327 VREV64.16 Q2, Q2 328 329 VLD2.16 {D8[0], D9[0]}, [R3], R6 330 VLD2.16 {D8[1], D9[1]}, [R3], R6 331 VLD2.16 {D8[2], D9[2]}, [R3], R6 332 VLD2.16 {D8[3], D9[3]}, [R3], R6 333 334 VREV64.16 Q5, Q4 335 336 337 VMULL.U16 Q15, D2, D9 338 VMULL.U16 Q14, D4, D9 339 VMULL.U16 Q13, D2, D8 340 VMULL.U16 Q12, D4, D8 341 342 VSHR.U32 Q15, Q15, #16 343 VSHR.U32 Q14, Q14, #16 344 VSHR.U32 Q13, Q13, #16 345 VSHR.U32 Q12, Q12, #16 346 347 VMLAL.S16 Q15, D3, D9 348 VMLAL.S16 Q14, D5, D9 349 VMLAL.S16 Q13, D3, D8 350 VMLAL.S16 Q12, D5, D8 351 352 VADD.I32 Q14, Q13, Q14 353 VNEG.S32 Q14, Q14 354 VSUB.I32 Q15, Q15, Q12 355 356 VMULL.U16 Q11, D0, D11 357 VMULL.U16 Q10, D6, D11 358 VMULL.U16 Q9, D0, D10 359 VMULL.U16 Q8, D6, D10 360 361 VSHR.U32 Q11, Q11, #16 362 VSHR.U32 Q10, Q10, #16 363 VSHR.U32 Q9, Q9, #16 364 VSHR.U32 Q8, Q8, #16 365 366 VMLAL.S16 Q11, D1, D11 367 VMLAL.S16 Q10, D7, D11 368 VMLAL.S16 Q9, D1, D10 369 VMLAL.S16 Q8, D7, D10 370 371 VADD.I32 Q10, Q10, Q9 372 VNEG.S32 Q10, Q10 373 VSUB.I32 Q11, Q8, Q11 374 375 376 VSHL.S32 Q10, Q10, Q7 377 VSHL.S32 Q11, Q11, Q7 378 VSHL.S32 Q9, Q15, Q7 379 VSHL.S32 Q8, Q14, Q7 380 381 VST2.32 {Q10, Q11}, [R7] 382 VST2.32 {D16, D18}, [R2]! 383 VST2.32 {D17[0], D19[0]}, [R2]! 384 385 VPOP {d8 - d15} 386 LDMFD sp!, {R4-R12} 387 BX LR 388 389