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?

Était-ce utile?

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 .

scroll top