native 0.0.1
Vectors, masks and wide register packs for C++26
Loading...
Searching...
No Matches
native.x86.bmi2.ccm
1// SPDX-License-Identifier: BSD-2-Clause OR Apache-2.0
2module;
3#include "native/isa_import.h"
4#include "native/x86/bmi2.h"
5#include "native/targets.h"
6export module native.x86.bmi2;
7export import native.x86.features;
8// Defaults use the owning module provider's baseline.
9#if NATIVE_HOST_X86
10extern "C++" namespace native {
11 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
12 constexpr std::uint32_t bzhi(std::uint32_t value, unsigned index) noexcept;
13
14 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
15 consteval std::uint32_t bzhi(std::uint32_t value, unsigned index) noexcept;
16
17 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
18 constexpr std::uint64_t bzhi(std::uint64_t value, unsigned index) noexcept;
19
20 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
21 consteval std::uint64_t bzhi(std::uint64_t value, unsigned index) noexcept;
22
23 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
24 constexpr std::uint32_t mulx(std::uint32_t a, std::uint32_t b, std::uint32_t* high) noexcept;
25
26 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
27 consteval std::uint32_t mulx(std::uint32_t a, std::uint32_t b, std::uint32_t* high) noexcept;
28
29 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
30 constexpr std::uint64_t mulx(std::uint64_t a, std::uint64_t b, std::uint64_t* high) noexcept;
31
32 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
33 consteval std::uint64_t mulx(std::uint64_t a, std::uint64_t b, std::uint64_t* high) noexcept;
34
35 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
36 constexpr std::uint32_t pdep(std::uint32_t value, std::uint32_t mask) noexcept;
37
38 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
39 consteval std::uint32_t pdep(std::uint32_t value, std::uint32_t mask) noexcept;
40
41 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
42 constexpr std::uint64_t pdep(std::uint64_t value, std::uint64_t mask) noexcept;
43
44 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
45 consteval std::uint64_t pdep(std::uint64_t value, std::uint64_t mask) noexcept;
46
47 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
48 constexpr std::uint32_t pext(std::uint32_t value, std::uint32_t mask) noexcept;
49
50 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
51 consteval std::uint32_t pext(std::uint32_t value, std::uint32_t mask) noexcept;
52
53 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
54 constexpr std::uint64_t pext(std::uint64_t value, std::uint64_t mask) noexcept;
55
56 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
57 consteval std::uint64_t pext(std::uint64_t value, std::uint64_t mask) noexcept;
58
59 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
60 constexpr std::uint32_t shlx(std::uint32_t value, unsigned count) noexcept;
61
62 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
63 consteval std::uint32_t shlx(std::uint32_t value, unsigned count) noexcept;
64
65 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
66 constexpr std::uint64_t shlx(std::uint64_t value, unsigned count) noexcept;
67
68 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
69 consteval std::uint64_t shlx(std::uint64_t value, unsigned count) noexcept;
70
71 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
72 constexpr std::uint32_t shrx(std::uint32_t value, unsigned count) noexcept;
73
74 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
75 consteval std::uint32_t shrx(std::uint32_t value, unsigned count) noexcept;
76
77 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
78 constexpr std::uint64_t shrx(std::uint64_t value, unsigned count) noexcept;
79
80 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
81 consteval std::uint64_t shrx(std::uint64_t value, unsigned count) noexcept;
82
83 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
84 constexpr std::int32_t sarx(std::int32_t value, unsigned count) noexcept;
85
86 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
87 consteval std::int32_t sarx(std::int32_t value, unsigned count) noexcept;
88
89 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi2))
90 constexpr std::int64_t sarx(std::int64_t value, unsigned count) noexcept;
91
92 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi2))
93 consteval std::int64_t sarx(std::int64_t value, unsigned count) noexcept;
94
97 template<unsigned Imm8, isa<x86> Arch = NATIVE_BASELINE>
98 requires(Arch.has(x86_feature::bmi2) && Imm8 <= 255)
99 native_nodiscard native_inline native_const __attribute__((target("bmi2")))
100 constexpr std::uint32_t rorx(std::uint32_t value) noexcept {
101 return rorx<Arch, Imm8>(value);
102 }
103
106 template<unsigned Imm8, isa<x86> Arch = NATIVE_BASELINE>
107 requires(Arch.has(x86_feature::bmi2) && Imm8 <= 255)
108 native_nodiscard native_inline native_const __attribute__((target("bmi2")))
109 constexpr std::uint64_t rorx(std::uint64_t value) noexcept {
110 return rorx<Arch, Imm8>(value);
111 }
112
114 template<unsigned Imm8, isa<x86> Arch = NATIVE_BASELINE>
115 requires(!Arch.has(x86_feature::bmi2) && Imm8 <= 255)
117 consteval std::uint32_t rorx(std::uint32_t value) noexcept {
118 return rorx<Arch, Imm8>(value);
119 }
120
122 template<unsigned Imm8, isa<x86> Arch = NATIVE_BASELINE>
123 requires(!Arch.has(x86_feature::bmi2) && Imm8 <= 255)
125 consteval std::uint64_t rorx(std::uint64_t value) noexcept {
126 return rorx<Arch, Imm8>(value);
127 }
128
129
130}
131#endif
132
133export namespace native {
136
138 using ::native::bzhi;
140 using ::native::mulx;
142 using ::native::pdep;
144 using ::native::pext;
146 using ::native::shlx;
148 using ::native::shrx;
150 using ::native::sarx;
152 using ::native::rorx;
153
155}
#define native_inline
inline [[always_inline]]
Definition attributes.h:212
#define native_nodiscard
C++17 [[nodiscard]].
Definition attributes.h:189
#define native_const
[[const]] is not const
Definition attributes.h:108
typename mask_traits< std::remove_cvref_t< T > >::type mask
Definition mask_traits.h:22
constexpr std::uint32_t pdep(std::uint32_t value, std::uint32_t mask) noexcept
Parallel bit deposit (PDEP): place the low popcount(mask) bits into mask's set positions,...
Definition bmi2.h:117
constexpr std::uint32_t bzhi(std::uint32_t value, unsigned index) noexcept
Zero bits at and above index's low eight bits; an index at least the width leaves value unchanged.
Definition bmi2.h:68
constexpr std::uint32_t mulx(std::uint32_t a, std::uint32_t b, std::uint32_t *high) noexcept
Return the low product and write the high product to a valid output pointer.
Definition bmi2.h:89
constexpr std::int32_t sarx(std::int32_t value, unsigned count) noexcept
Arithmetic right shift using the low five bits of count, propagating the sign bit.
Definition bmi2.h:185
constexpr std::uint32_t pext(std::uint32_t value, std::uint32_t mask) noexcept
Parallel bit extract (PEXT): gather mask's selected bits into the low bits, in order.
Definition bmi2.h:138
constexpr std::uint32_t shlx(std::uint32_t value, unsigned count) noexcept
Logical left shift using the low five bits of count.
Definition bmi2.h:159
constexpr std::uint32_t shrx(std::uint32_t value, unsigned count) noexcept
Logical right shift using the low five bits of count.
Definition bmi2.h:172
Architecture-tagged vectors, register packs and supporting value types. Native arithmetic follows its...
constexpr std::uint32_t rorx(std::uint32_t value) noexcept
constexpr int target
First matching requirement, with every later choice checked for shadowing.
Definition isa.h:396
Standard-library adaptations documented here for SIMD value types.