Skip to content

Commit beb25ec

Browse files
CopilotHMBSbige
andauthored
Replace MemoryMarshal.GetReference with GetReference extension and reuse base addresses (#98)
Co-authored-by: HMBSbige <19153265+HMBSbige@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
1 parent 6b5bdc6 commit beb25ec

File tree

13 files changed

+67
-67
lines changed

13 files changed

+67
-67
lines changed

src/CryptoBase/FastUtils.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -205,17 +205,17 @@ public static void Xor16(ReadOnlySpan<byte> stream, ReadOnlySpan<byte> source, S
205205
{
206206
if (Vector128.IsHardwareAccelerated)
207207
{
208-
ref Vector128<byte> v0 = ref Unsafe.As<byte, Vector128<byte>>(ref MemoryMarshal.GetReference(stream));
209-
ref Vector128<byte> v1 = ref Unsafe.As<byte, Vector128<byte>>(ref MemoryMarshal.GetReference(source));
210-
ref Vector128<byte> dst = ref Unsafe.As<byte, Vector128<byte>>(ref MemoryMarshal.GetReference(destination));
208+
ref Vector128<byte> v0 = ref Unsafe.As<byte, Vector128<byte>>(ref stream.GetReference());
209+
ref Vector128<byte> v1 = ref Unsafe.As<byte, Vector128<byte>>(ref source.GetReference());
210+
ref Vector128<byte> dst = ref Unsafe.As<byte, Vector128<byte>>(ref destination.GetReference());
211211

212212
dst = v0 ^ v1;
213213
}
214214
else
215215
{
216-
ref UInt128 v0 = ref Unsafe.As<byte, UInt128>(ref MemoryMarshal.GetReference(stream));
217-
ref UInt128 v1 = ref Unsafe.As<byte, UInt128>(ref MemoryMarshal.GetReference(source));
218-
ref UInt128 dst = ref Unsafe.As<byte, UInt128>(ref MemoryMarshal.GetReference(destination));
216+
ref UInt128 v0 = ref Unsafe.As<byte, UInt128>(ref stream.GetReference());
217+
ref UInt128 v1 = ref Unsafe.As<byte, UInt128>(ref source.GetReference());
218+
ref UInt128 dst = ref Unsafe.As<byte, UInt128>(ref destination.GetReference());
219219

220220
dst = v0 ^ v1;
221221
}
@@ -229,15 +229,15 @@ public static void Xor16(Span<byte> source, ReadOnlySpan<byte> stream)
229229
{
230230
if (Vector128.IsHardwareAccelerated)
231231
{
232-
ref Vector128<byte> v0 = ref Unsafe.As<byte, Vector128<byte>>(ref MemoryMarshal.GetReference(source));
233-
ref Vector128<byte> v1 = ref Unsafe.As<byte, Vector128<byte>>(ref MemoryMarshal.GetReference(stream));
232+
ref Vector128<byte> v0 = ref Unsafe.As<byte, Vector128<byte>>(ref source.GetReference());
233+
ref Vector128<byte> v1 = ref Unsafe.As<byte, Vector128<byte>>(ref stream.GetReference());
234234

235235
v0 ^= v1;
236236
}
237237
else
238238
{
239-
ref UInt128 v0 = ref Unsafe.As<byte, UInt128>(ref MemoryMarshal.GetReference(source));
240-
ref UInt128 v1 = ref Unsafe.As<byte, UInt128>(ref MemoryMarshal.GetReference(stream));
239+
ref UInt128 v0 = ref Unsafe.As<byte, UInt128>(ref source.GetReference());
240+
ref UInt128 v1 = ref Unsafe.As<byte, UInt128>(ref stream.GetReference());
241241

242242
v0 ^= v1;
243243
}

src/CryptoBase/Macs/GHash/GHashX86.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public GHashX86(scoped ReadOnlySpan<byte> key)
1818
{
1919
ArgumentOutOfRangeException.ThrowIfLessThan(key.Length, KeySize, nameof(key));
2020

21-
ref Vector128<byte> v = ref Unsafe.As<byte, Vector128<byte>>(ref MemoryMarshal.GetReference(key));
21+
ref Vector128<byte> v = ref Unsafe.As<byte, Vector128<byte>>(ref key.GetReference());
2222
_key = v.ReverseEndianness128();
2323

2424
Reset();
@@ -28,7 +28,7 @@ public GHashX86(scoped ReadOnlySpan<byte> key)
2828
private void GFMul(scoped ReadOnlySpan<byte> x)
2929
{
3030
Vector128<ulong> a = _key.AsUInt64();
31-
Vector128<ulong> b = (Unsafe.As<byte, Vector128<byte>>(ref MemoryMarshal.GetReference(x)).ReverseEndianness128() ^ _buffer).AsUInt64();
31+
Vector128<ulong> b = (Unsafe.As<byte, Vector128<byte>>(ref x.GetReference()).ReverseEndianness128() ^ _buffer).AsUInt64();
3232

3333
Vector128<uint> tmp3 = Pclmulqdq.CarrylessMultiply(a, b, 0x00).AsUInt32();
3434
Vector128<uint> tmp4 = Pclmulqdq.CarrylessMultiply(a, b, 0x10).AsUInt32();

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/CTR/CTR128StreamMode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ private void UpdateCore(ReadOnlySpan<byte> source, Span<byte> destination)
5454
{
5555
crypto.Encrypt(counter, stream);
5656

57-
ref UInt128 c = ref Unsafe.As<byte, UInt128>(ref MemoryMarshal.GetReference(counter));
57+
ref UInt128 c = ref Unsafe.As<byte, UInt128>(ref counter.GetReference());
5858
c = BinaryPrimitives.ReverseEndianness(BinaryPrimitives.ReverseEndianness(c) + 1);
5959
}
6060

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/CTR/CTR128StreamModeBlock16X86.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public CTR128StreamModeBlock16X86(IBlockCrypto crypto, ReadOnlySpan<byte> iv)
3535
_counter = ArrayPool<byte>.Shared.Rent(BlockSize16);
3636
_keyStream = ArrayPool<byte>.Shared.Rent(BlockSize16);
3737

38-
_iCounter = FastUtils.BroadcastVector128ToVector256(ref MemoryMarshal.GetReference(iv)).ReverseEndianness128().IncUpper128Le();
38+
_iCounter = FastUtils.BroadcastVector128ToVector256(ref iv.GetReference()).ReverseEndianness128().IncUpper128Le();
3939

4040
Reset();
4141
}
@@ -84,7 +84,7 @@ private void UpdateKeyStream()
8484
Vector256<byte> v6 = _counterV6.ReverseEndianness128();
8585
Vector256<byte> v7 = _counterV7.ReverseEndianness128();
8686

87-
ref byte cRef = ref MemoryMarshal.GetReference(c);
87+
ref byte cRef = ref c.GetReference();
8888
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 0 * 2 * BlockSize), v0);
8989
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 1 * 2 * BlockSize), v1);
9090
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 2 * 2 * BlockSize), v2);

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/CTR/CTR128StreamModeBlock4X86.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public CTR128StreamModeBlock4X86(IBlockCrypto crypto, ReadOnlySpan<byte> iv)
3232
_counter = ArrayPool<byte>.Shared.Rent(BlockSize4);
3333
_keyStream = ArrayPool<byte>.Shared.Rent(BlockSize4);
3434

35-
ref Vector128<byte> v = ref Unsafe.As<byte, Vector128<byte>>(ref MemoryMarshal.GetReference(iv));
35+
ref Vector128<byte> v = ref Unsafe.As<byte, Vector128<byte>>(ref iv.GetReference());
3636
_iCounter = v.ReverseEndianness128();
3737

3838
Reset();
@@ -79,7 +79,7 @@ private void UpdateKeyStream()
7979
Vector128<byte> v2 = _counterV2.ReverseEndianness128();
8080
Vector128<byte> v3 = _counterV3.ReverseEndianness128();
8181

82-
ref byte cRef = ref MemoryMarshal.GetReference(c);
82+
ref byte cRef = ref c.GetReference();
8383
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 0 * BlockSize), v0);
8484
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 1 * BlockSize), v1);
8585
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 2 * BlockSize), v2);

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/CTR/CTR128StreamModeBlock8AvxX86.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public CTR128StreamModeBlock8AvxX86(IBlockCrypto crypto, ReadOnlySpan<byte> iv)
3232
_counter = ArrayPool<byte>.Shared.Rent(BlockSize8);
3333
_keyStream = ArrayPool<byte>.Shared.Rent(BlockSize8);
3434

35-
_iCounter = FastUtils.BroadcastVector128ToVector256(ref MemoryMarshal.GetReference(iv)).ReverseEndianness128().IncUpper128Le();
35+
_iCounter = FastUtils.BroadcastVector128ToVector256(ref iv.GetReference()).ReverseEndianness128().IncUpper128Le();
3636

3737
Reset();
3838
}
@@ -77,7 +77,7 @@ private void UpdateKeyStream()
7777
Vector256<byte> v2 = _counterV2.ReverseEndianness128();
7878
Vector256<byte> v3 = _counterV3.ReverseEndianness128();
7979

80-
ref byte cRef = ref MemoryMarshal.GetReference(c);
80+
ref byte cRef = ref c.GetReference();
8181
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 0 * 2 * BlockSize), v0);
8282
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 1 * 2 * BlockSize), v1);
8383
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 2 * 2 * BlockSize), v2);

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/CTR/CTR128StreamModeBlock8X86.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public CTR128StreamModeBlock8X86(IBlockCrypto crypto, ReadOnlySpan<byte> iv)
3535
_counter = ArrayPool<byte>.Shared.Rent(BlockSize8);
3636
_keyStream = ArrayPool<byte>.Shared.Rent(BlockSize8);
3737

38-
ref Vector128<byte> v = ref Unsafe.As<byte, Vector128<byte>>(ref MemoryMarshal.GetReference(iv));
38+
ref Vector128<byte> v = ref Unsafe.As<byte, Vector128<byte>>(ref iv.GetReference());
3939
_iCounter = v.ReverseEndianness128();
4040

4141
Reset();
@@ -85,7 +85,7 @@ private void UpdateKeyStream()
8585
Vector128<byte> v6 = _counterV6.ReverseEndianness128();
8686
Vector128<byte> v7 = _counterV7.ReverseEndianness128();
8787

88-
ref byte cRef = ref MemoryMarshal.GetReference(c);
88+
ref byte cRef = ref c.GetReference();
8989
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 0 * BlockSize), v0);
9090
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 1 * BlockSize), v1);
9191
Unsafe.WriteUnaligned(ref Unsafe.Add(ref cRef, 2 * BlockSize), v2);

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/CTR/CTR128StreamModeX86.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public CTR128StreamModeX86(IBlockCrypto crypto, ReadOnlySpan<byte> iv)
2222

2323
_internalBlockCrypto = crypto;
2424

25-
ref Vector128<byte> v = ref Unsafe.As<byte, Vector128<byte>>(ref MemoryMarshal.GetReference(iv));
25+
ref Vector128<byte> v = ref Unsafe.As<byte, Vector128<byte>>(ref iv.GetReference());
2626
_iCounter = v.ReverseEndianness128();
2727

2828
Reset();

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/Xts/XtsMode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public XtsMode(IBlockCrypto dataCrypto, IBlockCrypto tweakCrypto, ReadOnlySpan<b
2121

2222
_dataCrypto = dataCrypto;
2323
_tweakCrypto = tweakCrypto;
24-
_iv = Unsafe.ReadUnaligned<Vector128<byte>>(ref MemoryMarshal.GetReference(iv));
24+
_iv = Unsafe.ReadUnaligned<Vector128<byte>>(ref iv.GetReference());
2525
}
2626

2727
[SkipLocalsInit]

src/CryptoBase/SymmetricCryptos/BlockCryptos/SM4/SM4Utils.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,8 @@ public static void Encrypt8(uint[] rk, ReadOnlySpan<byte> source, Span<byte> des
201201

202202
public static void Encrypt16(uint[] rk, ReadOnlySpan<byte> source, Span<byte> destination)
203203
{
204-
ref byte sourceRef = ref MemoryMarshal.GetReference(source);
205-
ref byte dstRef = ref MemoryMarshal.GetReference(destination);
204+
ref byte sourceRef = ref source.GetReference();
205+
ref byte dstRef = ref destination.GetReference();
206206

207207
ref Vector256<byte> s0 = ref Unsafe.As<byte, Vector256<byte>>(ref Unsafe.Add(ref sourceRef, 0 * 32));
208208
ref Vector256<byte> s1 = ref Unsafe.As<byte, Vector256<byte>>(ref Unsafe.Add(ref sourceRef, 1 * 32));

0 commit comments

Comments
 (0)