aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs')
-rw-r--r--ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs34
1 files changed, 34 insertions, 0 deletions
diff --git a/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs b/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
index 721fd7eb..bc7ed890 100644
--- a/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
+++ b/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
@@ -11,6 +11,35 @@ namespace ChocolArm64.Instruction
{
static partial class AInstEmit
{
+ public static void Abs_S(AILEmitterCtx Context)
+ {
+ EmitScalarUnaryOpSx(Context, () => EmitAbs(Context));
+ }
+
+ public static void Abs_V(AILEmitterCtx Context)
+ {
+ EmitVectorUnaryOpSx(Context, () => EmitAbs(Context));
+ }
+
+ private static void EmitAbs(AILEmitterCtx Context)
+ {
+ AILLabel LblTrue = new AILLabel();
+
+ Context.Emit(OpCodes.Dup);
+
+ Context.Emit(OpCodes.Ldc_I4_0);
+ Context.Emit(OpCodes.Bge_S, LblTrue);
+
+ Context.Emit(OpCodes.Neg);
+
+ Context.MarkLabel(LblTrue);
+ }
+
+ public static void Add_S(AILEmitterCtx Context)
+ {
+ EmitScalarBinaryOpZx(Context, () => Context.Emit(OpCodes.Add));
+ }
+
public static void Add_V(AILEmitterCtx Context)
{
EmitVectorBinaryOpZx(Context, () => Context.Emit(OpCodes.Add));
@@ -738,6 +767,11 @@ namespace ChocolArm64.Instruction
EmitVectorBinaryOpByElemZx(Context, () => Context.Emit(OpCodes.Mul));
}
+ public static void Neg_S(AILEmitterCtx Context)
+ {
+ EmitScalarUnaryOpSx(Context, () => Context.Emit(OpCodes.Neg));
+ }
+
public static void Neg_V(AILEmitterCtx Context)
{
EmitVectorUnaryOpSx(Context, () => Context.Emit(OpCodes.Neg));