Resolv many bugs

This commit is contained in:
2016-03-29 15:59:38 +02:00
parent 2cf6df0cbe
commit 8bf98700ae

View File

@@ -44,7 +44,7 @@ void finFunc() {
void empile(char *reg) { void empile(char *reg) {
if(afficheMips) { if(afficheMips) {
printf("subu $sp, $sp, 4\n"); printf("subi $sp, $sp, 4\n");
printf("sw %s, 0($sp)\n", reg); printf("sw %s, 0($sp)\n", reg);
} }
} }
@@ -52,7 +52,7 @@ void empile(char *reg) {
void depile(char *reg) { void depile(char *reg) {
if(afficheMips) { if(afficheMips) {
printf("lw %s, 0($sp)\n", reg); printf("lw %s, 0($sp)\n", reg);
printf("addu $sp, $sp, 4\n"); printf("addi $sp, $sp, 4\n");
} }
} }
@@ -110,25 +110,33 @@ void parcours_instr(n_instr *n)
void parcours_instr_si(n_instr *n) void parcours_instr_si(n_instr *n)
{ {
parcours_exp(n->u.si_.test); parcours_exp(n->u.si_.test);
int iRegistre = newReg(); int iRegistre = 0;
char tmp[250]; char tmp[250];
char registre[250]; char registre[250];
char faux[256];
char suite[256];
new_tag(faux);
new_tag(suite);
sprintf(registre,"$t%d",iRegistre); sprintf(registre,"$t%d",iRegistre);
depile(registre); depile(registre);
char faux[256];
new_tag(faux);
char suite[256];
new_tag(suite);
sprintf(tmp,"beq %s $0 %s", registre,faux); sprintf(tmp,"beq %s $0 %s", registre,faux);
printMips(tmp); printMips(tmp);
parcours_instr(n->u.si_.alors); parcours_instr(n->u.si_.alors);
sprintf(tmp,"j %s",suite); sprintf(tmp,"j %s",suite);
printMips(tmp); printMips(tmp);
sprintf(tmp,"%s:",faux); sprintf(tmp,"%s:",faux);
printMips(tmp); printMips(tmp);
if(n->u.si_.sinon){ if(n->u.si_.sinon){
parcours_instr(n->u.si_.sinon); parcours_instr(n->u.si_.sinon);
} }
sprintf(tmp,"%s:",suite); sprintf(tmp,"%s:",suite);
printMips(tmp); printMips(tmp);
} }
@@ -139,21 +147,25 @@ void parcours_instr_tantque(n_instr *n)
{ {
char tmp[256]; char tmp[256];
char etiquette[256]; char etiquette[256];
char fin[256];
char registre[250];
new_tag(etiquette); new_tag(etiquette);
new_tag(fin);
sprintf(tmp,"%s:",etiquette); sprintf(tmp,"%s:",etiquette);
printMips(tmp); printMips(tmp);
char fin[256];
new_tag(fin);
parcours_exp(n->u.tantque_.test); parcours_exp(n->u.tantque_.test);
int iRegistre = newReg();
char registre[250]; int iRegistre = 0;
sprintf(registre,"$t%d",iRegistre); sprintf(registre,"$t%d",iRegistre);
depile(registre); depile(registre);
sprintf(tmp,"beq %s $0 %s", registre,fin); sprintf(tmp,"beq %s $0 %s", registre,fin);
printMips(tmp); printMips(tmp);
parcours_instr(n->u.tantque_.faire); parcours_instr(n->u.tantque_.faire);
sprintf(tmp,"j %s",etiquette); sprintf(tmp,"j %s",etiquette);
printMips(tmp); printMips(tmp);
sprintf(tmp,"%s:",fin); sprintf(tmp,"%s:",fin);
@@ -176,24 +188,25 @@ void parcours_instr_pour(n_instr *n)
{ {
parcours_instr(n->u.pour_.init); parcours_instr(n->u.pour_.init);
char tmp[250]; char tmp[250];
char etiquette[256]; char etiquette[256];
new_tag(etiquette);
char fin[256]; char fin[256];
char registre[250];
new_tag(etiquette);
new_tag(fin); new_tag(fin);
sprintf(tmp,"%s:",etiquette); sprintf(tmp,"%s:",etiquette);
printMips(tmp); printMips(tmp);
parcours_exp(n->u.pour_.test); parcours_exp(n->u.pour_.test);
int iRegistre = newReg(); int iRegistre = 0;
char registre[250];
sprintf(registre,"$t%d",iRegistre); sprintf(registre,"$t%d",iRegistre);
depile(registre); depile(registre);
sprintf(tmp,"beq %s $0 %s", registre,fin); sprintf(tmp,"beq %s $zero %s", registre, fin);
printMips(tmp); printMips(tmp);
parcours_instr(n->u.pour_.faire);
parcours_instr(n->u.pour_.faire);
parcours_instr(n->u.pour_.incr); parcours_instr(n->u.pour_.incr);
sprintf(tmp,"%s:",fin); sprintf(tmp,"%s:",fin);
@@ -205,14 +218,16 @@ void parcours_instr_pour(n_instr *n)
void parcours_instr_affect(n_instr *n) void parcours_instr_affect(n_instr *n)
{ {
char var[256]; char var[256];
parcours_var(n->u.affecte_.var,&var);
parcours_exp(n->u.affecte_.exp);
int iRegistre = newReg();
char tmp[250]; char tmp[250];
char registre[250]; char registre[250];
parcours_var(n->u.affecte_.var,var);
parcours_exp(n->u.affecte_.exp);
int iRegistre = 0;
sprintf(registre,"$t%d",iRegistre); sprintf(registre,"$t%d",iRegistre);
depile(registre); depile(registre);
sprintf(tmp,"sw $t%d, %s ",iRegistre, var); sprintf(tmp,"sw %s, %s",registre, var);
printMips(tmp); printMips(tmp);
} }
@@ -226,25 +241,32 @@ void parcours_instr_appel(n_instr *n)
void parcours_appel(n_appel *n) void parcours_appel(n_appel *n)
{ {
char tmp[250];
int id = rechercheExecutable(n->fonction); int id = rechercheExecutable(n->fonction);
if(id < 0) { if(id < 0) {
printf("Fonction %s introuvable\n", n->fonction); printf("Fonction %s introuvable\n", n->fonction);
affiche_dico(); affiche_dico();
exit(1); exit(1);
} }
printMips("subu $sp, $sp, 4 #Val Retour");
int nbArg = parcours_l_exp(n->args); int nbArg = parcours_l_exp(n->args);
printMips("subu $sp, $sp, 4");
if(dico.tab[id].complement != nbArg) { if(dico.tab[id].complement != nbArg) {
printf("Nombre Argument différent pour l'appel à %s\n", n->fonction); printf("Nombre Argument différent pour l'appel à %s\n", n->fonction);
affiche_dico(); affiche_dico();
exit(1); exit(1);
} }
char tmp[250];
int i = nbArg; /*int i = nbArg;
while(i < 1){ while(i > 0){
printMips("subu $sp, $sp, 4"); printMips("subu $sp, $sp, 4 #Val Argument");
--i; --i;
} } */
sprintf(tmp,"jal %s",n->fonction); sprintf(tmp,"jal %s",n->fonction);
printMips(tmp); printMips(tmp);
} }
@@ -253,14 +275,16 @@ void parcours_appel(n_appel *n)
void parcours_instr_retour(n_instr *n) void parcours_instr_retour(n_instr *n)
{ {
parcours_exp(n->u.retour_.expression);
int iRegistre;
char tmp[250]; char tmp[250];
int nbArg = 2; ///TO DOOOOOOOOOOO
char exec[250];
int returnAdress = 4 * (nbArg + 1);
parcours_exp(n->u.retour_.expression);
int iRegistre = 0;
sprintf(tmp,"$t%d",iRegistre); sprintf(tmp,"$t%d",iRegistre);
depile(tmp); depile(tmp);
int nbArg = 2; ///TO DOOOOOOOOOOO
int returnAdress = 4 * (nbArg + 1);
char exec[250];
sprintf(exec,"sw %s %d($fp) ",tmp , returnAdress); sprintf(exec,"sw %s %d($fp) ",tmp , returnAdress);
printMips(exec); printMips(exec);
finFunc(); finFunc();
@@ -270,9 +294,10 @@ void parcours_instr_retour(n_instr *n)
void parcours_instr_ecrire(n_instr *n) void parcours_instr_ecrire(n_instr *n)
{ {
parcours_exp(n->u.ecrire_.expression); parcours_exp(n->u.ecrire_.expression);
char tmp[250]; char tmp[250];
int iRegistre; int iRegistre = 0;
iRegistre = newReg();
sprintf(tmp,"$t%d",iRegistre); sprintf(tmp,"$t%d",iRegistre);
depile(tmp); depile(tmp);
sprintf(tmp, "move $a0, $t%d",iRegistre); sprintf(tmp, "move $a0, $t%d",iRegistre);
@@ -311,9 +336,11 @@ void parcours_exp(n_exp *n)
void parcours_varExp(n_exp *n) void parcours_varExp(n_exp *n)
{ {
char var[256]; char var[256];
parcours_var(n->u.var, &var);
char tmp[256]; char tmp[256];
int iRegistre = newReg();
parcours_var(n->u.var, var);
int iRegistre = 0;
sprintf(tmp, "lw $t%d, %s", iRegistre, var); sprintf(tmp, "lw $t%d, %s", iRegistre, var);
printMips(tmp); printMips(tmp);
sprintf(tmp, "$t%d", iRegistre); sprintf(tmp, "$t%d", iRegistre);
@@ -323,18 +350,19 @@ void parcours_varExp(n_exp *n)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
void parcours_opExp(n_exp *n) void parcours_opExp(n_exp *n)
{ {
int iRegistre = newReg(); char tmp[256];
int iRegistre2 = newReg();
int iRegistre3 = newReg(); int iRegistre = 0;
int iRegistre2 = 1;
int iRegistre3 = 2;
parcours_exp(n->u.opExp_.op1); parcours_exp(n->u.opExp_.op1);
if(n->u.opExp_.op2 != NULL) if(n->u.opExp_.op2 != NULL)
parcours_exp(n->u.opExp_.op2); parcours_exp(n->u.opExp_.op2);
char tmp[256];
sprintf(tmp, "$t%d", iRegistre3); sprintf(tmp, "$t%d", iRegistre3);
depile(tmp); depile(tmp);
if(n->u.opExp_.op != non){ if(n->u.opExp_.op != non){
sprintf(tmp, "$t%d", iRegistre2); sprintf(tmp, "$t%d", iRegistre2);
depile(tmp); depile(tmp);
@@ -347,80 +375,78 @@ void parcours_opExp(n_exp *n)
sprintf(tmp,"sub $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3); sprintf(tmp,"sub $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3);
printMips(tmp); printMips(tmp);
} else if(n->u.opExp_.op == fois) { } else if(n->u.opExp_.op == fois) {
sprintf(tmp,"mult $t%d, $t%d", iRegistre2, iRegistre3); sprintf(tmp,"mult $t%d, $t%d", iRegistre2, iRegistre3);
printMips(tmp); printMips(tmp);
sprintf(tmp,"mflo $t%d",iRegistre); sprintf(tmp,"mflo $t%d",iRegistre);
printMips(tmp); printMips(tmp);
} else if(n->u.opExp_.op == divise) { } else if(n->u.opExp_.op == divise) {
sprintf(tmp,"div $t%d, $t%d", iRegistre2, iRegistre3); sprintf(tmp,"div $t%d, $t%d", iRegistre2, iRegistre3);
printMips(tmp); printMips(tmp);
sprintf(tmp,"mflo $t%d",iRegistre); sprintf(tmp,"mflo $t%d",iRegistre);
printMips(tmp); printMips(tmp);
} else if(n->u.opExp_.op == egal){ } else if(n->u.opExp_.op == egal){
char etiquette[256]; char etiquette[256];
new_tag(etiquette); new_tag(etiquette);
sprintf(tmp,"li $t%d, 1",iRegistre); sprintf(tmp,"li $t%d, 1",iRegistre);
printMips(tmp); printMips(tmp);
sprintf(tmp,"beq $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); sprintf(tmp,"beq $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette);
printMips(tmp); printMips(tmp);
sprintf(tmp,"li $t%d, 0",iRegistre); sprintf(tmp,"li $t%d, 0",iRegistre);
printMips(tmp); printMips(tmp);
sprintf(tmp,"%s:", etiquette); sprintf(tmp,"%s:", etiquette);
printMips(tmp); printMips(tmp);
} else if(n->u.opExp_.op == diff) {
} else if(n->u.opExp_.op == diff) { char etiquette[256];
char etiquette[256]; new_tag(etiquette);
new_tag(etiquette); sprintf(tmp,"li $t%d, 0",iRegistre);
sprintf(tmp,"li $t%d, 0",iRegistre); printMips(tmp);
printMips(tmp); sprintf(tmp,"beq $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette);
sprintf(tmp,"beq $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); printMips(tmp);
printMips(tmp); sprintf(tmp,"li $t%d, 1",iRegistre);
sprintf(tmp,"li $t%d, 1",iRegistre); printMips(tmp);
printMips(tmp); sprintf(tmp,"%s:", etiquette);
sprintf(tmp,"%s:", etiquette); printMips(tmp);
printMips(tmp); }else if(n->u.opExp_.op == inf){
}else if(n->u.opExp_.op == inf){ char etiquette[256];
char etiquette[256]; new_tag(etiquette);
new_tag(etiquette); sprintf(tmp,"li $t%d, 1",iRegistre);
sprintf(tmp,"li $t%d, 1",iRegistre); printMips(tmp);
printMips(tmp); sprintf(tmp,"blt $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette);
sprintf(tmp,"blt $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); printMips(tmp);
printMips(tmp); sprintf(tmp,"li $t%d, 0",iRegistre);
sprintf(tmp,"li $t%d, 0",iRegistre); printMips(tmp);
printMips(tmp); sprintf(tmp,"%s:", etiquette);
sprintf(tmp,"%s:", etiquette); printMips(tmp);
printMips(tmp); }else if(n->u.opExp_.op == infeg){
}else if(n->u.opExp_.op == infeg){ char etiquette[256];
char etiquette[256]; new_tag(etiquette);
new_tag(etiquette); sprintf(tmp,"li $t%d, 1",iRegistre);
sprintf(tmp,"li $t%d, 1",iRegistre); printMips(tmp);
printMips(tmp); sprintf(tmp,"ble $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette);
sprintf(tmp,"ble $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); printMips(tmp);
printMips(tmp); sprintf(tmp,"li $t%d, 0",iRegistre);
sprintf(tmp,"li $t%d, 0",iRegistre); printMips(tmp);
printMips(tmp); sprintf(tmp,"%s:", etiquette);
sprintf(tmp,"%s:", etiquette); printMips(tmp);
printMips(tmp); }else if(n->u.opExp_.op == ou){
}else if(n->u.opExp_.op == ou){ //TODOOOOOOOOOOOOOO
//TODOOOOOOOOOOOOOO } else if(n->u.opExp_.op == et) {
} sprintf(tmp,"and $t%d, $t%d",iRegistre2,iRegistre3);
else if(n->u.opExp_.op == et) { printMips(tmp);
sprintf(tmp,"and $t%d, $t%d",iRegistre2,iRegistre3); } else if(n->u.opExp_.op == non) {
printMips(tmp);
} else if(n->u.opExp_.op == non) {
sprintf(tmp,"not $t%d, $t%d",iRegistre,iRegistre3); sprintf(tmp,"not $t%d, $t%d",iRegistre,iRegistre3);
printMips(tmp); printMips(tmp);
} }
sprintf(tmp, "$t%d", iRegistre); sprintf(tmp, "$t%d", iRegistre);
empile(tmp); empile(tmp);
} }
/*-------------------------------- -----------------------------------------*/ /*-------------------------------- -----------------------------------------*/
void parcours_intExp(n_exp *n) void parcours_intExp(n_exp *n)
{ {
int iRegistre = newReg(); int iRegistre = 0;
char tmp[256]; char tmp[256];
sprintf(tmp, "li $t%d, %d", iRegistre, n->u.entier); sprintf(tmp, "li $t%d, %d", iRegistre, n->u.entier);
@@ -435,7 +461,7 @@ void parcours_lireExp(n_exp *n)
printMips("li $v0 5"); printMips("li $v0 5");
printMips("syscall"); printMips("syscall");
int iRegistre = newReg(); int iRegistre = 0;
char tmp[256]; char tmp[256];
sprintf(tmp, "move $t%d, $v0", iRegistre); sprintf(tmp, "move $t%d, $v0", iRegistre);
@@ -530,7 +556,7 @@ void parcours_varDec(n_dec *n)
if (contexte == C_VARIABLE_GLOBALE) { if (contexte == C_VARIABLE_GLOBALE) {
ajouteIdentificateur(n->nom, contexte, T_ENTIER, adresseGlobalCourante, -1); ajouteIdentificateur(n->nom, contexte, T_ENTIER, adresseGlobalCourante, -1);
char tmp[250]; char tmp[250];
sprintf(tmp, "$%s: .word", n->nom); sprintf(tmp, "$%s: .space 4", n->nom);
printMips(tmp); printMips(tmp);
adresseGlobalCourante += 4; adresseGlobalCourante += 4;
} else if (contexte == C_VARIABLE_LOCALE) { } else if (contexte == C_VARIABLE_LOCALE) {
@@ -602,14 +628,15 @@ void parcours_var_simple(n_var *n, char * var)
if(dico.tab[i].classe == C_VARIABLE_GLOBALE) { if(dico.tab[i].classe == C_VARIABLE_GLOBALE) {
sprintf(var, "$%s", n->nom); sprintf(var, "$%s", n->nom);
} }
else if (dico.tab[i].classe == C_ARGUMENT){ else if (dico.tab[i].classe == C_ARGUMENT) {
int adress = dico.tab[i].adresse; int adress = dico.tab[i].adresse;
int nbArg = dico.tab[i - (adress/4) -1].complement; int nbArg = dico.tab[i - (adress/4) -1].complement;
int result = (4 * nbArg + adress); int result = (4 * nbArg - adress);
sprintf(var, "%d($fp)", result); sprintf(var, "%d($fp)", result);
} }
else if (dico.tab[i].classe == C_VARIABLE_LOCALE){ else if (dico.tab[i].classe == C_VARIABLE_LOCALE){
int adresse = -1 *(8 - dico.tab[i].adresse); int adresse = -1 *(8 + dico.tab[i].adresse);
sprintf(var, "%d($fp)", adresse); sprintf(var, "%d($fp)", adresse);
} }
} }