diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2022-09-11 12:44:27 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-09-11 15:44:27 +0000 |
| commit | 4d69286a9c5af031d4299357e720a967694f265e (patch) | |
| tree | eb8da27a59e6eeea33af170cbbfb1a54490ea693 /ARMeilleure/Instructions | |
| parent | 1529e6cf0dbd42f034b2809485810eb1c88ef7ff (diff) | |
Implement VRINT (vector) Arm32 NEON instructions (#3691)
Diffstat (limited to 'ARMeilleure/Instructions')
| -rw-r--r-- | ARMeilleure/Instructions/InstEmitSimdCvt32.cs | 54 | ||||
| -rw-r--r-- | ARMeilleure/Instructions/InstName.cs | 4 |
2 files changed, 58 insertions, 0 deletions
diff --git a/ARMeilleure/Instructions/InstEmitSimdCvt32.cs b/ARMeilleure/Instructions/InstEmitSimdCvt32.cs index ec1ead48..b06ddd5e 100644 --- a/ARMeilleure/Instructions/InstEmitSimdCvt32.cs +++ b/ARMeilleure/Instructions/InstEmitSimdCvt32.cs @@ -323,6 +323,60 @@ namespace ARMeilleure.Instructions } } + // VRINTA (vector). + public static void Vrinta_V(ArmEmitterContext context) + { + EmitVectorUnaryOpF32(context, (m) => EmitRoundMathCall(context, MidpointRounding.AwayFromZero, m)); + } + + // VRINTM (vector). + public static void Vrintm_V(ArmEmitterContext context) + { + if (Optimizations.UseSse2) + { + EmitVectorUnaryOpSimd32(context, (m) => + { + return context.AddIntrinsic(Intrinsic.X86Roundps, m, Const(X86GetRoundControl(FPRoundingMode.TowardsMinusInfinity))); + }); + } + else + { + EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(Math.Floor), m)); + } + } + + // VRINTN (vector). + public static void Vrintn_V(ArmEmitterContext context) + { + if (Optimizations.UseSse2) + { + EmitVectorUnaryOpSimd32(context, (m) => + { + return context.AddIntrinsic(Intrinsic.X86Roundps, m, Const(X86GetRoundControl(FPRoundingMode.ToNearest))); + }); + } + else + { + EmitVectorUnaryOpF32(context, (m) => EmitRoundMathCall(context, MidpointRounding.ToEven, m)); + } + } + + // VRINTP (vector). + public static void Vrintp_V(ArmEmitterContext context) + { + if (Optimizations.UseSse2) + { + EmitVectorUnaryOpSimd32(context, (m) => + { + return context.AddIntrinsic(Intrinsic.X86Roundps, m, Const(X86GetRoundControl(FPRoundingMode.TowardsPlusInfinity))); + }); + } + else + { + EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(Math.Ceiling), m)); + } + } + // VRINTZ (floating-point). public static void Vrint_Z(ArmEmitterContext context) { diff --git a/ARMeilleure/Instructions/InstName.cs b/ARMeilleure/Instructions/InstName.cs index f2c95ae9..f7022f8e 100644 --- a/ARMeilleure/Instructions/InstName.cs +++ b/ARMeilleure/Instructions/InstName.cs @@ -636,6 +636,10 @@ namespace ARMeilleure.Instructions Vrev, Vrhadd, Vrint, + Vrinta, + Vrintm, + Vrintn, + Vrintp, Vrintx, Vrshr, Vrshrn, |
