mips add
This commit is contained in:
@@ -13,11 +13,11 @@ void depile(char *reg);
|
|||||||
void parcours_table(n_prog *n);
|
void parcours_table(n_prog *n);
|
||||||
void parcours_l_instr(n_l_instr *n);
|
void parcours_l_instr(n_l_instr *n);
|
||||||
void parcours_instr(n_instr *n);
|
void parcours_instr(n_instr *n);
|
||||||
void parcours_instr_si(n_instr *n);
|
void parcours_instr_si(n_instr *n); //A tester
|
||||||
void parcours_instr_tantque(n_instr *n);
|
void parcours_instr_tantque(n_instr *n);//A tester
|
||||||
void parcours_instr_faire(n_instr *n);
|
void parcours_instr_faire(n_instr *n); //Heu quoi sa
|
||||||
void parcours_instr_pour(n_instr *n);
|
void parcours_instr_pour(n_instr *n); //a Tester
|
||||||
void parcours_instr_affect(n_instr *n);
|
void parcours_instr_affect(n_instr *n);//a Tester
|
||||||
void parcours_instr_appel(n_instr *n);
|
void parcours_instr_appel(n_instr *n);
|
||||||
void parcours_instr_retour(n_instr *n);
|
void parcours_instr_retour(n_instr *n);
|
||||||
void parcours_instr_ecrire(n_instr *n); //ok
|
void parcours_instr_ecrire(n_instr *n); //ok
|
||||||
|
|||||||
168
src/parcours.c
168
src/parcours.c
@@ -13,7 +13,8 @@ extern dico_ dico;
|
|||||||
|
|
||||||
int tagindice = 0;
|
int tagindice = 0;
|
||||||
void new_tag(char * tmp){
|
void new_tag(char * tmp){
|
||||||
sprintf(tmp,"a%d\n",tagindice );
|
sprintf(tmp,"e%d",tagindice );
|
||||||
|
++tagindice;
|
||||||
}
|
}
|
||||||
|
|
||||||
void printMips( const char * msg ) {
|
void printMips( const char * msg ) {
|
||||||
@@ -62,6 +63,7 @@ void parcours_table(n_prog *n)
|
|||||||
printMips(".data");
|
printMips(".data");
|
||||||
parcours_l_dec(n->variables);
|
parcours_l_dec(n->variables);
|
||||||
printMips(".text");
|
printMips(".text");
|
||||||
|
printMips("__start:");
|
||||||
printMips("jal main");
|
printMips("jal main");
|
||||||
printMips("li $v0, 10");
|
printMips("li $v0, 10");
|
||||||
printMips("syscall");
|
printMips("syscall");
|
||||||
@@ -107,35 +109,63 @@ void parcours_instr(n_instr *n)
|
|||||||
|
|
||||||
void parcours_instr_si(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);
|
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);
|
parcours_instr(n->u.si_.alors);
|
||||||
|
sprintf(tmp,"j %s",suite);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"%s:",faux);
|
||||||
|
printMips(tmp);
|
||||||
if(n->u.si_.sinon){
|
if(n->u.si_.sinon){
|
||||||
parcours_instr(n->u.si_.sinon);
|
parcours_instr(n->u.si_.sinon);
|
||||||
}
|
}
|
||||||
|
sprintf(tmp,"%s:",suite);
|
||||||
|
printMips(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void parcours_instr_tantque(n_instr *n)
|
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);
|
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);
|
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)
|
void parcours_instr_faire(n_instr *n)
|
||||||
{
|
{
|
||||||
|
|
||||||
parcours_instr(n->u.faire_.faire);
|
parcours_instr(n->u.faire_.faire);
|
||||||
parcours_exp(n->u.faire_.test);
|
parcours_exp(n->u.faire_.test);
|
||||||
}
|
}
|
||||||
@@ -145,9 +175,29 @@ void parcours_instr_faire(n_instr *n)
|
|||||||
void parcours_instr_pour(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];
|
||||||
|
new_tag(fin);
|
||||||
|
sprintf(tmp,"%s:",etiquette);
|
||||||
|
printMips(tmp);
|
||||||
|
|
||||||
parcours_exp(n->u.pour_.test);
|
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_.faire);
|
||||||
|
|
||||||
parcours_instr(n->u.pour_.incr);
|
parcours_instr(n->u.pour_.incr);
|
||||||
|
|
||||||
|
sprintf(tmp,"%s:",fin);
|
||||||
|
printMips(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
@@ -183,11 +233,20 @@ void parcours_appel(n_appel *n)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
int nbArg = parcours_l_exp(n->args);
|
int nbArg = parcours_l_exp(n->args);
|
||||||
|
printMips("subu $sp, $sp, 4");
|
||||||
if(dico.tab[id].complement != nbArg) {
|
if(dico.tab[id].complement != nbArg) {
|
||||||
printf("Nombre Argument différent pour l'appel à %s\n", n->fonction);
|
printf("Nombre Argument différent pour l'appel à %s\n", n->fonction);
|
||||||
affiche_dico();
|
affiche_dico();
|
||||||
exit(1);
|
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)
|
void parcours_instr_retour(n_instr *n)
|
||||||
{
|
{
|
||||||
parcours_exp(n->u.retour_.expression);
|
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(tmp);
|
||||||
printMips("li $v0, 1");
|
printMips("li $v0, 1");
|
||||||
printMips("syscall");
|
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();
|
int iRegistre3 = newReg();
|
||||||
|
|
||||||
parcours_exp(n->u.opExp_.op1);
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
if(n->u.opExp_.op2 != NULL)
|
||||||
parcours_exp(n->u.opExp_.op2);
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
|
||||||
char tmp[256];
|
char tmp[256];
|
||||||
|
|
||||||
sprintf(tmp, "$t%d", iRegistre3);
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
depile(tmp);
|
depile(tmp);
|
||||||
|
if(n->u.opExp_.op != non){
|
||||||
sprintf(tmp, "$t%d", iRegistre2);
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
depile(tmp);
|
depile(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
if(n->u.opExp_.op == plus) {
|
if(n->u.opExp_.op == plus) {
|
||||||
sprintf(tmp,"add $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3);
|
sprintf(tmp,"add $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3);
|
||||||
@@ -282,6 +356,60 @@ void parcours_opExp(n_exp *n)
|
|||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
sprintf(tmp,"mflo $t%d",iRegistre);
|
sprintf(tmp,"mflo $t%d",iRegistre);
|
||||||
printMips(tmp);
|
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);
|
sprintf(tmp, "$t%d", iRegistre);
|
||||||
@@ -406,7 +534,7 @@ void parcours_varDec(n_dec *n)
|
|||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
adresseGlobalCourante += 4;
|
adresseGlobalCourante += 4;
|
||||||
} else if (contexte == C_VARIABLE_LOCALE) {
|
} else if (contexte == C_VARIABLE_LOCALE) {
|
||||||
printMips("subbi $sp, $sp, 4");
|
printMips("subi $sp, $sp, 4");
|
||||||
ajouteIdentificateur(n->nom, contexte, T_ENTIER, adresseLocaleCourante, -1);
|
ajouteIdentificateur(n->nom, contexte, T_ENTIER, adresseLocaleCourante, -1);
|
||||||
adresseLocaleCourante += 4;
|
adresseLocaleCourante += 4;
|
||||||
} else if (contexte == C_ARGUMENT) {
|
} 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) {
|
if(dico.tab[i].classe == C_VARIABLE_GLOBALE) {
|
||||||
sprintf(var, "$%s", n->nom);
|
sprintf(var, "$%s", n->nom);
|
||||||
}
|
}
|
||||||
/*else {
|
else if (dico.tab[i].classe == C_ARGUMENT){
|
||||||
sprintf(var, "%d", n->adresse);
|
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 );
|
parcours_exp( n->u.indicee_.indice );
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
Reference in New Issue
Block a user