diff options
| author | LDj3SNuD <35856442+LDj3SNuD@users.noreply.github.com> | 2019-05-30 02:29:24 +0200 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2019-05-29 21:29:24 -0300 |
| commit | 51ea6fa583fd52eabc5374b414e4052efab4128a (patch) | |
| tree | 88923ae5641b6ec5cb24237c1c264182e480a806 /ChocolArm64/Instructions/InstEmitSimdArithmetic.cs | |
| parent | 12badfffb94cc2dda128df4895668d1e2716de24 (diff) | |
Add Smaxv_V, Sminv_V, Umaxv_V, Uminv_V Inst.; add Tests. (#691)
* Update InstEmitSimdHelper.cs
* Update InstEmitSimdArithmetic.cs
* Update OpCodeTable.cs
* Update CpuTestSimd.cs
Diffstat (limited to 'ChocolArm64/Instructions/InstEmitSimdArithmetic.cs')
| -rw-r--r-- | ChocolArm64/Instructions/InstEmitSimdArithmetic.cs | 52 |
1 files changed, 37 insertions, 15 deletions
diff --git a/ChocolArm64/Instructions/InstEmitSimdArithmetic.cs b/ChocolArm64/Instructions/InstEmitSimdArithmetic.cs index 0e610bbb..8cf5c2c5 100644 --- a/ChocolArm64/Instructions/InstEmitSimdArithmetic.cs +++ b/ChocolArm64/Instructions/InstEmitSimdArithmetic.cs @@ -68,21 +68,7 @@ namespace ChocolArm64.Instructions public static void Addv_V(ILEmitterCtx context) { - OpCodeSimd64 op = (OpCodeSimd64)context.CurrOp; - - int bytes = op.GetBitsCount() >> 3; - int elems = bytes >> op.Size; - - EmitVectorExtractZx(context, op.Rn, 0, op.Size); - - for (int index = 1; index < elems; index++) - { - EmitVectorExtractZx(context, op.Rn, index, op.Size); - - context.Emit(OpCodes.Add); - } - - EmitScalarSet(context, op.Rd, op.Size); + EmitVectorAcrossVectorOpZx(context, () => context.Emit(OpCodes.Add)); } public static void Cls_V(ILEmitterCtx context) @@ -2388,6 +2374,15 @@ namespace ChocolArm64.Instructions EmitVectorPairwiseOpSx(context, () => context.EmitCall(mthdInfo)); } + public static void Smaxv_V(ILEmitterCtx context) + { + Type[] types = new Type[] { typeof(long), typeof(long) }; + + MethodInfo mthdInfo = typeof(Math).GetMethod(nameof(Math.Max), types); + + EmitVectorAcrossVectorOpSx(context, () => context.EmitCall(mthdInfo)); + } + public static void Smin_V(ILEmitterCtx context) { if (Optimizations.UseSse41) @@ -2429,6 +2424,15 @@ namespace ChocolArm64.Instructions EmitVectorPairwiseOpSx(context, () => context.EmitCall(mthdInfo)); } + public static void Sminv_V(ILEmitterCtx context) + { + Type[] types = new Type[] { typeof(long), typeof(long) }; + + MethodInfo mthdInfo = typeof(Math).GetMethod(nameof(Math.Min), types); + + EmitVectorAcrossVectorOpSx(context, () => context.EmitCall(mthdInfo)); + } + public static void Smlal_V(ILEmitterCtx context) { OpCodeSimdReg64 op = (OpCodeSimdReg64)context.CurrOp; @@ -3208,6 +3212,15 @@ namespace ChocolArm64.Instructions EmitVectorPairwiseOpZx(context, () => context.EmitCall(mthdInfo)); } + public static void Umaxv_V(ILEmitterCtx context) + { + Type[] types = new Type[] { typeof(ulong), typeof(ulong) }; + + MethodInfo mthdInfo = typeof(Math).GetMethod(nameof(Math.Max), types); + + EmitVectorAcrossVectorOpZx(context, () => context.EmitCall(mthdInfo)); + } + public static void Umin_V(ILEmitterCtx context) { if (Optimizations.UseSse41) @@ -3249,6 +3262,15 @@ namespace ChocolArm64.Instructions EmitVectorPairwiseOpZx(context, () => context.EmitCall(mthdInfo)); } + public static void Uminv_V(ILEmitterCtx context) + { + Type[] types = new Type[] { typeof(ulong), typeof(ulong) }; + + MethodInfo mthdInfo = typeof(Math).GetMethod(nameof(Math.Min), types); + + EmitVectorAcrossVectorOpZx(context, () => context.EmitCall(mthdInfo)); + } + public static void Umlal_V(ILEmitterCtx context) { OpCodeSimdReg64 op = (OpCodeSimdReg64)context.CurrOp; |
