Home | History | Annotate | Download | only in ARMV7
      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 Residu (
     18 @    Word16 a[], /* (i)     : prediction coefficients                      */
     19 @    Word16 x[], /* (i)     : speech signal                                */
     20 @    Word16 y[], /* (o)     : residual signal                              */
     21 @    Word16 lg   /* (i)     : size of filtering                            */
     22 @)
     23 @a[]        RN     r0
     24 @x[]        RN     r1
     25 @y[]        RN     r2
     26 @lg         RN     r3
     27 
     28 	.section   .text
     29         .global    Residu_opt
     30 
     31 Residu_opt:
     32 
     33         STMFD          r13!, {r4 - r12, r14}
     34         SUB            r7, r3, #4                       @i = lg - 4
     35 
     36         VLD1.S16       {D0, D1, D2, D3}, [r0]!              @get all a[]
     37 	VLD1.S16       {D4}, [r0]!
     38         VMOV.S32       Q8,  #0x8000
     39 
     40 LOOP1:
     41         ADD            r9, r1, r7, LSL #1               @copy the address
     42         ADD            r10, r2, r7, LSL #1
     43         MOV            r8, r9
     44         VLD1.S16       D5, [r8]!                       @get x[i], x[i+1], x[i+2], x[i+3]
     45         VQDMULL.S16    Q10, D5, D0[0]                  @finish the first L_mult
     46 
     47         SUB            r8, r9, #2                       @get the x[i-1] address
     48         VLD1.S16       D5, [r8]!
     49         VQDMLAL.S16    Q10, D5, D0[1]
     50 
     51         SUB            r8, r9, #4                       @load the x[i-2] address
     52         VLD1.S16       D5, [r8]!
     53         VQDMLAL.S16    Q10, D5, D0[2]
     54 
     55         SUB            r8, r9, #6                       @load the x[i-3] address
     56         VLD1.S16       D5, [r8]!
     57         VQDMLAL.S16    Q10, D5, D0[3]
     58 
     59         SUB            r8, r9, #8                       @load the x[i-4] address
     60         VLD1.S16       D5, [r8]!
     61         VQDMLAL.S16    Q10, D5, D1[0]
     62 
     63         SUB            r8, r9, #10                      @load the x[i-5] address
     64         VLD1.S16       D5, [r8]!
     65         VQDMLAL.S16    Q10, D5, D1[1]
     66 
     67         SUB            r8, r9, #12                      @load the x[i-6] address
     68         VLD1.S16       D5, [r8]!
     69         VQDMLAL.S16    Q10, D5, D1[2]
     70 
     71         SUB            r8, r9, #14                      @load the x[i-7] address
     72         VLD1.S16       D5, [r8]!
     73         VQDMLAL.S16    Q10, D5, D1[3]
     74 
     75         SUB            r8, r9, #16                      @load the x[i-8] address
     76         VLD1.S16       D5, [r8]!
     77         VQDMLAL.S16    Q10, D5, D2[0]
     78 
     79         SUB            r8, r9, #18                      @load the x[i-9] address
     80         VLD1.S16       D5, [r8]!
     81         VQDMLAL.S16    Q10, D5, D2[1]
     82 
     83         SUB            r8, r9, #20                      @load the x[i-10] address
     84         VLD1.S16       D5, [r8]!
     85         VQDMLAL.S16    Q10, D5, D2[2]
     86 
     87 	SUB            r8, r9, #22                      @load the x[i-11] address
     88 	VLD1.S16       D5, [r8]!
     89 	VQDMLAL.S16    Q10, D5, D2[3]
     90 
     91 	SUB            r8, r9, #24                      @load the x[i-12] address
     92 	VLD1.S16       D5, [r8]!
     93 	VQDMLAL.S16    Q10, D5, D3[0]
     94 
     95 	SUB            r8, r9, #26                      @load the x[i-13] address
     96 	VLD1.S16       D5, [r8]!
     97 	VQDMLAL.S16    Q10, D5, D3[1]
     98 
     99 	SUB            r8, r9, #28                      @load the x[i-14] address
    100 	VLD1.S16       D5, [r8]!
    101 	VQDMLAL.S16    Q10, D5, D3[2]
    102 
    103 	SUB            r8, r9, #30                      @load the x[i-15] address
    104 	VLD1.S16       D5, [r8]!
    105 	VQDMLAL.S16    Q10, D5, D3[3]
    106 
    107 	SUB            r8, r9, #32                      @load the x[i-16] address
    108 	VLD1.S16       D5, [r8]!
    109 	VQDMLAL.S16    Q10, D5, D4[0]
    110 
    111         SUB            r7, r7, #4                       @i-=4
    112         VQSHL.S32      Q10, Q10, #4
    113         VQADD.S32      Q10, Q10, Q8
    114         VSHRN.S32      D5, Q10, #16
    115         VST1.S16       D5, [r10]!
    116         CMP            r7,  #0
    117 
    118         BGE            LOOP1
    119 
    120 Residu_asm_end:
    121 
    122         LDMFD      r13!, {r4 - r12, r15}
    123 
    124         @ENDFUNC
    125         .END
    126 
    127 
    128