- •«Расширение
- •Введение
- •1. Общее представление о sse
- •1.1. Simd-регистры с плавающей точкой
- •1.2. Тип данных simd с плавающей точкой
- •1.3. Модель выполнения simd
- •1.4. Формат данных в памяти
- •1.5. Формат данных simd регистра с плавающей точкой
- •1.6. Simd-регистр состояния и управления
- •1.7. Поле управления округлением
- •1.8. Режим Flush To Zero
- •2. Команды Потокового Расширения simd
- •2.1. Операнды команд
- •3. Обзор simd-команд
- •3.1. Команды копирования данных
- •3.2. Арифметические команды
- •3.2.1. Команды упакованного/скалярного сложения и вычитания
- •3.2.2. Команды упакованного/скалярного умножения и деления
- •3.2.3. Команды упакованного/скалярного вычисления квадратных корней
- •3.2.4. Команды упакованного/скалярного нахождения минимума и максимума
- •3.3. Команды сравнения
- •3.4. Команды преобразования типов данных
- •3.5. Логические команды
- •3.6. Дополнительные команды simd над целыми
- •3.7. Команды перестановки
- •3.8. Команды управления состоянием
- •3.9. Команды управления кэшированием
- •3.9.1 Некэширующие команды записи в память
- •3.9.2 Упреждающее кэширование
- •3.9.3 Принудительная запись
- •4. Таблица команд sse и генерируемых исключений
- •Список использованной литературы и других источников
3.9.2 Упреждающее кэширование
Команды этой группы позволяют кэшировать нужные данные заранее. За счет этого уменьшаются задержки, связанные с доступом к основной памяти. Рассматриваемые команды не влияют на ход выполнения программы с функциональной точки зрения.
Обеспечивается возможность записи данных в кэш-память различных уровней. Имена команд кэширования содержат суффиксы, указывающие нужный уровень кэш-памяти.
Команды PREFETCHT0, PREFETCHT1 и PREFETCHT2 предназначены для кэширования часто используемых данных (с временной или пространственной локализацией).
Команда PREFETCHT0 записывает кэшируемые данные из памяти в кэш всех уровней (L1 и L2 в архитектуре процессора Pentium III).
Команды PREFETCHT1 и PREFETCHT2 в архитектуре процессора Pentium III записывают кэшируемые данные из памяти в кэш L2.
Команда PREFETCHNTA записывает кэшируемые данные из памяти в кэш для данных со слабой локализацией. В архитектуре процессора Pentium III данные обходят L2-кэш и переносятся в L1-кэш, используемый для этих целей.
3.9.3 Принудительная запись
Команда SFENCE (Store Fence) применяется для строгого упорядочения последовательности обращений в память и синхронизации ее с содержимым кэш-памяти, если такие обращения являются слабо упорядоченными.
При использовании SFENCE в основную память копируются все данные предшествующих команд записи, хранящиеся в буфере записи и кэше. Только после этого будут выполняться следующие команды записи.
Команда SFENCE временно блокирует выполнение лишь последующих команд сохранения данных, не влияя при этом на работу других команд.
4. Таблица команд sse и генерируемых исключений
Синтаксис команд |
Операция |
Команды копирования данных | |
MOVAPS xmm1, xmm2/m128 0f: 28: mod rxmm1 r/m MOVAPS xmm2/m128, xmm1 0f: 29: mod rxmm2 r/m |
xmm2/m128 xmm1
xmm1 Þ xmm2/m128 (выровненные данные) |
MOVUPS xmm1, xmm2/m128 0f: 10: mod rxmm1 r/m MOVUPS xmm1/m128, xmm2 0f: 11: mod rxmm1 r/m |
xmm2/m128 Þ xmm1
xmm1 Þ xmm2/m128 (невыровненные данные) |
MOVHLPS xmm1, xmm2 0f: 12: 11 rxmm1 rxmm2 |
xmm2(F2, F3) Þ xmm1(F0, F1) |
MOVHPS xmm, m64 0f: 16: mod rxmm r/m MOVHPS m64, xmm 0f: 17: mod rxmm r/m |
m64 Þ xmm(F2, F3)
xmm(F2, F3) Þ m64 |
MOVLHPS xmm1, xmm2 0f: 16: 11 rxmm1 rxmm2 |
xmm2(F0,F1) Þ xmm1(F2, F3) |
MOVLPS xmm, m64 0f: 12: mod rxmm r/m MOVLPS m64, xmm 0f: 13: mod rxmm1 r/m |
m64 Þ xmm(F0, F1)
xmm(F0, F1) Þ m64 |
MOVMSKPS r32, xmm 0f: 50: 11 r32 rxmm |
xmm[b7(F0)] Þ r32(b0) xmm[b7(F1)] Þ r32(b1) xmm[b7(F2)] Þ r32(b2) xmm[b7(F3)] Þ r32(b3) 0 Þ r32(b31…b4) |
MOVSS xmm1, xmm2/m32 f3: 0f: 10 mod rxmm1 r/m MOVSS m32, xmm f3: 0f: 11 mod rxmm r/m |
xmm2/m32 Þ xmm2(F0) 0 Þ xmm2(F1–F3) xmm(F0) Þ m32 |
Команды арифметических операций | |
ADDPS xmm1, xmm2/m128 0f: 58: mod rxmm1 r/m ADDSS xmm1, xmm2/m32 f3: 0f: 58: mod rxmm1 r/m |
xmm1 + xmm2/m128 Þ xmm1 (пакет)
xmm1 + xmm2/m32 Þ xmm1 (скаляр) |
SUBPS xmm1, xmm2/m128 0f: 5c: mod rxmm1 r/m SUBSS xmm1, xmm2/m32 f3: 0f: 5c: mod rxmm1 r/m |
xmm1 – xmm2/m128 Þ xmm1 (пакет)
xmm1 – xmm2/m32 Þ xmm1 (скаляр) |
MULPS xmm1, xmm2/m128 0f: 59: mod rxmm1 r/m MULSS xmm1, xmm2/m32 f3: 0f: 59: mod rxmm1 r/m |
xmm1 * xmm2/m128 Þ xmm1 (пакет)
xmm1 * xmm2/m32 Þ xmm1 (скаляр) |
DIVPS xmm1, xmm2/m128 0f: 5e: mod rxmm1 r/m DIVSS xmm1, xmm2/m32 f3: 0f: 5e: mod rxmm1 r/m |
xmm / xmm/m128 Þ xmm (пакет)
xmm / xmm/m32 Þ xmm (скаляр) |
SQRTPS xmm1, xmm2/m128 0f: 51: mod rxmm1 r/m SQRTSS xmm1, xmm2/m32 f3: 0f: 51: mod rxmm1 r/m |
sqrt(xmm2/m128) Þ xmm1 (пакет)
sqrt(xmm2/m32) Þ xmm1 (скаляр) |
RCPPS xmm1, xmm2/m128 0f: 53: mod rxmm1 r/m RCPSS xmm1, xmm2/m32 f3: 0f: 53: mod rxmm1 r/m |
1 / xmm2/m128 Þ xmm1 (пакет)
1 / xmm2/m32 Þ xmm1 (скаляр) |
RSQRTPS xmm1, xmm2/m128 0f: 52: mod rxmm1 r/m RSQRTSS xmm1, xmm2/m32 f3: 0f: 52: mod rxmm1 r/m |
1 / sqrt(xmm2/m128) Þ xmm1 (пакет)
1 / sqrt(xmm2/m32) Þ xmm1 (скаляр) |
MAXPS xmm1, xmm2/m128 0f: 5f: mod rxmm1 r/m MAXSS xmm1, xmm2/m32 f3: 0f: 5f: mod rxmm1 r/m |
max(xmm1, xmm2/m128) Þ xmm1 (пакет)
max(xmm1, xmm2/m32) Þ xmm1 (скаляр) |
MINPS xmm1, xmm2/m128 0f: 5d: mod rxmm1 r/m MINSS xmm1, xmm2/m32 f3: 0f: 5d: mod rxmm1 r/m |
min(xmm1, xmm2/m128) Þ xmm1 (пакет)
min(xmm1, xmm2/m32) Þ xmm1 (скаляр) |
Команды сравнения | |
CMPPS xmm1, xmm2/m128, imm8 0f: c2: mod rxmm1 r/m: i8
CMPSS xmm1, xmm2/m32, imm8 f3: 0f: c2: mod rxmm1 r/m: i8
|
В зависимости от значения imm8 в случае выполнения условия: FFFFFFFFh xmm1(Fi) невыполнения: 000000000h xmm1(Fi) В зависимости от значения imm8 в случае выполнения условия: FFFFFFFFh xmm1(F0) невыполнения: 000000000h xmm1(F0) |
COMISS xmm1, xmm2/m32 0f: 2f: mod rxmm1 r/m UCOMISS xmm1, xmm2/m32 0f: 2e: mod rxmm1 r/m |
EFLAGS xmm1–xmm2/m32 (различаются генераци-
EFLAGS xmm1–xmm2/m32 ей исключений) |
Команды преобразования типов данных | |
CVTPI2PS xmm, mm/m64 0f: 2a: mod rxmm1 r/m |
mm/m64(D1, D0) xmm(F1, F0) |
CVTSI2SS xmm, r/m32 f3: 0f: 2a: mod rxmm1 r/m |
r/m32 xmm(F0) |
CVTPS2PI mm, xmm/m64 0f: 2d: mod rmmx1 r/m |
xmm/m64(F0, F1) mm(D0, D1) (округление) |
CVTTPS2PI mm, xmm/m64 0f: 2c: mod rmmx1 r/m |
xmm/m64(F0, F1) mm(D0, D1) (отброс дробной части) |
CVTSS2SI r32, xmm/m32 f3: 0f: 2d: mod r32 r/m |
xmm/m32(F0) r32 (округление) |
CVTTSS2SI r32, xmm/m32 f3: 0f: 2c: mod r32 r/m |
xmm/m32(F0) r32 (отброс дробной части) |
Логические команды | |
ANDPS xmm1, xmm2/m128 0f: 54: mod rxmm1 r/m |
xmm1 & xmm2/m128 xmm1 |
ANDNPS xmm1, xmm2/m128 0f: 55: mod rxmm1 r/m |
!xmm1 & xmm2/m128 xmm1 |
ORPS xmm1, xmm2/m128 0f: 56: mod rxmm1 r/m |
xmm1 xmm2/m128 xmm1 |
XORPS xmm1, xmm2/m128 0f: 57: mod rxmm1 r/m |
xmm1 xmm2/m128 xmm1 |
Дополнительные команды SIMD над целыми | |
PAVGB mm1, mm2/m64 0f: e0: mod rmmx1 r/m |
(mm1(Bi) + mm2(Bi) +1)>>1 Þ mm1, i=0..7 |
PAVGW mm1, mm2/m64 0f: e3: mod rmmx1 r/m |
(mm1(Wi) + mm2(Wi) +1)>>1 Þ mm1, i=0..3 |
PEXTRW r32, mm, imm8 0f: c5: 11 rmmx r32: i8 |
mm(Wi) Þ r[15..0], i=imm8 & 3 0000 Þ r[31..16] |
PINSRW mm, r32/m16, imm8 0f: c4: mod reg r/m: i8 |
sel = imm8 & 0x3; mask = (sel == 0) ? 0x000000000000FFFF: (sel == 1) ? 0x00000000FFFF0000: (sel == 2) ? 0x0000FFFF00000000: 0xFFFF000000000000; mm=(mm& !mask)|((m16/r32[15-0]<<(sel*16))&mask); |
PMAXUB mm1, mm2/m64 0f: de: mod rmmx1 r/m |
max(mm1(Bi), mm2(Bi)) Þ mm1(Bi), i=0..7 |
PMAXSW mm1, mm2/m64 0f: ee: mod rmmx1 r/m |
max(mm1(Wi), mm2(Wi)) Þ mm1(Wi), i=0..3 |
PMINUB mm1, mm2/m64 0f: da: mod rmmx1 r/m |
min(mm1(Bi), mm2(Bi)) Þ mm1(Bi), i=0..7 |
PMINSW mm1, mm2/m64 0f: ea: mod rmmx1 r/m |
min(mm1(Wi), mm2(Wi)) Þ mm1(Wi), i=0..3 |
PMOVMSKB r32, mm 0f: d7: 11 r32 rmmx |
Sign(mm(Bi)) Þ r32[i], i=0..7 000000 Þ r32[31..8] |
PMULHUW mm1, mm2/m64 0f: e4: mod rmmx1 r/m |
(mm1(Wi) * mm2(Wi))[31..16] Þ mm1(Wi), i=0..3 |
PSADBW mm1, mm2/m64 0f: f6: mod rmmx1 r/m |
Sum(abs(mm1(Bi) – mm2(Bi)) Þ mm1[15..0], i=0..7 |
PSHUFW mm1, mm2/m64, imm8 0f: 70: mod rmmx1 r/m: i8 |
(mm2 >> (imm8[1..0] * 16))[15..0] Þ mm1[15..0] (mm2 >> (imm8[3..2] * 16))[15..0] Þ mm1[31..16] (mm2 >> (imm8[5..4] * 16))[15..0] Þ mm1[47..32] (mm2 >> (imm8[7..6] * 16))[15..0] Þ mm1[63..48] |
Команды перестановки | |
UNPCKHPS xmm1, xmm2/m128 0f: 15: mod rxmm1 r/m |
xmm1(F2) xmm1(F0) xmm2/m128 (F0) xmm1(F1) xmm1(F3) xmm1(F2) xmm2/m128 (F3) xmm1(F3) |
UNPCKLPS xmm1, xmm2/m128 0f: 14: mod rxmm1 r/m |
xmm1(F0) xmm1(F0) xmm2/m128 (F0) xmm1(F1) xmm1(F1) xmm1(F2) xmm2/m128 (F1) xmm1(F3) |
SHUFPS xmm1, xmm2/m128, imm8 0f: c6: mod rxmm1 r/m: i8 |
xmm1/m128 [ F(imm8[1..0]) ] xmm1(F0) xmm2/m128 [ F(imm8[3..2]) ] xmm1(F1) xmm1/m128 [ F(imm8[5..4]) ] xmm1(F2) xmm2/m128 [ F(imm8[7..6]) ] xmm1(F3) |
Команды управления состоянием | |
STMXCSR m32 0f: ae: mod 011 m32 |
MXCSR m32 |
LDMXCSR m32 0f: ae: mod 010 m32 |
m32 MXCSR |
FXSAVE m512 0f: ae: mod 000 m512 |
Сохранение в памяти содержимого FPU/MMX И SSE регистров |
FXRSTOR m512 0f: ae: mod 001 m512 |
Загрузка из памяти содержимого FPU/MMX И SSE регистров |
Команды управления кэшированием | |
MOVNTPS m128, xmm 0f: 2b: mod rxmm1 r/m |
xmm Þ m128 |
MOVNTQ m64, mm 0f: e7: mod rmmx r/m |
mm Þ m64 |
MASKMOVQ mm1, mm2 0f: 57: 11 rmmx1 rmmx2 |
mm1(Bi) Þ ds:[edi+I], если mm2 [ b7(Bi) ] =1; i=0..7 |
PREFETCHT0 m8 0f: 18: mod 01 r/m |
Предвыборка данных в кэш-память уровней L1 и L2 |
PREFETCHT1 m8 0f: 18: mod 10 r/m |
Предвыборка данных в кэш-память уровня L2 |
PREFETCHT2 m8 0f: 18: mod 11 r/m |
Предвыборка данных в кэш-память уровня L2 |
PREFETCHTA m8 0f: 18: mod 00 r/m |
Предвыборка данных в кэш-память уровня L1 |
SFENCE 0f: ae: f8 |
Упорядочивание обращений к памяти |
Ниже приведена таблица исключений, которые генерируются командами и расшифровка мнемоники этих исключений:
Команда |
#I |
#D |
#Z |
#O |
#U |
#P |
ADDPS |
Y |
Y |
|
Y |
Y |
Y |
ADDSS |
Y |
Y |
|
Y |
Y |
Y |
ANDNPS |
|
|
|
|
|
|
ANDPS |
|
|
|
|
|
|
CMPPS |
Y |
Y |
|
|
|
|
CMPSS |
Y |
Y |
|
|
|
|
COMISS |
Y |
Y |
|
|
|
|
CVTPI2PS |
|
|
|
|
|
Y |
CVTPS2PI |
Y |
|
|
|
|
Y |
CVTSI2SS |
|
|
|
|
|
Y |
CVTSS2SI |
Y |
|
|
|
|
Y |
CVTTPS2PI |
Y |
|
|
|
|
Y |
CVTTSS2SI |
Y |
|
|
|
|
Y |
DIVPS |
Y |
Y |
Y |
Y |
Y |
Y |
DIVSS |
Y |
Y |
Y |
Y |
Y |
Y |
LDMXCSR |
|
|
|
|
|
|
MAXPS |
Y |
Y |
|
|
|
|
MAXSS |
Y |
Y |
|
|
|
|
MINPS |
Y |
Y |
|
|
|
|
MINSS |
Y |
Y |
|
|
|
|
MOVAPS |
|
|
|
|
|
|
MOVHPS |
|
|
|
|
|
|
MOVLPS |
|
|
|
|
|
|
MOVMSKPS |
|
|
|
|
|
|
MOVSS |
|
|
|
|
|
|
MOVUPS |
|
|
|
|
|
|
MULPS |
Y |
Y |
|
Y |
Y |
Y |
MULSS |
Y |
Y |
|
Y |
Y |
Y |
ORPS |
|
|
|
|
|
|
RCPPS |
|
|
|
|
|
|
RCPSS |
|
|
|
|
|
|
RSQRTPS |
|
|
|
|
|
|
RSQRTSS |
|
|
|
|
|
|
SHUFPS |
|
|
|
|
|
|
SQRTPS |
Y |
Y |
|
|
|
Y |
SQRTSS |
Y |
Y |
|
|
|
Y |
STMXCSR |
|
|
|
|
|
|
SUBPS |
Y |
Y |
|
Y |
Y |
Y |
SUBSS |
Y |
Y |
|
Y |
Y |
Y |
UCOMISS |
Y |
Y |
|
|
|
|
UNPCKHPS |
|
|
|
|
|
|
UNPCKLPS |
|
|
|
|
|
|
XORPS |
|
|
|
|
|
|
Таблица 8. Генерируемые командами SSEисключения.
Исключение |
Описание |
#IA или #I |
Исключение для ошибочного арифметического значения операндов или неподдерживаемого формата данных. |
#D |
Ненормализованный операнд в инструкции. |
#Z |
Деление на ноль. |
#O |
Переполнение. |
#U |
Антипереполнение. |
#P |
Неточный результат операции. |
Таблица 9. Расшифровка генерируемых исключений.