Статус нашего сайта: |
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Листинг 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 можно поместить одну за другой, причем каждая из них оказывается связанной с каким-нибудь предикатным регистром (регистр указывается в угловых скобках). Сюда можно поместить любой код, при условии, что каждая команда предсказывается правильно. |