在Visual C ++中是否有一个8位原子CAS(cmpxchg)内在的X64?

时间:2011-04-26 21:06:28

标签: visual-c++ 64-bit x86-64 inline-assembly

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

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

以下instrinsics在Visual Studio C ++下编译

_InterlockedCompareExchange16
_InterlockedCompareExchange
_InterlockedCompareExchange64
_InterlockedCompareExchange128

我正在寻找的东西是

_InterlockedCompareExchange8

但这似乎并不存在。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

验证了Visual Studio 2012,这种内在存在:

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

但是,文档中似乎没有任何内容。