| @/* |
| @ ** 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) */ |
| @) |
| @*********************************************************************** |
| @ x[] --- r0 |
| @ lg --- r1 |
| @ exp --- r2 |
| |
| .section .text |
| .global Scale_sig_opt |
| |
| Scale_sig_opt: |
| |
| STMFD r13!, {r4 - r12, r14} |
| MOV r4, #4 |
| VMOV.S32 Q15, #0x8000 |
| VDUP.S32 Q14, r2 |
| MOV r5, r0 @ copy x[] address |
| CMP r1, #64 |
| MOVEQ r4, #1 |
| BEQ LOOP |
| CMP r1, #128 |
| MOVEQ r4, #2 |
| BEQ LOOP |
| CMP r1, #256 |
| BEQ LOOP |
| CMP r1, #80 |
| MOVEQ r4, #1 |
| BEQ LOOP1 |
| |
| LOOP1: |
| VLD1.S16 {Q0, Q1}, [r5]! @load 16 Word16 x[] |
| VSHLL.S16 Q10, D0, #16 |
| VSHLL.S16 Q11, D1, #16 |
| VSHLL.S16 Q12, D2, #16 |
| VSHLL.S16 Q13, D3, #16 |
| VSHL.S32 Q10, Q10, Q14 |
| VSHL.S32 Q11, Q11, Q14 |
| VSHL.S32 Q12, Q12, Q14 |
| VSHL.S32 Q13, Q13, Q14 |
| VADDHN.S32 D16, Q10, Q15 |
| VADDHN.S32 D17, Q11, Q15 |
| VADDHN.S32 D18, Q12, Q15 |
| VADDHN.S32 D19, Q13, Q15 |
| VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] |
| |
| LOOP: |
| VLD1.S16 {Q0, Q1}, [r5]! @load 16 Word16 x[] |
| VLD1.S16 {Q2, Q3}, [r5]! @load 16 Word16 x[] |
| VLD1.S16 {Q4, Q5}, [r5]! @load 16 Word16 x[] |
| VLD1.S16 {Q6, Q7}, [r5]! @load 16 Word16 x[] |
| |
| VSHLL.S16 Q8, D0, #16 |
| VSHLL.S16 Q9, D1, #16 |
| VSHLL.S16 Q10, D2, #16 |
| VSHLL.S16 Q11, D3, #16 |
| VSHL.S32 Q8, Q8, Q14 |
| VSHL.S32 Q9, Q9, Q14 |
| VSHL.S32 Q10, Q10, Q14 |
| VSHL.S32 Q11, Q11, Q14 |
| VADDHN.S32 D16, Q8, Q15 |
| VADDHN.S32 D17, Q9, Q15 |
| VADDHN.S32 D18, Q10, Q15 |
| VADDHN.S32 D19, Q11, Q15 |
| VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] |
| |
| |
| VSHLL.S16 Q12, D4, #16 |
| VSHLL.S16 Q13, D5, #16 |
| VSHLL.S16 Q10, D6, #16 |
| VSHLL.S16 Q11, D7, #16 |
| VSHL.S32 Q12, Q12, Q14 |
| VSHL.S32 Q13, Q13, Q14 |
| VSHL.S32 Q10, Q10, Q14 |
| VSHL.S32 Q11, Q11, Q14 |
| VADDHN.S32 D16, Q12, Q15 |
| VADDHN.S32 D17, Q13, Q15 |
| VADDHN.S32 D18, Q10, Q15 |
| VADDHN.S32 D19, Q11, Q15 |
| VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] |
| |
| VSHLL.S16 Q10, D8, #16 |
| VSHLL.S16 Q11, D9, #16 |
| VSHLL.S16 Q12, D10, #16 |
| VSHLL.S16 Q13, D11, #16 |
| VSHL.S32 Q10, Q10, Q14 |
| VSHL.S32 Q11, Q11, Q14 |
| VSHL.S32 Q12, Q12, Q14 |
| VSHL.S32 Q13, Q13, Q14 |
| VADDHN.S32 D16, Q10, Q15 |
| VADDHN.S32 D17, Q11, Q15 |
| VADDHN.S32 D18, Q12, Q15 |
| VADDHN.S32 D19, Q13, Q15 |
| VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] |
| |
| VSHLL.S16 Q10, D12, #16 |
| VSHLL.S16 Q11, D13, #16 |
| VSHLL.S16 Q12, D14, #16 |
| VSHLL.S16 Q13, D15, #16 |
| VSHL.S32 Q10, Q10, Q14 |
| VSHL.S32 Q11, Q11, Q14 |
| VSHL.S32 Q12, Q12, Q14 |
| VSHL.S32 Q13, Q13, Q14 |
| VADDHN.S32 D16, Q10, Q15 |
| VADDHN.S32 D17, Q11, Q15 |
| VADDHN.S32 D18, Q12, Q15 |
| VADDHN.S32 D19, Q13, Q15 |
| VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] |
| SUBS r4, r4, #1 |
| BGT LOOP |
| |
| |
| Scale_sig_asm_end: |
| |
| LDMFD r13!, {r4 - r12, r15} |
| @ENDFUNC |
| .END |
| |
| |