Статус
нашего
сайта:
ICQ Secrets Center is Online  ICQ Information Center


ICQ SHOP
     5-значные
     6-значные
     7-значные
     8-значные
     9-значные
     Rippers List
ОПЛАТА
СТАТЬИ
СЕКРЕТЫ
HELP CENTER
OWNED LIST
РОЗЫСК!New!
ICQ РЕЛИЗЫ
Протоколы ICQ
LOL ;-)
Настройка компьютера
Аватарки
Смайлики
СОФТ
     Mail Checkers
     Bruteforces
     ICQTeam Soft
     8thWonder Soft
     Other Progs
     ICQ Patches
     Miranda ICQ
ФорумАрхив!
ВАШ АККАУНТ
ICQ LiveJournal

Реклама

Наш канал:

irc.icqinfo.ru

Таненбаум Э.- Архитектура компьютера. стр.327


Таненбаум Э.- Архитектура компьютера. стр.327

Листинг 5.9. Оператор if

if (Rl—0)

R2 = R3;

Листинг 5.10. Код на ассемблере для листинга 5.9

CMP R1.0

BNE L1 MOV R2, R3 L1:

Листинг 5.11. Условная команда

CMOVZ R2.R3.R1

Если у нас есть команда, которая может копировать данные, когда какой-либо регистр равен нулю, значит, у нас может быть и такая команда, которая копирует данные, если какой-нибудь регистр не равен нулю. Пусть это будет команда CM0VN. При наличии обеих команд мы уже на пути к полному условному выполнению. Представим оператор if с несколькими операторами присваивания в части then и несколькими операторами присваивания в части el se. Весь этот фраг мент программы можно транслировать в код, который будет устанавливать какой-нибудь регистр на 0, если условие не выполнено, и на какое-нибудь другое значение, если условие выполнено. Таким образом, присваивания в части then можно скомпилировать в последовательность команд CM0VN, а присваивания в части el se — в последовательность команд CM0VZ.

Все эти команды, в том числе команды установки регистров, CN0VN и CM0VZ, формируют единый основной блок без условных переходов. Команды можно даже переупорядочить при компиляции или во время выполнения программы. Единственное требование состоит в том, чтобы условие было известно к тому моменту, когда условные команды потребуется помещать в выходные регистры (то есть где-то в конце конвейера). Простой пример фрагмента программы с операторами then и else приведен в листингах 5.12-5.14.

Листинг 5.12, Оператор if

if(Rl == 0) {

R2 = R3;

R4 = R5; } else {

R6 = R7;

R8 - R9;

}

Листинг 5.13. Код на ассемблере для листинга 5.12

CMP R1.0

BNE L1 MOV R2.R3 MOV R4.R5 BR L2 LI: MOV R6.R7 MOV R8.R9

L2:

Листинг 5.14. Условное выполнение

CMOVZ R2.R3.R1 CMOVZ R4.R5.R1 CMOVN R6.R7.R1 CMOVN R8.R9.R1

Мы показали только очень простые условные команды (взятые из архитектуры команд Pentium 4), но в архитектуре IA-64 все команды предикатные. Это значит, что выполнение каждой команды можно сделать условным. Дополнительное 6-разрядное поле предикатного регистра, о котором мы упомянули, позволяет выбрать один из 64 1-разрядных предикатных регистров. Следовательно, оператор if может быть скомпилирован в код, который устанавливает один из предикатных регистров в 1, если условие истинно, и в 0, если условие ложно. Одновременно и автоматически инвертируется другой предикатный регистр. Таким образом, при поддержке предикации машинные команды, которые формируются из операторов then и el se, сливаются в единый поток команд, причем у команд первого из них поле предикатного регистра оказывается единичным, у второго — нулевым.

В листингах 5.15-5.17 показано, как использовать предикацию для устранения переходов. Команда CMPEQ сравнивает два регистра и устанавливает предикатный регистр Р4 в 1, если они равны, и в 0, если они не равны. Кроме того, команда инвертирует еще один регистр, например, Р5. После этого команды частей

if и then можно поместить одну за другой, причем каждая из них оказывается связанной с каким-нибудь предикатным регистром (регистр указывается в угловых скобках). Сюда можно поместить любой код, при условии, что каждая команда предсказывается правильно.


⇐ Предыдущая страница| |Следующая страница ⇒

.