[an error occurred while processing this directive]
Что-то плохо получилось для BF
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

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

Отправлено -рin- 25 июля 2005 г. 10:22
В ответ на: Вполне возможно - я не занимался какими-то особыми оптимизациями, некогда, просто написал втупую. (+) отправлено SM 25 июля 2005 г. 09:18

Наверное надо описание двойных АЛУ прочитать. Или как их там...


include asm_sprt.h

.section data1;
.byte2 p[]={13, 22, 6, 13, 13};

.byte2 u[]={11, 15, 6, 22};

.section program;

// Scratch registers modified:{R0-R3,P0-P2,ASTAT}
// Call preserved registers used:{R4-R7}
.global _ldct2;
_ldct2:
entry;
i0 = r0;
i1 = r0; //*d
r0 += 14;
i2 = r0; //*(d+4)
pushs((r7:4));
first_fly:
r1.l = w[i1++] || r2.l = w[i2--];
r0.h = r1.l + r2.l(s) || r1.l = w[i1++] || r2.l = w[i2--];
r1.h = r1.l + r2.l(s) || r1.l = w[i1++] || r2.l = w[i2--];
r2.h = r1.l + r2.l(s) || r1.l = w[i1] || r2.l = w[i2];
r3.h = r1.l + r2.l(s) || r1.l = w[i1--] || r2.l = w[i2++];
r4.h = r1.l - r2.l(s) || r1.l = w[i1--] || r2.l = w[i2++];
r5.h = r1.l - r2.l(s) || r1.l = w[i1--] || r2.l = w[i2++];
r6.h = r1.l - r2.l(s) || r1.l = w[i1] || r2.l = w[i2];
r7.h = r1.l - r2.l(s);
first_fly.END:

first_lift:
i1.l = p+6;
i1.h = p+6;
i2.l = u+6;
i2.h = u+6;
r1.l = w[i1++] || r2.l = w[i2]; //t=p[3]*x1[6]>>SH;
r0.l = r1.l * r6.h (is); //r0.l == t
r0.l = r0.l >>> 5;
r5.h = r5.h - r0.l(s); //x1[5]=x1[5]-t;
r0.l = r5.h * r2.l (is); //t=x1[5]*u[3]>>SH;
r0.l = r0.l >>> 5;
r6.h = r0.l + r6.h(s) || r1.l = w[i1];//x1[6]=t+x1[6];
r0.l = r1.l * r6.h (is); //t=p[4]*x1[6]>>SH;
r0.l = r0.l >>> 5;
r5.h = r0.l - r5.h(s); //x1[5]=-x1[5]+t;
first_lift.END:


second_bfly:
r0.l = r0.h + r3.h (s); //x2[0]=x1[0]+x1[3];
r1.l = r1.h + r2.h (s); //x2[1]=x1[1]+x1[2];
r2.l = r1.h - r2.h (s); //x2[2]=x1[1]-x1[2];
r3.l = r0.h - r3.h (s); //x2[3]=x1[0]-x1[3];
r4.l = r4.h + r5.h (s); //x2[4]=x1[4]+x1[5];
r5.l = r4.h - r5.h (s); //x2[5]=x1[4]-x1[5];
r6.l = r7.h - r6.h (s); //x2[6]=-x1[6]+x1[7];
r7.l = r6.h + r7.h (s); //x2[7]=x1[6]+x1[7];
second_bfly.END:

second_lift:
i1.l = p;
i1.h = p;
i2.l = u;
i2.h = u;
//x2[0]=x2[0]+x2[1];+
r0.h = r0.l + r1.l (s);
//x2[1]=-x2[1]+(x2[0]>>1);+
r0.l = r0.h >>> 1;
r1.h = r0.l - r1.l (s);
//t=p[0]*x2[3]>>SH;
r1.l = w[i1]; //r1.l == p
r0.l = r1.l * r3.l (is); //t == r0.l
r0.l = r0.l >>> 5;
//x2[2]=-x2[2]+t;
r2.h = r0.l - r2.l (s);
//t=u[0]*x2[2]>>SH;
r1.l = w[i2]; //r1.l == u
r0.l = r1.l * r2.h (is);
r0.l = r0.l >>> 5;
//x2[3]=x2[3]-t;
r3.h = r3.l - r0.l (s);
//t=p[2]*x2[7]>>SH;
i1 += 4;
r1.l = w[i1]; //r1.l == p
r0.l = r1.l * r7.l (is);
r0.l = r0.l >>> 5;
//x2[4]=-x2[4]+t;
r4.h = r0.l - r4.l (s);
//t=u[2]*x2[4]>>SH;
i2 += 4;
r1.l = w[i2]; //r1.l == u
r0.l = r1.l * r4.h (is);
r0.l = r0.l >>> 5;
//x2[7]=x2[7]-t;
r7.h = r7.l - r0.l (s);
//t=p[1]*x2[6]>>SH;
i1 -= 2;
r1.l = w[i1]; //r1.l == p
r0.l = r1.l * r6.l (is);
r0.l = r0.l >>> 5;
//x2[5]=x2[5]+t;
r5.h = r5.l + r0.l (s);
//t=u[1]*x2[5]>>SH;
i2 -= 2;
r1.l = w[i2]; //r1.l == u
r0.l = r1.l * r5.h (is);
r0.l = r0.l >>> 5;
//x2[6]=x2[6]-t;
r6.h = r6.l - r0.l (s);
second_lift.END:

output_perm_and:
//x[0]=x2[0]>>NS;
r0.l = r0.h >>> 2;
//x[1]=x2[7]>>NS;
w[i0++] = r0.l || r7.l = r7.h >>> 2;
//x[2]=x2[3]>>NS;
w[i0++] = r7.l || r3.l = r3.h >>> 2;
//x[3]=x2[6]>>NS;
w[i0++] = r3.l || r6.l = r6.h >>> 2;
//x[4]=x2[1]>>NS;
w[i0++] = r6.l || r1.l = r1.h >>> 2;
//x[5]=x2[5]>>NS;
w[i0++] = r1.l || r5.l = r5.h >>> 2;
//x[6]=x2[2]>>NS;
w[i0++] = r5.l || r2.l = r2.h >>> 2;
//x[7]=x2[4]>>NS;
w[i0++] = r2.l || r4.l = r4.h >>> 2;
w[i0++] = r4.l;
output_perm_and.END:
pops((r7:4));
_ldct2.END:
exit;



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

Ответы


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

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

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

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

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


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

E-mail: info@telesys.ru