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