Скачиваний:
50
Добавлен:
15.09.2014
Размер:
815.62 Кб
Скачать

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. Расшифровка генерируемых исключений.

Соседние файлы в папке Лекции