Skip to content
Snippets Groups Projects
Commit f7df5885 authored by FlorianKrull's avatar FlorianKrull
Browse files

Relational operations, removed debug printf from tac_build

parent b8cd191b
No related branches found
No related tags found
No related merge requests found
......@@ -150,6 +150,90 @@ void asm_gen_binary_float_op(FILE *out, struct mcc_tac_entry *te, struct mcc_asm
}
void asm_gen_relation_int_op(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container)
{
//TODO offset from te->arg1 lookup
fprintf(out, "\tmovl\t%d(%%ebp), %%edx\n",
mcc_assembly_get_current_offset(asm_container));
//TODO offset from te->arg2 lookup
fprintf(out, "\tcmpl\t%d(%%ebp), %%edx\n",
mcc_assembly_get_current_offset(asm_container));
switch (te->tac_op)
{
case MCC_TAC_EQ:
fprintf(out, "\tsete\t%%al\n");
break;
case MCC_TAC_GT:
fprintf(out, "\tsetg\t%%al\n");
break;
case MCC_TAC_GTEQ:
fprintf(out, "\tsetge\t%%al\n");
break;
case MCC_TAC_LT:
fprintf(out, "\tsetl\t%%al\n");
break;
case MCC_TAC_LTEQ:
fprintf(out, "\tsetle\t%%al\n");
break;
case MCC_TAC_NEQ:
fprintf(out, "\tsetne\t%%al\n");
break;
default:
fprintf(out,"\tnop\n");
break;
}
fprintf(out, "\tmovzbl\t%%al, %%edx\n");
mcc_assembly_add_offset_variable(asm_container, te);
fprintf(out, "\tmovl\t%%eax, %d(%%ebp)\n", mcc_assembly_get_current_offset(asm_container));
}
void asm_gen_relation_float_op(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container)
{
//TODO offset from te->arg2 lookup
fprintf(out, "\tflds\t%d(%%ebp)\n",
mcc_assembly_get_current_offset(asm_container));
//TODO offset from te->arg1 lookup
fprintf(out, "\tflds\t%d(%%ebp)\n",
mcc_assembly_get_current_offset(asm_container));
fprintf(out, "\tfcomip\t%%st(1), %%st\n");
fprintf(out, "\tfstp\t%%st(0)\n");
switch (te->tac_op)
{
case MCC_TAC_EQ_FLOAT:
fprintf(out, "\tsete\t%%al\n");
break;
case MCC_TAC_GT_FLOAT:
fprintf(out, "\tseta\t%%al\n");
break;
case MCC_TAC_GTEQ_FLOAT:
fprintf(out, "\tsetae\t%%al\n");
break;
case MCC_TAC_LT_FLOAT:
fprintf(out, "\tsetb\t%%al\n");
break;
case MCC_TAC_LTEQ_FLOAT:
fprintf(out, "\tsetbe\t%%al\n");
break;
case MCC_TAC_NEQ_FLOAT:
fprintf(out, "\tsetne\t%%al\n");
break;
default:
fprintf(out,"\tnop\n");
break;
}
fprintf(out, "\tmovzbl\t%%al, %%edx\n");
mcc_assembly_add_offset_variable(asm_container, te);
fprintf(out, "\tmovl\t%%eax, %d(%%ebp)\n", mcc_assembly_get_current_offset(asm_container));
}
void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *asm_container) {
for(int i = 0; i < tac->tac_entries->size; i++) {
......@@ -196,6 +280,23 @@ void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *a
case MCC_TAC_DIV_FLOAT:
asm_gen_binary_float_op(out, entry, asm_container);
break;
case MCC_TAC_EQ:
case MCC_TAC_GT:
case MCC_TAC_GTEQ:
case MCC_TAC_LT:
case MCC_TAC_LTEQ:
case MCC_TAC_NEQ:
asm_gen_relation_int_op(out, entry, asm_container);
break;
case MCC_TAC_EQ_FLOAT:
case MCC_TAC_GT_FLOAT:
case MCC_TAC_GTEQ_FLOAT:
case MCC_TAC_LT_FLOAT:
case MCC_TAC_LTEQ_FLOAT:
case MCC_TAC_NEQ_FLOAT:
asm_gen_relation_float_op(out, entry, asm_container);
break;
// push
case MCC_TAC_PARAM_BOOL:
case MCC_TAC_PARAM_INT:
......
......@@ -126,7 +126,7 @@ void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_
sprintf(arg1, "%ld", array_size);
mcc_tac_create_and_add_new_entry(op, arg1, NULL, NULL, tac);
} else {
printf("%d\n", op);
// printf("%d\n", op);
mcc_tac_create_and_add_new_entry(op, NULL, NULL, NULL, tac);
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment