Вопрос

В 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 руководства.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top