变更历史¶
自 WebAssembly 规范最初发布 1.0 版本以来,许多扩展提案已被集成。以下部分概述了有哪些变化。
2.0 版本¶
符号扩展指令¶
添加了新的数值指令,用于在整数表示中执行符号扩展 [1]。
新的 数值指令:\(\mathsf{i}\mathit{nn}\mathsf{.}\href{../syntax/instructions.html#syntax-instr-numeric}{\mathsf{extend}}\mathit{N}\mathsf{\_s}\)
非陷阱浮点数到整数转换¶
添加了新的转换指令,在将浮点数转换为整数时避免陷阱 [2]。
新的 数值指令:\(\mathsf{i}\mathit{nn}\mathsf{.}\href{../syntax/instructions.html#syntax-instr-numeric}{\mathsf{trunc}}\mathsf{\_sat\_f}\mathit{mm}\mathsf{\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\)
多值¶
将块和函数的结果类型泛化,以允许使用多个值;此外,引入了具有块参数的功能 [3]。
引用类型¶
添加了 \(\href{../syntax/types.html#syntax-reftype}{\mathsf{funcref}}\) 和 \(\href{../syntax/types.html#syntax-reftype}{\mathsf{externref}}\) 作为新的值类型和相应的指令 [4]。
新的 值类型:引用类型 \(\href{../syntax/types.html#syntax-reftype}{\mathsf{funcref}}\) 和 \(\href{../syntax/types.html#syntax-reftype}{\mathsf{externref}}\)
新的 引用指令:\(\href{../syntax/instructions.html#syntax-instr-ref}{\mathsf{ref{.}null}}\),\(\href{../syntax/instructions.html#syntax-instr-ref}{\mathsf{ref{.}func}}\),\(\href{../syntax/instructions.html#syntax-instr-ref}{\mathsf{ref{.}is\_null}}\)
丰富 参数化指令:\(\href{../syntax/instructions.html#syntax-instr-parametric}{\mathsf{select}}\) 带有可选类型立即数
表指令¶
添加了直接访问和修改表的指令 [4]。
新的 表指令:\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.get}}\),\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.set}}\),\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.size}}\),\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.grow}}\)
多个表¶
添加了每个模块使用多个表的功能 [4]。
表指令 使用 表索引 立即数:\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.get}}\),\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.set}}\),\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.size}}\),\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.grow}}\),\(\href{../syntax/instructions.html#syntax-instr-control}{\mathsf{call\_indirect}}\)
批量内存和表指令¶
新的 内存指令:\(\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{memory.fill}}\),\(\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{memory.init}}\),\(\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{memory.copy}}\),\(\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{data.drop}}\)
新的 表指令:\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.fill}}\),\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.init}}\),\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{table.copy}}\),\(\href{../syntax/instructions.html#syntax-instr-table}{\mathsf{elem.drop}}\)
新的 数据计数段 在二进制格式中
活动数据和元素段边界不再在编译时检查,而是可能导致陷阱
向量指令¶
添加了向量类型和并行操作多个数值的指令(也称为 *SIMD*,单指令多数据) [6]
新的 值类型:\(\href{../syntax/types.html#syntax-valtype}{\mathsf{v128}}\)
新的 内存指令:\(\mathsf{v128.}\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{load}}\),\(\mathsf{v128.}\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{load}}{}\!N\!\mathsf{x}\!M\!\mathsf{\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{v128.}\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{load}}{}N\mathsf{\_zero}\),\(\mathsf{v128.}\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{load}}{}N\mathsf{\_splat}\),\(\mathsf{v128.}\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{load}}{}N\mathsf{\_lane}\),\(\mathsf{v128.}\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{store}}\),\(\mathsf{v128.}\href{../syntax/instructions.html#syntax-instr-memory}{\mathsf{store}}{}N\mathsf{\_lane}\)
新的常量 向量指令:\(\mathsf{v128.}\href{../syntax/instructions.html#syntax-instr-vec}{\mathsf{const}}\)
新的一元 向量指令:\(\mathsf{v128.not}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.abs}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.neg}\),\(\mathsf{i8x16.popcnt}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.abs}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.neg}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.sqrt}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.ceil}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.floor}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.trunc}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.nearest}\)
新的二元向量指令:\(\mathsf{v128.and}\),\(\mathsf{v128.andnot}\),\(\mathsf{v128.or}\),\(\mathsf{v128.xor}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.add}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.sub}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.mul}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.add\_sat\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.sub\_sat\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.min\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.max\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.shl}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.shr\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.add}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.extmul\_}\href{../syntax/instructions.html#syntax-half}{\mathit{half}}\mathsf{\_i}\!N'\!\mathsf{x}\!M'\!\mathsf{\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i16x8.q15mulr\_sat\_s}\),\(\mathsf{i32x4.dot\_i16x8\_s}\),\(\mathsf{i16x8.extadd\_pairwise\_i8x16\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i32x4.extadd\_pairwise\_i16x8\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i8x16.avgr\_u}\),\(\mathsf{i16x8.avgr\_u}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.sub}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.mul}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.div}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.min}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.max}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.pmin}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.pmax}\)
新的三元向量指令:\(\mathsf{v128.bitselect}\)
新的测试向量指令:\(\mathsf{v128.any\_true}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.all\_true}\)
新的关系向量指令:\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.eq}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.ne}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.lt\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.gt\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.le\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.ge\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.eq}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.ne}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.lt}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.gt}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.le}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.ge}\)
新的转换向量指令:\(\mathsf{i32x4.trunc\_sat\_f32x4\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i32x4.trunc\_sat\_f64x2\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\mathsf{\_zero}\),\(\mathsf{f32x4.convert\_i32x4\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{f32x4.demote\_f64x2\_zero}\),\(\mathsf{f64x2.convert\_low\_i32x4\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{f64x2.promote\_low\_f32x4}\)
新的通道访问向量指令:\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.extract\_lane\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}^?\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.replace\_lane}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.extract\_lane}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.replace\_lane}\)
新的通道拆分/合并向量指令:\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.extend\_}\href{../syntax/instructions.html#syntax-half}{\mathit{half}}\mathsf{\_i}\!N'\!\mathsf{x}\!M'\!\mathsf{\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i8x16.narrow\_i16x8\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\),\(\mathsf{i16x8.narrow\_i32x4\_}\href{../syntax/instructions.html#syntax-sx}{\mathit{sx}}\)
新的字节重排序向量指令:\(\mathsf{i8x16.shuffle}\),\(\mathsf{i8x16.swizzle}\)
新的注入/投影向量指令:\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.splat}\),\(\mathsf{f}\!N\!\mathsf{x}\!M\!\mathsf{.splat}\),\(\mathsf{i}\!N\!\mathsf{x}\!M\!\mathsf{.bitmask}\)