Compréhension des instructions PowerPC rlwinm

Je me suis donc finalement convaincu d’essayer d’apprendre / d’utiliser PowerPC (PPC). Tout se passe bien et la plupart des informations ont été trouvées en ligne. Cependant, en regardant quelques exemples, je suis tombé sur ceci:

rlwinm r3, r3, 0,1,1 

Comment pourrais-je faire cela en C? J’ai essayé de faire des recherches, mais je n’ai rien trouvé qui puisse m’aider. Merci d’avance!

rlwinm signifie “faire pivoter le mot de gauche immédiat, puis le masque”, et son utilisation est correcte

 rlwinm RA, RS, SH, MB, ME 

Selon la page de description :

  • RA Spécifie le registre polyvalent cible dans lequel le résultat de l’opération est stocké.
  • RS Spécifie le registre général source pour l’opération.
  • SH Spécifie la valeur de décalage pour l’opération.
  • MB Spécifie la valeur de début du masque pour l’opération.
  • ME Spécifie la valeur finale du masque pour l’opération.
  • BM Spécifie la valeur du masque 32 bits.

Et

  • Si la valeur en Mo est inférieure à la valeur ME + 1, les bits de masque compris entre le sharepoint départ et le sharepoint fin, inclus, sont mis à un. Tous les autres bits sont mis à zéro.
  • Si la valeur en Mo est identique à la valeur ME + 1, les 32 bits de masque sont définis sur un.
  • Si la valeur en Mo est supérieure à la valeur ME + 1, tous les bits de masque compris entre la valeur ME +1 et la valeur en MB -1 sont définis sur zéros. Tous les autres bits sont mis à un.

Ainsi, dans votre exemple, la source et la cible sont identiques. La quantité de décalage est 0 , donc pas de décalage. Et MB=ME=1 , donc le premier cas s’applique, de sorte que le masque devienne tous les zéros avec le bit numéro 1 égal à 1 , tandis que la numérotation à partir de MSB=0 : 0x40000000 .

En C, nous pouvons l’écrire aussi simple que

 a &= 0x40000000; 

en supposant a variable est 32 bits.

rlwinm fait pivoter la valeur d’un registre laissé par le nombre spécifié, effectue un AND et stocke le résultat dans un registre.

Exemple: rlwinm r3, r4, 5, 0, 31

r4 est le registre source qui est tourné de 5 et avant que le résultat tourné ne soit placé dans r3 , il est également associé à un masque de bits de 1 seulement, car l’intervalle entre 0 et 31 correspond à la valeur totale de 32 bits.

Exemple pris d’ ici .

Pour une implémentation en C vous voudrez peut-être voir comment faire pivoter à gauche et comment AND qui devrait être facile à construire ensemble maintenant. Quelque chose comme ce qui suit devrait fonctionner:

 int rotateLeft(int input, int shift) { return (input << shift) | ((input >> (32 - shift)) & ~(-1 << shift)); } int rlwinm(int input, int shift, int mask) { return rotateLeft(input, shift) & mask; }