FUNCTION CALLS WORK WITH 6+ ENTRIES YIPPEEgit add .
This commit is contained in:
@ -2,7 +2,7 @@
|
||||
/* The Translators - Spring 2025 */
|
||||
|
||||
#include "codegen.h"
|
||||
|
||||
int paramCount = 0;
|
||||
int generate() {
|
||||
offset = 0;
|
||||
currentsp = 0;
|
||||
@ -603,6 +603,7 @@ int generateEqualTo(Instruction *inst) {
|
||||
return 0;
|
||||
}
|
||||
int generateCall(Instruction *inst) {
|
||||
paramCount = 0;
|
||||
TNodeOrConst *op1 = getOperand1(inst);
|
||||
TNodeOrConst *op2 = getOperand2(inst);
|
||||
if (op1 == NULL) {
|
||||
@ -670,7 +671,7 @@ int generateAddressOf(Instruction *inst) {
|
||||
|
||||
int generateParam(Instruction *inst) {
|
||||
TNodeOrConst *op1 = getOperand1(inst);
|
||||
|
||||
fprintf(stderr, "generate param reached\n");
|
||||
if (op1 == NULL) {
|
||||
printdebug("generateParam failed, NULL operand");
|
||||
return -1;
|
||||
@ -681,8 +682,31 @@ int generateParam(Instruction *inst) {
|
||||
printdebug("generateParam failed, %s is not in CGlist", getName(getTN(op1)));
|
||||
return -1;
|
||||
}
|
||||
|
||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%edi\t#adding param start\n", getAddress(op1CG));
|
||||
paramCount += 1;
|
||||
switch(paramCount) {
|
||||
case 1:
|
||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG1);
|
||||
break;
|
||||
case 2:
|
||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG2);
|
||||
break;
|
||||
case 3:
|
||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG3);
|
||||
break;
|
||||
case 4:
|
||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG4);
|
||||
break;
|
||||
case 5:
|
||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG5);
|
||||
break;
|
||||
case 6:
|
||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG6);
|
||||
break;
|
||||
default:
|
||||
offset += getPrimSize(getTypeEntry(getTN(op1)));
|
||||
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", offset - getPrimSize(getTypeEntry(getTN(op1))));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -712,16 +736,40 @@ int generateFunctionStart(Instruction *inst) {
|
||||
int paramOffset = 16;
|
||||
TableNode *tnToAdd = getFirstEntry(st);
|
||||
if (getAdInfoType(paramTN) != TYPE_RECORD_TYPE) {
|
||||
CGNode *paramCG = addCG(tnToAdd, offset);
|
||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#FunctionStart1Param start\n", paramOffset);
|
||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG));
|
||||
CGNode *paramCG = addCG(tnToAdd, offset);
|
||||
paramOffset += getPrimSize(tnToAdd);
|
||||
fprintf(cg_flag, "\tmovl\t%%edi, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG));
|
||||
} else {
|
||||
int numParams = getRecLength(paramTN);
|
||||
for (int i = 0; i < numParams; i++) {
|
||||
for (int i = numParams; i > 0; i--) {
|
||||
CGNode *paramCG = addCG(tnToAdd, offset);
|
||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#FunctionStart1Param start\n", paramOffset);
|
||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG));
|
||||
paramOffset = getPrimSize(getTypeEntry(tnToAdd));
|
||||
switch(i) {
|
||||
case 1:
|
||||
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG1, getAddress(paramCG));
|
||||
break;
|
||||
case 2:
|
||||
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG2, getAddress(paramCG));
|
||||
break;
|
||||
case 3:
|
||||
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG3, getAddress(paramCG));
|
||||
break;
|
||||
case 4:
|
||||
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG4, getAddress(paramCG));
|
||||
break;
|
||||
case 5:
|
||||
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG5, getAddress(paramCG));
|
||||
break;
|
||||
case 6:
|
||||
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG6, getAddress(paramCG));
|
||||
break;
|
||||
default:
|
||||
paramOffset += getPrimSize(getTypeEntry(tnToAdd));
|
||||
offset += getPrimSize(getTypeEntry(tnToAdd));
|
||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#FunctionStart1Param start\n", paramOffset);
|
||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG));
|
||||
|
||||
}
|
||||
|
||||
tnToAdd = getNextEntry(tnToAdd);
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,13 @@
|
||||
#include "intermediate_code.h"
|
||||
#include "symbol_table.h"
|
||||
|
||||
#define REG1 "%edi"
|
||||
#define REG2 "%esi"
|
||||
#define REG3 "%edx"
|
||||
#define REG4 "%ecx"
|
||||
#define REG5 "%r8d"
|
||||
#define REG6 "%r9d"
|
||||
|
||||
extern FILE *cg_flag;
|
||||
|
||||
typedef struct CGNode {
|
||||
|
34
tests/sprint4/test/sp4_cg_calls.alpha
Normal file
34
tests/sprint4/test/sp4_cg_calls.alpha
Normal file
@ -0,0 +1,34 @@
|
||||
(* TEST: [-asc -tc -cg -ir] *)
|
||||
|
||||
#include "std.alpha"
|
||||
(* Standard Alpha Library - Provided by Carl *)
|
||||
|
||||
type string: 1 -> character
|
||||
function entry: string2integer
|
||||
|
||||
|
||||
type rec: [integer: x; integer: y; integer: z; integer: a; integer: b; integer: c; integer: d]
|
||||
|
||||
type T2: rec -> integer
|
||||
type T: integer -> integer
|
||||
type main: string -> integer
|
||||
function entry: main
|
||||
function bar: T2
|
||||
function ahh: T
|
||||
|
||||
ahh (a) := {
|
||||
a := printInteger(a);
|
||||
return -1;
|
||||
}
|
||||
|
||||
bar (a, b, c,d,e,f,g) := {
|
||||
a := printInteger(g);
|
||||
return b;
|
||||
}
|
||||
|
||||
entry (arg) := {
|
||||
[integer:x; integer:y; integer: result]
|
||||
|
||||
result := bar(1,2,3,4,5,6,7);
|
||||
return 1;
|
||||
}
|
34
tests/sprint4/test/sp4_cg_calls.alpha~
Normal file
34
tests/sprint4/test/sp4_cg_calls.alpha~
Normal file
@ -0,0 +1,34 @@
|
||||
(* TEST: [-asc -tc -cg -ir] *)
|
||||
|
||||
#include "std.alpha"
|
||||
(* Standard Alpha Library - Provided by Carl *)
|
||||
|
||||
type string: 1 -> character
|
||||
function entry: string2integer
|
||||
|
||||
|
||||
type rec: [integer: x; integer: y; integer: z; integer: a; integer: b; integer: c; integer: d]
|
||||
|
||||
type T2: rec -> integer
|
||||
type T: integer -> integer
|
||||
type main: string -> integer
|
||||
function entry: main
|
||||
function bar: T2
|
||||
function ahh: T
|
||||
|
||||
ahh (a) := {
|
||||
a := printInteger(a);
|
||||
return -1;
|
||||
}
|
||||
|
||||
bar (a, b, c,d,e,f,g) := {
|
||||
a := printInteger(f);
|
||||
return b;
|
||||
}
|
||||
|
||||
entry (arg) := {
|
||||
[integer:x; integer:y; integer: result]
|
||||
|
||||
result := bar(1,2,3,4,5,6,7);
|
||||
return 1;
|
||||
}
|
Reference in New Issue
Block a user