SSE 4.1
読み:エスエスイー-よんてんいち
外語:SSE4.1: Streaming SIMD Extensions 4.1

 SSE4のうち、Penrynから搭載された47個の命令のこと。
目次

概要
 様々なメディア処理、画像処理、3D処理のパフォーマンス向上を目的とした新命令群である。
 前述のような用途向けに特化された命令が多いが、XMMレジスターの任意のビットの挿入・抽出命令や、丸めモードを即値で指定できる丸め命令などの汎用的な命令もある。
 各命令についの詳細は後述する。

特徴

機能の有無判別
 機能の有無は、EAXレジスターに1を代入してCPUID命令を実行し、ECXレジスターに得られたフラグのビット19が1かどうかで確認できる。

追加命令

パックド・ダブルワードの乗算命令
 4つの32ビット×32ビット演算を実行する命令である。

積和命令
 新たな積和演算命令が二つ追加された。
 dpps命令は、2個、3個、4個から任意に選択できる。

ストリーミングヒント命令
 CPUのライトコンバイン(WriteCombine)メモリーへのアクセスは遅い。そこで、解決のための新命令が追加された。
 この命令の挙動は、通常のロード命令と同様で、メモリーから16バイトを読み込みレジスターにコピーする命令である。
 通常のロード命令と異なるのは、ライトコンバインメモリーからキャッシュラインと同量のデータを一時バッファーにコピーし、そこから16バイトをレジスターにコピーする点にある。このため、後続の命令がロードする対象が一時バッファーに含まれていた場合、一時バッファーの中からデータをコピーするため高速である。

ブレンド命令
 ソースオペランドから、同じフィールドのディスティネーションオペランドに値をコピーするブレンディングのための命令が追加されている。
 従来、2から4命令必要だったものを1命令で実行できるようにし、処理の効率改善をする。

パックド整数の最小値/最大値命令
 8種類の、パックド整数の最小値/最大値を求める命令が追加された。
 既に、画像処理用に8ビット符号なし、音声処理用に16ビット符号ありの命令があったが、今回はこれに新演算が追加されたことになる。
 但し制限として、演算のオペランドはXMMレジスターのみである。整数演算の一種ではあるが、MMXレジスターは使用できない。

丸め命令
 浮動小数点を丸めて整数にする、4つの丸め命令が追加されている。
 丸めモードは、現在のモードか、または即値で任意に指定することが可能。丸めモードはIEEE-754の四種類のモード(最近値、-∞方向、+∞方向、切り捨て)に対応する。
 これを用いると、床関数floor()や天井関数ceil()が、理論上は一命令で実装することが出来る。

ビットの挿入・抽出命令
 GPRおよびXMMレジスター間での単純なデータ挿入/抽出命令が7つ(但しアセンブリ命令のニーモニックとしては9種類)追加されている。
 ワード以上であっても、メモリーアクセス時のアラインメントは必要ない。
 また、pinsrXのワード単位で動作する命令pinsrwは、既にSSE命令セットに存在する。

パックド・整数フォーマット変換
 小さなパックド整数を、大きなパックド整数に変換する命令が12個追加されている。
 符号ありの場合は符号拡張をし、元の整数のMSBで拡張される部分を埋める。ゼロパディングの場合は、拡張部分はゼロで埋める。
 オペランドはXMMレジスターもしくはメモリー、ディスティネーションはXMMレジスターである。ワード以上であってもアラインメントは必須ではないが、アラインメントチェックが有効の場合は、メモリー境界を合わせる必要がある。

SAD(Sum absolute difference、差分絶対和)命令
 8つの符号なしバイト整数のSADを実行し、一つの符号なしワード整数を得る命令が一つ追加されている。
 SSE2から搭載されたpsadbwと比較すると、この新命令mpsadbwは内部にソースシフター(Source Shifter)が装備されており、命令一つで8種類のSADが計算できる。このためオペランドにimm8が追加されている。
 例えば画像処理で、xmm1に前画像、xmm2に現画像を8ヶ所分指定して実行すれば、8つのSADをまとめてxmm1に返してくれる。従って、例えば8×8サイズのSAD演算を従来とSSE4で比較すると、コード量は1/3程度にまでコンパクトに済むようになる。

最小値抽出命令
 8つの符号なしパックドワードから、最小値とその位置を求める命令が追加された。
 上で紹介したmpsadbw命令は、その結果のワードを8個、XMMレジスターにパックして返す。この命令は、これをまとめて比較し、最小の値とその場所を返す命令である。
 この検索を迅速に行なうことは、モーション予測の処理の高速化に繋がり、つまりビデオエンコーディング処理の高速化に寄与する。
 結果は、ディスティネーションのビット0〜15に最小値、その最小ワードのインデックスがビット16〜18に格納される。ディスティネーションの残りのビットは(将来的な拡張の可能性はあるが現時点では)ゼロで埋められる。

マスク比較命令
 XMMレジスターに対するtest命令が一つ追加された。
 ソースとデスティネーションの各XMMレジスター同士をAND演算し、結果をフラグ(CFおよびZF)に格納する命令である。XMMレジスターの内容は変化しない。
 従来であれば、一旦CPUのレジスターに複写してからtest命令をせざるを得なかった。パックされた整数であれば、例えばpmovmskbなどの命令の後でtest命令を使う、などが一般的である。ptestを使うと、その手間が不要になる。

パックド・クアッドワードの比較命令
 パックされた値の比較命令が一つ追加された。
 この命令は、従来からあるpcmpeqb/pcmpeqw/pcmpeqdなどと同様の処理だが、比較単位がクアッドワードとなる。

ダブルワードの飽和処理パック命令
 飽和演算処理の付いた、ダブルワードからワードへの変換命令が一つ追加された。
 元の符号ありダブルワードが、符号なしワードの範囲外(0xFFFFより大きい、または0より小さい)場合、0xFFFFまたは0x0000がディスティネーションに格納されます(飽和処理)。

再検索