Новые инструкции Pentium 4: группа SSE2 — Архив WASM.RU

Все статьи

Новые инструкции Pentium 4: группа SSE2 — Архив WASM.RU

Содержание

I. Операции с вещественными числами
  • Предварительные замечания
  • Условные обозначения
    Арифметические операции
  • Упакованные данные
  • Скалярные данные
    Преобразования форматов данных
  • Упакованные данные
  • Скалярные данные
    Варианты сравнения операндов
  • Без изменения состояния EFLAGS
  • С изменением состояния EFLAGS
    II. Инструкции общего назначения
  • Пересылка одного числа
  •  
  • Пересылка двух чисел
  • Распаковка и перегруппировка данных
  • Логические операции
  • Манипуляции с кеш
    III. Операции с целыми числами
  • Новые возможности инструкций MMX
    Расширение набора инструкций MMX
  • Арифметические операции
  • Сдвиг 128-ми разрядных кодов
  • Перегруппировка чисел
  • Распаковка чисел
  • Пересылка данных
  • Работа с масками (условные пересылки)
    IV. Первоисточники



  • Предварительные замечания

    У микропроцессора Intel Pentium 4 появилась новая группа инструкций, получивших название SSE2. Цифра 2 в названии указывается для того, чтобы отличить новую группу от одноименной, уже поддерживаемой микропроцессором Pentium III. Остальная часть имени расшифровывается как Streaming SIMD Extensions (потоковое SIMD расширение). В свою очередь SIMD является аббревиатурой от Single Instruction Multiple Data (одна инструкция много данных). В состав SSE2 входят операции для работы с 64-х разрядными целыми и вещественными (представление с удвоенной точностью) числами.

    Согласно документации Intel в группу SSE2 входят инструкции, выполняющие 144 новые операции. Если же вы подсчитаете количество новых имен инструкций, то их окажется значительно меньше. Расхождение объясняется тем, что одному имени инструкции может соответствовать несколько разных кодов операций. Типичный пример инструкции пересылки данных, у которых код операции зависит от направления пересылки - из регистра в память или из памяти в регистр.

    Большинство новых инструкций двухадресные. Первый операнд является приемником (dest), а второй источником (src). Приемник, как правило, находится в 128-bit регистре xmm, источник может находиться как в регистре xmm, так и в оперативной памяти (ОЗУ). Исключением являются только инструкции пересылки, у которых приемник может располагаться в ОЗУ. Третий операнд, если он есть, является целым числом, размер которого не превышает одного байта.

    При работе с вещественными числами возможно выполнение одной и той же операции над одной или двумя парами чисел. В первом случае имя операции оканчивается буквами SD (скалярные данные), а во втором - буквами PD (упакованные данные). В данном случае выражение "упакованные данные" означает, что два 64-bit числа расположены в одном 128-bit регистре или в ОЗУ подряд друг за другом. А выражение "скалярные данные" означает, что одно 64-bit число расположено в младшей половине 128-bit регистра. По утверждению специалистов Intel скалярные операции более рационально используют ресурсы процессора чем аналогичные операции, выполняемые FPU.

    Условные обозначения

    В данном документе при описании операндов инструкций использованы следующие обозначения:
    mmx - любой из восьми 64-х разрядных регистров, которые впервые появились у Pentium MMX. В текстах программ на ассемблере им соответствуют имена от mm0 до mm7.
    xmm - любой из восьми 128-ми разрядных регистров, которые впервые появились у Pentium III. В текстах программ на ассемблере им соответствую имена от xmm0 до xmm7.
    r32 - любой 32-х разрядный регистр общего назначения: EAX, EBX и так далее.
    m128, m64, m32, m8 - элемент памяти соответствующего размера в битах.
    imm8 - непосредственный способ адресации, число имеющее размер байта, например, константа сдвига.

    Если в качестве операнда указано только имя регистра или только элемент памяти, то это означает, что операнд может находиться только в регистре или только в ОЗУ. Если же указано сочетание обозначений имени регистра и элемента памяти, разделенное наклонной скобкой, например, xmm/m128 то операнд может находиться либо в регистре, либо в ОЗУ.

    Операции с вещественными числами

    1.1. Групповые арифметические операции, нахождение максимума и минимума, извлечение квадратного корня. Операнды (dest и src) содержат по два вещественных числа двойной точности (64-bit), соответственно в dest получаются два 64-bit результата.

    ADDPD xmm, xmm/m128 dest = dest+src - сложение двух пар вещественных чисел удвоенной точности
    SUBPD xmm, xmm/m128 dest = dest-src - вычитание двух пар вещественных чисел удвоенной точности
    MULPD xmm, xmm/m128 dest = dest*src - умножение двух пар вещественных чисел удвоенной точности
    DIVPD xmm, xmm/m128 dest = dest/src - деление двух пар вещественных чисел удвоенной точности
    SQRTPD xmm, xmm/m128 dest = sqrt(src) - извлечение квадратного корня из двух вещественных чисел источника с записью результата в приемник
    MAXPD xmm, xmm/m128 dest = max(dest,src) - нахождение в каждой паре большего вещественного числа удвоенной точности
    MINPD xmm, xmm/m128 dest = min(dest,src) - нахождение в каждой паре меньшего вещественного числа удвоенной точности

    1.2. Обычные ("скалярные") арифметические операции, нахождение максимума и минимума, извлечение квадратного корня. Вещественное число двойной точности раположено в младших половинах регистров xmm. Результат получается в младшей половине dest, содержимое его старшей половины не изменяется.

    ADDSD xmm, xmm/m64 dest = dest+src - сложение двух вещественных чисел удвоенной точности
    SUBSD xmm, xmm/m64 dest = dest-src - вычитание двух вещественных чисел удвоенной точности
    MULSD xmm, xmm/m64 dest = dest*src - умножение двух вещественных чисел удвоенной точности
    DIVSD xmm, xmm/m64 dest = dest/src - деление двух вещественных чисел удвоенной точности
    SQRTSD xmm, xmm/m64 dest = sqrt(src) - извлечение квадратного корня из вещественного числа источника с записью результата в приемник
    MAXSD xmm, xmm/m64 dest = max(dest,src) - нахождение большего из двух вещественных чисел удвоенной точности
    MINSD xmm, xmm/m64 dest = min(dest,src) - нахождение меньшего из двух вещественных чисел удвоенной точности

    1.3. Групповые операции преобразования форматов чисел. Возможны два типа преобразований:
    a) вещественные числа преобразуются в вещественные с изменением точности представления - из двойной точности в обычную или наоборот.
    b) целые числа преобразуются в вещественные или вещественные числа в целые. В последнем случае возможно округление или отсечение остатка. Два целых числа могут находиться в регистрах xmm или mmx.

    CVTPD2PS xmm, xmm/m128 dest(0-63) = conv(src) - два вещественных числа преобразуются из формата с двойной точностью в формат с обычной точностью. dest(64-127)=0
    CVTPS2PD xmm, xmm/m64 dest = conv(src) - два вещественных числа преобразуются из формата с обычной точностью в формат с двойной точностью. Если источником является xmm, то преобразуются два младших числа.
    CVTPS2DQ xmm, xmm/m128 dest = conv(src) - 4 вещественных числа представленные с обычной точностью преобразуются в 4 целых 32-х разрядных числа.
    CVTTPS2DQ xmm, xmm/m128 dest = conv(src) - 4 вещественных числа представленные с обычной точностью преобразуются в 4 целых 32-х разрядных числа с отсечением остатка.
    CVTDQ2PS xmm, xmm/m128 dest = conv(src) - 4 целых 32-х разрядных числа преобразуются в 4 вещественных числа, представленных с обычной точностью.
    CVTPD2DQ xmm, xmm/m128 dest(0-63) = conv(src) - два вещественных числа двойной точности преобразуются в два целых 32-х разрядных числа. dest(64-127)=0
    CVTTPD2DQ xmm, xmm/m128 dest(0-63) = conv(src) - два вещественных числа двойной точности преобразуются в два целых 32-х разрядных числа с отсечением остатка. dest(64-127)=0
    CVTDQ2PD xmm, xmm/m64 dest = conv(src) - два целых 32-х разрядных числа преобразуются в два вещественных числа, представленных с двойной точностью. Если источником является xmm, то преобразуются два младших числа.
    CVTPD2PI mmx, xmm/m128 dest = conv(src) - два вещественных числа двойной точности преобразуются в два целых 32-х разрядных числа и записываются в регистр mmx
    CVTTPD2PI mmx, xmm/m128 dest = conv(src) - два вещественных числа двойной точности преобразуются в два целых 32-х разрядных числа с отсечением остатка и записываются в регистр mmx
    CVTPI2PD xmmx, mmx/m64 dest = conv(src) - два целых 32-х разрядных числа, находящихся в регистре mmx, преобразуются в два вещественных числа, представленных с двойной точностью.

    1.4. Преобразования формата одного числа. Возможны два типа преобразований:
    a) изменяется точность представления вещественного числа - двойная на обычную или наоборот.
    b) целое число преобразуется в вещественное или вещественное число в целое. В последнем случае возможно округление или отсечение остатка.

    CVTSD2SS xmm, xmm/m64 dest(0-31) = conv(src) - вещественное число преобразуется из формата с двойной точностью в формат с обычной точностью. У dest не изменяется содержимое разрядов 32-127.
    CVTSS2SD xmm, xmm/m32 dest(0-63) = conv(src) - вещественное число преобразуется из формата с обычной точностью в формат с двойной точностью. Содержимое старшей половины dest не изменяется.
    CVTSD2SI r32, xmm/m64 dest = conv(src) - вещественное число двойной точности преобразуются в целое 32-х разрядное число.
    CVTTSD2SI r32, xmm/m64 dest(0-63) = conv(src) - вещественное число двойной точности преобразуется в целое 32-х разрядное число.
    CVTSI2SD xmm, r32/m32 dest(0-63) = conv(src) - целое 32-х разрядное число преобразуется в вещественное число, представленное с двойной точностью. Содержимое старшей половины dest не изменяется.

    1.5. Сравнения без изменения состояния разрядов EFLAGS. Для каждой сравниваемой пары вещественных чисел {dest[h],src[h] и dest[l],src[l]} при положительном результате сравнения устанавливаются все разряды dest[h] или dest[l] соответственно, в противном случае они очищаются. Например, если содержимое регистра xmm сравнить с самим собой, то при проверке отношения "равно" все 128 разрядов будет установлены, а при проверке отношения "не равно" все 128 разрядов будут очищены.

    CMPPD xmm, xmm/m128, imm8 cmp dest,src - независимо друг от друга сравниваются две пары вещественных чисел. Результат помещается в соответствующие половины dest. Проверяемое условие задает третий операнд (см. ниже).
    CMPSD xmm, xmm/m128, imm8 cmp dest[l],src[l] - сравниваются два вещественных числа. Результат помещается в младшую половину dest[l], содержимое старшей половины dest[h] не изменяется. Проверяемое условие задает третий операнд (см. ниже).

    В документации Intel оговорены следующие два способа указания проверяемого условия:

    УсловиеУказывается значение imm8Используется имя псевдооперации
    равноCMPPD xmm, xmm/m128, 0 CMPEQPD xmm, xmm/m128
    меньшеCMPPD xmm, xmm/m128, 1 CMPLTPD xmm, xmm/m128
    меньше или равноCMPPD xmm, xmm/m128, 2CMPLEPD xmm, xmm/m128
    не сравнимыCMPPD xmm, xmm/m128, 3CMPUNORDPD xmm, xmm/m128
    не равноCMPPD xmm, xmm/m128, 4CMPNEQPD xmm, xmm/m128
    не меньшеCMPPD xmm, xmm/m128, 5CMPNLTPD xmm, xmm/m128
    не меньше или равноCMPPD xmm, xmm/m128, 6CMPNLEPD xmm, xmm/m128
    сравнимыCMPPD xmm, xmm/m128, 7CMPORDPD xmm, xmm/m128

    1.6. При сравнении одной пары вещественных чисел можно изменить состояние разрядов EFLAGS. Это делают две инструкции, различающиеся по способу реагирования на случаи, когда один или оба операнда не являются числами (NaN)

    COMISD xmm, xmm/m64cmp dest[l],src[l] - сравниваются два вещественных числа. Если операнд QNaN или SNaN то возникает исключительная ситуации.
    UCOMISD xmm, xmm/m64cmp dest[l],src[l] - сравниваются два вещественных числа. Если операнд SNaN, то возникает исключительная ситуация.

    Отношение между сравниваемыми числами указывают следующие признаки:
    (флаги OF, AF, SF очищаются)

    ОтношениеСостояние разрядов EFLAGS
     ZFPFCF
    не сравнимы111
    меньше001
    больше000
    равны100

    1.7. Обмен 64-bit кодами между оперативной памятью (ОЗУ) и регистрами xmm. Если данные "выровнены", то обращение к ОЗУ занимает 1 такт, в противном случае 2 такта. Выравнивание означает, что адрес 64-bit кода должен быть кратен 8.

    MOVSD xmm, xmm/m64
    MOVSD xmm/m64, xmm
    Пересылка из ОЗУ в младшие 64-разряда xmm
    Пересылка в ОЗУ младших 64-х разрядов xmm
    Важно: при копировании содержимого одного регистра xmm в другой, содержимое старшей половины dest не изменяется.
    MOVHPD xmm, m64
    MOVHPD m64, xmm
    Пересылка из ОЗУ в старшие 64-разряда xmm
    Пересылка в ОЗУ старших 64-х разрядов xmm
    MOVLPD xmm, m64
    MOVLPD m64, xmm
    Пересылка из ОЗУ в младшие 64-разряда xmm
    Пересылка в ОЗУ младших 64-х разрядов xmm

    1.8. Обмен 128-bit кодами между оперативной памятью (ОЗУ) и регистрами xmm. Для выравнивания 128-bit кодов их надо располагать по адресам кратным 16-ти. Обычно инструкции работают не с ОЗУ, а с кэш. В данном случае предусмотрена специальная инструкция для записи кодов в ОЗУ без кеширования, т.е. при ее выполнении содержимое кэш не изменяется.

    MOVNTPD m128, xmm Пересылка 128-ми разрядного кода в ОЗУ без кеширования
    Важно: пересылаемый код должен иметь адрес кратный 16-ти, в противном случае возникает аварийная ситуация (нарушение защиты).
    MOVAPD xmm, xmm/m128
    MOVAPD xmm/m128, xmm
    Пересылка 128-bit кода из ОЗУ в регистр xmm
    Пересылка 128-bit кода из регистра xmm в ОЗУ
    Важно: пересылаемый код должен иметь адрес кратный 16-ти, в противном случае возникает аварийная ситуация (нарушение защиты).
    MOVUPD xmm, xmm/m128
    MOVUPD xmm/m128, xmm
    Пересылка 128-bit кода из ОЗУ в регистр xmm
    Пересылка 128-bit кода из регистра xmm в ОЗУ
    Замечание: эта инструкция предназначена для применения в тех случаях, когда данные не выровнены или неизвестно выровнены они или нет.

    1.9. Распаковка и перегруппировка кодов являются своеобразной разновидностью пересылок. Обозначим содержимое дух половин dest как Xl и Xh, а содержимое двух половин src как Yl и Yh. Следующие три операции позволяют записать в dest комбинацию этих величин.

    UNPCKHPD xmm, xmm/m128 dest = Yh, Xh - распаковка: в dest копируется содержимое старших половин src и dest.
    UNPCKLPD xmm, xmm/m128dest = Yl, Xl - распаковка: в dest копируется содержимое младших половин src и dest.
    SHUFPD xmm, xmm/m128, imm8dest = Yh/Yl, Xh/Xl - перегруппировка: bit 0 imm8 указывает какая половина dest копируется в его младшие разряды, bit 1 imm8 указывает какая половина src копируется в старшие разряды dest. В обоих случаях 0 соответствует младшей половине, а 1 - старшей. Например, если dest и src находятся в одном регистре, то imm8=1 вызовет перестановку чисел в dest.

    1.10. Логические операции вычисляют функции булевой алгебры. Обычно они применяются для выделения или обединения отдельных частей кода.
    Pentium 4 позволяет вычислять логические функции с помощью трех групп инструкций - ниже в правом столбце таблицы указаны инструкции групп SSE1 и MMX, выполняющие аналогичные действия.

    ANDPD xmm, xmm/m128 dest = dest AND src - логическая функция конъюнкция ("И").
    Аналоги ANDPS xmm, xmm/m128 и PAND xmm, xmm/m128
    ANDNPD xmm, xmm/m128dest = (NOT dest) AND src - логическая функция без определенного названия.
    Аналоги ANDNPS xmm, xmm/m128 и PANDN xmm, xmm/m128.
    ORPD xmm, xmm/m128dest = dest OR src - логическая функция дизюнкция ("ИЛИ").
    Аналоги ORPS xmm, xmm/m128 и POR xmm, xmm/m128.
    XORPD xmm, xmm/m128dest = dest XOR src - логическая функция "исключенное ИЛИ".
    Аналоги XORPS xmm, xmm/m128 и PXOR xmm, xmm/m128.

    1.11. Манипуляции с кеш (Cache). Кеш - посредник между процессором и ОЗУ. Все инструкции, кроме специальных, для чтения и записи данных обращаются к кеш, а не к ОЗУ. Все, что было записано в кеш, когда-то попадет в ОЗУ, а все, что было запрошено из ОЗУ когда-то попадет в кеш. Вопрос когда? Дело в том, что процессы обмена данными процессора с кеш и кеш с ОЗУ взаимосвязаны слабо (weakly-ordered). У Pentium III появилась инструкция PREFETCHT, выполняющая упреждающую выборку данных из ОЗУ в кеш. Но если кеш содержит данные, которые еще не записаны в ОЗУ, то при упреждающей загрузке они будут потеряны. Поэтому сразу была введена инструкция SFENCE, которая позволяла защитить записанные в кеш, но еще не сохраненные в ОЗУ данные. У Pentium 4 прибавилось еще две ограждающие инструкции и инструкция очистки строки кеш, содержащей уже ненужные данные.

    LFENCEПриостанавливает считывание данных из кеш до окончания ранее запрошенной операции загрузки.
    MFENCEПриостанавливает любые обращения к кеш до окончания всех операций обмена между ОЗУ и кеш.
    CFLUCH m8 Очистка строки кеш, номер (адрес) которой в кеш задает операнд, имеющий размер байта.


    Операции с целыми числами

    Новые возможности инструкций MMX

    Инструкции группы MMX впервые появились у Pentium MMX и затем у Pentium II. Всего в эту группу входило 57 инструкций, которым соответствовало 47 мнемонических обозначений (имен). Большинство из них выполо групповые операции с целыми числами, имеющими размер байта, слова или двойного слова, а некоторые могли работать с 64-х разрядными данными (QWORD). У Pentium III появилась группа инструкций SSE1, 14 из которых выполняли групповые операции с целыми числами, т.е. дополняли набор инструкций MMX. Но как старые, так и новые инструкции могли работать только с 64-bit данными, находящимися в регистрах mmx или в ОЗУ.

    С выпуском Pentium 4 большинство указанных инструкций получило доступ к 128-bit регистрам xmm. Исключений немного: в группе MMX это инструкций EMMS, а в группе SSE1 три инструкции - MASKMOVQ, MOVNTQ и PSHUFW. Все остальные инструкции выполняют групповые операции как с 64-bit, так и со 128-bit данными. Имена инструкций не изменились, а размер группы определяется по имени регистра (mmx или xmm). Выше были приведены варианты записи логических операций группы MMX при работе со 128-bit данными.

    Таким образом, расширенный набор инструкций MMX позволяет выполнять операции над группами, состоящими из 16-ти байтов, 8-ми слов, 4-х двойных (32-bit) слов или 2-х квадро (64-bit) слов. Логические операции и сдвиги могут выполняться и над одним 128-bit операндом.

    Инструкции группы MMX описаны во многих книгах по программированию на ассемблере, кроме того их сводки можно найти в файлах на различных сайтах. Поэтому, для сокращения размеров данного документа я не буду повторять их описание. Необходимые ссылки вы найдете в разделе "Первоисточники" в конце данного файла. Ниже описаны только 16 новых инструкций группы SSE2, предназначенных для работы с целыми числами, которые появились у Pentium 4.


    2.1. Арифметические операции с двумя парами 64-х разрядных целых чисел.

    PADDQ xmm, xmm/m128 dest = dest+src - сложение целых 64-bit чисел, расположенных в двух независимых парах.
    PSUBQ xmm, xmm/m128dest = dest-src - вычитание целых 64-bit чисел, расположенных в двух независимых парах.
    PMULUDQ xmm, xmm/m128dest = dest*src - умножение целых 32-bit чисел, расположенных в двух независимых парах, размер произведения 64-bit.
    Замечание: 32-bit сомножители должны располагаться в разрядах 0-31 и 64-95 dest и src.

    2.2. Операции сдвига 128-ми разрядных кодов. Обратите внимание константа сдвига задается не в битах (как обычно), а в байтах, если ее значение больше чем 15, то все разряды dest очищаются.

    PSLLDQ xmm, imm8Логический сдвиг содержимого dest влево на (imm8*8) разрядов.
    PSRLDQ xmm, imm8Логический сдвиг содержимого dest вправо на (imm8*8) разрядов.

    2.3. Перегруппировка четырех 16-ти или 32-х разрядных чисел с записью результата в dest. Порядок перегруппировки задает константа imm8, она рассматривается как четыре пары разрядов. Порядковый номер пары (0-3) соответствует порядковому номеру числа в dest или в одной из его половин. Содержимое пары (0-3) соответствует порядковому номеру числа в src, или в одной из его половин. Dest и src могут находиться в одном и том же регистре xmm.

    PSHUFHW xmm, xmm/m128, imm8Пересылка с перегруппировкой четырех 16-bit слов из младшей половины src в младшую половину dest.
    PSHUFLW xmm, xmm/m128, imm8Пересылка с перегруппировкой четырех 16-bit слов из старшей половины src в старшую половину dest.
    PSHUFD xmm, xmm/m128, imm8Пересылка с перегруппировкой четырех 32-bit (двойных) слов из src в dest.

    2.4. Распаковка 64-bit чисел. Обозначим содержимое dest как Xh,Xl, а содержимое src как Yh,Yl. Инструкции распаковки позволяют записать в dest содержимое старших или младших половин dest и src.

    PUNPCKHQDQ xmm, xmm/m128dest=Yh,Xh - в dest записывается содержимое старших половин src и dest. Аналогина уже описанной инструкции UNPCKHPD.
    PUNPCKLQDQ xmm, xmm/m128dest=Yl,Xl - в dest записывается содержимое младших половин src и dest. Аналогина уже описанной инструкции UNPCKLPD..

    2.5. Пересылки 64-bit и 128-bit чисел. Всего в эту группу входит 5 команд. Две из них позволяют организовать обмен данными между регистром mmx и младшей половиной регистра xmm. Остальные три ничем не отличаются от уже описанных инструкций пересылки 128-bit вещественных операндов.

    MOVDQ2Q mmx, xmmМладшая половина регистра xmm копируется в регистр mmx.
    MOV2QDQ xmm, mmxСодержимое регистра mmx копируется в младшую половину xmm, старшая половина xmm очищается.
    MOVNTDQ m128, xmm Пересылка 128-ми разрядного кода в ОЗУ без кеширования
    Важно: пересылаемый код должен иметь адрес кратный 16-ти, в противном случае возникает аварийная ситуация (нарушение защиты). Аналог инструкции MOVNTPD
    MOVDQA xmm, xmm/m128
    MOVDQA xmm/m128, xmm
    Пересылка 128-bit кода из ОЗУ в регистр xmm
    Пересылка 128-bit кода из регистра xmm в ОЗУ
    Важно: пересылаемый код должен иметь адрес кратный 16-ти, в противном случае возникает аварийная ситуация (нарушение защиты). Аналог инструкции MOVAPD
    MOVDQU xmm, xmm/m128
    MOVDQU xmm/m128, xmm
    Пересылка 128-bit кода из ОЗУ в регистр xmm
    Пересылка 128-bit кода из регистра xmm в ОЗУ
    Замечание: эта инструкция предназначена для применения в тех случаях, когда данные не выровнены или неизвестно выровнены они или нет. Аналог инструкции MOVUPD

    2.6. Работа с масками. Ниже приведены две инструкции работающие со знаковыми разрядами регистров xmm. Одна из них копирует состояние 63-го и 127-го разрядов в регистр общего назначения (r32), в документации это называется формированием знаковой маски.
    Вторая позволяет выборочно изменять содержимое 16-ти байтов (коды 16-ти точек) при наложении на экране одного рисунка на другой (на исходный фон). Для этого применяется маска, указывающая какие байты подлежат изменению, а какие нет. Код (или часть кода) точки занимает 1 байт. Код маски для каждой точки так же занимает 1 байт. Если знаковый разряд байта маски установлен, то код точки исходного фона заменяется новым, в противном случае он остается без изменений. Обычно инструкция работает с видеопамятью, поэтому запись производится минуя кеш. Исходный адрес памяти должен находиться в регистрах DS:DI или DS:EDI. Выравнивание адреса не требуется, в данном случае такое требование было бы бессмысленным.

    MOVMSKPD r32, xmmКопирует содержимое знаковых разрядов xmm (63 и 127) в два младших разряда r32 (0 и 1), остальные разряды r32 очищаются.
    MASKMOVDQU xmm, xmmПересылка по маске. Первый операнд src содержит пересылаемый код, а второй операнд - маску. Третий операнд (dest) явно не указывается, его адрес должен находиться в DS:DI или в DS:EDI.
    Для каждого из 16-ти байтов выполняется следующее: если знаковый разряд i-го байта маски установлен, то dest[i]=src[i], если знаковый разряд байта маски очищен, то содержимое dest не изменяется.


    Первоисточники

    При подготовке данного документа использовалась документация на микропроцессор Intel Pentium 4. Полный комплект документации состоит из трех томов, ссылки на которые находятся в файле Intel® Pentium® 4 Processor - Manuals.
    Описания на русском языке новых инструкций микропроцессоров Pentium MMX, Pentium II и Pentium III находятся в разделе "Оптимизация" на сайте Codenet:
    Сводка и краткое описание инструкций MMX;
    Сводка и краткое описание инструкций группы SSE (Pentium III).
     


    2002-2013 (c) wasm.ru