public void InitRegisters() { availableRegisters = new List <MIPSRegister>(); for (int i = 0; i < gpRegisters.Length; i++) { availableRegisters[i] = new MIPSRegister(gpRegisters[i]); } }
public MIPSRegister GetRegister() { if (availableRegisters.Count == 0) { throw new Exception("No more registers!"); } MIPSRegister reg = availableRegisters[0]; availableRegisters.RemoveAt(0); return(reg); }
public void EmitMalloc(MIPSRegister reg, short numbytes) { // put v0 + a0 on the stack EmitLoadStore("sw", "$v0", -4, "$sp"); EmitLoadStore("sw", "$a0", -8, "$sp"); // set v0 to 9 - sbrk EmitImmediate("addi", "$v0", "$zero", 9); // set a0 to num bytes EmitImmediate("addi", "$a0", "$zero", numbytes); // call syscall Emit("syscall"); // put the returned address in v0 to reg Emit("add", reg, "$zero", "$v0"); // restore v0 and a0 EmitLoadStore("lw", "$v0", -4, "$sp"); EmitLoadStore("lw", "$a0", -8, "$sp"); }
public void ReleaseRegister(MIPSRegister reg) { availableRegisters.Insert(0, reg); }
public void EmitLabelJump(string mnemonic, MIPSRegister s, MIPSRegister t, string label) { EmitLabelJump(mnemonic, s.Name, t.Name, label); }
public void EmitImmediate(string mnemonic, MIPSRegister t, MIPSRegister s, short C) { EmitImmediate(t.Name, s.Name, C); }
public void Emit(string mnemonic, MIPSRegister s, MIPSRegister t) { Emit(mnemonic, s.Name, t.Name); }
public void Emit(string mnemonic, MIPSRegister d, MIPSRegister s, string t) { Emit(mnemonic, d.Name, s.Name, t); }
public void Emit(string mnemonic, MIPSRegister d, string s, MIPSRegister t) { Emit(mnemonic, d.Name, s, t.Name); }
public void Emit(string mnemonic, MIPSRegister d, int C) { Emit(string.Format("{0} {1},{2}", mnemonic, d.Name, C)); }
public void EmitLoadStore(string mnemonic, MIPSRegister t, short C, MIPSRegister s) { EmitLoadStore(mnemonic, t.Name, C, s.Name); }