Объединение префиксов в SSE
Вопрос
В SSE префиксы 066h
(переопределение размера операнда) 0F2H
(Repne) и 0F3h
(Repe) являются частью OpCode.
В не-ссе 066h
Переключаются между 32-битными (или 64-битными) и 16-битной работой. 0F2h
а также 0F3h
используются для строковых операций. Они могут быть объединены так, чтобы 066h
а также 0F2h
(или же 0F3h
) может использоваться в одной и той же инструкции, потому что это имеет смысл. Какое поведение в инструкции SSE? Например, у нас есть (игнорируя мод/RM на данный момент):
0f 58
--> addps
66 0f 58
--> addpd
f2 0f 58
--> addsd
f3 0f 58
--> addss
Но что это?
66 f2 0f 58
А как насчет?
f2 66 0f 58
Не говоря уже о следующем, у которого есть два противоречивых префикса представителей:
f2 f3 0f 58
Какая спецификация для них?
Решение
Я не помню, как видел какую-либо спецификацию того, что вы должны ожидать в случае дикого комбинирования случайных префиксов, поэтому я думаю, что поведение процессора может быть «неопределенным» и, возможно, специфичным для ЦП. (Очевидно, что некоторые вещи указаны в документах, например, 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) Не наблюдается изменений для addsd
добавляя 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
вместо FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFh
.
Так Мой вывод заключается в том, что не следует делать никаких предположений и ожидать «неопределенного» поведения. Анкет Я не удивлюсь, однако, если бы вы могли найти некоторые подсказки в Agner Fog's руководства.