1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@void Scale_sig(
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@	       Word16 x[],                           /* (i/o) : signal to scale               */
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@	       Word16 lg,                            /* (i)   : size of x[]                   */
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@	       Word16 exp                            /* (i)   : exponent: x = round(x << exp) */
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@	       )
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r0 --- x[]
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r1 --- lg
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r2 --- exp
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          .section  .text
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  .global   Scale_sig_opt
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
30e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardScale_sig_opt:
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         STMFD         r13!, {r4 - r12, r14}
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 SUB           r3, r1, #1                  @i = lg - 1
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         CMP           r2, #0                      @Compare exp and 0
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 RSB           r7, r2, #0                  @exp = -exp
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r10, r2, #16                @16 + exp
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r4, r0, r3, LSL #1          @x[i] address
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r8, #0x7fffffff
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r9, #0x8000
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 BLE           LOOP2
41b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
42e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOP1:
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         LDRSH          r5, [r4]                    @load x[i]
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r12, r5, LSL r10
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 TEQ           r5, r12, ASR r10
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 EORNE         r12, r8, r5, ASR #31
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 SUBS          r3, r3, #1
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 QADD          r11, r12, r9
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r12, r11, ASR #16
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 STRH          r12, [r4], #-2
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 BGE           LOOP1
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         BL            The_end
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
55e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOP2:
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         LDRSH          r5, [r4]                   @load x[i]
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r6, r5, LSL #16            @L_tmp = x[i] << 16
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r5, r6, ASR r7             @L_tmp >>= exp
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 QADD          r11, r5, r9
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r12, r11, ASR #16
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 SUBS          r3, r3, #1
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 STRH          r12, [r4], #-2
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 BGE           LOOP2
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
66e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardThe_end:
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         LDMFD         r13!, {r4 - r12, r15}
68b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         @ENDFUNC
70b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard         .END
71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
72b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
73b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
76