Skip to content

Commit de044cc

Browse files
committed
code generation for function calls part 1 of many probably. That's a lot of instructions for a fun call.
1 parent 49bf2dd commit de044cc

File tree

1 file changed

+60
-8
lines changed

1 file changed

+60
-8
lines changed

src/gencode.c

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,14 +1055,66 @@ gencode_funcall(M1_compiler *comp, m1_funcall *f) {
10551055
++comp->errors;
10561056
return;
10571057
}
1058-
reg = gen_reg(comp, VAL_INT);
1059-
fprintf(OUT, "\tset_imm\tI%d, 0, %d\n", reg.no, fun->constindex);
1060-
pmcreg = gen_reg(comp, VAL_CHUNK);
1061-
offsetreg = gen_reg(comp, VAL_INT);
1062-
fprintf(OUT, "\tset_imm\tI%d, 0, %d\n", offsetreg.no, 0);
1063-
fprintf(OUT, "\tderef\tP%d, CONSTS, I%d\n", pmcreg.no, reg.no);
1064-
fprintf(OUT, "\tgoto_chunk\tP%d, I%d, x\n", pmcreg.no, offsetreg.no);
1065-
1058+
1059+
m1_reg cont_offset = gen_reg(comp, VAL_INT);
1060+
m1_reg pc_reg = gen_reg(comp, VAL_INT);
1061+
m1_reg cf_reg = gen_reg(comp, VAL_CHUNK);
1062+
1063+
/* create a new call frame */
1064+
/* alloc_cf: */
1065+
m1_reg sizereg = gen_reg(comp, VAL_INT);
1066+
m1_reg flagsreg = gen_reg(comp, VAL_INT);
1067+
fprintf(OUT, "\tset_imm\tI%d, 8, 0\n", sizereg.no);
1068+
fprintf(OUT, "\tset_imm\tI%d, 0, 0\n", flagsreg.no);
1069+
fprintf(OUT, "\tgc_alloc\tP%d, I%d, I%d\n", cf_reg.no, sizereg.no, flagsreg.no);
1070+
1071+
/* init_cf_copy: */
1072+
m1_reg temp = gen_reg(comp, VAL_INT);
1073+
fprintf(OUT, "\tset_imm\tI%d, 0, INTERP\n", temp.no);
1074+
fprintf(OUT, "\tset_ref\tP%d, I%d, INTERP\n", cf_reg.no, temp.no);
1075+
1076+
fprintf(OUT, "\tset_imm\tI%d, 0, CHUNK\n", temp.no);
1077+
fprintf(OUT, "\tset_ref\tP%d, I%d, CHUNK\n", cf_reg.no, temp.no);
1078+
1079+
fprintf(OUT, "\tset_imm\tI%d, 0, CONSTS\n", temp.no);
1080+
fprintf(OUT, "\tset_ref\tP%d, I%d, CONSTS\n", cf_reg.no, temp.no);
1081+
1082+
fprintf(OUT, "\tset_imm\tI%d, 0, MDS\n", temp.no);
1083+
fprintf(OUT, "\tset_ref\tP%d, I%d, MDS\n", cf_reg.no, temp.no);
1084+
1085+
fprintf(OUT, "\tset_imm\tI%d, 0, BCS\n", temp.no);
1086+
fprintf(OUT, "\tset_ref\tP%d, I%d, BCS\n", cf_reg.no, temp.no);
1087+
1088+
fprintf(OUT, "\tset_imm\tI%d, 0, PCF\n", temp.no);
1089+
fprintf(OUT, "\tset_ref\tP%d, I%d, CF\n", cf_reg.no, temp.no);
1090+
1091+
fprintf(OUT, "\tset_imm\tI%d, 0, CF\n", temp.no);
1092+
fprintf(OUT, "\tset_ref\tP%d, I%d, P%d\n", cf_reg.no, temp.no, cf_reg.no);
1093+
1094+
/* init_cf_zero: */
1095+
m1_reg temp2 = gen_reg(comp, VAL_INT);
1096+
fprintf(OUT, "\tset_imm\tI%d, 0, 0\n", temp.no);
1097+
fprintf(OUT, "\tset_imm\tI%d, 0, EH\n", temp2.no);
1098+
fprintf(OUT, "\tset_ref\tP%d, I%d, I%d\n", cf_reg.no, temp2.no, temp.no);
1099+
1100+
fprintf(OUT, "\tset_imm\tI%d, 0, RETPC\n", temp2.no);
1101+
fprintf(OUT, "\tset_ref\tP%d, I%d, I%d\n", cf_reg.no, temp2.no, temp.no);
1102+
1103+
fprintf(OUT, "\tset_imm\tI%d, 0, SPILLCF\n", temp2.no);
1104+
fprintf(OUT, "\tset_ref\tP%d, I%d, I%d\n", cf_reg.no, temp2.no, temp.no);
1105+
1106+
/* init_cf_retpc: */
1107+
fprintf(OUT, "\tset_imm\tI%d, 0, 10\n", temp.no);
1108+
fprintf(OUT, "\tadd_i\tRETPC, PC, I%d\n", temp.no);
1109+
1110+
/* init_cf_pc */
1111+
fprintf(OUT, "\tset_imm\tI%d, 0, 3\n", cont_offset.no);
1112+
fprintf(OUT, "\tadd_i\tI%d, I%d, PC\n", cont_offset.no, cont_offset.no);
1113+
fprintf(OUT, "\tset_imm\tI%d, 0, PC\n", pc_reg.no);
1114+
fprintf(OUT, "\tset_ref \tP%d, I%d, I%d\n", cf_reg.no, pc_reg.no, cont_offset.no);
1115+
1116+
fprintf(OUT, "\tset\tCF, P%d, x\n", cf_reg.no);
1117+
10661118
}
10671119

10681120

0 commit comments

Comments
 (0)