diff --git a/src/parcours.c b/src/parcours.c index ffd502c..59c8db3 100644 --- a/src/parcours.c +++ b/src/parcours.c @@ -2,13 +2,15 @@ #include "parcours.h" #include "syntabs.h" #include "util.h" -int argumentMicka = 0; + +int nbArg = 0; int contexte = C_VARIABLE_GLOBALE; int adresseGlobalCourante = 0; int adresseLocaleCourante = 0; int adresseArgumentCourant = 0; int afficheMips = 0; int creg = 0; + extern dico_ dico; int tagindice = 0; @@ -34,13 +36,19 @@ void debutFunc() { printMips("sw $ra, 0($sp)"); } -void finFunc() { +void finFuncreturn(int bool){ printMips("lw $ra, 0($sp)"); printMips("addi $sp, $sp, 4"); printMips("lw $fp, 0($sp)"); printMips("addi $sp, $sp, 4"); + if(!bool){ + printMips("addi $sp, $sp, 4 #ignore valeur de retour"); + } printMips("jr $ra"); } +void finFunc() { + finFuncreturn(0); +} void empile(char *reg) { if(afficheMips) { @@ -221,8 +229,9 @@ void parcours_instr_affect(n_instr *n) char tmp[250]; char registre[250]; - parcours_var(n->u.affecte_.var,var); parcours_exp(n->u.affecte_.exp); + parcours_var(n->u.affecte_.var,var); + int iRegistre = 0; sprintf(registre,"$t%d",iRegistre); @@ -250,7 +259,7 @@ void parcours_appel(n_appel *n) exit(1); } - printMips("sub $sp, $sp, 4 #Val Retour"); + printMips("subi $sp, $sp, 4 #Val Retour"); int nbArg = parcours_l_exp(n->args); @@ -264,8 +273,10 @@ void parcours_appel(n_appel *n) sprintf(tmp,"jal %s",n->fonction); printMips(tmp); int i = nbArg * 4; - sprintf(tmp,"addi $sp, $sp, %d",i); - printMips(tmp); + if(i != 0) { + sprintf(tmp,"addi $sp, $sp, %d #désalocation des arguments",i); + printMips(tmp); + } } /*-------------------------------------------------------------------------*/ @@ -274,17 +285,15 @@ void parcours_instr_retour(n_instr *n) { char tmp[250]; char exec[250]; - int returnAdress = 4 * (argumentMicka + 1); - + int returnAdress = 4 * (nbArg + 1); parcours_exp(n->u.retour_.expression); - int iRegistre = 0; sprintf(tmp,"$t%d",iRegistre); depile(tmp); sprintf(exec,"sw %s %d($fp) #Adresse de retour",tmp , returnAdress); printMips(exec); - finFunc(); + finFuncreturn(1); } @@ -354,35 +363,60 @@ void parcours_opExp(n_exp *n) int iRegistre2 = 1; int iRegistre3 = 2; - parcours_exp(n->u.opExp_.op1); - if(n->u.opExp_.op2 != NULL) - parcours_exp(n->u.opExp_.op2); - - sprintf(tmp, "$t%d", iRegistre3); - depile(tmp); - - if(n->u.opExp_.op != non){ - sprintf(tmp, "$t%d", iRegistre2); - depile(tmp); - } if(n->u.opExp_.op == plus) { + parcours_exp(n->u.opExp_.op1); + parcours_exp(n->u.opExp_.op2); + sprintf(tmp, "$t%d", iRegistre3); + depile(tmp); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + sprintf(tmp,"add $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3); printMips(tmp); } else if(n->u.opExp_.op == moins){ + parcours_exp(n->u.opExp_.op1); + parcours_exp(n->u.opExp_.op2); + sprintf(tmp, "$t%d", iRegistre3); + depile(tmp); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + sprintf(tmp,"sub $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3); printMips(tmp); } else if(n->u.opExp_.op == fois) { + parcours_exp(n->u.opExp_.op1); + parcours_exp(n->u.opExp_.op2); + sprintf(tmp, "$t%d", iRegistre3); + depile(tmp); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + sprintf(tmp,"mult $t%d, $t%d", iRegistre2, iRegistre3); printMips(tmp); sprintf(tmp,"mflo $t%d",iRegistre); printMips(tmp); } else if(n->u.opExp_.op == divise) { + parcours_exp(n->u.opExp_.op1); + parcours_exp(n->u.opExp_.op2); + sprintf(tmp, "$t%d", iRegistre3); + depile(tmp); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + sprintf(tmp,"div $t%d, $t%d", iRegistre2, iRegistre3); printMips(tmp); sprintf(tmp,"mflo $t%d",iRegistre); printMips(tmp); } else if(n->u.opExp_.op == egal){ + parcours_exp(n->u.opExp_.op1); + parcours_exp(n->u.opExp_.op2); + + sprintf(tmp, "$t%d", iRegistre3); + depile(tmp); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + char etiquette[256]; new_tag(etiquette); sprintf(tmp,"li $t%d, 1",iRegistre); @@ -394,6 +428,13 @@ void parcours_opExp(n_exp *n) sprintf(tmp,"%s:", etiquette); printMips(tmp); } else if(n->u.opExp_.op == diff) { + parcours_exp(n->u.opExp_.op1); + parcours_exp(n->u.opExp_.op2); + sprintf(tmp, "$t%d", iRegistre3); + depile(tmp); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + char etiquette[256]; new_tag(etiquette); sprintf(tmp,"li $t%d, 0",iRegistre); @@ -405,6 +446,12 @@ void parcours_opExp(n_exp *n) sprintf(tmp,"%s:", etiquette); printMips(tmp); }else if(n->u.opExp_.op == inf){ + parcours_exp(n->u.opExp_.op1); + parcours_exp(n->u.opExp_.op2); + sprintf(tmp, "$t%d", iRegistre3); + depile(tmp); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); char etiquette[256]; new_tag(etiquette); sprintf(tmp,"li $t%d, 1",iRegistre); @@ -416,6 +463,13 @@ void parcours_opExp(n_exp *n) sprintf(tmp,"%s:", etiquette); printMips(tmp); }else if(n->u.opExp_.op == infeg){ + parcours_exp(n->u.opExp_.op1); + parcours_exp(n->u.opExp_.op2); + sprintf(tmp, "$t%d", iRegistre3); + depile(tmp); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + char etiquette[256]; new_tag(etiquette); sprintf(tmp,"li $t%d, 1",iRegistre); @@ -427,15 +481,87 @@ void parcours_opExp(n_exp *n) sprintf(tmp,"%s:", etiquette); printMips(tmp); }else if(n->u.opExp_.op == ou){ - //TODOOOOOOOOOOOOOO - } else if(n->u.opExp_.op == et) { - sprintf(tmp,"and $t%d, $t%d",iRegistre2,iRegistre3); + char faux1[256]; + char faux2[256]; + char vrai[256]; + char empile[256]; + new_tag(faux1); + new_tag(faux2); + new_tag(vrai); + new_tag(empile); + parcours_exp(n->u.opExp_.op1); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + sprintf(tmp,"beq $zero, $t%d, %s",iRegistre2,faux1); printMips(tmp); + sprintf(tmp,"j %s",vrai); + printMips(tmp); + sprintf(tmp,"%s :",faux1); + printMips(tmp); + parcours_exp(n->u.opExp_.op2); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + sprintf(tmp,"beq $zero $t%d %s",iRegistre2,faux2); + sprintf(tmp, "%s :", vrai); + printMips(tmp); + sprintf(tmp,"li $t%d 1",iRegistre); + printMips(tmp); + sprintf(tmp,"j %s",empile); + printMips(tmp); + sprintf(tmp,"%s :",faux2); + printMips(tmp); + sprintf(tmp,"li $t%d 0",iRegistre); + printMips(tmp); + sprintf(tmp,"%s : ", empile); + printMips(tmp); + } else if(n->u.opExp_.op == et) { + char empile[256]; + char faux[256]; + new_tag(empile); + new_tag(faux); + + + parcours_exp(n->u.opExp_.op1); + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + sprintf(tmp,"li $t%d, 1",iRegistre); + printMips(tmp); + sprintf(tmp,"beq $zero, $t%d, %s",iRegistre2,faux); + printMips(tmp); + + parcours_exp(n->u.opExp_.op2); + sprintf(tmp, "$t%d", iRegistre3); + depile(tmp); + sprintf(tmp,"beq $zero, $t%d, %s",iRegistre3,faux); + printMips(tmp); + + sprintf(tmp,"j %s", empile); + printMips(tmp); + + sprintf(tmp," %s :",faux); + printMips(tmp); + sprintf(tmp,"li $t%d 0",iRegistre); + printMips(tmp); + + sprintf(tmp ," %s :",empile); + + printMips(tmp); + } else if(n->u.opExp_.op == non) { - sprintf(tmp,"not $t%d, $t%d",iRegistre,iRegistre3); + parcours_exp(n->u.opExp_.op1); + char fin[256]; + new_tag(fin); + sprintf(tmp, "$t%d", iRegistre3); + depile(tmp); + sprintf(tmp,"li $t%d 0",iRegistre); + printMips(tmp); + sprintf(tmp,"beq $t%d, $zero %s",iRegistre3,fin); + printMips(tmp); + sprintf(tmp,"li $t%d 1",iRegistre); + printMips(tmp); + sprintf(tmp, "%s :",fin); printMips(tmp); } - sprintf(tmp, "$t%d", iRegistre); empile(tmp); } @@ -530,25 +656,29 @@ void parcours_foncDec(n_dec *n) break; j++; } - argumentMicka = j; + nbArg = j; dico.tab[id].complement = j; contexte = C_VARIABLE_LOCALE; parcours_l_dec(n->u.foncDec_.variables); parcours_instr(n->u.foncDec_.corps); - i = rechercheExecutable(n->nom); + i = id; int nbvariableLocale = 0; - while (dico.tab[i+1].classe == C_VARIABLE_LOCALE){ - ++nbvariableLocale; + + while (i+1 < dico.sommet && (dico.tab[i+1].classe == C_VARIABLE_LOCALE + || dico.tab[i+1].classe == C_ARGUMENT)){ + if(dico.tab[i+1].classe == C_VARIABLE_LOCALE) + ++nbvariableLocale; ++i; } + sprintf(tmp,"addi $sp, $sp %d # desallocation variables locales",nbvariableLocale * 4); - //SAm est morte ici + printMips(tmp); - finFunc(); affiche_dico(); sortieFonction(); + finFunc(); } /*-------------------------------------------------------------------------*/ @@ -638,7 +768,6 @@ void parcours_var_simple(n_var *n, char * var) } else if (dico.tab[i].classe == C_ARGUMENT) { int adress = dico.tab[i].adresse; - int nbArg = dico.tab[i - (adress/4) -1].complement; int result = 4 * nbArg - adress; sprintf(var, "%d($fp) #variable argument %s",result,n->nom); } @@ -661,8 +790,10 @@ void parcours_var_indicee(n_var *n, char * var) affiche_dico(); exit(1); } - parcours_exp( n->u.indicee_.indice ); - + depile ("$t4"); + printMips("add $t4,$t4,$t4"); + printMips("add $t4,$t4,$t4"); + sprintf(var,"$%s($t4)",n->nom); } /*-------------------------------------------------------------------------*/