1// SPDX-License-Identifier: Apache-2.0 OR MIT
2
3/*
4128-bit atomic implementations on 64-bit architectures
5
6See README.md for details.
7*/
8
9// AArch64
10#[cfg(any(
11 all(target_arch = "aarch64", any(not(portable_atomic_no_asm), portable_atomic_unstable_asm)),
12 all(target_arch = "arm64ec", not(portable_atomic_no_asm))
13))]
14// Use intrinsics.rs on Miri and Sanitizer that do not support inline assembly.
15#[cfg_attr(
16 all(any(miri, portable_atomic_sanitize_thread), portable_atomic_new_atomic_intrinsics),
17 path = "intrinsics.rs"
18)]
19pub(super) mod aarch64;
20
21// powerpc64
22#[cfg(all(
23 target_arch = "powerpc64",
24 portable_atomic_unstable_asm_experimental_arch,
25 any(
26 target_feature = "quadword-atomics",
27 portable_atomic_target_feature = "quadword-atomics",
28 all(
29 feature = "fallback",
30 not(portable_atomic_no_outline_atomics),
31 any(
32 all(
33 target_os = "linux",
34 any(
35 all(
36 target_env = "gnu",
37 any(target_endian = "little", not(target_feature = "crt-static")),
38 ),
39 all(
40 any(target_env = "musl", target_env = "ohos", target_env = "uclibc"),
41 not(target_feature = "crt-static"),
42 ),
43 portable_atomic_outline_atomics,
44 ),
45 ),
46 target_os = "android",
47 target_os = "freebsd",
48 target_os = "openbsd",
49 ),
50 not(any(miri, portable_atomic_sanitize_thread)),
51 ),
52 ),
53))]
54// Use intrinsics.rs on Miri and Sanitizer that do not support inline assembly.
55#[cfg_attr(
56 all(any(miri, portable_atomic_sanitize_thread), not(portable_atomic_pre_llvm_15)),
57 path = "intrinsics.rs"
58)]
59pub(super) mod powerpc64;
60
61// riscv64
62#[cfg(all(
63 target_arch = "riscv64",
64 not(portable_atomic_no_asm),
65 any(
66 target_feature = "experimental-zacas",
67 portable_atomic_target_feature = "experimental-zacas",
68 all(
69 feature = "fallback",
70 not(portable_atomic_no_outline_atomics),
71 any(test, portable_atomic_outline_atomics), // TODO(riscv): currently disabled by default
72 any(target_os = "linux", target_os = "android"),
73 not(any(miri, portable_atomic_sanitize_thread)),
74 ),
75 ),
76))]
77// Use intrinsics.rs on Miri and Sanitizer that do not support inline assembly.
78#[cfg_attr(any(miri, portable_atomic_sanitize_thread), path = "intrinsics.rs")]
79pub(super) mod riscv64;
80
81// s390x
82#[cfg(all(target_arch = "s390x", not(portable_atomic_no_asm)))]
83// Use intrinsics.rs on Miri and Sanitizer that do not support inline assembly.
84#[cfg_attr(any(miri, portable_atomic_sanitize_thread), path = "intrinsics.rs")]
85pub(super) mod s390x;
86
87// x86_64
88#[cfg(all(
89 target_arch = "x86_64",
90 not(all(any(miri, portable_atomic_sanitize_thread), portable_atomic_no_cmpxchg16b_intrinsic)),
91 any(not(portable_atomic_no_asm), portable_atomic_unstable_asm),
92 any(
93 target_feature = "cmpxchg16b",
94 portable_atomic_target_feature = "cmpxchg16b",
95 all(
96 feature = "fallback",
97 not(portable_atomic_no_outline_atomics),
98 not(any(target_env = "sgx", miri)),
99 ),
100 ),
101))]
102// Use intrinsics.rs on Miri and Sanitizer that do not support inline assembly.
103#[cfg_attr(any(miri, portable_atomic_sanitize_thread), path = "intrinsics.rs")]
104pub(super) mod x86_64;
105