1@/* 2@ ** Copyright 2003-2010, VisualOn, Inc. 3@ ** 4@ ** Licensed under the Apache License, Version 2.0 (the "License"); 5@ ** you may not use this file except in compliance with the License. 6@ ** You may obtain a copy of the License at 7@ ** 8@ ** http://www.apache.org/licenses/LICENSE-2.0 9@ ** 10@ ** Unless required by applicable law or agreed to in writing, software 11@ ** distributed under the License is distributed on an "AS IS" BASIS, 12@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13@ ** See the License for the specific language governing permissions and 14@ ** limitations under the License. 15@ */ 16@ 17@void Pred_lt4( 18@ Word16 exc[], /* in/out: excitation buffer */ 19@ Word16 T0, /* input : integer pitch lag */ 20@ Word16 frac, /* input : fraction of lag */ 21@ Word16 L_subfr /* input : subframe size */ 22@ ) 23 24@****************************** 25@ ARM Register 26@****************************** 27@ r0 --- exc[] 28@ r1 --- T0 29@ r2 --- frac 30@ r3 --- L_subfr 31 32 .section .text 33 .global pred_lt4_asm 34 .extern inter4_2 35 .hidden inter4_2 36 37pred_lt4_asm: 38 39 STMFD r13!, {r4 - r12, r14} 40 RSB r4, r1, #0 @-T0 41 RSB r2, r2, #0 @frac = -frac 42 ADD r5, r0, r4, LSL #1 @x = exc - T0 43 CMP r2, #0 44 ADDLT r2, r2, #4 @frac += UP_SAMP 45 SUBLT r5, r5, #2 @x-- 46 SUB r5, r5, #30 @x -= 15 47 RSB r4, r2, #3 @k = 3 - frac 48 ADR r8, Table 49 NOP @space for fixed up relative address of ADR 50 LDR r6, [r8] 51 ADD r6, r8 52 MOV r8, r4, LSL #6 53 @MOV r7, #0 @j = 0 54 ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0]) 55 56 MOV r1, r5 57 MOV r5, #0x8000 58 MOV r14, #21 59@ used register 60 @r0 --- exc[] r1 --- x r7 --- j r8 --- ptr2 r5 --- 0x8000 61THREE_LOOP: 62 63 @MOV r1, r5 @ptr1 = x 64 MOV r2, r8 @ptr = ptr2 65 LDR r3, [r2], #4 @h[0], h[1] 66 LDRSH r4, [r1], #2 @x[0] 67 LDRSH r6, [r1], #2 @x[1] 68 LDRSH r9, [r1], #2 @x[2] 69 70 SMULBB r10, r4, r3 @x[0] * h[0] 71 SMULBB r11, r6, r3 @x[1] * h[0] 72 SMULBB r12, r9, r3 @x[2] * h[0] 73 74 LDRSH r4, [r1], #2 @x[3] 75 SMLABT r10, r6, r3, r10 @x[1] * h[1] 76 SMLABT r11, r9, r3, r11 @x[2] * h[1] 77 SMLABT r12, r4, r3, r12 @x[3] * h[1] 78 79 LDR r3, [r2], #4 @h[2], h[3] 80 LDRSH r6, [r1], #2 @x[4] 81 SMLABB r10, r9, r3, r10 @x[2] * h[2] 82 SMLABB r11, r4, r3, r11 @x[3] * h[2] 83 SMLABB r12, r6, r3, r12 @x[4] * h[2] 84 85 LDRSH r9, [r1], #2 @x[5] 86 SMLABT r10, r4, r3, r10 @x[3] * h[3] 87 SMLABT r11, r6, r3, r11 @x[4] * h[3] 88 SMLABT r12, r9, r3, r12 @x[5] * h[3] 89 90 LDR r3, [r2], #4 @h[4], h[5] 91 LDRSH r4, [r1], #2 @x[6] 92 SMLABB r10, r6, r3, r10 @x[4] * h[4] 93 SMLABB r11, r9, r3, r11 @x[5] * h[4] 94 SMLABB r12, r4, r3, r12 @x[6] * h[4] 95 96 LDRSH r6, [r1], #2 @x[7] 97 SMLABT r10, r9, r3, r10 @x[5] * h[5] 98 SMLABT r11, r4, r3, r11 @x[6] * h[5] 99 SMLABT r12, r6, r3, r12 @x[7] * h[5] 100 101 LDR r3, [r2], #4 @h[6], h[7] 102 LDRSH r9, [r1], #2 @x[8] 103 SMLABB r10, r4, r3, r10 @x[6] * h[6] 104 SMLABB r11, r6, r3, r11 @x[7] * h[6] 105 SMLABB r12, r9, r3, r12 @x[8] * h[6] 106 107 LDRSH r4, [r1], #2 @x[9] 108 SMLABT r10, r6, r3, r10 @x[7] * h[7] 109 SMLABT r11, r9, r3, r11 @x[8] * h[7] 110 SMLABT r12, r4, r3, r12 @x[9] * h[7] 111 112 LDR r3, [r2], #4 @h[8], h[9] 113 LDRSH r6, [r1], #2 @x[10] 114 SMLABB r10, r9, r3, r10 @x[8] * h[8] 115 SMLABB r11, r4, r3, r11 @x[9] * h[8] 116 SMLABB r12, r6, r3, r12 @x[10] * h[8] 117 118 LDRSH r9, [r1], #2 @x[11] 119 SMLABT r10, r4, r3, r10 @x[9] * h[9] 120 SMLABT r11, r6, r3, r11 @x[10] * h[9] 121 SMLABT r12, r9, r3, r12 @x[11] * h[9] 122 123 LDR r3, [r2], #4 @h[10], h[11] 124 LDRSH r4, [r1], #2 @x[12] 125 SMLABB r10, r6, r3, r10 @x[10] * h[10] 126 SMLABB r11, r9, r3, r11 @x[11] * h[10] 127 SMLABB r12, r4, r3, r12 @x[12] * h[10] 128 129 LDRSH r6, [r1], #2 @x[13] 130 SMLABT r10, r9, r3, r10 @x[11] * h[11] 131 SMLABT r11, r4, r3, r11 @x[12] * h[11] 132 SMLABT r12, r6, r3, r12 @x[13] * h[11] 133 134 LDR r3, [r2], #4 @h[12], h[13] 135 LDRSH r9, [r1], #2 @x[14] 136 SMLABB r10, r4, r3, r10 @x[12] * h[12] 137 SMLABB r11, r6, r3, r11 @x[13] * h[12] 138 SMLABB r12, r9, r3, r12 @x[14] * h[12] 139 140 LDRSH r4, [r1], #2 @x[15] 141 SMLABT r10, r6, r3, r10 @x[13] * h[13] 142 SMLABT r11, r9, r3, r11 @x[14] * h[13] 143 SMLABT r12, r4, r3, r12 @x[15] * h[13] 144 145 LDR r3, [r2], #4 @h[14], h[15] 146 LDRSH r6, [r1], #2 @x[16] 147 SMLABB r10, r9, r3, r10 @x[14] * h[14] 148 SMLABB r11, r4, r3, r11 @x[15] * h[14] 149 SMLABB r12, r6, r3, r12 @x[16] * h[14] 150 151 LDRSH r9, [r1], #2 @x[17] 152 SMLABT r10, r4, r3, r10 @x[15] * h[15] 153 SMLABT r11, r6, r3, r11 @x[16] * h[15] 154 SMLABT r12, r9, r3, r12 @x[17] * h[15] 155 156 LDR r3, [r2], #4 @h[16], h[17] 157 LDRSH r4, [r1], #2 @x[18] 158 SMLABB r10, r6, r3, r10 @x[16] * h[16] 159 SMLABB r11, r9, r3, r11 @x[17] * h[16] 160 SMLABB r12, r4, r3, r12 @x[18] * h[16] 161 162 LDRSH r6, [r1], #2 @x[19] 163 SMLABT r10, r9, r3, r10 @x[17] * h[17] 164 SMLABT r11, r4, r3, r11 @x[18] * h[17] 165 SMLABT r12, r6, r3, r12 @x[19] * h[17] 166 167 LDR r3, [r2], #4 @h[18], h[19] 168 LDRSH r9, [r1], #2 @x[20] 169 SMLABB r10, r4, r3, r10 @x[18] * h[18] 170 SMLABB r11, r6, r3, r11 @x[19] * h[18] 171 SMLABB r12, r9, r3, r12 @x[20] * h[18] 172 173 LDRSH r4, [r1], #2 @x[21] 174 SMLABT r10, r6, r3, r10 @x[19] * h[19] 175 SMLABT r11, r9, r3, r11 @x[20] * h[19] 176 SMLABT r12, r4, r3, r12 @x[21] * h[19] 177 178 LDR r3, [r2], #4 @h[20], h[21] 179 LDRSH r6, [r1], #2 @x[22] 180 SMLABB r10, r9, r3, r10 @x[20] * h[20] 181 SMLABB r11, r4, r3, r11 @x[21] * h[20] 182 SMLABB r12, r6, r3, r12 @x[22] * h[20] 183 184 LDRSH r9, [r1], #2 @x[23] 185 SMLABT r10, r4, r3, r10 @x[21] * h[21] 186 SMLABT r11, r6, r3, r11 @x[22] * h[21] 187 SMLABT r12, r9, r3, r12 @x[23] * h[21] 188 189 LDR r3, [r2], #4 @h[22], h[23] 190 LDRSH r4, [r1], #2 @x[24] 191 SMLABB r10, r6, r3, r10 @x[22] * h[22] 192 SMLABB r11, r9, r3, r11 @x[23] * h[22] 193 SMLABB r12, r4, r3, r12 @x[24] * h[22] 194 195 LDRSH r6, [r1], #2 @x[25] 196 SMLABT r10, r9, r3, r10 @x[23] * h[23] 197 SMLABT r11, r4, r3, r11 @x[24] * h[23] 198 SMLABT r12, r6, r3, r12 @x[25] * h[23] 199 200 LDR r3, [r2], #4 @h[24], h[25] 201 LDRSH r9, [r1], #2 @x[26] 202 SMLABB r10, r4, r3, r10 @x[24] * h[24] 203 SMLABB r11, r6, r3, r11 @x[25] * h[24] 204 SMLABB r12, r9, r3, r12 @x[26] * h[24] 205 206 LDRSH r4, [r1], #2 @x[27] 207 SMLABT r10, r6, r3, r10 @x[25] * h[25] 208 SMLABT r11, r9, r3, r11 @x[26] * h[25] 209 SMLABT r12, r4, r3, r12 @x[27] * h[25] 210 211 LDR r3, [r2], #4 @h[26], h[27] 212 LDRSH r6, [r1], #2 @x[28] 213 SMLABB r10, r9, r3, r10 @x[26] * h[26] 214 SMLABB r11, r4, r3, r11 @x[27] * h[26] 215 SMLABB r12, r6, r3, r12 @x[28] * h[26] 216 217 LDRSH r9, [r1], #2 @x[29] 218 SMLABT r10, r4, r3, r10 @x[27] * h[27] 219 SMLABT r11, r6, r3, r11 @x[28] * h[27] 220 SMLABT r12, r9, r3, r12 @x[29] * h[27] 221 222 LDR r3, [r2], #4 @h[28], h[29] 223 LDRSH r4, [r1], #2 @x[30] 224 SMLABB r10, r6, r3, r10 @x[28] * h[28] 225 SMLABB r11, r9, r3, r11 @x[29] * h[28] 226 SMLABB r12, r4, r3, r12 @x[30] * h[28] 227 228 LDRSH r6, [r1], #2 @x[31] 229 SMLABT r10, r9, r3, r10 @x[29] * h[29] 230 SMLABT r11, r4, r3, r11 @x[30] * h[29] 231 SMLABT r12, r6, r3, r12 @x[31] * h[29] 232 233 LDR r3, [r2], #4 @h[30], h[31] 234 LDRSH r9, [r1], #2 @x[32] 235 SMLABB r10, r4, r3, r10 @x[30] * h[30] 236 SMLABB r11, r6, r3, r11 @x[31] * h[30] 237 SMLABB r12, r9, r3, r12 @x[32] * h[30] 238 239 LDRSH r4, [r1], #-60 @x[33] 240 SMLABT r10, r6, r3, r10 @x[31] * h[31] 241 SMLABT r11, r9, r3, r11 @x[32] * h[31] 242 SMLABT r12, r4, r3, r12 @x[33] * h[31] 243 244 @SSAT r10, #32, r10, LSL #2 245 @SSAT r11, #32, r11, LSL #2 246 @SSAT r12, #32, r12, LSL #2 247 248 MOV r10, r10, LSL #1 249 MOV r11, r11, LSL #1 250 MOV r12, r12, LSL #1 251 252 QADD r10, r10, r10 253 QADD r11, r11, r11 254 QADD r12, r12, r12 255 256 QADD r10, r10, r5 257 QADD r11, r11, r5 258 QADD r12, r12, r5 259 260 SUBS r14, r14, #1 261 262 MOV r10, r10, ASR #16 263 MOV r11, r11, ASR #16 264 MOV r12, r12, ASR #16 265 266 STRH r10, [r0], #2 267 STRH r11, [r0], #2 268 STRH r12, [r0], #2 269 BNE THREE_LOOP 270 271 MOV r2, r8 @ptr = ptr2 272 273Last2LOOP: 274 275 LDR r3, [r2], #4 @h[0], h[1] 276 LDRSH r4, [r1], #2 @x[0] 277 LDRSH r6, [r1], #2 @x[1] 278 LDRSH r9, [r1], #2 @x[2] 279 280 SMULBB r10, r4, r3 @x[0] * h[0] 281 SMULBB r11, r6, r3 @x[1] * h[0] 282 283 SMLABT r10, r6, r3, r10 @x[1] * h[1] 284 SMLABT r11, r9, r3, r11 @x[2] * h[1] 285 286 LDR r3, [r2], #4 @h[2], h[3] 287 LDRSH r4, [r1], #2 @x[3] 288 LDRSH r6, [r1], #2 @x[4] 289 290 SMLABB r10, r9, r3, r10 @x[2] * h[2] 291 SMLABB r11, r4, r3, r11 @x[3] * h[2] 292 293 SMLABT r10, r4, r3, r10 @x[3] * h[3] 294 SMLABT r11, r6, r3, r11 @x[4] * h[3] 295 296 LDR r3, [r2], #4 @h[4], h[5] 297 LDRSH r9, [r1], #2 @x[5] 298 LDRSH r4, [r1], #2 @x[6] 299 300 SMLABB r10, r6, r3, r10 @x[4] * h[4] 301 SMLABB r11, r9, r3, r11 @x[5] * h[4] 302 303 SMLABT r10, r9, r3, r10 @x[5] * h[5] 304 SMLABT r11, r4, r3, r11 @x[6] * h[5] 305 306 LDR r3, [r2], #4 @h[6], h[7] 307 LDRSH r6, [r1], #2 @x[7] 308 LDRSH r9, [r1], #2 @x[8] 309 310 SMLABB r10, r4, r3, r10 @x[6] * h[6] 311 SMLABB r11, r6, r3, r11 @x[7] * h[6] 312 313 SMLABT r10, r6, r3, r10 @x[7] * h[7] 314 SMLABT r11, r9, r3, r11 @x[8] * h[7] 315 316 LDR r3, [r2], #4 @h[8], h[9] 317 LDRSH r4, [r1], #2 @x[9] 318 LDRSH r6, [r1], #2 @x[10] 319 320 SMLABB r10, r9, r3, r10 @x[8] * h[8] 321 SMLABB r11, r4, r3, r11 @x[9] * h[8] 322 323 SMLABT r10, r4, r3, r10 @x[9] * h[9] 324 SMLABT r11, r6, r3, r11 @x[10] * h[9] 325 326 LDR r3, [r2], #4 @h[10], h[11] 327 LDRSH r9, [r1], #2 @x[11] 328 LDRSH r4, [r1], #2 @x[12] 329 330 SMLABB r10, r6, r3, r10 @x[10] * h[10] 331 SMLABB r11, r9, r3, r11 @x[11] * h[10] 332 333 SMLABT r10, r9, r3, r10 @x[11] * h[11] 334 SMLABT r11, r4, r3, r11 @x[12] * h[11] 335 336 LDR r3, [r2], #4 @h[12], h[13] 337 LDRSH r6, [r1], #2 @x[13] 338 LDRSH r9, [r1], #2 @x[14] 339 340 SMLABB r10, r4, r3, r10 @x[12] * h[12] 341 SMLABB r11, r6, r3, r11 @x[13] * h[12] 342 343 SMLABT r10, r6, r3, r10 @x[13] * h[13] 344 SMLABT r11, r9, r3, r11 @x[14] * h[13] 345 346 LDR r3, [r2], #4 @h[14], h[15] 347 LDRSH r4, [r1], #2 @x[15] 348 LDRSH r6, [r1], #2 @x[16] 349 350 SMLABB r10, r9, r3, r10 @x[14] * h[14] 351 SMLABB r11, r4, r3, r11 @x[15] * h[14] 352 353 SMLABT r10, r4, r3, r10 @x[15] * h[15] 354 SMLABT r11, r6, r3, r11 @x[16] * h[15] 355 356 LDR r3, [r2], #4 @h[16], h[17] 357 LDRSH r9, [r1], #2 @x[17] 358 LDRSH r4, [r1], #2 @x[18] 359 360 SMLABB r10, r6, r3, r10 @x[16] * h[16] 361 SMLABB r11, r9, r3, r11 @x[17] * h[16] 362 363 SMLABT r10, r9, r3, r10 @x[17] * h[17] 364 SMLABT r11, r4, r3, r11 @x[18] * h[17] 365 366 LDR r3, [r2], #4 @h[18], h[19] 367 LDRSH r6, [r1], #2 @x[19] 368 LDRSH r9, [r1], #2 @x[20] 369 370 SMLABB r10, r4, r3, r10 @x[18] * h[18] 371 SMLABB r11, r6, r3, r11 @x[19] * h[18] 372 373 SMLABT r10, r6, r3, r10 @x[19] * h[19] 374 SMLABT r11, r9, r3, r11 @x[20] * h[19] 375 376 LDR r3, [r2], #4 @h[20], h[21] 377 LDRSH r4, [r1], #2 @x[21] 378 LDRSH r6, [r1], #2 @x[22] 379 380 SMLABB r10, r9, r3, r10 @x[20] * h[20] 381 SMLABB r11, r4, r3, r11 @x[21] * h[20] 382 383 SMLABT r10, r4, r3, r10 @x[21] * h[21] 384 SMLABT r11, r6, r3, r11 @x[22] * h[21] 385 386 LDR r3, [r2], #4 @h[22], h[23] 387 LDRSH r9, [r1], #2 @x[23] 388 LDRSH r4, [r1], #2 @x[24] 389 390 SMLABB r10, r6, r3, r10 @x[22] * h[22] 391 SMLABB r11, r9, r3, r11 @x[23] * h[22] 392 393 SMLABT r10, r9, r3, r10 @x[23] * h[23] 394 SMLABT r11, r4, r3, r11 @x[24] * h[23] 395 396 LDR r3, [r2], #4 @h[24], h[25] 397 LDRSH r6, [r1], #2 @x[25] 398 LDRSH r9, [r1], #2 @x[26] 399 400 SMLABB r10, r4, r3, r10 @x[24] * h[24] 401 SMLABB r11, r6, r3, r11 @x[25] * h[24] 402 403 SMLABT r10, r6, r3, r10 @x[25] * h[25] 404 SMLABT r11, r9, r3, r11 @x[26] * h[25] 405 406 LDR r3, [r2], #4 @h[26], h[27] 407 LDRSH r4, [r1], #2 @x[27] 408 LDRSH r6, [r1], #2 @x[28] 409 410 SMLABB r10, r9, r3, r10 @x[26] * h[26] 411 SMLABB r11, r4, r3, r11 @x[27] * h[26] 412 413 SMLABT r10, r4, r3, r10 @x[27] * h[27] 414 SMLABT r11, r6, r3, r11 @x[28] * h[27] 415 416 LDR r3, [r2], #4 @h[28], h[29] 417 LDRSH r9, [r1], #2 @x[29] 418 LDRSH r4, [r1], #2 @x[30] 419 420 SMLABB r10, r6, r3, r10 @x[28] * h[28] 421 SMLABB r11, r9, r3, r11 @x[29] * h[28] 422 423 SMLABT r10, r9, r3, r10 @x[29] * h[29] 424 SMLABT r11, r4, r3, r11 @x[30] * h[29] 425 426 LDR r3, [r2], #4 @h[30], h[31] 427 LDRSH r6, [r1], #2 @x[31] 428 LDRSH r9, [r1], #2 @x[32] 429 430 SMLABB r10, r4, r3, r10 @x[30] * h[30] 431 SMLABB r11, r6, r3, r11 @x[31] * h[30] 432 433 SMLABT r10, r6, r3, r10 @x[31] * h[31] 434 SMLABT r11, r9, r3, r11 @x[32] * h[31] 435 436 @SSAT r10, #32, r10, LSL #2 437 @SSAT r11, #32, r11, LSL #2 438 MOV r10, r10, LSL #1 439 MOV r11, r11, LSL #1 440 441 QADD r10, r10, r10 442 QADD r11, r11, r11 443 444 QADD r10, r10, r5 445 QADD r11, r11, r5 446 447 MOV r10, r10, ASR #16 448 MOV r11, r11, ASR #16 449 450 STRH r10, [r0], #2 451 STRH r11, [r0], #2 452 453 454pred_lt4_end: 455 LDMFD r13!, {r4 - r12, r15} 456 457Table: 458 .word inter4_2-Table 459 @ENDFUNC 460 .end 461 462 463 464 465