summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/alu-ralph.c578
-rw-r--r--lib/alu.c697
2 files changed, 685 insertions, 590 deletions
diff --git a/lib/alu-ralph.c b/lib/alu-ralph.c
deleted file mode 100644
index 87c4bc2..0000000
--- a/lib/alu-ralph.c
+++ /dev/null
@@ -1,578 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include "alu.h"
-int errRet = 0;
-
-
- /*On compte de 0 à 31 */
-
- /*Return la valeur du ieme bit en position 0 */
-Uint32 ValeurIbitsAuDeb(Uint32 nb, int i)
-{
- Uint32 val, un = 1;
-
- if ((i > 31) || (i < 0)) {
- fprintf(stderr, "erreur, ValeurIbitsAuDeb: la position demande n est pas dans l'intervalle");
- return (0);
- }
- val = nb >> i;
- val = val & un;
- return (val);
-}
-
-
- /*Return la valeur du ieme bit en sa position d origine */
-/*
-Uint32 ValeurIbit(Uint32 nb, int i) {
- Uint32 val = 0, un = 1;
-
- if ((i > 31) || (i < 0)) {
- fprintf(stderr, "erreur, ValeurIbit: la position demande n est pas dans l'intervalle");
- return (0);
- }
- val = un << i;
- val = AndBit(un, nb);
- return (val);
-}
-*/
-
- /*Met a vrai le ieme bit */
-Uint32 MettreAVIbit(Uint32 nb, int i)
-{
- Uint32 val = 1;
-
- return (OrBit(nb, (val << i)));
-}
-
-
- /* Met a Vrai le Uint32 */
-Uint32 MetAVUint32(void)
-{
- int i;
-
- Uint32 val = 0, un = 1;
-
- for (i = 0; i <= 31; i++) {
- val = (val | un);
- un <<= 1;
- }
- return (val);
-}
-
-
- /* Met a Faux le Uint32 */
-Uint32 MetAFUint32(void)
-{
- return (0);
-}
-
-
- /* Inverse la valeur du i eme bit */
-Uint32 InverseIbit(Uint32 nb, int i)
-{
- Uint32 un = 1;
-
- if ((i > 31) || (i < 0)) {
- fprintf(stderr, "erreur, InverseIbit: la position demande n est pas dans l'intervalle");
- return (0);
- }
- un = (un << i);
- return (nb ^ un);
-}
-
-
- /* Inverse le Uint32 */
-Uint32 InverseUint32(Uint32 x)
-{
- int i;
-
- Uint32 val = x;
-
- for (i = 0; i <= 31; i++) {
- val = InverseIbit(val, i);
- }
- return (val);
-}
-
-Uint32 AndBit(Uint32 x, Uint32 y)
-{
- Uint32 m = 1, z = 0;
- int i;
-
- for (i = 0; i < 32; i++) {
- z |= (x & m) & (y & m);
- m <<= 1;
- }
- return (z);
-}
-
-Uint32 OrBit(Uint32 x, Uint32 y)
-{
- Uint32 m = 1, z = 0;
- int i;
-
- for (i = 0; i < 32; i++) {
- z |= (x & m) | (y & m);
- m <<= 1;
- }
- return (z);
-}
-
-Uint32 ShlUint32(Uint32 x, int i)
-{
- return (x << i);
-}
-
-Uint32 ShrUint32(Uint32 x, int i)
-{
- return (x >> i);
-}
-
-Uint32 AddNonSigUint32(Uint32 x, Uint32 y)
-{
- int i;
-
- Uint32 a, b, tp, add = 0, ret = 0;
-
- if (x == 0)
- return (y);
- if (y == 0)
- return (x);
- for (i = 0; i < 32; i++) {
- a = ValeurIbitsAuDeb(x, i);
- b = ValeurIbitsAuDeb(y, i);
- tp = a + b + ret;
- if (tp == 3) {
- ret = 1;
- tp = 1;
- tp <<= i;
- add |= tp;
- }
-
- else {
- if (tp == 2) {
- ret = 1;
- tp = 0;
- tp <<= i;
- add |= tp;
- }
-
- else {
- if (tp == 1) {
- ret = 0;
- tp = 1;
- tp <<= i;
- add |= tp;
- }
-
- else {
- ret = 0;
- }
- }
- }
- if (i == 31) {
- if (ret == 1) {
- fprintf(stderr, "Erreur AddNonSig: erreur de depassement.\n");
- errRet = 1;
- }
- }
- }
- return (add);
-}
-
-Uint32 AddSigUint32(Uint32 x, Uint32 y)
-{
- int i;
-
- Uint32 a, b, tp, add = 0, ret = 0;
-
- if (x == 0)
- return (y);
- if (y == 0)
- return (x);
- for (i = 0; i < 32; i++) {
- a = ValeurIbitsAuDeb(x, i);
- b = ValeurIbitsAuDeb(y, i);
- tp = a + b + ret;
- if (tp == 3) {
- ret = 1;
- tp = 1;
- tp <<= i;
- add |= tp;
- }
-
- else {
- if (tp == 2) {
- ret = 1;
- tp = 0;
- tp <<= i;
- add |= tp;
- }
-
- else {
- if (tp == 1) {
- ret = 0;
- tp = 1;
- tp <<= i;
- add |= tp;
- }
-
- else {
- ret = 0;
- }
- }
- }
- if (i == 30) {
- if (ret == 1) {
- fprintf(stderr, "Erreur AddNonSig: erreur de depassement.\n");
- errRet = 1;
- }
- }
- }
- return (add);
-}
-
-Uint32 SousNonSigUint32(Uint32 x, Uint32 y)
-{ /* x - y */
- int i;
-
- Uint32 a, b, tp, sou = 0, ret = 0;
-
- for (i = 0; i < 32; i++) {
- a = ValeurIbitsAuDeb(x, i);
- b = ValeurIbitsAuDeb(y, i);
- if (((a == 0) && (b == 0) && (ret == 0)) ||
- ((a == 1) && (b == 1) && (ret == 0)) || ((a == 1) && (b == 0) && (ret == 1))) {
- ret = 0;
- tp = 0;
- tp <<= i;
- sou |= tp;
- }
-
- else {
- if (((a == 0) && (b == 0) && (ret == 1)) ||
- ((a == 0) && (b == 1) && (ret == 0)) || ((a == 1) && (b == 1) && (ret == 1))) {
- ret = 1;
- tp = 1;
- tp <<= i;
- sou |= tp;
- }
-
- else {
- if ((a == 1) && (b == 0) && (ret == 0) || 0) {
- ret = 0;
- tp = 1;
- tp <<= i;
- sou |= tp;
- }
-
- else {
- ret = 1;
- tp = 0;
- tp <<= i;
- sou |= tp;
- }
- }
- }
- if (i == 31) {
- if (ret == 1) {
- fprintf(stdout, "Erreur SousNonSig: erreur de depassement.\n");
- errRet = 1;
- }
- }
- }
- return (sou);
-}
-
-Uint32 SousSigUint32(Uint32 x, Uint32 y)
-{ /* x - y */
- int i;
-
- Uint32 a, b, tp, sou = 0, ret = 0;
-
- for (i = 0; i < 32; i++) {
- a = ValeurIbitsAuDeb(x, i);
- b = ValeurIbitsAuDeb(y, i);
- if (((a == 0) && (b == 0) && (ret == 0)) ||
- ((a == 1) && (b == 1) && (ret == 0)) || ((a == 1) && (b == 0) && (ret == 1))) {
- ret = 0;
- tp = 0;
- tp <<= i;
- sou |= tp;
- }
-
- else {
- if (((a == 0) && (b == 0) && (ret == 1)) ||
- ((a == 0) && (b == 1) && (ret == 0)) || ((a == 1) && (b == 1) && (ret == 1))) {
- ret = 1;
- tp = 1;
- tp <<= i;
- sou |= tp;
- }
-
- else {
- if ((a == 1) && (b == 0) && (ret == 0) || 0) {
- ret = 0;
- tp = 1;
- tp <<= i;
- sou |= tp;
- }
-
- else {
- ret = 1;
- tp = 0;
- tp <<= i;
- sou |= tp;
- }
- }
- }
- if (i == 30) {
- if (ret == 1) {
- fprintf(stdout, "Erreur SousNonSig: erreur de depassement.\n");
- errRet = 1;
- }
- }
- }
- return (sou);
-}
-
-couple Addition(Uint32 x, Uint32 y)
-{ /* Renvoye le resultat + eventuellement une retenue */
- int i;
-
- couple z;
- Uint32 a, b, tp, add = 0, ret = 0;
-
- for (i = 0; i < 32; i++) {
- a = ValeurIbitsAuDeb(x, i);
- b = ValeurIbitsAuDeb(y, i);
- tp = a + b + ret;
- if (tp == 3) {
- ret = 1;
- tp = 1;
- tp <<= i;
- add |= tp;
- }
-
- else {
- if (tp == 2) {
- ret = 1;
- tp = 0;
- tp <<= i;
- add |= tp;
- }
-
- else {
- if (tp == 1) {
- ret = 0;
- tp = 1;
- tp <<= i;
- add |= tp;
- }
-
- else {
- ret = 0;
- }
- }
- }
- if (i == 31) {
- if (ret == 1) {
- z.deb = add;
- z.fin = 1;
- return (z);
- }
- }
- }
- z.deb = add;
- z.fin = 0;
- return (z);
-}
-
-couple Add30Mul(Uint32 x, Uint32 y)
-{
- int i;
-
- couple z;
- Uint32 a, b, tp, add = 0, ret = 0;
-
- for (i = 0; i < 31; i++) {
- a = ValeurIbitsAuDeb(x, i);
- b = ValeurIbitsAuDeb(y, i);
- tp = a + b + ret;
- if (tp == 3) {
- ret = 1;
- tp = 1;
- tp <<= i;
- add |= tp;
- }
-
- else {
- if (tp == 2) {
- ret = 1;
- tp = 0;
- tp <<= i;
- add |= tp;
- }
-
- else {
- if (tp == 1) {
- ret = 0;
- tp = 1;
- tp <<= i;
- add |= tp;
- }
-
- else {
- ret = 0;
- }
- }
- }
- if (i == 30) {
- if (ret == 1) {
- z.deb = add;
- z.fin = 1;
- return (z);
- }
- }
- }
- z.deb = add;
- z.fin = 0;
- return (z);
-}
-
-Uint32 MultChifNomb(Uint32 x, Uint32 y)
-{
- int i;
-
- Uint32 mul = 0, a, un = 1;
-
- if (y == 0)
- return (0);
- if (x == 0)
- return (0);
- if (y == 1)
- return (x);
- for (i = 0; i < 32; i++) {
- a = ValeurIbitsAuDeb(x, i);
- if (a == 1) {
- un <<= i;
- mul |= un;
- }
- }
- return (mul);
-}
-
-couple MultipliNonSig(Uint32 x, Uint32 y)
-{
- couple z, w;
- int i;
-
- Uint32 tp, dec, add, a, pa1 = 0, pa2 = 0;
-
- for (i = 0; i < 32; i++) {
- a = ValeurIbitsAuDeb(y, i);
- tp = MultChifNomb(x, a);
- fprintf(stdout, "tp = %Lu\n", tp);
- dec = (tp >> (32 - i));
- fprintf(stdout, "dec = %Lu\n", dec);
- pa2 = AddNonSigUint32(pa2, dec);
- fprintf(stdout, "pa2 = %Lu\n", pa2);
- add = tp << i;
- z = Addition(pa1, add);
- pa1 = z.deb;
- if (z.fin == 1) {
- w = Addition(pa2, 1);
- pa2 = w.deb;
- }
- }
- z.deb = pa1;
- z.fin = pa2;
-
- printf("\n");
- return (z);
-}
-
-couple MultipliSig(Uint32 x, Uint32 y)
-{
- couple z, w;
- int i;
-
- Uint32 tp, dec, add, a, b, pa1 = 0, pa2 = 0, x1 = x, y1 = y;
-
- a = ValeurIbitsAuDeb(x, 31);
- b = ValeurIbitsAuDeb(y, 31);
- if (((a == 0) && (b == 0)) || ((a == 1) && (b == 1))) { /* Le resultat sera pos */
- if ((a == 1) && (b == 1)) {
- x1 = InverseIbit(x, 31);
- y1 = InverseIbit(y, 31);
- }
- for (i = 0; i < 31; i++) {
- a = ValeurIbitsAuDeb(y1, i);
- tp = MultChifNomb(x1, a);
- dec = tp >> (31 - i);
- w = Addition(pa2, dec);
- pa2 = w.deb;
- add = tp << i;
- z = Add30Mul(pa1, add);
- pa1 = z.deb;
- if (z.fin == 1) {
- w = Addition(pa2, 1);
- pa2 = w.deb;
- }
- }
- z.deb = pa1;
- z.fin = pa2;
- return (z);
- }
- if (a == 1)
- x1 = InverseIbit(x, 31);
- if (b == 1)
- y1 = InverseIbit(y, 31);
- for (i = 0; i < 31; i++) {
- a = ValeurIbitsAuDeb(y1, i);
- tp = MultChifNomb(x1, a);
- dec = tp >> (31 - i);
- pa2 = AddNonSigUint32(pa2, dec);
- add = tp << i;
- z = Add30Mul(pa1, add);
- pa1 = z.deb;
- if (z.fin == 1) {
- pa2 = AddNonSigUint32(pa2, 1);
- }
- }
- pa1 = MettreAVIbit(pa1, 31);
- pa2 = MettreAVIbit(pa2, 31);
- z.deb = pa1;
- z.fin = pa2;
- return (z);
-}
-
-Uint32 AndEnt(Uint32 x, Uint32 y)
-{
- return (x & y);
-}
-
-Uint32 OrEnt(Uint32 x, Uint32 y)
-{
- return (x | y);
-}
-
-Uint32 AddEnt(Uint32 x, Uint32 y)
-{
- return (x + y);
-}
-
-Uint32 SousEnt(Uint32 x, Uint32 y)
-{
- return (x - y);
-}
-
-Uint32 DivEnt(Uint32 x, Uint32 y)
-{
- return (x / y);
-}
-
-Uint32 RestDivEnt(Uint32 x, Uint32 y)
-{
- return (x % y);
-}
diff --git a/lib/alu.c b/lib/alu.c
index 6316952..2f5b5e2 100644
--- a/lib/alu.c
+++ b/lib/alu.c
@@ -7,62 +7,735 @@
/** GESTION DE L'UNITE DE CALCUL **/
/** **/
/*****************************************/
-Uint32 AdditionNonSigne(Uint32 a, Uint32 b)
+
+int errRet = 0, Rapide = 0;
+
+/* ALU rapide */
+
+Uint32 RAdditionNonSigne(Uint32 a, Uint32 b)
{
return (a + b);
}
-Uint32 AdditionSigne(Uint32 a, Uint32 b)
+Uint32 RAdditionSigne(Uint32 a, Uint32 b)
{
return (a + b);
}
-Uint32 SoustractionNonSigne(Uint32 a, Uint32 b)
+Uint32 RSoustractionNonSigne(Uint32 a, Uint32 b)
{
return (a - b);
}
-Uint32 SoustractionSigne(Uint32 a, Uint32 b)
+Uint32 RSoustractionSigne(Uint32 a, Uint32 b)
{
return (a - b);
}
-Uint32 MultiplicationNonSigne(Uint32 a, Uint32 b)
+Uint32 RMultiplicationNonSigne(Uint32 a, Uint32 b)
{
return (a * b);
}
-Uint32 MultiplicationSigne(Uint32 a, Uint32 b)
+Uint32 RMultiplicationSigne(Uint32 a, Uint32 b)
{
return (a * b);
}
-Uint32 DivisionNonSigne(Uint32 a, Uint32 b)
+Uint32 RDivisionNonSigne(Uint32 a, Uint32 b)
{
return (a / b);
}
-Uint32 DivisionSigne(Uint32 a, Uint32 b)
+Uint32 RDivisionSigne(Uint32 a, Uint32 b)
{
return (a / b);
}
-Uint32 AND(Uint32 a, Uint32 b)
+Uint32 RAND(Uint32 a, Uint32 b)
{
return (a & b);
}
-Uint32 OR(Uint32 a, Uint32 b)
+Uint32 ROR(Uint32 a, Uint32 b)
{
return (a | b);
}
-Uint32 SHL(Uint32 a)
+Uint32 RSHL(Uint32 a)
{
return (a >> 1);
}
-Uint32 SHR(Uint32 a)
+Uint32 RSHR(Uint32 a)
{
return (a << 1);
}
+
+
+#if 0
+
+ /*On compte de 0 à 31 */
+
+ /*Return la valeur du ieme bit en position 0 */
+Uint32 ValeurIbitsAuDeb(Uint32 nb, int i)
+{
+ Uint32 val, un = 1;
+
+ if ((i > 31) || (i < 0)) {
+ fprintf(stderr, "erreur, ValeurIbitsAuDeb: la position demande n est pas dans l'intervalle");
+ return (0);
+ }
+ val = nb >> i;
+ val = val & un;
+ return (val);
+}
+
+
+ /*Return la valeur du ieme bit en sa position d origine */
+/*
+Uint32 ValeurIbit(Uint32 nb, int i) {
+ Uint32 val = 0, un = 1;
+
+ if ((i > 31) || (i < 0)) {
+ fprintf(stderr, "erreur, ValeurIbit: la position demande n est pas dans l'intervalle");
+ return (0);
+ }
+ val = un << i;
+ val = AndBit(un, nb);
+ return (val);
+}
+*/
+
+ /*Met a vrai le ieme bit */
+Uint32 MettreAVIbit(Uint32 nb, int i)
+{
+ Uint32 val = 1;
+
+ return (OrBit(nb, (val << i)));
+}
+
+
+ /* Met a Vrai le Uint32 */
+Uint32 MetAVUint32(void)
+{
+ int i;
+
+ Uint32 val = 0, un = 1;
+
+ for (i = 0; i <= 31; i++) {
+ val = (val | un);
+ un <<= 1;
+ }
+ return (val);
+}
+
+
+ /* Met a Faux le Uint32 */
+Uint32 MetAFUint32(void)
+{
+ return (0);
+}
+
+
+ /* Inverse la valeur du i eme bit */
+Uint32 InverseIbit(Uint32 nb, int i)
+{
+ Uint32 un = 1;
+
+ if ((i > 31) || (i < 0)) {
+ fprintf(stderr, "erreur, InverseIbit: la position demande n est pas dans l'intervalle");
+ return (0);
+ }
+ un = (un << i);
+ return (nb ^ un);
+}
+
+
+ /* Inverse le Uint32 */
+Uint32 InverseUint32(Uint32 x)
+{
+ int i;
+
+ Uint32 val = x;
+
+ for (i = 0; i <= 31; i++) {
+ val = InverseIbit(val, i);
+ }
+ return (val);
+}
+
+Uint32 AndBit(Uint32 x, Uint32 y)
+{
+ Uint32 m = 1, z = 0;
+ int i;
+
+ for (i = 0; i < 32; i++) {
+ z |= (x & m) & (y & m);
+ m <<= 1;
+ }
+ return (z);
+}
+
+Uint32 OrBit(Uint32 x, Uint32 y)
+{
+ Uint32 m = 1, z = 0;
+ int i;
+
+ for (i = 0; i < 32; i++) {
+ z |= (x & m) | (y & m);
+ m <<= 1;
+ }
+ return (z);
+}
+
+Uint32 ShlUint32(Uint32 x, int i)
+{
+ return (x << i);
+}
+
+Uint32 ShrUint32(Uint32 x, int i)
+{
+ return (x >> i);
+}
+
+Uint32 NAdditionNonSigne(Uint32 x, Uint32 y)
+{
+ int i;
+
+ Uint32 a, b, tp, add = 0, ret = 0;
+
+ if (x == 0)
+ return (y);
+ if (y == 0)
+ return (x);
+ for (i = 0; i < 32; i++) {
+ a = ValeurIbitsAuDeb(x, i);
+ b = ValeurIbitsAuDeb(y, i);
+ tp = a + b + ret;
+ if (tp == 3) {
+ ret = 1;
+ tp = 1;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ if (tp == 2) {
+ ret = 1;
+ tp = 0;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ if (tp == 1) {
+ ret = 0;
+ tp = 1;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ ret = 0;
+ }
+ }
+ }
+ if (i == 31) {
+ if (ret == 1) {
+ fprintf(stderr, "Erreur AddNonSig: erreur de depassement.\n");
+ errRet = 1;
+ }
+ }
+ }
+ return (add);
+}
+
+Uint32 NAdditionSigne(Uint32 x, Uint32 y)
+{
+ int i;
+
+ Uint32 a, b, tp, add = 0, ret = 0;
+
+ if (x == 0)
+ return (y);
+ if (y == 0)
+ return (x);
+ for (i = 0; i < 32; i++) {
+ a = ValeurIbitsAuDeb(x, i);
+ b = ValeurIbitsAuDeb(y, i);
+ tp = a + b + ret;
+ if (tp == 3) {
+ ret = 1;
+ tp = 1;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ if (tp == 2) {
+ ret = 1;
+ tp = 0;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ if (tp == 1) {
+ ret = 0;
+ tp = 1;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ ret = 0;
+ }
+ }
+ }
+ if (i == 30) {
+ if (ret == 1) {
+ fprintf(stderr, "Erreur AddNonSig: erreur de depassement.\n");
+ errRet = 1;
+ }
+ }
+ }
+ return (add);
+}
+
+Uint32 SoustractionNonSigne(Uint32 x, Uint32 y)
+{ /* x - y */
+ int i;
+
+ Uint32 a, b, tp, sou = 0, ret = 0;
+
+ for (i = 0; i < 32; i++) {
+ a = ValeurIbitsAuDeb(x, i);
+ b = ValeurIbitsAuDeb(y, i);
+ if (((a == 0) && (b == 0) && (ret == 0)) ||
+ ((a == 1) && (b == 1) && (ret == 0)) || ((a == 1) && (b == 0) && (ret == 1))) {
+ ret = 0;
+ tp = 0;
+ tp <<= i;
+ sou |= tp;
+ }
+
+ else {
+ if (((a == 0) && (b == 0) && (ret == 1)) ||
+ ((a == 0) && (b == 1) && (ret == 0)) || ((a == 1) && (b == 1) && (ret == 1))) {
+ ret = 1;
+ tp = 1;
+ tp <<= i;
+ sou |= tp;
+ }
+
+ else {
+ if ((a == 1) && (b == 0) && (ret == 0) || 0) {
+ ret = 0;
+ tp = 1;
+ tp <<= i;
+ sou |= tp;
+ }
+
+ else {
+ ret = 1;
+ tp = 0;
+ tp <<= i;
+ sou |= tp;
+ }
+ }
+ }
+ if (i == 31) {
+ if (ret == 1) {
+ fprintf(stdout, "Erreur SousNonSig: erreur de depassement.\n");
+ errRet = 1;
+ }
+ }
+ }
+ return (sou);
+}
+
+Uint32 SoustractionSignee(Uint32 x, Uint32 y)
+{ /* x - y */
+ int i;
+
+ Uint32 a, b, tp, sou = 0, ret = 0;
+
+ for (i = 0; i < 32; i++) {
+ a = ValeurIbitsAuDeb(x, i);
+ b = ValeurIbitsAuDeb(y, i);
+ if (((a == 0) && (b == 0) && (ret == 0)) ||
+ ((a == 1) && (b == 1) && (ret == 0)) || ((a == 1) && (b == 0) && (ret == 1))) {
+ ret = 0;
+ tp = 0;
+ tp <<= i;
+ sou |= tp;
+ }
+
+ else {
+ if (((a == 0) && (b == 0) && (ret == 1)) ||
+ ((a == 0) && (b == 1) && (ret == 0)) || ((a == 1) && (b == 1) && (ret == 1))) {
+ ret = 1;
+ tp = 1;
+ tp <<= i;
+ sou |= tp;
+ }
+
+ else {
+ if ((a == 1) && (b == 0) && (ret == 0) || 0) {
+ ret = 0;
+ tp = 1;
+ tp <<= i;
+ sou |= tp;
+ }
+
+ else {
+ ret = 1;
+ tp = 0;
+ tp <<= i;
+ sou |= tp;
+ }
+ }
+ }
+ if (i == 30) {
+ if (ret == 1) {
+ fprintf(stdout, "Erreur SousNonSig: erreur de depassement.\n");
+ errRet = 1;
+ }
+ }
+ }
+ return (sou);
+}
+
+couple Addition(Uint32 x, Uint32 y)
+{ /* Renvoye le resultat + eventuellement une retenue */
+ int i;
+
+ couple z;
+ Uint32 a, b, tp, add = 0, ret = 0;
+
+ for (i = 0; i < 32; i++) {
+ a = ValeurIbitsAuDeb(x, i);
+ b = ValeurIbitsAuDeb(y, i);
+ tp = a + b + ret;
+ if (tp == 3) {
+ ret = 1;
+ tp = 1;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ if (tp == 2) {
+ ret = 1;
+ tp = 0;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ if (tp == 1) {
+ ret = 0;
+ tp = 1;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ ret = 0;
+ }
+ }
+ }
+ if (i == 31) {
+ if (ret == 1) {
+ z.deb = add;
+ z.fin = 1;
+ return (z);
+ }
+ }
+ }
+ z.deb = add;
+ z.fin = 0;
+ return (z);
+}
+
+couple Add30Mul(Uint32 x, Uint32 y)
+{
+ int i;
+
+ couple z;
+ Uint32 a, b, tp, add = 0, ret = 0;
+
+ for (i = 0; i < 31; i++) {
+ a = ValeurIbitsAuDeb(x, i);
+ b = ValeurIbitsAuDeb(y, i);
+ tp = a + b + ret;
+ if (tp == 3) {
+ ret = 1;
+ tp = 1;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ if (tp == 2) {
+ ret = 1;
+ tp = 0;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ if (tp == 1) {
+ ret = 0;
+ tp = 1;
+ tp <<= i;
+ add |= tp;
+ }
+
+ else {
+ ret = 0;
+ }
+ }
+ }
+ if (i == 30) {
+ if (ret == 1) {
+ z.deb = add;
+ z.fin = 1;
+ return (z);
+ }
+ }
+ }
+ z.deb = add;
+ z.fin = 0;
+ return (z);
+}
+
+Uint32 MultChifNomb(Uint32 x, Uint32 y)
+{
+ int i;
+
+ Uint32 mul = 0, a, un = 1;
+
+ if (y == 0)
+ return (0);
+ if (x == 0)
+ return (0);
+ if (y == 1)
+ return (x);
+ for (i = 0; i < 32; i++) {
+ a = ValeurIbitsAuDeb(x, i);
+ if (a == 1) {
+ un <<= i;
+ mul |= un;
+ }
+ }
+ return (mul);
+}
+
+couple MultipliNonSig(Uint32 x, Uint32 y)
+{
+ couple z, w;
+ int i;
+
+ Uint32 tp, dec, add, a, pa1 = 0, pa2 = 0;
+
+ for (i = 0; i < 32; i++) {
+ a = ValeurIbitsAuDeb(y, i);
+ tp = MultChifNomb(x, a);
+ fprintf(stdout, "tp = %Lu\n", tp);
+ dec = (tp >> (32 - i));
+ fprintf(stdout, "dec = %Lu\n", dec);
+ pa2 = AddNonSigUint32(pa2, dec);
+ fprintf(stdout, "pa2 = %Lu\n", pa2);
+ add = tp << i;
+ z = Addition(pa1, add);
+ pa1 = z.deb;
+ if (z.fin == 1) {
+ w = Addition(pa2, 1);
+ pa2 = w.deb;
+ }
+ }
+ z.deb = pa1;
+ z.fin = pa2;
+
+ printf("\n");
+ return (z);
+}
+
+couple MultipliSig(Uint32 x, Uint32 y)
+{
+ couple z, w;
+ int i;
+
+ Uint32 tp, dec, add, a, b, pa1 = 0, pa2 = 0, x1 = x, y1 = y;
+
+ a = ValeurIbitsAuDeb(x, 31);
+ b = ValeurIbitsAuDeb(y, 31);
+ if (((a == 0) && (b == 0)) || ((a == 1) && (b == 1))) { /* Le resultat sera pos */
+ if ((a == 1) && (b == 1)) {
+ x1 = InverseIbit(x, 31);
+ y1 = InverseIbit(y, 31);
+ }
+ for (i = 0; i < 31; i++) {
+ a = ValeurIbitsAuDeb(y1, i);
+ tp = MultChifNomb(x1, a);
+ dec = tp >> (31 - i);
+ w = Addition(pa2, dec);
+ pa2 = w.deb;
+ add = tp << i;
+ z = Add30Mul(pa1, add);
+ pa1 = z.deb;
+ if (z.fin == 1) {
+ w = Addition(pa2, 1);
+ pa2 = w.deb;
+ }
+ }
+ z.deb = pa1;
+ z.fin = pa2;
+ return (z);
+ }
+ if (a == 1)
+ x1 = InverseIbit(x, 31);
+ if (b == 1)
+ y1 = InverseIbit(y, 31);
+ for (i = 0; i < 31; i++) {
+ a = ValeurIbitsAuDeb(y1, i);
+ tp = MultChifNomb(x1, a);
+ dec = tp >> (31 - i);
+ pa2 = AddNonSigUint32(pa2, dec);
+ add = tp << i;
+ z = Add30Mul(pa1, add);
+ pa1 = z.deb;
+ if (z.fin == 1) {
+ pa2 = AddNonSigUint32(pa2, 1);
+ }
+ }
+ pa1 = MettreAVIbit(pa1, 31);
+ pa2 = MettreAVIbit(pa2, 31);
+ z.deb = pa1;
+ z.fin = pa2;
+ return (z);
+}
+#else
+Uint32 NAdditionNonSigne(Uint32 a, Uint32 b) {}
+Uint32 NAdditionSigne(Uint32 a, Uint32 b) {}
+Uint32 NSoustractionNonSigne(Uint32 a, Uint32 b) {}
+Uint32 NSoustractionSigne(Uint32 a, Uint32 b) {}
+Uint32 NMultiplicationNonSigne(Uint32 a, Uint32 b) {}
+Uint32 NMultiplicationSigne(Uint32 a, Uint32 b) {}
+Uint32 NDivisionNonSigne(Uint32 a, Uint32 b) {}
+Uint32 NDivisionSigne(Uint32 a, Uint32 b) {}
+Uint32 NAND(Uint32 a, Uint32 b) {}
+Uint32 NOR(Uint32 a, Uint32 b) {}
+Uint32 NSHR(Uint32 a, Uint32 b) {}
+Uint32 NSHL(Uint32 a, Uint32 b) {}
+#endif
+
+Uint32 AdditionNonSigne(Uint32 a, Uint32 b)
+{
+ if (Rapide) {
+ return RAdditionNonSigne(a, b);
+ } else {
+ return NAdditionNonSigne(a, b);
+ }
+}
+
+Uint32 AdditionSigne(Uint32 a, Uint32 b)
+{
+ if (Rapide) {
+ return RAdditionSigne(a, b);
+ } else {
+ return NAdditionSigne(a, b);
+ }
+}
+
+Uint32 SoustractionNonSigne(Uint32 a, Uint32 b)
+{
+ if (Rapide) {
+ return RSoustractionNonSigne(a, b);
+ } else {
+ return NSoustractionNonSigne(a, b);
+ }
+}
+
+Uint32 SoustractionSigne(Uint32 a, Uint32 b)
+{
+ if (Rapide) {
+ return RSoustractionSigne(a, b);
+ } else {
+ return NSoustractionSigne(a, b);
+ }
+}
+
+Uint32 MultiplicationNonSigne(Uint32 a, Uint32 b)
+{
+ if (Rapide) {
+ return RMultiplicationNonSigne(a, b);
+ } else {
+ return NMultiplicationNonSigne(a, b);
+ }
+}
+
+Uint32 MultiplicationSigne(Uint32 a, Uint32 b)
+{
+ if (Rapide) {
+ return RMultiplicationSigne(a, b);
+ } else {
+ return NMultiplicationSigne(a, b);
+ }
+}
+
+Uint32 DivisionNonSigne(Uint32 a, Uint32 b)
+{
+ if (Rapide) {
+ return RDivisionNonSigne(a, b);
+ } else {
+ return NDivisionNonSigne(a, b);
+ }
+}
+
+Uint32 DivisionSigne(Uint32 a, Uint32 b)
+{
+ if (Rapide) {
+ return RDivisionSigne(a, b);
+ } else {
+ return NDivisionSigne(a, b);
+ }
+}
+
+Uint32 AND(Uint32 a, Uint32 b)
+{
+ if (Rapide) {
+ return RANDSigne(a, b);
+ } else {
+ return NANDSigne(a, b);
+ }
+}
+
+Uint32 OR(Uint32 a, Uint32 b)
+{
+ if (Rapide) {
+ return ROR(a, b);
+ } else {
+ return NOR(a, b);
+ }
+}
+
+Uint32 SHL(Uint32 a)
+{
+ if (Rapide) {
+ return RSHL(a, b);
+ } else {
+ return NSHL(a, b);
+ }
+}
+
+Uint32 SHR(Uint32 a)
+{
+ if (Rapide) {
+ return RSHR(a, b);
+ } else {
+ return NSHR(a, b);
+ }
+}