Advertisement
Guest User

Untitled

a guest
Jan 17th, 2020
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.15 KB | None | 0 0
  1.         private static readonly Vector128<byte> HexLookUpTable = Vector128.Create(
  2.             (byte) 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102);
  3.  
  4.         private static readonly Vector128<byte> IsolateMask = Vector128.Create(
  5.             (byte) 0x0F, 0x0F, 0x0F, 0x0F
  6.             , 0x0F, 0x0F, 0x0F, 0x0F
  7.             , 0x0F, 0x0F, 0x0F, 0x0F
  8.             , 0x0F, 0x0F, 0x0F, 0x0F);
  9.  
  10.         private static readonly Vector128<byte> OutputShuffleMask = Vector128.Create(
  11.             0x00, 0xFF, 0x01, 0xFF,
  12.             0x02, 0xFF, 0x03, 0xFF,
  13.             0x04, 0xFF, 0x05, 0xFF,
  14.             0x06, 0xFF, 0x07, 0xFF);
  15.  
  16.         private static unsafe void ToHex(byte* source, byte* dest)
  17.         {
  18.             var sourceBytes = Sse2.LoadVector128(source);
  19.  
  20.             var hi = Vector128.Create(sourceBytes.GetLower(), Vector64<byte>.Zero);
  21.             var hiAscii = Ssse3.Shuffle(
  22.                 HexLookUpTable,
  23.                 Sse2.And(
  24.                     Sse2.UnpackLow(
  25.                         Sse2.ShiftRightLogical(hi.AsUInt64(), 4).AsByte(),
  26.                         hi),
  27.                     IsolateMask));
  28.  
  29.             var hiChars1 = Ssse3.Shuffle(Vector128.Create(hiAscii.GetLower(), Vector64<byte>.Zero), OutputShuffleMask);
  30.             var hiChars2 = Ssse3.Shuffle(Vector128.Create(hiAscii.GetUpper(), Vector64<byte>.Zero), OutputShuffleMask);
  31.  
  32.             Sse2.Store(dest, hiChars1);
  33.             Sse2.Store(dest + 16, hiChars2);
  34.  
  35.             var lo = Vector128.Create(sourceBytes.GetUpper(), Vector64<byte>.Zero);
  36.             var loAscii = Ssse3.Shuffle(
  37.                 HexLookUpTable,
  38.                 Sse2.And(
  39.                     Sse2.UnpackLow(
  40.                         Sse2.ShiftRightLogical(lo.AsUInt64(), 4).AsByte(),
  41.                         lo),
  42.                     IsolateMask));
  43.             var loChars1 = Ssse3.Shuffle(Vector128.Create(loAscii.GetLower(), Vector64<byte>.Zero), OutputShuffleMask);
  44.             var loChars2 = Ssse3.Shuffle(Vector128.Create(loAscii.GetUpper(), Vector64<byte>.Zero), OutputShuffleMask);
  45.             Sse2.Store(dest + 32, loChars1);
  46.             Sse2.Store(dest + 48, loChars2);
  47.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement