88
99module blake3
1010
11+ import arrays
1112import math.bits
1213
1314// mixing function g
14- @[inline]
15+ @[direct_array_access; inline]
1516fn g (mut v []u32 , a u8 , b u8 , c u8 , d u8 , x u32 , y u32 ) {
1617 v[a] = v[a] + v[b] + x
1718 v[d] = bits.rotate_left_32 ((v[d] ^ v[a]), nr1 )
@@ -24,7 +25,7 @@ fn g(mut v []u32, a u8, b u8, c u8, d u8, x u32, y u32) {
2425}
2526
2627// one complete mixing round with the function g
27- @[inline]
28+ @[direct_array_access; inline]
2829fn mixing_round (mut v []u32 , m []u32 , s []u8 ) {
2930 g (mut v, 0 , 4 , 8 , 12 , m[s[0 ]], m[s[1 ]])
3031 g (mut v, 1 , 5 , 9 , 13 , m[s[2 ]], m[s[3 ]])
@@ -38,19 +39,17 @@ fn mixing_round(mut v []u32, m []u32, s []u8) {
3839}
3940
4041// compression function f
42+ @[direct_array_access]
4143fn f (h []u32 , m []u32 , counter u64 , input_bytes u32 , flags u32 ) []u32 {
42- mut v := []u32 {len: 0 , cap: 16 }
44+ mut v := []u32 {len: 16 }
4345
4446 // initialize the working vector
45- v << h[..8 ]
46- v << iv[..4 ]
47-
48- v << u32 (counter & 0x00000000ffffffff )
49- v << u32 (counter >> 32 )
50-
51- v << input_bytes
52-
53- v << flags
47+ arrays.copy[u32 ](mut v, h[..8 ])
48+ arrays.copy[u32 ](mut v[8 ..], iv[..4 ])
49+ v[12 ] = u32 (counter)
50+ v[13 ] = u32 (counter >> 32 )
51+ v[14 ] = input_bytes
52+ v[15 ] = flags
5453
5554 // go 7 rounds of cryptographic mixing
5655 //
0 commit comments