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@static void cor_h_vec_012( 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 h[], /* (i) scaled impulse response */ 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 track, /* (i) track to use */ 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 sign[], /* (i) sign vector */ 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@) 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r0 ---- h[] 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r1 ---- vec[] 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r2 ---- track 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r3 ---- sign[] 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r4 ---- rrixix[][NB_POS] 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r5 ---- cor_1[] 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r6 ---- cor_2[] 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard .section .text 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard .global cor_h_vec_012_asm 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardcor_h_vec_012_asm: 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STMFD r13!, {r4 - r12, r14} 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDR r4, [r13, #40] @load rrixix[][NB_POS] 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r7, r4, r2, LSL #5 @r7 --- p0 = rrixix[track] 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r4, #0 @i=0 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @r0 --- h[], r1 --- vec[], r2 --- pos 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @r3 --- sign[], r4 --- i, r7 --- p0 46e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOPi: 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, #0 @L_sum1 = 0 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r6, #0 @L_sum2 = 0 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r9, r1, r2, LSL #1 @p2 = &vec[pos] 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r0 @p1 = h 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard RSB r11, r2, #62 @j=62-pos 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 53e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOPj1: 54b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard LDRSH r12, [r10], #2 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r8, [r9], #2 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r14, [r9] 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard SUBS r11, r11, #1 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MLA r5, r12, r8, r5 59b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard MLA r6, r12, r14, r6 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard BGE LOOPj1 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r12, [r10], #2 @*p1++ 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MLA r5, r12, r14, r5 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r14, #0x8000 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) 67b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ADD r10, r6, r14 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r9, r5, r14 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, r9, ASR #16 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r6, r10, ASR #16 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r9, r3, r2, LSL #1 @address of sign[pos] 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r8, r7, #32 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r10, [r9], #2 @sign[pos] 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r11, [r9] @sign[pos + 1] 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MUL r12, r5, r10 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MUL r14, r6, r11 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, r12, ASR #15 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r6, r14, ASR #15 79b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard LDR r9, [r13, #44] 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDR r12, [r13, #48] 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r10, [r7], #2 @*p0++ 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r11, [r8] @*p3++ 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r9, r9, r4, LSL #1 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r12, r12, r4, LSL #1 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r5, r5, r10 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r6, r6, r11 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STRH r5, [r9] 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STRH r6, [r12] 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r2, r2, #4 91b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, #0 @L_sum1 = 0 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r6, #0 @L_sum2 = 0 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r9, r1, r2, LSL #1 @p2 = &vec[pos] 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r0 @p1 = h 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard RSB r11, r2, #62 @j=62-pos 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r4, r4, #1 @i++ 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 99e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOPj2: 100b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard LDRSH r12, [r10], #2 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r8, [r9], #2 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r14, [r9] 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard SUBS r11, r11, #1 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MLA r5, r12, r8, r5 105b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard MLA r6, r12, r14, r6 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard BGE LOOPj2 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r12, [r10], #2 @*p1++ 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MLA r5, r12, r14, r5 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r14, #0x8000 112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) 113b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ADD r10, r6, r14 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r9, r5, r14 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, r9, ASR #16 117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r6, r10, ASR #16 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r9, r3, r2, LSL #1 @address of sign[pos] 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r8, r7, #32 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r10, [r9], #2 @sign[pos] 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r11, [r9] @sign[pos + 1] 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MUL r12, r5, r10 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MUL r14, r6, r11 124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, r12, ASR #15 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r6, r14, ASR #15 126b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard LDR r9, [r13, #44] 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDR r12, [r13, #48] 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r10, [r7], #2 @*p0++ 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r11, [r8] @*p3++ 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r9, r9, r4, LSL #1 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r12, r12, r4, LSL #1 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r5, r5, r10 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r6, r6, r11 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STRH r5, [r9] 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STRH r6, [r12] 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r4, r4, #1 @i+1 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r2, r2, #4 @pos += STEP 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard CMP r4, #16 139b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard BLT LOOPi 141b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardthe_end: 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDMFD r13!, {r4 - r12, r15} 144b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @ENDFUNC 146b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard .END 147b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 148b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 149b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 152