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

3.5.6. Минимизация кода проверки

Проверки спекулятивных загрузок могут иногда объединяться для уменьшения размеров кода. Распространение спекулятивными инструкциями NaTбитов и значенийNaTVal, может разрешить одной проверке спекулятивного результата заменить многократные промежуточные проверки. Нижеприведенный код демонстрирует этот потенциал оптимизации:

ld4.s r1=[r10] // Спекулятивная загрузка в r1

ld4.s r2=[r20] // Спекулятивная загрузка в r2

add r3=r1,r2;; // Сложение двух спекулятивных значений

// Другие инструкции

chk.s r3,imm21 // Проверка NaT бита в r3

st4[r30]=r1 // Сохранение r1

st4[r40]=r2 // Сохранение r2

st4[r50]=r3 // Сохранение r3

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

Другой способ уменьшить количество кода проверки состоит в том, чтобы использовать анализ потока управления, чтобы избежать использования дополнительных инструкций ld.cилиld.a. Например, компилятор может запланировать одну проверку в том месте, которое будет достигнуто всеми копиями предварительной загрузки. Часть потокового графа, показанного на рис. 3.4 демонстрирует, как эта технология могла бы применяться.

ld.a

ld.a

Предварительные загрузки для обра­щения к тому же самому регистру R

ld.a

Сохранения

*p1=

*p2=

*p3=

ld.c

Одна проверка загрузки регистра R

Рис. 3.4. Использование одной проверки для трех предварительных загрузок

Единственная проверка для всех предварительных загрузок, показанная в самом нижнем блоке, является корректной, если выполняются оба условия:

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

  • Самый нижний блок предшествует любому использованию результатов предварительных загрузок.