Example #1
0
Tr_exp Tr_simpleVar(Tr_access tr_acc, Tr_level level){
//printf("Tr_simpleVar\n");
	F_access access = tr_acc->access;
	T_exp exp;
	if(level!=tr_acc->level){
int cnt = 0;
//printf("  (Tr_simpleVar: Follow static link %d)\n", ++cnt);
		//Follow the static link
		exp = F_Exp(F_staticLink(), T_Temp(F_FP()));
		level = level->parent;
		//TODO check: level cannot be null
		while(level!=tr_acc->level){
//printf("  (Tr_simpleVar: Follow static link %d)\n", ++cnt);
			exp = F_Exp(F_staticLink(), exp);			
			level = level->parent;
			//TODO check: level cannot be null
		}
		exp = F_Exp(access, exp);
	} else {
//printf("  (Tr_simpleVar: Don't follow link)\n");
		//Just use the current frame pointer
		exp = F_Exp(access, T_Temp(F_FP()));
	}
	return Tr_Ex(exp);
}
Example #2
0
//Extractors
static T_exp unEx(Tr_exp e){
	Temp_temp r;
	Temp_label t,f;
	T_exp ex;

	switch(e->kind){
	case Tr_ex:
		ex = e->u.ex;
		break;
	case Tr_cx:
		r = Temp_newtemp();
		t = Temp_newlabel();
		f = Temp_newlabel();
		doPatch(e->u.cx.trues, t);
		doPatch(e->u.cx.falses, f);
		ex = T_Eseq(T_Move(T_Temp(r), T_Const(1)),
				T_Eseq(e->u.cx.stm,
					T_Eseq(T_Label(f),
						T_Eseq(T_Move(T_Temp(r), T_Const(0)),
							T_Eseq(T_Label(t),
								T_Temp(r)
							)
						)
					)
				)
			);
		break;
	case Tr_nx:
		ex = T_Eseq(e->u.nx, T_Const(0));
		break;
	}

	return ex;
}
Example #3
0
Tr_exp Tr_recordExp_new(int cnt){
debug("Tr_recordExp_new fields=%d", cnt);
	T_exp call = F_externalCall("malloc", T_ExpList(T_Const(cnt*F_wordSize), NULL));

	Temp_temp r = Temp_newtemp();
	T_stm move = T_Seq(T_Move(T_Temp(r), call), NULL);
	T_exp ex = T_Eseq(move, T_Temp(r));
	return Tr_Ex(ex);
}
Example #4
0
T_exp F_Exp(F_access access, T_exp framePtr)
{
	if (access->kind == inFrame) {
		return T_Mem(T_Binop(T_plus, framePtr, T_Const(access->u.offset)));
	} else {
		return T_Temp(access->u.reg);
	}
}
Example #5
0
void Tr_procEntryExit(Tr_level level, Tr_exp body, Tr_accessList formals, Temp_label label){
	T_stm stm;

	stm = 
		T_Seq(
			T_Label(label),
			T_Move(T_Temp(F_RV()), unEx(body))
		);

	//Put the frag into the list
	F_Proc(stm, level->frame);
}
Example #6
0
Tr_exp Tr_callExp(Tr_level caller_lvl, Tr_level callee_lvl, Temp_label fun_label, Tr_exp* argv, int args){

int z = 0;
int cnt = 0;
debug("caller = %d; callee = %d", caller_lvl->depth, callee_lvl->depth);
	//1) Get the static link for the called function
	T_exp slk;
	if(caller_lvl!=callee_lvl){
debug("  (Tr_callExp: Follow static link %d)", ++cnt);
		//Follow the static link
		slk = F_Exp(F_staticLink(), T_Temp(F_FP()));
		caller_lvl = caller_lvl->parent;
		//TODO check: caller_lvl cannot be null
		while(caller_lvl!=callee_lvl){
debug("  (Tr_callExp: Follow static link %d)", ++cnt);
			slk = F_Exp(F_staticLink(), slk);			
			caller_lvl = caller_lvl->parent;
			//TODO check: caller_lvl cannot be null
		}
	} else {
debug("  (Tr_callExp: Don't follow link)");
		//Just use the current frame pointer
		slk = F_Exp(F_staticLink(), T_Temp(F_FP()));
	}
debug("Static link done");

	//2) Create the argument list, including the static link
	//2.1) Allocate memory
	T_expList listp_head = NULL;
	if(args>0){
/* Problematic on 64-bit machine
		int node_size = sizeof(struct T_expList_)/8;
		T_expList listp = (T_expList)checked_malloc((args+1) * sizeof(struct T_expList_));
		listp_head = listp;

		//2.2) Initialize
		listp->head = slk;
		listp->tail = listp + node_size;
		listp = listp->tail;
		int i = 0;
		while(i < args){
			//Let head point to the next argument
			listp->head = unEx(*argv);

			//Let tail point to next head
			listp->tail = listp + node_size;

			//Move the base pointer over one node
			if(i<args-1){
				listp = listp->tail;
				argv++;
			}
			i++;
		}
		listp->tail = NULL;
*/
		T_expList listp = (T_expList)checked_malloc(sizeof(struct T_expList_));
		listp_head = listp;
		//2.2) Initialize
		listp->head = slk;
		listp->tail = NULL;
		int i = 0;		
		while(i < args){
			//Create new list on the tail
			listp->tail = (T_expList)checked_malloc(sizeof(struct T_expList_));
			listp = listp->tail;

			//Let head point to the next argument
			listp->head = unEx(*argv);

			//Let tail point to next head
			listp->tail = NULL;

			//Get next argument
			argv++;

			i++;
		}
	}
debug("argument list prepared");

	//3) Generate IR
	T_exp exp = T_Call(T_Name(fun_label), listp_head);

/*
int i = 0;
while(listp_head!=NULL){
printf("arg %d\n", i++);listp_head=listp_head->tail;
}
*/

debug("call done");
	return Tr_Ex(exp);
}
Example #7
0
Tr_exp Tr_ifExp(Tr_exp cond, Tr_exp thenb, Tr_exp elseb){
	T_exp ex;
	T_stm st;
	Tr_exp ret;
	struct Cx cx_cond = unCx(cond);

	Temp_label t = Temp_newlabel();
	Temp_label f = Temp_newlabel();
	Temp_label join = Temp_newlabel();

	doPatch(cx_cond.trues, t);
	doPatch(cx_cond.falses, f);
	
	if(elseb==NULL){
	//case 1: if-then
debug("Tr_ifExp: if-then");
		st = T_Seq(cx_cond.stm,
				T_Seq(T_Label(t),
					T_Seq(unNx(thenb),
						T_Label(f)
					)
				)
			);
		ret = Tr_Nx(st);
	} else {
	//case 2: if-then-else
		if(thenb->kind==Tr_nx && elseb->kind==Tr_nx){
debug("Tr_ifExp: if-then-else (2 nx)");
			//special case: two statements
			st = T_Seq(cx_cond.stm,
					T_Seq(T_Label(t),
						T_Seq(unNx(thenb),
							T_Seq(
								T_Jump(
									T_Name(join), 
									Temp_LabelList(join, NULL)
								),
								T_Seq(T_Label(f),
									T_Seq(unNx(elseb),
										T_Label(join)
									)
								)
							)
						)
					)
				);
			ret = Tr_Nx(st);
//TODO: special case - two cx.
		} else {
debug("Tr_ifExp: if-then-else");
			Temp_temp r = Temp_newtemp();
			ex = T_Eseq(cx_cond.stm,
					T_Eseq(T_Label(t),
						T_Eseq(T_Move(T_Temp(r), unEx(thenb)),
							T_Eseq(
								T_Jump(
									T_Name(join), 
									Temp_LabelList(join, NULL)
								),
								T_Eseq(T_Label(f),
									T_Eseq(T_Move(T_Temp(r), unEx(elseb)),
										T_Eseq(T_Label(join),
											T_Temp(r)
										)
									)
								)
							)
						)
					)
				);
			ret = Tr_Ex(ex);
		}

	}
	
	return ret;
}
Example #8
0
T_exp F_Exp(F_access acc, T_exp framePtr) {
  if (acc->kind == inFrame)
    return T_Mem(T_Binop(T_plus, T_Const(acc->u.offset), framePtr));
  else
    return T_Temp(acc->u.reg);
}