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

Store and load

parent f3b7533e
No related branches found
No related tags found
No related merge requests found
......@@ -254,6 +254,48 @@ void asm_gen_param_pop_array(FILE *out, struct mcc_tac_entry *te, struct mcc_asm
mcc_assembly_add_offset_variable(asm_container, te);
}
void asm_gen_load(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container)
{
struct mcc_assembly_offset *arg1_offset = find_var(te -> arg1, asm_container);
struct mcc_assembly_offset *arg2_offset = find_var(te -> arg2, asm_container);
fprintf(out, "\tmovl\t%d(%%ebp), %%edx\n", arg1_offset->offset);
fprintf(out, "\tmovl\t%d(%%ebp), %%ecx\n", arg1_offset->offset);
fprintf(out, "\tmovl\t0(%%ecx, %%edx, %d), %%eax\n", 4);
}
void asm_gen_load_float(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container)
{
struct mcc_assembly_offset *arg1_offset = find_var(te -> arg1, asm_container);
struct mcc_assembly_offset *arg2_offset = find_var(te -> arg2, asm_container);
fprintf(out, "\tmovl\t%d(%%ebp), %%edx\n", arg1_offset->offset);
fprintf(out, "\tmovl\t%d(%%ebp), %%ecx\n", arg2_offset->offset);
fprintf(out, "\tflds\t%d(%%ebp, %%edx, %d)\n", arg1_offset->offset, 8);
}
void asm_gen_store(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container)
{
struct mcc_assembly_offset *arg1_offset = find_var(te -> arg1, asm_container);
struct mcc_assembly_offset *arg2_offset = find_var(te -> arg2, asm_container);
fprintf(out, "\tmovl\t%d(%%ebp), %%eax\n", arg1_offset->offset);
fprintf(out, "\tmovl\t%d(%%ebp), %%edx\n", arg2_offset->offset);
fprintf(out, "\tmovl\t%d(%%ebp), %%ecx\n", mcc_assembly_get_current_offset(asm_container));
fprintf(out, "\tmovl\t%%eax, 0(%%ecx, %%edx, %d)\n", 4);
}
void asm_gen_store_float(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container)
{
struct mcc_assembly_offset *arg1_offset = find_var(te -> arg1, asm_container);
struct mcc_assembly_offset *arg2_offset = find_var(te -> arg2, asm_container);
fprintf(out, "\tflds\t%d(%%ebp)\n", arg1_offset->offset);
fprintf(out, "\tmovl\t%d(%%ebp), %%edx\n", arg2_offset->offset);
fprintf(out, "\tmovl\t%d(%%ebp), %%ecx\n", mcc_assembly_get_current_offset(asm_container));
fprintf(out, "\tfstps\t0(%%ecx, %%edx, %d)\n", 8);
}
void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *asm_container) {
fprintf(out, ".text\n");
......@@ -357,6 +399,26 @@ void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *a
// set stack offset size of pointer * elements
break;
//load
case MCC_TAC_LOAD_BOOL:
case MCC_TAC_LOAD_INT:
case MCC_TAC_LOAD_STRING:
asm_gen_load(out, entry, asm_container);
break;
case MCC_TAC_LOAD_FLOAT:
asm_gen_load_float(out, entry, asm_container);
break;
//store
case MCC_TAC_STORE_BOOL:
case MCC_TAC_STORE_INT:
case MCC_TAC_STORE_STRING:
asm_gen_store(out, entry, asm_container);
break;
case MCC_TAC_STORE_FLOAT:
asm_gen_store_float(out, entry, asm_container);
break;
}
}
}
......
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