authorgravatar for 124872+jedisct1@users.noreply.github.comFrank Denis <124872+jedisct1@users.noreply.github.com> 2023-07-18 00:40:31+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-07-18 00:40:31+02:00
loga0b35249a29c6869650ba7e3515999fcced8dcf2
tree42b82769f330b2840d23363b57033677e5dc36ea
parenta86f589a9f03622aa13eab4895c505c7f131c075
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Replace hand-written endian-specific loads with std.mem.readInt*() (#16431)

And when we have the choice, favor little-endian because it's 2023. Gives a slight performance improvement: md5: 552 -> 555 MiB/s sha1: 768 -> 786 MiB/s sha512: 211 -> 217 MiB/s

4 files changed, 20 insertions(+), 33 deletions(-)

lib/std/crypto/aes/soft.zig+17-17
......@@ -122,14 +122,14 @@ pub const Block = struct {
122122
123123 // Last round uses s-box directly and XORs to produce output.
124124 var x: [4]u8 = undefined;
125 x = sbox_lookup(&sbox_encrypt, @as(u8, @truncate(s3 >> 24)), @as(u8, @truncate(s2 >> 16)), @as(u8, @truncate(s1 >> 8)), @as(u8, @truncate(s0)));
126 var t0 = @as(u32, x[0]) << 24 | @as(u32, x[1]) << 16 | @as(u32, x[2]) << 8 | @as(u32, x[3]);
127 x = sbox_lookup(&sbox_encrypt, @as(u8, @truncate(s0 >> 24)), @as(u8, @truncate(s3 >> 16)), @as(u8, @truncate(s2 >> 8)), @as(u8, @truncate(s1)));
128 var t1 = @as(u32, x[0]) << 24 | @as(u32, x[1]) << 16 | @as(u32, x[2]) << 8 | @as(u32, x[3]);
129 x = sbox_lookup(&sbox_encrypt, @as(u8, @truncate(s1 >> 24)), @as(u8, @truncate(s0 >> 16)), @as(u8, @truncate(s3 >> 8)), @as(u8, @truncate(s2)));
130 var t2 = @as(u32, x[0]) << 24 | @as(u32, x[1]) << 16 | @as(u32, x[2]) << 8 | @as(u32, x[3]);
131 x = sbox_lookup(&sbox_encrypt, @as(u8, @truncate(s2 >> 24)), @as(u8, @truncate(s1 >> 16)), @as(u8, @truncate(s0 >> 8)), @as(u8, @truncate(s3)));
132 var t3 = @as(u32, x[0]) << 24 | @as(u32, x[1]) << 16 | @as(u32, x[2]) << 8 | @as(u32, x[3]);
125 x = sbox_lookup(&sbox_encrypt, @as(u8, @truncate(s0)), @as(u8, @truncate(s1 >> 8)), @as(u8, @truncate(s2 >> 16)), @as(u8, @truncate(s3 >> 24)));
126 var t0 = mem.readIntLittle(u32, &x);
127 x = sbox_lookup(&sbox_encrypt, @as(u8, @truncate(s1)), @as(u8, @truncate(s2 >> 8)), @as(u8, @truncate(s3 >> 16)), @as(u8, @truncate(s0 >> 24)));
128 var t1 = mem.readIntLittle(u32, &x);
129 x = sbox_lookup(&sbox_encrypt, @as(u8, @truncate(s2)), @as(u8, @truncate(s3 >> 8)), @as(u8, @truncate(s0 >> 16)), @as(u8, @truncate(s1 >> 24)));
130 var t2 = mem.readIntLittle(u32, &x);
131 x = sbox_lookup(&sbox_encrypt, @as(u8, @truncate(s3)), @as(u8, @truncate(s0 >> 8)), @as(u8, @truncate(s1 >> 16)), @as(u8, @truncate(s2 >> 24)));
132 var t3 = mem.readIntLittle(u32, &x);
133133
134134 t0 ^= round_key.repr[0];
135135 t1 ^= round_key.repr[1];
......@@ -218,14 +218,14 @@ pub const Block = struct {
218218
219219 // Last round uses s-box directly and XORs to produce output.
220220 var x: [4]u8 = undefined;
221 x = sbox_lookup(&sbox_decrypt, @as(u8, @truncate(s1 >> 24)), @as(u8, @truncate(s2 >> 16)), @as(u8, @truncate(s3 >> 8)), @as(u8, @truncate(s0)));
222 var t0 = @as(u32, x[0]) << 24 | @as(u32, x[1]) << 16 | @as(u32, x[2]) << 8 | @as(u32, x[3]);
223 x = sbox_lookup(&sbox_decrypt, @as(u8, @truncate(s2 >> 24)), @as(u8, @truncate(s3 >> 16)), @as(u8, @truncate(s0 >> 8)), @as(u8, @truncate(s1)));
224 var t1 = @as(u32, x[0]) << 24 | @as(u32, x[1]) << 16 | @as(u32, x[2]) << 8 | @as(u32, x[3]);
225 x = sbox_lookup(&sbox_decrypt, @as(u8, @truncate(s3 >> 24)), @as(u8, @truncate(s0 >> 16)), @as(u8, @truncate(s1 >> 8)), @as(u8, @truncate(s2)));
226 var t2 = @as(u32, x[0]) << 24 | @as(u32, x[1]) << 16 | @as(u32, x[2]) << 8 | @as(u32, x[3]);
227 x = sbox_lookup(&sbox_decrypt, @as(u8, @truncate(s0 >> 24)), @as(u8, @truncate(s1 >> 16)), @as(u8, @truncate(s2 >> 8)), @as(u8, @truncate(s3)));
228 var t3 = @as(u32, x[0]) << 24 | @as(u32, x[1]) << 16 | @as(u32, x[2]) << 8 | @as(u32, x[3]);
221 x = sbox_lookup(&sbox_decrypt, @as(u8, @truncate(s0)), @as(u8, @truncate(s3 >> 8)), @as(u8, @truncate(s2 >> 16)), @as(u8, @truncate(s1 >> 24)));
222 var t0 = mem.readIntLittle(u32, &x);
223 x = sbox_lookup(&sbox_decrypt, @as(u8, @truncate(s1)), @as(u8, @truncate(s0 >> 8)), @as(u8, @truncate(s3 >> 16)), @as(u8, @truncate(s2 >> 24)));
224 var t1 = mem.readIntLittle(u32, &x);
225 x = sbox_lookup(&sbox_decrypt, @as(u8, @truncate(s2)), @as(u8, @truncate(s1 >> 8)), @as(u8, @truncate(s0 >> 16)), @as(u8, @truncate(s3 >> 24)));
226 var t2 = mem.readIntLittle(u32, &x);
227 x = sbox_lookup(&sbox_decrypt, @as(u8, @truncate(s3)), @as(u8, @truncate(s2 >> 8)), @as(u8, @truncate(s1 >> 16)), @as(u8, @truncate(s0 >> 24)));
228 var t3 = mem.readIntLittle(u32, &x);
229229
230230 t0 ^= round_key.repr[0];
231231 t1 ^= round_key.repr[1];
......@@ -349,7 +349,7 @@ fn KeySchedule(comptime Aes: type) type {
349349 // Apply sbox_encrypt to each byte in w.
350350 fn func(w: u32) u32 {
351351 const x = sbox_lookup(&sbox_key_schedule, @as(u8, @truncate(w)), @as(u8, @truncate(w >> 8)), @as(u8, @truncate(w >> 16)), @as(u8, @truncate(w >> 24)));
352 return @as(u32, x[3]) << 24 | @as(u32, x[2]) << 16 | @as(u32, x[1]) << 8 | @as(u32, x[0]);
352 return mem.readIntLittle(u32, &x);
353353 }
354354 }.func;
355355
lib/std/crypto/md5.zig+1-6
......@@ -121,12 +121,7 @@ pub const Md5 = struct {
121121
122122 var i: usize = 0;
123123 while (i < 16) : (i += 1) {
124 // NOTE: Performing or's separately improves perf by ~10%
125 s[i] = 0;
126 s[i] |= @as(u32, b[i * 4 + 0]);
127 s[i] |= @as(u32, b[i * 4 + 1]) << 8;
128 s[i] |= @as(u32, b[i * 4 + 2]) << 16;
129 s[i] |= @as(u32, b[i * 4 + 3]) << 24;
124 s[i] = mem.readIntLittle(u32, b[i * 4 ..][0..4]);
130125 }
131126
132127 var v: [4]u32 = [_]u32{
lib/std/crypto/sha1.zig+1-1
......@@ -151,7 +151,7 @@ pub const Sha1 = struct {
151151 roundParam(0, 1, 2, 3, 4, 15),
152152 };
153153 inline for (round0a) |r| {
154 s[r.i] = (@as(u32, b[r.i * 4 + 0]) << 24) | (@as(u32, b[r.i * 4 + 1]) << 16) | (@as(u32, b[r.i * 4 + 2]) << 8) | (@as(u32, b[r.i * 4 + 3]) << 0);
154 s[r.i] = mem.readIntBig(u32, b[r.i * 4 ..][0..4]);
155155
156156 v[r.e] = v[r.e] +% math.rotl(u32, v[r.a], @as(u32, 5)) +% 0x5A827999 +% s[r.i & 0xf] +% ((v[r.b] & v[r.c]) | (~v[r.b] & v[r.d]));
157157 v[r.b] = math.rotl(u32, v[r.b], @as(u32, 30));
lib/std/crypto/sha2.zig+1-9
......@@ -678,15 +678,7 @@ fn Sha2x64(comptime params: Sha2Params64) type {
678678
679679 var i: usize = 0;
680680 while (i < 16) : (i += 1) {
681 s[i] = 0;
682 s[i] |= @as(u64, b[i * 8 + 0]) << 56;
683 s[i] |= @as(u64, b[i * 8 + 1]) << 48;
684 s[i] |= @as(u64, b[i * 8 + 2]) << 40;
685 s[i] |= @as(u64, b[i * 8 + 3]) << 32;
686 s[i] |= @as(u64, b[i * 8 + 4]) << 24;
687 s[i] |= @as(u64, b[i * 8 + 5]) << 16;
688 s[i] |= @as(u64, b[i * 8 + 6]) << 8;
689 s[i] |= @as(u64, b[i * 8 + 7]) << 0;
681 s[i] = mem.readIntBig(u64, b[i * 8 ..][0..8]);
690682 }
691683 while (i < 80) : (i += 1) {
692684 s[i] = s[i - 16] +% s[i - 7] +%