public void Load(IAsm a) { StringBuilder sb = new StringBuilder(MyC.MAXSTR); Var e = a.getVar(); if (e == null) { Console.WriteLine("?Load instruction with no variable ptr"); Environment.Exit(1); } switch (e.getClassId()) { case Tok.T_STATIC: { sb.Append("\tldsfld "); sb.Append(genFieldRef(e)); sb.Append("\t//"); sb.Append(a.getICount()); sb.Append(", "); sb.Append(e.getName()); sb.Append("\r\n"); break; } case Tok.T_AUTO: case Tok.T_DEFCLASS: sb.Append("\tldloc "); sb.Append(e.getIndex()); sb.Append("\t//"); sb.Append(a.getICount()); sb.Append(", "); sb.Append(e.getName()); sb.Append("\r\n"); break; case Tok.T_PARAM: sb.Append("\tldarg "); sb.Append(e.getIndex()); sb.Append("\t//"); sb.Append(a.getICount()); sb.Append(", "); sb.Append(e.getName()); sb.Append("\r\n"); break; default: Console.Write("?Instruction load of unknown class ("); Console.Write(e.getClassId()); Console.WriteLine(")"); Environment.Exit(1); break; } io.Out(sb.ToString()); }
public void LoadConst(IAsm a) { StringBuilder sb = new StringBuilder(MyC.MAXSTR); int value = Convert.ToInt32(a.getInsn()); sb.Append("\tldc.i4"); if (value > 127 || value < -128) /* if must use long form */ { sb.Append(" "); } else if (value > 8 || value < -1) /* if must use medium form */ { sb.Append(".s "); } else /* else use short form */ { sb.Append("."); } sb.Append(a.getInsn()); sb.Append("\t//"); sb.Append(a.getICount()); sb.Append("\r\n"); io.Out(sb.ToString()); }
public void Call(IAsm a) { Var func = a.getVar(); String funcsig = genDataTypeSig(a.getVar()); /* gen type info */ VarList x = func.getParams(); /* get any params */ String paramsig = ""; if (x.Length() > 0) { int max = x.Length(); StringBuilder t = new StringBuilder(MyC.MAXSTR); for (int i = 0; i < max; i++) { Var e = x.FindByIndex(i); t.Append(genDataTypeSig(e)); if (i < max - 1) { t.Append(","); } } paramsig = t.ToString(); } StringBuilder sb = new StringBuilder(MyC.MAXSTR); sb.Append("\tcall "); sb.Append(funcsig); sb.Append("("); sb.Append(paramsig); sb.Append(")\t//"); sb.Append(a.getICount()); sb.Append("\r\n"); io.Out(sb.ToString()); }
public void Ret(IAsm a) { StringBuilder sb = new StringBuilder(MyC.MAXSTR); sb.Append("\tret\t\t//"); sb.Append(a.getICount()); sb.Append("\r\n"); io.Out(sb.ToString()); }
public void Branch(IAsm a) { StringBuilder sb = new StringBuilder(MyC.MAXSTR); sb.Append("\t"); sb.Append(a.getInsn()); sb.Append(" "); sb.Append(a.getLabel()); sb.Append("\t//"); sb.Append(a.getICount()); sb.Append("\r\n"); io.Out(sb.ToString()); }
void NextInsn(int incr) { int ncount = 0; if (iroot == null) { icur = iroot = new IAsm(); } else { ncount = icur.getICount() + incr; /* propogate previous count */ icur.setNext(new IAsm()); icur = icur.getNext(); } icur.setICount(ncount); }
public void Call(IAsm a) { Var func = a.getVar(); String funcsig = genDataTypeSig(a.getVar()); /* gen type info */ VarList x = func.getParams(); /* get any params */ String paramsig = ""; if (x.Length() > 0) { int max = x.Length(); StringBuilder t = new StringBuilder(MyC.MAXSTR); for (int i = 0; i < max; i++) { Var e = x.FindByIndex(i); t.Append(genDataTypeSig(e)); if (i < max-1) t.Append(","); } paramsig = t.ToString(); } StringBuilder sb = new StringBuilder(MyC.MAXSTR); sb.Append("\tcall "); sb.Append(funcsig); sb.Append("("); sb.Append(paramsig); sb.Append(")\t//"); sb.Append(a.getICount()); sb.Append("\r\n"); io.Out(sb.ToString()); }