4#include "native/isa_import.h"
5#include "native/x86/aes.h"
6#include "native/x86/aes_constant.h"
14#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
30 template<isa<x86> Arch>
requires(Arch.has(x86_feature::aes))
33 simd<
std::uint8_t, 16, Arch> state,
simd<
std::uint8_t, 16, Arch> round_key) noexcept {
35 return detail::x86_aes_constant::round<false, false>(state, round_key);
38 detail::x86_aes::aesenc<Arch>(state.to_native(), round_key.to_native()));
43 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::aes) &&
44 requires {
sizeof(simd<std::uint8_t, 16, Arch>); })
47 return detail::x86_aes_constant::round<false, false>(state, round_key);
51 template<isa<x86> Arch>
requires(Arch.has(x86_feature::aes))
54 simd<
std::uint8_t, 16, Arch> state,
simd<
std::uint8_t, 16, Arch> round_key) noexcept {
56 return detail::x86_aes_constant::round<false, true>(state, round_key);
59 detail::x86_aes::aesenclast<Arch>(state.to_native(), round_key.to_native()));
64 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::aes) &&
65 requires {
sizeof(simd<std::uint8_t, 16, Arch>); })
68 return detail::x86_aes_constant::round<false, true>(state, round_key);
72 template<isa<x86> Arch>
requires(Arch.has(x86_feature::aes))
75 simd<
std::uint8_t, 16, Arch> state,
simd<
std::uint8_t, 16, Arch> round_key) noexcept {
77 return detail::x86_aes_constant::round<true, false>(state, round_key);
80 detail::x86_aes::aesdec<Arch>(state.to_native(), round_key.to_native()));
85 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::aes) &&
86 requires {
sizeof(simd<std::uint8_t, 16, Arch>); })
89 return detail::x86_aes_constant::round<true, false>(state, round_key);
93 template<isa<x86> Arch>
requires(Arch.has(x86_feature::aes))
96 simd<
std::uint8_t, 16, Arch> state,
simd<
std::uint8_t, 16, Arch> round_key) noexcept {
98 return detail::x86_aes_constant::round<true, true>(state, round_key);
101 detail::x86_aes::aesdeclast<Arch>(state.to_native(), round_key.to_native()));
106 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::aes) &&
107 requires {
sizeof(simd<std::uint8_t, 16, Arch>); })
110 return detail::x86_aes_constant::round<true, true>(state, round_key);
114 template<isa<x86> Arch>
requires(Arch.has(x86_feature::aes))
118 return detail::x86_aes_constant::inverse_mix(state);
125 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::aes) &&
126 requires {
sizeof(simd<std::uint8_t, 16, Arch>); })
128 return detail::x86_aes_constant::inverse_mix(state);
134 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::aes) && Imm8 <= 255)
138 return detail::x86_aes_constant::keygen<Imm8>(state);
141 detail::x86_aes::aeskeygenassist<Arch, Imm8>(state.to_native()));
146 template<isa<x86> Arch,
unsigned Imm8>
requires(!Arch.has(x86_feature::aes) && Imm8 <= 255 &&
147 requires {
sizeof(simd<std::uint8_t, 16, Arch>); })
149 return detail::x86_aes_constant::keygen<Imm8>(state);
153 template<isa<x86> Arch,
class... Args>
157 template<isa<x86> Arch,
class... Args>
161 template<isa<x86> Arch,
class... Args>
165 template<isa<x86> Arch,
class... Args>
169 template<isa<x86> Arch,
class... Args>
173 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
constexpr simd< std::uint8_t, 16, Arch > aesimc(simd< std::uint8_t, 16, Arch > state) noexcept
Apply inverse AES MixColumns independently to the four state columns.
#define native_inline
inline [[always_inline]]
#define native_nodiscard
C++17 [[nodiscard]].
#define native_const
[[const]] is not const
#define native_target(x)
this indicates a required feature set for the current multiversioned function.
constexpr simd< std::uint8_t, 16, Arch > aesdeclast(simd< std::uint8_t, 16, Arch > state, simd< std::uint8_t, 16, Arch > round_key) noexcept
Apply inverse ShiftRows, inverse SubBytes and then AddRoundKey for the final decryption round.
constexpr simd< std::uint8_t, 16, Arch > aesenclast(simd< std::uint8_t, 16, Arch > state, simd< std::uint8_t, 16, Arch > round_key) noexcept
Apply ShiftRows, SubBytes and then AddRoundKey for the final encryption round.
constexpr simd< std::uint8_t, 16, Arch > aesdec(simd< std::uint8_t, 16, Arch > state, simd< std::uint8_t, 16, Arch > round_key) noexcept
Apply inverse ShiftRows, inverse SubBytes, inverse MixColumns and then AddRoundKey.
constexpr simd< std::uint8_t, 16, Arch > aeskeygenassist(simd< std::uint8_t, 16, Arch > state) noexcept
constexpr simd< std::uint8_t, 16, Arch > aesenc(simd< std::uint8_t, 16, Arch > state, simd< std::uint8_t, 16, Arch > round_key) noexcept
Apply ShiftRows, SubBytes, MixColumns and then AddRoundKey.
Architecture-tagged vectors, register packs and supporting value types. Native arithmetic follows its...
Standard-library adaptations documented here for SIMD value types.
Omitted architecture arguments use the native.simd provider's baseline.