diff --git a/src/libraries/System.Memory/tests/Span/Fill.cs b/src/libraries/System.Memory/tests/Span/Fill.cs index 331aefb4b845fd..9118b9980de91a 100644 --- a/src/libraries/System.Memory/tests/Span/Fill.cs +++ b/src/libraries/System.Memory/tests/Span/Fill.cs @@ -177,6 +177,7 @@ public static void FillWithRecognizedType() 0x1111111111111111, 0x2222222222222222, 0x3333333333333333, 0x4444444444444444, 0x5555555555555555, 0x6666666666666666, 0x7777777777777777, 0x8888888888888888)); // 512-bit struct, no SIMD RunTest(new("Hello world!")); // struct contains refs, no SIMD + RunTest(42); // nullable type static void RunTest(T value) { diff --git a/src/libraries/System.Private.CoreLib/src/System/SpanHelpers.T.cs b/src/libraries/System.Private.CoreLib/src/System/SpanHelpers.T.cs index df5427cd075dc4..c29adea608902a 100644 --- a/src/libraries/System.Private.CoreLib/src/System/SpanHelpers.T.cs +++ b/src/libraries/System.Private.CoreLib/src/System/SpanHelpers.T.cs @@ -29,62 +29,43 @@ public static unsafe void Fill(ref T refData, nuint numElements, T value) { // We have enough data for at least one vectorized write. - T tmp = value; // Avoid taking address of the "value" argument. It would regress performance of the loops below. Vector vector; if (sizeof(T) == 1) { - vector = new Vector(Unsafe.As(ref tmp)); + vector = new Vector(Unsafe.BitCast(value)); } else if (sizeof(T) == 2) { - vector = (Vector)(new Vector(Unsafe.As(ref tmp))); + vector = (Vector)new Vector(Unsafe.BitCast(value)); } else if (sizeof(T) == 4) { // special-case float since it's already passed in a SIMD reg vector = (typeof(T) == typeof(float)) - ? (Vector)(new Vector((float)(object)tmp!)) - : (Vector)(new Vector(Unsafe.As(ref tmp))); + ? (Vector)new Vector(Unsafe.BitCast(value)) + : (Vector)new Vector(Unsafe.BitCast(value)); } else if (sizeof(T) == 8) { // special-case double since it's already passed in a SIMD reg vector = (typeof(T) == typeof(double)) - ? (Vector)(new Vector((double)(object)tmp!)) - : (Vector)(new Vector(Unsafe.As(ref tmp))); + ? (Vector)new Vector(Unsafe.BitCast(value)) + : (Vector)new Vector(Unsafe.BitCast(value)); } - else if (sizeof(T) == 16) + else if (sizeof(T) == Vector.Count) { - Vector128 vec128 = Unsafe.As>(ref tmp); - if (Vector.Count == 16) - { - vector = vec128.AsVector(); - } - else if (Vector.Count == 32) - { - vector = Vector256.Create(vec128).AsVector(); - } - else if (Vector.Count == 64) - { - vector = Vector512.Create(vec128).AsVector(); - } - else - { - Debug.Fail("Vector is unexpected size."); - goto CannotVectorize; - } + vector = Unsafe.BitCast>(value); } - else if (sizeof(T) == 32) + else if (sizeof(T) == 16) { - Vector256 vec256 = Unsafe.As>(ref tmp); if (Vector.Count == 32) { - vector = vec256.AsVector(); + vector = Vector256.Create(Unsafe.BitCast>(value)).AsVector(); } else if (Vector.Count == 64) { - vector = Vector512.Create(vec256).AsVector(); + vector = Vector512.Create(Unsafe.BitCast>(value)).AsVector(); } else { @@ -92,11 +73,11 @@ public static unsafe void Fill(ref T refData, nuint numElements, T value) goto CannotVectorize; } } - else if (sizeof(T) == 64) + else if (sizeof(T) == 32) { if (Vector.Count == 64) { - vector = Unsafe.As>(ref tmp).AsVector(); + vector = Vector512.Create(Unsafe.BitCast>(value)).AsVector(); } else {