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 override IReadable EvaluateToHelper(IReference storage) { var f=FuncBuilder.Instance; using(f.OpenScope(opCode.ToHumanReadable())) { var emitter=CodeGenerator.Emitter; var sm=new StorageManager(storage); var lhsResult=lhs.EvaluateTo(sm.ForLhs(rhs)); var rhsResult=rhs.EvaluateTo(sm.ForRhs(lhsResult)); var storageReg=f.Scratch0; var lhsReg=lhsResult.ToRegister(f.Scratch0); var rhsReg=rhsResult.ToRegister(f.Scratch1); emitter.EmitRegisterMoveIfDifferent(storageReg, lhsReg); emitter.Emit(opCode, storageReg, rhsReg); storage.FromRegister(storageReg); return storage; } }
protected override IReadable EvaluateToHelper(IReference storage) { Format4OpCode registerOpCode; Format1OpCode immediateOpCode; if (shiftLeft) { registerOpCode = Format4OpCode.LSL; immediateOpCode = Format1OpCode.LSL; } else { registerOpCode = Format4OpCode.ASR; immediateOpCode = Format1OpCode.ASR; } var f = FuncBuilder.Instance; var emitter = CodeGenerator.Emitter; using (f.OpenScope(registerOpCode.ToHumanReadable())) { var sm = new StorageManager(storage); var lhsResult = lhs.EvaluateTo(sm.ForLhs(rhs)); var rhsResult = rhs.EvaluateTo(sm.ForRhs(lhsResult)); var scratch0 = f.Scratch0; var scratch1 = f.Scratch1; var storageReg = scratch0; var lhsReg = lhsResult.ToRegister(scratch0); var rhsRegOrOffset = rhsResult.ToRegisterOrUint5(scratch1); if (rhsRegOrOffset.IsRegister) { emitter.EmitRegisterMoveIfDifferent(storageReg, lhsReg); emitter.Emit(registerOpCode, storageReg, rhsRegOrOffset.Register); } else { emitter.Emit(immediateOpCode, storageReg, lhsReg, rhsRegOrOffset.Byte); } storage.FromRegister(storageReg); return(storage); } }
protected override IReadable EvaluateToHelper(IReference storage) { var f = FuncBuilder.Instance; using (f.OpenScope(opCode.ToHumanReadable())) { var emitter = CodeGenerator.Emitter; var sm = new StorageManager(storage); var lhsResult = lhs.EvaluateTo(sm.ForLhs(rhs)); var rhsResult = rhs.EvaluateTo(sm.ForRhs(lhsResult)); var storageReg = f.Scratch0; var lhsReg = lhsResult.ToRegister(f.Scratch0); var rhsReg = rhsResult.ToRegister(f.Scratch1); emitter.EmitRegisterMoveIfDifferent(storageReg, lhsReg); emitter.Emit(opCode, storageReg, rhsReg); storage.FromRegister(storageReg); return(storage); } }
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 override IReadable EvaluateToHelper(IReference storage) { Format4OpCode registerOpCode; Format1OpCode immediateOpCode; if(shiftLeft) { registerOpCode=Format4OpCode.LSL; immediateOpCode=Format1OpCode.LSL; } else { registerOpCode=Format4OpCode.ASR; immediateOpCode=Format1OpCode.ASR; } var f=FuncBuilder.Instance; var emitter=CodeGenerator.Emitter; using(f.OpenScope(registerOpCode.ToHumanReadable())) { var sm=new StorageManager(storage); var lhsResult=lhs.EvaluateTo(sm.ForLhs(rhs)); var rhsResult=rhs.EvaluateTo(sm.ForRhs(lhsResult)); var scratch0=f.Scratch0; var scratch1=f.Scratch1; var storageReg=scratch0; var lhsReg=lhsResult.ToRegister(scratch0); var rhsRegOrOffset=rhsResult.ToRegisterOrUint5(scratch1); if(rhsRegOrOffset.IsRegister) { emitter.EmitRegisterMoveIfDifferent(storageReg, lhsReg); emitter.Emit(registerOpCode, storageReg, rhsRegOrOffset.Register); } else { emitter.Emit(immediateOpCode, storageReg, lhsReg, rhsRegOrOffset.Byte); } storage.FromRegister(storageReg); return storage; } }