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 Deemph_32( 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 x_hi[], /* (i) : input signal (bit31..16) */ 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 x_lo[], /* (i) : input signal (bit15..4) */ 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 y[], /* (o) : output signal (x16) */ 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 mu, /* (i) Q15 : deemphasis factor */ 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 L, /* (i) : vector size */ 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 * mem /* (i/o) : memory (y[-1]) */ 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ) 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@x_hi RN R0 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@x_lo RN R1 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@y[] RN R2 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@*mem RN R3 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard .section .text 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard .global Deemph_32_asm 33b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 34e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardDeemph_32_asm: 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 36b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard STMFD r13!, {r4 - r12, r14} 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r4, #2 @i=0 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r6, [r0], #2 @load x_hi[0] 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r7, [r1], #2 @load x_lo[0] 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDR r5, =22282 @r5---mu 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r11, #0x8000 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @y[0] 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r6, LSL #16 @L_tmp = x_hi[0]<<16 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r8, r5, ASR #1 @fac = mu >> 1 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDR r5, [r3] 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r12, LSL #3 @L_tmp <<= 3 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MUL r9, r5, r8 50b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard LDRSH r6, [r0], #2 @load x_hi[1] 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard QDADD r10, r10, r9 52b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard LDRSH r7, [r1], #2 @load x_lo[1] 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac) 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard QADD r10, r12, r11 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r14, r10, ASR #16 @y[0] = round(L_tmp) 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r6, LSL #16 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r12, r10, r7, LSL #4 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STRH r14, [r2], #2 @update y[0] 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r12, LSL #3 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MUL r9, r14, r8 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard QDADD r10, r10, r9 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r12, r10, LSL #1 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard QADD r10, r12, r11 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r14, r10, ASR #16 @y[1] = round(L_tmp) 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 68e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOP: 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r6, [r0], #2 @load x_hi[] 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r7, [r1], #2 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STRH r14, [r2], #2 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r6, LSL #16 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r12, r10, r7, LSL #4 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MUL r9, r14, r8 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r12, LSL #3 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard QDADD r10, r10, r9 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r6, [r0], #2 @load x_hi[] 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r12, r10, LSL #1 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard QADD r10, r12, r11 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r7, [r1], #2 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r14, r10, ASR #16 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r6, LSL #16 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r12, r10, r7, LSL #4 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STRH r14, [r2], #2 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MUL r9, r14, r8 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r10, r12, LSL #3 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard QDADD r10, r10, r9 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r4, r4, #2 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r12, r10, LSL #1 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard QADD r10, r12, r11 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard CMP r4, #64 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r14, r10, ASR #16 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard BLT LOOP 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STR r14, [r3] 97b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard STRH r14, [r2] 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 99b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard LDMFD r13!, {r4 - r12, r15} 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @ENDP 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard .END 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 105