Вам нужно какое-то 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;
Я не помню, чтобы я видел какую-либо спецификацию того, что следует ожидать в случае дико комбинирования случайных префиксов, поэтому я предполагаю, что поведение ЦП может быть «неопределенным» и, возможно, зависеть от ЦП. (Очевидно, что некоторые вещи указаны, например, в документации 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
.
Итак, я пришел к выводу, что не следует делать никаких предположений и ожидать «неопределенного» поведения . Однако я не удивлюсь, если вы найдете некоторые подсказки в руководствах Агнера тумана .
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. Первый байт является обязательным префиксом.