diff --git a/src/coreclr/jit/lowerxarch.cpp b/src/coreclr/jit/lowerxarch.cpp index 8f3150e7e7b18..7c309288de1eb 100644 --- a/src/coreclr/jit/lowerxarch.cpp +++ b/src/coreclr/jit/lowerxarch.cpp @@ -4865,8 +4865,9 @@ GenTree* Lowering::LowerHWIntrinsicDot(GenTreeHWIntrinsic* node) horizontalAdd = NI_SSE3_HorizontalAdd; - if (!comp->compOpportunisticallyDependsOn(InstructionSet_SSE3)) + if ((simdSize == 8) || !comp->compOpportunisticallyDependsOn(InstructionSet_SSE3)) { + // We also do this for simdSize == 8 to ensure we broadcast the result as expected shuffle = NI_SSE_Shuffle; } break; @@ -4917,10 +4918,8 @@ GenTree* Lowering::LowerHWIntrinsicDot(GenTreeHWIntrinsic* node) horizontalAdd = NI_SSE3_HorizontalAdd; - if (!comp->compOpportunisticallyDependsOn(InstructionSet_SSE3)) - { - shuffle = NI_SSE2_Shuffle; - } + // We need to ensure we broadcast the result as expected + shuffle = NI_SSE2_Shuffle; break; } diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index b20cd585882b8..3deada8eec085 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -10724,16 +10724,6 @@ GenTree* Compiler::fgOptimizeHWIntrinsic(GenTreeHWIntrinsic* node) break; } -#if defined(TARGET_XARCH) - if ((node->GetSimdSize() == 8) && !compOpportunisticallyDependsOn(InstructionSet_SSE41)) - { - // When SSE4.1 isn't supported then Vector2 only needs a single horizontal add - // which means the result isn't broadcast across the entire vector and we can't - // optimize - break; - } -#endif // TARGET_XARCH - GenTree* op1 = node->Op(1); GenTree* sqrt = nullptr; GenTree* toScalar = nullptr; diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_99391/Runtime_99391.cs b/src/tests/JIT/Regression/JitBlue/Runtime_99391/Runtime_99391.cs new file mode 100644 index 0000000000000..6033a74cdd664 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_99391/Runtime_99391.cs @@ -0,0 +1,50 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Runtime.CompilerServices; +using System.Numerics; +using Xunit; + +public class Runtime_99391 +{ + [Fact] + public static void TestEntryPoint() + { + Vector2 result2a = Vector2.Normalize(Value2); + Assert.Equal(new Vector2(0, 1), result2a); + + Vector2 result2b = Vector2.Normalize(new Vector2(0, 2)); + Assert.Equal(new Vector2(0, 1), result2b); + + Vector3 result3a = Vector3.Normalize(Value3); + Assert.Equal(new Vector3(0, 0, 1), result3a); + + Vector3 result3b = Vector3.Normalize(new Vector3(0, 0, 2)); + Assert.Equal(new Vector3(0, 0, 1), result3b); + + Vector4 result4a = Vector4.Normalize(Value4); + Assert.Equal(new Vector4(0, 0, 0, 1), result4a); + + Vector4 result4b = Vector4.Normalize(new Vector4(0, 0, 0, 2)); + Assert.Equal(new Vector4(0, 0, 0, 1), result4b); + } + + private static Vector2 Value2 + { + [MethodImpl(MethodImplOptions.NoInlining)] + get => new Vector2(0, 2); + } + + private static Vector3 Value3 + { + [MethodImpl(MethodImplOptions.NoInlining)] + get => new Vector3(0, 0, 2); + } + + private static Vector4 Value4 + { + [MethodImpl(MethodImplOptions.NoInlining)] + get => new Vector4(0, 0, 0, 2); + } +} diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_99391/Runtime_99391.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_99391/Runtime_99391.csproj new file mode 100644 index 0000000000000..efa9e9b022442 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_99391/Runtime_99391.csproj @@ -0,0 +1,11 @@ + + + True + + + + + + + +