You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# Implementation of 64-bit atomics on 32-bit architectures
2
2
3
3
(See the [`atomic128` module](../atomic128) for 128-bit atomics on 64-bit architectures.)
4
+
5
+
## 64-bit atomics instructions
6
+
7
+
Here is the table of targets that support 64-bit atomics and the instructions used:
8
+
9
+
| target_arch | load | store | CAS | RMW | note |
10
+
| ----------- | ---- | ----- | --- | --- | ---- |
11
+
| x86 | cmpxchg8b or fild or movlps or movq | cmpxchg8b or fistp or movlps | cmpxchg8b | cmpxchg8b | provided by `core::sync::atomic`|
12
+
| arm | ldrexd | ldrexd/strexd | ldrexd/strexd | ldrexd/strexd | provided by `core::sync::atomic` for Armv6+, otherwise provided by us for Linux/Android using kuser_cmpxchg64 (see arm_linux.rs for more) |
13
+
| riscv32 | amocas.d | amocas.d | amocas.d | amocas.d | Experimental. Requires experimental-zacas target feature. Currently compile-time detection only due to LLVM marking it as experimental. <br> Requires 1.82+ (LLVM 19+) |
14
+
15
+
If `core::sync::atomic` provides 64-bit atomics, we use them.
16
+
On compiler versions or platforms where these are not supported, the fallback implementation is used.
17
+
18
+
## Run-time CPU feature detection
19
+
20
+
[detect](../detect) module has run-time CPU feature detection implementations.
21
+
22
+
Here is the table of targets that support run-time CPU feature detection and the instruction or API used:
| riscv32 | linux | riscv_hwprobe | all | Currently only used in tests due to LLVM marking zacas as experimental |
27
+
28
+
Run-time detection is enabled by default on most targets and can be disabled with `--cfg portable_atomic_no_outline_atomics`.
29
+
30
+
On some targets, run-time detection is disabled by default mainly for compatibility with older versions of operating systems or incomplete build environments, and can be enabled by `--cfg portable_atomic_outline_atomics`. (When both cfg are enabled, `*_no_*` cfg is preferred.)
31
+
32
+
For targets not included in the above table, run-time detection is always disabled and works the same as when `--cfg portable_atomic_no_outline_atomics` is set.
33
+
34
+
See also [docs on `portable_atomic_no_outline_atomics`](https://github.com/taiki-e/portable-atomic/blob/HEAD/README.md#optional-cfg-no-outline-atomics) in the top-level readme.
0 commit comments