public static IReadable Invoke(string scopeName, IReference storage, IntExpression lhs, IntExpression rhs, ActionOnThreeLowRegisters registerAction, ActionOnTwoLowRegistersAndAByte byteAction) { var f = FuncBuilder.Instance; using (f.OpenScope(scopeName)) { var sm = new StorageManager(storage); var lhsResult = lhs.EvaluateTo(sm.ForLhs(rhs)); var rhsResult = rhs.EvaluateTo(sm.ForRhs(lhsResult)); var storageReg = storage.ProposeRegisterOrScratch0(); var lhsReg = lhsResult.ToRegister(f.Scratch0); var rhsRegOrByte = rhsResult.ToRegisterOrByte(f.Scratch1); if (rhsRegOrByte.IsRegister) { registerAction(storageReg, lhsReg, rhsRegOrByte.Register); } else { byteAction(storageReg, lhsReg, rhsRegOrByte.Byte); } storage.FromRegister(storageReg); return(storage); } }
protected IReadable EvaluateToHelper(IReference storage, ActionOnThreeLowRegisters regAction, ActionOnTwoLowRegistersAndAByte byteAction) { var f = FuncBuilder.Instance; using (f.OpenScope("indirectReferenceEval")) { var declarer = f.Declare; var baseStorage = declarer.Int("base"); var offsetStorage = declarer.Int("offset"); var baseResult = baseAddress.EvaluateTo(baseStorage); var offsetResult = offset.EvaluateTo(offsetStorage); var storageReg = storage.ProposeRegisterOrScratch0(); var baseReg = baseResult.ToRegister(f.Scratch0); var offsetRegOrByte = offsetResult.ToRegisterOrUnsignedConstant(exclusiveUpperBoundForConstantOffset, f.Scratch1); if (offsetRegOrByte.IsRegister) { regAction(storageReg, baseReg, offsetRegOrByte.Register); } else { byteAction(storageReg, baseReg, offsetRegOrByte.Byte); } storage.FromRegister(storageReg); return(storage); } }
protected override IReadable EvaluateToHelper(IReference storage) { var emitter=CodeGenerator.Emitter; var myAddress=label.GetLabelAddressBestEffort(); var targetRegister=storage.ProposeRegisterOrScratch0(); emitter.EmitLoadAddress(Format12OpCode.LDADDR_PC, targetRegister, myAddress, wantThumbAdjustment); storage.FromRegister(targetRegister); return storage; }
protected override IReadable EvaluateToHelper(IReference storage) { var emitter=CodeGenerator.Emitter; var exprResult=expr.EvaluateTo(storage); var storageReg=storage.ProposeRegisterOrScratch0(); var exprReg=exprResult.ToRegister(storageReg); emitter.Emit(OpCodes.Format4OpCode.NEG, storageReg, exprReg); storage.FromRegister(storageReg); return storage; }
protected override IReadable EvaluateToHelper(IReference storage) { var emitter = CodeGenerator.Emitter; var exprResult = expr.EvaluateTo(storage); var storageReg = storage.ProposeRegisterOrScratch0(); var exprReg = exprResult.ToRegister(storageReg); emitter.Emit(OpCodes.Format4OpCode.NEG, storageReg, exprReg); storage.FromRegister(storageReg); return(storage); }
protected override IReadable EvaluateToHelper(IReference storage) { var emitter = CodeGenerator.Emitter; var myAddress = label.GetLabelAddressBestEffort(); var targetRegister = storage.ProposeRegisterOrScratch0(); emitter.EmitLoadAddress(Format12OpCode.LDADDR_PC, targetRegister, myAddress, wantThumbAdjustment); storage.FromRegister(targetRegister); return(storage); }
public static void SpecialAssignAny(IReference lhs, Expression rhs) { var f=FuncBuilder.Instance; var lhsWasLivePriorToThisAssignment=f.IsLive(lhs); var rhsReadable=rhs.EvaluateTo(lhs); if(!ReferenceEquals(lhs, rhsReadable)) { var lhsReg=lhs.ProposeRegisterOrScratch0(); var rhsReg=rhsReadable.ToRegister(lhsReg); lhs.FromRegister(rhsReg); } //Don't decide that a variable is live just because it was referenced (or it was used as temporary storage) //in its very-own assignment. if(!lhsWasLivePriorToThisAssignment) { f.UndoNoteRead(new[] {lhs}); } }
public static void SpecialAssignAny(IReference lhs, Expression rhs) { var f = FuncBuilder.Instance; var lhsWasLivePriorToThisAssignment = f.IsLive(lhs); var rhsReadable = rhs.EvaluateTo(lhs); if (!ReferenceEquals(lhs, rhsReadable)) { var lhsReg = lhs.ProposeRegisterOrScratch0(); var rhsReg = rhsReadable.ToRegister(lhsReg); lhs.FromRegister(rhsReg); } //Don't decide that a variable is live just because it was referenced (or it was used as temporary storage) //in its very-own assignment. if (!lhsWasLivePriorToThisAssignment) { f.UndoNoteRead(new[] { lhs }); } }
public static IReadable Invoke(string scopeName, IReference storage, IntExpression lhs, IntExpression rhs, ActionOnThreeLowRegisters registerAction, ActionOnTwoLowRegistersAndAByte byteAction) { var f=FuncBuilder.Instance; using(f.OpenScope(scopeName)) { var sm=new StorageManager(storage); var lhsResult=lhs.EvaluateTo(sm.ForLhs(rhs)); var rhsResult=rhs.EvaluateTo(sm.ForRhs(lhsResult)); var storageReg=storage.ProposeRegisterOrScratch0(); var lhsReg=lhsResult.ToRegister(f.Scratch0); var rhsRegOrByte=rhsResult.ToRegisterOrByte(f.Scratch1); if(rhsRegOrByte.IsRegister) { registerAction(storageReg, lhsReg, rhsRegOrByte.Register); } else { byteAction(storageReg, lhsReg, rhsRegOrByte.Byte); } storage.FromRegister(storageReg); return storage; } }
protected IReadable EvaluateToHelper(IReference storage, ActionOnThreeLowRegisters regAction, ActionOnTwoLowRegistersAndAByte byteAction) { var f=FuncBuilder.Instance; using(f.OpenScope("indirectReferenceEval")) { var declarer=f.Declare; var baseStorage=declarer.Int("base"); var offsetStorage=declarer.Int("offset"); var baseResult=baseAddress.EvaluateTo(baseStorage); var offsetResult=offset.EvaluateTo(offsetStorage); var storageReg=storage.ProposeRegisterOrScratch0(); var baseReg=baseResult.ToRegister(f.Scratch0); var offsetRegOrByte=offsetResult.ToRegisterOrUnsignedConstant(exclusiveUpperBoundForConstantOffset, f.Scratch1); if(offsetRegOrByte.IsRegister) { regAction(storageReg, baseReg, offsetRegOrByte.Register); } else { byteAction(storageReg, baseReg, offsetRegOrByte.Byte); } storage.FromRegister(storageReg); return storage; } }