From 44d9c6bf624797793e01c6d4471f6b15213f82a6 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Sat, 29 Jun 2024 22:21:41 -0700 Subject: [PATCH 1/2] Ensure mini-amd64 correctly handles CMP_GT and CMP_GE for OP_XCOMPARE_FP --- src/mono/mono/mini/mini-amd64.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/mini/mini-amd64.c b/src/mono/mono/mini/mini-amd64.c index 76b42da79296fe..29cdaab1c9a97e 100644 --- a/src/mono/mono/mini/mini-amd64.c +++ b/src/mono/mono/mini/mini-amd64.c @@ -4072,8 +4072,26 @@ mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb) case CMP_NE: ins->inst_c0 = 4; break; case CMP_LT: ins->inst_c0 = 1; break; case CMP_LE: ins->inst_c0 = 2; break; - case CMP_GT: ins->inst_c0 = 6; break; - case CMP_GE: ins->inst_c0 = 5; break; + case CMP_GT: { + // CMPNLT (5) is not the same as CMPGT due to NaN + // as such, we want to emit CMPLT (1) with swapped + // operands instead, ensuring we get correct handling + int tmp = ins->sreg1; + ins->sreg1 = ins->sreg2; + ins->sreg2 = tmp; + ins->inst_c0 = 1; + break; + } + case CMP_GE: { + // CMPNLE (6) is not the same as CMPGE due to NaN + // as such, we want to emit CMPLE (2) with swapped + // operands instead, ensuring we get correct handling + int tmp = ins->sreg1; + ins->sreg1 = ins->sreg2; + ins->sreg2 = tmp; + ins->inst_c0 = 2; + break; + } default: g_assert_not_reached(); break; From 9a8dc5cc465267a9e02023557b53307822182370 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Sat, 29 Jun 2024 22:24:45 -0700 Subject: [PATCH 2/2] Re-enable the tests disabled due to #97176 --- .../System.Runtime.Intrinsics/tests/Vectors/Vector128Tests.cs | 2 -- .../System.Runtime.Intrinsics/tests/Vectors/Vector256Tests.cs | 2 -- .../System.Runtime.Intrinsics/tests/Vectors/Vector512Tests.cs | 2 -- 3 files changed, 6 deletions(-) diff --git a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector128Tests.cs b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector128Tests.cs index ce4f1d8fcf3e65..0ae183839c611a 100644 --- a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector128Tests.cs +++ b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector128Tests.cs @@ -4826,7 +4826,6 @@ private static void TestCreateSequence(T start, T step) [Theory] [MemberData(nameof(VectorTestMemberData.ExpDouble), MemberType = typeof(VectorTestMemberData))] - [SkipOnMono("https://github.com/dotnet/runtime/issues/97176")] public void ExpDoubleTest(double value, double expectedResult, double variance) { Vector128 actualResult = Vector128.Exp(Vector128.Create(value)); @@ -4835,7 +4834,6 @@ public void ExpDoubleTest(double value, double expectedResult, double variance) [Theory] [MemberData(nameof(VectorTestMemberData.ExpSingle), MemberType = typeof(VectorTestMemberData))] - [SkipOnMono("https://github.com/dotnet/runtime/issues/97176")] public void ExpSingleTest(float value, float expectedResult, float variance) { Vector128 actualResult = Vector128.Exp(Vector128.Create(value)); diff --git a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector256Tests.cs b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector256Tests.cs index d264cd47771208..8fc41fc97f6317 100644 --- a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector256Tests.cs +++ b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector256Tests.cs @@ -5841,7 +5841,6 @@ private static void TestCreateSequence(T start, T step) [Theory] [MemberData(nameof(VectorTestMemberData.ExpDouble), MemberType = typeof(VectorTestMemberData))] - [SkipOnMono("https://github.com/dotnet/runtime/issues/97176")] public void ExpDoubleTest(double value, double expectedResult, double variance) { Vector256 actualResult = Vector256.Exp(Vector256.Create(value)); @@ -5850,7 +5849,6 @@ public void ExpDoubleTest(double value, double expectedResult, double variance) [Theory] [MemberData(nameof(VectorTestMemberData.ExpSingle), MemberType = typeof(VectorTestMemberData))] - [SkipOnMono("https://github.com/dotnet/runtime/issues/97176")] public void ExpSingleTest(float value, float expectedResult, float variance) { Vector256 actualResult = Vector256.Exp(Vector256.Create(value)); diff --git a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector512Tests.cs b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector512Tests.cs index 93ecf183070ecb..ac18da95a6623d 100644 --- a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector512Tests.cs +++ b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector512Tests.cs @@ -5274,7 +5274,6 @@ private static void TestCreateSequence(T start, T step) [Theory] [MemberData(nameof(VectorTestMemberData.ExpDouble), MemberType = typeof(VectorTestMemberData))] - [SkipOnMono("https://github.com/dotnet/runtime/issues/97176")] public void ExpDoubleTest(double value, double expectedResult, double variance) { Vector512 actualResult = Vector512.Exp(Vector512.Create(value)); @@ -5283,7 +5282,6 @@ public void ExpDoubleTest(double value, double expectedResult, double variance) [Theory] [MemberData(nameof(VectorTestMemberData.ExpSingle), MemberType = typeof(VectorTestMemberData))] - [SkipOnMono("https://github.com/dotnet/runtime/issues/97176")] public void ExpSingleTest(float value, float expectedResult, float variance) { Vector512 actualResult = Vector512.Exp(Vector512.Create(value));