на С
#pragma optimize=5
__arm S32 EchoCanceller::CalcFilter(S16 *pData)
{
S32 y=0;
S32 *pA = &A[0];
S32 x = (*pData--);
U32 i = FilterLength;
S32 te = OldE;
do{
S32 x1 = (*pData--);
S32 a = *pA;
a+=(te*x1)>>1;
*pA++ = a;
S32 tmp = (a>>13) * x;
y+=tmp;
x = x1;
}while(--i);
y >>= 14;
return y;
}
На asm
??CalcFilter:
PUSH {R4-R7}
// 105
// 106
// 107 S32 y=0;
MOV R1,#+0
// 108 S32 *pA = &A[0];
LDR R12,??CalcFilter_1 ;; ??Index
LDR R2,[R12, #+4]
// 109
// 110 S32 x = (*pData--);
LDRSH R3,[R0], #-2
// 111
// 112
// 113
// 114
// 116
// 117
// 118 U32 i = FilterLength;
??CalcFilter_4:
LDR R4,[R12, #+12]
// 120
// 121 S32 te = OldE;
??CalcFilter_5:
LDR R5,[R12, #+28]
// 122 do{
// 123
// 124 S32 x1 = (*pData--);
??CalcFilter_7:
LDRSH R12,[R0], #-2
// 125 S32 a = *pA;
// 126 a+=(te*x1)>>1;
LDR R6,[R2, #+0]
MUL R7,R12,R5
ADD R6,R6,R7, ASR #+1
// 127 *pA++ = a;
STR R6,[R2], #+4
// 128 S32 tmp = (a>>13) * x;
// 129 y+=tmp;
ASR R6,R6,#+13
MLA R1,R3,R6,R1
// 130 x = x1;
MOV R3,R12
// 131
// 132 }while(--i);
SUBS R4,R4,#+1
BNE ??CalcFilter_7
// 133
// 134 y >>= 14;
// 135 return y;
ASR R0,R1,#+14
??CalcFilter_6:
POP {R4-R7}
BX LR ;; return