From 17c6ee7d6f77ea4117303ac396bf893567a75d45 Mon Sep 17 00:00:00 2001 From: sylvain099 Date: Mon, 28 Mar 2016 21:17:20 +0200 Subject: [PATCH] mips add --- header/parcours.h | 10 +-- src/parcours.c | 200 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 172 insertions(+), 38 deletions(-) diff --git a/header/parcours.h b/header/parcours.h index d69ecc7..2b22694 100644 --- a/header/parcours.h +++ b/header/parcours.h @@ -13,11 +13,11 @@ void depile(char *reg); void parcours_table(n_prog *n); void parcours_l_instr(n_l_instr *n); void parcours_instr(n_instr *n); -void parcours_instr_si(n_instr *n); -void parcours_instr_tantque(n_instr *n); -void parcours_instr_faire(n_instr *n); -void parcours_instr_pour(n_instr *n); -void parcours_instr_affect(n_instr *n); +void parcours_instr_si(n_instr *n); //A tester +void parcours_instr_tantque(n_instr *n);//A tester +void parcours_instr_faire(n_instr *n); //Heu quoi sa +void parcours_instr_pour(n_instr *n); //a Tester +void parcours_instr_affect(n_instr *n);//a Tester void parcours_instr_appel(n_instr *n); void parcours_instr_retour(n_instr *n); void parcours_instr_ecrire(n_instr *n); //ok diff --git a/src/parcours.c b/src/parcours.c index 652147c..9fb6224 100644 --- a/src/parcours.c +++ b/src/parcours.c @@ -13,7 +13,8 @@ extern dico_ dico; int tagindice = 0; void new_tag(char * tmp){ - sprintf(tmp,"a%d\n",tagindice ); + sprintf(tmp,"e%d",tagindice ); + ++tagindice; } void printMips( const char * msg ) { @@ -62,6 +63,7 @@ void parcours_table(n_prog *n) printMips(".data"); parcours_l_dec(n->variables); printMips(".text"); + printMips("__start:"); printMips("jal main"); printMips("li $v0, 10"); printMips("syscall"); @@ -107,35 +109,63 @@ void parcours_instr(n_instr *n) void parcours_instr_si(n_instr *n) { - - //TODOOOOOOOOOOOOOOOOOOOOOOOOOO - /*int iRegistre = newReg(); - - char e[250]; - new_tag(&e); - printMips("li $t%d, -1",iRegistre);*/ - parcours_exp(n->u.si_.test); - + int iRegistre = newReg(); + char tmp[250]; + char registre[250]; + 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); } /*-------------------------------------------------------------------------*/ void parcours_instr_tantque(n_instr *n) { + char tmp[256]; + char etiquette[256]; + new_tag(etiquette); + sprintf(tmp,"%s:",etiquette); + printMips(tmp); + + char fin[256]; + new_tag(fin); parcours_exp(n->u.tantque_.test); + int iRegistre = newReg(); + + char registre[250]; + 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); + printMips(tmp); + } /*-------------------------------------------------------------------------*/ void parcours_instr_faire(n_instr *n) -{ +{ + parcours_instr(n->u.faire_.faire); parcours_exp(n->u.faire_.test); } @@ -145,9 +175,29 @@ void parcours_instr_faire(n_instr *n) void parcours_instr_pour(n_instr *n) { parcours_instr(n->u.pour_.init); + char tmp[250]; + + char etiquette[256]; + new_tag(etiquette); + char fin[256]; + new_tag(fin); + sprintf(tmp,"%s:",etiquette); + printMips(tmp); + parcours_exp(n->u.pour_.test); + + int iRegistre = newReg(); + char registre[250]; + sprintf(registre,"$t%d",iRegistre); + depile(registre); + sprintf(tmp,"beq %s $0 %s", registre,fin); + printMips(tmp); parcours_instr(n->u.pour_.faire); + parcours_instr(n->u.pour_.incr); + + sprintf(tmp,"%s:",fin); + printMips(tmp); } /*-------------------------------------------------------------------------*/ @@ -183,11 +233,20 @@ void parcours_appel(n_appel *n) exit(1); } 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"); + --i; + } + sprintf(tmp,"jal %s",n->fonction); + printMips(tmp); } /*-------------------------------------------------------------------------*/ @@ -195,6 +254,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]; + 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(); } /*-------------------------------------------------------------------------*/ @@ -210,6 +279,9 @@ void parcours_instr_ecrire(n_instr *n) printMips(tmp); printMips("li $v0, 1"); printMips("syscall"); + printMips("li $a0, '\\n'"); + printMips("li $v0, 11"); + printMips("syscall"); } /*-------------------------------------------------------------------------*/ @@ -256,15 +328,17 @@ void parcours_opExp(n_exp *n) int iRegistre3 = newReg(); parcours_exp(n->u.opExp_.op1); - parcours_exp(n->u.opExp_.op2); + if(n->u.opExp_.op2 != NULL) + parcours_exp(n->u.opExp_.op2); char tmp[256]; sprintf(tmp, "$t%d", iRegistre3); depile(tmp); - sprintf(tmp, "$t%d", iRegistre2); - depile(tmp); - + if(n->u.opExp_.op != non){ + sprintf(tmp, "$t%d", iRegistre2); + depile(tmp); + } if(n->u.opExp_.op == plus) { sprintf(tmp,"add $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3); @@ -273,19 +347,73 @@ 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); - } + 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); - sprintf(tmp, "$t%d", iRegistre); - empile(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); } /*-------------------------------- -----------------------------------------*/ @@ -406,7 +534,7 @@ void parcours_varDec(n_dec *n) printMips(tmp); adresseGlobalCourante += 4; } else if (contexte == C_VARIABLE_LOCALE) { - printMips("subbi $sp, $sp, 4"); + printMips("subi $sp, $sp, 4"); ajouteIdentificateur(n->nom, contexte, T_ENTIER, adresseLocaleCourante, -1); adresseLocaleCourante += 4; } else if (contexte == C_ARGUMENT) { @@ -474,9 +602,16 @@ void parcours_var_simple(n_var *n, char * var) if(dico.tab[i].classe == C_VARIABLE_GLOBALE) { sprintf(var, "$%s", n->nom); } - /*else { - sprintf(var, "%d", n->adresse); - }*/ + 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)", result); + } + else if (dico.tab[i].classe == C_VARIABLE_LOCALE){ + int adresse = -1 *(8 - dico.tab[i].adresse); + sprintf(var, "%d($fp)", adresse); + } } /*-------------------------------------------------------------------------*/ @@ -496,4 +631,3 @@ void parcours_var_indicee(n_var *n, char * var) parcours_exp( n->u.indicee_.indice ); } /*-------------------------------------------------------------------------*/ - \ No newline at end of file