Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private static readonly Vector128<byte> HexLookUpTable = Vector128.Create(
- (byte) 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102);
- private static readonly Vector128<byte> IsolateMask = Vector128.Create(
- (byte) 0x0F, 0x0F, 0x0F, 0x0F
- , 0x0F, 0x0F, 0x0F, 0x0F
- , 0x0F, 0x0F, 0x0F, 0x0F
- , 0x0F, 0x0F, 0x0F, 0x0F);
- private static readonly Vector128<byte> OutputShuffleMask = Vector128.Create(
- 0x00, 0xFF, 0x01, 0xFF,
- 0x02, 0xFF, 0x03, 0xFF,
- 0x04, 0xFF, 0x05, 0xFF,
- 0x06, 0xFF, 0x07, 0xFF);
- private static unsafe void ToHex(byte* source, byte* dest)
- {
- var sourceBytes = Sse2.LoadVector128(source);
- var hi = Vector128.Create(sourceBytes.GetLower(), Vector64<byte>.Zero);
- var hiAscii = Ssse3.Shuffle(
- HexLookUpTable,
- Sse2.And(
- Sse2.UnpackLow(
- Sse2.ShiftRightLogical(hi.AsUInt64(), 4).AsByte(),
- hi),
- IsolateMask));
- var hiChars1 = Ssse3.Shuffle(Vector128.Create(hiAscii.GetLower(), Vector64<byte>.Zero), OutputShuffleMask);
- var hiChars2 = Ssse3.Shuffle(Vector128.Create(hiAscii.GetUpper(), Vector64<byte>.Zero), OutputShuffleMask);
- Sse2.Store(dest, hiChars1);
- Sse2.Store(dest + 16, hiChars2);
- var lo = Vector128.Create(sourceBytes.GetUpper(), Vector64<byte>.Zero);
- var loAscii = Ssse3.Shuffle(
- HexLookUpTable,
- Sse2.And(
- Sse2.UnpackLow(
- Sse2.ShiftRightLogical(lo.AsUInt64(), 4).AsByte(),
- lo),
- IsolateMask));
- var loChars1 = Ssse3.Shuffle(Vector128.Create(loAscii.GetLower(), Vector64<byte>.Zero), OutputShuffleMask);
- var loChars2 = Ssse3.Shuffle(Vector128.Create(loAscii.GetUpper(), Vector64<byte>.Zero), OutputShuffleMask);
- Sse2.Store(dest + 32, loChars1);
- Sse2.Store(dest + 48, loChars2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement