3.2.2 即値
即値はALUがimm命令により出力する値である。
即値のフォーマットは以下である。
code:txt(c)
(f|h)"<floating-point-number-literal>"
| (i|s|ui|us)"<integer-number-literal>"
ダブルクオートが必須なので注意する。
先頭は数値型を指定する。
(f|h)は単精度浮動小数点数および半精度浮動小数点数
(i|s)は符号ありの単精度整数および半精度整数
(ui|us)は符号なしの単精度整数および半精度整数である。
長語の数値型d, l, ulは即値指定ビット数が不足しているため指定できない。
即値命令が実際に出力する値は、ペイロードリテラルが指定する単語の値を、3.6.12.3 imm-即値命令で述べる方法で並べたものである。
上記の数値型指定に関わらず、ペイロードリテラルは単語の値を定める。
数値型が半精度ならば、同じ値を 2 つ並べて単語の値とする。
ペイロードとなるリテラルの解釈は以下の通りである。
浮動小数点数(<floating-point-number-literal>)の場合
まずC言語のstrtofでfloatの値に変換される。
その後単精度指定であればそのまま扱われ、半精度指定であれば丸めが行われる。
整数(<integer-number-literal>)の場合
符号あり整数i, sであれば、先頭に符号+/-をつけることを許す。
符号以降は自然数として扱う。
値が数値型の範囲外であればエラーになる。
以下に例を示す。ALUが実際に出力する結果の詳細な定義は即値命令式の節(3.6.12.3 imm-即値命令)に譲る。
code:例 1
imm f"-1.0" $ln
単精度浮動小数点数の-1.0をLM1に出力する。
code:例 2
imm us"0x8000" $t
半精度符号なし整数の0x8000をTレジスタに出力する。
なおこの例でimm s"0x8000" $tとすると、半精度符号あり整数の範囲外なのでエラーとなる。