| ... | ... | @@ -364,17 +364,20 @@ fn processBlockGeneric( |
| 364 | 364 | |
| 365 | 365 | const BlamkaVector = @Vector(4, u64); |
| 366 | 366 | |
| 367 | | inline fn fBlaMka(x: BlamkaVector, y: BlamkaVector) BlamkaVector { |
| 367 | fn fBlaMka(x: BlamkaVector, y: BlamkaVector) BlamkaVector { |
| 368 | 368 | const x_lo: @Vector(4, u32) = @truncate(x); |
| 369 | 369 | const y_lo: @Vector(4, u32) = @truncate(y); |
| 370 | 370 | const xy = @as(BlamkaVector, x_lo) * @as(BlamkaVector, y_lo); |
| 371 | 371 | return x +% y +% @as(BlamkaVector, @splat(2)) *% xy; |
| 372 | 372 | } |
| 373 | 373 | |
| 374 | | inline fn rotrVector(x: BlamkaVector, comptime n: comptime_int) BlamkaVector { |
| 374 | fn rotrVector(x: BlamkaVector, comptime n: comptime_int) BlamkaVector { |
| 375 | 375 | return (x >> @splat(n)) | (x << @splat(64 - n)); |
| 376 | 376 | } |
| 377 | 377 | |
| 378 | // The `inline` is load-bearing: without it ReleaseSmall keeps this out of line |
| 379 | // and shuffles the four vectors through memory across every call, costing |
| 380 | // roughly 9% on Apple Silicon. |
| 378 | 381 | inline fn blamkaRound(a: *BlamkaVector, b: *BlamkaVector, c: *BlamkaVector, d: *BlamkaVector) void { |
| 379 | 382 | a.* = fBlaMka(a.*, b.*); |
| 380 | 383 | d.* = rotrVector(d.* ^ a.*, 32); |