test prof reussi enfin je crois

This commit is contained in:
sylvain099
2016-04-03 20:00:42 +02:00
parent 0648a4006f
commit 73bbcc766d

View File

@@ -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);
}
/*-------------------------------------------------------------------------*/