概要
wasmが、スタックマシンらしいので、やってみた。
plunkerでwasmのwatのsandboxやってみた。
WebAssembly (Wasm) の主要なニーモニック(命令)の機能別一覧です。
算術・論理演算命令 (Arithmetic & Logic)
数値を計算・比較する、最も基本的な命令群です。
整数演算 (i32, i64)
• add / sub / mul : 加算 / 減算 / 乗算
• div_s / div_u : 符号付き除算 / 符号なし除算
• rem_s / rem_u : 符号付き剰余(余り) / 符号なし剰余
• and / or / xor : ビット論理積 / 論理和 / 排他的論理和
• shl / shr_s / shr_u : 左シフト / 符号付き右シフト / 符号なし右シフト
• clz / ctz / popcnt : 最上位からの0の数 / 最下位からの0の数 / 1であるビットの数
浮動小数点演算 (f32, f64)
• add / sub / mul / div : 加算 / 減算 / 乗算 / 除算
• abs / neg / copysign : 絶対値 / 符号反転 / 符号コピー
• ceil / floor / trunc / nearest : 切り上げ / 切り捨て / ゼロ方向丸め / 最も近い整数への丸め
• sqrt : 平方根(ルート)
• min / max : 最小値 / 最大値
比較命令 (Comparison)
条件分岐の判定に使われます。結果はすべて i32 の 1 (真) か 0 (偽) で返されます。
• eq / ne : 等しい (=) / 等しくない (≠)
• lt_s / lt_u / lt : 未満 (<) (符号あり/なし/浮動小数点)
• le_s / le_u / le : 以下 (≤) (符号あり/なし/浮動小数点)
• gt_s / gt_u / gt : 超過 (>) (符号あり/なし/浮動小数点)
• ge_s / ge_u / ge : 以上 (≥) (符号あり/なし/浮動小数点)
変数・スタック操作命令 (Variable Access)
ローカル変数やグローバル変数、スタック上の値を扱います。型指定(i32. など)は付きません。
• local.get : ローカル変数の値をスタックに積む
• local.set : スタックの最上段の値をポップしてローカル変数に代入する
• local.tee : スタックの値を複製しつつ、ローカル変数にも代入する
• global.get / global.set : グローバル変数の取得 / 代入
• drop : スタックの最上段の値を1つ破棄する
• select : 条件(スタックの3番目の値)に応じて、1番目か2番目の値を選択する(三項演算子)
メモリアクセス命令 (Memory)
リニアメモリ(RAM)への読み書きを行います。
• i32.load / i64.load : メモリから値を読み出してスタックに積む
• f32.load / f64.load : (浮動小数点用)
• i32.store / i64.store : スタックの値をメモリに書き込む
• f32.store / f64.store : (浮動小数点用)
• i32.load8_s / i32.load8_u : 8ビットだけ読み込み、32ビットに拡張(符号あり/なし)
• i32.load16_s / i32.load16_u : 16ビットだけ読み込み、32ビットに拡張
• memory.size : 現在のメモリサイズ(ページ単位)を取得する
• memory.grow : メモリサイズを動的に拡張する
制御フロー命令 (Control Flow)
プログラムの流れを制御します。
• block : ブロックの定義(末尾へのジャンプ先となる)
• loop : ループの定義(先頭へのジャンプ先となる)
• if ... else ... end : 条件分岐
• br : 指定した深さのブロックへジャンプ(Break)
• br_if : 条件が真(非ゼロ)の場合にジャンプ
• br_table : ジャンプ先テーブル(switch文のような多分岐)
• return : 関数から抜ける(呼び出し元に戻る)
• call : 関数を呼び出す
• call_indirect : 関数ポインタ(テーブル)経由で関数を動的に呼び出す
• nop : 何もしない(No Operation)
• unreachable : 致命的なエラーを発生させてプログラムを強制終了する
型変換命令 (Conversion)
異なるデータ型の間で値を変換します。[変換後の型].[操作]_[変換前の型] という命名規則になります。
• i32.wrap_i64 : 64ビット整数を32ビット整数に丸める(上位ビット破棄)
• i64.extend_i32_s / _u : 32ビット整数を64ビット整数に拡張(符号あり/なし)
• i32.trunc_f32_s / _u : 32ビット浮動小数点を、ゼロ方向丸めで32ビット整数に変換
• f32.convert_i32_s / _u : 32ビット整数を32ビット浮動小数点に変換
• f64.promote_f32 : 32ビット浮動小数点を64ビット(倍精度)に精度向上
• f32.demote_f64 : 64ビット浮動小数点を32ビット(単精度)に精度低下
• i32.reinterpret_f32 : ビットパターンをそのままに、浮動小数点を整数として解釈(キャスト)
以上。