@@ -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