Je suis en train de construire un PowerPC interprète, et il fonctionne très bien. Dans la Puissance de l'architecture de la condition registre CR0 (EFLAGS sur x86) est mis à jour sur presque toute instruction. Il est défini comme ceci. La valeur de CR0 est 1, si le dernier résultat a été négatif, 2 si le dernier résultat a été positif, 4 sinon.
Ma première méthode naïve pour interpréter c'est:
if (n < 0)
cr0 = 1
else if (n > 0)
cr0 = 2;
else
cr0 = 4;
Cependant je comprends que toutes ces branches ne sera pas optimale, en cours d'exécution des millions de fois par seconde. J'ai vu un peu sur le piratage, mais aucun ne semble adeguate. Par exemple, j'ai trouvé de nombreux exemples de convertir un certain nombre de -1, 0 ou 1 en fonction de la signer ou de 0. Mais comment faire -1 = 1, 1 = 2, 0 = 4? Je sollicite l'aide du Bit, des Pirates...
Merci d'avance
Mise à jour: Tout d'abord: merci les gars, vous avez été formidable. Je vais tester toutes vos codes avec soin pour la vitesse, et vous serez le premier à savoir qui est le gagnant.
@jalf.com: vos premiers conseils, je n'ai pas fait le calcul CR0 sur chaque instruction. J'étais plutôt en gardant un lastResult variable, et quand (et si) les instructions suivantes demandé pour un drapeau, faire la comparaison. Les trois principales motivations m'ont ramené à "chaque fois" mise à jour:
- Sur PPC, vous n'êtes pas obligés de mettre à jour CR0 comme sur x86 (où AJOUTER toujours changer EFLAGS, même si pas nécessaire), vous avez deux saveurs d'AJOUTER, une mise à jour. Si le compilateur choisit d'utiliser la mise à jour de l'un, cela signifie qu'il va utiliser le CR0 à un certain point, il n'ya donc pas de point à retarder...
- Il est particulièrement douloureux de l'instruction appelée mtcrf, qui vous permet de changer le CR0 arbitrarly. Vous pouvez même le mettre à 7, pas de l'arithmétique sens... Ce juste détruit la possibilité de garder un "lastResult" à la variable.