diff --git a/src/codegen.c b/src/codegen.c index 49748ce..9512929 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -7,6 +7,10 @@ int generate(){ offset = 0; currentsp = 0; Instruction *i = begin; + + // temporary + fprintf(cg_flag, ".globl entry\n"); + while (i != NULL) { switch(getOp(i)) { case E_LABEL: @@ -170,9 +174,8 @@ int generateAdd(Instruction *inst) { printdebug("generateAdd failed, %s is not initialized/in CG", getName(getTN(op2))); return -1; } - fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#addition start\n", getAddress(op1CG)); - fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op2CG)); - fprintf(cg_flag, "\taddl\t%%edx, %%eax\n"); + fprintf(cg_flag, "\n\tmovl\t%d(%%rbp), %%eax\t#addition start\n", getAddress(op1CG)); + fprintf(cg_flag, "\taddl\t%d(%%rbp), %%eax\n", getAddress(op2CG)); fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#addition end\n", getAddress(cg)); return 0; } @@ -629,7 +632,6 @@ int generateCall(Instruction *inst){ fprintf(cg_flag, "\tcall %s\n", getName(getTN(op1))); - fprintf(cg_flag, "\taddq\t$%d, %%rsp\n", 8 + getConst(op1)); //now for the return CGNode *cg = findCG(getResult(inst)); @@ -660,7 +662,7 @@ int generateReturn(Instruction *inst){ } fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#return %s\n", getAddress(cg), getName(getTN(op1))); - fprintf(cg_flag, "\tpopq\t%%rbp\n"); + fprintf(cg_flag, "\tleave\n"); fprintf(cg_flag, "\tret\n"); return 0; } @@ -688,8 +690,7 @@ int generateParam(Instruction *inst){ return -1; } - fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#adding param start\n", getAddress(op1CG)); - fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#adding param end\n", getPrimSize(getTypeEntry(getTN(op1)))); + fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%edi\t#adding param start\n", getAddress(op1CG)); return 0; } @@ -706,6 +707,7 @@ int generateFunctionStart(Instruction *inst) { fprintf(cg_flag, "%s:\n", getName(funDecTN)); fprintf(cg_flag, "\tpushq\t%%rbp\n"); fprintf(cg_flag, "\tmovq\t%%rsp, %%rbp\n"); + fprintf(cg_flag, "\tsubq\t$%d, %%rsp\n", 128); // [CHANGE ME] 128 is a placeholder for the stack size //now we need to add the CGs of nodes to the CG list by doing assign from the // have function declararation node diff --git a/tests/sprint4/test/sp4_cg_add.alpha b/tests/sprint4/test/sp4_cg_add.alpha index 3344ed5..e3da55e 100644 --- a/tests/sprint4/test/sp4_cg_add.alpha +++ b/tests/sprint4/test/sp4_cg_add.alpha @@ -1,12 +1,35 @@ (* TEST: [-asc -tc -cg -ir] *) -type main: string -> integer -function entry: main +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer0: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +function entry: string2integer entry (arg) := { - [integer:x; integer:y] + [integer:x; integer:y; integer: result] y := 1; x := 3; y := x + y; + + result := printInteger(y); + return y; } \ No newline at end of file