[an error occurred while processing this directive]
Ну потешил сегодня иаровский ''оптимизатор''(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено :) 04 мая 2005 г. 17:23

Имеем функцию:

#define B0 3
#define B2 (-3)
#define A1 114
#define A2 (-57)


__z void CalcFilter(signed char X, TBzFilterData *BzFilter)
{
signed int tmpY;
signed char tmpY1;
signed char k;

tmpY1 = BzFilter->Y1;

tmpY = X * (k = B0);
tmpY += BzFilter->X2 * (k = B2);
tmpY += tmpY1 * (k = A1);
tmpY += BzFilter->Y2 * (k = A2);

tmpY <<= 2;

BzFilter->X2 = BzFilter->X1;
BzFilter->X1 = X;

BzFilter->Y2 = tmpY1;
BzFilter->Y2 = tmpY >> 8;
}
При уровне оптимизации 3 получаем

CalcFilter:
// 11 {
// 12 signed int tmpY;
// 13 signed char tmpY1;
// 14 signed char k;
// 15
// 16 tmpY1 = BzFilter->Y1;
LDD R20, Z+2
// 17
// 18 tmpY = X * (k = B0);
LDI R17, 3
MULS R16, R17
MOVW R19:R18, R1:R0
// 19 tmpY += BzFilter->X2 * (k = B2);
LDI R17, 253
LDD R22, Z+1
MULS R22, R17
ADD R18, R0
ADC R19, R1
// 20 tmpY += tmpY1 * (k = A1);
LDI R17, 114
MULS R20, R17
ADD R18, R0
ADC R19, R1
// 21 tmpY += BzFilter->Y2 * (k = A2);
LDI R17, 199
LDD R22, Z+3
MULS R22, R17
ADD R18, R0
ADC R19, R1
// 22
// 23 tmpY <<= 2;
LSL R18
ROL R19
LSL R18
ROL R19
// 24
// 25 BzFilter->X2 = BzFilter->X1;
LD R17, Z
STD Z+1, R17
// 26 BzFilter->X1 = X;
ST Z, R16
// 27
// 28 BzFilter->Y2 = tmpY1;
STD Z+3, R20
// 29 BzFilter->Y2 = tmpY >> 8;
MOV R18, R19
STD Z+3, R18
// 30 }
RET
Пара ну почти нормально.
Темерь включаем оптимизацию на всю катушку и получаем

CalcFilter:
// 11 {
ST -Y, R25
ST -Y, R24
// 12 signed int tmpY;
// 13 signed char tmpY1;
// 14 signed char k;
// 15
// 16 tmpY1 = BzFilter->Y1;
LDD R18, Z+2
// 17
// 18 tmpY = X * (k = B0);
// 19 tmpY += BzFilter->X2 * (k = B2);
// 20 tmpY += tmpY1 * (k = A1);
// 21 tmpY += BzFilter->Y2 * (k = A2);
MOV R17, R16
LSL R17
SBC R17, R17
LDI R20, 3
LDI R21, 0
MUL R20, R17
ADD R21, R0
MUL R20, R16
MOV R20, R0
ADD R21, R1
LDD R22, Z+1
MOV R23, R22
LSL R23
SBC R23, R23
LDI R24, 253
LDI R25, 255
MUL R25, R22
MOV R25, R0
MUL R24, R23
ADD R25, R0
MUL R24, R22
MOV R24, R0
ADD R25, R1
ADD R24, R20
ADC R25, R21
MOV R19, R18
LSL R19
SBC R19, R19
LDI R22, 114
LDI R23, 0
MUL R22, R19
ADD R23, R0
MUL R22, R18
MOV R22, R0
ADD R23, R1
ADD R22, R24
ADC R23, R25
LDD R2, Z+3
MOV R3, R2
LSL R3
SBC R3, R3
LDI R20, 199
LDI R21, 255
MUL R21, R2
MOV R21, R0
MUL R20, R3
ADD R21, R0
MUL R20, R2
MOV R20, R0
ADD R21, R1
ADD R20, R22
ADC R21, R23
// 22
// 23 tmpY <<= 2;
// 24
// 25 BzFilter->X2 = BzFilter->X1;
LD R17, Z
STD Z+1, R17
// 26 BzFilter->X1 = X;
ST Z, R16
// 27
// 28 BzFilter->Y2 = tmpY1;
STD Z+3, R18
// 29 BzFilter->Y2 = tmpY >> 8;
MOVW R17:R16, R21:R20
LDI R20, 6
CALL ?SS_SHR_L02
STD Z+3, R16
// 30 }
LD R24, Y+
LD R25, Y+
RET
Резултат превзошел самые смелые ожидания!!!

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru