Skip to content

Why does 32-bit ARM use __ldrexd instead of __iso_volatile_load64? #1082

@AlexGuteniev

Description

@AlexGuteniev

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:

STL/stl/inc/atomic

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);
}

STL/stl/inc/atomic

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

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions