Объединение префиксов в SSE

Вам нужно какое-то join для сопоставления таблиц - даже если на искусственном ключе:

update t
    set Amount = tr.Amount
from (select t.*, row_number() over (order by (select null)) as seqnum
      from Transactions t
     ) t join
     (select tr.*, row_number() over (order by (select null)) as seqnum
      from Transactions_raw tr
     ) tr
     on t.seqnum  = tr.seqnum;
9
задан Peter Cordes 4 December 2019 в 03:27
поделиться

2 ответа

Я не помню, чтобы я видел какую-либо спецификацию того, что следует ожидать в случае дико комбинирования случайных префиксов, поэтому я предполагаю, что поведение ЦП может быть «неопределенным» и, возможно, зависеть от ЦП. (Очевидно, что некоторые вещи указаны, например, в документации Intel, но многие случаи не рассматриваются). А некоторые комбинации могут быть зарезервированы для использования в будущем.

Обычно я предполагал, что дополнительные префиксы не работают, но нет никаких гарантий. Это кажется разумным, учитывая, например, что некоторые руководства по оптимизации рекомендуют многобайтовый NOP (канонически 90h ) с префиксом 66h , например:

db 66h, 90h; 2-byte NOP
db 66h, 66h, 90h; 3-byte NOP
db 66h, 66h, 66h, 90h; 4-byte NOP

Однако я также знаю, что CS Префиксы переопределения сегментов и DS приобрели новые функции в качестве префиксов подсказок ветвления SSE2 (предсказать переход = 3Eh = переопределение DS ; прогнозировать переход не был = 2Eh = CS переопределение) при применении к командам условного перехода.

В любом случае, я просмотрел ваши примеры выше, всегда устанавливая XMM1 для всех 0 и XMM7 для всех 0FFh на

pxor xmm1, xmm1    ; xmm1 <- 0s
pcmpeqw xmm7, xmm7 ; xmm7 <- FFs 

, а затем рассматриваемый код с аргументами xmm1, xmm7 .Я наблюдал (32-битный код в системе Win64 и Intel T7300 Core 2 Duo):

1) никаких изменений не наблюдалось для , добавляетd путем добавления префикса 66h

db 66h 
addsd xmm1, xmm7 ;total sequence = 66 F2 0F 58 CF     

2) нет изменение, наблюдаемое для addss путем добавления префикса 0F2h

db 0f2h     
addss xmm1,xmm7 ;total sequence = F2 F3 0F 58 CF

3) Однако я заметил изменение, добавив префикс addpd к 0F2h :

db 0f2h    
addpd xmm1, xmm7 ;total sequence = F2 66 0F 58 CF

В этом случае результат в XMM1 был 0000000000000000FFFFFFFFFFFFFFFFh вместо FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFh .

Итак, я пришел к выводу, что не следует делать никаких предположений и ожидать «неопределенного» поведения . Однако я не удивлюсь, если вы найдете некоторые подсказки в руководствах Агнера тумана .

5
ответ дан 4 December 2019 в 23:39
поделиться

SDM Intel vol.2 руководство (ссылка системы команд) называет их [1 127] обязательные префиксы . Думайте о них как о части кода операции.

, Но да, они префиксы и могут быть смешаны с другими префиксами перед фактическим escape-byte+opcode. На самом деле префикс REX должен следовать за другими префиксами.

, Как обычно, использование нескольких конфликтующих префиксов от той же группы, оказывается, декодирует с последней, берущей приоритет на текущих аппаратных средствах Intel. Я думаю, что в руководствах Intel говорится, что выполнение этого может дать непредсказуемое поведение, таким образом, это не гарантировано или соответствующее требованиям завтрашнего дня. Это не значимая вещь сделать; если Вы хотите заполнить инструкцию сделать его дольше по причинам выравнивания, я думаю, повторяясь тот же , префикс пару раз безопасен.

ФОРМАТЫ ИНСТРУКЦИИ SSE B.8 И КОДИРОВКА

инструкции SSE используют формат ModR/M и предшествуются 0FH байтом префикса. В целом операции не дублированы для обеспечения двух направлений (то есть, отдельная загрузка и варианты хранилища).

следующие три таблицы (Таблицы B-22, B-23 и B-24) показывают форматы и кодировку для SIMD SSE, с плавающей точкой, целое число SIMD, и cacheability и инструкции для заказа памяти, соответственно. Некоторые инструкции SSE требуют обязательного префикса (66-й, F2H, F3H) как часть двухбайтового кода операции. Обязательные префиксы включены в таблицы.

<час>

И также

2.1.2 Кодов операций

А основной код операции может быть 1, 2, или 3 байта в длине. Дополнительное 3-разрядное поле кода операции иногда кодируется в байте ModR/M. Меньшие поля могут быть определены в рамках основного кода операции. Такие поля определяют направление операции, размер смещений, кодирования регистра, кодов условий или расширения знака. Кодирование полей, используемых кодом операции, варьируется в зависимости от класса операции.

Двухбайтовые форматы кода операции для инструкций SIMD и общего назначения состоят из одного из следующего:

  • байт кода операции Escape 0FH как основной код операции и второй байт кода операции.
  • А обязательный префикс (66H, F2H, или F3H), байт кода операции Escape и второй байт кода операции (то же как предыдущий маркер).

, Например, CVTDQ2PD состоит из следующей последовательности: F3 0F E6. первый байт является обязательным префиксом (это не рассматривают как повторный префикс) . Трехбайтовые форматы кода операции для инструкций SIMD и общего назначения состоят из одного из следующего:

  • байт кода операции Escape 0FH как основной код операции, плюс два дополнительных байта кода операции.
  • А обязательный префикс (66-й, F2H или F3H), байт кода операции Escape, плюс два дополнительных байта кода операции (то же как предыдущий маркер).

, Например, PHADDW для регистров XMM состоит из следующей последовательности: 66 0F 38 01. Первый байт является обязательным префиксом.

1
ответ дан 4 December 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: