pulp/core_arch/x86/
mod.rs

1use super::arch;
2use arch::*;
3
4macro_rules! __impl {
5	($name: ident, $feature: tt) => {
6		impl $name {
7			/// # Safety
8			/// requires the corresponding feature
9			#[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			/// # Safety
42			/// requires the corresponding feature
43			#[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// nightly features
248#[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;