Ejemplo n.º 1
0
        private static void EmitMull(ArmEmitterContext context, MullFlags flags)
        {
            OpCodeMul op = (OpCodeMul)context.CurrOp;

            Operand GetExtendedRegister32(int index)
            {
                Operand value = GetIntOrZR(context, index);

                if ((flags & MullFlags.Signed) != 0)
                {
                    return(context.SignExtend32(value.Type, value));
                }
                else
                {
                    return(context.ZeroExtend32(value.Type, value));
                }
            }

            Operand a = GetIntOrZR(context, op.Ra);

            Operand n = GetExtendedRegister32(op.Rn);
            Operand m = GetExtendedRegister32(op.Rm);

            Operand res = context.Multiply(n, m);

            res = (flags & MullFlags.Add) != 0 ? context.Add(a, res) : context.Subtract(a, res);

            SetIntOrZR(context, op.Rd, res);
        }
Ejemplo n.º 2
0
        public static void Umulh(ArmEmitterContext context)
        {
            OpCodeMul op = (OpCodeMul)context.CurrOp;

            Operand n = GetIntOrZR(context, op.Rn);
            Operand m = GetIntOrZR(context, op.Rm);

            Operand d = context.Multiply64HighUI(n, m);

            SetIntOrZR(context, op.Rd, d);
        }
Ejemplo n.º 3
0
        private static void EmitMul(ArmEmitterContext context, bool isAdd)
        {
            OpCodeMul op = (OpCodeMul)context.CurrOp;

            Operand a = GetIntOrZR(context, op.Ra);
            Operand n = GetIntOrZR(context, op.Rn);
            Operand m = GetIntOrZR(context, op.Rm);

            Operand res = context.Multiply(n, m);

            res = isAdd ? context.Add(a, res) : context.Subtract(a, res);

            SetIntOrZR(context, op.Rd, res);
        }