예제 #1
0
        public static void Umulh(ILEmitterCtx context)
        {
            OpCodeMul64 op = (OpCodeMul64)context.CurrOp;

            context.EmitLdintzr(op.Rn);
            context.EmitLdintzr(op.Rm);

            SoftFallback.EmitCall(context, nameof(SoftFallback.UMulHi128));

            context.EmitStintzr(op.Rd);
        }
예제 #2
0
        private static void EmitMul(ILEmitterCtx context, OpCode ilOp)
        {
            OpCodeMul64 op = (OpCodeMul64)context.CurrOp;

            context.EmitLdintzr(op.Ra);
            context.EmitLdintzr(op.Rn);
            context.EmitLdintzr(op.Rm);

            context.Emit(OpCodes.Mul);
            context.Emit(ilOp);

            context.EmitStintzr(op.Rd);
        }
예제 #3
0
        private static void EmitMull(ILEmitterCtx context, OpCode addSubOp, bool signed)
        {
            OpCodeMul64 op = (OpCodeMul64)context.CurrOp;

            OpCode castOp = signed
                ? OpCodes.Conv_I8
                : OpCodes.Conv_U8;

            context.EmitLdintzr(op.Ra);
            context.EmitLdintzr(op.Rn);

            context.Emit(OpCodes.Conv_I4);
            context.Emit(castOp);

            context.EmitLdintzr(op.Rm);

            context.Emit(OpCodes.Conv_I4);
            context.Emit(castOp);
            context.Emit(OpCodes.Mul);

            context.Emit(addSubOp);

            context.EmitStintzr(op.Rd);
        }