diff options
| author | LDj3SNuD <35856442+LDj3SNuD@users.noreply.github.com> | 2019-01-29 14:54:39 +0100 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2019-01-29 10:54:39 -0300 |
| commit | 8f7fcede7fa98c605925dc7b9316940960543bf1 (patch) | |
| tree | de8fa085c85ed8419abd25e04a707e007f180fe4 /ChocolArm64/Instructions/InstEmitSimdArithmetic.cs | |
| parent | 36b9ab0e48b6893c057a954e1ef3181b452add1c (diff) | |
Add Smlal_Ve, Smlsl_Ve, Smull_Ve, Umlal_Ve, Umlsl_Ve, Umull_Ve Inst.; add Tests. Add Sse Opt. for Trn1/2_V and Uzp1/2_V Inst. Nits. (#566)
* Update OpCodeTable.cs
* Update InstEmitSimdArithmetic.cs
* Update InstEmitSimdHelper.cs
* Update CpuTestSimdRegElem.cs
* Update InstEmitSimdMove.cs
* Update InstEmitSimdCvt.cs
* Update SoftFallback.cs
* Update InstEmitSimdHelper.cs
* Update SoftFloat.cs
* Update CryptoHelper.cs
* Update InstEmitSimdArithmetic.cs
* Update InstEmitSimdCmp.cs
* Address PR feedback.
* Address PR feedback.
Diffstat (limited to 'ChocolArm64/Instructions/InstEmitSimdArithmetic.cs')
| -rw-r--r-- | ChocolArm64/Instructions/InstEmitSimdArithmetic.cs | 97 |
1 files changed, 63 insertions, 34 deletions
diff --git a/ChocolArm64/Instructions/InstEmitSimdArithmetic.cs b/ChocolArm64/Instructions/InstEmitSimdArithmetic.cs index d1e71ecb..acb9f7f0 100644 --- a/ChocolArm64/Instructions/InstEmitSimdArithmetic.cs +++ b/ChocolArm64/Instructions/InstEmitSimdArithmetic.cs @@ -392,8 +392,7 @@ namespace ChocolArm64.Instructions public static void Fadd_S(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitScalarSseOrSse2OpF(context, nameof(Sse.AddScalar)); } @@ -408,8 +407,7 @@ namespace ChocolArm64.Instructions public static void Fadd_V(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitVectorSseOrSse2OpF(context, nameof(Sse.Add)); } @@ -470,8 +468,7 @@ namespace ChocolArm64.Instructions public static void Faddp_V(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitVectorPairwiseSseOrSse2OpF(context, nameof(Sse.Add)); } @@ -486,8 +483,7 @@ namespace ChocolArm64.Instructions public static void Fdiv_S(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitScalarSseOrSse2OpF(context, nameof(Sse.DivideScalar)); } @@ -502,8 +498,7 @@ namespace ChocolArm64.Instructions public static void Fdiv_V(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitVectorSseOrSse2OpF(context, nameof(Sse.Divide)); } @@ -564,8 +559,7 @@ namespace ChocolArm64.Instructions public static void Fmax_S(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitScalarSseOrSse2OpF(context, nameof(Sse.MaxScalar)); } @@ -580,8 +574,7 @@ namespace ChocolArm64.Instructions public static void Fmax_V(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitVectorSseOrSse2OpF(context, nameof(Sse.Max)); } @@ -612,8 +605,7 @@ namespace ChocolArm64.Instructions public static void Fmaxp_V(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitVectorPairwiseSseOrSse2OpF(context, nameof(Sse.Max)); } @@ -628,8 +620,7 @@ namespace ChocolArm64.Instructions public static void Fmin_S(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitScalarSseOrSse2OpF(context, nameof(Sse.MinScalar)); } @@ -644,8 +635,7 @@ namespace ChocolArm64.Instructions public static void Fmin_V(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitVectorSseOrSse2OpF(context, nameof(Sse.Min)); } @@ -676,8 +666,7 @@ namespace ChocolArm64.Instructions public static void Fminp_V(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitVectorPairwiseSseOrSse2OpF(context, nameof(Sse.Min)); } @@ -984,8 +973,7 @@ namespace ChocolArm64.Instructions public static void Fmul_S(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitScalarSseOrSse2OpF(context, nameof(Sse.MultiplyScalar)); } @@ -1005,8 +993,7 @@ namespace ChocolArm64.Instructions public static void Fmul_V(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitVectorSseOrSse2OpF(context, nameof(Sse.Multiply)); } @@ -1753,8 +1740,7 @@ namespace ChocolArm64.Instructions public static void Fsqrt_S(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitScalarSseOrSse2OpF(context, nameof(Sse.SqrtScalar)); } @@ -1769,8 +1755,7 @@ namespace ChocolArm64.Instructions public static void Fsqrt_V(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitVectorSseOrSse2OpF(context, nameof(Sse.Sqrt)); } @@ -1785,8 +1770,7 @@ namespace ChocolArm64.Instructions public static void Fsub_S(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitScalarSseOrSse2OpF(context, nameof(Sse.SubtractScalar)); } @@ -1801,8 +1785,7 @@ namespace ChocolArm64.Instructions public static void Fsub_V(ILEmitterCtx context) { - if (Optimizations.FastFP && Optimizations.UseSse - && Optimizations.UseSse2) + if (Optimizations.FastFP && Optimizations.UseSse2) { EmitVectorSseOrSse2OpF(context, nameof(Sse.Subtract)); } @@ -2268,6 +2251,15 @@ namespace ChocolArm64.Instructions } } + public static void Smlal_Ve(ILEmitterCtx context) + { + EmitVectorWidenTernaryOpByElemSx(context, () => + { + context.Emit(OpCodes.Mul); + context.Emit(OpCodes.Add); + }); + } + public static void Smlsl_V(ILEmitterCtx context) { OpCodeSimdReg64 op = (OpCodeSimdReg64)context.CurrOp; @@ -2319,11 +2311,25 @@ namespace ChocolArm64.Instructions } } + public static void Smlsl_Ve(ILEmitterCtx context) + { + EmitVectorWidenTernaryOpByElemSx(context, () => + { + context.Emit(OpCodes.Mul); + context.Emit(OpCodes.Sub); + }); + } + public static void Smull_V(ILEmitterCtx context) { EmitVectorWidenRnRmBinaryOpSx(context, () => context.Emit(OpCodes.Mul)); } + public static void Smull_Ve(ILEmitterCtx context) + { + EmitVectorWidenBinaryOpByElemSx(context, () => context.Emit(OpCodes.Mul)); + } + public static void Sqabs_S(ILEmitterCtx context) { EmitScalarSaturatingUnaryOpSx(context, () => EmitAbs(context)); @@ -2929,6 +2935,15 @@ namespace ChocolArm64.Instructions } } + public static void Umlal_Ve(ILEmitterCtx context) + { + EmitVectorWidenTernaryOpByElemZx(context, () => + { + context.Emit(OpCodes.Mul); + context.Emit(OpCodes.Add); + }); + } + public static void Umlsl_V(ILEmitterCtx context) { OpCodeSimdReg64 op = (OpCodeSimdReg64)context.CurrOp; @@ -2980,11 +2995,25 @@ namespace ChocolArm64.Instructions } } + public static void Umlsl_Ve(ILEmitterCtx context) + { + EmitVectorWidenTernaryOpByElemZx(context, () => + { + context.Emit(OpCodes.Mul); + context.Emit(OpCodes.Sub); + }); + } + public static void Umull_V(ILEmitterCtx context) { EmitVectorWidenRnRmBinaryOpZx(context, () => context.Emit(OpCodes.Mul)); } + public static void Umull_Ve(ILEmitterCtx context) + { + EmitVectorWidenBinaryOpByElemZx(context, () => context.Emit(OpCodes.Mul)); + } + public static void Uqadd_S(ILEmitterCtx context) { EmitScalarSaturatingBinaryOpZx(context, SaturatingFlags.Add); |
