aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/Instruction/AInstEmitSimdHelper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ChocolArm64/Instruction/AInstEmitSimdHelper.cs')
-rw-r--r--ChocolArm64/Instruction/AInstEmitSimdHelper.cs36
1 files changed, 36 insertions, 0 deletions
diff --git a/ChocolArm64/Instruction/AInstEmitSimdHelper.cs b/ChocolArm64/Instruction/AInstEmitSimdHelper.cs
index 75a5a0d0..171de43b 100644
--- a/ChocolArm64/Instruction/AInstEmitSimdHelper.cs
+++ b/ChocolArm64/Instruction/AInstEmitSimdHelper.cs
@@ -813,6 +813,42 @@ namespace ChocolArm64.Instruction
}
}
+ public static void EmitVectorPairwiseOpF(AILEmitterCtx Context, Action Emit)
+ {
+ AOpCodeSimdReg Op = (AOpCodeSimdReg)Context.CurrOp;
+
+ int SizeF = Op.Size & 1;
+
+ int Words = Op.GetBitsCount() >> 4;
+ int Pairs = Words >> SizeF + 2;
+
+ for (int Index = 0; Index < Pairs; Index++)
+ {
+ int Idx = Index << 1;
+
+ EmitVectorExtractF(Context, Op.Rn, Idx, SizeF);
+ EmitVectorExtractF(Context, Op.Rn, Idx + 1, SizeF);
+
+ Emit();
+
+ EmitVectorExtractF(Context, Op.Rm, Idx, SizeF);
+ EmitVectorExtractF(Context, Op.Rm, Idx + 1, SizeF);
+
+ Emit();
+
+ EmitVectorInsertTmpF(Context, Pairs + Index, SizeF);
+ EmitVectorInsertTmpF(Context, Index, SizeF);
+ }
+
+ Context.EmitLdvectmp();
+ Context.EmitStvec(Op.Rd);
+
+ if (Op.RegisterSize == ARegisterSize.SIMD64)
+ {
+ EmitVectorZeroUpper(Context, Op.Rd);
+ }
+ }
+
[Flags]
public enum SaturatingFlags
{