Intel Software Manuel citant Developer 2, Section 2.1.1
Utilisez ces préfixes uniquement avec chaîne et des instructions d'E/S (MOVS, CMPS, SCAS, LODS, STOS, INS
et OUTS
). L'utilisation de préfixes de répétition et/ou d'opcodes non définis avec d'autres instructions Intel 64 ou IA-32 est réservée; cette utilisation peut provoquer un comportement imprévisible. Les instructions peuvent utiliser F2H,F3H
comme préfixe obligatoire pour exprimer une fonctionnalité distincte.
L'utilisation des préfixes de répétition avec des instructions non-IO non-string est un comportement non défini exactement pour la raison que vous venez de découvrir: Intel réutilise pour exprimer différentes saveurs de la même « instruction » ou de mettre en œuvre de nouvelles extensions.
Dans le cas des instructions HLE (comme xacquire
), elles ne sont valables que pour un ensemble spécifique d'instructions.
Par exemple, xacquire
peut être utilisé uniquement avec ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCHG8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD
et XCHG
- ces instructions n'autorisent pas les préfixes répétitifs, donc aucune ambiguïté ne se produit.
En général, les préfixes non pertinents sont ignorés, donc si l'ajout d'un préfixe à une instruction peut entraîner un comportement indéfini dans les futurs processeurs, il est ignoré en toute sécurité dans les anciens processeurs.
Voilà pourquoi le soutien de l'ELH n'a pas besoin d'être vérifié explicitement:
matériel sans support ELH ignorera les XACQUIRE
et XRELEASE
conseils de préfixe et ne fera aucune élision puisque ces préfixes correspondent à la REPNE/REPE
Les préfixes IA-32 qui sont ignorés sur les instructions où XACQUIRE
et XRELEASE
sont valides.
Une instruction comme 0xF3 mov byte ptr [ecx],0x0
fera comme mov byte ptr [ecx],0x0
, comme aujourd'hui, parce que le préfixe est ignoré.
Pour le réitérer explicitement: les préfixes de répétition sont utilisés pour choisir une sémantique différente pour une instruction.
Parfois, l'instruction a un nom explicite et la sémantique alternatives sont proches (par exemple movs
, repe movs
, repne movs
ou le fait que tzcnt
est 0xf3 bsf
) et parfois l'instruction ne dispose pas d'un nom explicite et les alternatives sont moins évidentes (par exemple mulsd
est 0xf2 mulps
, mulss
est 0xf3 mulps
, mulpd
est 0x66 mulps
).
Vous trouverez plus d'informations sur l'instruction xacquire
dans les manuels du développeur de logiciels Intel ou au this post.
Consulter la référence du jeu d'instructions. Vous verrez des choses telles que: _ "Le préfixe F3H est défini pour les instructions suivantes et indéfini pour le reste_" et _ "L'indicateur de préfixe XACQUIRE ne peut être utilisé qu'avec les instructions suivantes" _. Les ensembles ne se chevauchent pas et n'incluent pas 'mov'. Donc c'est indéfini. En ce qui concerne XACQUIRE/XRELEASE, voir la section _HLE Software Interface_ dans le manuel du développeur de logiciels _Intel® 64 et IA-32 Volume 1: Basic Architecture_ – Jester