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 Scale_sig( 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 x[], /* (i/o) : signal to scale */ 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 lg, /* (i) : size of x[] */ 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ Word16 exp /* (i) : exponent: x = round(x << exp) */ 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ) 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r0 --- x[] 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r1 --- lg 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r2 --- exp 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard .section .text 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard .global Scale_sig_opt 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 30e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardScale_sig_opt: 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STMFD r13!, {r4 - r12, r14} 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard SUB r3, r1, #1 @i = lg - 1 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard CMP r2, #0 @Compare exp and 0 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard RSB r7, r2, #0 @exp = -exp 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r10, r2, #16 @16 + exp 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ADD r4, r0, r3, LSL #1 @x[i] address 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r8, #0x7fffffff 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r9, #0x8000 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard BLE LOOP2 41b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 42e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOP1: 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r5, [r4] @load x[i] 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r12, r5, LSL r10 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard TEQ r5, r12, ASR r10 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard EORNE r12, r8, r5, ASR #31 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard SUBS r3, r3, #1 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard QADD r11, r12, r9 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r12, r11, ASR #16 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STRH r12, [r4], #-2 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard BGE LOOP1 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard BL The_end 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 55e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOP2: 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDRSH r5, [r4] @load x[i] 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r6, r5, LSL #16 @L_tmp = x[i] << 16 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r5, r6, ASR r7 @L_tmp >>= exp 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard QADD r11, r5, r9 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard MOV r12, r11, ASR #16 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard SUBS r3, r3, #1 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard STRH r12, [r4], #-2 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard BGE LOOP2 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 66e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardThe_end: 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard LDMFD r13!, {r4 - r12, r15} 68b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard @ENDFUNC 70b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard .END 71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 72b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 73b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 76