3.6.2.1 書き込みマスク適用
PEメモリ(LM0、LM0ベースアドレスレジスタ、LM1、LM1ベースアドレスレジスタ、GRF0、GRF1、Tレジスタ、マスクレジスタ)の書き込みにはマスクを作用させられる。
マスク作用時にはマスクレジスタにあらかじめ書き込んでおいたマスクフラグを用いる。
マスクフラグが 0のとき、対応するPEメモリの箇所への書き込みは行われない。
マスク作用時には次を指定する。
マスク作用語長
PEメモリ(GRF0、GRF1、Tレジスタ、LM0およびLM0のベースアドレスレジスタ、LM1および
LM1のベースアドレスレジスタ)のどれにマスクを作用させるか(複数指定可能)
どのエントリを読み出すかのアドレス
code:文法(複数行適用)
maskl|llrstmnk <addr>
maskl, maskll, maskr, masks, maskt, maskm, maskn, maskk
その行以降のすべての書き込みマスク設定を指定する。
それ以降のPE命令式の動作を変更する制御文であって、これ自体はPE命令式ではない。
[l|ll]はマスク作用語長指定である。
lが長語、llが 2 長語となる。
省略すると長語になる。
[r][s][t][m][n][k]は順にGRF0、GRF1、Tレジスタ、LM0およびLM0のベースアドレスレジスタ、LM1およびLM1のベースアドレスレジスタ、マスクレジスタへの書き込みマスクを有効化する。
指定がないメモリ要素に対するマスクはオフになる。
[r][s][t][m][n][k]は実際には順不同である。
<mask-pattern>はマスクレジスタのエントリのアドレスを 0 から 31 で指定する。
アセンブリ先頭での暗黙の指定はmask 0、すなわち書き込みマスクを一切適用しない設定となっている。
文法(単一行適用)/([ll]<mask-pattern>|$[ll]imr)
*^3 この定義から、固定値エントリのアドレス 0 とアドレス 31 は同じ内容となる。
そのステップのみで複数行マスク指定をキャンセルし、<addr>への書き込みにマスクを適用する。
<addr>はいずれかの書き込み先PEメモリオペランドである。
[ll]<mask-pattern>が固定値エントリ、$[ll]imrが可変エントリの指定である。
llはマスク作用語長指定を 2 長語にする。
<mask-pattern>は固定値エントリにおける各サイクルのフラグ値を、第 1 サイクルから順に 0 か 1 の 4 回の繰り返しで指定する。
<addr>は可変エントリのアドレスを 1 から 15 の整数で指定する。
エラー
同一ステップ内において、マスク作用語長やエントリのアドレスが一致しない複数の単一行マスク適用が指定された場合、エラーになる
書き込み先PEメモリオペランドの語長とマスク作用語長について、片方が 2 長語でもう片方が 2 長語でない場合、エラーになる
code:例.複数行適用
maskr 0 b10001
lpassa $lm0v $lr0v
lpassa $lm8v $lr8v
mask 0
LM0からGRF0に、 2 ステップそれぞれにおいて第 4 サイクルでのみコピーを行う。
すなわち、$lr6,$lr14 のみが更新される。
その後、マスクが一切適用されないデフォルトの状態に戻す。
code:例.固定値エントリの単一行適用
mask 0
lpassa $lm0v $lr0v/0001
lpassa $lm8v $lr8v/1000
LM0からGRF0に、最初のステップでは第 4 サイクル、次のステップでは第 1 サイクルでのみコピーを行う。
すなわち、$lr6,$lr8のみが更新される。
その後、マスクが一切適用されないデフォルトの状態に戻る。
code:例.可変エントリの単一行適用
hmmul $lx $lm0v $llr0v/$llimr1
1 番の可変エントリからフラグを読み出し、半精度行列ベクトル積演算の結果をマスクを適用しつつGRF0に書き込む。
ここで半精度MAU演算の基本動作の結果は 2 長語になるため、マスク作用語長も 2 長語としている。