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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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();
        }
Beispiel #5
0
        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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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);
        }