Visual C 中的 X64 是否有 8 位原子 CAS (cmpxchg) 内在函数?

发布于 2024-11-03 18:56:38 字数 692 浏览 3 评论 0原文

以下代码可以在 32 位 Visual Studio C++ 中使用。由于 64 位版本的 Visual Studio C++ 不支持内联 ASM,是否有使用内部函数的 64 位等效项?

FORCEINLINE bool bAtomicCAS8(volatile UINT8 *dest, UINT8 oldval, UINT8 newval)
{
    bool result=false;
    __asm
    {
        mov     al,oldval
        mov     edx,dest
        mov     cl,newval
        lock cmpxchg    byte ptr [edx],cl
        setz    result
    }
    return(result);
}

以下内联函数在 Visual Studio C++ 下编译

_InterlockedCompareExchange16
_InterlockedCompareExchange
_InterlockedCompareExchange64
_InterlockedCompareExchange128

我正在寻找的是类似的东西

_InterlockedCompareExchange8

但这似乎不存在。

The following code is possible in 32-bit Visual Studio C++. Is there a 64-bit equivalent using intrinsics since inline ASM isn't supported in the 64-bit version of Visual Studio C++?

FORCEINLINE bool bAtomicCAS8(volatile UINT8 *dest, UINT8 oldval, UINT8 newval)
{
    bool result=false;
    __asm
    {
        mov     al,oldval
        mov     edx,dest
        mov     cl,newval
        lock cmpxchg    byte ptr [edx],cl
        setz    result
    }
    return(result);
}

The following instrinsics compile under Visual Studio C++

_InterlockedCompareExchange16
_InterlockedCompareExchange
_InterlockedCompareExchange64
_InterlockedCompareExchange128

What I am looking for is something along the lines of

_InterlockedCompareExchange8

But that doesn't seem to exist.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

锦爱 2024-11-10 18:56:38

不,那不存在。如果需要的话,您可以离线实现它。

原子_msvc_x64.asm

_text   SEGMENT

; char _InterlockedCompareExchange8(volatile char*, char NewValue, char Expected) 
;      - RCX, RDX, R8

_InterlockedCompareExchange8  PROC

    mov    eax,r8d
    lock cmpxchg [rcx],dl
    ret

_InterlockedCompareExchange8  ENDP

_text  ENDS

       END

No, that doesn't exist. You can implement it out-of-line though, if needed.

atomic_msvc_x64.asm

_text   SEGMENT

; char _InterlockedCompareExchange8(volatile char*, char NewValue, char Expected) 
;      - RCX, RDX, R8

_InterlockedCompareExchange8  PROC

    mov    eax,r8d
    lock cmpxchg [rcx],dl
    ret

_InterlockedCompareExchange8  ENDP

_text  ENDS

       END
眼眸 2024-11-10 18:56:38

已针对 Visual Studio 2012 验证此内在函数确实存在:

char _InterlockedCompareExchange8(volatile char*, char NewValue, char Expected)

但是,它在文档中没有出现。

Verified for Visual Studio 2012 that this intrinsic does exist :

char _InterlockedCompareExchange8(volatile char*, char NewValue, char Expected)

However, it appears nowhere in the documentation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文