@/* | |
@ ** 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 | |