四、
1、源代碼:
void fir_fxd1(short input[], short coefs[], short out[])
{
int i, j;
for (i = 0; i < 40; i++)
{
for (j = 0; j < 16; j++)
out[i*16+j]= coefs[j] * input[i + 15 - j];
}
}
2、改編后的代碼:
void fir_fxd2(const short input[], const short coefs[], short out[])
{
int i, j;
for (i = 0; i < 40; i++)
{
for (j = 0; j < 16; j++)
out[i*16+j]= coefs[j] * input[i + 15 - j];
}
3、優(yōu)化方法說明:
C6000編譯器如果確定兩條指令是不相關(guān)的,則安排它們并行執(zhí)行。 關(guān)鍵字const可以指定一個(gè)變量或者一個(gè)變量的存儲(chǔ)單元保持不變。這有助于幫助編譯器確定指令的不相關(guān)性。例如上例中,源代碼不能并行執(zhí)行,而結(jié)果改編后的代碼可以并行執(zhí)行。
4、技巧:
使用const可以限定目標(biāo),確定存在于循環(huán)迭代中的存儲(chǔ)器的不相關(guān)性。
五、
1、源代碼:
void vecsum(short *sum, short *in1, short *in2, unsigned int N)
{
int i;
for (i = 0; i < N; i++)
sum[i] = in1[i] + in2[i];
}
2、改編后的代碼:
void vecsum6(int *sum, const int *in1, const int *in2, unsigned int N)
{
int i;
int sz = N >> 2;
_nassert(N >= 20);
for (i = 0; i < sz; i += 2)
{
sum[i] = _add2(in1[i] , in2[i]);
sum[i+1] = _add2(in1[i+1], in2[i+1]);
}
}
3、優(yōu)化方法說明:
源代碼中,函數(shù)變量的定義是 short *sum, short *in1, short *in2, 改編后的代碼函數(shù)變量是 int *sum, const int *in1, const int *in2, 整數(shù)類型由16位改編成32位,這時(shí)使用內(nèi)聯(lián)指令“_add2”一次可以完成兩組16位整數(shù)的加法,效率提高一倍。注意這里還使用了關(guān)鍵字const和內(nèi)聯(lián)指令_nassert優(yōu)化源代碼。
4、技巧:
用內(nèi)聯(lián)指令_add2、_mpyhl、_mpylh完成兩組16位數(shù)的加法和乘法,效率比單純16位數(shù)的加法和乘法提高一倍。
六、if...else...語(yǔ)句的優(yōu)化
(一)
1、源代碼:
if (sub (ltpg, LTP_GAIN_THR1) <= 0)
{
adapt = 0;
}
else
{
if (sub (ltpg, LTP_GAIN_THR2) <= 0)
{
adapt = 1; &n





