-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Closed as not planned
Closed as not planned
Copy link
Labels
questionFurther information is requestedFurther information is requested
Description
Why does 32-bit ARM use __ldrexd instead of __iso_volatile_load64?
Note that ldrexd is generally useful with strexd, however strexd is not even exposed as intrinsic, so __ldrexd intrinsic is probably exposed specifically for this usage.
(This does not block something, but this is the only two lines of <atomic> I don't understand fully)
Occurrences:
Lines 827 to 838 in c10ae01
| _NODISCARD _Ty load() const noexcept { // load with sequential consistency | |
| const auto _Mem = _Atomic_address_as<long long>(_Storage); | |
| long long _As_bytes; | |
| #ifdef _M_ARM | |
| _As_bytes = __ldrexd(_Mem); | |
| _Memory_barrier(); | |
| #else | |
| _As_bytes = __iso_volatile_load64(_Mem); | |
| _Compiler_or_memory_barrier(); | |
| #endif | |
| return reinterpret_cast<_Ty&>(_As_bytes); | |
| } |
Lines 840 to 849 in c10ae01
| _NODISCARD _Ty load(const memory_order _Order) const noexcept { // load with given memory order | |
| const auto _Mem = _Atomic_address_as<long long>(_Storage); | |
| #ifdef _M_ARM | |
| long long _As_bytes = __ldrexd(_Mem); | |
| #else | |
| long long _As_bytes = __iso_volatile_load64(_Mem); | |
| #endif | |
| _Load_barrier(_Order); | |
| return reinterpret_cast<_Ty&>(_As_bytes); | |
| } |
Metadata
Metadata
Assignees
Labels
questionFurther information is requestedFurther information is requested