public override void Transform(Context context, TransformContext transformContext) { var result = context.Result; var t1 = context.Operand1.Definitions[0].Operand1; var t2 = context.Operand2.Definitions[0].Operand1; var v1 = transformContext.AllocateVirtualRegister(transformContext.I8); var v2 = transformContext.AllocateVirtualRegister(transformContext.I8); context.SetInstruction(IRInstruction.Add64, v1, t1, t2); context.AppendInstruction(IRInstruction.Sub64, v2, t1, t2); context.AppendInstruction(IRInstruction.MulUnsigned64, result, v2, v1); }
public override void Transform(Context context, TransformContext transformContext) { var result = context.Result; var t1 = context.Operand2.Definitions[0].Operand1.Definitions[0].Operand1; var t2 = context.Operand2.Definitions[0].Operand1.Definitions[0].Operand2; var v1 = transformContext.AllocateVirtualRegister(transformContext.I8); var v2 = transformContext.AllocateVirtualRegister(transformContext.I8); var e1 = transformContext.CreateConstant(DivSigned64(ToSigned64(t2), 2)); context.SetInstruction(IRInstruction.Add64, v1, t1, e1); context.AppendInstruction(IRInstruction.Add64, v2, t1, e1); context.AppendInstruction(IRInstruction.MulSigned64, result, v2, v1); }
public override void Transform(Context context, TransformContext transformContext) { var result = context.Result; var t1 = context.Operand1.Definitions[0].Operand1.Definitions[0].Operand1; var t2 = context.Operand1.Definitions[0].Operand1.Definitions[0].Operand2; var v1 = transformContext.AllocateVirtualRegister(transformContext.I4); var v2 = transformContext.AllocateVirtualRegister(transformContext.I4); var e1 = transformContext.CreateConstant(DivUnsigned32(To32(t1), 2)); context.SetInstruction(IRInstruction.Add32, v1, t2, e1); context.AppendInstruction(IRInstruction.Add32, v2, t2, e1); context.AppendInstruction(IRInstruction.MulUnsigned32, result, v2, v1); }
public override void Transform(Context context, TransformContext transformContext) { var parent = context.PhiBlocks[0].PreviousBlocks[0]; var op1 = context.Operand1; var op2 = context.Operand2; var result = context.Result; var block1 = context.PhiBlocks[0]; var block2 = context.PhiBlocks[1]; var ctx = new Context(parent.BeforeLast); while (ctx.IsEmptyOrNop || ctx.Instruction.FlowControl != FlowControl.ConditionalBranch) { ctx.GotoPrevious(); } var op1Condition = ctx.Operand1; var op2Condition = ctx.Operand2; var condition = ctx.ConditionCode; var instruction = ctx.Instruction; var branch = ctx.BranchTargets[0]; var resultCondition = transformContext.AllocateVirtualRegister(result.Type); var conditionInstruction = (instruction == IRInstruction.Branch32) ? (BaseInstruction)IRInstruction.Compare32x32 : IRInstruction.Compare64x64; var swap = block1 == branch; ctx.GotoPrevious(); ctx.AppendInstruction(conditionInstruction, condition, resultCondition, op1Condition, op2Condition); ctx.AppendInstruction(IRInstruction.IfThenElse32, result, resultCondition, swap ? op1 : op2, swap ? op2 : op1); context.SetNop(); }
public override void Transform(Context context, TransformContext transformContext) { var result = context.Result; var t1 = context.Operand1.Definitions[0].Operand1; var t2 = context.Operand2.Definitions[0].Operand1; var v1 = transformContext.AllocateVirtualRegister(transformContext.I4); context.SetInstruction(IRInstruction.And32, v1, t1, t2); context.AppendInstruction(IRInstruction.Not64, result, v1); }
public override void Transform(Context context, TransformContext transformContext) { var result = context.Result; var t1 = context.Operand1.Definitions[0].Operand1; var t2 = context.Operand1.Definitions[0].Operand2; var t3 = context.Operand2; var v1 = transformContext.AllocateVirtualRegister(transformContext.I4); context.SetInstruction(IRInstruction.MulSigned32, v1, t1, t3); context.AppendInstruction(IRInstruction.ShiftLeft32, result, v1, t2); }
public override void Transform(Context context, TransformContext transformContext) { var result = context.Result; var t1 = context.Operand1.Definitions[0].Operand1; var t2 = context.Operand1.Definitions[0].Operand2; var t3 = context.Operand2; var v1 = transformContext.AllocateVirtualRegister(transformContext.I8); var e1 = transformContext.CreateConstant(MulUnsigned64(To64(t2), To64(t3))); context.SetInstruction(IRInstruction.Sub64, v1, t1, e1); context.AppendInstruction(IRInstruction.Compare64x64, ConditionCode.UnsignedLess, result, v1, t2); }
public override void Transform(Context context, TransformContext transformContext) { var result = context.Result; var t1 = context.Operand1; var t2 = context.Operand2.Definitions[0].Operand1; var t3 = context.Operand2.Definitions[0].Operand2; var v1 = transformContext.AllocateVirtualRegister(transformContext.I4); var e1 = transformContext.CreateConstant(MulUnsigned32(To32(t3), To32(t1))); context.SetInstruction(IRInstruction.Sub32, v1, t2, e1); context.AppendInstruction(IRInstruction.Compare32x32, ConditionCode.UnsignedLess, result, v1, t3); }
public override void Transform(Context context, TransformContext transformContext) { var result = context.Result; var operand1 = context.Operand1; var operand2 = context.Operand2; var op0Low = transformContext.AllocateVirtualRegister(transformContext.TypeSystem.BuiltIn.I4); var op0High = transformContext.AllocateVirtualRegister(transformContext.TypeSystem.BuiltIn.I4); var op1Low = transformContext.AllocateVirtualRegister(transformContext.TypeSystem.BuiltIn.I4); var op1High = transformContext.AllocateVirtualRegister(transformContext.TypeSystem.BuiltIn.I4); var resultLow = transformContext.AllocateVirtualRegister(transformContext.TypeSystem.BuiltIn.I4); var resultHigh = transformContext.AllocateVirtualRegister(transformContext.TypeSystem.BuiltIn.I4); var resultCarry = transformContext.AllocateVirtualRegister(transformContext.TypeSystem.BuiltIn.Boolean); transformContext.SetGetLow64(context, op0Low, operand1); transformContext.AppendGetHigh64(context, op0High, operand1); transformContext.AppendGetLow64(context, op1Low, operand2); transformContext.AppendGetHigh64(context, op1High, operand2); context.AppendInstruction2(IRInstruction.AddCarryOut32, resultLow, resultCarry, op0Low, op1Low); context.AppendInstruction(IRInstruction.AddCarryIn32, resultHigh, op0High, op1High, resultCarry); context.AppendInstruction(IRInstruction.To64, result, resultLow, resultHigh); }