blob: 1d4a8af8abe6f1f9dcc6cfd0605881f4a673ff60 [file] [log] [blame]
.. index:: instruction, ! opcode
.. _binary-instr:
Instructions
------------
:ref:`Instructions <syntax-instr>` are encoded by *opcodes*.
Each opcode is represented by a single byte,
and is followed by the instruction's immediate arguments, where present.
The only exception are :ref:`structured control instructions <binary-instr-control>`, which consist of several opcodes bracketing their nested instruction sequences.
.. note::
Gaps in the byte code ranges for encoding instructions are reserved for future extensions.
.. index:: control instructions, structured control, label, block, branch, result type, label index, function index, type index, vector, polymorphism
pair: binary format; instruction
.. _binary-instr-control:
Control Instructions
~~~~~~~~~~~~~~~~~~~~
:ref:`Control instructions <syntax-instr-control>` have varying encodings. For structured instructions, the instruction sequences forming nested blocks are terminated with explicit opcodes for |END| and |ELSE|.
.. _binary-nop:
.. _binary-unreachable:
.. _binary-block:
.. _binary-loop:
.. _binary-if:
.. _binary-br:
.. _binary-br_if:
.. _binary-br_table:
.. _binary-return:
.. _binary-call:
.. _binary-call_indirect:
.. math::
\begin{array}{llclll}
\production{instruction} & \Binstr &::=&
\hex{00} &\Rightarrow& \UNREACHABLE \\ &&|&
\hex{01} &\Rightarrow& \NOP \\ &&|&
\hex{02}~~\X{rt}{:}\Bblocktype~~(\X{in}{:}\Binstr)^\ast~~\hex{0B}
&\Rightarrow& \BLOCK~\X{rt}~\X{in}^\ast~\END \\ &&|&
\hex{03}~~\X{rt}{:}\Bblocktype~~(\X{in}{:}\Binstr)^\ast~~\hex{0B}
&\Rightarrow& \LOOP~\X{rt}~\X{in}^\ast~\END \\ &&|&
\hex{04}~~\X{rt}{:}\Bblocktype~~(\X{in}{:}\Binstr)^\ast~~\hex{0B}
&\Rightarrow& \IF~\X{rt}~\X{in}^\ast~\ELSE~\epsilon~\END \\ &&|&
\hex{04}~~\X{rt}{:}\Bblocktype~~(\X{in}_1{:}\Binstr)^\ast~~
\hex{05}~~(\X{in}_2{:}\Binstr)^\ast~~\hex{0B}
&\Rightarrow& \IF~\X{rt}~\X{in}_1^\ast~\ELSE~\X{in}_2^\ast~\END \\ &&|&
\hex{0C}~~l{:}\Blabelidx &\Rightarrow& \BR~l \\ &&|&
\hex{0D}~~l{:}\Blabelidx &\Rightarrow& \BRIF~l \\ &&|&
\hex{0E}~~l^\ast{:}\Bvec(\Blabelidx)~~l_N{:}\Blabelidx
&\Rightarrow& \BRTABLE~l^\ast~l_N \\ &&|&
\hex{0F} &\Rightarrow& \RETURN \\ &&|&
\hex{10}~~x{:}\Bfuncidx &\Rightarrow& \CALL~x \\ &&|&
\hex{11}~~x{:}\Btypeidx~~\hex{00} &\Rightarrow& \CALLINDIRECT~x \\
\end{array}
.. note::
The |ELSE| opcode :math:`\hex{05}` in the encoding of an |IF| instruction can be omitted if the following instruction sequence is empty.
.. note::
In future versions of WebAssembly, the zero byte occurring in the encoding
of the |CALLINDIRECT| instruction may be used to index additional tables.
.. index:: value type, polymorphism
pair: binary format; instruction
.. _binary-instr-parametric:
Parametric Instructions
~~~~~~~~~~~~~~~~~~~~~~~
:ref:`Parametric instructions <syntax-instr-parametric>` are represented by single byte codes.
.. _binary-drop:
.. _binary-select:
.. math::
\begin{array}{llclll}
\production{instruction} & \Binstr &::=& \dots \\ &&|&
\hex{1A} &\Rightarrow& \DROP \\ &&|&
\hex{1B} &\Rightarrow& \SELECT \\
\end{array}
.. index:: variable instructions, local index, global index
pair: binary format; instruction
.. _binary-instr-variable:
Variable Instructions
~~~~~~~~~~~~~~~~~~~~~
:ref:`Variable instructions <syntax-instr-variable>` are represented by byte codes followed by the encoding of the respective :ref:`index <syntax-index>`.
.. _binary-local.get:
.. _binary-local.set:
.. _binary-local.tee:
.. _binary-global.get:
.. _binary-global.set:
.. math::
\begin{array}{llclll}
\production{instruction} & \Binstr &::=& \dots \\ &&|&
\hex{20}~~x{:}\Blocalidx &\Rightarrow& \LOCALGET~x \\ &&|&
\hex{21}~~x{:}\Blocalidx &\Rightarrow& \LOCALSET~x \\ &&|&
\hex{22}~~x{:}\Blocalidx &\Rightarrow& \LOCALTEE~x \\ &&|&
\hex{23}~~x{:}\Bglobalidx &\Rightarrow& \GLOBALGET~x \\ &&|&
\hex{24}~~x{:}\Bglobalidx &\Rightarrow& \GLOBALSET~x \\
\end{array}
.. index:: memory instruction, memory index
pair: binary format; instruction
.. _binary-instr-memory:
Memory Instructions
~~~~~~~~~~~~~~~~~~~
Each variant of :ref:`memory instruction <syntax-instr-memory>` is encoded with a different byte code. Loads and stores are followed by the encoding of their |memarg| immediate.
.. _binary-memarg:
.. _binary-load:
.. _binary-loadn:
.. _binary-store:
.. _binary-storen:
.. _binary-memory.size:
.. _binary-memory.grow:
.. math::
\begin{array}{llclll}
\production{memory argument} & \Bmemarg &::=&
a{:}\Bu32~~o{:}\Bu32 &\Rightarrow& \{ \ALIGN~a,~\OFFSET~o \} \\
\production{instruction} & \Binstr &::=& \dots \\ &&|&
\hex{28}~~m{:}\Bmemarg &\Rightarrow& \I32.\LOAD~m \\ &&|&
\hex{29}~~m{:}\Bmemarg &\Rightarrow& \I64.\LOAD~m \\ &&|&
\hex{2A}~~m{:}\Bmemarg &\Rightarrow& \F32.\LOAD~m \\ &&|&
\hex{2B}~~m{:}\Bmemarg &\Rightarrow& \F64.\LOAD~m \\ &&|&
\hex{2C}~~m{:}\Bmemarg &\Rightarrow& \I32.\LOAD\K{8\_s}~m \\ &&|&
\hex{2D}~~m{:}\Bmemarg &\Rightarrow& \I32.\LOAD\K{8\_u}~m \\ &&|&
\hex{2E}~~m{:}\Bmemarg &\Rightarrow& \I32.\LOAD\K{16\_s}~m \\ &&|&
\hex{2F}~~m{:}\Bmemarg &\Rightarrow& \I32.\LOAD\K{16\_u}~m \\ &&|&
\hex{30}~~m{:}\Bmemarg &\Rightarrow& \I64.\LOAD\K{8\_s}~m \\ &&|&
\hex{31}~~m{:}\Bmemarg &\Rightarrow& \I64.\LOAD\K{8\_u}~m \\ &&|&
\hex{32}~~m{:}\Bmemarg &\Rightarrow& \I64.\LOAD\K{16\_s}~m \\ &&|&
\hex{33}~~m{:}\Bmemarg &\Rightarrow& \I64.\LOAD\K{16\_u}~m \\ &&|&
\hex{34}~~m{:}\Bmemarg &\Rightarrow& \I64.\LOAD\K{32\_s}~m \\ &&|&
\hex{35}~~m{:}\Bmemarg &\Rightarrow& \I64.\LOAD\K{32\_u}~m \\ &&|&
\hex{36}~~m{:}\Bmemarg &\Rightarrow& \I32.\STORE~m \\ &&|&
\hex{37}~~m{:}\Bmemarg &\Rightarrow& \I64.\STORE~m \\ &&|&
\hex{38}~~m{:}\Bmemarg &\Rightarrow& \F32.\STORE~m \\ &&|&
\hex{39}~~m{:}\Bmemarg &\Rightarrow& \F64.\STORE~m \\ &&|&
\hex{3A}~~m{:}\Bmemarg &\Rightarrow& \I32.\STORE\K{8}~m \\ &&|&
\hex{3B}~~m{:}\Bmemarg &\Rightarrow& \I32.\STORE\K{16}~m \\ &&|&
\hex{3C}~~m{:}\Bmemarg &\Rightarrow& \I64.\STORE\K{8}~m \\ &&|&
\hex{3D}~~m{:}\Bmemarg &\Rightarrow& \I64.\STORE\K{16}~m \\ &&|&
\hex{3E}~~m{:}\Bmemarg &\Rightarrow& \I64.\STORE\K{32}~m \\ &&|&
\hex{3F}~~\hex{00} &\Rightarrow& \MEMORYSIZE \\ &&|&
\hex{40}~~\hex{00} &\Rightarrow& \MEMORYGROW \\
\end{array}
.. note::
In future versions of WebAssembly, the additional zero bytes occurring in the encoding of the |MEMORYSIZE| and |MEMORYGROW| instructions may be used to index additional memories.
.. index:: numeric instruction
pair: binary format; instruction
.. _binary-instr-numeric:
Numeric Instructions
~~~~~~~~~~~~~~~~~~~~
All variants of :ref:`numeric instructions <syntax-instr-numeric>` are represented by separate byte codes.
The |CONST| instructions are followed by the respective literal.
.. _binary-const:
.. math::
\begin{array}{llclll}
\production{instruction} & \Binstr &::=& \dots \\&&|&
\hex{41}~~n{:}\Bi32 &\Rightarrow& \I32.\CONST~n \\ &&|&
\hex{42}~~n{:}\Bi64 &\Rightarrow& \I64.\CONST~n \\ &&|&
\hex{43}~~z{:}\Bf32 &\Rightarrow& \F32.\CONST~z \\ &&|&
\hex{44}~~z{:}\Bf64 &\Rightarrow& \F64.\CONST~z \\
\end{array}
All other numeric instructions are plain opcodes without any immediates.
.. _binary-testop:
.. _binary-relop:
.. math::
\begin{array}{llclll}
\production{instruction} & \Binstr &::=& \dots && \phantom{thisshouldbeenough} \\&&|&
\hex{45} &\Rightarrow& \I32.\EQZ \\ &&|&
\hex{46} &\Rightarrow& \I32.\EQ \\ &&|&
\hex{47} &\Rightarrow& \I32.\NE \\ &&|&
\hex{48} &\Rightarrow& \I32.\LT\K{\_s} \\ &&|&
\hex{49} &\Rightarrow& \I32.\LT\K{\_u} \\ &&|&
\hex{4A} &\Rightarrow& \I32.\GT\K{\_s} \\ &&|&
\hex{4B} &\Rightarrow& \I32.\GT\K{\_u} \\ &&|&
\hex{4C} &\Rightarrow& \I32.\LE\K{\_s} \\ &&|&
\hex{4D} &\Rightarrow& \I32.\LE\K{\_u} \\ &&|&
\hex{4E} &\Rightarrow& \I32.\GE\K{\_s} \\ &&|&
\hex{4F} &\Rightarrow& \I32.\GE\K{\_u} \\
\end{array}
.. math::
\begin{array}{llclll}
\phantom{\production{instruction}} & \phantom{\Binstr} &\phantom{::=}& \phantom{\dots} && \phantom{thisshouldbeenough} \\[-2ex] &&|&
\hex{50} &\Rightarrow& \I64.\EQZ \\ &&|&
\hex{51} &\Rightarrow& \I64.\EQ \\ &&|&
\hex{52} &\Rightarrow& \I64.\NE \\ &&|&
\hex{53} &\Rightarrow& \I64.\LT\K{\_s} \\ &&|&
\hex{54} &\Rightarrow& \I64.\LT\K{\_u} \\ &&|&
\hex{55} &\Rightarrow& \I64.\GT\K{\_s} \\ &&|&
\hex{56} &\Rightarrow& \I64.\GT\K{\_u} \\ &&|&
\hex{57} &\Rightarrow& \I64.\LE\K{\_s} \\ &&|&
\hex{58} &\Rightarrow& \I64.\LE\K{\_u} \\ &&|&
\hex{59} &\Rightarrow& \I64.\GE\K{\_s} \\ &&|&
\hex{5A} &\Rightarrow& \I64.\GE\K{\_u} \\
\end{array}
.. math::
\begin{array}{llclll}
\phantom{\production{instruction}} & \phantom{\Binstr} &\phantom{::=}& \phantom{\dots} && \phantom{thisshouldbeenough} \\[-2ex] &&|&
\hex{5B} &\Rightarrow& \F32.\EQ \\ &&|&
\hex{5C} &\Rightarrow& \F32.\NE \\ &&|&
\hex{5D} &\Rightarrow& \F32.\LT \\ &&|&
\hex{5E} &\Rightarrow& \F32.\GT \\ &&|&
\hex{5F} &\Rightarrow& \F32.\LE \\ &&|&
\hex{60} &\Rightarrow& \F32.\GE \\
\end{array}
.. math::
\begin{array}{llclll}
\phantom{\production{instruction}} & \phantom{\Binstr} &\phantom{::=}& \phantom{\dots} && \phantom{thisshouldbeenough} \\[-2ex] &&|&
\hex{61} &\Rightarrow& \F64.\EQ \\ &&|&
\hex{62} &\Rightarrow& \F64.\NE \\ &&|&
\hex{63} &\Rightarrow& \F64.\LT \\ &&|&
\hex{64} &\Rightarrow& \F64.\GT \\ &&|&
\hex{65} &\Rightarrow& \F64.\LE \\ &&|&
\hex{66} &\Rightarrow& \F64.\GE \\
\end{array}
.. _binary-unop:
.. _binary-binop:
.. math::
\begin{array}{llclll}
\phantom{\production{instruction}} & \phantom{\Binstr} &\phantom{::=}& \phantom{\dots} && \phantom{thisshouldbeenough} \\[-2ex] &&|&
\hex{67} &\Rightarrow& \I32.\CLZ \\ &&|&
\hex{68} &\Rightarrow& \I32.\CTZ \\ &&|&
\hex{69} &\Rightarrow& \I32.\POPCNT \\ &&|&
\hex{6A} &\Rightarrow& \I32.\ADD \\ &&|&
\hex{6B} &\Rightarrow& \I32.\SUB \\ &&|&
\hex{6C} &\Rightarrow& \I32.\MUL \\ &&|&
\hex{6D} &\Rightarrow& \I32.\DIV\K{\_s} \\ &&|&
\hex{6E} &\Rightarrow& \I32.\DIV\K{\_u} \\ &&|&
\hex{6F} &\Rightarrow& \I32.\REM\K{\_s} \\ &&|&
\hex{70} &\Rightarrow& \I32.\REM\K{\_u} \\ &&|&
\hex{71} &\Rightarrow& \I32.\AND \\ &&|&
\hex{72} &\Rightarrow& \I32.\OR \\ &&|&
\hex{73} &\Rightarrow& \I32.\XOR \\ &&|&
\hex{74} &\Rightarrow& \I32.\SHL \\ &&|&
\hex{75} &\Rightarrow& \I32.\SHR\K{\_s} \\ &&|&
\hex{76} &\Rightarrow& \I32.\SHR\K{\_u} \\ &&|&
\hex{77} &\Rightarrow& \I32.\ROTL \\ &&|&
\hex{78} &\Rightarrow& \I32.\ROTR \\
\end{array}
.. math::
\begin{array}{llclll}
\phantom{\production{instruction}} & \phantom{\Binstr} &\phantom{::=}& \phantom{\dots} && \phantom{thisshouldbeenough} \\[-2ex] &&|&
\hex{79} &\Rightarrow& \I64.\CLZ \\ &&|&
\hex{7A} &\Rightarrow& \I64.\CTZ \\ &&|&
\hex{7B} &\Rightarrow& \I64.\POPCNT \\ &&|&
\hex{7C} &\Rightarrow& \I64.\ADD \\ &&|&
\hex{7D} &\Rightarrow& \I64.\SUB \\ &&|&
\hex{7E} &\Rightarrow& \I64.\MUL \\ &&|&
\hex{7F} &\Rightarrow& \I64.\DIV\K{\_s} \\ &&|&
\hex{80} &\Rightarrow& \I64.\DIV\K{\_u} \\ &&|&
\hex{81} &\Rightarrow& \I64.\REM\K{\_s} \\ &&|&
\hex{82} &\Rightarrow& \I64.\REM\K{\_u} \\ &&|&
\hex{83} &\Rightarrow& \I64.\AND \\ &&|&
\hex{84} &\Rightarrow& \I64.\OR \\ &&|&
\hex{85} &\Rightarrow& \I64.\XOR \\ &&|&
\hex{86} &\Rightarrow& \I64.\SHL \\ &&|&
\hex{87} &\Rightarrow& \I64.\SHR\K{\_s} \\ &&|&
\hex{88} &\Rightarrow& \I64.\SHR\K{\_u} \\ &&|&
\hex{89} &\Rightarrow& \I64.\ROTL \\ &&|&
\hex{8A} &\Rightarrow& \I64.\ROTR \\
\end{array}
.. math::
\begin{array}{llclll}
\phantom{\production{instruction}} & \phantom{\Binstr} &\phantom{::=}& \phantom{\dots} && \phantom{thisshouldbeenough} \\[-2ex] &&|&
\hex{8B} &\Rightarrow& \F32.\ABS \\ &&|&
\hex{8C} &\Rightarrow& \F32.\NEG \\ &&|&
\hex{8D} &\Rightarrow& \F32.\CEIL \\ &&|&
\hex{8E} &\Rightarrow& \F32.\FLOOR \\ &&|&
\hex{8F} &\Rightarrow& \F32.\TRUNC \\ &&|&
\hex{90} &\Rightarrow& \F32.\NEAREST \\ &&|&
\hex{91} &\Rightarrow& \F32.\SQRT \\ &&|&
\hex{92} &\Rightarrow& \F32.\ADD \\ &&|&
\hex{93} &\Rightarrow& \F32.\SUB \\ &&|&
\hex{94} &\Rightarrow& \F32.\MUL \\ &&|&
\hex{95} &\Rightarrow& \F32.\DIV \\ &&|&
\hex{96} &\Rightarrow& \F32.\FMIN \\ &&|&
\hex{97} &\Rightarrow& \F32.\FMAX \\ &&|&
\hex{98} &\Rightarrow& \F32.\COPYSIGN \\
\end{array}
.. math::
\begin{array}{llclll}
\phantom{\production{instruction}} & \phantom{\Binstr} &\phantom{::=}& \phantom{\dots} && \phantom{thisshouldbeenough} \\[-2ex] &&|&
\hex{99} &\Rightarrow& \F64.\ABS \\ &&|&
\hex{9A} &\Rightarrow& \F64.\NEG \\ &&|&
\hex{9B} &\Rightarrow& \F64.\CEIL \\ &&|&
\hex{9C} &\Rightarrow& \F64.\FLOOR \\ &&|&
\hex{9D} &\Rightarrow& \F64.\TRUNC \\ &&|&
\hex{9E} &\Rightarrow& \F64.\NEAREST \\ &&|&
\hex{9F} &\Rightarrow& \F64.\SQRT \\ &&|&
\hex{A0} &\Rightarrow& \F64.\ADD \\ &&|&
\hex{A1} &\Rightarrow& \F64.\SUB \\ &&|&
\hex{A2} &\Rightarrow& \F64.\MUL \\ &&|&
\hex{A3} &\Rightarrow& \F64.\DIV \\ &&|&
\hex{A4} &\Rightarrow& \F64.\FMIN \\ &&|&
\hex{A5} &\Rightarrow& \F64.\FMAX \\ &&|&
\hex{A6} &\Rightarrow& \F64.\COPYSIGN \\
\end{array}
.. _binary-cvtop:
.. math::
\begin{array}{llclll}
\phantom{\production{instruction}} & \phantom{\Binstr} &\phantom{::=}& \phantom{\dots} && \phantom{thisshouldbeenough} \\[-2ex] &&|&
\hex{A7} &\Rightarrow& \I32.\WRAP\K{\_}\I64 \\ &&|&
\hex{A8} &\Rightarrow& \I32.\TRUNC\K{\_}\F32\K{\_s} \\ &&|&
\hex{A9} &\Rightarrow& \I32.\TRUNC\K{\_}\F32\K{\_u} \\ &&|&
\hex{AA} &\Rightarrow& \I32.\TRUNC\K{\_}\F64\K{\_s} \\ &&|&
\hex{AB} &\Rightarrow& \I32.\TRUNC\K{\_}\F64\K{\_u} \\ &&|&
\hex{AC} &\Rightarrow& \I64.\EXTEND\K{\_}\I32\K{\_s} \\ &&|&
\hex{AD} &\Rightarrow& \I64.\EXTEND\K{\_}\I32\K{\_u} \\ &&|&
\hex{AE} &\Rightarrow& \I64.\TRUNC\K{\_}\F32\K{\_s} \\ &&|&
\hex{AF} &\Rightarrow& \I64.\TRUNC\K{\_}\F32\K{\_u} \\ &&|&
\hex{B0} &\Rightarrow& \I64.\TRUNC\K{\_}\F64\K{\_s} \\ &&|&
\hex{B1} &\Rightarrow& \I64.\TRUNC\K{\_}\F64\K{\_u} \\ &&|&
\hex{B2} &\Rightarrow& \F32.\CONVERT\K{\_}\I32\K{\_s} \\ &&|&
\hex{B3} &\Rightarrow& \F32.\CONVERT\K{\_}\I32\K{\_u} \\ &&|&
\hex{B4} &\Rightarrow& \F32.\CONVERT\K{\_}\I64\K{\_s} \\ &&|&
\hex{B5} &\Rightarrow& \F32.\CONVERT\K{\_}\I64\K{\_u} \\ &&|&
\hex{B6} &\Rightarrow& \F32.\DEMOTE\K{\_}\F64 \\ &&|&
\hex{B7} &\Rightarrow& \F64.\CONVERT\K{\_}\I32\K{\_s} \\ &&|&
\hex{B8} &\Rightarrow& \F64.\CONVERT\K{\_}\I32\K{\_u} \\ &&|&
\hex{B9} &\Rightarrow& \F64.\CONVERT\K{\_}\I64\K{\_s} \\ &&|&
\hex{BA} &\Rightarrow& \F64.\CONVERT\K{\_}\I64\K{\_u} \\ &&|&
\hex{BB} &\Rightarrow& \F64.\PROMOTE\K{\_}\F32 \\ &&|&
\hex{BC} &\Rightarrow& \I32.\REINTERPRET\K{\_}\F32 \\ &&|&
\hex{BD} &\Rightarrow& \I64.\REINTERPRET\K{\_}\F64 \\ &&|&
\hex{BE} &\Rightarrow& \F32.\REINTERPRET\K{\_}\I32 \\ &&|&
\hex{BF} &\Rightarrow& \F64.\REINTERPRET\K{\_}\I64 \\
\end{array}
.. index:: expression
pair: binary format; expression
single: expression; constant
.. _binary-expr:
Expressions
~~~~~~~~~~~
:ref:`Expressions <syntax-expr>` are encoded by their instruction sequence terminated with an explicit :math:`\hex{0B}` opcode for |END|.
.. math::
\begin{array}{llclll}
\production{expression} & \Bexpr &::=&
(\X{in}{:}\Binstr)^\ast~~\hex{0B} &\Rightarrow& \X{in}^\ast~\END \\
\end{array}