native 0.0.1
Vectors, masks and wide register packs for C++26
Loading...
Searching...
No Matches
native.x86.bmi1.ccm
1// SPDX-FileCopyrightText: 2026 Edward Kmett <ekmett@gmail.com>
2// SPDX-License-Identifier: BSD-2-Clause OR Apache-2.0
3module;
4#include "native/isa_import.h"
5#include "native/x86/bmi1.h"
6#include "native/targets.h"
7export module native.x86.bmi1;
8export import native.x86.features;
9// Defaults use the owning module provider's baseline.
10#if NATIVE_HOST_X86
11extern "C++" namespace native {
12 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
13 constexpr std::uint32_t andn(std::uint32_t first, std::uint32_t second) noexcept;
14
15 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
16 consteval std::uint32_t andn(std::uint32_t first, std::uint32_t second) noexcept;
17
18 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
19 constexpr std::uint64_t andn(std::uint64_t first, std::uint64_t second) noexcept;
20
21 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
22 consteval std::uint64_t andn(std::uint64_t first, std::uint64_t second) noexcept;
23
24 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
25 constexpr std::uint32_t bextr(std::uint32_t value, std::uint32_t control) noexcept;
26
27 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
28 consteval std::uint32_t bextr(std::uint32_t value, std::uint32_t control) noexcept;
29
30 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
31 constexpr std::uint64_t bextr(std::uint64_t value, std::uint32_t control) noexcept;
32
33 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
34 consteval std::uint64_t bextr(std::uint64_t value, std::uint32_t control) noexcept;
35
36 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
37 constexpr std::uint32_t bextr(std::uint32_t value, unsigned start, unsigned length) noexcept;
38
39 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
40 consteval std::uint32_t bextr(std::uint32_t value, unsigned start, unsigned length) noexcept;
41
42 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
43 constexpr std::uint64_t bextr(std::uint64_t value, unsigned start, unsigned length) noexcept;
44
45 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
46 consteval std::uint64_t bextr(std::uint64_t value, unsigned start, unsigned length) noexcept;
47
48 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
49 constexpr std::uint32_t blsi(std::uint32_t value) noexcept;
50
51 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
52 consteval std::uint32_t blsi(std::uint32_t value) noexcept;
53
54 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
55 constexpr std::uint64_t blsi(std::uint64_t value) noexcept;
56
57 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
58 consteval std::uint64_t blsi(std::uint64_t value) noexcept;
59
60 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
61 constexpr std::uint32_t blsmsk(std::uint32_t value) noexcept;
62
63 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
64 consteval std::uint32_t blsmsk(std::uint32_t value) noexcept;
65
66 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
67 constexpr std::uint64_t blsmsk(std::uint64_t value) noexcept;
68
69 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
70 consteval std::uint64_t blsmsk(std::uint64_t value) noexcept;
71
72 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
73 constexpr std::uint32_t blsr(std::uint32_t value) noexcept;
74
75 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
76 consteval std::uint32_t blsr(std::uint32_t value) noexcept;
77
78 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
79 constexpr std::uint64_t blsr(std::uint64_t value) noexcept;
80
81 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
82 consteval std::uint64_t blsr(std::uint64_t value) noexcept;
83
84 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
85 constexpr std::uint16_t tzcnt(std::uint16_t value) noexcept;
86
87 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
88 consteval std::uint16_t tzcnt(std::uint16_t value) noexcept;
89
90 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
91 constexpr std::uint32_t tzcnt(std::uint32_t value) noexcept;
92
93 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
94 consteval std::uint32_t tzcnt(std::uint32_t value) noexcept;
95
96 template<isa<x86> Arch = NATIVE_BASELINE> requires(Arch.has(x86_feature::bmi1))
97 constexpr std::uint64_t tzcnt(std::uint64_t value) noexcept;
98
99 template<isa<x86> Arch = NATIVE_BASELINE> requires(!Arch.has(x86_feature::bmi1))
100 consteval std::uint64_t tzcnt(std::uint64_t value) noexcept;
101
102}
103#endif
104
105export namespace native {
108
110 using ::native::andn;
112 using ::native::bextr;
114 using ::native::blsi;
116 using ::native::blsmsk;
118 using ::native::blsr;
120 using ::native::tzcnt;
122}
constexpr std::uint32_t andn(std::uint32_t first, std::uint32_t second) noexcept
ANDN: complement the first operand, then AND with the second.
Definition bmi1.h:34
constexpr std::uint32_t bextr(std::uint32_t value, std::uint32_t control) noexcept
Definition bmi1.h:56
constexpr std::uint16_t tzcnt(std::uint16_t value) noexcept
TZCNT: count low zero bits; zero returns the operand width, including 16-bit operands.
Definition bmi1.h:160
constexpr std::uint32_t blsmsk(std::uint32_t value) noexcept
BLSMSK: set every bit through the lowest set bit; zero produces all ones.
Definition bmi1.h:118
constexpr std::uint32_t blsr(std::uint32_t value) noexcept
BLSR: clear the lowest set bit; zero remains zero.
Definition bmi1.h:139
constexpr std::uint32_t blsi(std::uint32_t value) noexcept
BLSI: retain only the lowest set bit; zero remains zero.
Definition bmi1.h:97
Architecture-tagged vectors, register packs and supporting value types. Native arithmetic follows its...