|
@@ -641,106 +641,34 @@ namespace ChocolArm64.Instruction
|
|
|
|
|
|
|
|
public static void Frecpe_S(AILEmitterCtx Context)
|
|
public static void Frecpe_S(AILEmitterCtx Context)
|
|
|
{
|
|
{
|
|
|
- EmitFrecpe(Context, 0, Scalar: true);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static void Frecpe_V(AILEmitterCtx Context)
|
|
|
|
|
- {
|
|
|
|
|
- AOpCodeSimd Op = (AOpCodeSimd)Context.CurrOp;
|
|
|
|
|
-
|
|
|
|
|
- int SizeF = Op.Size & 1;
|
|
|
|
|
-
|
|
|
|
|
- int Bytes = Context.CurrOp.GetBitsCount() >> 3;
|
|
|
|
|
-
|
|
|
|
|
- for (int Index = 0; Index < Bytes >> SizeF + 2; Index++)
|
|
|
|
|
- {
|
|
|
|
|
- EmitFrecpe(Context, Index, Scalar: false);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (Op.RegisterSize == ARegisterSize.SIMD64)
|
|
|
|
|
|
|
+ EmitScalarUnaryOpF(Context, () =>
|
|
|
{
|
|
{
|
|
|
- EmitVectorZeroUpper(Context, Op.Rd);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ EmitUnarySoftFloatCall(Context, nameof(ASoftFloat.RecipEstimate));
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private static void EmitFrecpe(AILEmitterCtx Context, int Index, bool Scalar)
|
|
|
|
|
|
|
+ public static void Frecpe_V(AILEmitterCtx Context)
|
|
|
{
|
|
{
|
|
|
- AOpCodeSimd Op = (AOpCodeSimd)Context.CurrOp;
|
|
|
|
|
-
|
|
|
|
|
- int SizeF = Op.Size & 1;
|
|
|
|
|
-
|
|
|
|
|
- if (SizeF == 0)
|
|
|
|
|
- {
|
|
|
|
|
- Context.EmitLdc_R4(1);
|
|
|
|
|
- }
|
|
|
|
|
- else /* if (SizeF == 1) */
|
|
|
|
|
- {
|
|
|
|
|
- Context.EmitLdc_R8(1);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- EmitVectorExtractF(Context, Op.Rn, Index, SizeF);
|
|
|
|
|
-
|
|
|
|
|
- Context.Emit(OpCodes.Div);
|
|
|
|
|
-
|
|
|
|
|
- if (Scalar)
|
|
|
|
|
|
|
+ EmitVectorUnaryOpF(Context, () =>
|
|
|
{
|
|
{
|
|
|
- EmitVectorZeroAll(Context, Op.Rd);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- EmitVectorInsertF(Context, Op.Rd, Index, SizeF);
|
|
|
|
|
|
|
+ EmitUnarySoftFloatCall(Context, nameof(ASoftFloat.RecipEstimate));
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public static void Frecps_S(AILEmitterCtx Context)
|
|
public static void Frecps_S(AILEmitterCtx Context)
|
|
|
{
|
|
{
|
|
|
- EmitFrecps(Context, 0, Scalar: true);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static void Frecps_V(AILEmitterCtx Context)
|
|
|
|
|
- {
|
|
|
|
|
- AOpCodeSimd Op = (AOpCodeSimd)Context.CurrOp;
|
|
|
|
|
-
|
|
|
|
|
- int SizeF = Op.Size & 1;
|
|
|
|
|
-
|
|
|
|
|
- int Bytes = Context.CurrOp.GetBitsCount() >> 3;
|
|
|
|
|
-
|
|
|
|
|
- for (int Index = 0; Index < Bytes >> SizeF + 2; Index++)
|
|
|
|
|
- {
|
|
|
|
|
- EmitFrecps(Context, Index, Scalar: false);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (Op.RegisterSize == ARegisterSize.SIMD64)
|
|
|
|
|
|
|
+ EmitScalarBinaryOpF(Context, () =>
|
|
|
{
|
|
{
|
|
|
- EmitVectorZeroUpper(Context, Op.Rd);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ EmitBinarySoftFloatCall(Context, nameof(ASoftFloat.RecipStep));
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private static void EmitFrecps(AILEmitterCtx Context, int Index, bool Scalar)
|
|
|
|
|
|
|
+ public static void Frecps_V(AILEmitterCtx Context)
|
|
|
{
|
|
{
|
|
|
- AOpCodeSimdReg Op = (AOpCodeSimdReg)Context.CurrOp;
|
|
|
|
|
-
|
|
|
|
|
- int SizeF = Op.Size & 1;
|
|
|
|
|
-
|
|
|
|
|
- if (SizeF == 0)
|
|
|
|
|
- {
|
|
|
|
|
- Context.EmitLdc_R4(2);
|
|
|
|
|
- }
|
|
|
|
|
- else /* if (SizeF == 1) */
|
|
|
|
|
- {
|
|
|
|
|
- Context.EmitLdc_R8(2);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- EmitVectorExtractF(Context, Op.Rn, Index, SizeF);
|
|
|
|
|
- EmitVectorExtractF(Context, Op.Rm, Index, SizeF);
|
|
|
|
|
-
|
|
|
|
|
- Context.Emit(OpCodes.Mul);
|
|
|
|
|
- Context.Emit(OpCodes.Sub);
|
|
|
|
|
-
|
|
|
|
|
- if (Scalar)
|
|
|
|
|
|
|
+ EmitVectorBinaryOpF(Context, () =>
|
|
|
{
|
|
{
|
|
|
- EmitVectorZeroAll(Context, Op.Rd);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- EmitVectorInsertF(Context, Op.Rd, Index, SizeF);
|
|
|
|
|
|
|
+ EmitBinarySoftFloatCall(Context, nameof(ASoftFloat.RecipStep));
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public static void Frinta_S(AILEmitterCtx Context)
|
|
public static void Frinta_S(AILEmitterCtx Context)
|