AMD が新しい命令セット SSE5 を発表したそうです。
・AMD、新たなx86拡張命令セット「SSE5」~「Bulldozer」コアに搭載予定
こちら のページから資料を見ることができます。
3オペランド命令は扱いやすいので素直にうれしいですね。
命令セットをざっと眺めてみると、16bit fp のサポートも
あるみたいです。これはいい!
CVTPH2PS fp16×4 → fp32×4 CVTPS2PH fp32×4 → fp16×4
符号1、指数5、仮数10 の s10e5 で、Shader の half 型と一緒です。
相互変換命令によるサポートですが、GPU との相性もいいだろうし
HDR テクスチャの生成や変換も速くなるでしょう。
他にも shader 等ではおなじみの積和命令があります。例えば
FMADDPS dest, src1, src2, src3
これは dest= src1*src2 + src3 の演算を行うもので、shader だと
mad r0, r1, r2, r3
に相当します。でもこれ、3オペランドどころか 4オペランドです。
どうやら各フィールドは完全に独立しておらず、どこかの src
レジスタを dest と共有しなければいけないようにみえます。
FMADDPS xmm1, xmm1, xmm2, xmm3/mem32 FMADDPS xmm1, xmm1, xmm3/mem32, xmm2 FMADDPS xmm1, xmm2, xmm3/mem32, xmm1 FMADDPS xmm1, xmm3/mem32, xmm2, xmm1
よく読んでみると確かに、レジスタフィールドは
DREX.dest、ModRM.reg、ModRM.r/m の3箇所で、
残る1つのソースは dest と同じレジスタを使うと書いてありました。
あまり素直に喜べないかもしれません。
演算時の符号バリエーションとして次の4種類、それぞれ個別の
命令があるようです。
dest= src1*src2 + src3 dest= src1*src2 - src3 dest= -src1*src2 + src3 dest= -src1*src2 - src3
また整数演算用の4オペランド積和命令もあります。
これら以外にも、比較などいろいろ追加命令があります。
例えば PHADDBQ を使うと、8bit の値×8 の合計がいっぺんに求まります。
128bit レジスタは 16byte 相当なので、上位 8個と下位 8個の byte
値の合計2個になります。
8bit + 8bit → 16bit
16bit + 16bit → 32bit
32bit + 32bit → 64bit
と、加算3段階分です。