diff --git a/src/parcours.c b/src/parcours.c index 5a87358..ff2377c 100644 --- a/src/parcours.c +++ b/src/parcours.c @@ -44,7 +44,7 @@ void finFunc() { void empile(char *reg) { if(afficheMips) { - printf("subu $sp, $sp, 4\n"); + printf("subi $sp, $sp, 4\n"); printf("sw %s, 0($sp)\n", reg); } } @@ -52,7 +52,7 @@ void empile(char *reg) { void depile(char *reg) { if(afficheMips) { 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) { parcours_exp(n->u.si_.test); - int iRegistre = newReg(); + int iRegistre = 0; char tmp[250]; char registre[250]; + char faux[256]; + char suite[256]; + + new_tag(faux); + new_tag(suite); + sprintf(registre,"$t%d",iRegistre); depile(registre); - char faux[256]; - new_tag(faux); - char suite[256]; - new_tag(suite); + sprintf(tmp,"beq %s $0 %s", registre,faux); printMips(tmp); + parcours_instr(n->u.si_.alors); + sprintf(tmp,"j %s",suite); printMips(tmp); + sprintf(tmp,"%s:",faux); printMips(tmp); + if(n->u.si_.sinon){ parcours_instr(n->u.si_.sinon); } + sprintf(tmp,"%s:",suite); printMips(tmp); } @@ -139,21 +147,25 @@ void parcours_instr_tantque(n_instr *n) { char tmp[256]; char etiquette[256]; + char fin[256]; + char registre[250]; + new_tag(etiquette); + new_tag(fin); + sprintf(tmp,"%s:",etiquette); printMips(tmp); - char fin[256]; - new_tag(fin); parcours_exp(n->u.tantque_.test); - int iRegistre = newReg(); - - char registre[250]; + + int iRegistre = 0; sprintf(registre,"$t%d",iRegistre); depile(registre); sprintf(tmp,"beq %s $0 %s", registre,fin); printMips(tmp); + parcours_instr(n->u.tantque_.faire); + sprintf(tmp,"j %s",etiquette); printMips(tmp); sprintf(tmp,"%s:",fin); @@ -174,26 +186,27 @@ void parcours_instr_faire(n_instr *n) void parcours_instr_pour(n_instr *n) { - parcours_instr(n->u.pour_.init); + parcours_instr(n->u.pour_.init); char tmp[250]; - char etiquette[256]; - new_tag(etiquette); char fin[256]; + char registre[250]; + + new_tag(etiquette); new_tag(fin); + sprintf(tmp,"%s:",etiquette); printMips(tmp); parcours_exp(n->u.pour_.test); - int iRegistre = newReg(); - char registre[250]; + int iRegistre = 0; sprintf(registre,"$t%d",iRegistre); depile(registre); - sprintf(tmp,"beq %s $0 %s", registre,fin); + sprintf(tmp,"beq %s $zero %s", registre, fin); printMips(tmp); + parcours_instr(n->u.pour_.faire); - parcours_instr(n->u.pour_.incr); sprintf(tmp,"%s:",fin); @@ -205,14 +218,16 @@ void parcours_instr_pour(n_instr *n) void parcours_instr_affect(n_instr *n) { char var[256]; - parcours_var(n->u.affecte_.var,&var); - parcours_exp(n->u.affecte_.exp); - int iRegistre = newReg(); char tmp[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); depile(registre); - sprintf(tmp,"sw $t%d, %s ",iRegistre, var); + sprintf(tmp,"sw %s, %s",registre, var); printMips(tmp); } @@ -226,25 +241,32 @@ void parcours_instr_appel(n_instr *n) void parcours_appel(n_appel *n) { + char tmp[250]; + int id = rechercheExecutable(n->fonction); if(id < 0) { printf("Fonction %s introuvable\n", n->fonction); affiche_dico(); exit(1); } + + printMips("subu $sp, $sp, 4 #Val Retour"); + int nbArg = parcours_l_exp(n->args); - printMips("subu $sp, $sp, 4"); + + if(dico.tab[id].complement != nbArg) { printf("Nombre Argument différent pour l'appel à %s\n", n->fonction); affiche_dico(); exit(1); } - char tmp[250]; - int i = nbArg; - while(i < 1){ - printMips("subu $sp, $sp, 4"); + + /*int i = nbArg; + while(i > 0){ + printMips("subu $sp, $sp, 4 #Val Argument"); --i; - } + } */ + sprintf(tmp,"jal %s",n->fonction); printMips(tmp); } @@ -253,14 +275,16 @@ void parcours_appel(n_appel *n) void parcours_instr_retour(n_instr *n) { - parcours_exp(n->u.retour_.expression); - int iRegistre; 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); depile(tmp); - int nbArg = 2; ///TO DOOOOOOOOOOO - int returnAdress = 4 * (nbArg + 1); - char exec[250]; sprintf(exec,"sw %s %d($fp) ",tmp , returnAdress); printMips(exec); finFunc(); @@ -270,9 +294,10 @@ void parcours_instr_retour(n_instr *n) void parcours_instr_ecrire(n_instr *n) { parcours_exp(n->u.ecrire_.expression); + char tmp[250]; - int iRegistre; - iRegistre = newReg(); + int iRegistre = 0; + sprintf(tmp,"$t%d",iRegistre); depile(tmp); sprintf(tmp, "move $a0, $t%d",iRegistre); @@ -311,9 +336,11 @@ void parcours_exp(n_exp *n) void parcours_varExp(n_exp *n) { char var[256]; - parcours_var(n->u.var, &var); - char tmp[256]; - int iRegistre = newReg(); + char tmp[256]; + + parcours_var(n->u.var, var); + + int iRegistre = 0; sprintf(tmp, "lw $t%d, %s", iRegistre, var); printMips(tmp); sprintf(tmp, "$t%d", iRegistre); @@ -323,18 +350,19 @@ void parcours_varExp(n_exp *n) /*-------------------------------------------------------------------------*/ void parcours_opExp(n_exp *n) { - int iRegistre = newReg(); - int iRegistre2 = newReg(); - int iRegistre3 = newReg(); + char tmp[256]; + + int iRegistre = 0; + int iRegistre2 = 1; + int iRegistre3 = 2; parcours_exp(n->u.opExp_.op1); if(n->u.opExp_.op2 != NULL) parcours_exp(n->u.opExp_.op2); - char tmp[256]; - sprintf(tmp, "$t%d", iRegistre3); depile(tmp); + if(n->u.opExp_.op != non){ sprintf(tmp, "$t%d", iRegistre2); depile(tmp); @@ -347,80 +375,78 @@ void parcours_opExp(n_exp *n) sprintf(tmp,"sub $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3); printMips(tmp); } else if(n->u.opExp_.op == fois) { - 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) { - 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){ - char etiquette[256]; - new_tag(etiquette); - sprintf(tmp,"li $t%d, 1",iRegistre); - printMips(tmp); - sprintf(tmp,"beq $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); - printMips(tmp); - sprintf(tmp,"li $t%d, 0",iRegistre); - printMips(tmp); - sprintf(tmp,"%s:", etiquette); - printMips(tmp); - -} else if(n->u.opExp_.op == diff) { - char etiquette[256]; - new_tag(etiquette); - sprintf(tmp,"li $t%d, 0",iRegistre); - printMips(tmp); - sprintf(tmp,"beq $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); - printMips(tmp); - sprintf(tmp,"li $t%d, 1",iRegistre); - printMips(tmp); - sprintf(tmp,"%s:", etiquette); - printMips(tmp); -}else if(n->u.opExp_.op == inf){ - char etiquette[256]; - new_tag(etiquette); - sprintf(tmp,"li $t%d, 1",iRegistre); - printMips(tmp); - sprintf(tmp,"blt $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); - printMips(tmp); - sprintf(tmp,"li $t%d, 0",iRegistre); - printMips(tmp); - sprintf(tmp,"%s:", etiquette); - printMips(tmp); -}else if(n->u.opExp_.op == infeg){ - char etiquette[256]; - new_tag(etiquette); - sprintf(tmp,"li $t%d, 1",iRegistre); - printMips(tmp); - sprintf(tmp,"ble $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); - printMips(tmp); - sprintf(tmp,"li $t%d, 0",iRegistre); - printMips(tmp); - 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); - printMips(tmp); -} else if(n->u.opExp_.op == non) { + 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) { + 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){ + char etiquette[256]; + new_tag(etiquette); + sprintf(tmp,"li $t%d, 1",iRegistre); + printMips(tmp); + sprintf(tmp,"beq $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); + printMips(tmp); + sprintf(tmp,"li $t%d, 0",iRegistre); + printMips(tmp); + sprintf(tmp,"%s:", etiquette); + printMips(tmp); + } else if(n->u.opExp_.op == diff) { + char etiquette[256]; + new_tag(etiquette); + sprintf(tmp,"li $t%d, 0",iRegistre); + printMips(tmp); + sprintf(tmp,"beq $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); + printMips(tmp); + sprintf(tmp,"li $t%d, 1",iRegistre); + printMips(tmp); + sprintf(tmp,"%s:", etiquette); + printMips(tmp); + }else if(n->u.opExp_.op == inf){ + char etiquette[256]; + new_tag(etiquette); + sprintf(tmp,"li $t%d, 1",iRegistre); + printMips(tmp); + sprintf(tmp,"blt $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); + printMips(tmp); + sprintf(tmp,"li $t%d, 0",iRegistre); + printMips(tmp); + sprintf(tmp,"%s:", etiquette); + printMips(tmp); + }else if(n->u.opExp_.op == infeg){ + char etiquette[256]; + new_tag(etiquette); + sprintf(tmp,"li $t%d, 1",iRegistre); + printMips(tmp); + sprintf(tmp,"ble $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); + printMips(tmp); + sprintf(tmp,"li $t%d, 0",iRegistre); + printMips(tmp); + 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); + printMips(tmp); + } else if(n->u.opExp_.op == non) { sprintf(tmp,"not $t%d, $t%d",iRegistre,iRegistre3); printMips(tmp); -} + } -sprintf(tmp, "$t%d", iRegistre); -empile(tmp); + sprintf(tmp, "$t%d", iRegistre); + empile(tmp); } /*-------------------------------- -----------------------------------------*/ void parcours_intExp(n_exp *n) { - int iRegistre = newReg(); + int iRegistre = 0; char tmp[256]; 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("syscall"); - int iRegistre = newReg(); + int iRegistre = 0; char tmp[256]; sprintf(tmp, "move $t%d, $v0", iRegistre); @@ -530,7 +556,7 @@ void parcours_varDec(n_dec *n) if (contexte == C_VARIABLE_GLOBALE) { ajouteIdentificateur(n->nom, contexte, T_ENTIER, adresseGlobalCourante, -1); char tmp[250]; - sprintf(tmp, "$%s: .word", n->nom); + sprintf(tmp, "$%s: .space 4", n->nom); printMips(tmp); adresseGlobalCourante += 4; } 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) { 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 nbArg = dico.tab[i - (adress/4) -1].complement; - int result = (4 * nbArg + adress); + int result = (4 * nbArg - adress); + sprintf(var, "%d($fp)", result); } 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); } }