| @/* |
| @ ** Copyright 2003-2010, VisualOn, Inc. |
| @ ** |
| @ ** Licensed under the Apache License, Version 2.0 (the "License"); |
| @ ** you may not use this file except in compliance with the License. |
| @ ** You may obtain a copy of the License at |
| @ ** |
| @ ** http://www.apache.org/licenses/LICENSE-2.0 |
| @ ** |
| @ ** Unless required by applicable law or agreed to in writing, software |
| @ ** distributed under the License is distributed on an "AS IS" BASIS, |
| @ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| @ ** See the License for the specific language governing permissions and |
| @ ** limitations under the License. |
| @ */ |
| |
| @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
| @ File: CalcWindowEnergy_v5.s |
| @ |
| @ Content: CalcWindowEnergy function armv5 assemble |
| @ |
| @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
| |
| .section .text |
| |
| .global CalcWindowEnergy |
| |
| CalcWindowEnergy: |
| stmdb sp!, {r4 - r11, lr} |
| sub r13, r13, #20 |
| |
| mov r3, r3, lsl #16 |
| ldr r10, [r0, #168] @ states0 = blockSwitchingControl->iirStates[0]; |
| mov r3, r3, asr #16 |
| ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1]; |
| |
| mov r2, r2, lsl #16 |
| ldr r12, hiPassCoeff @ Coeff0 = hiPassCoeff[0]; |
| mov r2, r2, asr #16 |
| ldr r14, hiPassCoeff + 4 @ Coeff1 = hiPassCoeff[1]; |
| |
| mov r8, #0 @ w=0 |
| mov r5, #0 @ wOffset = 0; |
| |
| BLOCK_BEGIN: |
| mov r6, #0 @ accuUE = 0; |
| mov r7, #0 @ accuFE = 0; |
| mov r4, #0 @ i=0 |
| |
| str r8, [r13, #4] |
| str r0, [r13, #8] |
| str r3, [r13, #12] |
| |
| ENERGY_BEG: |
| mov r9, r5, lsl #1 |
| ldrsh r9, [r1, r9] @ tempUnfiltered = timeSignal[tidx]; |
| |
| add r5, r5, r2 @ tidx = tidx + chIncrement; |
| |
| smulwb r3, r14, r9 @ accu1 = L_mpy_ls(Coeff1, tempUnfiltered); |
| smull r0, r8, r12, r11 @ accu2 = fixmul( Coeff0, states1 ); |
| |
| mov r3, r3, lsl #1 |
| mov r8, r8, lsl #1 |
| |
| sub r0, r3, r10 @ accu3 = accu1 - states0; |
| sub r8, r0, r8 @ out = accu3 - accu2; |
| |
| mov r10, r3 @ states0 = accu1; |
| mov r11, r8 @ states1 = out; |
| |
| mul r3, r9, r9 |
| mov r8, r8, asr #16 |
| |
| add r4, r4, #1 |
| add r6, r6, r3, asr #7 |
| |
| mul r9, r8, r8 |
| ldr r3, [r13, #12] |
| |
| add r7, r7, r9, asr #7 |
| |
| cmp r4, r3 |
| blt ENERGY_BEG |
| |
| ldr r0, [r13, #8] |
| ldr r8, [r13, #4] |
| |
| ENERGY_END: |
| add r4, r0, r8, lsl #2 |
| |
| str r6, [r4, #72] |
| add r8, r8, #1 |
| str r7, [r4, #136] |
| |
| cmp r8, #8 |
| blt BLOCK_BEGIN |
| |
| BLOCK_END: |
| str r10, [r0, #168] |
| str r11, [r0, #172] |
| mov r0, #1 |
| |
| add r13, r13, #20 |
| ldmia sp!, {r4 - r11, pc} |
| |
| hiPassCoeff: |
| .word 0xbec8b439 |
| .word 0x609d4952 |
| |
| @ENDP |
| .end |