Intel в их "future extensions" instruction set reference manual имеет обычную Operation
секцию, которая полностью определяет, какие биты идут туда, где.
Intrinsics Guide также воспроизводит раздел Operation
, что является хорошим изменением в некоторых других документах, занесенных в документацию по внутреннему виду. Или, может быть, это недавнее дополнение. Он все еще не учитывает таблицы и диаграммы. Я обычно нахожу справочник insn ref более полезным, за исключением случаев, когда вы ищете инструкции, о которых я, возможно, не думал и не знал.
Раздел Работы для этой команды долго и упорно обращали внимание, а описание английского текста только грубое резюме:
Выполните починки вверх элементов четырехъядерных слов, закодированные в двойной точности плавающех -точечный формат в первом операнде источника (второй операнд) с использованием 32-разрядной двухуровневой таблицы поиска, указанной в соответствующем элементе квадранта второго операнда источника (третий операнд) с спецификатором представления исключений imm8
...
Двухуровневая таблица поиска выполняет фиксацию каждого входного данных DP FP в первом операнде источника путем декодирования кодирования входных данных в типы токенов 8 . Таблица ответов определяется для каждого типа токена, который преобразует входную кодировку в первом операнде источника с одним из 16 ответных действий.
предполагаемое использование регистр является:
- Dest = результат
rcppd
(или аналогичного) + Ньютон-Рафсона итерационного
- SRC = входа в приближение + уточнение
- таблица = FixUp Таблица. Может быть оператором памяти широковещательной передачи, поэтому в общем случае требуется только 64 или 32 бит памяти, где вам нужна одна и та же таблица для каждого элемента вектора. (Таблица представляет собой только 32b для одиночной и двойной точности, но опция широковещательной передачи DP-версии - m64bcst. Для верхних 32-битов это может быть мусор, но не для того, чтобы пересечь границу страницы на неотображаемую страницу: это будет вероятно, вина)
Возможно, более детальный английское описание было бы полезно, чтобы преодолеть разрыв между этим очень грубым резюме и полным псевдокодом:.
для каждого Src элемента:
tsrc
= сброс денормалей до нуля, если установлен MXCSR.DAZ
. Первоначальный src не используется вообще после этого: нет dest=src
действий, только dest=tsrc
.
Категоризируйте tsrc
как один из восьми типов «токенов» (QNAN, SNAN, ноль, +1, -Inf, + Inf, отрицательное значение, положительное значение). Если imm8 не равно нулю, исключения будут инициироваться, когда будет найден токен соответствующего типа.
Используйте этот токен категории для поиска действия в соответствующем элементе 3-го операнда (который представляет собой таблицу из восьми 4-битных кодов, по одному для каждого токена).
Действие может быть одним из dest = dest, dest = tsrc, dest = NaN, dest = +/- Inf, dest = Inf со знаком tsrc, dest = +/- 0, dest = +/-1, dest = 1/2, dest = 90.0, dest = pi/2 или dest = MAX/MIN_FLOAT. См. Документы Intel, для которых кодовые карты соответствуют действию.
Этот процесс выполняется отдельно для каждого векторного элемента.
Типичное использование кода dest=dest
для всех случаев, когда результаты, которые мы исправляем, уже будут правильными. Обратите внимание, что dest
также является входным операндом, даже без записи, из-за действия dest=dest
.
Это намного более подробно, чем их онлайн-документация, спасибо за ссылку! –
Это все еще довольно мусорное пособие, если вы спросите меня. Не до нормального качества письма. Если бы у меня была поддержка процессора AVX-512, я бы отложил ее и посмотрел, что на самом деле происходит;) – JCx
@JCx: Я думаю, что описание псевдокода о том, что он делает, достаточно детально (раздел 'Operation'). В приведенном вами параграфе приводится пример использования, а не информация о работе. Описание: для каждого элемента src классифицируйте его как один из восьми типов «токенов». Используйте этот токен для поиска действия в соответствующем элементе 3-го операнда (который представляет собой таблицу из восьми 4-битных кодов). Действие может установить dest = dest, dest = src, dest = NaN, dest = +/- Inf, dest = +/- 0, dest = pi/2 или несколько других вещей. Обратите внимание, что dest также является входным операндом, даже без файла writemask. –