@ -27,36 +27,6 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
private const double Log2Reciprocal = 1.44269504088896338700465094007086 ;
#if SUPPORTS_RUNTIME_INTRINSICS
private static readonly Vector256 < byte > AddGreenToBlueAndRedMaskAvx2 = Vector256 . Create ( 1 , 2 5 5 , 1 , 2 5 5 , 5 , 2 5 5 , 5 , 2 5 5 , 9 , 2 5 5 , 9 , 2 5 5 , 1 3 , 2 5 5 , 1 3 , 2 5 5 , 1 7 , 2 5 5 , 1 7 , 2 5 5 , 2 1 , 2 5 5 , 2 1 , 2 5 5 , 2 5 , 2 5 5 , 2 5 , 2 5 5 , 2 9 , 2 5 5 , 2 9 , 2 5 5 ) ;
private static readonly Vector128 < byte > AddGreenToBlueAndRedMaskSsse3 = Vector128 . Create ( 1 , 2 5 5 , 1 , 2 5 5 , 5 , 2 5 5 , 5 , 2 5 5 , 9 , 2 5 5 , 9 , 2 5 5 , 1 3 , 2 5 5 , 1 3 , 2 5 5 ) ;
private static readonly byte AddGreenToBlueAndRedShuffleMask = SimdUtils . Shuffle . MmShuffle ( 2 , 2 , 0 , 0 ) ;
private static readonly Vector256 < byte > SubtractGreenFromBlueAndRedMaskAvx2 = Vector256 . Create ( 1 , 2 5 5 , 1 , 2 5 5 , 5 , 2 5 5 , 5 , 2 5 5 , 9 , 2 5 5 , 9 , 2 5 5 , 1 3 , 2 5 5 , 1 3 , 2 5 5 , 1 7 , 2 5 5 , 1 7 , 2 5 5 , 2 1 , 2 5 5 , 2 1 , 2 5 5 , 2 5 , 2 5 5 , 2 5 , 2 5 5 , 2 9 , 2 5 5 , 2 9 , 2 5 5 ) ;
private static readonly Vector128 < byte > SubtractGreenFromBlueAndRedMaskSsse3 = Vector128 . Create ( 1 , 2 5 5 , 1 , 2 5 5 , 5 , 2 5 5 , 5 , 2 5 5 , 9 , 2 5 5 , 9 , 2 5 5 , 1 3 , 2 5 5 , 1 3 , 2 5 5 ) ;
private static readonly byte SubtractGreenFromBlueAndRedShuffleMask = SimdUtils . Shuffle . MmShuffle ( 2 , 2 , 0 , 0 ) ;
private static readonly Vector128 < byte > TransformColorAlphaGreenMask = Vector128 . Create ( 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 ) ;
private static readonly Vector256 < byte > TransformColorAlphaGreenMask256 = Vector256 . Create ( 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 ) ;
private static readonly Vector128 < byte > TransformColorRedBlueMask = Vector128 . Create ( 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 ) ;
private static readonly Vector256 < byte > TransformColorRedBlueMask256 = Vector256 . Create ( 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 ) ;
private static readonly byte TransformColorShuffleMask = SimdUtils . Shuffle . MmShuffle ( 2 , 2 , 0 , 0 ) ;
private static readonly Vector128 < byte > TransformColorInverseAlphaGreenMask = Vector128 . Create ( 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 ) ;
private static readonly Vector256 < byte > TransformColorInverseAlphaGreenMask256 = Vector256 . Create ( 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 ) ;
private static readonly byte TransformColorInverseShuffleMask = SimdUtils . Shuffle . MmShuffle ( 2 , 2 , 0 , 0 ) ;
#endif
/// <summary>
/// Returns the exact index where array1 and array2 are different. For an index
/// inferior or equal to bestLenMatch, the return value just has to be strictly
@ -129,13 +99,14 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
#if SUPPORTS_RUNTIME_INTRINSICS
if ( Avx2 . IsSupported )
{
Vector256 < byte > addGreenToBlueAndRedMaskAvx2 = Vector256 . Create ( 1 , 2 5 5 , 1 , 2 5 5 , 5 , 2 5 5 , 5 , 2 5 5 , 9 , 2 5 5 , 9 , 2 5 5 , 1 3 , 2 5 5 , 1 3 , 2 5 5 , 1 7 , 2 5 5 , 1 7 , 2 5 5 , 2 1 , 2 5 5 , 2 1 , 2 5 5 , 2 5 , 2 5 5 , 2 5 , 2 5 5 , 2 9 , 2 5 5 , 2 9 , 2 5 5 ) ;
int numPixels = pixelData . Length ;
nint i ;
for ( i = 0 ; i < = numPixels - 8 ; i + = 8 )
{
ref uint pos = ref Unsafe . Add ( ref MemoryMarshal . GetReference ( pixelData ) , i ) ;
Vector256 < byte > input = Unsafe . As < uint , Vector256 < uint > > ( ref pos ) . AsByte ( ) ;
Vector256 < byte > in0g0g = Avx2 . Shuffle ( input , A ddGreenToBlueAndRedMaskAvx2) ;
Vector256 < byte > in0g0g = Avx2 . Shuffle ( input , a ddGreenToBlueAndRedMaskAvx2) ;
Vector256 < byte > output = Avx2 . Add ( input , in0g0g ) ;
Unsafe . As < uint , Vector256 < uint > > ( ref pos ) = output . AsUInt32 ( ) ;
}
@ -147,13 +118,14 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
}
else if ( Ssse3 . IsSupported )
{
Vector128 < byte > addGreenToBlueAndRedMaskSsse3 = Vector128 . Create ( 1 , 2 5 5 , 1 , 2 5 5 , 5 , 2 5 5 , 5 , 2 5 5 , 9 , 2 5 5 , 9 , 2 5 5 , 1 3 , 2 5 5 , 1 3 , 2 5 5 ) ;
int numPixels = pixelData . Length ;
nint i ;
for ( i = 0 ; i < = numPixels - 4 ; i + = 4 )
{
ref uint pos = ref Unsafe . Add ( ref MemoryMarshal . GetReference ( pixelData ) , i ) ;
Vector128 < byte > input = Unsafe . As < uint , Vector128 < uint > > ( ref pos ) . AsByte ( ) ;
Vector128 < byte > in0g0g = Ssse3 . Shuffle ( input , A ddGreenToBlueAndRedMaskSsse3) ;
Vector128 < byte > in0g0g = Ssse3 . Shuffle ( input , a ddGreenToBlueAndRedMaskSsse3) ;
Vector128 < byte > output = Sse2 . Add ( input , in0g0g ) ;
Unsafe . As < uint , Vector128 < uint > > ( ref pos ) = output . AsUInt32 ( ) ;
}
@ -169,11 +141,13 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
nint i ;
for ( i = 0 ; i < = numPixels - 4 ; i + = 4 )
{
const byte mmShuffle_2200 = 0 b_10_10_00_00 ;
ref uint pos = ref Unsafe . Add ( ref MemoryMarshal . GetReference ( pixelData ) , i ) ;
Vector128 < byte > input = Unsafe . As < uint , Vector128 < uint > > ( ref pos ) . AsByte ( ) ;
Vector128 < ushort > a = Sse2 . ShiftRightLogical ( input . AsUInt16 ( ) , 8 ) ; // 0 a 0 g
Vector128 < ushort > b = Sse2 . ShuffleLow ( a , AddGreenToBlueAndRedShuffleMask ) ;
Vector128 < ushort > c = Sse2 . ShuffleHigh ( b , AddGreenToBlueAndRedShuffleMask ) ; // 0g0g
Vector128 < ushort > b = Sse2 . ShuffleLow ( a , mmShuffle_2200 ) ;
Vector128 < ushort > c = Sse2 . ShuffleHigh ( b , mmShuffle_2200 ) ; // 0g0g
Vector128 < byte > output = Sse2 . Add ( input . AsByte ( ) , c . AsByte ( ) ) ;
Unsafe . As < uint , Vector128 < uint > > ( ref pos ) = output . AsUInt32 ( ) ;
}
@ -209,13 +183,14 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
#if SUPPORTS_RUNTIME_INTRINSICS
if ( Avx2 . IsSupported )
{
Vector256 < byte > subtractGreenFromBlueAndRedMaskAvx2 = Vector256 . Create ( 1 , 2 5 5 , 1 , 2 5 5 , 5 , 2 5 5 , 5 , 2 5 5 , 9 , 2 5 5 , 9 , 2 5 5 , 1 3 , 2 5 5 , 1 3 , 2 5 5 , 1 7 , 2 5 5 , 1 7 , 2 5 5 , 2 1 , 2 5 5 , 2 1 , 2 5 5 , 2 5 , 2 5 5 , 2 5 , 2 5 5 , 2 9 , 2 5 5 , 2 9 , 2 5 5 ) ;
int numPixels = pixelData . Length ;
nint i ;
for ( i = 0 ; i < = numPixels - 8 ; i + = 8 )
{
ref uint pos = ref Unsafe . Add ( ref MemoryMarshal . GetReference ( pixelData ) , i ) ;
Vector256 < byte > input = Unsafe . As < uint , Vector256 < uint > > ( ref pos ) . AsByte ( ) ;
Vector256 < byte > in0g0g = Avx2 . Shuffle ( input , S ubtractGreenFromBlueAndRedMaskAvx2) ;
Vector256 < byte > in0g0g = Avx2 . Shuffle ( input , s ubtractGreenFromBlueAndRedMaskAvx2) ;
Vector256 < byte > output = Avx2 . Subtract ( input , in0g0g ) ;
Unsafe . As < uint , Vector256 < uint > > ( ref pos ) = output . AsUInt32 ( ) ;
}
@ -227,13 +202,14 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
}
else if ( Ssse3 . IsSupported )
{
Vector128 < byte > subtractGreenFromBlueAndRedMaskSsse3 = Vector128 . Create ( 1 , 2 5 5 , 1 , 2 5 5 , 5 , 2 5 5 , 5 , 2 5 5 , 9 , 2 5 5 , 9 , 2 5 5 , 1 3 , 2 5 5 , 1 3 , 2 5 5 ) ;
int numPixels = pixelData . Length ;
nint i ;
for ( i = 0 ; i < = numPixels - 4 ; i + = 4 )
{
ref uint pos = ref Unsafe . Add ( ref MemoryMarshal . GetReference ( pixelData ) , i ) ;
Vector128 < byte > input = Unsafe . As < uint , Vector128 < uint > > ( ref pos ) . AsByte ( ) ;
Vector128 < byte > in0g0g = Ssse3 . Shuffle ( input , S ubtractGreenFromBlueAndRedMaskSsse3) ;
Vector128 < byte > in0g0g = Ssse3 . Shuffle ( input , s ubtractGreenFromBlueAndRedMaskSsse3) ;
Vector128 < byte > output = Sse2 . Subtract ( input , in0g0g ) ;
Unsafe . As < uint , Vector128 < uint > > ( ref pos ) = output . AsUInt32 ( ) ;
}
@ -249,11 +225,13 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
nint i ;
for ( i = 0 ; i < = numPixels - 4 ; i + = 4 )
{
const byte mmShuffle_2200 = 0 b_10_10_00_00 ;
ref uint pos = ref Unsafe . Add ( ref MemoryMarshal . GetReference ( pixelData ) , i ) ;
Vector128 < byte > input = Unsafe . As < uint , Vector128 < uint > > ( ref pos ) . AsByte ( ) ;
Vector128 < ushort > a = Sse2 . ShiftRightLogical ( input . AsUInt16 ( ) , 8 ) ; // 0 a 0 g
Vector128 < ushort > b = Sse2 . ShuffleLow ( a , SubtractGreenFromBlueAndRedShuffleMask ) ;
Vector128 < ushort > c = Sse2 . ShuffleHigh ( b , SubtractGreenFromBlueAndRedShuffleMask ) ; // 0g0g
Vector128 < ushort > b = Sse2 . ShuffleLow ( a , mmShuffle_2200 ) ;
Vector128 < ushort > c = Sse2 . ShuffleHigh ( b , mmShuffle_2200 ) ; // 0g0g
Vector128 < byte > output = Sse2 . Subtract ( input . AsByte ( ) , c . AsByte ( ) ) ;
Unsafe . As < uint , Vector128 < uint > > ( ref pos ) = output . AsUInt32 ( ) ;
}
@ -400,23 +378,27 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
#if SUPPORTS_RUNTIME_INTRINSICS
if ( Avx2 . IsSupported & & numPixels > = 8 )
{
Vector256 < byte > transformColorAlphaGreenMask256 = Vector256 . Create ( 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 ) ;
Vector256 < byte > transformColorRedBlueMask256 = Vector256 . Create ( 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 ) ;
Vector256 < int > multsrb = MkCst32 ( Cst5b ( m . GreenToRed ) , Cst5b ( m . GreenToBlue ) ) ;
Vector256 < int > multsb2 = MkCst32 ( Cst5b ( m . RedToBlue ) , 0 ) ;
nint idx ;
for ( idx = 0 ; idx < = numPixels - 8 ; idx + = 8 )
{
const byte mmShuffle_2200 = 0 b_10_10_00_00 ;
ref uint pos = ref Unsafe . Add ( ref MemoryMarshal . GetReference ( pixelData ) , idx ) ;
Vector256 < uint > input = Unsafe . As < uint , Vector256 < uint > > ( ref pos ) ;
Vector256 < byte > a = Avx2 . And ( input . AsByte ( ) , T ransformColorAlphaGreenMask256) ;
Vector256 < short > b = Avx2 . ShuffleLow ( a . AsInt16 ( ) , TransformColorShuffleMask ) ;
Vector256 < short > c = Avx2 . ShuffleHigh ( b . AsInt16 ( ) , TransformColorShuffleMask ) ;
Vector256 < byte > a = Avx2 . And ( input . AsByte ( ) , t ransformColorAlphaGreenMask256) ;
Vector256 < short > b = Avx2 . ShuffleLow ( a . AsInt16 ( ) , mmShuffle_2200 ) ;
Vector256 < short > c = Avx2 . ShuffleHigh ( b . AsInt16 ( ) , mmShuffle_2200 ) ;
Vector256 < short > d = Avx2 . MultiplyHigh ( c . AsInt16 ( ) , multsrb . AsInt16 ( ) ) ;
Vector256 < short > e = Avx2 . ShiftLeftLogical ( input . AsInt16 ( ) , 8 ) ;
Vector256 < short > f = Avx2 . MultiplyHigh ( e . AsInt16 ( ) , multsb2 . AsInt16 ( ) ) ;
Vector256 < int > g = Avx2 . ShiftRightLogical ( f . AsInt32 ( ) , 1 6 ) ;
Vector256 < byte > h = Avx2 . Add ( g . AsByte ( ) , d . AsByte ( ) ) ;
Vector256 < byte > i = Avx2 . And ( h , T ransformColorRedBlueMask256) ;
Vector256 < byte > i = Avx2 . And ( h , t ransformColorRedBlueMask256) ;
Vector256 < byte > output = Avx2 . Subtract ( input . AsByte ( ) , i ) ;
Unsafe . As < uint , Vector256 < uint > > ( ref pos ) = output . AsUInt32 ( ) ;
}
@ -428,22 +410,26 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
}
else if ( Sse2 . IsSupported )
{
Vector128 < byte > transformColorAlphaGreenMask = Vector128 . Create ( 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 ) ;
Vector128 < byte > transformColorRedBlueMask = Vector128 . Create ( 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 ) ;
Vector128 < int > multsrb = MkCst16 ( Cst5b ( m . GreenToRed ) , Cst5b ( m . GreenToBlue ) ) ;
Vector128 < int > multsb2 = MkCst16 ( Cst5b ( m . RedToBlue ) , 0 ) ;
nint idx ;
for ( idx = 0 ; idx < = numPixels - 4 ; idx + = 4 )
{
const byte mmShuffle_2200 = 0 b_10_10_00_00 ;
ref uint pos = ref Unsafe . Add ( ref MemoryMarshal . GetReference ( pixelData ) , idx ) ;
Vector128 < uint > input = Unsafe . As < uint , Vector128 < uint > > ( ref pos ) ;
Vector128 < byte > a = Sse2 . And ( input . AsByte ( ) , T ransformColorAlphaGreenMask) ;
Vector128 < short > b = Sse2 . ShuffleLow ( a . AsInt16 ( ) , TransformColorShuffleMask ) ;
Vector128 < short > c = Sse2 . ShuffleHigh ( b . AsInt16 ( ) , TransformColorShuffleMask ) ;
Vector128 < byte > a = Sse2 . And ( input . AsByte ( ) , t ransformColorAlphaGreenMask) ;
Vector128 < short > b = Sse2 . ShuffleLow ( a . AsInt16 ( ) , mmShuffle_2200 ) ;
Vector128 < short > c = Sse2 . ShuffleHigh ( b . AsInt16 ( ) , mmShuffle_2200 ) ;
Vector128 < short > d = Sse2 . MultiplyHigh ( c . AsInt16 ( ) , multsrb . AsInt16 ( ) ) ;
Vector128 < short > e = Sse2 . ShiftLeftLogical ( input . AsInt16 ( ) , 8 ) ;
Vector128 < short > f = Sse2 . MultiplyHigh ( e . AsInt16 ( ) , multsb2 . AsInt16 ( ) ) ;
Vector128 < int > g = Sse2 . ShiftRightLogical ( f . AsInt32 ( ) , 1 6 ) ;
Vector128 < byte > h = Sse2 . Add ( g . AsByte ( ) , d . AsByte ( ) ) ;
Vector128 < byte > i = Sse2 . And ( h , T ransformColorRedBlueMask) ;
Vector128 < byte > i = Sse2 . And ( h , t ransformColorRedBlueMask) ;
Vector128 < byte > output = Sse2 . Subtract ( input . AsByte ( ) , i ) ;
Unsafe . As < uint , Vector128 < uint > > ( ref pos ) = output . AsUInt32 ( ) ;
}
@ -488,16 +474,19 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
#if SUPPORTS_RUNTIME_INTRINSICS
if ( Avx2 . IsSupported & & pixelData . Length > = 8 )
{
Vector256 < byte > transformColorInverseAlphaGreenMask256 = Vector256 . Create ( 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 ) ;
Vector256 < int > multsrb = MkCst32 ( Cst5b ( m . GreenToRed ) , Cst5b ( m . GreenToBlue ) ) ;
Vector256 < int > multsb2 = MkCst32 ( Cst5b ( m . RedToBlue ) , 0 ) ;
nint idx ;
for ( idx = 0 ; idx < = pixelData . Length - 8 ; idx + = 8 )
{
const byte mmShuffle_2200 = 0 b_10_10_00_00 ;
ref uint pos = ref Unsafe . Add ( ref MemoryMarshal . GetReference ( pixelData ) , idx ) ;
Vector256 < uint > input = Unsafe . As < uint , Vector256 < uint > > ( ref pos ) ;
Vector256 < byte > a = Avx2 . And ( input . AsByte ( ) , T ransformColorInverseAlphaGreenMask256) ;
Vector256 < short > b = Avx2 . ShuffleLow ( a . AsInt16 ( ) , TransformColorInverseShuffleMask ) ;
Vector256 < short > c = Avx2 . ShuffleHigh ( b . AsInt16 ( ) , TransformColorInverseShuffleMask ) ;
Vector256 < byte > a = Avx2 . And ( input . AsByte ( ) , t ransformColorInverseAlphaGreenMask256) ;
Vector256 < short > b = Avx2 . ShuffleLow ( a . AsInt16 ( ) , mmShuffle_2200 ) ;
Vector256 < short > c = Avx2 . ShuffleHigh ( b . AsInt16 ( ) , mmShuffle_2200 ) ;
Vector256 < short > d = Avx2 . MultiplyHigh ( c . AsInt16 ( ) , multsrb . AsInt16 ( ) ) ;
Vector256 < byte > e = Avx2 . Add ( input . AsByte ( ) , d . AsByte ( ) ) ;
Vector256 < short > f = Avx2 . ShiftLeftLogical ( e . AsInt16 ( ) , 8 ) ;
@ -516,17 +505,20 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
}
else if ( Sse2 . IsSupported )
{
Vector128 < byte > transformColorInverseAlphaGreenMask = Vector128 . Create ( 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 , 0 , 2 5 5 ) ;
Vector128 < int > multsrb = MkCst16 ( Cst5b ( m . GreenToRed ) , Cst5b ( m . GreenToBlue ) ) ;
Vector128 < int > multsb2 = MkCst16 ( Cst5b ( m . RedToBlue ) , 0 ) ;
nint idx ;
for ( idx = 0 ; idx < = pixelData . Length - 4 ; idx + = 4 )
{
const byte mmShuffle_2200 = 0 b_10_10_00_00 ;
ref uint pos = ref Unsafe . Add ( ref MemoryMarshal . GetReference ( pixelData ) , idx ) ;
Vector128 < uint > input = Unsafe . As < uint , Vector128 < uint > > ( ref pos ) ;
Vector128 < byte > a = Sse2 . And ( input . AsByte ( ) , T ransformColorInverseAlphaGreenMask) ;
Vector128 < short > b = Sse2 . ShuffleLow ( a . AsInt16 ( ) , TransformColorInverseShuffleMask ) ;
Vector128 < short > c = Sse2 . ShuffleHigh ( b . AsInt16 ( ) , TransformColorInverseShuffleMask ) ;
Vector128 < byte > a = Sse2 . And ( input . AsByte ( ) , t ransformColorInverseAlphaGreenMask) ;
Vector128 < short > b = Sse2 . ShuffleLow ( a . AsInt16 ( ) , mmShuffle_2200 ) ;
Vector128 < short > c = Sse2 . ShuffleHigh ( b . AsInt16 ( ) , mmShuffle_2200 ) ;
Vector128 < short > d = Sse2 . MultiplyHigh ( c . AsInt16 ( ) , multsrb . AsInt16 ( ) ) ;
Vector128 < byte > e = Sse2 . Add ( input . AsByte ( ) , d . AsByte ( ) ) ;
Vector128 < short > f = Sse2 . ShiftLeftLogical ( e . AsInt16 ( ) , 8 ) ;