public static bool IsGPR(this DarksVMRegisters reg) { if (reg >= DarksVMRegisters.R0 && reg <= DarksVMRegisters.R7) { return(true); } return(false); }
private void VisitInstr(ILInstrList instrs, ILInstruction instr, ref int index, ILPostTransformer tr) { if (instr.OpCode != ILOpCode.__BEGINCALL && instr.OpCode != ILOpCode.__ENDCALL) { return; } var callInfo = (InstrCallInfo)instr.Annotation; if (callInfo.IsECall) { instrs.RemoveAt(index); index--; return; } var saving = new HashSet <DarksVMRegisters>(this.saveRegs); var retVar = (IRVariable)callInfo.ReturnValue; // R0 = return register, need to save if retVar register is not R0 //Debug.Assert(!(retVar == null ^ (callInfo.ReturnRegister == null ^ callInfo.ReturnSlot == null))); if (retVar != null) { if (callInfo.ReturnSlot == null) { DarksVMRegisters retReg = callInfo.ReturnRegister.Register; saving.Remove(retReg); if (retReg != DarksVMRegisters.R0) { saving.Add(DarksVMRegisters.R0); } } else { saving.Add(DarksVMRegisters.R0); } } else { saving.Add(DarksVMRegisters.R0); } if (instr.OpCode == ILOpCode.__BEGINCALL) { instrs.Replace(index, saving .Select(reg => new ILInstruction(ILOpCode.PUSHR_OBJECT, ILRegister.LookupRegister(reg), instr))); } else { instrs.Replace(index, saving .Select(reg => new ILInstruction(ILOpCode.POP, ILRegister.LookupRegister(reg), instr)) .Reverse()); } index--; }
private void VisitInstr(ILInstrList instrs, ILInstruction instr, ref int index, ILTransformer tr) { if (instr.Operand is ILRegister) { DarksVMRegisters reg = ((ILRegister)instr.Operand).Register; if (reg.IsGPR()) { this.methodInfo.UsedRegister.Add(reg); } } }
public IRRegister(DarksVMRegisters reg, ASTType type) { this.Register = reg; this.Type = type; }
public IRRegister(DarksVMRegisters reg) { this.Register = reg; this.Type = ASTType.Ptr; }
public IRRegister(DarksVMRegisters reg, ASTType type) { Register = reg; Type = type; }
public IRRegister(DarksVMRegisters reg) { Register = reg; Type = ASTType.Ptr; }
public byte this[DarksVMRegisters reg] => regOrder[(int)reg];
public void Deallocate(IRVariable var, DarksVMRegisters reg) { Debug.Assert(regAlloc[FromRegister(reg)] == var); regAlloc[FromRegister(reg)] = null; }
private static int FromRegister(DarksVMRegisters reg) { return((int)reg); }
public static ILRegister LookupRegister(DarksVMRegisters reg) => regMap[reg];
private ILRegister(DarksVMRegisters reg) { this.Register = reg; regMap.Add(reg, this); }
public static ILRegister LookupRegister(DarksVMRegisters reg) { return(regMap[reg]); }
public static bool IsGPR(this DarksVMRegisters reg) => reg >= DarksVMRegisters.R0 && reg <= DarksVMRegisters.R7 ? true : false;