diff options
-rw-r--r-- | include/alu.h | 2 | ||||
-rw-r--r-- | lib/alu.c | 2 | ||||
-rw-r--r-- | lib/simulator.c | 25 |
3 files changed, 21 insertions, 8 deletions
diff --git a/include/alu.h b/include/alu.h index 4427060..760de41 100644 --- a/include/alu.h +++ b/include/alu.h @@ -15,4 +15,6 @@ Uint32 OR(Uint32 a, Uint32 b); Uint32 SHL(Uint32 a); Uint32 SHR(Uint32 a); +extern int errRet, Rapide; +extern Uint32 SecondResult; #endif @@ -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 */ |