Numeric Instructions
撰写时间:2025-01-20
修订时间:2025-01-24
数值类型
Wasm的数值类型 (number types) 只有4种:
numtype ::= i32 | i64 | f32 | f64
其中前缀i
表示integer
,即整数;前缀f
表示floating-point
,即浮点数。
整数是否有符号,不由该数据类型来指定,但可以通过调用该数据类型相应的有符号指令或无符号指令来指定。
使用|t|
来表示一个数值类型的位域 (bit width,也称位宽),因此,上面各个数值类型的位域分别为:
|i32| = |f32| = 32
|i64| = |f64| = 64
32位为4个字节,64位为8个字节。
值域
整数的值域公式如下:
\[
\begin{align}
_uN &::= 0|1| ... | 2^{N}-1 \tag{unsigned} \\
_sN &::= -2^{N-1} | ... |-1|0|1| ... | 2^{N-1}-1 \tag{signed} \\
_iN &::= _uN \tag{uninterpreted}
\end{align}
\]
具体值域如下:
const { DOMUtils } = await import('/js/esm/DOMUtils.js');
let ths = ['位域', '符号', '最小值', '最大值'];
let cells = [
[['32 bits', 2], 'unsigned', 0, Math.pow(2, 32) - 1],
['signed', -Math.pow(2, 31), Math.pow(2, 31) - 1],
[['64 bits', 2], 'unsigned', 0, Math.pow(2, 64) - 1],
['signed', -Math.pow(2, 63), Math.pow(2, 63) - 1],
];
let str = DOMUtils.GenTableStr(ths, cells);
pc.log('%o', str);
数值指令总表
所有数值指令如下:
nn, mm ::= 32 | 64
sx ::= u | s
instr ::= inn.const unn | fnn.const fnn
| inn.iunop | fnn.funop
| inn.ibinop | fnn.fbinop
| inn.itestop
| inn.irelop | fnn.frelop
| inn.extend8_s | inn.extend16_s | i64.extend32_s
| i32.wrap_i64 | i64.exend_i32_sx | inn.trunc_fmm_sx
| inn.trunc_sat_fmm_sx
| f32.demote_f64 | f64.promote_f32 | fnn.convert_imm_sx
| inn.reinterpret_fnn | fnn.reinterpret_inn
| ...
iunop ::= clz | ctz | popcnt
ibinop ::= add | sub | mul | div_sx | rem_sx
| and | or | xor | shl | shr_sx | rotl | rotr
funop ::= abs | neg | sqrt | ceil | floor | trunc | nearest
fbinop ::= add | sub | mul | div | min | max | copysign
itestop ::= eqz
irelop ::= eq | ne | lt_sx | gt_sx | le_sx | ge_sx
frelop ::= eq | ne | lt | gt | le | ge
在表中,nn及mm的用法如下:
- nn及mm均可指代32位或64位的数据类型
- 指令名称中若只出现一个数据类型,使用nn来表示
- 指令名称中若同时出现两个数据类型时:
- 如果后面的数据类型须与前面的一致,指令名称后面的数据类型使用nn来表示
- 如果后面的数据类型无须与前面的一致,指令名称后面的数据类型使用mm来表示