117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@/*
217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** Copyright 2003-2010, VisualOn, Inc.
317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ **
417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** Licensed under the Apache License, Version 2.0 (the "License");
517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** you may not use this file except in compliance with the License.
617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** You may obtain a copy of the License at
717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ **
817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ **     http://www.apache.org/licenses/LICENSE-2.0
917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ **
1017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** Unless required by applicable law or agreed to in writing, software
1117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** distributed under the License is distributed on an "AS IS" BASIS,
1217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** See the License for the specific language governing permissions and
1417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** limitations under the License.
1517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ */
1617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@
1717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@void Pred_lt4(
1817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@     Word16 exc[],                         /* in/out: excitation buffer */
1917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@     Word16 T0,                            /* input : integer pitch lag */
2017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@     Word16 frac,                          /* input : fraction of lag   */
2117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@     Word16 L_subfr                        /* input : subframe size     */
2217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@)
2317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@***********************************************************************
2417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r0    ---  exc[]
2517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r1    ---  T0
2617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r2    ---  frac
2717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r3    ---  L_subfr
2817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
2917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          .section  .text
3017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          .global   pred_lt4_asm
3117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          .extern   inter4_2
3217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
3317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongpred_lt4_asm:
3417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
3517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          STMFD   	r13!, {r4 - r12, r14}
3617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          SUB           r4, r0, r1, LSL #1                        @ x = exc - T0
3717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          RSB           r2, r2, #0                                @ frac = - frac
3817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          SUB           r4, r4, #30                               @ x -= L_INTERPOL2 - 1
3917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          CMP           r2, #0
4017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          ADDLT         r2, r2, #4                                @ frac += UP_SAMP
4117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          SUBLT         r4, r4, #2                                @ x--
4217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
4317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          LDR           r11, Lable1
4417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          RSB           r2, r2, #3                                @ k = UP_SAMP - 1 - frac
4517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          MOV           r8, #0                                    @ j = 0
4617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	  ADD           r11, r11, r2, LSL #6                      @ get inter4_2[k][]
4717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
4817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	  VLD1.S16      {Q0, Q1}, [r11]!
4917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	  VLD1.S16      {Q2, Q3}, [r11]!
5017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
5117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	  MOV           r6, #0x8000
5217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
5317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VLD1.S16      {Q4, Q5}, [r4]!                           @load 16 x[]
5417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VLD1.S16      {Q6, Q7}, [r4]!                           @load 16 x[]
5517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
5617299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOP:
5717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VQDMULL.S16   Q15, D8, D0
5817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VQDMLAL.S16   Q15, D9, D1
5917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VQDMLAL.S16   Q15, D10, D2
6017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VQDMLAL.S16   Q15, D11, D3
6117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
6217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VQDMLAL.S16   Q15, D12, D4
6317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VQDMLAL.S16   Q15, D13, D5
6417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VQDMLAL.S16   Q15, D14, D6
6517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VQDMLAL.S16   Q15, D15, D7
6617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
6717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          LDRSH         r12, [r4], #2
6817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
6917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VEXT.S16      D8, D8, D9, #1
7017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VEXT.S16      D9, D9, D10, #1
7117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VEXT.S16      D10, D10, D11, #1
7217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VEXT.S16      D11, D11, D12, #1
7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VDUP.S16      D24, r12
7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VEXT.S16      D12, D12, D13, #1
7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VEXT.S16      D13, D13, D14, #1
7617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VQADD.S32     D30, D30, D31
7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	  MOV           r11, #0x8000
7917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VPADD.S32     D30, D30, D30
8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          ADD           r8, r8, #1
8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VMOV.S32      r12, D30[0]
8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VEXT.S16      D14, D14, D15, #1
8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          QADD          r1, r12, r12                              @ L_sum = (L_sum << 2)
8517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          VEXT.S16      D15, D15, D24, #1
8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          QADD          r5, r1, r6
8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          MOV           r1, r5, ASR #16
8817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          CMP           r8, r3
8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          STRH          r1, [r0], #2                              @ exc[j] = (L_sum + 0x8000) >> 16
9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          BLT           LOOP
9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongpred_lt4_end:
9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          LDMFD   	r13!, {r4 - r12, r15}
9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
9617299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLable1:
9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          .word   	inter4_2
9817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          @ENDFUNC
9917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          .END
10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
101