Преобразования целых чисел в SSE/AVX

Последнее обновление: 03.07.2023

Расширения набора инструкций 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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850