예제 #1
0
 public static void Fcvtmu_Gp(ILEmitterCtx context)
 {
     EmitFcvt_u_Gp(context, () => EmitUnaryMathCall(context, nameof(Math.Floor)));
 }
예제 #2
0
 public static void Ldar(ILEmitterCtx context) => EmitLdr(context, AccessType.Ordered);
예제 #3
0
 public static void Ldaxp(ILEmitterCtx context) => EmitLdp(context, AccessType.OrderedEx);
예제 #4
0
 public static void EmitVirtualJump(ILEmitterCtx context)
 {
     EmitVirtualCallOrJump(context, isJump: true);
 }
예제 #5
0
 public static void Clrex(ILEmitterCtx context)
 {
     EmitMemoryCall(context, nameof(MemoryManager.ClearExclusive));
 }
예제 #6
0
        public static void EmitCall(ILEmitterCtx context, string name64, string name128)
        {
            bool isSimd64 = context.CurrOp.RegisterSize == RegisterSize.Simd64;

            context.EmitCall(typeof(VectorHelper), isSimd64 ? name64 : name128);
        }
예제 #7
0
 public static void Bl(ILEmitterCtx context)
 {
     Blx(context, x: false);
 }
예제 #8
0
 public static void Fcvtzu_Gp_Fixed(ILEmitterCtx context)
 {
     EmitFcvtzu_Gp_Fixed(context);
 }
예제 #9
0
 public static void Fcvtzu_S(ILEmitterCtx context)
 {
     EmitScalarFcvtzu(context);
 }
예제 #10
0
 public static void Fcvtpu_Gp(ILEmitterCtx context)
 {
     EmitFcvt_u_Gp(context, () => EmitUnaryMathCall(context, nameof(Math.Ceiling)));
 }
예제 #11
0
 public static void Fcvtzu_Gp(ILEmitterCtx context)
 {
     EmitFcvt_u_Gp(context, () => { });
 }
예제 #12
0
 public static void Fcvtnu_V(ILEmitterCtx context)
 {
     EmitFcvtn(context, signed: false, scalar: false);
 }
예제 #13
0
 public static void Fcvtns_S(ILEmitterCtx context)
 {
     EmitFcvtn(context, signed: true, scalar: true);
 }
예제 #14
0
        public static void Fcvtn_V(ILEmitterCtx context)
        {
            OpCodeSimd64 op = (OpCodeSimd64)context.CurrOp;

            int sizeF = op.Size & 1;

            if (Optimizations.UseSse2 && sizeF == 1)
            {
                Type[] typesCvt = new Type[] { typeof(Vector128 <double>) };

                string nameMov = op.RegisterSize == RegisterSize.Simd128
                    ? nameof(Sse.MoveLowToHigh)
                    : nameof(Sse.MoveHighToLow);

                context.EmitLdvec(op.Rd);
                VectorHelper.EmitCall(context, nameof(VectorHelper.VectorSingleZero));

                context.EmitCall(typeof(Sse).GetMethod(nameof(Sse.MoveLowToHigh)));

                context.EmitLdvec(op.Rn);
                context.EmitCall(typeof(Sse2).GetMethod(nameof(Sse2.ConvertToVector128Single), typesCvt));
                context.Emit(OpCodes.Dup);

                context.EmitCall(typeof(Sse).GetMethod(nameof(Sse.MoveLowToHigh)));

                context.EmitCall(typeof(Sse).GetMethod(nameMov));

                context.EmitStvec(op.Rd);
            }
            else
            {
                int elems = 4 >> sizeF;

                int part = op.RegisterSize == RegisterSize.Simd128 ? elems : 0;

                if (part != 0)
                {
                    context.EmitLdvec(op.Rd);
                    context.EmitStvectmp();
                }

                for (int index = 0; index < elems; index++)
                {
                    EmitVectorExtractF(context, op.Rn, index, sizeF);

                    if (sizeF == 0)
                    {
                        context.EmitLdarg(TranslatedSub.StateArgIdx);

                        context.EmitCall(typeof(SoftFloat32_16), nameof(SoftFloat32_16.FPConvert));

                        context.Emit(OpCodes.Conv_U8);
                        EmitVectorInsertTmp(context, part + index, 1);
                    }
                    else /* if (sizeF == 1) */
                    {
                        context.Emit(OpCodes.Conv_R4);

                        EmitVectorInsertTmpF(context, part + index, 0);
                    }
                }

                context.EmitLdvectmp();
                context.EmitStvec(op.Rd);

                if (part == 0)
                {
                    EmitVectorZeroUpper(context, op.Rd);
                }
            }
        }
예제 #15
0
 private static void EmitVectorFcvtzu(ILEmitterCtx context)
 {
     EmitVectorFcvtz(context, false);
 }
예제 #16
0
 public static void Fcvtzu_V(ILEmitterCtx context)
 {
     EmitVectorFcvtzu(context);
 }
예제 #17
0
 public static void Fcvtau_Gp(ILEmitterCtx context)
 {
     EmitFcvt_u_Gp(context, () => EmitRoundMathCall(context, MidpointRounding.AwayFromZero));
 }
예제 #18
0
 public static void Ucvtf_V(ILEmitterCtx context)
 {
     EmitVectorCvtf(context, signed: false);
 }
예제 #19
0
 public static void EmitCall(ILEmitterCtx context, string mthdName)
 {
     context.EmitCall(typeof(VectorHelper), mthdName);
 }
예제 #20
0
 private static void EmitFcvt_s_Gp(ILEmitterCtx context, Action emit)
 {
     EmitFcvt___Gp(context, emit, true);
 }
예제 #21
0
 public static void Blx(ILEmitterCtx context)
 {
     Blx(context, x: true);
 }
예제 #22
0
 private static void EmitFcvt_u_Gp(ILEmitterCtx context, Action emit)
 {
     EmitFcvt___Gp(context, emit, false);
 }
예제 #23
0
 private static void EmitStp(ILEmitterCtx context, AccessType accType)
 {
     EmitStore(context, accType, true);
 }
예제 #24
0
 private static void EmitFcvtzs_Gp_Fixed(ILEmitterCtx context)
 {
     EmitFcvtz__Gp_Fixed(context, true);
 }
예제 #25
0
 public static void Dsb(ILEmitterCtx context) => EmitBarrier(context);
예제 #26
0
 private static void EmitFcvtzu_Gp_Fixed(ILEmitterCtx context)
 {
     EmitFcvtz__Gp_Fixed(context, false);
 }
예제 #27
0
 public static void Ldxp(ILEmitterCtx context) => EmitLdp(context, AccessType.Exclusive);
예제 #28
0
 private static void EmitVectorFcvtzs(ILEmitterCtx context)
 {
     EmitVectorFcvtz(context, true);
 }
예제 #29
0
 private static void EmitLdp(ILEmitterCtx context, AccessType accType)
 {
     EmitLoad(context, accType, true);
 }
예제 #30
0
 public static void EmitScalarSaturatingUnaryOpSx(ILEmitterCtx context, Action emit)
 {
     EmitSaturatingUnaryOpSx(context, emit, SaturatingFlags.ScalarSx);
 }