アトミックな64ビット操作

Windows 32bit + VS2010(ネイティブC++)環境での話。
インテルのマニュアルによると64ビット境界にアライメント調整された64ビット値の読み、書きはアトミックに操作できるようだ。

7.1.1. 保証付きアトミック操作
インテル® Pentium® 4 プロセッサ、インテル® Xeon™ プロセッサ、P6 ファミリ・プロ
セッサ、インテル® Pentium® プロセッサ、Intel486™プロセッサは、次の基本的なメモ
リ操作が常にアトミックに実行されるよう保証する。
・1 バイトの読み取りまたは書き込み。
・16 ビット境界にアライメント合わせされた1 ワードの読み取りまたは書き込み。
・32 ビット境界にアライメントが調整された1 ダブルワードの読み取りまたは書き
込み。
インテルPentium 4 プロセッサ、インテルXeon プロセッサ、P6 ファミリ・プロセッサ、
インテルPentium プロセッサは、これに加えて、次のメモリ操作が常にアトミックに
実行されるよう保証する。
・64 ビット境界にアライメントが調整された1 クワッドワードの読み取りまたは書
き込み。
・32 ビット・データ・バス内に納まる、キャッシュされていないメモリ位置への16
ビット・アクセス。

これをVC++2010のインラインアセンブラで実装してみる

void Copy64Bit(long long *dest, long long *src)
{
	__asm	{
		mov esi, src
		mov edi, dest
		movq mm0, [esi]
		movq [edi], mm0
		emms
	}
}

これでも良さそうなんだけど、MMX命令は最後にEMMSという命令を入れないといけなくて、この命令が遅いらしい。
movqという命令はSSEになってSSE用のレジスタ(XMMレジスタ)も指定できるようになったのでmm0をxmm0に変えるだけでMMX→SSE化できそう。

void Copy64Bit(long long *dest, long long *src)
{
	__asm	{
		mov esi, src
		mov edi, dest
		movq xmm0, [esi]
		movq [edi], xmm0
	}
}

ところが、これはコンパイルエラーになる

error C2415: オペランドの型が無効です。

で、いろいろ調べたところ、ちょっとおまじないを書かないといけないようだ。qword ptrがおまじない

void Copy64Bit(long long *dest, long long *src)
{
	__asm	{
		mov esi, src
		mov edi, dest
		movq xmm0, qword ptr[esi]
		movq qword ptr[edi], xmm0
	}
}

movqという命令の名称がそのままで拡張されたからこんな事になったのかな?
他のSSE命令はこんなおまじない不要みたいだし。