4#include "native/isa_import.h"
5#include "native/x86/sha.h"
13#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
25 template<isa<x86> Arch,
unsigned Selector>
requires(Arch.has(x86_feature::sha) && Selector < 4)
28 simd<
std::uint32_t, 4, Arch> a,
simd<
std::uint32_t, 4, Arch> b) noexcept {
30 return detail::x86_sha_constant::rounds1<Selector>(a, b);
33 detail::x86_sha::sha1rnds4<Arch, Selector>(a.to_native(), b.to_native()));
38 template<isa<x86> Arch,
unsigned Selector>
requires(!Arch.has(x86_feature::sha) && Selector < 4 &&
39 requires {
sizeof(simd<std::uint32_t, 4, Arch>); })
42 return detail::x86_sha_constant::rounds1<Selector>(a, b);
46 template<isa<x86> Arch,
unsigned Selector,
class... Args>
50 template<isa<x86> Arch>
requires(Arch.has(x86_feature::sha))
53 simd<
std::uint32_t, 4, Arch> a,
simd<
std::uint32_t, 4, Arch> b) noexcept {
55 return detail::x86_sha_constant::next_e(a, b);
58 detail::x86_sha::sha1nexte<Arch>(a.to_native(), b.to_native()));
63 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::sha) &&
64 requires {
sizeof(simd<std::uint32_t, 4, Arch>); })
67 return detail::x86_sha_constant::next_e(a, b);
71 template<isa<x86> Arch,
class... Args>
75 template<isa<x86> Arch>
requires(Arch.has(x86_feature::sha))
78 simd<
std::uint32_t, 4, Arch> a,
simd<
std::uint32_t, 4, Arch> b) noexcept {
80 return detail::x86_sha_constant::message1_first(a, b);
83 detail::x86_sha::sha1msg1<Arch>(a.to_native(), b.to_native()));
88 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::sha) &&
89 requires {
sizeof(simd<std::uint32_t, 4, Arch>); })
92 return detail::x86_sha_constant::message1_first(a, b);
96 template<isa<x86> Arch,
class... Args>
100 template<isa<x86> Arch>
requires(Arch.has(x86_feature::sha))
103 simd<
std::uint32_t, 4, Arch> a,
simd<
std::uint32_t, 4, Arch> b) noexcept {
105 return detail::x86_sha_constant::message1_last(a, b);
108 detail::x86_sha::sha1msg2<Arch>(a.to_native(), b.to_native()));
113 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::sha) &&
114 requires {
sizeof(simd<std::uint32_t, 4, Arch>); })
117 return detail::x86_sha_constant::message1_last(a, b);
121 template<isa<x86> Arch,
class... Args>
125 template<isa<x86> Arch>
requires(Arch.has(x86_feature::sha))
128 simd<
std::uint32_t, 4, Arch> a,
simd<
std::uint32_t, 4, Arch> b,
simd<
std::uint32_t, 4, Arch> c) noexcept {
130 return detail::x86_sha_constant::rounds256(a, b, c);
133 detail::x86_sha::sha256rnds2<Arch>(a.to_native(), b.to_native(), c.to_native()));
138 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::sha) &&
139 requires {
sizeof(simd<std::uint32_t, 4, Arch>); })
142 return detail::x86_sha_constant::rounds256(a, b, c);
146 template<isa<x86> Arch,
class... Args>
150 template<isa<x86> Arch>
requires(Arch.has(x86_feature::sha))
153 simd<
std::uint32_t, 4, Arch> a,
simd<
std::uint32_t, 4, Arch> b) noexcept {
155 return detail::x86_sha_constant::message256_first(a, b);
158 detail::x86_sha::sha256msg1<Arch>(a.to_native(), b.to_native()));
163 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::sha) &&
164 requires {
sizeof(simd<std::uint32_t, 4, Arch>); })
167 return detail::x86_sha_constant::message256_first(a, b);
171 template<isa<x86> Arch,
class... Args>
175 template<isa<x86> Arch>
requires(Arch.has(x86_feature::sha))
178 simd<
std::uint32_t, 4, Arch> a,
simd<
std::uint32_t, 4, Arch> b) noexcept {
180 return detail::x86_sha_constant::message256_last(a, b);
183 detail::x86_sha::sha256msg2<Arch>(a.to_native(), b.to_native()));
188 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::sha) &&
189 requires {
sizeof(simd<std::uint32_t, 4, Arch>); })
192 return detail::x86_sha_constant::message256_last(a, b);
196 template<isa<x86> Arch,
class... Args>
#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::uint32_t, 4, Arch > sha256msg1(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
First SHA-256 message-schedule step.
constexpr simd< std::uint32_t, 4, Arch > sha1msg1(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
First SHA-1 message-schedule step.
constexpr simd< std::uint32_t, 4, Arch > sha256msg2(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
Final SHA-256 message-schedule step.
constexpr simd< std::uint32_t, 4, Arch > sha1nexte(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
Add the next E value, derived from a, to the high dword of b.
constexpr simd< std::uint32_t, 4, Arch > sha256rnds2(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b, simd< std::uint32_t, 4, Arch > c) noexcept
Two SHA-256 rounds: a is CDGH, b is ABEF, c contains two message-plus-constant words.
constexpr simd< std::uint32_t, 4, Arch > sha1rnds4(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
Four SHA-1 rounds; Selector in [0,3] selects the function and constant.
constexpr simd< std::uint32_t, 4, Arch > sha1msg2(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
Final SHA-1 message-schedule step.
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.