/rust/registry/src/index.crates.io-6f17d22bba15001f/aes-0.8.4/src/ni/utils.rs
Line | Count | Source (jump to first uncovered line) |
1 | | //! Utility functions |
2 | | |
3 | | // TODO(tarcieri): check performance impact / generated assembly changes |
4 | | #![allow(clippy::needless_range_loop)] |
5 | | |
6 | | use super::arch::*; |
7 | | use crate::{Block, Block8}; |
8 | | |
9 | | pub type U128x8 = [__m128i; 8]; |
10 | | |
11 | | #[cfg(test)] |
12 | | pub(crate) fn check(a: &[__m128i], b: &[[u64; 2]]) { |
13 | | for (v1, v2) in a.iter().zip(b) { |
14 | | let t1: [u64; 2] = unsafe { core::mem::transmute(*v1) }; |
15 | | let t2 = [v2[0].to_be(), v2[1].to_be()]; |
16 | | assert_eq!(t1, t2); |
17 | | } |
18 | | } |
19 | | |
20 | | #[inline(always)] |
21 | 0 | pub(crate) fn load8(blocks: *const Block8) -> U128x8 { |
22 | 0 | unsafe { |
23 | 0 | let p = blocks as *const Block; |
24 | 0 | [ |
25 | 0 | _mm_loadu_si128(p.add(0) as *const __m128i), |
26 | 0 | _mm_loadu_si128(p.add(1) as *const __m128i), |
27 | 0 | _mm_loadu_si128(p.add(2) as *const __m128i), |
28 | 0 | _mm_loadu_si128(p.add(3) as *const __m128i), |
29 | 0 | _mm_loadu_si128(p.add(4) as *const __m128i), |
30 | 0 | _mm_loadu_si128(p.add(5) as *const __m128i), |
31 | 0 | _mm_loadu_si128(p.add(6) as *const __m128i), |
32 | 0 | _mm_loadu_si128(p.add(7) as *const __m128i), |
33 | 0 | ] |
34 | 0 | } |
35 | 0 | } |
36 | | |
37 | | #[inline(always)] |
38 | 0 | pub(crate) fn store8(blocks: *mut Block8, b: U128x8) { |
39 | 0 | unsafe { |
40 | 0 | let p = blocks as *mut Block; |
41 | 0 | _mm_storeu_si128(p.add(0) as *mut __m128i, b[0]); |
42 | 0 | _mm_storeu_si128(p.add(1) as *mut __m128i, b[1]); |
43 | 0 | _mm_storeu_si128(p.add(2) as *mut __m128i, b[2]); |
44 | 0 | _mm_storeu_si128(p.add(3) as *mut __m128i, b[3]); |
45 | 0 | _mm_storeu_si128(p.add(4) as *mut __m128i, b[4]); |
46 | 0 | _mm_storeu_si128(p.add(5) as *mut __m128i, b[5]); |
47 | 0 | _mm_storeu_si128(p.add(6) as *mut __m128i, b[6]); |
48 | 0 | _mm_storeu_si128(p.add(7) as *mut __m128i, b[7]); |
49 | 0 | } |
50 | 0 | } |
51 | | |
52 | | #[inline(always)] |
53 | 0 | pub(crate) fn xor8(b: &mut U128x8, key: __m128i) { |
54 | 0 | unsafe { |
55 | 0 | b[0] = _mm_xor_si128(b[0], key); |
56 | 0 | b[1] = _mm_xor_si128(b[1], key); |
57 | 0 | b[2] = _mm_xor_si128(b[2], key); |
58 | 0 | b[3] = _mm_xor_si128(b[3], key); |
59 | 0 | b[4] = _mm_xor_si128(b[4], key); |
60 | 0 | b[5] = _mm_xor_si128(b[5], key); |
61 | 0 | b[6] = _mm_xor_si128(b[6], key); |
62 | 0 | b[7] = _mm_xor_si128(b[7], key); |
63 | 0 | } |
64 | 0 | } |
65 | | |
66 | | #[inline(always)] |
67 | 0 | pub(crate) fn aesenc8(buffer: &mut U128x8, key: __m128i) { |
68 | 0 | for i in 0..8 { |
69 | 0 | buffer[i] = unsafe { _mm_aesenc_si128(buffer[i], key) }; |
70 | 0 | } |
71 | 0 | } |
72 | | |
73 | | #[inline(always)] |
74 | 0 | pub(crate) fn aesenclast8(buffer: &mut U128x8, key: __m128i) { |
75 | 0 | for i in 0..8 { |
76 | 0 | buffer[i] = unsafe { _mm_aesenclast_si128(buffer[i], key) }; |
77 | 0 | } |
78 | 0 | } |
79 | | |
80 | | #[inline(always)] |
81 | 0 | pub(crate) fn aesdec8(buffer: &mut U128x8, key: __m128i) { |
82 | 0 | for i in 0..8 { |
83 | 0 | buffer[i] = unsafe { _mm_aesdec_si128(buffer[i], key) }; |
84 | 0 | } |
85 | 0 | } |
86 | | |
87 | | #[inline(always)] |
88 | 0 | pub(crate) fn aesdeclast8(buffer: &mut U128x8, key: __m128i) { |
89 | 0 | for i in 0..8 { |
90 | 0 | buffer[i] = unsafe { _mm_aesdeclast_si128(buffer[i], key) }; |
91 | 0 | } |
92 | 0 | } |