| @/* |
| @ ** 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 |
| |
| |
| |
| |
| |