public static void Umull(ArmEmitterContext context) { OpCode32AluUmull op = (OpCode32AluUmull)context.CurrOp; Operand n = context.ZeroExtend32(OperandType.I64, GetIntA32(context, op.Rn)); Operand m = context.ZeroExtend32(OperandType.I64, GetIntA32(context, op.Rm)); Operand res = context.Multiply(n, m); Operand hi = context.ConvertI64ToI32(context.ShiftRightUI(res, Const(32))); Operand lo = context.ConvertI64ToI32(res); if (op.SetFlags) { EmitNZFlagsCheck(context, res); } EmitGenericAluStoreA32(context, op.RdHi, op.SetFlags, hi); EmitGenericAluStoreA32(context, op.RdLo, op.SetFlags, lo); }
public static void Umaal(ArmEmitterContext context) { OpCode32AluUmull op = (OpCode32AluUmull)context.CurrOp; Operand n = context.ZeroExtend32(OperandType.I64, GetIntA32(context, op.Rn)); Operand m = context.ZeroExtend32(OperandType.I64, GetIntA32(context, op.Rm)); Operand dHi = context.ZeroExtend32(OperandType.I64, GetIntA32(context, op.RdHi)); Operand dLo = context.ZeroExtend32(OperandType.I64, GetIntA32(context, op.RdLo)); Operand res = context.Multiply(n, m); res = context.Add(res, dHi); res = context.Add(res, dLo); Operand hi = context.ConvertI64ToI32(context.ShiftRightUI(res, Const(32))); Operand lo = context.ConvertI64ToI32(res); EmitGenericAluStoreA32(context, op.RdHi, false, hi); EmitGenericAluStoreA32(context, op.RdLo, false, lo); }
public static void Smlal__(ArmEmitterContext context) { OpCode32AluUmull op = (OpCode32AluUmull)context.CurrOp; Operand n = GetIntA32(context, op.Rn); Operand m = GetIntA32(context, op.Rm); if (op.NHigh) { n = context.SignExtend16(OperandType.I64, context.ShiftRightUI(n, Const(16))); } else { n = context.SignExtend16(OperandType.I64, n); } if (op.MHigh) { m = context.SignExtend16(OperandType.I64, context.ShiftRightUI(m, Const(16))); } else { m = context.SignExtend16(OperandType.I64, m); } Operand res = context.Multiply(n, m); Operand toAdd = context.ShiftLeft(context.ZeroExtend32(OperandType.I64, GetIntA32(context, op.RdHi)), Const(32)); toAdd = context.BitwiseOr(toAdd, context.ZeroExtend32(OperandType.I64, GetIntA32(context, op.RdLo))); res = context.Add(res, toAdd); Operand hi = context.ConvertI64ToI32(context.ShiftRightUI(res, Const(32))); Operand lo = context.ConvertI64ToI32(res); EmitGenericAluStoreA32(context, op.RdHi, false, hi); EmitGenericAluStoreA32(context, op.RdLo, false, lo); }
public static void EmitMlal(ArmEmitterContext context, bool signed) { OpCode32AluUmull op = (OpCode32AluUmull)context.CurrOp; Operand n = GetIntA32(context, op.Rn); Operand m = GetIntA32(context, op.Rm); if (signed) { n = context.SignExtend32(OperandType.I64, n); m = context.SignExtend32(OperandType.I64, m); } else { n = context.ZeroExtend32(OperandType.I64, n); m = context.ZeroExtend32(OperandType.I64, m); } Operand res = context.Multiply(n, m); Operand toAdd = context.ShiftLeft(context.ZeroExtend32(OperandType.I64, GetIntA32(context, op.RdHi)), Const(32)); toAdd = context.BitwiseOr(toAdd, context.ZeroExtend32(OperandType.I64, GetIntA32(context, op.RdLo))); res = context.Add(res, toAdd); Operand hi = context.ConvertI64ToI32(context.ShiftRightUI(res, Const(32))); Operand lo = context.ConvertI64ToI32(res); if (op.SetFlags) { EmitNZFlagsCheck(context, res); } EmitGenericAluStoreA32(context, op.RdHi, op.SetFlags, hi); EmitGenericAluStoreA32(context, op.RdLo, op.SetFlags, lo); }