Example #1
0
 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--;
        }
Example #3
0
 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);
         }
     }
 }
Example #4
0
 public IRRegister(DarksVMRegisters reg, ASTType type)
 {
     this.Register = reg;
     this.Type     = type;
 }
Example #5
0
 public IRRegister(DarksVMRegisters reg)
 {
     this.Register = reg;
     this.Type     = ASTType.Ptr;
 }
Example #6
0
 public IRRegister(DarksVMRegisters reg, ASTType type)
 {
     Register = reg;
     Type     = type;
 }
Example #7
0
 public IRRegister(DarksVMRegisters reg)
 {
     Register = reg;
     Type     = ASTType.Ptr;
 }
Example #8
0
 public byte this[DarksVMRegisters reg] => regOrder[(int)reg];
Example #9
0
 public void Deallocate(IRVariable var, DarksVMRegisters reg)
 {
     Debug.Assert(regAlloc[FromRegister(reg)] == var);
     regAlloc[FromRegister(reg)] = null;
 }
Example #10
0
 private static int FromRegister(DarksVMRegisters reg)
 {
     return((int)reg);
 }
Example #11
0
 public static ILRegister LookupRegister(DarksVMRegisters reg) => regMap[reg];
Example #12
0
 private ILRegister(DarksVMRegisters reg)
 {
     this.Register = reg;
     regMap.Add(reg, this);
 }
Example #13
0
 public static ILRegister LookupRegister(DarksVMRegisters reg)
 {
     return(regMap[reg]);
 }
Example #14
0
 public static bool IsGPR(this DarksVMRegisters reg) => reg >= DarksVMRegisters.R0 && reg <= DarksVMRegisters.R7 ? true : false;