Существует ли 8-разрядный атомарный CAS (cmpxchg) для X64 в Visual C ++? - PullRequest
6 голосов
/ 27 апреля 2011

Следующий код возможен в 32-битной Visual Studio C ++. Существует ли 64-разрядный эквивалент с использованием встроенных функций, поскольку встроенный ASM не поддерживается в 64-разрядной версии 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);
}

Следующие встроенные функции компилируются в Visual Studio C ++

_InterlockedCompareExchange16
_InterlockedCompareExchange
_InterlockedCompareExchange64
_InterlockedCompareExchange128

Я ищу что-то вроде

_InterlockedCompareExchange8

Но этого, похоже, не существует.

Ответы [ 2 ]

3 голосов
/ 05 января 2014

Проверено для Visual Studio 2012, что эта внутренняя сущность существует:

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

Однако в документации это нигде не встречается.

3 голосов
/ 28 апреля 2011

Нет, этого не существует.Вы можете реализовать его вне линии, если необходимо.

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
...