1956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@/* 2956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** Copyright 2003-2010, VisualOn, Inc. 3956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** 4956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** Licensed under the Apache License, Version 2.0 (the "License"); 5956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** you may not use this file except in compliance with the License. 6956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** You may obtain a copy of the License at 7956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** 8956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** http://www.apache.org/licenses/LICENSE-2.0 9956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** 10956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** Unless required by applicable law or agreed to in writing, software 11956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** distributed under the License is distributed on an "AS IS" BASIS, 12956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** See the License for the specific language governing permissions and 14956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** limitations under the License. 15956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ */ 16956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ 17956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@*void Convolve ( 18956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@* Word16 x[], /* (i) : input vector */ 19956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@* Word16 h[], /* (i) : impulse response */ 20956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@* Word16 y[], /* (o) : output vector */ 21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@* Word16 L /* (i) : vector size */ 22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@*) 23b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard@ 24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r0 --- x[] 25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r1 --- h[] 26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r2 --- y[] 27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r3 --- L 28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 29b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard .section .text 30b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard .global Convolve_asm 31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongConvolve_asm: 33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 34b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard STMFD r13!, {r4 - r12, r14} 35b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard MOV r3, #0 36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r11, #0x8000 37b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 38b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardLOOP: 39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong @MOV r8, #0 @ s = 0 40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r4, r1, r3, LSL #1 @ tmpH address 41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r5, r3, #1 @ i = n + 1 42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r6, r0 43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r9, [r6], #2 @ *tmpX++ 44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r10, [r4] @ *tmpH-- 45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong SUB r5, r5, #1 46b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VMOV.S32 Q10, #0 47b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard MUL r8, r9, r10 48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 49b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardLOOP1: 50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong CMP r5, #0 51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong BLE L1 52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong SUB r4, r4, #8 53956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r9, r4 54b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VLD1.S16 D0, [r6]! 55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VLD1.S16 D1, [r9]! 56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VREV64.16 D1, D1 57b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard SUBS r5, r5, #4 58b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VMLAL.S16 Q10, D0, D1 59b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard B LOOP1 60b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardL1: 61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VADD.S32 D20, D20, D21 62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VPADD.S32 D20, D20, D20 63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VMOV.S32 r5, D20[0] 64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r5, r5, r8 65956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r5, r11, r5, LSL #1 66956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r5, r5, LSR #16 @extract_h(s) 67956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r3, r3, #1 68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong STRH r5, [r2], #2 @y[n] 69956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 71956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong @MOV r8, #0 72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r4, r1, r3, LSL #1 @tmpH address 73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r5, r3, #1 74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r6, r0 75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r9, [r6], #2 @ *tmpX++ 76b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard LDRSH r10, [r4], #-2 77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r12, [r6], #2 78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r14, [r4] 79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MUL r8, r9, r10 81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong SUB r5, r5, #2 82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MLA r8, r12, r14, r8 83b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VMOV.S32 Q10, #0 85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongLOOP2: 86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong CMP r5, #0 87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong BLE L2 88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong SUB r4, r4, #8 89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r9, r4 90b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VLD1.S16 D0, [r6]! 91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VLD1.S16 D1, [r9]! 92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong SUBS r5, r5, #4 93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VREV64.16 D1, D1 94b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VMLAL.S16 Q10, D0, D1 95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong B LOOP2 96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongL2: 97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VADD.S32 D20, D20, D21 98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VPADD.S32 D20, D20, D20 99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VMOV.S32 r5, D20[0] 100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r8, r8, r5 101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r8, r11, r8, LSL #1 102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r8, r8, LSR #16 @extract_h(s) 103b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ADD r3, r3, #1 104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong STRH r8, [r2], #2 @y[n] 105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong @MOV r8, #0 108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r4, r1, r3, LSL #1 109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r5, r3, #1 110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r6, r0 111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r9, [r6], #2 112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r10, [r4], #-2 113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r12, [r6], #2 114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r14, [r4], #-2 115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MUL r8, r9, r10 116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r9, [r6], #2 117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDRSH r10, [r4] 118b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard MLA r8, r12, r14, r8 119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong SUB r5, r5, #3 120956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MLA r8, r9, r10, r8 121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VMOV.S32 Q10, #0 123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongLOOP3: 124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong CMP r5, #0 125956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong BLE L3 126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong SUB r4, r4, #8 127956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r9, r4 128b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VLD1.S16 D0, [r6]! 129956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VLD1.S16 D1, [r9]! 130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VREV64.16 D1, D1 131956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong SUBS r5, r5, #4 132b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VMLAL.S16 Q10, D0, D1 133b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard B LOOP3 134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongL3: 136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VADD.S32 D20, D20, D21 137956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VPADD.S32 D20, D20, D20 138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VMOV.S32 r5, D20[0] 139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r8, r8, r5 140956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r8, r11, r8, LSL #1 141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r8, r8, LSR #16 @extract_h(s) 142956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r3, r3, #1 143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong STRH r8, [r2], #2 @y[n] 144956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r5, r3, #1 @ i = n + 1 146956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r4, r1, r5, LSL #1 @ tmpH address 147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r6, r0 148956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VMOV.S32 Q10, #0 149b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardLOOP4: 150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong CMP r5, #0 151956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong BLE L4 152956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong SUB r4, r4, #8 153956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r9, r4 154b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VLD1.S16 D0, [r6]! 155956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VLD1.S16 D1, [r9]! 156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VREV64.16 D1, D1 157b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard SUBS r5, r5, #4 158b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard VMLAL.S16 Q10, D0, D1 159b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard B LOOP4 160b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardL4: 161956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VADD.S32 D20, D20, D21 162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VPADD.S32 D20, D20, D20 163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong VMOV.S32 r5, D20[0] 164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r5, r11, r5, LSL #1 165956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong MOV r5, r5, LSR #16 @extract_h(s) 166956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ADD r3, r3, #1 167956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong STRH r5, [r2], #2 @y[n] 168b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 169956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong CMP r3, #64 170956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong BLT LOOP 171b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 172b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardConvolve_asm_end: 173b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 174956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong LDMFD r13!, {r4 - r12, r15} 175b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 176956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong @ENDFUNC 177956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong .END 178956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 179