Skip to content

Commit 8b2f0ac

Browse files
committed
aesni: Add target_feature annotations to allow intrinsic inlining
Otherwise when built with nocheck feature, the AES-NI intrinsics are not inlined causing a severe performance drop.
1 parent 75c2c21 commit 8b2f0ac

File tree

3 files changed

+27
-15
lines changed

3 files changed

+27
-15
lines changed

aes/aesni/src/aes128.rs

Lines changed: 9 additions & 5 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

aes/aesni/src/aes192.rs

Lines changed: 9 additions & 5 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

aes/aesni/src/aes256.rs

Lines changed: 9 additions & 5 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

0 commit comments

Comments
 (0)