diff --git a/src/libraries/System.Numerics.Vectors/tests/Vector3Tests.cs b/src/libraries/System.Numerics.Vectors/tests/Vector3Tests.cs index bcc025d34f826f..79aac973e4751f 100644 --- a/src/libraries/System.Numerics.Vectors/tests/Vector3Tests.cs +++ b/src/libraries/System.Numerics.Vectors/tests/Vector3Tests.cs @@ -207,6 +207,17 @@ public void Vector3CrossTest1() Assert.True(MathHelper.Equal(expected, actual), "Vector3f.Cross did not return the expected value."); } + // A test for Cross (Vector3f, Vector3f) + // Cross test of the same parallel vector + [Fact] + public void Vector3CrossSameParallelVectors() + { + var v = new Vector3(-1, 1, 0); + var n = Vector3.Normalize(v); + var actual = Vector3.Cross(n, n); + Assert.Equal(Vector3.Zero, actual); + } + // A test for Distance (Vector3f, Vector3f) [Fact] public void Vector3DistanceTest() diff --git a/src/libraries/System.Private.CoreLib/src/System/Numerics/Vector3.cs b/src/libraries/System.Private.CoreLib/src/System/Numerics/Vector3.cs index 8a3633ccc42f42..6436f06a3f6824 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Numerics/Vector3.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Numerics/Vector3.cs @@ -471,13 +471,10 @@ public static Vector3 Cross(Vector3 vector1, Vector3 vector2) Vector128 v1 = vector1.AsVector128Unsafe(); Vector128 v2 = vector2.AsVector128Unsafe(); - Vector128 temp = Vector128.Shuffle(v1, Vector128.Create(1, 2, 0, 0)) * Vector128.Shuffle(v2, Vector128.Create(2, 0, 1, 0)); + Vector128 temp1 = Vector128.Shuffle(v1, Vector128.Create(1, 2, 0, 0)) * Vector128.Shuffle(v2, Vector128.Create(2, 0, 1, 0)); + Vector128 temp2 = Vector128.Shuffle(v1, Vector128.Create(2, 0, 1, 0)) * Vector128.Shuffle(v2, Vector128.Create(1, 2, 0, 0)); - return Vector128.MultiplyAddEstimate( - -Vector128.Shuffle(v1, Vector128.Create(2, 0, 1, 0)), - Vector128.Shuffle(v2, Vector128.Create(1, 2, 0, 0)), - temp - ).AsVector3(); + return (temp1 - temp2).AsVector3(); } ///