From b58cc44db6cb48f3ddf87a749b651e2fa2369630 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Fri, 5 Feb 2021 11:43:40 -0800 Subject: [PATCH] Refactor TranscodeUtf8 to allow trimming of Vector128 --- .../src/System/Text/Unicode/Utf8Utility.Transcoding.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/Utf8Utility.Transcoding.cs b/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/Utf8Utility.Transcoding.cs index b0c1376611b9e7..ce8693b10517e7 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/Utf8Utility.Transcoding.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/Utf8Utility.Transcoding.cs @@ -882,7 +882,8 @@ public static OperationStatus TranscodeToUtf8(char* pInputBuffer, int inputLengt // vector is only used in those code paths, we leave it uninitialized if SSE4.1 // is not enabled. - Unsafe.SkipInit(out Vector128 nonAsciiUtf16DataMask); + Vector128 nonAsciiUtf16DataMask; + if (Sse41.X64.IsSupported || (AdvSimd.Arm64.IsSupported && BitConverter.IsLittleEndian)) { nonAsciiUtf16DataMask = Vector128.Create(unchecked((short)0xFF80)); // mask of non-ASCII bits in a UTF-16 char @@ -950,6 +951,10 @@ public static OperationStatus TranscodeToUtf8(char* pInputBuffer, int inputLengt Vector128 utf16Data; for (i = 0; (uint)i < maxIters; i++) { + // The linker won't trim out nonAsciiUtf16DataMask unless this is in the loop. + // Luckily, this is a nop and will be elided by the JIT + Unsafe.SkipInit(out nonAsciiUtf16DataMask); + utf16Data = Unsafe.ReadUnaligned>(pInputBuffer); if (AdvSimd.IsSupported)