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