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 Convolve (
1817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@*    Word16 x[],        /* (i)     : input vector                           */
1917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@*    Word16 h[],        /* (i)     : impulse response                       */
2017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@*    Word16 y[],        /* (o)     : output vector                          */
2117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@*    Word16 L           /* (i)     : vector size                            */
2217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@*)
2317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@
2417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r0 --- x[]
2517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r1 --- h[]
2617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r2 --- y[]
2717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r3 --- L
2817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
2917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	.section  .text
3017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        .global   Convolve_asm
3117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
3217299ab50ceb70d904e610e3b2d7fb2361a11e03James DongConvolve_asm:
3317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
3417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        STMFD          r13!, {r4 - r12, r14}
3517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r3,  #0
3617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r11, #0x8000
3717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
3817299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOP:
3917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        @MOV            r8, #0                            @ s = 0
4017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r4, r1, r3, LSL #1                @ tmpH address
4117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r5, r3, #1                        @ i = n + 1
4217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r6, r0
4317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r9,  [r6], #2                     @ *tmpX++
4417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r10, [r4]                         @ *tmpH--
4517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUB            r5, r5, #1
4617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       Q10, #0
4717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MUL            r8,  r9, r10
4817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
4917299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOP1:
5017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        CMP            r5, #0
5117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        BLE            L1
5217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUB            r4, r4, #8
5317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r9, r4
5417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       D0, [r6]!
5517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       D1, [r9]!
5617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VREV64.16      D1, D1
5717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUBS           r5, r5, #4
5817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D0, D1
5917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        B              LOOP1
6017299ab50ceb70d904e610e3b2d7fb2361a11e03James DongL1:
6117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VADD.S32       D20, D20, D21
6217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VPADD.S32      D20, D20, D20
6317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       r5, D20[0]
6417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r5, r5, r8
6517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r5, r11, r5, LSL #1
6617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r5, r5, LSR #16                   @extract_h(s)
6717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r3, r3, #1
6817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        STRH           r5, [r2], #2                      @y[n]
6917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
7017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
7117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        @MOV            r8, #0
7217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r4, r1, r3, LSL #1                @tmpH address
7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r5, r3, #1
7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r6, r0
7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r9,  [r6], #2                     @ *tmpX++
7617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r10, [r4], #-2
7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r12, [r6], #2
7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r14, [r4]
7917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MUL            r8, r9, r10
8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUB            r5, r5, #2
8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MLA            r8, r12, r14, r8
8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       Q10, #0
8517299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOP2:
8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        CMP            r5, #0
8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        BLE            L2
8817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUB            r4, r4, #8
8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r9, r4
9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       D0, [r6]!
9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       D1, [r9]!
9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUBS           r5, r5, #4
9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VREV64.16      D1, D1
9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D0, D1
9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        B              LOOP2
9617299ab50ceb70d904e610e3b2d7fb2361a11e03James DongL2:
9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VADD.S32       D20, D20, D21
9817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VPADD.S32      D20, D20, D20
9917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       r5, D20[0]
10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r8, r8, r5
10117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r8, r11, r8, LSL #1
10217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r8, r8, LSR #16                   @extract_h(s)
10317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r3, r3, #1
10417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        STRH           r8, [r2], #2                      @y[n]
10517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
10617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
10717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        @MOV            r8, #0
10817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r4, r1, r3, LSL #1
10917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r5, r3, #1
11017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r6, r0
11117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r9,  [r6], #2
11217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r10, [r4], #-2
11317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r12, [r6], #2
11417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r14, [r4], #-2
11517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MUL            r8, r9, r10
11617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r9,  [r6], #2
11717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r10, [r4]
11817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MLA            r8, r12, r14, r8
11917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUB            r5, r5, #3
12017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MLA            r8, r9, r10, r8
12117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
12217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       Q10, #0
12317299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOP3:
12417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        CMP            r5, #0
12517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        BLE            L3
12617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUB            r4, r4, #8
12717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r9, r4
12817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       D0, [r6]!
12917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       D1, [r9]!
13017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VREV64.16      D1, D1
13117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUBS           r5, r5, #4
13217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D0, D1
13317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        B              LOOP3
13417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
13517299ab50ceb70d904e610e3b2d7fb2361a11e03James DongL3:
13617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VADD.S32       D20, D20, D21
13717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VPADD.S32      D20, D20, D20
13817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       r5, D20[0]
13917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r8, r8, r5
14017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r8, r11, r8, LSL #1
14117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r8, r8, LSR #16                   @extract_h(s)
14217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r3, r3, #1
14317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        STRH           r8, [r2], #2                      @y[n]
14417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
14517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r5, r3, #1                        @ i = n + 1
14617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r4, r1, r5, LSL #1                @ tmpH address
14717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r6, r0
14817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       Q10, #0
14917299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOP4:
15017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        CMP            r5, #0
15117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        BLE            L4
15217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUB            r4, r4, #8
15317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r9, r4
15417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       D0, [r6]!
15517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       D1, [r9]!
15617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VREV64.16      D1, D1
15717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUBS           r5, r5, #4
15817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D0, D1
15917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        B              LOOP4
16017299ab50ceb70d904e610e3b2d7fb2361a11e03James DongL4:
16117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VADD.S32       D20, D20, D21
16217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VPADD.S32      D20, D20, D20
16317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       r5,  D20[0]
16417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r5, r11, r5, LSL #1
16517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r5, r5, LSR #16                   @extract_h(s)
16617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r3, r3, #1
16717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        STRH           r5, [r2], #2                      @y[n]
16817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
16917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        CMP            r3, #64
17017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        BLT            LOOP
17117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
17217299ab50ceb70d904e610e3b2d7fb2361a11e03James DongConvolve_asm_end:
17317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
17417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDMFD      r13!, {r4 - r12, r15}
17517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
17617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        @ENDFUNC
17717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        .END
17817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
179