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