| @/* |
| @ ** Copyright 2003-2010, VisualOn, Inc. |
| @ ** |
| @ ** Licensed under the Apache License, Version 2.0 (the "License"); |
| @ ** you may not use this file except in compliance with the License. |
| @ ** You may obtain a copy of the License at |
| @ ** |
| @ ** http://www.apache.org/licenses/LICENSE-2.0 |
| @ ** |
| @ ** Unless required by applicable law or agreed to in writing, software |
| @ ** distributed under the License is distributed on an "AS IS" BASIS, |
| @ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| @ ** See the License for the specific language governing permissions and |
| @ ** limitations under the License. |
| @ */ |
| @ |
| @void Residu( |
| @ Word16 a[], /* (i) Q12 : prediction coefficients */ |
| @ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ |
| @ Word16 y[], /* (o) x2 : residual signal */ |
| @ Word16 lg /* (i) : size of filtering */ |
| @ ) |
| @a[] --- r0 |
| @x[] --- r1 |
| @y[] --- r2 |
| @lg --- r3 |
| |
| .section .text |
| .global Residu_opt |
| |
| Residu_opt: |
| |
| STMFD r13!, {r4 - r12, r14} |
| |
| LDRH r5, [r0], #2 |
| LDRH r6, [r0], #2 |
| ORR r5, r6, r5, LSL #16 @r5 --- a0, a1 |
| |
| LDRH r6, [r0], #2 |
| LDRH r7, [r0], #2 |
| ORR r6, r7, r6, LSL #16 @r6 --- a2, a3 |
| |
| LDRH r7, [r0], #2 |
| LDRH r8, [r0], #2 |
| ORR r7, r8, r7, LSL #16 @r7 --- a4, a5 |
| |
| LDRH r8, [r0], #2 |
| LDRH r9, [r0], #2 |
| ORR r8, r9, r8, LSL #16 @r8 --- a6, a7 |
| |
| LDRH r9, [r0], #2 |
| LDRH r10, [r0], #2 |
| ORR r9, r10, r9, LSL #16 @r9 --- a8, a9 |
| |
| LDRH r10, [r0], #2 |
| LDRH r11, [r0], #2 |
| ORR r10, r11, r10, LSL #16 @r10 --- a10, a11 |
| |
| LDRH r11, [r0], #2 |
| LDRH r12, [r0], #2 |
| ORR r11, r12, r11, LSL #16 @r11 --- a12, a13 |
| |
| LDRH r12, [r0], #2 |
| LDRH r4, [r0], #2 |
| ORR r12, r4, r12, LSL #16 @r12 --- a14, a15 |
| |
| |
| STMFD r13!, {r8 - r12} @store r8-r12 |
| LDRH r4, [r0], #2 @load a16 |
| MOV r14, r3, ASR #2 @one loop get 4 outputs |
| ADD r1, r1, #4 |
| MOV r0, r2 |
| ORR r14, r4, r14, LSL #16 @r14 --- loopnum, a16 |
| |
| residu_loop: |
| |
| LDR r10, [r1], #-4 @r10 --- x[3], x[2] |
| LDR r2, [r1], #-4 @r2 --- x[1], x[0] |
| |
| SMULTB r3, r5, r2 @i1(0) --- r3 = x[0] * a0 |
| SMULTT r4, r5, r2 @i2(0) --- r4 = x[1] * a0 |
| SMULTB r11, r5, r10 @i3(0) --- r11 = x[2] * a0 |
| SMULTT r12, r5, r10 @i4(0) --- r12 = x[3] * a0 |
| |
| SMLABB r4, r5, r2, r4 @i2(1) --- r4 += x[0] * a1 |
| SMLABT r11, r5, r2, r11 @i3(1) --- r11 += x[1] * a0 |
| SMLABB r12, r5, r10, r12 @i4(1) --- r12 += x[2] * a1 |
| |
| SMLATB r11, r6, r2, r11 @i3(2) --- r11 += x[0] * a2 |
| SMLATT r12, r6, r2, r12 @i4(2) --- r12 += x[1] * a2 |
| SMLABB r12, r6, r2, r12 @i4(3) --- r12 += x[0] * a3 |
| |
| LDR r2, [r1], #-4 @r2 ---- x[-1], x[-2] |
| |
| SMLABT r3, r5, r2, r3 @i1(1) --- r3 += x[-1] * a1 |
| SMLATT r4, r6, r2, r4 @i2(2) --- r4 += x[-1] * a2 |
| SMLABT r11, r6, r2, r11 @i3(3) --- r11 += x[-1] * a3 |
| SMLATT r12, r7, r2, r12 @i4(4) --- r12 += x[-1] * a4 |
| SMLATB r3, r6, r2, r3 @i1(2) --- r3 += x[-2] * a2 |
| |
| SMLABB r4, r6, r2, r4 @ i2 (3) |
| SMLATB r11,r7, r2, r11 @ i3 (4) |
| SMLABB r12,r7, r2, r12 @ i4 (5) |
| |
| LDR r2,[r1],#-4 |
| SMLABT r3, r6, r2, r3 @ i1 (3) |
| SMLATT r4, r7, r2, r4 @ i2 (4) |
| SMLABT r11,r7, r2, r11 @ i3 (5) |
| SMLATT r12,r8, r2, r12 @ i4 (6) |
| SMLATB r3, r7, r2, r3 @ i1 (4) |
| SMLABB r4, r7, r2, r4 @ i2 (5) |
| SMLATB r11,r8, r2, r11 @ i3 (6) |
| SMLABB r12,r8, r2, r12 @ i4 (7) |
| |
| LDR r2,[r1],#-4 |
| SMLABT r3, r7, r2, r3 @ i1 (5) |
| SMLATT r4, r8, r2, r4 @ i2 (6) |
| SMLABT r11,r8, r2, r11 @ i3 (7) |
| SMLATT r12,r9, r2, r12 @ i4 (8) |
| SMLATB r3, r8, r2, r3 @ i1 (6) |
| SMLABB r4, r8, r2, r4 @ i2 (7) |
| SMLATB r11,r9, r2, r11 @ i3 (8) |
| SMLABB r12,r9, r2, r12 @ i4 (9) |
| LDR r10, [r13, #8] @ [ a10 | a11] |
| |
| LDR r2,[r1],#-4 |
| SMLABT r3, r8, r2, r3 @ i1 (7) |
| SMLATT r4, r9, r2, r4 @ i2 (8) |
| SMLABT r11,r9, r2, r11 @ i3 (9) |
| SMLATT r12,r10, r2, r12 @ i4 (10) |
| SMLATB r3, r9, r2, r3 @ i1 (8) |
| SMLABB r4, r9, r2, r4 @ i2 (9) |
| SMLATB r11,r10, r2, r11 @ i3 (10) |
| SMLABB r12,r10, r2, r12 @ i4 (11) |
| LDR r8, [r13, #12] @ [ a12 | a13 ] |
| |
| LDR r2,[r1],#-4 |
| SMLABT r3, r9, r2, r3 @ i1 (9) |
| SMLATT r4, r10, r2, r4 @ i2 (10) |
| SMLABT r11,r10, r2, r11 @ i3 (11) |
| SMLATT r12,r8, r2, r12 @ i4 (12) |
| SMLATB r3, r10, r2, r3 @ i1 (10) |
| SMLABB r4, r10, r2, r4 @ i2 (11) |
| SMLATB r11,r8, r2, r11 @ i3 (12) |
| SMLABB r12,r8, r2, r12 @ i4 (13) |
| LDR r9, [r13, #16] @ [ a14 | a15 ] |
| |
| LDR r2,[r1],#-4 |
| SMLABT r3, r10, r2, r3 @ i1 (11) |
| SMLATT r4, r8, r2, r4 @ i2 (12) |
| SMLABT r11,r8, r2, r11 @ i3 (13) |
| SMLATT r12,r9, r2, r12 @ i4 (14) |
| SMLATB r3, r8, r2, r3 @ i1 (12) |
| SMLABB r4, r8, r2, r4 @ i2 (13) |
| SMLATB r11,r9, r2, r11 @ i3 (14) |
| SMLABB r12,r9, r2, r12 @ i4 (15) |
| |
| |
| LDR r2,[r1],#-4 |
| SMLABT r3, r8, r2, r3 @ i1 (13) |
| SMLATT r4, r9, r2, r4 @ i2 (14) |
| SMLABT r11,r9, r2, r11 @ i3 (15) |
| SMLABT r12,r14, r2, r12 @ i4 (16) |
| SMLATB r3, r9, r2, r3 @ i1 (14) |
| SMLABB r4, r9, r2, r4 @ i2 (15) |
| SMLABB r11,r14, r2, r11 @ i3 (16) |
| LDR r8, [r13] @ [ a6 | a7 ] |
| |
| LDR r2,[r1],#44 @ Change |
| SMLABT r3, r9, r2, r3 |
| SMLABB r3, r14, r2, r3 |
| SMLABT r4, r14, r2, r4 |
| LDR r9, [r13, #4] @ [ a8 | a9 ] |
| |
| |
| QADD r3,r3,r3 |
| QADD r4,r4,r4 |
| QADD r11,r11,r11 |
| QADD r12,r12,r12 |
| |
| QADD r3,r3,r3 |
| QADD r4,r4,r4 |
| QADD r11,r11,r11 |
| QADD r12,r12,r12 |
| |
| QADD r3,r3,r3 |
| QADD r4,r4,r4 |
| QADD r11,r11,r11 |
| QADD r12,r12,r12 |
| |
| QADD r3,r3,r3 |
| QADD r4,r4,r4 |
| QADD r11,r11,r11 |
| QADD r12,r12,r12 |
| |
| MOV r2,#32768 |
| |
| QDADD r3,r2,r3 |
| QDADD r4,r2,r4 |
| QDADD r11,r2,r11 |
| QDADD r12,r2,r12 |
| |
| |
| MOV r3,r3,asr #16 |
| MOV r4,r4,asr #16 |
| MOV r11,r11,asr #16 |
| MOV r12,r12,asr #16 |
| |
| STRH r3,[r0],#2 |
| STRH r4,[r0],#2 |
| STRH r11,[r0],#2 |
| STRH r12,[r0],#2 |
| |
| MOV r2,r14,asr #16 |
| SUB r14, r14, #0x10000 |
| SUBS r2,r2,#1 |
| BNE residu_loop |
| end: |
| LDMFD r13!, {r8 -r12} |
| LDMFD r13!, {r4 -r12,pc} |
| |
| @ENDFUNC |
| .END |
| |
| |
| |
| |
| |