diff --git a/src/ImageSharp/Formats/Webp/Lossy/YuvConversion.cs b/src/ImageSharp/Formats/Webp/Lossy/YuvConversion.cs index d40b674e6..75a9963a5 100644 --- a/src/ImageSharp/Formats/Webp/Lossy/YuvConversion.cs +++ b/src/ImageSharp/Formats/Webp/Lossy/YuvConversion.cs @@ -714,9 +714,12 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossy // Convert 32 samples of YUV444 to R/G/B private static void ConvertYuv444ToRgbSse41(Span y, Span u, Span v, out Vector128 r, out Vector128 g, out Vector128 b) { - Vector128 y0 = LoadHigh(y); - Vector128 u0 = LoadHigh(u); - Vector128 v0 = LoadHigh(v); + Vector64 yTmp = Unsafe.As>(ref MemoryMarshal.GetReference(y)); + Vector64 uTmp = Unsafe.As>(ref MemoryMarshal.GetReference(u)); + Vector64 vTmp = Unsafe.As>(ref MemoryMarshal.GetReference(v)); + Vector128 y0 = LoadHigh(yTmp); + Vector128 u0 = LoadHigh(uTmp); + Vector128 v0 = LoadHigh(vTmp); Vector128 y1 = Sse2.MultiplyHigh(y0.AsUInt16(), K19077.AsUInt16()); Vector128 r0 = Sse2.MultiplyHigh(v0.AsUInt16(), K26149.AsUInt16()); @@ -742,11 +745,10 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossy // Load the bytes into the *upper* part of 16b words. That's "<< 8", basically. [MethodImpl(InliningOptions.ShortMethod)] - private static Vector128 LoadHigh(Span src) + private static Vector128 LoadHigh(Vector64 src) { - Vector64 tmp = Unsafe.As>(ref MemoryMarshal.GetReference(src)); - Vector128 tmp2 = Unsafe.As, Vector128>(ref tmp); - return Sse2.UnpackLow(Vector128.Zero, tmp2); + Vector128 tmp = Unsafe.As, Vector128>(ref src); + return Sse2.UnpackLow(Vector128.Zero, tmp); } #endif