Beispiel #1
0
Temp_map F_TempMap() {
  static Temp_map m = NULL;

  if (!m) {
    m = Temp_empty();
    Temp_enter(m, F_FP(), "fp");
    Temp_enter(m, F_SP(), "sp");
    Temp_enter(m, F_RV(), "rv");
    Temp_enter(m, F_ZERO(), "zf");

    Temp_tempList args = F_ARGS();
    Temp_tempList callee = F_CALLEE();
    Temp_tempList caller = F_CALLER();
    string buf[10];
    for (int i=0; args; args = args->tail, i++) {
      sprintf(buf, "args%d", i);
      Temp_enter(m, args, "");
    }

    for (int i=0; callee; callee = callee->tail, i++) {
      sprintf(buf, "callee%d", i);
      Temp_enter(m, args, "");
    }

    for (int i=0; caller; caller = caller->tail, i++) {
      sprintf(buf, "caller%d", i);
      Temp_enter(m, args, "");
    }
  }

  return Temp_layerMap(m, Temp_name());
}
Beispiel #2
0
static void F_add_to_map(string str, Temp_temp temp)
{
	if (!F_tempMap) {
		F_tempMap = Temp_name();
	}
	Temp_enter(F_tempMap, temp, str);
}
Temp_temp Temp_newtemp(void)
{Temp_temp p = (Temp_temp) checked_malloc(sizeof (*p));
 p->num=temps++;
 {char r[16];
  sprintf(r, "%d", p->num);
  Temp_enter(Temp_name(), p, String(r));
 }
 return p;
}
T_exp T_Temp(Temp_temp temp)
{
	T_exp p = (T_exp) checked_malloc(sizeof *p);

	p->kind=T_TEMP;

	p->PrintMyNodeSerialNumber = serial_node_number++;

	sprintf(p->PrintTheKindOfTreeIAm,"TEMP %s",Temp_look(Temp_name(),temp));
	
	p->u.TEMP=temp;
	
	return p;
}
T_exp T_JumpRegister(Temp_temp temp)
{
	T_exp p = (T_exp) checked_malloc(sizeof *p);
 
	p->kind=T_JUMP;
 
	p->PrintMyNodeSerialNumber = serial_node_number++;

	sprintf(p->PrintTheKindOfTreeIAm,"JUMP %s",Temp_look(Temp_name(),temp));

	p->u.JUMP.type = T_JUMP_REGISTER;
	p->u.JUMP.u.temp=temp;
 
	return p;
}
Beispiel #6
0
void show_instr(void * i) 
{
	AS_instr instr = (AS_instr) i;
	assert(F_tempMap);
	assert(instr);

	/*switch (instr->kind) {
		case I_OPER: puts(instr->u.OPER.assem); break;
		case I_LABEL: puts(instr->u.LABEL.assem); break;
		case I_MOVE: puts(instr->u.MOVE.assem); break;
		default: assert("Invalid SHOW INSTR");
	}*/

    AS_print(stdout, instr, Temp_layerMap(F_tempMap, Temp_name()));
}
Beispiel #7
0
/* print the assembly language instructions to filename.s */
static void doProc(FILE *out, F_frame frame, T_stm body)
{
    T_stmList stmList;
    AS_instrList iList;

    stmList = C_linearize(body);
    stmList = C_traceSchedule(C_basicBlocks(stmList));
//    printStmList(stdout, stmList);
    print_graph_Stm_List(out, stmList);

    iList  = F_codegen(frame, stmList);

    fprintf(stdout, "BEGIN %s\n", Temp_labelstring(frame->name));
    AS_printInstrList (stdout, iList, Temp_layerMap(f_map,Temp_name()));
    fprintf(stdout, "END %s\n\n", Temp_labelstring(frame->name));
}
Beispiel #8
0
static void doProc(FILE *out, F_frame frame, T_stm body)
{
	//printStm(body);
	AS_proc proc;
	T_stmList stmList;
	AS_instrList iList;
	stmList = C_linearize(body);
	stmList = C_traceSchedule(C_basicBlocks(stmList));
	//printStmList(stdout, stmList);
	iList  = codegen(frame, stmList); /* 9 */
	G_graph g = FG_AssemFlowGraph(iList);
	//G_show(stdout, G_nodes(g), show_instr);
	//show_graph(g);
	struct L_graph lg = L_liveness(g);
	show_graph(lg.graph);
	fprintf(out, "BEGIN %s\n", Temp_labelstring(F_name(frame)));
	AS_printInstrList (out, iList, Temp_layerMap(F_tempMap,Temp_name()));
	fprintf(out, "END %s\n\n", Temp_labelstring(F_name(frame)));
}
Temp_temp Temp_newtemp(const char *name)
{
	Temp_temp p = (Temp_temp) checked_malloc(sizeof (*p));
	
	p->num=temps++;
	{
		char r[LOG_2_MAX_NUM_TEMPORARIES];

		if (strcmp(name,"") == 0)
		{
			sprintf(r, "%s_%d","Temp",p->num);
		}
		else
		{
			strcpy(r,name);
		}
		Temp_enter(Temp_name(), p, String(r));
	}
	
	return p;
}