From bb38c3ba0877cbbac1d8f0041280e7a923588e89 Mon Sep 17 00:00:00 2001 From: Pixel <> Date: Mon, 16 Apr 2001 16:17:58 +0000 Subject: Alu & Simul --- lib/alu.c | 2 ++ lib/simulator.c | 25 +++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/alu.c b/lib/alu.c index 2f5b5e2..0419ffd 100644 --- a/lib/alu.c +++ b/lib/alu.c @@ -10,6 +10,8 @@ int errRet = 0, Rapide = 0; +Uint32 SecondResult = 0; + /* ALU rapide */ Uint32 RAdditionNonSigne(Uint32 a, Uint32 b) diff --git a/lib/simulator.c b/lib/simulator.c index cd393b6..21e34bd 100644 --- a/lib/simulator.c +++ b/lib/simulator.c @@ -84,13 +84,15 @@ void DecodeExec(Uint32 instruction, Uint32 entrypoint) /* ALU */ champ_registre_resultat = Champ1(instruction); /* Champ du registre dans lequel va etre stocké le résultat */ val1 = LireRegistre(Champ2(instruction)); /* Premier entier qui va etre utilisé dans l'opération */ - if (ValeurBit(Extension(instruction), 0) == 0) - val2 = LireRegistre(Champ3(instruction)); /* Deuxième entier, stocké dans un registre, qui va etre utilisé dans l'opération */ - else { - val2 = LireInstruction(); /* Deuxième entier, stocké après l'instruction, qui va etre utilisé dans l'opération */ - IncrementeCompteurOrdinal(); + if (Opcode(instruction) < 6) { + if (ValeurBit(Extension(instruction), 0) == 0) + val2 = LireRegistre(Champ3(instruction)); /* Deuxième entier, stocké dans un registre, qui va etre utilisé dans l'opération */ + else { + val2 = LireInstruction(); /* Deuxième entier, stocké après l'instruction, qui va etre utilisé dans l'opération */ + IncrementeCompteurOrdinal(); + } } - if (ValeurBit(Extension(instruction), 1) == 0) /* Teste si l'opération est signée ou pas */ + if (ValeurBit(Extension(instruction), 1) == 0) {/* Teste si l'opération est signée ou pas */ switch (Opcode(instruction)) { case 0: resultat = AdditionNonSigne(val1, val2); @@ -116,7 +118,8 @@ void DecodeExec(Uint32 instruction, Uint32 entrypoint) case 7: resultat = SHR(val1); break; - } else + } + } else { switch (Opcode(instruction)) { case 0: resultat = AdditionSigne(val1, val2); @@ -143,7 +146,13 @@ void DecodeExec(Uint32 instruction, Uint32 entrypoint) resultat = SHR(val1); break; } - EcrireRegistre(champ_registre_resultat, resultat); /* On écrit le résultat dans le registre de sortie */ + } + if ((Opcode(instruction) & 2) && !(Opcode(instruction & 3))) { + EcrireRegistre(32, resultat); + EcrireRegistre(33, SecondResultat); + } else { + EcrireRegistre(champ_registre_resultat, resultat); /* On écrit le résultat dans le registre de sortie */ + } break; case 8: /* MOV */ if (ValeurBit(Extension(instruction), 4) == 1) { /* MOV conditionnel */ -- cgit v1.2.3