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