2010-03-08 3 views
7

В SSE префиксы 066h (переопределение операнда) 0F2H (REPNE) и 0F3h (REPE) являются частью кода операции.Сочетание префиксов в SSE

В не-SSE 066h переключатели между 32-разрядной (или 64-разрядной) и 16-разрядной операцией. 0F2h и 0F3h используются для операций со строками. Они могут быть объединены таким образом, что 066h и 0F2h (или 0F3h) могут использоваться в одной и той же инструкции, поскольку это имеет смысл. Каково поведение в инструкции SSE? Например, мы (без учета мод/гт на данный момент):

0f 58 ->addps

66 0f 58 ->addpd

f2 0f 58 ->addsd

f3 0f 58 ->addss

Но что это?

66 f2 0f 58

А как насчет?

f2 66 0f 58

Не говоря уже следующее, который имеет два противоречащих друг другу REP префиксы:

f2 f3 0f 58

Что такое спецификация для них?

+1

Это не f3 0f 58 ADDSS, а не ADDPD? – PhiS

+0

упс! исправлено! Спасибо –

ответ

3

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

Мои наивные предположения, как правило, заключались в том, что дополнительные префиксы были бы не-ops, но нет никакой гарантии. Это кажется разумным, учитывая, что, например, некоторые оптимизирующие руководства рекомендуют многобайтовые 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.

Так мой вывод состоит в том, что не следует делать никаких предположений и ожидать «неопределенного» поведения. Однако я бы не удивился, если бы вы могли найти какие-то подсказки в manuals Agner fog.

+0

В последнем случае, по-видимому, '0F2h' имел приоритет над' 066h' и преобразовал инструкцию в 'addd', поэтому был написан только один фрагмент. –

+0

Это была бы одна гипотеза, да. Однако я думаю, что было бы плохо, если бы кто-то хотел полагаться на такое поведение. – PhiS

Смежные вопросы