Просмотр исходного кода

Add support for the FMLA (by element/scalar) instruction (#187)

* Add support for the FMLA (by element/scalar) instruction

* Fix encoding
gdkchan 7 лет назад
Родитель
Сommit
bc26aa558a

+ 1 - 0
ChocolArm64/AOpCodeTable.cs

@@ -271,6 +271,7 @@ namespace ChocolArm64
             SetA64("000111100x1xxxxx010110xxxxxxxxxx", AInstEmit.Fmin_S,        typeof(AOpCodeSimdReg));
             SetA64("0x0011101x1xxxxx111101xxxxxxxxxx", AInstEmit.Fmin_V,        typeof(AOpCodeSimdReg));
             SetA64("000111100x1xxxxx011110xxxxxxxxxx", AInstEmit.Fminnm_S,      typeof(AOpCodeSimdReg));
+            SetA64("010111111<<xxxxx0001x0xxxxxxxxxx", AInstEmit.Fmla_Se,       typeof(AOpCodeSimdRegElemF));
             SetA64("0>0011100<1xxxxx110011xxxxxxxxxx", AInstEmit.Fmla_V,        typeof(AOpCodeSimdReg));
             SetA64("0x0011111<<xxxxx0001x0xxxxxxxxxx", AInstEmit.Fmla_Ve,       typeof(AOpCodeSimdRegElemF));
             SetA64("0>0011101<1xxxxx110011xxxxxxxxxx", AInstEmit.Fmls_V,        typeof(AOpCodeSimdReg));

+ 9 - 0
ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs

@@ -516,6 +516,15 @@ namespace ChocolArm64.Instruction
             Fmin_S(Context);
         }
 
+        public static void Fmla_Se(AILEmitterCtx Context)
+        {
+            EmitScalarTernaryOpByElemF(Context, () =>
+            {
+                Context.Emit(OpCodes.Mul);
+                Context.Emit(OpCodes.Add);
+            });
+        }
+
         public static void Fmla_V(AILEmitterCtx Context)
         {
             EmitVectorTernaryOpF(Context, () =>

+ 7 - 0
ChocolArm64/Instruction/AInstEmitSimdHelper.cs

@@ -260,6 +260,13 @@ namespace ChocolArm64.Instruction
             EmitScalarOpByElemF(Context, Emit, Op.Index, Ternary: false);
         }
 
+        public static void EmitScalarTernaryOpByElemF(AILEmitterCtx Context, Action Emit)
+        {
+            AOpCodeSimdRegElemF Op = (AOpCodeSimdRegElemF)Context.CurrOp;
+
+            EmitScalarOpByElemF(Context, Emit, Op.Index, Ternary: true);
+        }
+
         public static void EmitScalarOpByElemF(AILEmitterCtx Context, Action Emit, int Elem, bool Ternary)
         {
             AOpCodeSimdReg Op = (AOpCodeSimdReg)Context.CurrOp;