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 Pred_lt4(
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@     Word16 exc[],                         /* in/out: excitation buffer */
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@     Word16 T0,                            /* input : integer pitch lag */
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@     Word16 frac,                          /* input : fraction of lag   */
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@     Word16 L_subfr                        /* input : subframe size     */
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@)
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@***********************************************************************
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ r0    ---  exc[]
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ r1    ---  T0
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ r2    ---  frac
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ r3    ---  L_subfr
28b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
29b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          .section  .text
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          .global   pred_lt4_asm
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          .extern   inter4_2
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardpred_lt4_asm:
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
35b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          STMFD   	r13!, {r4 - r12, r14}
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          SUB           r4, r0, r1, LSL #1                        @ x = exc - T0
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          RSB           r2, r2, #0                                @ frac = - frac
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          SUB           r4, r4, #30                               @ x -= L_INTERPOL2 - 1
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          CMP           r2, #0
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          ADDLT         r2, r2, #4                                @ frac += UP_SAMP
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          SUBLT         r4, r4, #2                                @ x--
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
4374bc3e133bd59a65dbed70b5fc89549f04a545e2Ard Biesheuvel          ADR           r8, Lable1
4474bc3e133bd59a65dbed70b5fc89549f04a545e2Ard Biesheuvel          LDR           r11, [r8]
4574bc3e133bd59a65dbed70b5fc89549f04a545e2Ard Biesheuvel          ADD           r11, r8
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          RSB           r2, r2, #3                                @ k = UP_SAMP - 1 - frac
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          MOV           r8, #0                                    @ j = 0
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  ADD           r11, r11, r2, LSL #6                      @ get inter4_2[k][]
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  VLD1.S16      {Q0, Q1}, [r11]!
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  VLD1.S16      {Q2, Q3}, [r11]!
52b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
53b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	  MOV           r6, #0x8000
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VLD1.S16      {Q4, Q5}, [r4]!                           @load 16 x[]
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VLD1.S16      {Q6, Q7}, [r4]!                           @load 16 x[]
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
58e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOP:
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VQDMULL.S16   Q15, D8, D0
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VQDMLAL.S16   Q15, D9, D1
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VQDMLAL.S16   Q15, D10, D2
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VQDMLAL.S16   Q15, D11, D3
63b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VQDMLAL.S16   Q15, D12, D4
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VQDMLAL.S16   Q15, D13, D5
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VQDMLAL.S16   Q15, D14, D6
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VQDMLAL.S16   Q15, D15, D7
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
69b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          LDRSH         r12, [r4], #2
70b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.S16      D8, D8, D9, #1
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.S16      D9, D9, D10, #1
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.S16      D10, D10, D11, #1
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.S16      D11, D11, D12, #1
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VDUP.S16      D24, r12
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.S16      D12, D12, D13, #1
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.S16      D13, D13, D14, #1
78b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VQADD.S32     D30, D30, D31
80b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	  MOV           r11, #0x8000
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VPADD.S32     D30, D30, D30
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          ADD           r8, r8, #1
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VMOV.S32      r12, D30[0]
84b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          VEXT.S16      D14, D14, D15, #1
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          QADD          r1, r12, r12                              @ L_sum = (L_sum << 2)
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.S16      D15, D15, D24, #1
88b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          QADD          r5, r1, r6
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          MOV           r1, r5, ASR #16
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          CMP           r8, r3
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          STRH          r1, [r0], #2                              @ exc[j] = (L_sum + 0x8000) >> 16
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          BLT           LOOP
93b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardpred_lt4_end:
95b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
96b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          LDMFD   	r13!, {r4 - r12, r15}
97b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
98e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLable1:
9974bc3e133bd59a65dbed70b5fc89549f04a545e2Ard Biesheuvel          .word   	inter4_2-Lable1
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          @ENDFUNC
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          .END
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
103