2010-12-16 3 views
1

나는 학교 (eons ago) 이전부터 어셈블리를 해본 적이 없으며 x86을 한번도 해본 적이 없다.하지만 누군가가 원자 연산을하지 않는 오래된 기존 코드에서 성가신 버그를 발견했다. 코드를 작성한 사람은 오래 전에 사라졌고 여기 주변의 아무도 내 질문에 대한 답을 모른다. 128 비트 값에 대한 원자 복사를 작성해야합니다. 다음과 같이 내가 현재 가지고있는 코드는 다음과 같습니다gcc 인라인 x86_64 asm에서 128 비트 숫자의 원자 복사를 수행하는 방법은 무엇입니까?

void atomic_copy128(volatile void* dest,volatile const void* source) { 
#if PLATFORM_BITS == 64 
    #ifdef __INTEL_COMPILER 
     //For IA64 platform using intel compiler 
     *((__int64*)source)=__load128((__int64*)dest,((__int64*)source)+1); 
    #else 
     //For x86_64 compiled with gcc 
     __asm__ __volatile__("lock ; movq %0,%1" 
      : "=r"(*((volatile long *)(source))) 
      : "r"(*((volatile long *)(dest))) 
      : "memory"); 
    #endif 
#else 
    #error "128 bit operations not supported on this platform." 
#endif 
} 

이 그것을 컴파일하고 실행에 도착하는 동안 나는 그것으로 꽤 엉망 한 이후 원래, 시도 코드가 아닙니다. 내가 완전히 잘못된 지시를하면, 컴파일되지 않습니다. 이 명령을 실행하면이 행에 도달 할 때까지 실행 된 다음 "잘못된 명령"오류 메시지가 생성됩니다. 나는 어떤 도움을 주셔서 감사합니다.

답변

1

필자가 아는 한 "movq"는 하나의 메모리 피연산자를 지원하며 그 인수는 64 비트 크기이므로 어쨌든 두 개의 메모리 피연산자가 지원 되더라도 여전히 그 원자 128을 제공하지는 않습니다 당신이 찾고있는 비트 복사. 창에 대한

+0

감사를 위해

(그러나 const은 삭제해야합니다)! 나는 "movdqu"도 오직 하나의 메모리 피연산자만을 허용한다고 가정한다. 만약 그렇다면, 정말로 내가 한 명령으로 할 수 없기 때문에, 원자 복사 연산을 위해 그것을 사용할 수있는 방법이 있습니까? 나는이 모든 잘못에 대해 생각하고 있는가? – user545226

+0

FWIW, 나는 네가 맞다는 것을 믿는다. –

0

:

::memset(dst, -1, 16); 
_InterlockedCompareExchange128(source, -1, -1, dst); 

다른 용도로 사용 cmpxchg16b 명령의 응답

관련 문제