Skip to content

Commit 22339bc

Browse files
authored
aesni: Add target_feature annotations to allow intrinsic inlining (#165)
1 parent 99b219a commit 22339bc

File tree

3 files changed

+63
-36
lines changed

3 files changed

+63
-36
lines changed

aes/aesni/src/aes128.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ pub struct Aes128 {
1919
impl Aes128 {
2020
#[inline(always)]
2121
pub(crate) fn encrypt8(&self, mut blocks: [__m128i; 8]) -> [__m128i; 8] {
22-
let keys = self.encrypt_keys;
23-
unsafe {
22+
#[inline]
23+
#[target_feature(enable = "aes")]
24+
unsafe fn aesni128_encrypt8(keys: &[__m128i; 11], blocks: &mut [__m128i; 8]) {
2425
xor8!(blocks, keys[0]);
2526
aesenc8!(blocks, keys[1]);
2627
aesenc8!(blocks, keys[2]);
@@ -33,13 +34,15 @@ impl Aes128 {
3334
aesenc8!(blocks, keys[9]);
3435
aesenclast8!(blocks, keys[10]);
3536
}
37+
unsafe { aesni128_encrypt8(&self.encrypt_keys, &mut blocks) };
3638
blocks
3739
}
3840

3941
#[inline(always)]
40-
pub(crate) fn encrypt(&self, mut block: __m128i) -> __m128i {
41-
let keys = self.encrypt_keys;
42-
unsafe {
42+
pub(crate) fn encrypt(&self, block: __m128i) -> __m128i {
43+
#[inline]
44+
#[target_feature(enable = "aes")]
45+
unsafe fn aesni128_encrypt1(keys: &[__m128i; 11], mut block: __m128i) -> __m128i {
4346
block = _mm_xor_si128(block, keys[0]);
4447
block = _mm_aesenc_si128(block, keys[1]);
4548
block = _mm_aesenc_si128(block, keys[2]);
@@ -52,6 +55,7 @@ impl Aes128 {
5255
block = _mm_aesenc_si128(block, keys[9]);
5356
_mm_aesenclast_si128(block, keys[10])
5457
}
58+
unsafe { aesni128_encrypt1(&self.encrypt_keys, block) }
5559
}
5660
}
5761

@@ -88,11 +92,11 @@ impl BlockCipher for Aes128 {
8892

8993
#[inline]
9094
fn decrypt_block(&self, block: &mut Block128) {
91-
let keys = self.decrypt_keys;
92-
93-
// Safety: `loadu` and `storeu` support unaligned access
94-
#[allow(clippy::cast_ptr_alignment)]
95-
unsafe {
95+
#[inline]
96+
#[target_feature(enable = "aes")]
97+
unsafe fn aes128_decrypt1(block: &mut Block128, keys: &[__m128i; 11]) {
98+
// Safety: `loadu` and `storeu` support unaligned access
99+
#[allow(clippy::cast_ptr_alignment)]
96100
let mut b = _mm_loadu_si128(block.as_ptr() as *const __m128i);
97101
b = _mm_xor_si128(b, keys[10]);
98102
b = _mm_aesdec_si128(b, keys[9]);
@@ -107,6 +111,8 @@ impl BlockCipher for Aes128 {
107111
b = _mm_aesdeclast_si128(b, keys[0]);
108112
_mm_storeu_si128(block.as_mut_ptr() as *mut __m128i, b);
109113
}
114+
115+
unsafe { aes128_decrypt1(block, &self.decrypt_keys) }
110116
}
111117

112118
#[inline]
@@ -119,8 +125,9 @@ impl BlockCipher for Aes128 {
119125

120126
#[inline]
121127
fn decrypt_blocks(&self, blocks: &mut Block128x8) {
122-
let keys = self.decrypt_keys;
123-
unsafe {
128+
#[inline]
129+
#[target_feature(enable = "aes")]
130+
unsafe fn aes128_decrypt8(blocks: &mut Block128x8, keys: &[__m128i; 11]) {
124131
let mut b = load8!(blocks);
125132
xor8!(b, keys[10]);
126133
aesdec8!(b, keys[9]);
@@ -135,6 +142,8 @@ impl BlockCipher for Aes128 {
135142
aesdeclast8!(b, keys[0]);
136143
store8!(blocks, b);
137144
}
145+
146+
unsafe { aes128_decrypt8(blocks, &self.decrypt_keys) }
138147
}
139148
}
140149

aes/aesni/src/aes192.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ pub struct Aes192 {
1919
impl Aes192 {
2020
#[inline(always)]
2121
pub(crate) fn encrypt8(&self, mut blocks: [__m128i; 8]) -> [__m128i; 8] {
22-
let keys = self.encrypt_keys;
23-
unsafe {
22+
#[inline]
23+
#[target_feature(enable = "aes")]
24+
unsafe fn aesni192_encrypt8(keys: &[__m128i; 13], blocks: &mut [__m128i; 8]) {
2425
xor8!(blocks, keys[0]);
2526
aesenc8!(blocks, keys[1]);
2627
aesenc8!(blocks, keys[2]);
@@ -35,13 +36,15 @@ impl Aes192 {
3536
aesenc8!(blocks, keys[11]);
3637
aesenclast8!(blocks, keys[12]);
3738
}
39+
unsafe { aesni192_encrypt8(&self.encrypt_keys, &mut blocks) };
3840
blocks
3941
}
4042

4143
#[inline(always)]
42-
pub(crate) fn encrypt(&self, mut block: __m128i) -> __m128i {
43-
let keys = self.encrypt_keys;
44-
unsafe {
44+
pub(crate) fn encrypt(&self, block: __m128i) -> __m128i {
45+
#[inline]
46+
#[target_feature(enable = "aes")]
47+
unsafe fn aesni192_encrypt1(keys: &[__m128i; 13], mut block: __m128i) -> __m128i {
4548
block = _mm_xor_si128(block, keys[0]);
4649
block = _mm_aesenc_si128(block, keys[1]);
4750
block = _mm_aesenc_si128(block, keys[2]);
@@ -56,6 +59,7 @@ impl Aes192 {
5659
block = _mm_aesenc_si128(block, keys[11]);
5760
_mm_aesenclast_si128(block, keys[12])
5861
}
62+
unsafe { aesni192_encrypt1(&self.encrypt_keys, block) }
5963
}
6064
}
6165

@@ -90,11 +94,11 @@ impl BlockCipher for Aes192 {
9094

9195
#[inline]
9296
fn decrypt_block(&self, block: &mut Block128) {
93-
let keys = self.decrypt_keys;
94-
95-
// Safety: `loadu` and `storeu` support unaligned access
96-
#[allow(clippy::cast_ptr_alignment)]
97-
unsafe {
97+
#[inline]
98+
#[target_feature(enable = "aes")]
99+
unsafe fn aes192_decrypt1(block: &mut Block128, keys: &[__m128i; 13]) {
100+
// Safety: `loadu` and `storeu` support unaligned access
101+
#[allow(clippy::cast_ptr_alignment)]
98102
let mut b = _mm_loadu_si128(block.as_ptr() as *const __m128i);
99103
b = _mm_xor_si128(b, keys[12]);
100104
b = _mm_aesdec_si128(b, keys[11]);
@@ -111,6 +115,8 @@ impl BlockCipher for Aes192 {
111115
b = _mm_aesdeclast_si128(b, keys[0]);
112116
_mm_storeu_si128(block.as_mut_ptr() as *mut __m128i, b);
113117
}
118+
119+
unsafe { aes192_decrypt1(block, &self.decrypt_keys) }
114120
}
115121

116122
#[inline]
@@ -123,8 +129,9 @@ impl BlockCipher for Aes192 {
123129

124130
#[inline]
125131
fn decrypt_blocks(&self, blocks: &mut Block128x8) {
126-
let keys = self.decrypt_keys;
127-
unsafe {
132+
#[inline]
133+
#[target_feature(enable = "aes")]
134+
unsafe fn aes192_decrypt8(blocks: &mut Block128x8, keys: &[__m128i; 13]) {
128135
let mut b = load8!(blocks);
129136
xor8!(b, keys[12]);
130137
aesdec8!(b, keys[11]);
@@ -141,6 +148,8 @@ impl BlockCipher for Aes192 {
141148
aesdeclast8!(b, keys[0]);
142149
store8!(blocks, b);
143150
}
151+
152+
unsafe { aes192_decrypt8(blocks, &self.decrypt_keys) }
144153
}
145154
}
146155

aes/aesni/src/aes256.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ pub struct Aes256 {
1919
impl Aes256 {
2020
#[inline(always)]
2121
pub(crate) fn encrypt8(&self, mut blocks: [__m128i; 8]) -> [__m128i; 8] {
22-
let keys = self.encrypt_keys;
23-
unsafe {
22+
#[inline]
23+
#[target_feature(enable = "aes")]
24+
unsafe fn aesni256_encrypt8(keys: &[__m128i; 15], blocks: &mut [__m128i; 8]) {
2425
xor8!(blocks, keys[0]);
2526
aesenc8!(blocks, keys[1]);
2627
aesenc8!(blocks, keys[2]);
@@ -37,13 +38,15 @@ impl Aes256 {
3738
aesenc8!(blocks, keys[13]);
3839
aesenclast8!(blocks, keys[14]);
3940
}
41+
unsafe { aesni256_encrypt8(&self.encrypt_keys, &mut blocks) };
4042
blocks
4143
}
4244

4345
#[inline(always)]
44-
pub(crate) fn encrypt(&self, mut block: __m128i) -> __m128i {
45-
let keys = self.encrypt_keys;
46-
unsafe {
46+
pub(crate) fn encrypt(&self, block: __m128i) -> __m128i {
47+
#[inline]
48+
#[target_feature(enable = "aes")]
49+
unsafe fn aesni256_encrypt1(keys: &[__m128i; 15], mut block: __m128i) -> __m128i {
4750
block = _mm_xor_si128(block, keys[0]);
4851
block = _mm_aesenc_si128(block, keys[1]);
4952
block = _mm_aesenc_si128(block, keys[2]);
@@ -60,6 +63,7 @@ impl Aes256 {
6063
block = _mm_aesenc_si128(block, keys[13]);
6164
_mm_aesenclast_si128(block, keys[14])
6265
}
66+
unsafe { aesni256_encrypt1(&self.encrypt_keys, block) }
6367
}
6468
}
6569

@@ -94,11 +98,11 @@ impl BlockCipher for Aes256 {
9498

9599
#[inline]
96100
fn decrypt_block(&self, block: &mut Block128) {
97-
let keys = self.decrypt_keys;
98-
99-
// Safety: `loadu` and `storeu` support unaligned access
100-
#[allow(clippy::cast_ptr_alignment)]
101-
unsafe {
101+
#[inline]
102+
#[target_feature(enable = "aes")]
103+
unsafe fn aes256_decrypt1(block: &mut Block128, keys: &[__m128i; 15]) {
104+
// Safety: `loadu` and `storeu` support unaligned access
105+
#[allow(clippy::cast_ptr_alignment)]
102106
let mut b = _mm_loadu_si128(block.as_ptr() as *const __m128i);
103107
b = _mm_xor_si128(b, keys[14]);
104108
b = _mm_aesdec_si128(b, keys[13]);
@@ -117,6 +121,8 @@ impl BlockCipher for Aes256 {
117121
b = _mm_aesdeclast_si128(b, keys[0]);
118122
_mm_storeu_si128(block.as_mut_ptr() as *mut __m128i, b);
119123
}
124+
125+
unsafe { aes256_decrypt1(block, &self.decrypt_keys) }
120126
}
121127

122128
#[inline]
@@ -129,8 +135,9 @@ impl BlockCipher for Aes256 {
129135

130136
#[inline]
131137
fn decrypt_blocks(&self, blocks: &mut Block128x8) {
132-
let keys = self.decrypt_keys;
133-
unsafe {
138+
#[inline]
139+
#[target_feature(enable = "aes")]
140+
unsafe fn aes256_decrypt8(blocks: &mut Block128x8, keys: &[__m128i; 15]) {
134141
let mut b = load8!(blocks);
135142
xor8!(b, keys[14]);
136143
aesdec8!(b, keys[13]);
@@ -149,6 +156,8 @@ impl BlockCipher for Aes256 {
149156
aesdeclast8!(b, keys[0]);
150157
store8!(blocks, b);
151158
}
159+
160+
unsafe { aes256_decrypt8(blocks, &self.decrypt_keys) }
152161
}
153162
}
154163

0 commit comments

Comments
 (0)