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 を後方のロード命令が追い抜いていくことが可能らしい。