1use super::arch;
2use arch::*;
3
4macro_rules! __impl {
5 ($name: ident, $feature: tt) => {
6 impl $name {
7 #[inline(always)]
10 pub unsafe fn new_unchecked() -> Self {
11 Self { __private: () }
12 }
13
14 #[inline(always)]
15 pub fn try_new() -> Option<Self> {
16 if feature_detected!($feature) {
17 Some(Self { __private: () })
18 } else {
19 None
20 }
21 }
22
23 #[inline(always)]
24 pub fn is_available() -> bool {
25 feature_detected!($feature)
26 }
27 }
28
29 impl ::core::fmt::Debug for $name {
30 #[inline]
31 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
32 f.write_str(stringify!($name))
33 }
34 }
35 };
36}
37
38macro_rules! __impl512 {
39 ($name: ident, $feature: tt) => {
40 impl $name {
41 #[inline(always)]
44 pub unsafe fn new_unchecked() -> Self {
45 Self { __private: () }
46 }
47
48 #[inline(always)]
49 pub fn try_new() -> Option<Self> {
50 if Self::is_available() {
51 Some(Self { __private: () })
52 } else {
53 None
54 }
55 }
56
57 #[inline(always)]
58 pub fn is_available() -> bool {
59 feature_detected!($feature) && feature_detected!("avx512vl")
60 }
61 }
62
63 impl ::core::fmt::Debug for $name {
64 #[inline]
65 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
66 f.write_str(stringify!($name))
67 }
68 }
69 };
70}
71
72#[derive(Clone, Copy)]
73#[repr(transparent)]
74pub struct Aes {
75 __private: (),
76}
77__impl!(Aes, "aes");
78#[derive(Clone, Copy)]
79#[repr(transparent)]
80pub struct Pclmulqdq {
81 __private: (),
82}
83__impl!(Pclmulqdq, "pclmulqdq");
84#[derive(Clone, Copy)]
85#[repr(transparent)]
86pub struct Rdrand {
87 __private: (),
88}
89__impl!(Rdrand, "rdrand");
90#[derive(Clone, Copy)]
91#[repr(transparent)]
92pub struct Rdseed {
93 __private: (),
94}
95__impl!(Rdseed, "rdseed");
96#[derive(Clone, Copy)]
97#[repr(transparent)]
98pub struct Sse {
99 __private: (),
100}
101__impl!(Sse, "sse");
102#[derive(Clone, Copy)]
103#[repr(transparent)]
104pub struct Sse2 {
105 __private: (),
106}
107__impl!(Sse2, "sse2");
108#[derive(Clone, Copy)]
109#[repr(transparent)]
110pub struct Sse3 {
111 __private: (),
112}
113__impl!(Sse3, "sse3");
114#[derive(Clone, Copy)]
115#[repr(transparent)]
116pub struct Ssse3 {
117 __private: (),
118}
119__impl!(Ssse3, "ssse3");
120#[derive(Clone, Copy)]
121#[repr(transparent)]
122pub struct Sse4_1 {
123 __private: (),
124}
125__impl!(Sse4_1, "sse4.1");
126#[derive(Clone, Copy)]
127#[repr(transparent)]
128pub struct Sse4_2 {
129 __private: (),
130}
131__impl!(Sse4_2, "sse4.2");
132#[derive(Clone, Copy)]
133#[repr(transparent)]
134pub struct Sse4a {
135 __private: (),
136}
137__impl!(Sse4a, "sse4a");
138#[derive(Clone, Copy)]
139#[repr(transparent)]
140pub struct Sha {
141 __private: (),
142}
143__impl!(Sha, "sha");
144#[derive(Clone, Copy)]
145#[repr(transparent)]
146pub struct Avx {
147 __private: (),
148}
149__impl!(Avx, "avx");
150#[derive(Clone, Copy)]
151#[repr(transparent)]
152pub struct Avx2 {
153 __private: (),
154}
155__impl!(Avx2, "avx2");
156#[derive(Clone, Copy)]
157#[repr(transparent)]
158pub struct F16c {
159 __private: (),
160}
161__impl!(F16c, "f16c");
162#[derive(Clone, Copy)]
163#[repr(transparent)]
164pub struct Fma {
165 __private: (),
166}
167__impl!(Fma, "fma");
168#[derive(Clone, Copy)]
169#[repr(transparent)]
170pub struct Bmi1 {
171 __private: (),
172}
173__impl!(Bmi1, "bmi1");
174#[derive(Clone, Copy)]
175#[repr(transparent)]
176pub struct Bmi2 {
177 __private: (),
178}
179__impl!(Bmi2, "bmi2");
180#[derive(Clone, Copy)]
181#[repr(transparent)]
182pub struct Lzcnt {
183 __private: (),
184}
185__impl!(Lzcnt, "lzcnt");
186#[derive(Clone, Copy)]
187#[repr(transparent)]
188pub struct Tbm {
189 __private: (),
190}
191__impl!(Tbm, "tbm");
192#[derive(Clone, Copy)]
193#[repr(transparent)]
194pub struct Popcnt {
195 __private: (),
196}
197__impl!(Popcnt, "popcnt");
198#[derive(Clone, Copy)]
199#[repr(transparent)]
200pub struct Fxsr {
201 __private: (),
202}
203__impl!(Fxsr, "fxsr");
204#[derive(Clone, Copy)]
205#[repr(transparent)]
206pub struct Xsave {
207 __private: (),
208}
209__impl!(Xsave, "xsave");
210#[derive(Clone, Copy)]
211#[repr(transparent)]
212pub struct Xsaveopt {
213 __private: (),
214}
215__impl!(Xsaveopt, "xsaveopt");
216#[derive(Clone, Copy)]
217#[repr(transparent)]
218pub struct Xsaves {
219 __private: (),
220}
221__impl!(Xsaves, "xsaves");
222#[derive(Clone, Copy)]
223#[repr(transparent)]
224pub struct Xsavec {
225 __private: (),
226}
227__impl!(Xsavec, "xsavec");
228#[derive(Clone, Copy)]
229#[repr(transparent)]
230pub struct Cmpxchg16b {
231 __private: (),
232}
233__impl!(Cmpxchg16b, "cmpxchg16b");
234#[derive(Clone, Copy)]
235#[repr(transparent)]
236pub struct Adx {
237 __private: (),
238}
239__impl!(Adx, "adx");
240#[derive(Clone, Copy)]
241#[repr(transparent)]
242pub struct Rtm {
243 __private: (),
244}
245__impl!(Rtm, "rtm");
246
247#[cfg(feature = "nightly")]
249#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
250#[derive(Clone, Copy)]
251#[repr(transparent)]
252pub struct Avx512f {
253 __private: (),
254}
255#[cfg(feature = "nightly")]
256#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
257__impl512!(Avx512f, "avx512f");
258#[cfg(feature = "nightly")]
259#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
260#[derive(Clone, Copy)]
261#[repr(transparent)]
262pub struct Avx512cd {
263 __private: (),
264}
265#[cfg(feature = "nightly")]
266#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
267__impl512!(Avx512cd, "avx512cd");
268#[cfg(feature = "nightly")]
269#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
270#[derive(Clone, Copy)]
271#[repr(transparent)]
272pub struct Avx512er {
273 __private: (),
274}
275#[cfg(feature = "nightly")]
276#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
277__impl512!(Avx512er, "avx512er");
278#[cfg(feature = "nightly")]
279#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
280#[derive(Clone, Copy)]
281#[repr(transparent)]
282pub struct Avx512pf {
283 __private: (),
284}
285#[cfg(feature = "nightly")]
286#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
287__impl512!(Avx512pf, "avx512pf");
288#[cfg(feature = "nightly")]
289#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
290#[derive(Clone, Copy)]
291#[repr(transparent)]
292pub struct Avx512bw {
293 __private: (),
294}
295#[cfg(feature = "nightly")]
296#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
297__impl512!(Avx512bw, "avx512bw");
298#[cfg(feature = "nightly")]
299#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
300#[derive(Clone, Copy)]
301#[repr(transparent)]
302pub struct Avx512dq {
303 __private: (),
304}
305#[cfg(feature = "nightly")]
306#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
307__impl512!(Avx512dq, "avx512dq");
308
309#[cfg(feature = "nightly")]
310#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
311#[derive(Clone, Copy)]
312#[repr(transparent)]
313pub struct Avx512ifma {
314 __private: (),
315}
316#[cfg(feature = "nightly")]
317#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
318__impl512!(Avx512ifma, "avx512ifma");
319#[cfg(feature = "nightly")]
320#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
321#[derive(Clone, Copy)]
322#[repr(transparent)]
323pub struct Avx512vbmi {
324 __private: (),
325}
326#[cfg(feature = "nightly")]
327#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
328__impl512!(Avx512vbmi, "avx512vbmi");
329#[cfg(feature = "nightly")]
330#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
331#[derive(Clone, Copy)]
332#[repr(transparent)]
333pub struct Avx512vpopcntdq {
334 __private: (),
335}
336#[cfg(feature = "nightly")]
337#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
338__impl512!(Avx512vpopcntdq, "avx512vpopcntdq");
339#[cfg(feature = "nightly")]
340#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
341#[derive(Clone, Copy)]
342#[repr(transparent)]
343pub struct Avx512vbmi2 {
344 __private: (),
345}
346#[cfg(feature = "nightly")]
347#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
348__impl512!(Avx512vbmi2, "avx512vbmi2");
349#[cfg(feature = "nightly")]
350#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
351#[derive(Clone, Copy)]
352#[repr(transparent)]
353pub struct Gfni {
354 __private: (),
355}
356#[cfg(feature = "nightly")]
357#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
358__impl!(Gfni, "gfni");
359
360#[cfg(feature = "nightly")]
361#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
362#[derive(Clone, Copy)]
363#[repr(transparent)]
364pub struct Vaes {
365 __private: (),
366}
367#[cfg(feature = "nightly")]
368#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
369__impl!(Vaes, "vaes");
370#[cfg(feature = "nightly")]
371#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
372#[derive(Clone, Copy)]
373#[repr(transparent)]
374pub struct Vpclmulqdq {
375 __private: (),
376}
377#[cfg(feature = "nightly")]
378#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
379__impl!(Vpclmulqdq, "vpclmulqdq");
380
381#[cfg(feature = "nightly")]
382#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
383#[derive(Clone, Copy)]
384#[repr(transparent)]
385pub struct Avx512vnni {
386 __private: (),
387}
388#[cfg(feature = "nightly")]
389#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
390__impl512!(Avx512vnni, "avx512vnni");
391#[cfg(feature = "nightly")]
392#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
393#[derive(Clone, Copy)]
394#[repr(transparent)]
395pub struct Avx512bitalg {
396 __private: (),
397}
398#[cfg(feature = "nightly")]
399#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
400__impl512!(Avx512bitalg, "avx512bitalg");
401#[cfg(feature = "nightly")]
402#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
403#[derive(Clone, Copy)]
404#[repr(transparent)]
405pub struct Avx512bf16 {
406 __private: (),
407}
408#[cfg(feature = "nightly")]
409#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
410__impl512!(Avx512bf16, "avx512bf16");
411#[cfg(feature = "nightly")]
412#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
413#[derive(Clone, Copy)]
414#[repr(transparent)]
415pub struct Avx512vp2intersect {
416 __private: (),
417}
418#[cfg(feature = "nightly")]
419#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
420__impl512!(Avx512vp2intersect, "avx512vp2intersect");
421
422#[cfg(feature = "nightly")]
423#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
424#[deprecated]
425pub type Avx512gfni = Gfni;
426
427#[cfg(feature = "nightly")]
428#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
429#[deprecated]
430pub type Avx512vpclmulqdq = Vpclmulqdq;
431
432#[cfg(feature = "nightly")]
433#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
434#[deprecated]
435pub type Avx512vaes = Vaes;
436
437mod avx;
438mod avx2;
439#[cfg(feature = "nightly")]
440#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
441mod avx512bw;
442#[cfg(feature = "nightly")]
443#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
444mod avx512cd;
445#[cfg(feature = "nightly")]
446#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
447mod avx512dq;
448#[cfg(feature = "nightly")]
449#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
450mod avx512f;
451#[cfg(feature = "nightly")]
452#[cfg_attr(docsrs, doc(cfg(feature = "nightly")))]
453mod avx512ifma;
454mod fma;
455mod sse;
456mod sse2;
457mod sse3;
458mod sse41;
459mod sse42;
460mod ssse3;