aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Instructions/InstEmitSimdCmp.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/Instructions/InstEmitSimdCmp.cs')
-rw-r--r--ARMeilleure/Instructions/InstEmitSimdCmp.cs85
1 files changed, 38 insertions, 47 deletions
diff --git a/ARMeilleure/Instructions/InstEmitSimdCmp.cs b/ARMeilleure/Instructions/InstEmitSimdCmp.cs
index d11adf19..ff97084b 100644
--- a/ARMeilleure/Instructions/InstEmitSimdCmp.cs
+++ b/ARMeilleure/Instructions/InstEmitSimdCmp.cs
@@ -288,49 +288,49 @@ namespace ARMeilleure.Instructions
public static void Facge_S(ArmEmitterContext context)
{
- if (Optimizations.FastFP && Optimizations.UseSse2)
+ if (Optimizations.FastFP && Optimizations.UseAvx)
{
- EmitSse2CmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: true, absolute: true);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: true, absolute: true);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareGE, SoftFloat64.FPCompareGE, scalar: true, absolute: true);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareGE), scalar: true, absolute: true);
}
}
public static void Facge_V(ArmEmitterContext context)
{
- if (Optimizations.FastFP && Optimizations.UseSse2)
+ if (Optimizations.FastFP && Optimizations.UseAvx)
{
- EmitSse2CmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: false, absolute: true);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: false, absolute: true);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareGE, SoftFloat64.FPCompareGE, scalar: false, absolute: true);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareGE), scalar: false, absolute: true);
}
}
public static void Facgt_S(ArmEmitterContext context)
{
- if (Optimizations.FastFP && Optimizations.UseSse2)
+ if (Optimizations.FastFP && Optimizations.UseAvx)
{
- EmitSse2CmpOpF(context, CmpCondition.GreaterThan, scalar: true, absolute: true);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThan, scalar: true, absolute: true);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareGT, SoftFloat64.FPCompareGT, scalar: true, absolute: true);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareGT), scalar: true, absolute: true);
}
}
public static void Facgt_V(ArmEmitterContext context)
{
- if (Optimizations.FastFP && Optimizations.UseSse2)
+ if (Optimizations.FastFP && Optimizations.UseAvx)
{
- EmitSse2CmpOpF(context, CmpCondition.GreaterThan, scalar: false, absolute: true);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThan, scalar: false, absolute: true);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareGT, SoftFloat64.FPCompareGT, scalar: false, absolute: true);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareGT), scalar: false, absolute: true);
}
}
@@ -348,11 +348,11 @@ namespace ARMeilleure.Instructions
{
if (Optimizations.FastFP && Optimizations.UseSse2)
{
- EmitSse2CmpOpF(context, CmpCondition.Equal, scalar: true);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.Equal, scalar: true);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareEQ, SoftFloat64.FPCompareEQ, scalar: true);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareEQ), scalar: true);
}
}
@@ -360,11 +360,11 @@ namespace ARMeilleure.Instructions
{
if (Optimizations.FastFP && Optimizations.UseSse2)
{
- EmitSse2CmpOpF(context, CmpCondition.Equal, scalar: false);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.Equal, scalar: false);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareEQ, SoftFloat64.FPCompareEQ, scalar: false);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareEQ), scalar: false);
}
}
@@ -372,11 +372,11 @@ namespace ARMeilleure.Instructions
{
if (Optimizations.FastFP && Optimizations.UseAvx)
{
- EmitSse2CmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: true);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: true);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareGE, SoftFloat64.FPCompareGE, scalar: true);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareGE), scalar: true);
}
}
@@ -384,11 +384,11 @@ namespace ARMeilleure.Instructions
{
if (Optimizations.FastFP && Optimizations.UseAvx)
{
- EmitSse2CmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: false);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThanOrEqual, scalar: false);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareGE, SoftFloat64.FPCompareGE, scalar: false);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareGE), scalar: false);
}
}
@@ -396,11 +396,11 @@ namespace ARMeilleure.Instructions
{
if (Optimizations.FastFP && Optimizations.UseAvx)
{
- EmitSse2CmpOpF(context, CmpCondition.GreaterThan, scalar: true);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThan, scalar: true);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareGT, SoftFloat64.FPCompareGT, scalar: true);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareGT), scalar: true);
}
}
@@ -408,11 +408,11 @@ namespace ARMeilleure.Instructions
{
if (Optimizations.FastFP && Optimizations.UseAvx)
{
- EmitSse2CmpOpF(context, CmpCondition.GreaterThan, scalar: false);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.GreaterThan, scalar: false);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareGT, SoftFloat64.FPCompareGT, scalar: false);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareGT), scalar: false);
}
}
@@ -420,11 +420,11 @@ namespace ARMeilleure.Instructions
{
if (Optimizations.FastFP && Optimizations.UseSse2)
{
- EmitSse2CmpOpF(context, CmpCondition.LessThanOrEqual, scalar: true);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.LessThanOrEqual, scalar: true);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareLE, SoftFloat64.FPCompareLE, scalar: true);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareLE), scalar: true);
}
}
@@ -432,11 +432,11 @@ namespace ARMeilleure.Instructions
{
if (Optimizations.FastFP && Optimizations.UseSse2)
{
- EmitSse2CmpOpF(context, CmpCondition.LessThanOrEqual, scalar: false);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.LessThanOrEqual, scalar: false);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareLE, SoftFloat64.FPCompareLE, scalar: false);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareLE), scalar: false);
}
}
@@ -444,11 +444,11 @@ namespace ARMeilleure.Instructions
{
if (Optimizations.FastFP && Optimizations.UseSse2)
{
- EmitSse2CmpOpF(context, CmpCondition.LessThan, scalar: true);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.LessThan, scalar: true);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareLT, SoftFloat64.FPCompareLT, scalar: true);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareLT), scalar: true);
}
}
@@ -456,11 +456,11 @@ namespace ARMeilleure.Instructions
{
if (Optimizations.FastFP && Optimizations.UseSse2)
{
- EmitSse2CmpOpF(context, CmpCondition.LessThan, scalar: false);
+ EmitSse2OrAvxCmpOpF(context, CmpCondition.LessThan, scalar: false);
}
else
{
- EmitCmpOpF(context, SoftFloat32.FPCompareLT, SoftFloat64.FPCompareLT, scalar: false);
+ EmitCmpOpF(context, nameof(SoftFloat32.FPCompareLT), scalar: false);
}
}
@@ -592,11 +592,7 @@ namespace ARMeilleure.Instructions
me = context.VectorExtract(type, GetVec(op.Rm), 0);
}
- Delegate dlg = op.Size != 0
- ? (Delegate)new _S32_F64_F64_Bool(SoftFloat64.FPCompare)
- : (Delegate)new _S32_F32_F32_Bool(SoftFloat32.FPCompare);
-
- Operand nzcv = context.Call(dlg, ne, me, Const(signalNaNs));
+ Operand nzcv = EmitSoftFloatCall(context, nameof(SoftFloat32.FPCompare), ne, me, Const(signalNaNs));
EmitSetNzcv(context, nzcv);
}
@@ -683,12 +679,7 @@ namespace ARMeilleure.Instructions
context.Copy(GetVec(op.Rd), res);
}
- private static void EmitCmpOpF(
- ArmEmitterContext context,
- _F32_F32_F32 f32,
- _F64_F64_F64 f64,
- bool scalar,
- bool absolute = false)
+ private static void EmitCmpOpF(ArmEmitterContext context, string name, bool scalar, bool absolute = false)
{
OpCodeSimd op = (OpCodeSimd)context.CurrOp;
@@ -716,11 +707,11 @@ namespace ARMeilleure.Instructions
if (absolute)
{
- ne = EmitUnaryMathCall(context, MathF.Abs, Math.Abs, ne);
- me = EmitUnaryMathCall(context, MathF.Abs, Math.Abs, me);
+ ne = EmitUnaryMathCall(context, nameof(Math.Abs), ne);
+ me = EmitUnaryMathCall(context, nameof(Math.Abs), me);
}
- Operand e = EmitSoftFloatCall(context, f32, f64, ne, me);
+ Operand e = EmitSoftFloatCall(context, name, ne, me);
res = context.VectorInsert(res, e, index);
}
@@ -728,7 +719,7 @@ namespace ARMeilleure.Instructions
context.Copy(GetVec(op.Rd), res);
}
- private static void EmitSse2CmpOpF(ArmEmitterContext context, CmpCondition cond, bool scalar, bool absolute = false)
+ private static void EmitSse2OrAvxCmpOpF(ArmEmitterContext context, CmpCondition cond, bool scalar, bool absolute = false)
{
OpCodeSimd op = (OpCodeSimd)context.CurrOp;