diff --git a/src/libraries/System.Runtime.Intrinsics/tests/Wasm/PackedSimdTests.cs b/src/libraries/System.Runtime.Intrinsics/tests/Wasm/PackedSimdTests.cs index b3694d7e8cf771..c15ce4d164f6a2 100644 --- a/src/libraries/System.Runtime.Intrinsics/tests/Wasm/PackedSimdTests.cs +++ b/src/libraries/System.Runtime.Intrinsics/tests/Wasm/PackedSimdTests.cs @@ -377,6 +377,35 @@ public unsafe void MinMaxSignedUnsignedTest() Assert.Equal((byte)0, unsignedMin.GetElement(0)); } + [Fact] + public unsafe void SplatTypes() + { + Assert.Equal(Vector128.Create(2.5f, 2.5f, 2.5f, 2.5f), PackedSimd.Splat(2.5f)); + Assert.Equal(Vector128.Create(-2, -2, -2, -2), PackedSimd.Splat(-2)); + Assert.Equal(Vector128.Create(2U, 2U, 2U, 2U), PackedSimd.Splat(2U)); + Assert.Equal(Vector128.Create(2.5, 2.5), PackedSimd.Splat(2.5)); + Assert.Equal(Vector128.Create(-2L, -2L), PackedSimd.Splat(-2L)); + Assert.Equal(Vector128.Create(2UL, 2UL), PackedSimd.Splat(2UL)); + Assert.Equal(Vector128.Create( + (byte)2, (byte)2, (byte)2, (byte)2, + (byte)2, (byte)2, (byte)2, (byte)2, + (byte)2, (byte)2, (byte)2, (byte)2, + (byte)2, (byte)2, (byte)2, (byte)2), PackedSimd.Splat((byte)2)); + Assert.Equal(Vector128.Create( + (sbyte)-2, (sbyte)-2, (sbyte)-2, (sbyte)-2, + (sbyte)-2, (sbyte)-2, (sbyte)-2, (sbyte)-2, + (sbyte)-2, (sbyte)-2, (sbyte)-2, (sbyte)-2, + (sbyte)-2, (sbyte)-2, (sbyte)-2, (sbyte)-2), PackedSimd.Splat((sbyte)-2)); + Assert.Equal(Vector128.Create( + (short)-2, (short)-2, (short)-2, (short)-2, + (short)-2, (short)-2, (short)-2, (short)-2), PackedSimd.Splat((short)-2)); + Assert.Equal(Vector128.Create( + (ushort)2, (ushort)2, (ushort)2, (ushort)2, + (ushort)2, (ushort)2, (ushort)2, (ushort)2), PackedSimd.Splat((ushort)2)); + Assert.Equal(Vector128.Create([(nint)2, (nint)2, (nint)2, (nint)2]), PackedSimd.Splat((nint)2)); + Assert.Equal(Vector128.Create([(nuint)2, (nuint)2, (nuint)2, (nuint)2]), PackedSimd.Splat((nuint)2)); + } + [Fact] public unsafe void LoadScalarAndSplatInfinityTest() { diff --git a/src/mono/mono/mini/interp/transform-simd.c b/src/mono/mono/mini/interp/transform-simd.c index c4a47db328cf9a..86fdbbf309c9ca 100644 --- a/src/mono/mono/mini/interp/transform-simd.c +++ b/src/mono/mono/mini/interp/transform-simd.c @@ -993,6 +993,8 @@ lookup_packedsimd_intrinsic (const char *name, MonoType *arg1) arg_type = mono_class_get_context (vector_klass)->class_inst->type_argv [0]; } else if (arg1->type == MONO_TYPE_PTR) { arg_type = m_type_data_get_type_unchecked (arg1); + } else if (MONO_TYPE_IS_VECTOR_PRIMITIVE(arg1)) { + arg_type = arg1; } else { // g_printf ("%s arg1 type was not pointer or simd type: %s\n", name, m_class_get_name (vector_klass)); return FALSE;