Скачиваний:
56
Добавлен:
16.04.2013
Размер:
67.07 Кб
Скачать

2.3. Использование инструкций IntelItanium

Инструкции Itaniumгруппируются по три в 128-битные связки (bundles). Каждая инструкция занимает в связке либо первый, либо второй, либо третий слот. Ниже описаны формат команды, выражение параллелизма и спецификация связки.

2.3.1. Формат

Инструкции типа Itaniumимеют следующий синтаксис:

[qp] mnemonic[.comp] dest=srcs

где

qpЗадает квалификационный предикатный регистр. Значение квалификационного предиката определяет, будут ли результаты этой инструкции переданы аппаратуре, либо будут отвергнуты. Если значение предикатного регистра – истина (1), то инструкция выполняется, ее результаты передаются, а любые происходящие исключения обрабатываются как обычно. Если значение предикатного регистра – ложь (0), то результаты не передаются и не вызываются никакие исключения. Большинство инструкцийItaniumмогут сопровождаться квалификационным предикатом.

mnemonicОпределяет имя, которое уникально идентифицируетItaniumинструкцию.

compЗадает одно или несколько расширений (completers) инструкции. Расширения указывают необязательные разновидности базовой мнемоники инструкции. Расширения следуют за мнемоникой и отделяются точками.

dest Представляет собой конечный операнд(ы), который обычно является результирующим значением произведенным инструкцией.

srcs Представляет исходные операнды. Большинство инструкцийItaniumимеет, по крайней мере, два исходных операнда.

2.3.2. Выраженный параллелизм

Архитектура Itaniumтребует, чтобы компилятор или программист, пишущий на ассемблере, явно указывал группы инструкций, называемыегруппами инструкций (instruction groups), которые не имеют регистровых зависимостей чтение после записи (RAW) и запись после записи (WAW). В исходном ассемблерном коде, группы инструкций разграниченыстопами (stop). Так как группы инструкций не имеют регистровых зависимостейRAWиWAW, то они могут использоваться без аппаратных проверок регистровых зависимостей между инструкциями. Ниже, в обоих примерах показаны две группы инструкций разделенных стопами (обозначенными двойными точками с запятой):

ld8 r1=[r5] ;;// Первая группа

add r3=r1,r4 // Вторая группа

Ниже показан более сложный пример с множеством зависимостей потоков регистров:

ld8 r1=[r5] // Первая группа

sub r6=r8,r9 ;;// Первая группа

add r3=r1,r4 // Вторая группа

st8 [r6]=r12 // Вторая группа

Все инструкции в одной группе инструкций не обязательно будут запущены параллельно, потому что при определенном выполнении может не оказаться достаточного количества ресурсов для параллельного запуска всех инструкций данной группы.

2.3.3. Связки и шаблоны

В ассемблерном коде, каждая 128-битная связка заключается в фигурные скобки и содержит спецификацию шаблона и три инструкции. При этом, стоп может быть определен в конце любой связки или в средине связки, с помощью одного из двух специальных типов шаблона которые содержат стопы в средине связки.

Каждая инструкция связки имеет длину 41 бит. Пять оставшихся битов используются для указания типа шаблона. Шаблоны связок позволяют процессору основанному на Itaniumархитектуре посылать команды с простым декодированием команд, а стопы позволяют явно задавать параллелизм.

Имеется пять типов слотов (M,I,F,BиL), шесть типов инструкций (M,I,A,F,B,L), и 12 основных типов шаблонов (MII, MI_I, MLX, MMI, M_MI, MFI, MMF, MIB, MBB, BBB, MMB, MFB). Каждый основной тип шаблона имеет две версии: одна со стопом после третьего слота и одна без него. Инструкции должны быть размещены в слотах соответствующих типам этих инструкций, на основании спецификаций шаблона, за исключением инструкцийA-типа, которые могут входить либо в слотI, либо в слотM. Например, спецификация шаблона .MMIозначает, что три инструкции в связке, первая инструкция М илиAтипа, а следующие две инструкции целочисленного АЛУ либо типаA:

{ .mii

ld4 r28=[r8] //Загружаем 4-байтовое значение

add r9=2,r1 //2+r1 и помещаем в r9

add r30=1,r1 //1+r1 и помещаем в r30

}

Для удобочитаемости, большинство примеров в этой книге приводится без шаблонов или фигурных скобок.

Примечание. Границы связок не имеют корреляции с границами групп инструкций, поскольку группы инструкций могут охватывать произвольное число связок. Группы инструкций начинаются и заканчиваются там, где в ассемблерном коде установлены стопы, а также динамически, всякий раз, когда делается переход или встречается стоп.