aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
diff options
context:
space:
mode:
authorLDj3SNuD <35856442+LDj3SNuD@users.noreply.github.com>2018-08-04 21:58:54 +0200
committergdkchan <gab.dark.100@gmail.com>2018-08-04 16:58:54 -0300
commit5f34353dce716bca2e3fc1c7e82be6276b95d61a (patch)
treeebd21bf7aa8a67b3b60321789e404c224c66c8f4 /ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
parentfa70629fabbab5074640f55cb70f9d7d82cf91cb (diff)
Add SQADD, UQADD, SQSUB, UQSUB, SUQADD, USQADD, SQABS, SQNEG (Scalar, Vector) instructions; add 24 Tests. Most saturation instructions now on ASoftFallback. (#314)
* Update AOpCodeTable.cs * Update AInstEmitSimdHelper.cs * Update AInstEmitSimdArithmetic.cs * Update Pseudocode.cs * Update Instructions.cs * Update CpuTestSimd.cs * Update CpuTestSimdReg.cs * Update AInstEmitSimdHelper.cs * Update AInstEmitSimdHelper.cs * Update AInstEmitSimdHelper.cs * Update AInstEmitSimdHelper.cs * Update ASoftFallback.cs * Update AInstEmitSimdHelper.cs * Update ASoftFallback.cs * Update AInstEmitSimdHelper.cs * Update CpuTestSimd.cs * Update CpuTestSimdReg.cs * Update ASoftFallback.cs * Update AInstEmitSimdHelper.cs * Opt. (retest).
Diffstat (limited to 'ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs')
-rw-r--r--ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs80
1 files changed, 80 insertions, 0 deletions
diff --git a/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs b/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
index 8e741861..6772fe83 100644
--- a/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
+++ b/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
@@ -1052,6 +1052,46 @@ namespace ChocolArm64.Instruction
EmitVectorWidenRnRmBinaryOpSx(Context, () => Context.Emit(OpCodes.Mul));
}
+ public static void Sqabs_S(AILEmitterCtx Context)
+ {
+ EmitScalarSaturatingUnaryOpSx(Context, () => EmitAbs(Context));
+ }
+
+ public static void Sqabs_V(AILEmitterCtx Context)
+ {
+ EmitVectorSaturatingUnaryOpSx(Context, () => EmitAbs(Context));
+ }
+
+ public static void Sqadd_S(AILEmitterCtx Context)
+ {
+ EmitScalarSaturatingBinaryOpSx(Context, SaturatingFlags.Add);
+ }
+
+ public static void Sqadd_V(AILEmitterCtx Context)
+ {
+ EmitVectorSaturatingBinaryOpSx(Context, SaturatingFlags.Add);
+ }
+
+ public static void Sqneg_S(AILEmitterCtx Context)
+ {
+ EmitScalarSaturatingUnaryOpSx(Context, () => Context.Emit(OpCodes.Neg));
+ }
+
+ public static void Sqneg_V(AILEmitterCtx Context)
+ {
+ EmitVectorSaturatingUnaryOpSx(Context, () => Context.Emit(OpCodes.Neg));
+ }
+
+ public static void Sqsub_S(AILEmitterCtx Context)
+ {
+ EmitScalarSaturatingBinaryOpSx(Context, SaturatingFlags.Sub);
+ }
+
+ public static void Sqsub_V(AILEmitterCtx Context)
+ {
+ EmitVectorSaturatingBinaryOpSx(Context, SaturatingFlags.Sub);
+ }
+
public static void Sqxtn_S(AILEmitterCtx Context)
{
EmitScalarSaturatingNarrowOpSxSx(Context, () => { });
@@ -1099,6 +1139,16 @@ namespace ChocolArm64.Instruction
EmitHighNarrow(Context, () => Context.Emit(OpCodes.Sub), Round: false);
}
+ public static void Suqadd_S(AILEmitterCtx Context)
+ {
+ EmitScalarSaturatingBinaryOpSx(Context, SaturatingFlags.Accumulate);
+ }
+
+ public static void Suqadd_V(AILEmitterCtx Context)
+ {
+ EmitVectorSaturatingBinaryOpSx(Context, SaturatingFlags.Accumulate);
+ }
+
public static void Uaba_V(AILEmitterCtx Context)
{
EmitVectorTernaryOpZx(Context, () =>
@@ -1221,6 +1271,26 @@ namespace ChocolArm64.Instruction
EmitVectorWidenRnRmBinaryOpZx(Context, () => Context.Emit(OpCodes.Mul));
}
+ public static void Uqadd_S(AILEmitterCtx Context)
+ {
+ EmitScalarSaturatingBinaryOpZx(Context, SaturatingFlags.Add);
+ }
+
+ public static void Uqadd_V(AILEmitterCtx Context)
+ {
+ EmitVectorSaturatingBinaryOpZx(Context, SaturatingFlags.Add);
+ }
+
+ public static void Uqsub_S(AILEmitterCtx Context)
+ {
+ EmitScalarSaturatingBinaryOpZx(Context, SaturatingFlags.Sub);
+ }
+
+ public static void Uqsub_V(AILEmitterCtx Context)
+ {
+ EmitVectorSaturatingBinaryOpZx(Context, SaturatingFlags.Sub);
+ }
+
public static void Uqxtn_S(AILEmitterCtx Context)
{
EmitScalarSaturatingNarrowOpZxZx(Context, () => { });
@@ -1231,6 +1301,16 @@ namespace ChocolArm64.Instruction
EmitVectorSaturatingNarrowOpZxZx(Context, () => { });
}
+ public static void Usqadd_S(AILEmitterCtx Context)
+ {
+ EmitScalarSaturatingBinaryOpZx(Context, SaturatingFlags.Accumulate);
+ }
+
+ public static void Usqadd_V(AILEmitterCtx Context)
+ {
+ EmitVectorSaturatingBinaryOpZx(Context, SaturatingFlags.Accumulate);
+ }
+
public static void Usubw_V(AILEmitterCtx Context)
{
EmitVectorWidenRmBinaryOpZx(Context, () => Context.Emit(OpCodes.Sub));