scale_sig_neon.s revision 956c553ab0ce72f8074ad0fda2ffd66a0305700c
1@/*
2@ ** Copyright 2003-2010, VisualOn, Inc.
3@ **
4@ ** Licensed under the Apache License, Version 2.0 (the "License");
5@ ** you may not use this file except in compliance with the License.
6@ ** You may obtain a copy of the License at
7@ **
8@ **     http://www.apache.org/licenses/LICENSE-2.0
9@ **
10@ ** Unless required by applicable law or agreed to in writing, software
11@ ** distributed under the License is distributed on an "AS IS" BASIS,
12@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13@ ** See the License for the specific language governing permissions and
14@ ** limitations under the License.
15@ */
16@
17@**********************************************************************/
18@void Scale_sig(
19@               Word16 x[],                           /* (i/o) : signal to scale               */
20@               Word16 lg,                            /* (i)   : size of x[]                   */
21@               Word16 exp                            /* (i)   : exponent: x = round(x << exp) */
22@)
23@***********************************************************************
24@  x[]   ---  r0
25@  lg    ---  r1
26@  exp   ---  r2
27
28          .section  .text
29          .global   Scale_sig_opt
30
31Scale_sig_opt:
32
33          STMFD   	r13!, {r4 - r12, r14}
34          MOV           r4, #4
35          VMOV.S32      Q15, #0x8000
36          VDUP.S32      Q14, r2
37          MOV           r5, r0                          @ copy x[] address
38          CMP           r1, #64
39          MOVEQ         r4, #1
40          BEQ           LOOP
41	  CMP           r1, #128
42	  MOVEQ         r4, #2
43	  BEQ           LOOP
44          CMP           r1, #256
45          BEQ           LOOP
46	  CMP           r1, #80
47	  MOVEQ         r4, #1
48	  BEQ           LOOP1
49
50LOOP1:
51          VLD1.S16      {Q0, Q1}, [r5]!                 @load 16 Word16 x[]
52          VSHLL.S16     Q10, D0, #16
53          VSHLL.S16     Q11, D1, #16
54          VSHLL.S16     Q12, D2, #16
55          VSHLL.S16     Q13, D3, #16
56          VSHL.S32      Q10, Q10, Q14
57          VSHL.S32      Q11, Q11, Q14
58          VSHL.S32      Q12, Q12, Q14
59          VSHL.S32      Q13, Q13, Q14
60          VADDHN.S32    D16, Q10, Q15
61          VADDHN.S32    D17, Q11, Q15
62          VADDHN.S32    D18, Q12, Q15
63          VADDHN.S32    D19, Q13, Q15
64          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]
65
66LOOP:
67          VLD1.S16      {Q0, Q1}, [r5]!                 @load 16 Word16 x[]
68          VLD1.S16      {Q2, Q3}, [r5]!                 @load 16 Word16 x[]
69          VLD1.S16      {Q4, Q5}, [r5]!                 @load 16 Word16 x[]
70          VLD1.S16      {Q6, Q7}, [r5]!                 @load 16 Word16 x[]
71
72          VSHLL.S16     Q8, D0, #16
73          VSHLL.S16     Q9, D1, #16
74          VSHLL.S16     Q10, D2, #16
75          VSHLL.S16     Q11, D3, #16
76          VSHL.S32      Q8, Q8, Q14
77          VSHL.S32      Q9, Q9, Q14
78          VSHL.S32      Q10, Q10, Q14
79          VSHL.S32      Q11, Q11, Q14
80          VADDHN.S32    D16, Q8, Q15
81          VADDHN.S32    D17, Q9, Q15
82          VADDHN.S32    D18, Q10, Q15
83          VADDHN.S32    D19, Q11, Q15
84          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]
85
86
87          VSHLL.S16     Q12, D4, #16
88          VSHLL.S16     Q13, D5, #16
89          VSHLL.S16     Q10, D6, #16
90          VSHLL.S16     Q11, D7, #16
91          VSHL.S32      Q12, Q12, Q14
92          VSHL.S32      Q13, Q13, Q14
93          VSHL.S32      Q10, Q10, Q14
94          VSHL.S32      Q11, Q11, Q14
95          VADDHN.S32    D16, Q12, Q15
96          VADDHN.S32    D17, Q13, Q15
97          VADDHN.S32    D18, Q10, Q15
98          VADDHN.S32    D19, Q11, Q15
99          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]
100
101          VSHLL.S16     Q10, D8, #16
102          VSHLL.S16     Q11, D9, #16
103          VSHLL.S16     Q12, D10, #16
104          VSHLL.S16     Q13, D11, #16
105          VSHL.S32      Q10, Q10, Q14
106          VSHL.S32      Q11, Q11, Q14
107          VSHL.S32      Q12, Q12, Q14
108          VSHL.S32      Q13, Q13, Q14
109          VADDHN.S32    D16, Q10, Q15
110          VADDHN.S32    D17, Q11, Q15
111          VADDHN.S32    D18, Q12, Q15
112          VADDHN.S32    D19, Q13, Q15
113          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]
114
115          VSHLL.S16     Q10, D12, #16
116          VSHLL.S16     Q11, D13, #16
117          VSHLL.S16     Q12, D14, #16
118          VSHLL.S16     Q13, D15, #16
119          VSHL.S32      Q10, Q10, Q14
120          VSHL.S32      Q11, Q11, Q14
121          VSHL.S32      Q12, Q12, Q14
122          VSHL.S32      Q13, Q13, Q14
123          VADDHN.S32    D16, Q10, Q15
124          VADDHN.S32    D17, Q11, Q15
125          VADDHN.S32    D18, Q12, Q15
126          VADDHN.S32    D19, Q13, Q15
127          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]
128          SUBS          r4, r4, #1
129          BGT           LOOP
130
131
132Scale_sig_asm_end:
133
134          LDMFD   	r13!, {r4 - r12, r15}
135          @ENDFUNC
136          .END
137
138
139