SSE 4.1
読み:エスエスイー-よんてんいち
外語:SSE4.1: Streaming SIMD Extensions 4.1
SSE4
のうち、
Penryn
から搭載された47個の命令のこと。
目次
概要
特徴
機能の有無判別
追加命令
パックド・ダブルワードの乗算命令
積和命令
ストリーミングヒント命令
ブレンド命令
パックド整数の最小値/最大値命令
丸め命令
ビットの挿入・抽出命令
パックド・整数フォーマット変換
SAD(Sum absolute difference、差分絶対和)命令
最小値抽出命令
マスク比較命令
パックド・クアッドワードの比較命令
ダブルワードの飽和処理パック命令
概要
様々なメディア処理、画像処理、3D処理のパフォーマンス向上を目的とした新命令群である。
前述のような用途向けに特化された命令が多いが、
XMMレジスター
の任意のビットの挿入・抽出命令や、丸めモードを即値で指定できる丸め命令などの汎用的な命令もある。
パックド・ダブルワードの乗算命令×2
積和命令×2
ストリーミングヒント命令×1
ブレンド命令×6
パックド整数の最小値/最大値命令×8
丸め命令×4
ビットの挿入・抽出命令×7
パックド・整数フォーマット変換×12
SAD(Sum absolute difference、差分絶対和)命令×1
最小値抽出命令×1
マスク比較命令×1
パックド・クアッドワードの比較命令×1
ダブルワードの飽和処理パック命令×1
各命令についの詳細は後述する。
特徴
機能の有無判別
機能の有無は、EAXレジスターに1を代入して
CPUID命令
を実行し、ECXレジスターに得られたフラグのビット19が1かどうかで確認できる。
追加命令
パックド・ダブルワードの乗算命令
4つの32ビット×32ビット演算を実行する命令である。
pmuldq ‐ 符号付き64ビットを計算結果とする
pmulld ‐ 計算結果の下位32ビットを計算結果とする
積和命令
新たな積和演算命令が二つ追加された。
dpps ‐ 最大4つの単精度浮動小数点
dppd ‐ 2つの倍精度浮動小数点
dpps命令は、2個、3個、4個から任意に選択できる。
ストリーミングヒント命令
CPUのライトコンバイン(WriteCombine)メモリーへのアクセスは遅い。そこで、解決のための新命令が追加された。
movntdqa ‐ ストリーミングリード命令
この命令の挙動は、通常のロード命令と同様で、メモリーから16バイトを読み込みレジスターにコピーする命令である。
通常のロード命令と異なるのは、ライトコンバインメモリーからキャッシュラインと同量のデータを一時バッファーにコピーし、そこから16バイトをレジスターにコピーする点にある。このため、後続の命令がロードする対象が一時バッファーに含まれていた場合、一時バッファーの中からデータをコピーするため高速である。
ブレンド命令
ソースオペランドから、同じフィールドのディスティネーションオペランドに値をコピーするブレンディングのための命令が追加されている。
従来、2から4命令必要だったものを1命令で実行できるようにし、処理の効率改善をする。
blendps ‐ バックド単精度ブレンド
blendpd ‐ バックド倍精度ブレンド
blendvps ‐ バックド単精度バリアブルブレンド
blendvpd ‐ バックド倍精度バリアブルブレンド
pblendvb ‐ バックドbyteバリアブルブレンド
pblendw ‐ バックドwordブレンド
パックド整数の最小値/最大値命令
8種類の、パックド整数の最小値/最大値を求める命令が追加された。
pminsb ‐ パックドsigned byteの最小値
pmaxsb ‐ パックドsigned byteの最大値
pminuw ‐ パックドunsigned wordの最小値
pmaxuw ‐ パックドunsigned wordの最大値
pminud ‐ パックドunsigned dwordの最小値
pmaxud ‐ パックドunsigned dwordの最大値
pminsd ‐ パックドsigned dwordの最小値
pmaxsd ‐ パックドsigned dwordの最大値
既に、画像処理用に8ビット符号なし、音声処理用に16ビット符号ありの命令があったが、今回はこれに新演算が追加されたことになる。
但し制限として、演算のオペランドは
XMMレジスター
のみである。整数演算の一種ではあるが、MMXレジスターは使用できない。
丸め命令
浮動小数点を丸めて整数にする、4つの丸め命令が追加されている。
roundps ‐ パックド単精度浮動小数点の丸め
roundss ‐ スカラー単精度浮動小数点の丸め
roundpd ‐ パックド倍精度浮動小数点の丸め
roundsd ‐ スカラー倍精度浮動小数点の丸め
丸めモードは、現在のモードか、または即値で任意に指定することが可能。丸めモードはIEEE-754の四種類のモード(最近値、-∞方向、+∞方向、切り捨て)に対応する。
これを用いると、床関数floor()や天井関数ceil()が、理論上は一命令で実装することが出来る。
ビットの挿入・抽出命令
GPRおよび
XMMレジスター
間での単純なデータ挿入/抽出命令が7つ(但しアセンブリ命令のニーモニックとしては9種類)追加されている。
extractps ‐ XMMレジスター内の単精度浮動小数点の任意の要素をメモリーまたはGPRに格納する
insertps ‐ メモリーまたはXMMレジスターの単精度浮動小数点をXMMレジスターに挿入する。また+0.0をディスティネーションフィールドに格納することも可能
pinsrb ‐ R32/64またはメモリーのバイトをXMMレジスターに挿入
pinsrd ‐ R32/64またはメモリーのダブルワードをXMMレジスターに挿入
pinsrq ‐ R32/64またはメモリーのクアッドワードをXMMレジスターに挿入
pextrb ‐ XMMレジスターのバイトを抽出し、R32/64またはメモリーに格納
pextrw ‐ XMMレジスターのワードを抽出し、R32/64またはメモリーに格納
pextrd ‐ XMMレジスターのダブルワードを抽出し、R32/64またはメモリーに格納
pextrq ‐ XMMレジスターのクアッドワードを抽出し、R32/64またはメモリーに格納
ワード以上であっても、メモリーアクセス時の
アラインメント
は必要ない。
また、pinsrXのワード単位で動作する命令pinsrwは、既にSSE命令セットに存在する。
パックド・整数フォーマット変換
小さなパックド整数を、大きなパックド整数に変換する命令が12個追加されている。
pmovsxbw ‐ パックドバイト→ワード拡張(符号あり)
pmovzxbw ‐ パックドバイト→ワード拡張(ゼロパディング)
pmovsxbd ‐ パックドバイト→ダブルワード拡張(符号あり)
pmovzxbd ‐ パックドバイト→ダブルワード拡張(ゼロパディング)
pmovsxbq ‐ パックドバイト→クアッドワード拡張(符号あり)
pmovzxbq ‐ パックドバイト→クアッドワード拡張(ゼロパディング)
pmovxswd ‐ パックドワード→ダブルワード拡張(符号あり)
pmovzxwd ‐ パックドワード→ダブルワード拡張(ゼロパディング)
pmovsxwq ‐ パックドワード→クアッドワード拡張(符号あり)
pmovzxwq ‐ パックドワード→クアッドワード拡張(ゼロパディング)
pmovsxdq ‐ パックドダブルワード→クアッドワード拡張(符号あり)
pmovzxdq ‐ パックドダブルワード→クアッドワード拡張(ゼロパディング)
符号ありの場合は符号拡張をし、元の整数のMSBで拡張される部分を埋める。ゼロパディングの場合は、拡張部分はゼロで埋める。
オペランドはXMMレジスターもしくはメモリー、ディスティネーションはXMMレジスターである。ワード以上であっても
アラインメント
は必須ではないが、アラインメントチェックが有効の場合は、メモリー境界を合わせる必要がある。
SAD(Sum absolute difference、差分絶対和)命令
8つの符号なしバイト整数のSADを実行し、一つの符号なしワード整数を得る命令が一つ追加されている。
mpsadbw ‐ 差分絶対和
SSE2から搭載されたpsadbwと比較すると、この新命令mpsadbwは内部にソースシフター(Source Shifter)が装備されており、命令一つで8種類のSADが計算できる。このためオペランドにimm8が追加されている。
例えば画像処理で、xmm1に前画像、xmm2に現画像を8ヶ所分指定して実行すれば、8つのSADをまとめてxmm1に返してくれる。従って、例えば8×8サイズのSAD演算を従来とSSE4で比較すると、コード量は1/3程度にまでコンパクトに済むようになる。
最小値抽出命令
8つの符号なしパックドワードから、最小値とその位置を求める命令が追加された。
phminposuw ‐ 最小値+位置の抽出 (16ビットワード)
上で紹介したmpsadbw命令は、その結果のワードを8個、XMMレジスターにパックして返す。この命令は、これをまとめて比較し、最小の値とその場所を返す命令である。
この検索を迅速に行なうことは、モーション予測の処理の高速化に繋がり、つまりビデオエンコーディング処理の高速化に寄与する。
結果は、ディスティネーションのビット0〜15に最小値、その最小ワードのインデックスがビット16〜18に格納される。ディスティネーションの残りのビットは(将来的な拡張の可能性はあるが現時点では)ゼロで埋められる。
マスク比較命令
XMMレジスターに対するtest命令が一つ追加された。
ptest ‐ same as test, but for sse registers.
ソースとデスティネーションの各XMMレジスター同士をAND演算し、結果をフラグ(CFおよびZF)に格納する命令である。XMMレジスターの内容は変化しない。
従来であれば、一旦CPUのレジスターに複写してからtest命令をせざるを得なかった。パックされた整数であれば、例えばpmovmskbなどの命令の後でtest命令を使う、などが一般的である。ptestを使うと、その手間が不要になる。
パックド・クアッドワードの比較命令
パックされた値の比較命令が一つ追加された。
pcmpeqq ‐ パックド・クアッドワードの同一比較
この命令は、従来からあるpcmpeqb/pcmpeqw/pcmpeqdなどと同様の処理だが、比較単位がクアッドワードとなる。
ダブルワードの飽和処理パック命令
飽和演算処理の付いた、ダブルワードからワードへの変換命令が一つ追加された。
packusdw ‐ 符号ありパックド・ダブルワード→符号なしパックド・ワード変換(飽和付き)
元の符号ありダブルワードが、符号なしワードの範囲外(0xFFFFより大きい、または0より小さい)場合、0xFFFFまたは0x0000がディスティネーションに格納されます(飽和処理)。
再検索