@/* | |
@ ** 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. | |
@ */ | |
@ | |
@void Scale_sig( | |
@ Word16 x[], /* (i/o) : signal to scale */ | |
@ Word16 lg, /* (i) : size of x[] */ | |
@ Word16 exp /* (i) : exponent: x = round(x << exp) */ | |
@ ) | |
@ | |
@r0 --- x[] | |
@r1 --- lg | |
@r2 --- exp | |
.section .text | |
.global Scale_sig_opt | |
Scale_sig_opt: | |
STMFD r13!, {r4 - r12, r14} | |
SUB r3, r1, #1 @i = lg - 1 | |
CMP r2, #0 @Compare exp and 0 | |
RSB r7, r2, #0 @exp = -exp | |
ADD r10, r2, #16 @16 + exp | |
ADD r4, r0, r3, LSL #1 @x[i] address | |
MOV r8, #0x7fffffff | |
MOV r9, #0x8000 | |
BLE LOOP2 | |
LOOP1: | |
LDRSH r5, [r4] @load x[i] | |
MOV r12, r5, LSL r10 | |
TEQ r5, r12, ASR r10 | |
EORNE r12, r8, r5, ASR #31 | |
SUBS r3, r3, #1 | |
QADD r11, r12, r9 | |
MOV r12, r11, ASR #16 | |
STRH r12, [r4], #-2 | |
BGE LOOP1 | |
BL The_end | |
LOOP2: | |
LDRSH r5, [r4] @load x[i] | |
MOV r6, r5, LSL #16 @L_tmp = x[i] << 16 | |
MOV r5, r6, ASR r7 @L_tmp >>= exp | |
QADD r11, r5, r9 | |
MOV r12, r11, ASR #16 | |
SUBS r3, r3, #1 | |
STRH r12, [r4], #-2 | |
BGE LOOP2 | |
The_end: | |
LDMFD r13!, {r4 - r12, r15} | |
@ENDFUNC | |
.END | |