test prof reussi enfin je crois
This commit is contained in:
197
src/parcours.c
197
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);
|
||||
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){
|
||||
|
||||
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);
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
Reference in New Issue
Block a user