1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@/* 2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Copyright 2003-2010, VisualOn, Inc. 3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** 4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Licensed under the Apache License, Version 2.0 (the "License"); 5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** you may not use this file except in compliance with the License. 6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** You may obtain a copy of the License at 7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** 8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** http://www.apache.org/licenses/LICENSE-2.0 9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** 10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Unless required by applicable law or agreed to in writing, software 11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** distributed under the License is distributed on an "AS IS" BASIS, 12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** See the License for the specific language governing permissions and 14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** limitations under the License. 15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ */ 16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@void Syn_filt( 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 x[], /* (i) : input signal */ 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 y[], /* (o) : output signal */ 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 mem[], /* (i/o) : memory associated with this filtering. */ 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@) 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@*********************************************************************** 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ a[] --- r0 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ x[] --- r1 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ y[] --- r2 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ mem[] --- r3 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ m --- 16 lg --- 80 update --- 1 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 30b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard .section .text 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard .global Syn_filt_asm 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 33e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardSyn_filt_asm: 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 35b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard STMFD r13!, {r4 - r12, r14} 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard SUB r13, r13, #700 @ y_buf[L_FRAME16k + M16k] 37b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r4, r3 @ copy mem[] address 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, r13 @ copy yy = y_buf address 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @ for(i = 0@ i < m@ i++) 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @{ 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @ *yy++ = mem[i]@ 44b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard @} 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VLD1.S16 {D0, D1, D2, D3}, [r4]! @load 16 mems 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VST1.S16 {D0, D1, D2, D3}, [r5]! @store 16 mem[] to *yy 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r5, [r0], #2 @ load a[0] 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r8, #0 @ i = 0 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, r5, ASR #1 @ a0 = a[0] >> 1 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VMOV.S16 D8[0], r5 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @ load all a[] 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VLD1.S16 {D0, D1, D2, D3}, [r0]! @ load a[1] ~ a[16] 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VREV64.16 D0, D0 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VREV64.16 D1, D1 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VREV64.16 D2, D2 57b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VREV64.16 D3, D3 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r8, #0 @ loop times 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r13 @ temp = y_buf 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r4, r13, #32 @ yy[i] address 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VLD1.S16 {D4, D5, D6, D7}, [r10]! @ first 16 temp_p 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 64e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardSYN_LOOP: 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r6, [r1], #2 @ load x[i] 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MUL r12, r6, r5 @ L_tmp = x[i] * a0 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r10, r4, r8, LSL #1 @ y[i], yy[i] address 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VDUP.S32 Q10, r12 71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VMULL.S16 Q5, D3, D4 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VMLAL.S16 Q5, D2, D5 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VMLAL.S16 Q5, D1, D6 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VMLAL.S16 Q5, D0, D7 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VEXT.8 D4, D4, D5, #2 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VEXT.8 D5, D5, D6, #2 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VEXT.8 D6, D6, D7, #2 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VPADD.S32 D12, D10, D11 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r8, r8, #1 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VPADD.S32 D10, D12, D12 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VDUP.S32 Q7, D10[0] 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VSUB.S32 Q9, Q10, Q7 85b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VQRSHRN.S32 D20, Q9, #12 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VMOV.S16 r9, D20[0] 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VEXT.8 D7, D7, D20, #2 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard CMP r8, #80 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STRH r9, [r10] @ yy[i] 90b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard STRH r9, [r2], #2 @ y[i] 91b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard BLT SYN_LOOP 93b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @ update mem[] 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r5, r13, #160 @ yy[64] address 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VLD1.S16 {D0, D1, D2, D3}, [r5]! 97b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VST1.S16 {D0, D1, D2, D3}, [r3]! 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 99e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardSyn_filt_asm_end: 100b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 101b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ADD r13, r13, #700 102b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard LDMFD r13!, {r4 - r12, r15} 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @ENDFUNC 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard .END 105b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 107