@/* @ ** 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. @ */ @ @static void cor_h_vec_012( @ Word16 h[], /* (i) scaled impulse response */ @ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ @ Word16 track, /* (i) track to use */ @ Word16 sign[], /* (i) sign vector */ @ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ @ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ @ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ @) @r0 ---- h[] @r1 ---- vec[] @r2 ---- track @r3 ---- sign[] @r4 ---- rrixix[][NB_POS] @r5 ---- cor_1[] @r6 ---- cor_2[] .section .text .global cor_h_vec_012_asm cor_h_vec_012_asm: STMFD r13!, {r4 - r12, r14} LDR r4, [r13, #40] @load rrixix[][NB_POS] ADD r7, r4, r2, LSL #5 @r7 --- p0 = rrixix[track] MOV r4, #0 @i=0 @r0 --- h[], r1 --- vec[], r2 --- pos @r3 --- sign[], r4 --- i, r7 --- p0 LOOPi: MOV r5, #0 @L_sum1 = 0 MOV r6, #0 @L_sum2 = 0 ADD r9, r1, r2, LSL #1 @p2 = &vec[pos] MOV r10, r0 @p1 = h RSB r11, r2, #62 @j=62-pos LOOPj1: LDRSH r12, [r10], #2 LDRSH r8, [r9], #2 LDRSH r14, [r9] SUBS r11, r11, #1 MLA r5, r12, r8, r5 MLA r6, r12, r14, r6 BGE LOOPj1 LDRSH r12, [r10], #2 @*p1++ MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) MLA r5, r12, r14, r5 MOV r14, #0x8000 MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) ADD r10, r6, r14 ADD r9, r5, r14 MOV r5, r9, ASR #16 MOV r6, r10, ASR #16 ADD r9, r3, r2, LSL #1 @address of sign[pos] ADD r8, r7, #32 LDRSH r10, [r9], #2 @sign[pos] LDRSH r11, [r9] @sign[pos + 1] MUL r12, r5, r10 MUL r14, r6, r11 MOV r5, r12, ASR #15 MOV r6, r14, ASR #15 LDR r9, [r13, #44] LDR r12, [r13, #48] LDRSH r10, [r7], #2 @*p0++ LDRSH r11, [r8] @*p3++ ADD r9, r9, r4, LSL #1 ADD r12, r12, r4, LSL #1 ADD r5, r5, r10 ADD r6, r6, r11 STRH r5, [r9] STRH r6, [r12] ADD r2, r2, #4 MOV r5, #0 @L_sum1 = 0 MOV r6, #0 @L_sum2 = 0 ADD r9, r1, r2, LSL #1 @p2 = &vec[pos] MOV r10, r0 @p1 = h RSB r11, r2, #62 @j=62-pos ADD r4, r4, #1 @i++ LOOPj2: LDRSH r12, [r10], #2 LDRSH r8, [r9], #2 LDRSH r14, [r9] SUBS r11, r11, #1 MLA r5, r12, r8, r5 MLA r6, r12, r14, r6 BGE LOOPj2 LDRSH r12, [r10], #2 @*p1++ MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) MLA r5, r12, r14, r5 MOV r14, #0x8000 MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) ADD r10, r6, r14 ADD r9, r5, r14 MOV r5, r9, ASR #16 MOV r6, r10, ASR #16 ADD r9, r3, r2, LSL #1 @address of sign[pos] ADD r8, r7, #32 LDRSH r10, [r9], #2 @sign[pos] LDRSH r11, [r9] @sign[pos + 1] MUL r12, r5, r10 MUL r14, r6, r11 MOV r5, r12, ASR #15 MOV r6, r14, ASR #15 LDR r9, [r13, #44] LDR r12, [r13, #48] LDRSH r10, [r7], #2 @*p0++ LDRSH r11, [r8] @*p3++ ADD r9, r9, r4, LSL #1 ADD r12, r12, r4, LSL #1 ADD r5, r5, r10 ADD r6, r6, r11 STRH r5, [r9] STRH r6, [r12] ADD r4, r4, #1 @i+1 ADD r2, r2, #4 @pos += STEP CMP r4, #16 BLT LOOPi the_end: LDMFD r13!, {r4 - r12, r15} .END