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

Added binary int

parent 3f0248b3
No related branches found
No related tags found
No related merge requests found
......@@ -12,6 +12,7 @@ struct mcc_assembly_offset {
struct mcc_asm_gen_container {
Dynamic_Array *variable_offsets;
int labelCounter;
};
/*enum mcc_asm_contant_type {MCC_ASM_CONST_FLOAT, MCC_ASM_CONST_STRING};
......
......@@ -19,13 +19,20 @@ void mcc_assembly_add_offset_variable(struct mcc_asm_gen_container *ac, struct m
struct mcc_assembly_offset *next_entry = malloc(sizeof(*next_entry));
next_entry -> temporary = te -> result;
switch (te -> tac_op) {
case MCC_TAC_INT:
next_entry -> offset = current_offset - 4;
default:
break;
}
next_entry -> offset = current_offset - 4;
// switch (te -> tac_op) {
// case MCC_TAC_INT:
// next_entry -> offset = current_offset - 4;
// case MCC_TAC_STRING:
// next_entry->offset = current_offset - 4;
// case MCC_TAC_FLOAT:
// next_entry->offset = current_offset - 4;
// case MCC_TAC_BOOL:
// next_entry->offset = current_offset - 4;
// default:
// break;
// }
mcc_add_to_array(ac -> variable_offsets, next_entry);
}
\ No newline at end of file
......@@ -40,7 +40,12 @@ void asm_gen_function_end_with_return(FILE *out, struct mcc_tac_entry *te, struc
struct mcc_assembly_offset *ao = find_var(te -> arg1, asm_container);
if (ao != NULL) {
fprintf(out, "\tmovl\t%d(%%ebp), %%eax\n", ao -> offset);
if(te->tac_op == MCC_TAC_FLOAT){
fprintf(out, "\tflds\t%d(%%ebp)\n", ao -> offset);
}else{
fprintf(out, "\tmovl\t%d(%%ebp), %%eax\n", ao -> offset);
}
} else {
fprintf(out, "\tnop\n");
}
......@@ -55,6 +60,50 @@ void asm_gen_assignment_int(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_
fprintf(out, "\tmovl\t$%s, %d(%%ebp)\n", te -> arg1, mcc_assembly_get_current_offset(asm_container));
}
void asm_gen_assignment_bool(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container) {
mcc_assembly_add_offset_variable(asm_container, te);
if(strcmp("TRUE",te->arg1) == 0){
fprintf(out, "\tmovl $1, \t%d(%%ebp)\n", te -> arg1, mcc_assembly_get_current_offset(asm_container));
}else {
fprintf(out, "\tmovl $0, \t%d(%%ebp)\n", te -> arg1, mcc_assembly_get_current_offset(asm_container));
}
}
void asm_gen_assignment_string(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container) {
mcc_assembly_add_offset_variable(asm_container, te);
te->arg1[strlen(te->arg1) - 2] = '\0';
fprintf(out, "\t__LCD%d:\n", asm_container->labelCounter);
fprintf(out, "\t .string \"%s\"\n", te->arg1 + 2);
fprintf(out, "\tmovl\t$.LC%d, %d(%%ebp)\n", asm_container->labelCounter++, mcc_assembly_get_current_offset(asm_container));
}
void asm_gen_binary_int_op(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container)
{
fprintf(out, "\tmovl\t%d(%%ebp), %%eax\n", mcc_assembly_get_current_offset(asm_container));
switch (te->tac_op)
{
case MCC_TAC_PLUS_INT:
fprintf(out, "\taddl\t%d(%%ebp), %%eax\n", mcc_assembly_get_current_offset(asm_container));
break;
case MCC_TAC_MINUS_INT_BIN:
fprintf(out, "\tsubl\t%d(%%ebp), %%eax\n",mcc_assembly_get_current_offset(asm_container));
break;
case MCC_TAC_MUL_INT:
fprintf(out, "\timull\t%d(%%ebp), %%eax\n", mcc_assembly_get_current_offset(asm_container));
break;
case MCC_TAC_DIV_INT:
fprintf(out, "\tcltd\n");
fprintf(out, "\tidivl\t%d(%%ebp)\n", mcc_assembly_get_current_offset(asm_container));
break;
default:
fprintf(out,"\tnop\n");
break;
}
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++) {
......@@ -66,6 +115,9 @@ void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *a
break;
case MCC_TAC_FUNCTION_END:
asm_gen_function_end_no_return(out);
break;
case MCC_TAC_CALL:
break;
case MCC_TAC_RETURN:
asm_gen_function_end_with_return(out, entry, asm_container);
......@@ -73,6 +125,16 @@ void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *a
case MCC_TAC_INT:
asm_gen_assignment_int(out, entry, asm_container);
break;
case MCC_TAC_STRING:
asm_gen_assignment_string(out, entry, asm_container);
case MCC_TAC_BOOL:
asm_gen_assignment_bool(out, entry, asm_container);
case MCC_TAC_PLUS_INT:
case MCC_TAC_MINUS_INT_BIN:
case MCC_TAC_MUL_INT:
case MCC_TAC_DIV_INT:
asm_gen_binary_int_op(out, entry, asm_container);
break;
}
}
}
......@@ -81,6 +143,7 @@ int mcc_asm_gen_creator(FILE *out, struct mcc_tac *tac, struct mcc_symbol_table
struct mcc_asm_gen_container *ac = malloc(sizeof(*ac));
ac -> variable_offsets = mcc_create_dynamic_array(20);
ac->labelCounter = 0;
mcc_asm_gen(out, tac, ac);
......@@ -89,6 +152,8 @@ int mcc_asm_gen_creator(FILE *out, struct mcc_tac *tac, struct mcc_symbol_table
}
/*int mcc_compute_stack(int variable_size)
{
int stack_size = variable_size * VARIABLE_SIZE;
......
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