Un ANDQ nécessite 2 octets de code opération lorsque la valeur (l'opérande) est sur 64 bits, sinon 3 octets de code opération lorsque la valeur est sur 8 bits. C'est à cause de la compatibilité avec le mode x86 qui a déjà consommé presque tous les codes opérations disponibles :
AND RAX,0x12 --> 48 83 E0 12
AND RAX,0x1234 --> 48 25 34 12 00 00
AND RAX,0x123456 --> 48 25 34 12 00 00
AND RAX,0x12345678 --> 48 25 56 34 12 00
Un MOV utilise 1 octet de plus pour le code opération (donc 3 ou 4 octets). Ce qui fait que lorsqu'on veut mettre tout ou partie du registre à zéro il est plus économe de faire AND RAX,0 que MOV RAX,0 (idem pour mettre à 1 avec OR).
Un ANDB (hérité du x86) nécessite 1 octet de code opération et un octet d'opérande :
AND AL,0x12 --> 24 12
[^] # Re: Optimisation de GCC et ouverture du correctif
Posté par Kerro . En réponse à la dépêche Qui est le coupable ? Le processeur ! Retour sur un bogue important des SkyLake & Kaby Lake Intel. Évalué à 10.
Un ANDQ nécessite 2 octets de code opération lorsque la valeur (l'opérande) est sur 64 bits, sinon 3 octets de code opération lorsque la valeur est sur 8 bits. C'est à cause de la compatibilité avec le mode x86 qui a déjà consommé presque tous les codes opérations disponibles :
AND RAX,0x12 --> 48 83 E0 12
AND RAX,0x1234 --> 48 25 34 12 00 00
AND RAX,0x123456 --> 48 25 34 12 00 00
AND RAX,0x12345678 --> 48 25 56 34 12 00
Un MOV utilise 1 octet de plus pour le code opération (donc 3 ou 4 octets). Ce qui fait que lorsqu'on veut mettre tout ou partie du registre à zéro il est plus économe de faire AND RAX,0 que MOV RAX,0 (idem pour mettre à 1 avec OR).
Un ANDB (hérité du x86) nécessite 1 octet de code opération et un octet d'opérande :
AND AL,0x12 --> 24 12
Un MOV a la même taille.