WebAssembly 命令の一覧


https://webassembly.github.io/spec/core/

WebAssembly Specification の主に命令関係を大雑把にまとめたものです。詳細は仕様書を参照してください。数も多いので間違いもあると思います。


# この記事での表記

ある程度プログラムを組んだ人なら理解できると思われる、JavaScript 等の馴染みのある表記を使用しているつもりです。

以下の機能を予め定義しておきます。

| 機能 | 処理 | 内容 |
|:--|:--|:--|
| <code>ceil(𝑥)</code> | <code>𝑥</code> を整数にする | 切り上げ |
| <code>floor(𝑥)</code> | <code>𝑥</code> を整数にする | 切り捨て |
| <code>trunc(𝑥)</code> | <code>𝑥</code> を整数にする | 0 方向丸め |
| <code>nearest(𝑥)</code> | <code>𝑥</code> を整数にする | 四捨五入 |
| <code>abs(𝑥)</code> | <code>𝑥 &lt; 0 ? -𝑥 : 𝑥</code> | 絶対値 |
| <code>sqrt(𝑥)</code> | √<code>𝑥</code> | 平方根 |
| <code>min(𝑥, 𝑦)</code>  | <code>𝑥 &lt; 𝑦 ? 𝑥 : 𝑦</code> | 最小値を選択 |
| <code>max(𝑥, 𝑦)</code>  | <code>𝑥 &gt; 𝑦 ? 𝑥 : 𝑦</code> | 最大値を選択 |
| <code>clamp(𝑙, 𝑥, 𝑚)</code> | <code>max(𝑙, min(𝑥, 𝑚))</code> | 範囲外を範囲内にする |
| <code>avgr(𝑥, 𝑦)</code>  | <code>trunc((𝑥 + 𝑦 + 1) / 2)</code> | 平均値(四捨五入) |
| <code>popcnt(𝑥)</code>  | <code>𝑥</code> の 2 進数表記で 1 の数 | 1 のビット数 |
| <code>memset(𝑑, 𝑠, 𝑛)</code>  | <code>𝑑</code>から<code>𝑛</code>バイトを<code>𝑠</code>で埋める | メモリの初期化 |
| <code>memcpy(𝑑, 𝑠, 𝑛)</code>  | <code>𝑠</code>から<code>𝑛</code>バイトを<code>𝑑</code>ヘ複写 | メモリ内容複写(領域重複注意) |
| <code>memmove(𝑑, 𝑠, 𝑛)</code>  | <code>𝑠</code>から<code>𝑛</code>バイトを<code>𝑑</code>ヘ複写 | メモリ内容複写(領域重複可) |

<code>min</code>,<code>max</code> と非数・無限の挙動が違う <code>pmin</code>,<code>pmax</code> があります。


# WASM モジュール (module)

モジュールの中身は以下の通り。

| 種類 | 内容 |
|:-:|:--|
| types | functype の一覧 |
| funcs | func の一覧 |
| tables | table の一覧 |
| mems | mem の一覧 |
| globals | global の一覧 |
| elems | elem の一覧 |
| datas | data の一覧 |
| start | 開始関数(func) |
| imports | import の一覧 |
| exports | export の一覧 |


# 数値

- 整数
- 浮動小数点数
- ベクトル

## 整数

整数値の表記は

- 10進数
- 16進数：前置文字列 <code>0x</code>

桁区切りとして <code>_</code> が使用可能。


### 整数値の型

| ビット幅 | 符号不問 | 符号あり | 符号なし |
|:-:|:-:|:-:|:-:|
| 8 | <code>i8</code> | <code>s8</code> | <code>u8</code> |
| 16 | <code>i16</code> | <code>s16</code> | <code>u16</code> |
| 32 | <code>i32</code> | <code>s32</code> | <code>u32</code> |
| 64 | <code>i64</code> | <code>s64</code> | <code>u64</code> |
| 128 | <code>i128</code> | <code>s128</code> | <code>u128</code> |
| 𝑁 | <code>i𝑁</code> | <code>s𝑁</code> | <code>u𝑁</code> |

符号不問はビット列の扱いを利用側に委ねる(既定は符号なし)。


### 添字による符号の明示

符号を明示するための添字記号を定義しておきます。

| 符号 | 記号 | 例(比較の添字) |
|:-:|:-:|:--|
| あり | <code>&pm;</code> | 符号あり比較 <code>(𝑎 &lt;<sub>&pm;</sub> 𝑏)</code> |
| なし | <code>+</code> | 符号なし比較 <code>(𝑎 &lt;<sub>+</sub> 𝑏)</code> |


### ビット拡張

𝑁 ビット整数を、より大きいビット数の整数に変換する機能表現を定義しておきます。

| ビット幅 | 符号あり | 符号なし |
|:-:|:-:|:-:|
| 8 | <code>ext8s</code> | <code>ext8u</code> |
| 16 | <code>ext16s</code> | <code>ext16u</code> |
| 32 | <code>ext32s</code> | <code>ext32u</code> |
| 64 | <code>ext64s</code> | <code>ext64u</code> |
| 𝑁 | <code>ext𝑁s</code> | <code>ext𝑁u</code> |

<code>ext𝑁s(𝑥)</code> と <code>ext𝑁u(𝑥)</code> の処理内容は以下の通り。

| 機能 | 内容 |
|:-:|:--|
| <code>ext𝑁s(𝑥)</code>  | <code>(𝑥 &amp; (2<sup>𝑁-1</sup> - 1)) &vert; (0 - (𝑥 &amp; 2<sup>𝑁-1</sup>))</code> |
| <code>ext𝑁u(𝑥)</code>  | <code>(𝑥 &amp; (2<sup>𝑁</sup> - 1))</code> |


### 飽和処理

数値を 𝑁 ビットで表現できるように範囲外の値を範囲内に変更する機能表現を定義しておきます。

| ビット幅 | 符号あり | 符号なし |
|:-:|:-:|:-:|
| 8 | <code>sat8s</code> | <code>sat8u</code> |
| 16 | <code>sat16s</code> | <code>sat16u</code> |
| 32 | <code>sat32s</code> | <code>sat32u</code> |
| 64 | <code>sat64s</code> | <code>sat64u</code> |
| 𝑁 | <code>sat𝑁s</code> | <code>sat𝑁u</code> |

<code>sat𝑁s(𝑥)</code> と <code>sat𝑁u(𝑥)</code> の処理内容は以下の通り。

| 機能 | 内容 |
|:-:|:--|
| <code>sat𝑁s(𝑥)</code>  | <code>clamp(-2<sup>𝑁-1</sup>, 𝑥, 2<sup>𝑁-1</sup>-1);
| <code>sat𝑁u(𝑥)</code>  | <code>clamp(0, 𝑥, 2<sup>𝑁</sup>-1)</code> |


## 浮動小数点数


浮動小数点数は浮動小数点数は IEEE 754 形式が使用されています。

| ビット幅 | 表記 | 内容 |
|:-:|:-:|:--|
| 32 | <code>f32</code> | 単精度浮動小数点数 |
| 64 | <code>f64</code> | 倍精度浮動小数点数 |

整値の表記は

- 10進数
- 16進数：前置文字列 <code>0x</code>

桁区切りとして <code>_</code> が使用可能。

**指数表記**

| 基数 | 後置記号 | 備考 |
|:-:|:-:|:--|
| 10 | <code>E</code> または <code>e</code> | 例 <code>1.2e-3</code> = <code>0.0012</code> |
| 16 | <code>p</code> または <code>p</code> | 指数部は10進数のビット数(基数 2) <br> 例 <code>0x1.fp12</code> = <code>0x1f00</code> |


## ベクトル

ベクトルは 128 ビット データです。

表の幅を短くするため、この記事独自の別名を定義しておきます。
プログラム記述では、別名は使用できないので、元の型を使用してください。

| 型 | 要素型 | 要素数 | 別名 |
|:-:|:-:|:-:|:--|
| <code>i8x16</code> | <code>i8</code> | 16 | vb1 |
| <code>i16x8</code> | <code>i16</code> | 8 | vb2 |
| <code>i32x4</code> | <code>i32</code> | 4 | vb4 |
| <code>i64x2</code> | <code>i64</code> | 2 | vb8 |
| <code>f32x4</code> | <code>f32</code> | 4 | vfs |
| <code>f64x2</code> | <code>f64</code> | 2 | vfd |
| <code>v128</code> | <code>i128</code> | 1 | vt |

<code>v128</code> 以外の型では配列表記も使用します。

- <code>要素型[要素数]</code>
- <code><var>変数</var>[要素数]</code>
- <code><var>変数</var><sub>要素型</sub>[要素数]</code>


# スタック マシン

スタック上には以下の 3 種類が含まれる。

- 被演算子(operand)
- ラベル(br)
- フレーム(call)

スタックの先頭を右端として表記し、スタックの状況を

<dl><dd><code>..., <var>s2</var>,<var>s1</var></code></dd></dl>

とすると比較命令(<code>lt</code>)は以下のような動作になります。

```JavaScript:実行イメージ
s1 = stack.pop();
s2 = stack.pop();
r = s2 < s1 ? 1 : 0;
stack.push(r);
```

このままではやや不便なので、順番は必要な数の逆順にして

<dl><dd><code>..., <var>p1</var>, <var>p2</var></code></dd></dl>

とすると、以下のようになります。

```JavaScript:実行イメージ
p2 = stack.pop(); // s1
p1 = stack.pop(); // s2
r = p1 < p2 ? 1 : 0;
stack.push(r);
```


## 命令表

仕様書の

- <code>S.tables[F.module.tableaddrs[𝑥]].elem</code> を <code>TAB[𝑥]</code>
- <code>S.mems[F.module.elemaddrs[𝑥]].elem</code> を <code>ELEM[𝑥]</code>
- <code>S.mems[F.module.memaddrs[0]].elem</code> を <code>MEM</code>
- <code>S.datas[F.module.dataaddrs[𝑥]].data</code> を <code>DATA[𝑥]</code>

とします。

以下に続く表は処理ブロック(後述)を除く単体の命令です。

表の最初の列 <code><var>p</var></code> は必要な被演算子の数です。

被演算子は <code><var>p</var>1, <var>p</var>2, ...</code> と表記します。

結果は <code><var>r</var></code> とします。結果がないものはスタックに値を積みません。

<code><var>p</var></code> や <code><var>r</var></code> などは必要に応じて <code>型</code> の添字を追加して <code><var>p</var><sub>型</sub></code> と <code><var>r</var><sub>型</sub></code> などと表記します。

<code><var>p</var></code> の隣の列が「操作」の場合は、横の型一覧の一つから「型.操作」が命令になります。


### 定数

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 0 | <code>i32.const <var>i32</var></code> | <code><var>r</var><sub>i32</sub> ← <var>i32</var></code> |
| 0 | <code>i64.const <var>i64</var></code> | <code><var>r</var><sub>i64</sub> ← <var>i64</var></code> |
| 0 | <code>f32.const <var>f32</var></code> | <code><var>r</var><sub>f32</sub> ← <var>f32</var></code> |
| 0 | <code>f64.const <var>f64</var></code> | <code><var>r</var><sub>f64</sub> ← <var>f64</var></code> |
| 0 | <code>v128.const <var>i128</var></code> | <code><var>r</var><sub>v128</sub> ← <var>i128</var></code> |


### 破棄

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 1 | <code>drop</code> | <code><var>p1</var></code> を破棄 |
| 1 | <code>data.drop 𝑥</code> | <code>DATA[𝑥]</code> を破棄 |


### グローバル変数

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 0 | <code>global.get 𝑥</code> | <code><var>r</var> ← globals[𝑥]</code> |
| 1 | <code>global.set 𝑥</code> | <code>globals[𝑥] ← <var>p1</var></code> |


### ローカル変数

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 0 | <code>local.get 𝑥</code> | <code><var>r</var> ← locals[𝑥]</code> |
| 1 | <code>local.set 𝑥</code> | <code>locals[𝑥] ← <var>p1</var></code> |
| 1 | <code>local.tee 𝑥</code> | <code><var>r</var> ← <var>p1</var> ; locals[𝑥] ← <var>p1</var></code>  |


### テーブル

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 0 | <code>table.size 𝑥</code> | <code><var>r</var><sub>i32</sub> ← (TAB[𝑥] のサイズ)</code> |
| 2 | <code>table.grow 𝑥</code> | <code><var>r</var><sub>i32</sub> ← (TAB[𝑥] のサイズ)</code> <br> <code>TAB[𝑥]</code> をサイズ <code><var>p2</var><sub>i32</sub></code> に変更(内容は <code><var>p1</var></code>) |
| 1 | <code>table.get 𝑥</code> | <code><var>r</var> ← TAB[𝑥]\[<var>p1</var><sub>i32</sub>]</code> |
| 2 | <code>table.set 𝑥</code> | <code>TAB[𝑥]\[<var>p1</var><sub>i32</sub>] ← <var>p2</var></code> |
| 3 | <code>table.fill 𝑥</code> | <code>TAB[𝑥]\[<var>p1</var><sub>i32</sub> : <var>p3</var><sub>i32</sub>] ← <var>p2</var></code> |
| 3 | <code>table.copy 𝑥 𝑦</code> | <code>TAB[𝑥]\[<var>p1</var><sub>i32</sub> : <var>p3</var><sub>i32</sub>] ← TAB[𝑦]\[<var>p2</var><sub>i32</sub> : <var>p3</var><sub>i32</sub>]</code> |
| 3 | <code>table.init 𝑥 𝑦</code> | <code>TAB[𝑥]\[<var>p1</var><sub>i32</sub> : <var>p3</var><sub>i32</sub>] ← ELEM[𝑦]\[<var>p2</var><sub>i32</sub> : <var>p3</var><sub>i32</sub>]</code> |

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 0 | <code>elem.drop 𝑥</code> | <code>ELEM[𝑥]</code> の要素を破棄 |


### メモリ

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 0 | <code>memory.size</code> | <code><var>r</var><sub>i32</sub> ← (MEM のページ サイズ)</code> |
| 1 | <code>memory.grow</code> | <code><var>r</var><sub>i32</sub> ← (MEM のページ サイズ)</code> <br> <code>MEM</code> のページをサイズ <code><var>p1</var><sub>i32</sub></code> に変更 |
| 3 | <code>memory.fill | <code>memset( &amp;MEM[<var>p1</var><sub>i32</sub>], <var>p2</var><sub>i32</sub>, <var>p3</var><sub>i32</sub>)</code> |
| 3 | <code>memory.copy | <code>memmove( &amp;MEM[<var>p1</var><sub>i32</sub>], &amp;MEM[<var>p2</var><sub>i32</sub>], <var>p3</var><sub>i32</sub>)</code> |
| 3 | <code>memory.init 𝑥 | <code>memcpy( &amp;MEM[<var>p1</var><sub>i32</sub>], &amp;DATA[𝑥][<var>p2</var><sub>i32</sub>], <var>p3</var><sub>i32</sub>)</code> |

| <code><var>p</var></code> | 操作 | <code><sub>i32</sub></code> | <code><sub>i64</sub></code> | <code><sub>f32</sub></code> | <code><sub>f64</sub></code> | <code><sub>v128</sub></code> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:-:|:--|
| 1 | <code>load 𝑚</code> | ○ | ○ | ○ | ○ | ○ | <code><var>r</var> ← MEM[𝑚 + <var>p1</var><sub>i32</sub>]</code> |
| 1 | <code>load8\_s 𝑚</code> | ○ | ○ | | | | <code><var>r</var> ← ext8s(MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i8</sub>)</code> |
| 1 | <code>load8\_u 𝑚</code> | ○ | ○ | | | | <code><var>r</var> ← ext8u(MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i8</sub>)</code> |
| 1 | <code>load16\_s 𝑚</code> | ○ | ○ | | | | <code><var>r</var> ← ext16s(MEM𝑚 + <var>p1</var><sub>i32</sub>]<sub>i16</sub>)</code> |
| 1 | <code>load16\_u 𝑚</code> | ○ | ○ | | | | <code><var>r</var> ← ext16u(MEM𝑚 + <var>p1</var><sub>i32</sub>]<sub>i16</sub>)</code> |
| 1 | <code>load32\_s 𝑚</code> | | ○ | | | | <code><var>r</var> ← ext32s(MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i32</sub>)</code> |
| 1 | <code>load32\_u 𝑚</code> | | ○ | | | | <code><var>r</var> ← ext32u(MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i32</sub>)</code> |
| 2 | <code>store 𝑚</code> | ○ | ○ | ○ | ○ | ○ | <code>MEM[𝑚 + <var>p1</var><sub>i32</sub>] ← <var>p2</var></code> |
| 2 | <code>store8 𝑚</code> | ○ | ○ | | | | <code>MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i8</sub> ← <var>p2</var></code> |
| 2 | <code>store16 𝑚</code> | ○ | ○ | | | | <code>MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i16</sub> ← <var>p2</var></code> |
| 2 | <code>store32 𝑚</code> | | ○ | | | | <code>MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i32</sub> ← <var>p2</var></code> |

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 1 | <code>v128.load8x8\_s 𝑚</code> | <code><var>r</var><sub>i16</sub>[<var>n</var>] ← ext8s(MEM[𝑚 + <var>p1</var><sub>i32</sub> + <var>n</var>]<sub>i8</sub>)</code> |
| 1 | <code>v128.load8x8\_u 𝑚</code> | <code><var>r</var><sub>i16</sub>[<var>n</var>] ← ext8u(MEM[𝑚 + <var>p1</var><sub>i32</sub> + <var>n</var>]<sub>i8</sub>)</code> |
| 1 | <code>v128.load16x4\_s 𝑚</code> | <code><var>r</var><sub>i32</sub>[<var>n</var>] ← ext16s(MEM[𝑚 + <var>p1</var><sub>i32</sub> + 2\*<var>n</var>]<sub>i16</sub>)</code> |
| 1 | <code>v128.load16x4\_u 𝑚</code> | <code><var>r</var><sub>i32</sub>[<var>n</var>] ← ext16u(MEM[𝑚 + <var>p1</var><sub>i32</sub> + 2\*<var>n</var>]<sub>i16</sub>)</code> |
| 1 | <code>v128.load32x2\_s 𝑚</code> | <code><var>r</var><sub>i64</sub>[<var>n</var>] ← ext32s(MEM[𝑚 + <var>p1</var><sub>i32</sub> + 4\*<var>n</var>]<sub>i32</sub>)</code> |
| 1 | <code>v128.load32x2\_u 𝑚</code> | <code><var>r</var><sub>i64</sub>[<var>n</var>] ← ext32u(MEM[𝑚 + <var>p1</var><sub>i32</sub> + 4\*<var>n</var>]<sub>i32</sub>)</code> |
| 1 | <code>v128.load32\_zero 𝑚</code> | <code><var>r</var><sub>i128</sub> ← ext32u(MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i32</sub>)</code> |
| 1 | <code>v128.load64\_zero 𝑚</code> | <code><var>r</var><sub>i128</sub> ← ext64u(MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i64</sub>)</code> |
| 1 | <code>v128.load8\_splat 𝑚</code> | <code><var>r</var><sub>i8</sub>[<var>n</var>] ← MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i8</sub></code> |
| 1 | <code>v128.load16\_splat 𝑚</code> | <code><var>r</var><sub>i16</sub>[<var>n</var>] ← MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i16</sub></code> |
| 1 | <code>v128.load32\_splat 𝑚</code> | <code><var>r</var><sub>i32</sub>[<var>n</var>] ← MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i32</sub></code> |
| 1 | <code>v128.load64\_splat 𝑚</code> | <code><var>r</var><sub>i64</sub>[<var>n</var>] ← MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i64</sub></code> |
| 2 | <code>v128.load8\_lane 𝑚 <var>u8</var></code> | <code><var>r</var> ← p2 ; <var>r</var><sub>i8</sub>[<var>u8</var>] ← MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i8</sub></code> |
| 2 | <code>v128.load16\_lane 𝑚 <var>u8</var></code> | <code><var>r</var> ← p2 ; <var>r</var><sub>i16</sub>[<var>u8</var>] ← MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i16</sub></code> |
| 2 | <code>v128.load32\_lane 𝑚 <var>u8</var></code> | <code><var>r</var> ← p2 ; <var>r</var><sub>i32</sub>[<var>u8</var>] ← MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i32</sub></code> |
| 2 | <code>v128.load64\_lane 𝑚 <var>u8</var></code> | <code><var>r</var> ← p2 ; <var>r</var><sub>i64</sub>[<var>u8</var>] ← MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i64</sub></code> |
| 2 | <code>v128.store8\_lane 𝑚 <var>u8</var></code> | <code>MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i8</sub> ← <var>p2</var><sub>i8</sub>[<var>u8</var>]</code> |
| 2 | <code>v128.store16\_lane 𝑚 <var>u8</var></code> | <code>MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i16</sub> ← <var>p2</var><sub>i16</sub>[<var>u8</var>]</code> |
| 2 | <code>v128.store32\_lane 𝑚 <var>u8</var></code> | <code>MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i32</sub> ← <var>p2</var><sub>i32</sub>[<var>u8</var>]</code> |
| 2 | <code>v128.store64\_lane 𝑚 <var>u8</var></code> | <code>MEM[𝑚 + <var>p1</var><sub>i32</sub>]<sub>i64</sub> ← <var>p2</var><sub>i64</sub>[<var>u8</var>]</code> |

### 型変換

| <code><var>p</var></code> | 操作 | <sub><code>i32</code></sub> | <sub><code>i64</code></sub> | <sub><code>f32</code></sub> | <sub><code>f64</code></sub> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:--|
| 1 | <code>extend8\_s</code> | ○ | ○ | | | <code><var>r</var> ← ext8s(<var>p1</var>)</code> |
| 1 | <code>extend16\_s</code> | ○ | ○ | | | <code><var>r</var> ← ext16s(<var>p1</var>)</code> |
| 1 | <code>extend32\_s</code> | | ○ | | | <code><var>r</var><sub>i64</sub> ← ext32s(<var>p1</var><sub>i64</sub>)</code> |
| 1 | <code>extend\_i32\_s</code> | | ○ | | | <code><var>r</var><sub>i64</sub> ← ext64s(<var>p1</var><sub>i32</sub>)</code> |
| 1 | <code>extend\_i32\_u</code> | | ○ | | | <code><var>r</var><sub>i64</sub> ← ext64u(<var>p1</var><sub>i32</sub>)</code> |
| 1 | <code>wrap_i64</code> | ○ | | | | <code><var>r</var><sub>i32</sub> ← <var>p1</var><sub>i64</sub> &amp; (2<sup>32</sup>-1)</code> |
| 1 | <code>trunc\_f32\_s</code> | ○ | ○ | | | <code><var>r</var> ← trunc(<var>p1</var><sub>f32</sub>)</code> |
| 1 | <code>trunc\_f32\_u</code> | ○ | ○ | | | <code><var>r</var> ← trunc(<var>p1</var><sub>f32</sub>)</code> |
| 1 | <code>trunc\_f64\_s</code> | ○ | ○ | | | <code><var>r</var> ← trunc(<var>p1</var><sub>f64</sub>)</code> |
| 1 | <code>trunc\_f64\_u</code> | ○ | ○ | | | <code><var>r</var> ← trunc(<var>p1</var><sub>f64</sub>)</code> |
| 1 | <code>trunc\_sat\_f32\_s</code> | ○ | ○ | | | <code><var>r</var> ← sat<var>N</var>s(trunc(<var>p1</var><sub>f32</sub>))</code> |
| 1 | <code>trunc\_sat\_f32\_u</code> | ○ | ○ | | | <code><var>r</var> ← sat<var>N</var>u(trunc(<var>p1</var><sub>f32</sub>))</code> |
| 1 | <code>trunc\_sat\_f64\_s</code> | ○ | ○ | | | <code><var>r</var> ← sat<var>N</var>s(trunc(<var>p1</var><sub>f64</sub>))</code> |
| 1 | <code>trunc\_sat\_f64\_u</code> | ○ | ○ | | | <code><var>r</var> ← sat<var>N</var>u(trunc(<var>p1</var><sub>f64</sub>))</code> |
| 1 | <code>demote\_f64</code> | | | ○ | | <code><var>r</var><sub>f32</sub> ← f32(<var>p1</var><sub>f64</sub>)</code> |
| 1 | <code>promote\_f64</code> | | | | ○ | <code><var>r</var><sub>f64</sub> ← f64(<var>p1</var><sub>f32</sub>)</code> |
| 1 | <code>convert\_i32\_s</code> | | | ○ | ○ | <code><var>r</var> ← 型(<var>p1</var><sub>s32</sub>)</code> |
| 1 | <code>convert\_i32\_u</code> | | | ○ | ○ | <code><var>r</var> ← 型(<var>p1</var><sub>u32</sub>)</code> |
| 1 | <code>convert\_i64\_s</code> | | | ○ | ○ | <code><var>r</var> ← 型(<var>p1</var><sub>s64</sub>)</code> |
| 1 | <code>convert\_i64\_u</code> | | | ○ | ○ | <code><var>r</var> ← 型(<var>p1</var><sub>u64</sub>)</code> |
| 1 | <code>reinterpret\_f32</code> | ○ | | | | <code><var>r</var><sub>i32</sub> ← ビット複写(<var>p1</var><sub>f32</sub></code>) |
| 1 | <code>reinterpret\_f64</code> | | ○ | | | <code><var>r</var><sub>i64</sub> ← ビット複写(<var>p1</var><sub>f64</sub></code>) |
| 1 | <code>reinterpret\_i32</code> | | | ○ | | <code><var>r</var><sub>f32</sub> ← ビット複写(<var>p1</var><sub>i32</sub></code>) |
| 1 | <code>reinterpret\_i64</code> | | | | ○ | <code><var>r</var><sub>f64</sub> ← ビット複写(<var>p1</var><sub>i64</sub></code>) |

| <code><var>p</var></code> | 操作 | <code><sub>vb1</sub></code> | <code><sub>vb2</sub></code> | <code><sub>vb4</sub></code> | <code><sub>vb8</sub></code> | <code><sub>vfs</sub></code> | <code><sub>vfd</sub></code> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:-:|:-:|:--|
| 1 | <code>splat</code> | ○ | ○ | ○ | ○ | ○ | ○ | <code><var>r</var>[全要素] ← <var>p1</var><sub>要素型</sub></code> |
| 1 | <code>extract\_lane <var>u8</var></code> | | | ○ | ○ | ○ | ○ | <code><var>r<sub>要素型</sub></var> ← <var>p1</var>[<var>u8</var>]</code> |
| 1 | <code>extract\_lane\_s <var>u8</var></code> | ○ | ○ | | | | | <code><var>r</var><sub>i32</sub> ← ext<var>N</var>s(<var>p1</var>[<var>u8</var>])</code> |
| 1 | <code>extract\_lane\_u <var>u8</var></code> | ○ | ○ | | | | | <code><var>r</var><sub>i32</sub> ← ext<var>N</var>u(<var>p1</var>[<var>u8</var>])</code> |


| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 1 | <code>i32x4.trunc\_sat\_f32x4\_s</code> | <code><var>r</var>[<var>n</var>] ← sat32s(trunc(<var>p1</var><sub>f32</sub>[<var>n</var>]))</code> |
| 1 | <code>i32x4.trunc\_sat\_f32x4\_u</code> | <code><var>r</var>[<var>n</var>] ← sat32u(trunc(<var>p1</var><sub>f32</sub>[<var>n</var>]))</code> |
| 1 | <code>i32x4.trunc\_sat\_f64x2\_s\_zero</code> | <code><var>r</var>[<var>n</var>] ← sat32s(trunc(<var>p1</var><sub>f64</sub>[<var>n</var>] ?? 0))</code> |
| 1 | <code>i32x4.trunc\_sat\_f64x2\_u\_zero</code> | <code><var>r</var>[<var>n</var>] ← sat32u(trunc(<var>p1</var><sub>f64</sub>[<var>n</var>] ?? 0))</code> |
| 1 | <code>f32x4.convert\_i32x4\_s</code> | <code><var>r</var>[<var>n</var>] ← f32(<var>p1</var><sub>s32</sub>[<var>n</var>])</code> |
| 1 | <code>f32x4.convert\_i32x4\_u</code> | <code><var>r</var>[<var>n</var>] ← f32(<var>p1</var><sub>u32</sub>[<var>n</var>])</code> |
| 1 | <code>f32x4.demote\_f64x2\_zero\_s</code> | <code><var>r</var>[<var>n</var>] ← f32(<var>p1</var><sub>f64</sub>[<var>n</var>])</code> |
| 1 | <code>f64x2.convert\_low\_i32x4\_s</code> | <code><var>r</var>[<var>n</var>] ← f64(<var>p1</var><sub>s32</sub>[2\*<var>n</var>])</code> |
| 1 | <code>f64x2.convert\_low\_i32x4\_u</code> | <code><var>r</var>[<var>n</var>] ← f64(<var>p1</var><sub>u32</sub>[2\*<var>n</var>])</code> |
| 1 | <code>f64x2.promote\_low\_f32x4</code> | <code><var>r</var>[<var>n</var>] ← f64(<var>p1</var><sub>f32</sub>[2\*<var>n</var>])</code> |

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 1 | <code>i16x8.extend\_low\_i8x16\_s</code> | <code><var>r</var>[<var>n</var>] ← ext8s(<var>p1</var><sub>s8</sub>[2\*<var>n</var>])</code> |
| 1 | <code>i16x8.extend\_low\_i8x16\_u</code> | <code><var>r</var>[<var>n</var>] ← ext8u(<var>p1</var><sub>u8</sub>[2\*<var>n</var>])</code> |
| 1 | <code>i16x8.extend\_high\_i8x16\_s</code> | <code><var>r</var>[<var>n</var>] ← ext8s(<var>p1</var><sub>s8</sub>[2\*<var>n</var>+1])</code> |
| 1 | <code>i16x8.extend\_high\_i8x16\_u</code> | <code><var>r</var>[<var>n</var>] ← ext8u(<var>p1</var><sub>u8</sub>[2\*<var>n</var>+1])</code> |
| 1 | <code>i32x4.extend\_low\_i16x8\_s</code> | <code><var>r</var>[<var>n</var>] ← ext16s(<var>p1</var><sub>s16</sub>[2\*<var>n</var>])</code> |
| 1 | <code>i32x4.extend\_low\_i16x8\_u</code> | <code><var>r</var>[<var>n</var>] ← ext16u(<var>p1</var><sub>u16</sub>[2\*<var>n</var>])</code> |
| 1 | <code>i32x4.extend\_high\_i16x8\_s</code> | <code><var>r</var>[<var>n</var>] ← ext16s(<var>p1</var><sub>s16</sub>[2\*<var>n</var>+1])</code> |
| 1 | <code>i32x4.extend\_high\_i16x8\_u</code> | <code><var>r</var>[<var>n</var>] ← ext16u(<var>p1</var><sub>u16</sub>[2\*<var>n</var>+1])</code> |
| 1 | <code>i64x2.extend\_low\_i32x4\_s</code> | <code><var>r</var>[<var>n</var>] ← ext32s(<var>p1</var><sub>s32</sub>[2\*<var>n</var>])</code> |
| 1 | <code>i64x2.extend\_low\_i32x4\_u</code> | <code><var>r</var>[<var>n</var>] ← ext32u(<var>p1</var><sub>u32</sub>[2\*<var>n</var>])</code> |
| 1 | <code>i64x2.extend\_high\_i32x4\_s</code> | <code><var>r</var>[<var>n</var>] ← ext32s(<var>p1</var><sub>s32</sub>[2\*<var>n</var>+1])</code> |
| 1 | <code>i64x2.extend\_high\_i32x4\_u</code> | <code><var>r</var>[<var>n</var>] ← ext32u(<var>p1</var><sub>u32</sub>[2\*<var>n</var>+1])</code> |
| 2 | <code>i8x16.narrow\_i16x8\_s | <code><var>r</var>[<var>n</var>] ← sat8s(((<var>n</var>&1)?<var>p2</var>:<var>p1</var>)<sub>s16</sub>[<var>n</var>&gt;&gt;1])</code> |
| 2 | <code>i8x16.narrow\_i16x8\_u | <code><var>r</var>[<var>n</var>] ← sat8u(((<var>n</var>&1)?<var>p2</var>:<var>p1</var>)<sub>u16</sub>[<var>n</var>&gt;&gt;1])</code> |
| 2 | <code>i16x8.narrow\_i32x4\_s | <code><var>r</var>[<var>n</var>] ← sat16s(((<var>n</var>&1)?<var>p2</var>:<var>p1</var>)<sub>s32</sub>[<var>n</var>&gt;&gt;1])</code> |
| 2 | <code>i16x8.narrow\_i32x4\_u | <code><var>r</var>[<var>n</var>] ← sat16u(((<var>n</var>&1)?<var>p2</var>:<var>p1</var>)<sub>u32</sub>[<var>n</var>&gt;&gt;1])</code> |


### 数値比較

| <code><var>p</var></code> | 操作 | <sub><code>i32</code></sub> | <sub><code>i64</code></sub> | <sub><code>f32</code></sub> | <sub><code>f64</code></sub> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:--|
| 1 | <code>eqz</code> | ○ | ○ | | | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> == 0)</code> |
| 2 | <code>eq</code> | ○ | ○ | ○ | ○ | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> == <var>p2</var>)</code> |
| 2 | <code>ne</code> | ○ | ○ | ○ | ○ | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> != <var>p2</var>)</code> |
| 2 | <code>lt</code> | | | ○ | ○ | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &lt; <var>p2</var>)</code> |
| 2 | <code>lt\_s</code> | ○ | ○ | | | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &lt;<sub>&pm;</sub> <var>p2</var>)</code> |
| 2 | <code>lt\_u</code> | ○ | ○ | | | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &lt;<sub>+</sub> <var>p2</var>)</code> |
| 2 | <code>gt</code> | | | ○ | ○ | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &gt; <var>p2</var>)</code> |
| 2 | <code>gt\_s</code> | ○ | ○ | | | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &gt;<sub>&pm;</sub> <var>p2</var>)</code> |
| 2 | <code>gt\_u</code> | ○ | ○ | | | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &gt;<sub>+</sub> <var>p2</var>)</code> |
| 2 | <code>le</code> | | | ○ | ○ | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &lt;= <var>p2</var>)</code> |
| 2 | <code>le\_s</code> | ○ | ○ | | | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &lt;=<sub>&pm;</sub> <var>p2</var>)</code> |
| 2 | <code>le\_u</code> | ○ | ○ | | | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &lt;=<sub>+</sub> <var>p2</var>)</code> |
| 2 | <code>ge</code> | | | ○ | ○ | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &gt;= <var>p2</var>)</code> |
| 2 | <code>ge\_s</code> | ○ | ○ | | | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &gt;=<sub>&pm;</sub> <var>p2</var>)</code> |
| 2 | <code>ge\_u</code> | ○ | ○ | | | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> &gt;=<sub>+</sub> <var>p2</var>)</code> |


| <code><var>p</var></code> | 操作 | <code><sub>vb1</sub></code> | <code><sub>vb2</sub></code> | <code><sub>vb4</sub></code> | <code><sub>vb8</sub></code> | <code><sub>vfs</sub></code> | <code><sub>vfd</sub></code> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:-:|:-:|:--|
| 2 | <code>eq</code> | ○ | ○ | ○ | ○ | ○ | ○ | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] == <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>ne</code> | ○ | ○ | ○ | ○ | ○ | ○ | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] != <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>lt</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &lt; <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>lt\_s</code> | ○ | ○ | ○ | ○ | | | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &lt;<sub>&pm;</sub> <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>lt\_u</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &lt;<sub>+</sub> <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>gt</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &gt; <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>gt\_s</code> | ○ | ○ | ○ | ○ | | | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &gt;<sub>&pm;</sub> <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>gt\_u</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &gt;<sub>+</sub> <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>le</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &lt;= <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>le\_s</code> | ○ | ○ | ○ | ○ | | | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &lt;=<sub>&pm;</sub> <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>le\_u</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &lt;=<sub>+</sub> <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>ge</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &gt;= <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>ge\_s</code> | ○ | ○ | ○ | ○ | | | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &gt;=<sub>&pm;</sub> <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>ge\_u</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← (<var>p1</var>[<var>n</var>] &gt;=<sub>+</sub> <var>p2</var>[<var>n</var>])</code> |


| <code><var>p</var></code>| 操作 | <code><sub>vb1</sub></code> | <code><sub>vb2</sub></code> | <code><sub>vb4</sub></code> | <code><sub>vb8</sub></code> | <code><sub>vt</sub></code> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:-:|:--|
| 1 | <code>any\_true</code> | | | | | ○ | <code><var>r</var><sub>i32</sub> ← (<var>p1</var><sub>i128</sub> != 0)</code> |
| 1 | <code>all\_true</code> | ○ | ○ | ○ | ○ | |  <code><var>r</var><sub>i32</sub> ← (<var>p1</var> の全要素が非 0 で真)</code> |


### ビット演算

| <code><var>p</var></code> | 操作 | <sub><code>i32</code></sub> | <sub><code>i64</code></sub> | <sub><code>v128</code></sub> | 備考 |
|:-:|:--|:-:|:-:|:-:|:--|
| 1 | <code>not</code> | | | ○ | <code><var>r</var> ← ~<var>p1</var></code> |
| 2 | <code>and</code> | ○ | ○ | ○ | <code><var>r</var> ← <var>p1</var> &amp; <var>p2</var></code> |
| 2 | <code>andnot</code> | | | ○ |<code><var>r</var> ← <var>p1</var> &amp; (~<var>p2</var>)</code> |
| 2 | <code>or</code> | ○ | ○ | ○ | <code><var>r</var> ← <var>p1</var> &vert; <var>p2</var></code> |
| 2 | <code>xor</code> | ○ | ○ | ○ | <code><var>r</var> ← <var>p1</var> ^ <var>p2</var></code> |
| 3 | <code>bitselect</code> | | | ○ |<code><var>r</var> ← (<var>p1</var> & <var>p3</var>) &vert; (<var>p2</var> & ~<var>p3</var>)</code> |
| 1 | <code>clz</code> | ○ | ○ | | <code><var>r</var> ← clz(<var>p1</var>)</code> : 最上位ビットから 0 を数える |
| 1 | <code>clt</code> | ○ | ○ | | <code><var>r</var> ← ctz(<var>p1</var>)</code> : 最下位ビットから 0 を数える |
| 1 | <code>popcnt</code> | ○ | ○ | | <code><var>r</var> ← popcnt(<var>p1</var>)</code> |


| <code><var>p</var></code> | 操作 | <sub><code>i32<br><var>m</var>=31</sub></code></sub> | <sub><code>i64<br><var>m</var>=63</code></sub> | 備考 |
|:-:|:--|:-:|:-:|:--|
| 2 | <code>shl</code> | ○ | ○ | <code><var>r</var> ← <var>p1</var> &lt;&lt; (<var>p2</var><sub>i32</sub> &amp; <var>m</var>)</code> |
| 2 | <code>shr\_s</code> | ○ | ○ | <code><var>r</var> ← <var>p1</var> &gt;&gt; (<var>p2</var><sub>i32</sub> &amp; <var>m</var>)</code> |
| 2 | <code>shr\_u</code> | ○ | ○ | <code><var>r</var> ← <var>p1</var> &gt;&gt;&gt; (<var>p2</var><sub>i32</sub> &amp; <var>m</var>)</code> |
| 2 | <code>rotl</code> | ○ | ○ | <code><var>r</var> ← (<var>p1</var> &lt;&lt; (<var>p2</var><sub>i32</sub> &amp; <var>m</var>)) &vert; (<var>p1</var> &gt;&gt;&gt; (-<var>p2</var><sub>i32</sub> &amp; <var>m</var>))</code> |
| 2 | <code>rotr</code> | ○ | ○ | <code><var>r</var> ← (<var>p1</var> &gt;&gt;&gt; (<var>p2</var><sub>i32</sub> &amp; <var>m</var>)) &vert; (<var>p1</var> &lt;&lt; (-<var>p2</var><sub>i32</sub> &amp; <var>m</var>))</code> |

| <code><var>p</var></code> | 操作 | <sub><code>vb1<br><var>m</var>=7</code></sub> | <sub><code>vb2<br><var>m</var>=15</code></sub> | <sub><code>vb4<br><var>m</var>=31</code></sub> | <sub><code>vb8<br><var>m</var>=63</code></sub> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:--|
| 2 | <code>shl</code> | ○ | ○ | ○ | ○ | <code><var>r</var>[<var>n</var>] ← <var>p1</var>[<var>n</var>] &lt;&lt; (<var>p2</var><sub>i32</sub> &amp; <var>m</var>)</code> |
| 2 | <code>shr\_s</code> | ○ | ○ | ○ | ○ | <code><var>r</var>[<var>n</var>] ← <var>p1</var>[<var>n</var>] &gt;&gt; (<var>p2</var><sub>i32</sub> &amp; <var>m</var>)</code> |
| 2 | <code>shr\_u</code> | ○ | ○ | ○ | ○ | <code><var>r</var>[<var>n</var>] ← <var>p1</var>[<var>n</var>] &gt;&gt;&gt; (<var>p2</var><sub>i32</sub> &amp; <var>m</var>)</code> |

| <code><var>p</var></code> | 操作 | <code><sub>vb1</sub></code> | <code><sub>vb2</sub></code> | <code><sub>vb4</sub></code> | <code><sub>vb8</sub></code> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:--|
| 1 | <code>popcnt</code> | ○ | | | | <code><var>r</var>[<var>n</var>] ← popcnt(<var>p1</var>[<var>n</var>])</code> |
| 1 | <code>bitmask</code> | ○ | ○ | ○ | ○ | <code><var>r</var><sub>i32</sub> ← 0 </code> <br> <code><var>r</var><sub>i32</sub> &vert;= (<var>p1</var>[<var>n</var>] &lt;<sub>&pm;</sub> 0) &lt;&lt; <var>n</var> |


### 数値演算

| <code><var>p</var></code> | 操作 | <sub><code>i32</code></sub> | <sub><code>i64</code></sub> | <sub><code>f32</code></sub> | <sub><code>f64</code></sub> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:--|
| 1 | <code>ceil</code> | | | ○ | ○ | <code><var>r</var> ← ceil(<var>p1</var>)</code> |
| 1 | <code>floor</code> | | | ○ | ○ | <code><var>r</var> ← floor(<var>p1</var>)</code> |
| 1 | <code>trunc</code> | | | ○ | ○ | <code><var>r</var> ← trunc(<var>p1</var>)</code> |
| 1 | <code>nearest</code> | | | ○ | ○ | <code><var>r</var> ← nearest(<var>p1</var>)</code> |
| 1 | <code>abs</code> | | | ○ | ○ | <code><var>r</var> ← abs(<var>p1</var>)</code> |
| 1 | <code>neg</code> | | | ○ | ○ | <code><var>r</var> ← -<var>p1</var></code> |
| 1 | <code>sqrt</code> | | | ○ | ○ | <code><var>r</var> ← sqrt(<var>p1</var>)</code> |
| 2 | <code>add</code> | ○ | ○ | ○ | ○ | <code><var>r</var> ← <var>p1</var> + <var>p2</var></code> |
| 2 | <code>sub</code> | ○ | ○ | ○ | ○ | <code><var>r</var> ← <var>p1</var> - <var>p2</var></code> |
| 2 | <code>mul</code> | ○ | ○ | ○ | ○ | <code><var>r</var> ← <var>p1</var> * <var>p2</var></code> |
| 2 | <code>div</code> | | | ○ | ○ | <code><var>r</var> ← <var>p1</var> / <var>p2</var></code> |
| 2 | <code>div\_s</code> | ○ | ○ | | | <code><var>r</var> ← trunc(<var>p1</var> /<sub>&pm;</sub> <var>p2</var>)</code> |
| 2 | <code>div\_u</code> | ○ | ○ | | | <code><var>r</var> ← trunc(<var>p1</var> /<sub>+</sub> <var>p2</var>)</code> |
| 2 | <code>rem\_s</code> | ○ | ○ | | | <code><var>r</var> ← trunc(<var>p1</var> %<sub>&pm;</sub> <var>p2</var>)</code> |
| 2 | <code>rem\_u</code> | ○ | ○ | | | <code><var>r</var> ← trunc(<var>p1</var> %<sub>+</sub> <var>p2</var>)</code> |
| 2 | <code>min</code> | | | ○ | ○ | <code><var>r</var> ← min(<var>p1</var>, <var>p2</var>)</code> |
| 2 | <code>max</code> | | | ○ | ○ | <code><var>r</var> ← max(<var>p1</var>, <var>p2</var>)</code> |
| 2 | <code>copysign</code> | | | ○ | ○ | <code><var>r</var> ← abs(<var>p1</var>) * (<var>p2</var> / abs(<var>p2</var>))</code> |


| <code><var>p</var></code> | 操作 | <code><sub>vb1</sub></code> | <code><sub>vb2</sub></code> | <code><sub>vb4</sub></code> | <code><sub>vb8</sub></code> | <code><sub>vfs</sub></code> | <code><sub>vfd</sub></code> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:-:|:-:|:--|
| 1 | <code>floor</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← floor(<var>p1</var>[<var>n</var>])</code> |
| 1 | <code>trunc</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← trunc(<var>p1</var>[<var>n</var>])</code> |
| 1 | <code>nearest</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← nearest(<var>p1</var>[<var>n</var>])</code> |
| 1 | <code>abs</code> | ○ | ○ | ○ | ○ | ○ | ○ | <code><var>r</var>[<var>n</var>] ← abs(<var>p1</var>[<var>n</var>])</code> |
| 1 | <code>neg</code> | ○ | ○ | ○ | ○ | ○ | ○ | <code><var>r</var>[<var>n</var>] ← -<var>p1</var>[<var>n</var>]</code> |
| 1 | <code>sqrt</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← sqrt(<var>p1</var>[<var>n</var>])</code> |
| 1 | <code>ceil</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← ceil(<var>p1</var>[<var>n</var>])</code> |
| 2 | <code>add</code> | ○ | ○ | ○ | ○ | ○ | ○ | <code><var>r</var>[<var>n</var>] ← <var>p1</var>[<var>n</var>] + <var>p2</var>[<var>n</var>]</code> |
| 2 | <code>add\_sat\_s</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← sat<var>N</var>s(<var>p1</var>[<var>n</var>] + <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>add\_sat\_u</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← sat<var>N</var>u</sub>(<var>p1</var>[<var>n</var>] + <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>avgr\_u</code> | ○ | ○ | | | | | <code><var>r</var>[<var>n</var>] ← avgr<sub>+</sub>(<var>p1</var>[<var>n</var>], <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>sub</code> | ○ | ○ | ○ | ○ | ○ | ○ | <code><var>r</var>[<var>n</var>] ← <var>p1</var>[<var>n</var>] - <var>p2</var>[<var>n</var>]</code> |
| 2 | <code>sub\_sat\_s</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← sat<var>N</var>s(<var>p1</var>[<var>n</var>] - <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>sub\_sat\_u</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← sat<var>N</var>u</sub>(<var>p1</var>[<var>n</var>] - <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>mul</code> | | ○ | ○ | ○ | ○ | ○ | <code><var>r</var>[<var>n</var>] ← <var>p1</var>[<var>n</var>] \* <var>p2</var>[<var>n</var>]</code> |
| 2 | <code>div</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← <var>p1</var>[<var>n</var>] / <var>p2</var>[<var>n</var>]</code> |
| 2 | <code>min</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← min(<var>p1</var>[<var>n</var>], <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>min\_s</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← min<sub>&pm;</sub>(<var>p1</var>[<var>n</var>], <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>min\_u</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← min<sub>+</sub>(<var>p1</var>[<var>n</var>], <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>pmin</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← pmin(<var>p1</var>[<var>n</var>], <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>max</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← max(<var>p1</var>[<var>n</var>], <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>max\_s</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← max<sub>&pm;</sub>(<var>p1</var>[<var>n</var>], <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>max\_u</code> | ○ | ○ | ○ | | | | <code><var>r</var>[<var>n</var>] ← max<sub>+</sub>(<var>p1</var>[<var>n</var>], <var>p2</var>[<var>n</var>])</code> |
| 2 | <code>pmax</code> | | | | | ○ | ○ | <code><var>r</var>[<var>n</var>] ← pmax(<var>p1</var>[<var>n</var>], <var>p2</var>[<var>n</var>])</code> |


| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 1 | <code>i16x8.extadd\_pairwise\_i8x16\_s</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>s8</sub>[2\*<var>n</var>] + <var>p1</var><sub>s8</sub>[2\*<var>n</var>+1]</code> |
| 1 | <code>i16x8.extadd\_pairwise\_i8x16\_u</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>u8</sub>[2\*<var>n</var>] + <var>p1</var><sub>u8</sub>[2\*<var>n</var>+1]</code> |
| 1 | <code>i32x4.extadd\_pairwise\_i16x8\_s</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>s16</sub>[2\*<var>n</var>] + <var>p1</var><sub>s16</sub>[2\*<var>n</var>+1]</code> |
| 1 | <code>i32x4.extadd\_pairwise\_i16x8\_u</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>u16</sub>[2\*<var>n</var>] + <var>p1</var><sub>u16</sub>[2\*<var>n</var>+1]</code> |
| 2 | <code>i16x8.extmul\_low\_i8x16\_s</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>s8</sub>[2\*<var>n</var>] * <var>p2</var><sub>s8</sub>[2\*<var>n</var>]</code> |
| 2 | <code>i16x8.extmul\_low\_i8x16\_u</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>u8</sub>[2\*<var>n</var>] * <var>p2</var><sub>u8</sub>[2\*<var>n</var>]</code> |
| 2 | <code>i16x8.extmul\_hight\_i8x16\_s</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>s8</sub>[2\*<var>n</var>+1] * <var>p2</var><sub>s8</sub>[2\*<var>n</var>+1]</code> |
| 2 | <code>i16x8.extmul\_hight\_i8x16\_u</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>u8</sub>[2\*<var>n</var>+1] * <var>p2</var><sub>u8</sub>[2\*<var>n</var>+1]</code> |
| 2 | <code>i32x4.extmul\_low\_i16x8\_s</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>s16</sub>[2\*<var>n</var>] * <var>p2</var><sub>s16</sub>[2\*<var>n</var>]</code> |
| 2 | <code>i32x4.extmul\_low\_i16x8\_u</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>u16</sub>[2\*<var>n</var>] * <var>p2</var><sub>u16</sub>[2\*<var>n</var>]</code> |
| 2 | <code>i32x4.extmul\_hight\_i16x8\_s</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>s16</sub>[2\*<var>n</var>+1] * <var>p2</var><sub>s16</sub>[2\*<var>n</var>+1]</code> |
| 2 | <code>i32x4.extmul\_hight\_i16x8\_u</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>u16</sub>[2\*<var>n</var>+1] * <var>p2</var><sub>u16</sub>[2\*<var>n</var>+1]</code> |
| 2 | <code>i64x2.extmul\_low\_i32x4\_s</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>s32</sub>[2\*<var>n</var>] * <var>p2</var><sub>s32</sub>[2\*<var>n</var>]</code> |
| 2 | <code>i64x2.extmul\_low\_i32x4\_u</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>u32</sub>[2\*<var>n</var>] * <var>p2</var><sub>u32</sub>[2\*<var>n</var>]</code> |
| 2 | <code>i64x2.extmul\_hight\_i32x4\_s</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>s32</sub>[2\*<var>n</var>+1] * <var>p2</var><sub>s32</sub>[2\*<var>n</var>+1]</code> |
| 2 | <code>i64x2.extmul\_hight\_i32x4\_u</code> | <code><var>r</var>[<var>n</var>] ← <var>p1</var><sub>u32</sub>[2\*<var>n</var>+1] * <var>p2</var><sub>u32</sub>[2\*<var>n</var>+1]</code> |
| 2 | <code>i16x8.q15mulr\_sat\_s | <code><var>r</var>[<var>n</var>] ← sat16s(<br> &nbsp; &nbsp; &nbsp; (<var>p1</var><sub>s16</sub>[<var>n</var>] * <var>p2</var><sub>s16</sub>[<var>n</var>] + 2<sup>14</sup>) &gt;&gt; 15)</code> |
| 2 | <code>i32x4.dot\_i16x8\_s | <code><var>r</var>[<var>n</var>] ← (<var>p1</var><sub>s16</sub>[2\*<var>n</var>] * <var>p2</var><sub>s16</sub>[2\*<var>n</var>] <br> &nbsp; &nbsp; &nbsp; + <var>p1</var><sub>s16</sub>[2\*<var>n</var>+1] * <var>p2</var><sub>s16</sub>[2\*<var>n</var>+1])</code> |


### 選択・混成

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 3 | <code>select</code> | <code><var>r</var> ← <var>p3</var><sub>i32</sub> ? <var>p1</var> : <var>p2</var></code> |

| <code><var>p</var></code> | 操作 | <code><sub>vb1</sub></code> | <code><sub>vb2</sub></code> | <code><sub>vb4</sub></code> | <code><sub>vb8</sub></code> | <code><sub>vfs</sub></code> | <code><sub>vfd</sub></code> | 備考 |
|:-:|:--|:-:|:-:|:-:|:-:|:-:|:-:|:--|
| 1 | <code>replace_lane <var>u8</var></code> | ○ | ○ | ○ | ○ | ○ | ○ | <code><var>r</var> ← <var>p1</var></code> <br> <code><var>r</var>[<var>u8</var>] ← <var>p2</var><sub>要素型</sub></code> |

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 2 | <code>i8x16.shuffle <var>u8</var><sub>0</sub> <var>u8</var><sub>1</sub> ... <var>u8</var><sub>15</sub></code> | <code><var>r</var>[<var>n</var>] ← [...<var>p1</var> , ...<var>p2</var>][<var>u8<sub>n</sub></var>]</code> |
| 2 | <code>i8x16.swizzle | <code><var>r</var>[<var>n</var>] ← <var>p1</var>[<var>p2</var>[<var>n</var>]] ?? 0</code> |


### ref 命令

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 0 | <code>ref.func 𝑥</code> | <code><var>r</var><sub>func</sub> ← funcs[𝑥]</code> |
| 0 | <code>ref.null <var>t</var></code> | <code><var>r</var><sub><var>t</var></sub> ← <var>null</var><sub><var>t</var></sub></code> |
| 1 | <code>ref.is\_null </code> | <code><var>r</var><sub>i32</sub> ← (<var>p1</var> == null)</code> |


### 制御命令

| <code><var>p</var></code> | 命令 | 備考 |
|:-:|:--|:--|
| 0 | <code>nop</code> | 何もしない |
| 0 | <code>unreachable</code> | 不到達用(trap発生) |
| ? | <code>br <var>l</var></code> | ブロックの入れ子 <code><var>l</var></code> 番目のラベルへジャンプ <br> <sub>(脱出するブロック分のスタック処理が行われる)</sub> |
| 1+? | <code>br\_if <var>l</var></code> | <code>if (<var>p1</var><sub>i32</sub>) "br <var>l</var>"</code> |
| 1+? | <code>br\_table <var>l</var><sub>0</sub> <var>l</var><sub>1</sub> ... <var>l</var><sub><var>N</var></sub> </code> | <code>"br <var>l</var><sub>min(<var>N</var>, <var>p1</var><sub>i32</sub>)</sub>"</code> |
| 0 | <code>call 𝑥</code> | 関数 <code>funcs[𝑥]</code> の呼び出し |
| 1 | <code>call_indirect 𝑥 𝑦</code> | 関数 <code>TAB[𝑥]\[<var>p1</var><sub>i32</sub>]</code> の呼び出し<br>関数は <code>types[𝑦]</code> 型であること |
| ? | <code>return</code> | 関数から戻る <sub>(関数型に応じたスタック処理が行われる)</sub> |


## 処理ブロック

以下の表は、命令表ではなく処理順を表します。

### block 〜 end

| <code><var>p</var></code> | コード | 備考 |
|:--|:--|:--|
| ? | <code>block <var>t</var></code> | ブロックの開始 <sub>(<code><var>t</var></code> に応じたスタック処理が行われる)</sub> |
| ? | <code>𝑖𝑛𝑠𝑡𝑟...</code> | ブロック内のコード |
| ? | <code>end</code>  | ブロックの終了 <sub>(<code><var>t</var></code> に応じたスタック処理が行われる)</sub> |
| | (なし) | ラベルの位置 |


### loop 〜 end

| <code><var>p</var></code> | コード | 備考 |
|:--|:--|:--|
| | (なし) | ラベルの位置 |
| ? | <code>loop <var>t</var></code> | ブロックの開始 <sub>(<code><var>t</var></code> に応じたスタック処理が行われる)</sub> |
| ? | <code>𝑖𝑛𝑠𝑡𝑟...</code> | ブロック内のコード |
| ? | <code>end</code> | ブロックの終了 <sub>(<code><var>t</var></code> に応じたスタック処理が行われる)</sub> |


### if 〜 else 〜 end

| <code><var>p</var></code> | コード | 備考 |
|:--|:--|:--|
| 1 | <code>if <var>t</var></code> | <code><var>p1</var><sub>i32</sub></code> が偽なら <code>else</code> の次へジャンプ |
| - | <code>𝑖𝑛𝑠𝑡𝑟...</code> | <code>block <var>t</var> 𝑖𝑛𝑠𝑡𝑟... end</code> 相当 |
| 0 | <code>else</code> | <code>end</code> へジャンプ |
| - | <code>𝑖𝑛𝑠𝑡𝑟...</code> | <code>block <var>t</var> 𝑖𝑛𝑠𝑡𝑟... end</code> 相当 |
| 0 | <code>end</code> | |