Deemph_32_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@void Deemph_32(
18@     Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */
19@     Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */
20@     Word16 y[],                           /* (o)     : output signal (x16)      */
21@     Word16 mu,                            /* (i) Q15 : deemphasis factor        */
22@     Word16 L,                             /* (i)     : vector size              */
23@     Word16 * mem                          /* (i/o)   : memory (y[-1])           */
24@     )
25
26@x_hi     RN      R0
27@x_lo     RN      R1
28@y[]      RN      R2
29@*mem     RN      R3
30
31           .section  .text
32           .global   Deemph_32_asm
33
34Deemph_32_asm:
35
36           STMFD   	r13!, {r4 - r12, r14}
37	   MOV          r4, #2                   @i=0
38	   LDRSH        r6, [r0], #2             @load x_hi[0]
39	   LDRSH        r7, [r1], #2             @load x_lo[0]
40	   LDR          r5, =22282               @r5---mu
41	   MOV          r11, #0x8000
42
43           @y[0]
44	   MOV          r10, r6, LSL #16         @L_tmp = x_hi[0]<<16
45	   MOV          r8,  r5, ASR #1          @fac = mu >> 1
46	   LDR          r5,  [r3]
47	   ADD          r12, r10, r7, LSL #4     @L_tmp += x_lo[0] << 4
48	   MOV          r10, r12, LSL #3         @L_tmp <<= 3
49	   MUL          r9, r5, r8
50	   LDRSH        r6, [r0], #2             @load x_hi[1]
51	   QDADD        r10, r10, r9
52	   LDRSH        r7, [r1], #2             @load x_lo[1]
53	   MOV          r12, r10, LSL #1         @L_tmp = L_mac(L_tmp, *mem, fac)
54	   QADD         r10, r12, r11
55	   MOV          r14, r10, ASR #16        @y[0] = round(L_tmp)
56
57
58	   MOV          r10, r6, LSL #16
59	   ADD          r12, r10, r7, LSL #4
60           STRH         r14, [r2], #2            @update y[0]
61	   MOV          r10, r12, LSL #3
62	   MUL          r9, r14, r8
63	   QDADD        r10, r10, r9
64	   MOV          r12, r10, LSL #1
65	   QADD         r10, r12, r11
66	   MOV          r14, r10, ASR #16        @y[1] = round(L_tmp)
67
68LOOP:
69           LDRSH        r6, [r0], #2             @load x_hi[]
70	   LDRSH        r7, [r1], #2
71	   STRH         r14, [r2], #2
72	   MOV          r10, r6, LSL #16
73	   ADD          r12, r10, r7, LSL #4
74	   MUL          r9, r14, r8
75	   MOV          r10, r12, LSL #3
76	   QDADD        r10, r10, r9
77           LDRSH        r6, [r0], #2             @load x_hi[]
78	   MOV          r12, r10, LSL #1
79	   QADD         r10, r12, r11
80	   LDRSH        r7, [r1], #2
81	   MOV          r14, r10, ASR #16
82
83	   MOV          r10, r6, LSL #16
84	   ADD          r12, r10, r7, LSL #4
85	   STRH         r14, [r2], #2
86	   MUL          r9, r14, r8
87	   MOV          r10, r12, LSL #3
88	   QDADD        r10, r10, r9
89           ADD          r4, r4, #2
90	   MOV          r12, r10, LSL #1
91	   QADD         r10, r12, r11
92           CMP          r4, #64
93	   MOV          r14, r10, ASR #16
94
95           BLT          LOOP
96           STR          r14, [r3]
97           STRH         r14, [r2]
98
99           LDMFD   	r13!, {r4 - r12, r15}
100
101	   .END
102
103