Opmaskレジスタを使って、SIMDの各要素について、処理する、処理しないを指定できます。
OpmaskレジスタはK0~K7の8つあり、各64ビットです。{ } 内に書けるのはK0を除く7つのレジスタのうちのひとつです。
intrinsicsでは__mmask8、__mmask16、__mmask32、__mmask64型変数を使用します。
第一オペランドの後に{ }で囲ってOpmaskレジスタをひとつ指定すると、Opmaskレジスタのビットが立っている要素だけが処理され、立っていない要素はデスティネーションのもとの内容がそのまま残ります。
intrinsicsでは_mask_がついたintrinsicsを使い、第一パラメータで「もとの内容」を、第二パラメータでOpmaskを指定します。
例
{k1}を指定しなかったときはOpmask=全ビット1(すべての要素を処理)として扱われます。
第一オペランドでOpmaskレジスタを指定した上で、そのあとに {z} を指定すると、Opmaskレジスタのビットが立っていない要素はゼロクリアされます。
intrinsicsでは_maskz_がついたintrinsicsを使い、第一パラメータでOpmaskを指定します。
例
Opmaskレジスタに値をセットしたり、値を取り出したり、演算したりするには専用の命令を使います。 →Opmaskレジスタ命令
ソースオペランドのm64bcstのところに「qword bcst [rcx]」のように64ビットのメモリオペランドを書くことで、1つの64ビット値を全要素にブロードキャストしたものをソースオペランドとすることができます。
m32bcstも同様に32ビット値をブロードキャストすることができます。
FP16型の命令ではm16bcstで16ビット値をブロードキャストできます。
ブロードキャストできるのはソースオペランドがメモリのときだけです。レジスタからブロードキャストすることはできません。
整数型の16ビット、8ビット命令ではブロードキャストはできません。
{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の例外通知フラグも立ちません。