La combinaison de préfixes dans SSE
Question
Dans le SSE préfixes 066h
(taille opérande override) 0F2H
(repne) et 0F3h
(REPE) font partie de l'opcode.
commutateurs 066h
non-SSE entre 32 bits (ou 64 bits) et le fonctionnement de 16 bits. 0F2h
et 0F3h
sont utilisés pour les opérations de chaîne. Ils peuvent être combinés de telle sorte que 066h
et 0F2h
(ou 0F3h
) peuvent être utilisés dans la même instruction, parce que cela est significatif. Quel est le comportement dans une instruction SSE? Par exemple, nous avons (ignorer mod / rm pour l'instant):
0f 58
-> addps
66 0f 58
-> addpd
f2 0f 58
-> addsd
f3 0f 58
-> addss
Mais qu'est-ce?
66 f2 0f 58
Et que diriez-vous?
f2 66 0f 58
Sans parler de ce qui suit qui a deux préfixes REP contradictoires:
f2 f3 0f 58
Quelle est la spécification pour ces?
La solution
Je ne me souviens pas avoir vu aucune spécification sur ce que vous devriez vous attendre dans le cas d'une manière extravagante combinant préfixes au hasard, donc je suppose que le comportement du processeur peut être « non défini » et peut-être spécifique à la CPU. (Il est clair que certaines choses sont spécifiées dans par exemple Intel docs de, mais de nombreux cas ne sont pas couverts). Et certaines combinaisons peuvent être réservés pour une utilisation future.
Mes hypothèses naïves auraient généralement que les préfixes supplémentaires seraient pas d'habitation, mais il n'y a aucune garantie. Cela semble raisonnable que par exemple GIVEN certains manuels recommandent l'optimisation NOP
multi-octets (canoniquement 90h
) en préfixant avec 66h
, par exemple:.
db 66h, 90h; 2-byte NOP
db 66h, 66h, 90h; 3-byte NOP
db 66h, 66h, 66h, 90h; 4-byte NOP
Mais je sais aussi que CS
et le segment de DS
préfixes surchargent aquired nouvelles fonctions comme préfixes Hint branche SSE2 (prédire la branche prise = 3Eh
= DS
passer outre, prévoir la branche non prise = 2Eh
= CS
override) lorsqu'il est appliqué aux instructions de saut conditionnel .
Quoi qu'il en soit, je regardais vos exemples ci-dessus, la mise toujours XMM1
à tous 0
et XMM7
à tous 0FFh
par
pxor xmm1, xmm1 ; xmm1 <- 0s
pcmpeqw xmm7, xmm7 ; xmm7 <- FFs
et le code en question, avec des arguments de xmm1, xmm7
. Ce que j'observé (code 32 bits sur le système Win64 et Intel T7300 Core 2 Duo) était:
1) aucun changement observé pour addsd
en ajoutant préfixe 66h
db 66h
addsd xmm1, xmm7 ;total sequence = 66 F2 0F 58 CF
2) aucun changement observé pour addss
en ajoutant préfixe 0F2h
db 0f2h
addss xmm1,xmm7 ;total sequence = F2 F3 0F 58 CF
3) Cependant, j'ai observé un changement de préfixer addpd
par 0F2h
:
db 0f2h
addpd xmm1, xmm7 ;total sequence = F2 66 0F 58 CF
Dans ce cas, le résultat en a été XMM1 0000000000000000FFFFFFFFFFFFFFFFh
au lieu de FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFh
.
ma conclusion est qu'il ne faut pas faire de suppositions et attendre le comportement « non défini » . Je ne serais pas surpris, cependant, si vous pouvez trouver quelques indices dans Agner manuels du brouillard .