Расширения набора инструкций SSE и AVX предоставляют различные инструкции для преобразования целочисленных значений из одной формы в другую, например, преобразуют меньшее значение в большее и наоборот.
Инструкции копирования с расширением нулем:
pmovzxbw : расширяет каждый байт из первых 8 байтов второго операнда нулями до числа word
pmovzxbd : расширяет каждый байт из первых 4 байтов второго операнда нулями до числа dword
pmovzxbq : расширяеткаждый байт из первых 4 байтов второго операнда нулями до числа qword
pmovzxwd : расширяет каждое из 4 слов (первые 8 байт второго операнда) нулями до числа dword
pmovzxwq : расширяет каждое из 2 слов (первые 4 байт второго операнда) нулями до числа qword
pmovzxdq : расширяет каждое из 2 двойных слов (первые 8 байт второго операнда) нулями до числа qword
Расширяемое значение передается через первый операнд, результат расширения - в первом операнде.
pmovzxbw xmmdest, xmmsrc/mem64 pmovzxbd xmmdest, xmmsrc/mem32 pmovzxbq xmmdest, xmmsrc/mem16 pmovzxwd xmmdest, xmmsrc/mem64 pmovzxwq xmmdest, xmmsrc/mem32 pmovzxdq xmmdest, xmmsrc/mem64
Инструкции расширений AVX2 удваивают количество дорожек, позволяя использовать регистры YMM. Они берут те же операнды, обрабатывают в два раза больше дорожек.
vpmovzxbw : расширяет каждый байт из первых 16 байтов второго операнда нулями до числа word
vpmovzxbd : расширяет каждый байт из первых 8 байтов второго операнда нулями до числа dword
vpmovzxbq : расширяеткаждый байт из первых 4 байтов второго операнда нулями до числа qword
vpmovzxwd : расширяет каждое из 8 слов (первые 8 байт второго операнда) нулями до числа dword
vpmovzxwq : расширяет каждое из 4 слов (первые 4 байт второго операнда) нулями до числа qword
vpmovzxdq : расширяет каждое из 4 двойных слов (первые 8 байт второго операнда) нулями до числа qword
Синтаксис инструкций:
vpmovzxbw xmmdest, xmmsrc/mem128 vpmovzxbd xmmdest, xmmsrc/mem64 vpmovzxbq xmmdest, xmmsrc/mem32 vpmovzxwd xmmdest, xmmsrc/mem128 vpmovzxwq xmmdest, xmmsrc/mem64 vpmovzxdq xmmdest, xmmsrc/mem128
Расширения SSE/AVX/AVX2 также предоставляют ряд инструкций для преобразования чисел со знаком:
pmovsxbw : расширяет каждый байт из первых 8 байтов второго операнда битом знака до числа word
pmovsxbd : расширяет каждый байт из первых 4 байтов второго операнда битом знака до числа dword
pmovsxbq : расширяеткаждый байт из первых 4 байтов второго операнда битом знака до числа qword
pmovsxwd : расширяет каждое из 4 слов (первые 8 байт второго операнда) битом знака до числа dword
pmovsxwq : расширяет каждое из 2 слов (первые 4 байт второго операнда) битом знака до числа qword
pmovsxdq : расширяет каждое из 2 двойных слов (первые 8 байт второго операнда) битом знака до числа qword
vpmovsxbw : расширяет каждый байт из первых 16 байтов второго операнда битом знака до числа word
vpmovsxbd : расширяет каждый байт из первых 8 байтов второго операнда битом знака до числа dword
vpmovsxbq : расширяеткаждый байт из первых 4 байтов второго операнда битом знака до числа qword
vpmovsxwd : расширяет каждое из 8 слов (первые 8 байт второго операнда) битом знака до числа dword
vpmovsxwq : расширяет каждое из 4 слов (первые 4 байт второго операнда) битом знака до числа qword
vpmovsxdq : расширяет каждое из 4 двойных слов (первые 8 байт второго операнда) битом знака до числа qword
Синтаксис:
pmovsxbw xmmdest, xmmsrc/mem64 pmovsxbd xmmdest, xmmsrc/mem32 pmovsxbq xmmdest, xmmsrc/mem16 pmovsxwd xmmdest, xmmsrc/mem64 pmovsxwq xmmdest, xmmsrc/mem32 pmovsxdq xmmdest, xmmsrc/mem64 vpmovsxbw xmmdest, xmmsrc/mem128 vpmovsxbd xmmdest, xmmsrc/mem64 vpmovsxbq xmmdest, xmmsrc/mem32 vpmovsxwd xmmdest, xmmsrc/mem128 vpmovsxwq xmmdest, xmmsrc/mem64 vpmovsxdq xmmdest, xmmsrc/mem128
Также расширения SSE позволяют преобразовывать большие значения в меньшие значения посредством насыщения. Это инструкции:
packsswb: преобразует 16 слов (word) со знаком в 16 байтов, применяя насыщение со знаком
packuswb: преобразует беззнаковых 16 слов в 16 байтов, применяя беззнаковое насыщение
packssdw: преобразует 8 двойных слов (dword) со знаком в 8 слов, применяя насыщение со знаком
packusdw: преобразует беззнаковых 8 двойных слов в 8 слов, применяя беззнаковое насыщение
Синтаксис инструкций:
packsswb xmmdest, xmmsrc/mem128 packuswb xmmdest, xmmsrc/mem128 packssdw xmmdest, xmmsrc/mem128 packusdw xmmdest, xmmsrc/mem128
Операция насыщения проверяет свой операнд, чтобы увидеть, превышает ли значение допустимый диапазон результата (от –128 до +127 для байтов со знаком, от 0 до 255 для байтов без знака, от –32 768 до +32 767 для слов со знаком и от 0 до 65 535 для слов без знака). При насыщении до байта, если исходное значение со знаком меньше –128, насыщение байта устанавливает значение –128. При насыщении до слова, если исходное значение со знаком меньше –32 786, насыщение со знаком устанавливает значение –32 768. Точно так же, если значение байта или слова со знаком превышает 127 или 32 767, то насыщение заменяет значение на 127 или 32 767 соответственно. Для беззнаковых операций насыщение ограничивает значение до 255 для байтов и 65 535 для слов. Значения без знака никогда не бывают меньше 0, поэтому беззнаковое насыщение обрезает значения только до 255 или 65 535.
Расширения AVX/AVX2 также предоставляют инструкция преобразования с насыщением, которые позволяют использовать 256-битные операнды - регистры YMM и переменные.
vpacksswb: преобразует 16 слов со знаком в 16 байтов (для 128-битной версии) и 32 слова со знаком в 32 байта (для 256-битной версии), применяя насыщение со знаком
vpackuswb: преобразует 16 беззнаковых слов в 16 байтов (для 128-битной версии) и 32 беззнаковых слова в 32 байта (для 256-битной версии), применяя беззнаковое насыщение
vpackssdw: преобразует 8 двойных слов со знаком в 8 слов (для 128-битной версии) и 16 двойных слов со знаком в 16 слов (для 256-битной версии), применяя насыщение со знаком
vpackusdw: преобразует 8 беззнаковых двойных слов в 8 слов (для 128-битной версии) и 16 беззнаковых двойных слов в 16 слов (для 256-битной версии), применяя беззнаковое насыщение
Синтаксис инструкций:
vpacksswb xmmdest, xmmsrc1, xmmsrc2/mem128 vpackuswb xmmdest, xmmsrc1, xmmsrc2/mem128 vpackssdw xmmdest, xmmsrc1, xmmsrc2/mem128 vpackusdw xmmdest, xmmsrc1, xmmsrc2/mem128 vpacksswb ymmdest, ymmsrc1, ymmsrc2/mem256 vpackuswb ymmdest, ymmsrc1, ymmsrc2/mem256 vpackssdw ymmdest, ymmsrc1, ymmsrc2/mem256 vpackusdw ymmdest, ymmsrc1, ymmsrc2/mem256