6. SSE2

MMX, SSE命令を大幅に拡張したものです. 現在P4でのみ利用できます. carryはありませんがx86系初の64bit整数に対する命令が登場しました. また今までfloatとしてしか利用できなかったxmmレジスタを2つのMMXレジスタとして利用でき過去の命令もxmmレジスタに拡張されています. あまりに膨大な拡張のためすぐには把握できなかったりします. ただいま勉強中:-P

6.1 命名規則
各種データタイプは次の文字で表します.

表記内容
PIint x 2
PSfloat x 2
PDdouble x 2
DQ64bit int(int64と略) x 2
SIint x 1
SSfloat x 1
SDdouble x 1
Qint64 x 1

命令の先頭に`P'がつくと整数演算を表します.
`DQ'は`PQ'とか`SQ'にしておいてくれた方が分かりやすかった気がするのですが...

[注意]
例えばxorpd(double x 2それぞれのxor)とpxor(128bitのxor)やmovaps(float x 4のmov)とmovapd(double x 4のmov)とmovq(int64 x 2のmov)が別の命令になっています. 素朴に考えるならどれか1つでよいと思えます. ただCPUに今どういう型で扱っているのかを適切に知らせるために入っているデータの型にあった命令を使うほうがよいようです.

6.1 データ移動

movd, movq
今までのreg32/mmxとmmx間(or memory)の移動に加えてreg32/xmmとxmm間(or memory)の移動が追加されました. レジスタが大きいほうに転送する場合は0拡張されます.

movdq2q, movq2dq
mmxとxmm間の移動です. mmxをxmmに代入するときはやはり0拡張されます.

命名にかなり無理があるように感じます. というか破綻してる(^^;
レジスタサイズが大きいほうへの移動のみmovzxを使い, その他はすべてmovでも良かったと思うのですが.
movdqa, movdqu
movapd, movupd
movaps, movups[SSE]
movdq?はint64として, mov?pdはdoubleとしてデータ移動します. `a'と`u'の違いはメモリを介する場合にalignmentが必要か不要かの違いです.

6.2 型変換

cvt***2%%%
cvtt***2%%%
各種型変換を行います. cvtでの実数から整数への変換はMXCSRレジスタの丸め制御に従いますが, cvttは実数から0方向への切捨てによる整数型への変換です. `***'や`%%%'にはps, pd, pi, dq / sd, si, ssが入ります.


続く


御意見は光成滋生<herumi@nifty.com>までお願いします