AVX512メモ

Opmask

Opmaskレジスタを使って、SIMDの各要素について、処理する、処理しないを指定できます。

OpmaskレジスタはK0~K7の8つあり、各64ビットです。{ } 内に書けるのはK0を除く7つのレジスタのうちのひとつです。

intrinsicsでは__mmask8、__mmask16、__mmask32、__mmask64型変数を使用します。

マージマスク {k1}

第一オペランドの後に{ }で囲ってOpmaskレジスタをひとつ指定すると、Opmaskレジスタのビットが立っている要素だけが処理され、立っていない要素はデスティネーションのもとの内容がそのまま残ります。

intrinsicsでは_mask_がついたintrinsicsを使い、第一パラメータで「もとの内容」を、第二パラメータでOpmaskを指定します。

{k1}を指定しなかったときはOpmask=全ビット1(すべての要素を処理)として扱われます。

ゼロマスク {k1}{z}

第一オペランドでOpmaskレジスタを指定した上で、そのあとに {z} を指定すると、Opmaskレジスタのビットが立っていない要素はゼロクリアされます。

intrinsicsでは_maskz_がついたintrinsicsを使い、第一パラメータでOpmaskを指定します。

Opmask操作命令

Opmaskレジスタに値をセットしたり、値を取り出したり、演算したりするには専用の命令を使います。 →Opmaskレジスタ命令

その他

 

m64bcst/m32bcst/m16bcst

ソースオペランドのm64bcstのところに「qword bcst [rcx]」のように64ビットのメモリオペランドを書くことで、1つの64ビット値を全要素にブロードキャストしたものをソースオペランドとすることができます。

m32bcstも同様に32ビット値をブロードキャストすることができます。

FP16型の命令ではm16bcstで16ビット値をブロードキャストできます。

ブロードキャストできるのはソースオペランドがメモリのときだけです。レジスタからブロードキャストすることはできません。

整数型の16ビット、8ビット命令ではブロードキャストはできません。

 

丸め指定{er}、浮動小数点例外抑制{sae}

{er}、{sae}の指定ができる命令では、MXCSRの例外マスク、丸め指定をその命令だけオーバーライドすることができます。

512ビット命令で、メモリオペランドを使わない場合にのみ指定できます。

intrinsicsでは_roundのついたintrinsicsを使い、最後のパラメータで指定します。

多くの浮動小数点命令では{er}で丸めを指定します。{er}を指定したときは浮動小数点例外抑制が必ずついてきます。丸め方法だけオーバーライドして例外はMXCSRどおり、という指定はできません。

アセンブラ
{er}に以下のものを指定
intrinsics
最終パラメーターに以下のものを指定
近い方、等距離のときは最下位ビットが0になる方向 {rn-sae} _MM_FROUND_TO_NEAREST_INT
マイナス無限大方向 {rd-sae} _MM_FROUND_TO_NEG_INF
プラス無限大方向 {ru-sae} _MM_FROUND_TO_POS_INF
ゼロ方向 {rz-sae} _MM_FROUND_TO_ZERO
(MXCSRの指定に従う) 指定しない _MM_FROUND_CUR_DIRECTION
または_roundのついていないintrinsicsを使用

丸めが発生しない命令や、丸め方法を固有に決めている命令では{er}は指定できません。代わりに{sae}で浮動小数点例外抑制を指定できます。saeはSuppress All Exceptionの略です。

アセンブラ
{sae}に以下のものを指定
intrinsics
最終パラメーターに以下のものを指定
浮動小数点例外抑制 {sae} _MM_FROUND_NO_EXC
(MXCSRの指定に従う) 指定しない _MM_FROUND_CUR_DIRECTION
または_roundのついていないintrinsicsを使用

浮動小数点例外抑制をしたときは割り込みが起きないだけでなくMXCSRの例外通知フラグも立ちません。


x86/x64 SIMD命令一覧表 フィードバック