变更历史

自 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}}\)

  • 元素段 使用 表索引

批量内存和表指令

添加了修改内存或表条目范围的指令 [4] [5]

  • 新的 内存指令\(\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}\)