From 5d956da492dc579cf34350af66c89e9a91a58f92 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Sat, 13 Jul 2024 11:25:33 -0700 Subject: [PATCH] Fix some small bugs in the Sin, Cos, and SinCos impls --- .../tests/GenericVectorTests.cs | 2 +- .../System/Runtime/Intrinsics/Vector128.cs | 6 ++-- .../System/Runtime/Intrinsics/Vector256.cs | 6 ++-- .../System/Runtime/Intrinsics/Vector512.cs | 4 +-- .../System/Runtime/Intrinsics/VectorMath.cs | 35 +++++++++---------- 5 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/libraries/System.Numerics.Vectors/tests/GenericVectorTests.cs b/src/libraries/System.Numerics.Vectors/tests/GenericVectorTests.cs index 14b1a2ec628336..dc13ea9c1117b1 100644 --- a/src/libraries/System.Numerics.Vectors/tests/GenericVectorTests.cs +++ b/src/libraries/System.Numerics.Vectors/tests/GenericVectorTests.cs @@ -4546,7 +4546,7 @@ public void CosDoubleTest(double value, double expectedResult, double variance) [Theory] [MemberData(nameof(GenericMathTestMemberData.CosSingle), MemberType = typeof(GenericMathTestMemberData))] - public void CosCosgleTest(float value, float expectedResult, float variance) + public void CosSingleTest(float value, float expectedResult, float variance) { Vector actualResult = Vector.Cos(Vector.Create(value)); AssertEqual(Vector.Create(expectedResult), actualResult, Vector.Create(variance)); diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector128.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector128.cs index 70c28d0924a83d..27bd7c10fa3e0f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector128.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector128.cs @@ -3207,7 +3207,7 @@ public static Vector128 Sin(Vector128 vector) { if (IsHardwareAccelerated) { - return VectorMath.CosDouble, Vector128>(vector); + return VectorMath.SinDouble, Vector128>(vector); } else { @@ -3226,11 +3226,11 @@ public static Vector128 Sin(Vector128 vector) { if (Vector256.IsHardwareAccelerated) { - return VectorMath.CosSingle, Vector128, Vector256, Vector256>(vector); + return VectorMath.SinSingle, Vector128, Vector256, Vector256>(vector); } else { - return VectorMath.CosSingle, Vector128, Vector128, Vector128>(vector); + return VectorMath.SinSingle, Vector128, Vector128, Vector128>(vector); } } else diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector256.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector256.cs index c90524a56bdee3..eb2aa61fce4ede 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector256.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector256.cs @@ -3090,7 +3090,7 @@ public static Vector256 Sin(Vector256 vector) { if (IsHardwareAccelerated) { - return VectorMath.CosDouble, Vector256>(vector); + return VectorMath.SinDouble, Vector256>(vector); } else { @@ -3109,11 +3109,11 @@ public static Vector256 Sin(Vector256 vector) { if (Vector512.IsHardwareAccelerated) { - return VectorMath.CosSingle, Vector256, Vector512, Vector512>(vector); + return VectorMath.SinSingle, Vector256, Vector512, Vector512>(vector); } else { - return VectorMath.CosSingle, Vector256, Vector256, Vector256>(vector); + return VectorMath.SinSingle, Vector256, Vector256, Vector256>(vector); } } else diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector512.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector512.cs index f5d3c0c1b9d6c8..8f12942a7cfc50 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector512.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector512.cs @@ -3131,7 +3131,7 @@ public static Vector512 Sin(Vector512 vector) { if (IsHardwareAccelerated) { - return VectorMath.CosDouble, Vector512>(vector); + return VectorMath.SinDouble, Vector512>(vector); } else { @@ -3148,7 +3148,7 @@ public static Vector512 Sin(Vector512 vector) { if (IsHardwareAccelerated) { - return VectorMath.CosSingle, Vector512, Vector512, Vector512>(vector); + return VectorMath.SinSingle, Vector512, Vector512, Vector512>(vector); } else { diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/VectorMath.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/VectorMath.cs index 066deab0dc4108..ee7ad95c5ad2c5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/VectorMath.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/VectorMath.cs @@ -211,30 +211,29 @@ public static TVectorSingle CosSingle(x); + TVectorInt32 ux = Unsafe.BitCast(ax); TVectorSingle result; - if (TVectorSingle.LessThanOrEqualAll(ax, TVectorSingle.Create(ARG_LARGE))) + if (TVectorInt32.LessThanOrEqualAll(ux, TVectorInt32.Create(ARG_LARGE))) { // We must be a finite value: (pi / 4) >= |x| if (TVectorInt32.GreaterThanAny(ux, TVectorInt32.Create(ARG_SMALL - 1))) { // at least one element is: |x| >= 2^-13 - TVectorSingle x2 = x * x; if (TVectorSingle.Count == TVectorDouble.Count) { result = Narrow( - CosSingleSmall(Widen(x2)) + CosSingleSmall(Widen(x)) ); } else { result = Narrow( - CosSingleSmall(WidenLower(x2)), - CosSingleSmall(WidenUpper(x2)) + CosSingleSmall(WidenLower(x)), + CosSingleSmall(WidenUpper(x)) ); } } @@ -1760,8 +1759,8 @@ public static (TVectorDouble Sin, TVectorDouble Cos) SinCosDouble(TVectorInt64.Equals(((sign & region) | (~sign & ~region)) & TVectorInt64.One, TVectorInt64.Zero)), - -sinResult, // negative in region 1 or 3, positive in region 0 or 2 - +sinResult // negative in region 0 or 2, positive in region 1 or 3 + +sinResult, // negative in region 1 or 3, positive in region 0 or 2 + -sinResult // negative in region 0 or 2, positive in region 1 or 3 ); cosResult = TVectorDouble.ConditionalSelect( @@ -1838,11 +1837,11 @@ public static (TVectorSingle Sin, TVectorSingle Cos) SinCosSingle(x); + TVectorInt32 ux = Unsafe.BitCast(ax); TVectorSingle sinResult, cosResult; - if (TVectorSingle.LessThanOrEqualAll(ax, TVectorSingle.Create(ARG_LARGE))) + if (TVectorInt32.LessThanOrEqualAll(ux, TVectorInt32.Create(ARG_LARGE))) { // We must be a finite value: (pi / 4) >= |x| @@ -1982,8 +1981,8 @@ public static (TVectorSingle Sin, TVectorSingle Cos) SinCosSingle(TVectorInt64.Equals(((sign & region) | (~sign & ~region)) & TVectorInt64.One, TVectorInt64.Zero)), - -sinResult, // negative in region 1 or 3, positive in region 0 or 2 - +sinResult // negative in region 0 or 2, positive in region 1 or 3 + +sinResult, // negative in region 1 or 3, positive in region 0 or 2 + -sinResult // negative in region 0 or 2, positive in region 1 or 3 ); cosResult = TVectorDouble.ConditionalSelect( @@ -2095,8 +2094,8 @@ public static TVectorDouble SinDouble(TVectorDouble result = TVectorDouble.ConditionalSelect( Unsafe.BitCast(TVectorInt64.Equals(((sign & region) | (~sign & ~region)) & TVectorInt64.One, TVectorInt64.Zero)), - -result, // negative in region 1 or 3, positive in region 0 or 2 - +result // negative in region 0 or 2, positive in region 1 or 3 + +result, // negative in region 1 or 3, positive in region 0 or 2 + -result // negative in region 0 or 2, positive in region 1 or 3 ); // Propagate the NaN that was passed in @@ -2183,11 +2182,11 @@ public static TVectorSingle SinSingle(x); + TVectorInt32 ux = Unsafe.BitCast(ax); TVectorSingle result; - if (TVectorSingle.LessThanOrEqualAll(ax, TVectorSingle.Create(ARG_LARGE))) + if (TVectorInt32.LessThanOrEqualAll(ux, TVectorInt32.Create(ARG_LARGE))) { // We must be a finite value: (pi / 4) >= |x| @@ -2274,8 +2273,8 @@ static TVectorDouble CoreImpl(TVectorDouble x) return TVectorDouble.ConditionalSelect( Unsafe.BitCast(TVectorInt64.Equals(((sign & region) | (~sign & ~region)) & TVectorInt64.One, TVectorInt64.Zero)), - -result, // negative in region 1 or 3, positive in region 0 or 2 - +result // negative in region 0 or 2, positive in region 1 or 3 + +result, // negative in region 1 or 3, positive in region 0 or 2 + -result // negative in region 0 or 2, positive in region 1 or 3 ); } }