Skip to content

Commit d58cb73

Browse files
committed
ok
1 parent 4e1c620 commit d58cb73

File tree

5 files changed

+55
-49
lines changed

5 files changed

+55
-49
lines changed

benchmark/Benchmark.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,8 @@ public Config()
153153
}
154154
// Parameters and variables for real data
155155
[Params(
156-
@"data/email/" //,
157-
//@"data/dns/swedenzonebase.txt"
156+
//@"data/email/" //,
157+
@"data/dns/swedenzonebase.txt"
158158
)]
159159
#pragma warning disable CA1051
160160
public string? FileName;

src/Base64Scalar.cs

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,32 @@ public enum Endianness
1515
LITTLE = 0,
1616
BIG = 1
1717
}
18+
19+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1820
public static bool MatchSystem(Endianness e)
1921
{
2022
return e == (BitConverter.IsLittleEndian ? Endianness.LITTLE : Endianness.BIG);
2123
}
2224

23-
public static bool IsAsciiWhiteSpace(char c)
25+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
26+
internal static bool IsAsciiWhiteSpace(byte c)
2427
{
25-
return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f';
28+
ReadOnlySpan<bool> table = new bool[] {
29+
false, false, false, false, false, false, false, false, false, true, true, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false};
30+
return Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(table), (nint)c);
2631
}
2732

33+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
34+
internal static bool IsAsciiWhiteSpace(char c)
35+
{
36+
if (c > 127)
37+
{
38+
return false;
39+
}
40+
return IsAsciiWhiteSpace((byte)c);
41+
}
42+
43+
2844
[Flags]
2945
public enum Base64Options
3046
{
@@ -127,8 +143,7 @@ public unsafe static OperationStatus DecodeFromBase64Scalar(ReadOnlySpan<byte> s
127143
{
128144
triple = BinaryPrimitives.ReverseEndianness(triple);
129145
triple >>= 8;
130-
byte[] byteTriple = BitConverter.GetBytes(triple);
131-
dst[0] = byteTriple[0]; // Copy only the first byte
146+
Buffer.MemoryCopy(&triple, dst, 1, 1);
132147
}
133148
dst += 1;
134149
}
@@ -147,7 +162,7 @@ public unsafe static OperationStatus DecodeFromBase64Scalar(ReadOnlySpan<byte> s
147162
{
148163
triple = BinaryPrimitives.ReverseEndianness(triple);
149164
triple >>= 8;
150-
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 2);
165+
Buffer.MemoryCopy(&triple, dst, 2, 2);
151166
}
152167
dst += 2;
153168
}
@@ -171,13 +186,12 @@ public unsafe static OperationStatus DecodeFromBase64Scalar(ReadOnlySpan<byte> s
171186
{
172187
triple <<= 8;
173188
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 3);
174-
175189
}
176190
else
177191
{
178192
triple = BinaryPrimitives.ReverseEndianness(triple);
179193
triple >>= 8;
180-
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 3);
194+
Buffer.MemoryCopy(&triple, dst, 3, 3);
181195
}
182196
dst += 3;
183197
}
@@ -285,8 +299,7 @@ public unsafe static OperationStatus DecodeFromBase64Scalar(ReadOnlySpan<char> s
285299
{
286300
triple = BinaryPrimitives.ReverseEndianness(triple);
287301
triple >>= 8;
288-
byte[] byteTriple = BitConverter.GetBytes(triple);
289-
dst[0] = byteTriple[0]; // Copy only the first byte
302+
Buffer.MemoryCopy(&triple, dst, 1, 1);
290303
}
291304
dst += 1;
292305
}
@@ -305,7 +318,7 @@ public unsafe static OperationStatus DecodeFromBase64Scalar(ReadOnlySpan<char> s
305318
{
306319
triple = BinaryPrimitives.ReverseEndianness(triple);
307320
triple >>= 8;
308-
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 2);
321+
Buffer.MemoryCopy(&triple, dst, 2, 2);
309322
}
310323
dst += 2;
311324
}
@@ -329,13 +342,12 @@ public unsafe static OperationStatus DecodeFromBase64Scalar(ReadOnlySpan<char> s
329342
{
330343
triple <<= 8;
331344
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 3);
332-
333345
}
334346
else
335347
{
336348
triple = BinaryPrimitives.ReverseEndianness(triple);
337349
triple >>= 8;
338-
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 3);
350+
Buffer.MemoryCopy(&triple, dst, 3, 3);
339351
}
340352
dst += 3;
341353
}
@@ -444,8 +456,7 @@ public unsafe static OperationStatus SafeDecodeFromBase64Scalar(ReadOnlySpan<byt
444456
{
445457
triple = BinaryPrimitives.ReverseEndianness(triple);
446458
triple >>= 8;
447-
byte[] byteTriple = BitConverter.GetBytes(triple);
448-
dst[0] = byteTriple[0]; // Copy only the first byte
459+
Buffer.MemoryCopy(&triple, dst, 1, 1);
449460
}
450461
dst += 1;
451462
}
@@ -470,7 +481,7 @@ public unsafe static OperationStatus SafeDecodeFromBase64Scalar(ReadOnlySpan<byt
470481
{
471482
triple = BinaryPrimitives.ReverseEndianness(triple);
472483
triple >>= 8;
473-
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 2);
484+
Buffer.MemoryCopy(&triple, dst, 2, 2);
474485
}
475486
dst += 2;
476487
}
@@ -500,13 +511,12 @@ public unsafe static OperationStatus SafeDecodeFromBase64Scalar(ReadOnlySpan<byt
500511
{
501512
triple <<= 8;
502513
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 3);
503-
504514
}
505515
else
506516
{
507517
triple = BinaryPrimitives.ReverseEndianness(triple);
508518
triple >>= 8;
509-
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 3);
519+
Buffer.MemoryCopy(&triple, dst, 3, 3);
510520
}
511521
dst += 3;
512522
}
@@ -615,8 +625,7 @@ public unsafe static OperationStatus SafeDecodeFromBase64Scalar(ReadOnlySpan<cha
615625
{
616626
triple = BinaryPrimitives.ReverseEndianness(triple);
617627
triple >>= 8;
618-
byte[] byteTriple = BitConverter.GetBytes(triple);
619-
dst[0] = byteTriple[0]; // Copy only the first byte
628+
Buffer.MemoryCopy(&triple, dst, 1, 1);
620629
}
621630
dst += 1;
622631
}
@@ -641,7 +650,7 @@ public unsafe static OperationStatus SafeDecodeFromBase64Scalar(ReadOnlySpan<cha
641650
{
642651
triple = BinaryPrimitives.ReverseEndianness(triple);
643652
triple >>= 8;
644-
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 2);
653+
Buffer.MemoryCopy(&triple, dst, 2, 2);
645654
}
646655
dst += 2;
647656
}
@@ -671,13 +680,12 @@ public unsafe static OperationStatus SafeDecodeFromBase64Scalar(ReadOnlySpan<cha
671680
{
672681
triple <<= 8;
673682
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 3);
674-
675683
}
676684
else
677685
{
678686
triple = BinaryPrimitives.ReverseEndianness(triple);
679687
triple >>= 8;
680-
Marshal.Copy(BitConverter.GetBytes(triple), 0, (IntPtr)dst, 3);
688+
Buffer.MemoryCopy(&triple, dst, 3, 3);
681689
}
682690
dst += 3;
683691
}

src/Base64Tables.cs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -582,11 +582,11 @@ internal static class Tables
582582
0x0000000000000000,
583583
};
584584
[MethodImpl(MethodImplOptions.AggressiveInlining)]
585-
public static ulong GetThintableEpi8(uint n)
586-
{
587-
ref ulong tableRef = ref MemoryMarshal.GetReference<ulong>(thintableEpi8);
588-
return Unsafe.AddByteOffset(ref tableRef, (nint)n);
589-
}
585+
public static ulong GetThintableEpi8(uint n)
586+
{
587+
ref ulong tableRef = ref MemoryMarshal.GetReference<ulong>(thintableEpi8);
588+
return Unsafe.AddByteOffset(ref tableRef, (nint)n);
589+
}
590590

591591
internal static readonly byte[] pshufbCombineTable = new byte[144]
592592
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
@@ -620,11 +620,11 @@ public static ulong GetThintableEpi8(uint n)
620620
14, 10, 12, 12, 14, 12, 14, 14, 16};
621621

622622
[MethodImpl(MethodImplOptions.AggressiveInlining)]
623-
public static byte GetBitsSetTable256mul2(uint n)
624-
{
625-
ref byte tableRef = ref MemoryMarshal.GetReference<byte>(BitsSetTable256mul2);
626-
return Unsafe.AddByteOffset(ref tableRef, (nint)n);
627-
}
623+
public static byte GetBitsSetTable256mul2(uint n)
624+
{
625+
ref byte tableRef = ref MemoryMarshal.GetReference<byte>(BitsSetTable256mul2);
626+
return Unsafe.AddByteOffset(ref tableRef, (nint)n);
627+
}
628628

629629
private static readonly byte[] ToBase64Value = new byte[]
630630
{ 255, 255, 255, 255, 255, 255, 255, 255, 255, 64, 64, 255, 64, 64, 255,
@@ -645,13 +645,13 @@ public static byte GetBitsSetTable256mul2(uint n)
645645
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
646646
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
647647
255};
648-
649-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
650-
public static byte GetToBase64Value(uint n)
651-
{
652-
ref byte tableRef = ref MemoryMarshal.GetReference<byte>(ToBase64Value);
653-
return Unsafe.AddByteOffset(ref tableRef, (nint)n);
654-
}
648+
649+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
650+
public static byte GetToBase64Value(uint n)
651+
{
652+
ref byte tableRef = ref MemoryMarshal.GetReference<byte>(ToBase64Value);
653+
return Unsafe.AddByteOffset(ref tableRef, (nint)n);
654+
}
655655

656656

657657
private static readonly byte[] ToBase64UrlValue = new byte[] {
@@ -674,12 +674,12 @@ public static byte GetToBase64Value(uint n)
674674
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
675675
255};
676676

677-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
678-
public static byte GetToBase64UrlValue(uint n)
679-
{
680-
ref byte tableRef = ref MemoryMarshal.GetReference<byte>(ToBase64UrlValue);
681-
return Unsafe.AddByteOffset(ref tableRef, (nint)n);
682-
}
677+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
678+
public static byte GetToBase64UrlValue(uint n)
679+
{
680+
ref byte tableRef = ref MemoryMarshal.GetReference<byte>(ToBase64UrlValue);
681+
return Unsafe.AddByteOffset(ref tableRef, (nint)n);
682+
}
683683

684684
internal static void Validate()
685685
{

test/Base64DecodingTestsUTF16.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
namespace tests;
22
using System.Text;
3-
using SimdBase64;
43
using System.Buffers;
54

65
#pragma warning disable CA1515

test/Base64DecodingTestsUTF8.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
namespace tests;
22
using System.Text;
3-
using SimdBase64;
43
using System.Buffers;
54

65
#pragma warning disable CA1515

0 commit comments

Comments
 (0)