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); }
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); }
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); }