Ограничения при использовании циклов

Ограничения определяются 3-ступенчатой конвейеризацией в процессорах семейства ADSP-21000:

- последние три инструкции цикла не могут быть любыми переходами, за исключением перехода с прекращением цикла с модификатором (LA);

- вложенные циклы не могут прерываться на 1 и той же инструкцией;

- для предотвращения пустых избыточных тактов циклы единичной длины данных выполняются минимум три раза, а двоичной длины - два раза;

- если цикл, основанный не на счетчике, является вложенным, то адрес окончания внешнего цикла должен располагаться по крайней мере на два адреса после адреса окончания внутреннего цикла.

Циклы, основанные не на счетчике

Для правильного функционирования цикла, основанного не на счетчике, необходимо, чтобы его длина была не менее трех инструкций, так как условие выхода проверяется за две инструкции до конца цикла. В противном случае количество итераций цикла может оказаться неверным. Поэтому обычно используют бесконечный цикл с командой условного перехода JUMP с модификатором (LA) для своевременного выхода из цикла.

Примеры:

//-----------------------------------------

// цикл по счетчику, вложенный цикл

//-----------------------------------------

LCNTR = 3, DO asdc UNTIL LCE;

R2 = R2 + 1;

asdc: R1 = R1 + 1;

//-----------------------------------------

//-----------------------------------------

// цикл по арифметическому условию

//-----------------------------------------

R1 = 5;

R5 = 5;

DO ccc UNTIL EQ;

DO asda UNTIL EQ;

R4 = 25;

R1 = R1 - 1; // проверка условия

R5 = R5 - 1;

R6 = R8;

asda: R7 = 16;

ccc: R5 = 66;

//-----------------------------------------

/-----------------------------------------

// бесконечный цикл с выходом по JUMP (LA)

//-----------------------------------------

R1 = 5;

DO asdb UNTIL FOREVER;

R4 = 25;

R6 = R5 + R14;

R1 = R1 - 1;

IF EQ JUMP exit_loop (LA);

R7 = 16;

asdb: R2 = R2 + 1;

exit_loop: R7 = R6 + R2;

//-----------------------------------------

//-----------------------------------------

// вызов ПП и возврат в цикл с модификатором (LR)

//-----------------------------------------

LCNTR = 5, DO asde UNTIL LCE;

R1 = R1 - 1;

R7 = 16;

R2 = R2 + 1; // здесь нельзя CALL!!!

CALL retre;

asde: R7 = R6 + R2;

jump start1;

retre: rts (DB, LR);

nop;

nop;

//-----------------------------------------

//-----------------------------------------

// организация цикла без использования DO...UNTIL

//-----------------------------------------

start1:

// для PC Stack

PUSH PCSTK;

PCSTK = StartLoop;

// для Loop Address Stack

R2 = EndLoop;

R3 = 0xF; // 0xF = 'LCE'

R2 = R2 or FDEP R3 BY 24:5;

R3 = 0x3; // 11 - цикл по счетчику, длина > 2

R2 = R2 or FDEP R3 BY 30:2;

// LCNTR = 3; // если здесь, то не надо CURLCNTR

PUSH LOOP;

LADDR = R2;

// для Loop Counter Stack

CURLCNTR = 3;

StartLoop: R1 = 1;

R2 = 2;

R3 = 3;

EndLoop: R4 = 4;

nop;

nop;

//--------------

Кэш инструкций. Структура и функционирование. Возможности управления обновлением кэша. Примеры повышения/понижения эффективности выполнения кода с учетом работы кэша.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: