x86 に 3 オペランド論理演算命令と新キャッシュフラッシュ命令が追加
将来の Intel x86 CPU に追加される機能を先出しで解説する Intel Architecture Instruction Set Extensions Programming Reference が Mar. 2014 に改定され -019 になったようだ。前回は -016 の日記を書いている(id:nminoru:20140529:intelcpu)。しばらくチェックを怠ったら一つ飛んだ。
https://software.intel.com/en-us/file/319433-019pdf
主に -016 から入った機能の修正だが、AVX に TERNARY BIT VECTOR LOGIC TABLE(VTERNLOG) という命令群と CLFLUSHOPT 命令が追加されたのが新しい
TERNARY BIT VECTOR LOGIC TABLE(VTERNLOG)
VTERNLOGD/VTERNLOGQ 命令という 3 つのオペランドをとることが可能な論理演算命令が追加される。命令のプレフィックスから AVX 命令だと思われる。
A、B、C という 3 つのオペランドを入力としてとり、第一オペランドの A に結果を書き戻すことになる。どのような演算を行うかは、8 ビットの即値フィールドの内容によって変化する。たとえば
A = A and B xor C
のような設定が可能だ。
また C 言語の参考演算子のように、どれか一つを判断条件に指定することも可能になっている。
A = B ? A : C
命令フォーマットなどの詳細な仕様はまだ公開されていない。
追記 (2015/6/19)
Intel Architecture Instruction Set Extensions Programming Reference に -022 が公開され、もう少しはっきりわかった。
- ニーモニックは VPTERNLOGD/VPTERNLOGQ
- AVX-512 の 3 オペランドのビット演算命令
- 演算パターンは 8 ビット即値フィールドが与える 256 パターンがとれる。
- A, B, C のいずれかを定数値(1 or 0)で置き換える。
- NOT, AND, OR, NAND, NOR, XOR, XNOR
- A ? B : C のような選択パターン
- ちょっと変わり者の major(A, B, C) と minor(A, B, C) がある。major は 3 つのビットのうち 2 個以上が 1 なら 1、それ以外は 0。minor は 2 個以上が 0 なら 1、それ以外なら 0 というもの。
CLFLUSHOPT
CPU キャッシュを追い出す命令として CLFLUSHOPT 命令が追加された。もともと CLFLUSH 命令の代わりに使うように指示されている。
CLFLUSH と CLFLUSHOPT の違いは、CLFLUSH と他の命令との間にバリアをはり実行順序を指定するには MFENCE 命令を使う必要があったが、CLFLUSHOPT 命令は SFENCE 命令によっても順序化される点である。通常の使い方では CLFUSHOPT を後方のロード命令が追い抜いていくことが可能らしい。