From 9423d557a1ecb1de1251592b75bd7a64ca5717dd Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Tue, 7 Jan 2025 14:41:40 +0900 Subject: [PATCH 01/12] Minor change --- spectec/src/al/print.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectec/src/al/print.ml b/spectec/src/al/print.ml index c5e9bef86d..1e00d76eec 100644 --- a/spectec/src/al/print.ml +++ b/spectec/src/al/print.ml @@ -392,7 +392,7 @@ let rec structured_string_of_iter = function and structured_string_of_record_expr r = Record.fold - (fun a v acc -> acc ^ string_of_atom a ^ ": " ^ string_of_expr v ^ "; ") + (fun a v acc -> acc ^ string_of_atom a ^ ": " ^ structured_string_of_expr v ^ "; ") r "{ " ^ "}" From 37b543e41cfc7e3282b1a91921d48ab8484e1662 Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Tue, 7 Jan 2025 14:56:14 +0900 Subject: [PATCH 02/12] Parentheses issues fixed --- spectec/src/backend-prose/render.ml | 41 ++++++- spectec/test-prose/TEST.md | 180 ++++++++++++++-------------- 2 files changed, 128 insertions(+), 93 deletions(-) diff --git a/spectec/src/backend-prose/render.ml b/spectec/src/backend-prose/render.ml index 9b687140ec..3ba8948b4e 100644 --- a/spectec/src/backend-prose/render.ml +++ b/spectec/src/backend-prose/render.ml @@ -62,6 +62,16 @@ let render_order index depth = | 3 -> alp_idx ^ ")" | _ -> assert false +let rec is_additive_bine expr = match expr.it with + | Al.Ast.BinE ((`AddOp | `SubOp), _, _) -> true + | Al.Ast.CvtE (e, _, _) -> is_additive_bine e + | _ -> false + +and is_bine expr = match expr.it with + | Al.Ast.BinE _ -> true + | Al.Ast.CvtE (e, _, _) -> is_bine e + | _ -> false + (* Translation from Al inverse call exp to Al binary exp *) let e2a e = Al.Ast.ExpA e $ e.at let a2e a = @@ -177,7 +187,20 @@ and al_to_el_expr expr = | #Num.binop as elop -> let* ele1 = al_to_el_expr e1 in let* ele2 = al_to_el_expr e2 in - Some (El.Ast.BinE (ele1, elop, ele2)) + (* Add parentheses when needed *) + let pele1 = match op with + | `MulOp | `DivOp | `ModOp when is_additive_bine e1 -> + El.Ast.ParenE ele1 $ no_region + | `PowOp when is_bine e1 -> + El.Ast.ParenE ele1 $ no_region + | _ -> ele1 in + let pele2 = match op with + | `SubOp | `MulOp when is_additive_bine e2 -> + El.Ast.ParenE ele2 $ no_region + | `DivOp | `ModOp when is_bine e2-> + El.Ast.ParenE ele2 $ no_region + | _ -> ele2 in + Some (El.Ast.BinE (pele1, elop, pele2)) | #Num.cmpop | #Bool.cmpop as elop -> let* ele1 = al_to_el_expr e1 in let* ele2 = al_to_el_expr e2 in @@ -194,9 +217,20 @@ and al_to_el_expr expr = | _ -> let elid = id $ no_region in let* elal = al_to_el_args al in + (* Unwrap parenthsized args *) let elal = List.map (fun elarg -> - (ref elarg) $ no_region) + let elarg = match elarg with + | El.Ast.ExpA exp -> + let exp = match exp.it with + | ParenE exp' -> exp' + | _ -> exp + in + El.Ast.ExpA exp + | _ -> elarg + in + (ref elarg) $ no_region + ) elal in Some (El.Ast.CallE (elid, elal)) @@ -258,7 +292,8 @@ and al_to_el_expr expr = | Al.Ast.CaseE (op, el) -> (* Current rules for omitting parenthesis around a CaseE: 1) Has no argument - 2) Is infix notation *) + 2) Is infix notation + 3) Is argument of CallE -> add first, omit later at CallE *) let elal = mixop_to_el_exprs op in let* elel = al_to_el_exprs el in let ele = El.Ast.SeqE (case_to_el_exprs elal elel) in diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index 2ee2fd65d9..0268a19bc6 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -1501,7 +1501,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as a. Let :math:`{\mathit{mi}}` be :math:`{\mathrm{growmemory}}(z{.}\mathsf{mems}{}[0], n)`. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|} / 64 \, {\mathrm{Ki}})` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|} / (64 \, {\mathrm{Ki}}))` to the stack. #. Perform :math:`z{}[{.}\mathsf{mems}{}[0] = {\mathit{mi}}]`. @@ -2416,7 +2416,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~]),\; \mathsf{bytes}~{b^\ast} \}\end{array}` be :math:`{\mathit{mi}}`. -#. Let :math:`{i'}` be :math:`{|{b^\ast}|} / 64 \, {\mathrm{Ki}} + n`. +#. Let :math:`{i'}` be :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n`. #. If :math:`{i'} \leq j`, then: @@ -2581,8 +2581,8 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. -:math:`{\mathrm{alloctable}}(s, ({}[~i~..~j~]))` -................................................ +:math:`{\mathrm{alloctable}}(s, {}[~i~..~j~])` +.............................................. 1. Let :math:`{\mathit{ti}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~]),\; \mathsf{refs}~{\epsilon^{i}} \}\end{array}`. @@ -2611,8 +2611,8 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{\mathit{ta}}~{{\mathit{ta}'}^\ast}`. -:math:`{\mathrm{allocmem}}(s, ({}[~i~..~j~]))` -.............................................. +:math:`{\mathrm{allocmem}}(s, {}[~i~..~j~])` +............................................ 1. Let :math:`{\mathit{mi}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~]),\; \mathsf{bytes}~{\mathtt{0x00}^{i \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. @@ -2641,8 +2641,8 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{\mathit{ma}}~{{\mathit{ma}'}^\ast}`. -:math:`{\mathrm{instexport}}({{\mathit{fa}}^\ast}, {{\mathit{ga}}^\ast}, {{\mathit{ta}}^\ast}, {{\mathit{ma}}^\ast}, (\mathsf{export}~{\mathit{name}}~{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}))` -..................................................................................................................................................................................................................... +:math:`{\mathrm{instexport}}({{\mathit{fa}}^\ast}, {{\mathit{ga}}^\ast}, {{\mathit{ta}}^\ast}, {{\mathit{ma}}^\ast}, \mathsf{export}~{\mathit{name}}~{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}})` +................................................................................................................................................................................................................... 1. If :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`, then: @@ -7418,7 +7418,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as a. Let :math:`{\mathit{mi}}` be :math:`{\mathrm{growmemory}}(z{.}\mathsf{mems}{}[0], n)`. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|} / 64 \, {\mathrm{Ki}})` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|} / (64 \, {\mathrm{Ki}}))` to the stack. #. Perform :math:`z{}[{.}\mathsf{mems}{}[0] = {\mathit{mi}}]`. @@ -7906,8 +7906,8 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. Return :math:`{\mathrm{dataidx}}({{\mathit{in}}^\ast})`. -:math:`{\mathrm{dataidx}}((\mathsf{func}~x~{{\mathit{loc}}^\ast}~e))` -..................................................................... +:math:`{\mathrm{dataidx}}(\mathsf{func}~x~{{\mathit{loc}}^\ast}~e)` +................................................................... 1. Return :math:`{\mathrm{dataidx}}(e)`. @@ -8991,8 +8991,8 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{{\mathit{fN}}_2^\ast}`. -:math:`{{\mathrm{vextunop}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}((\mathsf{extadd\_pairwise}~{\mathit{sx}}), c_1)` -.............................................................................................................................................................. +:math:`{{\mathrm{vextunop}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}(\mathsf{extadd\_pairwise}~{\mathit{sx}}, c_1)` +............................................................................................................................................................ 1. Let :math:`{{\mathit{ci}}^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}(c_1)`. @@ -9406,7 +9406,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~])~\mathsf{page},\; \mathsf{bytes}~{b^\ast} \}\end{array}` be :math:`{\mathit{mi}}`. -#. Let :math:`{i'}` be :math:`{|{b^\ast}|} / 64 \, {\mathrm{Ki}} + n`. +#. Let :math:`{i'}` be :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n`. #. If :math:`{i'} \leq j`, then: @@ -9722,8 +9722,8 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{\mathit{da}}~{{\mathit{da}'}^\ast}`. -:math:`{\mathrm{instexport}}({{\mathit{fa}}^\ast}, {{\mathit{ga}}^\ast}, {{\mathit{ta}}^\ast}, {{\mathit{ma}}^\ast}, (\mathsf{export}~{\mathit{name}}~{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}))` -..................................................................................................................................................................................................................... +:math:`{\mathrm{instexport}}({{\mathit{fa}}^\ast}, {{\mathit{ga}}^\ast}, {{\mathit{ta}}^\ast}, {{\mathit{ma}}^\ast}, \mathsf{export}~{\mathit{name}}~{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}})` +................................................................................................................................................................................................................... 1. If :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`, then: @@ -9834,8 +9834,8 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{\mathit{moduleinst}}`. -:math:`{\mathrm{runelem}}((\mathsf{elem}~{\mathit{reftype}}~{{\mathit{expr}}^\ast}~{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}), i)` -.................................................................................................................................................... +:math:`{\mathrm{runelem}}(\mathsf{elem}~{\mathit{reftype}}~{{\mathit{expr}}^\ast}~{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}, i)` +.................................................................................................................................................. 1. If :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{passive}`, then: @@ -9855,8 +9855,8 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{{\mathit{instr}}^\ast}~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n)~(\mathsf{table{.}init}~x~i)~(\mathsf{elem{.}drop}~i)`. -:math:`{\mathrm{rundata}}((\mathsf{data}~{{\mathit{byte}}^\ast}~{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}), i)` -................................................................................................................................. +:math:`{\mathrm{rundata}}(\mathsf{data}~{{\mathit{byte}}^\ast}~{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}, i)` +............................................................................................................................... 1. If :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{passive}`, then: @@ -19156,7 +19156,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i a. Let :math:`{\mathit{mi}}` be :math:`{\mathrm{growmem}}(z{.}\mathsf{mems}{}[x], n)`. - #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|} / 64 \, {\mathrm{Ki}})` to the stack. + #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|} / (64 \, {\mathrm{Ki}}))` to the stack. #. Perform :math:`z{}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]`. @@ -19870,8 +19870,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathit{at}}_2`. -:math:`(\mathsf{ref}~{\mathsf{null}}{{{}_{1}^?}}~{\mathit{ht}}_1) \setminus (\mathsf{ref}~{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~{\mathit{ht}}_2)` -....................................................................................................................................................................... +:math:`\mathsf{ref}~{\mathsf{null}}{{{}_{1}^?}}~{\mathit{ht}}_1 \setminus \mathsf{ref}~{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~{\mathit{ht}}_2` +................................................................................................................................................................... 1. If :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{null}`, then: @@ -20070,8 +20070,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathit{ht}}`. -:math:`{(\mathsf{ref}~{\mathsf{null}^?}~{\mathit{ht}})}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` -............................................................................................................ +:math:`{\mathsf{ref}~{\mathsf{null}^?}~{\mathit{ht}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` +.......................................................................................................... 1. Return :math:`(\mathsf{ref}~{\mathsf{null}^?}~{{\mathit{ht}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. @@ -20151,22 +20151,22 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`(\mathsf{func}~{{\mathit{ft}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. -:math:`{(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{tu}'}^\ast}~{\mathit{ct}})}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` -................................................................................................................................... +:math:`{\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{tu}'}^\ast}~{\mathit{ct}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` +................................................................................................................................. 1. Return :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{{\mathit{tu}'}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}^\ast}~{{\mathit{ct}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. -:math:`{(\mathsf{rec}~{{\mathit{st}}^\ast})}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` -................................................................................................. +:math:`{\mathsf{rec}~{{\mathit{st}}^\ast}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` +............................................................................................... 1. Return :math:`(\mathsf{rec}~{{{\mathit{st}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}^\ast})`. -:math:`{({\mathit{qt}} {.} i)}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` -................................................................................... +:math:`{{\mathit{qt}} {.} i}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` +................................................................................. 1. Return :math:`({{\mathit{qt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]} {.} i)`. @@ -20200,8 +20200,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Return :math:`({\mathit{at}}, {\mathit{lim}}, {{\mathit{rt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. -:math:`{({\mathit{at}}~{\mathit{lim}}~\mathsf{page})}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` -.......................................................................................................... +:math:`{{\mathit{at}}~{\mathit{lim}}~\mathsf{page}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` +........................................................................................................ 1. Return :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. @@ -20351,8 +20351,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{((\mathsf{rec}~{{\mathit{subtype}}^{n}}) {.} i)^{i<n}}`. -:math:`{\mathrm{unroll}}(({\mathit{rectype}} {.} i))` -..................................................... +:math:`{\mathrm{unroll}}({\mathit{rectype}} {.} i)` +................................................... 1. Assert: Due to validation, :math:`{\mathrm{unroll}}({\mathit{rectype}})` is of the case :math:`\mathsf{rec}`. @@ -20616,8 +20616,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathrm{free}}_{\mathit{typeuse}}({\mathit{typeuse}})`. -:math:`{\mathrm{free}}_{\mathit{reftype}}((\mathsf{ref}~{\mathsf{null}^?}~{\mathit{heaptype}}))` -................................................................................................ +:math:`{\mathrm{free}}_{\mathit{reftype}}(\mathsf{ref}~{\mathsf{null}^?}~{\mathit{heaptype}})` +.............................................................................................. 1. Return :math:`{\mathrm{free}}_{\mathit{heaptype}}({\mathit{heaptype}})`. @@ -20742,22 +20742,22 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathrm{free}}_{\mathit{functype}}({\mathit{functype}})`. -:math:`{\mathrm{free}}_{\mathit{subtype}}((\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{comptype}}))` -........................................................................................................................... +:math:`{\mathrm{free}}_{\mathit{subtype}}(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{comptype}})` +......................................................................................................................... 1. Return `$free_list($free_typeuse(typeuse)*{typeuse <- typeuse*}) ++ $free_comptype(comptype)`. -:math:`{\mathrm{free}}_{\mathit{rectype}}((\mathsf{rec}~{{\mathit{subtype}}^\ast}))` -.................................................................................... +:math:`{\mathrm{free}}_{\mathit{rectype}}(\mathsf{rec}~{{\mathit{subtype}}^\ast})` +.................................................................................. 1. Return :math:`{\mathrm{free}}_{\mathit{list}}({{\mathrm{free}}_{\mathit{subtype}}({\mathit{subtype}})^\ast})`. -:math:`{\mathrm{free}}_{\mathit{deftype}}(({\mathit{rectype}} {.} n))` -...................................................................... +:math:`{\mathrm{free}}_{\mathit{deftype}}({\mathit{rectype}} {.} n)` +.................................................................... 1. Return :math:`{\mathrm{free}}_{\mathit{rectype}}({\mathit{rectype}})`. @@ -20777,8 +20777,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Return `$free_addrtype(addrtype) ++ $free_reftype(reftype)`. -:math:`{\mathrm{free}}_{\mathit{memtype}}(({\mathit{addrtype}}~{\mathit{limits}}~\mathsf{page}))` -................................................................................................. +:math:`{\mathrm{free}}_{\mathit{memtype}}({\mathit{addrtype}}~{\mathit{limits}}~\mathsf{page})` +............................................................................................... 1. Return :math:`{\mathrm{free}}_{\mathit{addrtype}}({\mathit{addrtype}})`. @@ -21485,50 +21485,50 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Return :math:`{\mathrm{free}}_{\mathit{list}}({{\mathrm{free}}_{\mathit{instr}}({\mathit{instr}})^\ast})`. -:math:`{\mathrm{free}}_{\mathit{type}}((\mathsf{type}~{\mathit{rectype}}))` -........................................................................... +:math:`{\mathrm{free}}_{\mathit{type}}(\mathsf{type}~{\mathit{rectype}})` +......................................................................... 1. Return :math:`{\mathrm{free}}_{\mathit{rectype}}({\mathit{rectype}})`. -:math:`{\mathrm{free}}_{\mathit{local}}((\mathsf{local}~t))` -............................................................ +:math:`{\mathrm{free}}_{\mathit{local}}(\mathsf{local}~t)` +.......................................................... 1. Return :math:`{\mathrm{free}}_{\mathit{valtype}}(t)`. -:math:`{\mathrm{free}}_{\mathit{func}}((\mathsf{func}~{\mathit{typeidx}}~{{\mathit{local}}^\ast}~{\mathit{expr}}))` -................................................................................................................... +:math:`{\mathrm{free}}_{\mathit{func}}(\mathsf{func}~{\mathit{typeidx}}~{{\mathit{local}}^\ast}~{\mathit{expr}})` +................................................................................................................. 1. Return `$free_typeidx(typeidx) ++ $free_list($free_local(local)*{local <- local*}) ++ update($free_block(expr).LOCALS, [])`. -:math:`{\mathrm{free}}_{\mathit{global}}((\mathsf{global}~{\mathit{globaltype}}~{\mathit{expr}}))` -.................................................................................................. +:math:`{\mathrm{free}}_{\mathit{global}}(\mathsf{global}~{\mathit{globaltype}}~{\mathit{expr}})` +................................................................................................ 1. Return `$free_globaltype(globaltype) ++ $free_expr(expr)`. -:math:`{\mathrm{free}}_{\mathit{table}}((\mathsf{table}~{\mathit{tabletype}}~{\mathit{expr}}))` -............................................................................................... +:math:`{\mathrm{free}}_{\mathit{table}}(\mathsf{table}~{\mathit{tabletype}}~{\mathit{expr}})` +............................................................................................. 1. Return `$free_tabletype(tabletype) ++ $free_expr(expr)`. -:math:`{\mathrm{free}}_{\mathit{mem}}((\mathsf{memory}~{\mathit{memtype}}))` -............................................................................ +:math:`{\mathrm{free}}_{\mathit{mem}}(\mathsf{memory}~{\mathit{memtype}})` +.......................................................................... 1. Return :math:`{\mathrm{free}}_{\mathit{memtype}}({\mathit{memtype}})`. -:math:`{\mathrm{free}}_{\mathit{tag}}((\mathsf{tag}~{\mathit{typeidx}}))` -......................................................................... +:math:`{\mathrm{free}}_{\mathit{tag}}(\mathsf{tag}~{\mathit{typeidx}})` +....................................................................... 1. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. @@ -21553,8 +21553,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. -:math:`{\mathrm{free}}_{\mathit{elem}}((\mathsf{elem}~{\mathit{reftype}}~{{\mathit{expr}}^\ast}~{\mathit{elemmode}}))` -...................................................................................................................... +:math:`{\mathrm{free}}_{\mathit{elem}}(\mathsf{elem}~{\mathit{reftype}}~{{\mathit{expr}}^\ast}~{\mathit{elemmode}})` +.................................................................................................................... 1. Return `$free_reftype(reftype) ++ $free_list($free_expr(expr)*{expr <- expr*}) ++ $free_elemmode(elemmode)`. @@ -21575,36 +21575,36 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. -:math:`{\mathrm{free}}_{\mathit{data}}((\mathsf{data}~{{\mathit{byte}}^\ast}~{\mathit{datamode}}))` -................................................................................................... +:math:`{\mathrm{free}}_{\mathit{data}}(\mathsf{data}~{{\mathit{byte}}^\ast}~{\mathit{datamode}})` +................................................................................................. 1. Return :math:`{\mathrm{free}}_{\mathit{datamode}}({\mathit{datamode}})`. -:math:`{\mathrm{free}}_{\mathit{start}}((\mathsf{start}~{\mathit{funcidx}}))` -............................................................................. +:math:`{\mathrm{free}}_{\mathit{start}}(\mathsf{start}~{\mathit{funcidx}})` +........................................................................... 1. Return :math:`{\mathrm{free}}_{\mathit{funcidx}}({\mathit{funcidx}})`. -:math:`{\mathrm{free}}_{\mathit{export}}((\mathsf{export}~{\mathit{name}}~{\mathit{externidx}}))` -................................................................................................. +:math:`{\mathrm{free}}_{\mathit{export}}(\mathsf{export}~{\mathit{name}}~{\mathit{externidx}})` +............................................................................................... 1. Return :math:`{\mathrm{free}}_{\mathit{externidx}}({\mathit{externidx}})`. -:math:`{\mathrm{free}}_{\mathit{import}}((\mathsf{import}~{\mathit{name}}_1~{\mathit{name}}_2~{\mathit{externtype}}))` -...................................................................................................................... +:math:`{\mathrm{free}}_{\mathit{import}}(\mathsf{import}~{\mathit{name}}_1~{\mathit{name}}_2~{\mathit{externtype}})` +.................................................................................................................... 1. Return :math:`{\mathrm{free}}_{\mathit{externtype}}({\mathit{externtype}})`. -:math:`{\mathrm{free}}_{\mathit{module}}((\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\ast}~{{\mathit{func}}^\ast}~{{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~{{\mathit{tag}}^\ast}~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast}~{{\mathit{start}}^?}~{{\mathit{export}}^\ast}))` -............................................................................................................................................................................................................................................................................................................................ +:math:`{\mathrm{free}}_{\mathit{module}}(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\ast}~{{\mathit{func}}^\ast}~{{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~{{\mathit{tag}}^\ast}~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast}~{{\mathit{start}}^?}~{{\mathit{export}}^\ast})` +.......................................................................................................................................................................................................................................................................................................................... 1. Return `$free_list($free_type(type)*{type <- type*}) ++ $free_list($free_import(import)*{import <- import*}) ++ $free_list($free_func(func)*{func <- func*}) ++ $free_list($free_global(global)*{global <- global*}) ++ $free_list($free_table(table)*{table <- table*}) ++ $free_list($free_mem(mem)*{mem <- mem*}) ++ $free_list($free_tag(tag)*{tag <- tag*}) ++ $free_list($free_elem(elem)*{elem <- elem*}) ++ $free_list($free_data(data)*{data <- data*}) ++ $free_opt($free_start(start)?{start <- start?}) ++ $free_list($free_export(export)*{export <- export*})`. @@ -21768,7 +21768,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i ...................................................................................................................................................... -1. Return :math:`{\mathrm{funcidx}}((\mathsf{module}~\epsilon~\epsilon~\epsilon~{{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~\epsilon~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast}~\epsilon~\epsilon))`. +1. Return :math:`{\mathrm{funcidx}}(\mathsf{module}~\epsilon~\epsilon~\epsilon~{{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~\epsilon~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast}~\epsilon~\epsilon)`. :math:`{{\mathrm{relaxed}}(i)}{{}[ X_1, X_2 ]}` @@ -21930,32 +21930,32 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{u}`, then: - a. Return :math:`i \mathbin{\mathrm{mod}} {2^{M}}`. + a. Return :math:`i \mathbin{\mathrm{mod}} ({2^{M}})`. #. Assert: Due to validation, :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{s}`. -#. Return :math:`{{{{\mathrm{signed}}}_{N}^{{-1}}}}{({{\mathrm{signed}}}_{M}(i \mathbin{\mathrm{mod}} {2^{M}}))}`. +#. Return :math:`{{{{\mathrm{signed}}}_{N}^{{-1}}}}{({{\mathrm{signed}}}_{M}(i \mathbin{\mathrm{mod}} ({2^{M}})))}`. :math:`{{\mathrm{iadd}}}_{N}(i_1, i_2)` ....................................... -1. Return :math:`i_1 + i_2 \mathbin{\mathrm{mod}} {2^{N}}`. +1. Return :math:`(i_1 + i_2) \mathbin{\mathrm{mod}} ({2^{N}})`. :math:`{{\mathrm{isub}}}_{N}(i_1, i_2)` ....................................... -1. Return :math:`{2^{N}} + i_1 - i_2 \mathbin{\mathrm{mod}} {2^{N}}`. +1. Return :math:`({2^{N}} + i_1 - i_2) \mathbin{\mathrm{mod}} ({2^{N}})`. :math:`{{\mathrm{imul}}}_{N}(i_1, i_2)` ....................................... -1. Return :math:`i_1 \cdot i_2 \mathbin{\mathrm{mod}} {2^{N}}`. +1. Return :math:`i_1 \cdot i_2 \mathbin{\mathrm{mod}} ({2^{N}})`. :math:`{{{{\mathrm{iadd\_sat}}}_{N}^{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}}}}{(i_1, i_2)}` @@ -23262,8 +23262,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{{{{\mathrm{lanes}}}_{{{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}^{{-1}}}}{({c^\ast})}`. -:math:`{({\mathsf{extadd\_pairwise}}{\mathsf{\_}}{{\mathit{sx}}})}{{}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}(v_1)}` -............................................................................................................................................................. +:math:`{{\mathsf{extadd\_pairwise}}{\mathsf{\_}}{{\mathit{sx}}}}{{}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}(v_1)}` +........................................................................................................................................................... 1. Return :math:`{{\mathrm{ivextunop}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}({\mathrm{ivadd}}_{{\mathit{pairwise}}}, {\mathit{sx}}, v_1)`. @@ -23344,7 +23344,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`{c'}` be :math:`{}{{}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{\mathsf{i}}{N}}{\mathsf{x}}{M}}(c_1, c_2)}`. -#. Let :math:`{c''}` be :math:`{({\mathsf{extadd\_pairwise}}{\mathsf{\_}}{\mathsf{s}})}{{}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}({c'})}`. +#. Let :math:`{c''}` be :math:`{{\mathsf{extadd\_pairwise}}{\mathsf{\_}}{\mathsf{s}}}{{}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}({c'})}`. #. Let :math:`c` be an element of :math:`{\mathsf{add}}{{}_{{{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}({c''}, c_3)}`. @@ -23869,9 +23869,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~i~..~j~])~\mathsf{page}),\; \mathsf{bytes}~{b^\ast} \}\end{array}` be :math:`{\mathit{meminst}}`. -#. If :math:`{|{b^\ast}|} / 64 \, {\mathrm{Ki}} + n \leq j`, then: +#. If :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n \leq j`, then: - a. Let :math:`{i'}` be :math:`{|{b^\ast}|} / 64 \, {\mathrm{Ki}} + n`. + a. Let :math:`{i'}` be :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n`. #. Let :math:`{\mathit{meminst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~{i'}~..~j~])~\mathsf{page}),\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. @@ -24040,8 +24040,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathit{ta}}~{{\mathit{ta}'}^\ast}`. -:math:`{\mathrm{allocmem}}(s, ({\mathit{at}}~({}[~i~..~j~])~\mathsf{page}))` -............................................................................ +:math:`{\mathrm{allocmem}}(s, {\mathit{at}}~({}[~i~..~j~])~\mathsf{page})` +.......................................................................... 1. Let :math:`{\mathit{meminst}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~i~..~j~])~\mathsf{page}),\; \mathsf{bytes}~{\mathtt{0x00}^{i \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. @@ -24172,8 +24172,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathit{da}}~{{\mathit{da}'}^\ast}`. -:math:`{\mathrm{allocexport}}({\mathit{moduleinst}}, (\mathsf{export}~{\mathit{name}}~{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}))` -.............................................................................................................................................. +:math:`{\mathrm{allocexport}}({\mathit{moduleinst}}, \mathsf{export}~{\mathit{name}}~{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}})` +............................................................................................................................................ 1. If :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`, then: @@ -24311,8 +24311,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathit{moduleinst}}`. -:math:`{{\mathrm{runelem}}}_{x}((\mathsf{elem}~{\mathit{rt}}~{e^{n}}~{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}))` -................................................................................................................................... +:math:`{{\mathrm{runelem}}}_{x}(\mathsf{elem}~{\mathit{rt}}~{e^{n}}~{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}})` +................................................................................................................................. 1. If :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{passive}`, then: @@ -24330,8 +24330,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{{\mathit{instr}}^\ast}~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n)~(\mathsf{table{.}init}~y~x)~(\mathsf{elem{.}drop}~x)`. -:math:`{{\mathrm{rundata}}}_{x}((\mathsf{data}~{b^{n}}~{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}))` -..................................................................................................................... +:math:`{{\mathrm{rundata}}}_{x}(\mathsf{data}~{b^{n}}~{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}})` +................................................................................................................... 1. If :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{passive}`, then: From 7d47bfe29b68795a642dee682fe7fbf9781e85a2 Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Tue, 7 Jan 2025 17:35:58 +0900 Subject: [PATCH 03/12] Change CaseE to TupleE only in state case --- spectec/src/backend-interpreter/construct.ml | 20 +- spectec/src/il2al/translate.ml | 6 +- spectec/test-prose/TEST.md | 542 +++++++++---------- 3 files changed, 285 insertions(+), 283 deletions(-) diff --git a/spectec/src/backend-interpreter/construct.ml b/spectec/src/backend-interpreter/construct.ml index 3100953fc8..103f9db187 100644 --- a/spectec/src/backend-interpreter/construct.ml +++ b/spectec/src/backend-interpreter/construct.ml @@ -114,7 +114,7 @@ let rec al_to_storage_type: value -> storage_type = function | v -> ValStorageT (al_to_val_type v) and al_to_field_type: value -> field_type = function - | TupV [ mut; st ] -> FieldT (al_to_mut mut, al_to_storage_type st) + | CaseV (_, [ mut; st ]) -> FieldT (al_to_mut mut, al_to_storage_type st) | v -> error_value "field type" v and al_to_result_type: value -> result_type = function @@ -210,11 +210,11 @@ let al_to_limits (default: int64): value -> limits = function let al_to_global_type: value -> global_type = function - | TupV [ mut; vt ] -> GlobalT (al_to_mut mut, al_to_val_type vt) + | TupV [ mut; vt ] | CaseV (_, [ mut; vt ]) -> GlobalT (al_to_mut mut, al_to_val_type vt) | v -> error_value "global type" v let al_to_table_type: value -> table_type = function - | TupV [ at; limits; rt ] -> TableT (al_to_addr_type at, al_to_limits default_table_max limits, al_to_ref_type rt) + | TupV [ at; limits; rt ] | CaseV (_, [ at; limits; rt ]) -> TableT (al_to_addr_type at, al_to_limits default_table_max limits, al_to_ref_type rt) | v -> error_value "table type" v let al_to_memory_type: value -> memory_type = function @@ -694,7 +694,7 @@ let al_to_memop (f: value -> 'p) : value list -> idx * (num_type, 'p) memop = fu | v -> error_values "memop" v let al_to_pack_size_extension: value -> Pack.pack_size * Pack.extension = function - | TupV [ p; ext ] -> al_to_pack_size p, al_to_extension ext + | CaseV (_, [ p; ext ]) -> al_to_pack_size p, al_to_extension ext | v -> error_value "pack size, extension" v let al_to_loadop: value list -> idx * loadop = al_to_opt al_to_pack_size_extension |> al_to_memop @@ -1249,7 +1249,7 @@ let rec al_of_storage_type = function | PackStorageT _ as st -> nullary (string_of_storage_type st) and al_of_field_type = function - | FieldT (mut, st) -> tupV [ al_of_mut mut; al_of_storage_type st ] + | FieldT (mut, st) -> CaseV ("", [ al_of_mut mut; al_of_storage_type st ]) and al_of_result_type rt = al_of_list al_of_val_type rt @@ -1318,13 +1318,13 @@ let al_of_limits default limits = CaseV ("[", [ al_of_nat64 limits.min; max ]) (* TODO: Something better tan this is needed *) let al_of_global_type = function - | GlobalT (mut, vt) -> tupV [ al_of_mut mut; al_of_val_type vt ] + | GlobalT (mut, vt) -> CaseV ("", [ al_of_mut mut; al_of_val_type vt ]) let al_of_table_type = function | TableT (at, limits, rt) -> match !version with - | 3 -> tupV [ al_of_addr_type at; al_of_limits default_table_max limits; al_of_ref_type rt ] - | _ -> tupV [ al_of_limits default_table_max limits; al_of_ref_type rt ] + | 3 -> CaseV ("", [ al_of_addr_type at; al_of_limits default_table_max limits; al_of_ref_type rt ]) + | _ -> CaseV ("", [ al_of_limits default_table_max limits; al_of_ref_type rt ]) let al_of_memory_type = function | MemoryT (at, limits) -> @@ -1876,7 +1876,7 @@ let al_of_memop f idx memop = in [ al_of_num_type memop.ty; f memop.pack ] @ al_of_memidx idx @ [ StrV str ] -let al_of_pack_size_extension (p, s) = tupV [ al_of_pack_size p; al_of_extension s ] +let al_of_pack_size_extension (p, s) = CaseV ("", [ al_of_pack_size p; al_of_extension s ]) let al_of_loadop = al_of_opt al_of_pack_size_extension |> al_of_memop @@ -2103,7 +2103,7 @@ let al_of_global global = let al_of_table table = match !version with - | 1 -> CaseV ("TABLE", [ al_of_table_type table.it.ttype |> arg_of_tup 0 ]) + | 1 -> CaseV ("TABLE", [ al_of_table_type table.it.ttype |> arg_of_case "" 0 ]) | 2 -> CaseV ("TABLE", [ al_of_table_type table.it.ttype ]) | 3 -> CaseV ("TABLE", [ al_of_table_type table.it.ttype; al_of_const table.it.tinit ]) | _ -> failwith "Unsupported version" diff --git a/spectec/src/il2al/translate.ml b/spectec/src/il2al/translate.ml index 963627b0eb..6d93b31116 100644 --- a/spectec/src/il2al/translate.ml +++ b/spectec/src/il2al/translate.ml @@ -263,8 +263,10 @@ and translate_exp exp = (* Singleton *) | [ []; [] ], [ e1 ] -> { (translate_exp e1) with note=note } - (* Tuple *) - | _ when List.for_all is_simple_separator op -> + (* State *) + | _ when List.for_all is_simple_separator op + && Il.Print.string_of_typ_name exp.note = "state" + -> tupE (List.map translate_exp exps) ~at ~note (* Normal Case *) | _ -> diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index 0268a19bc6..21d28d7aab 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -34,7 +34,7 @@ The function type :math:`{t_1^\ast}~\rightarrow~{t_2^?}` is valid. -The global type :math:`({\mathsf{mut}^?}, t)` is valid. +The global type :math:`({\mathsf{mut}^?}~t)` is valid. @@ -411,7 +411,7 @@ The instruction :math:`(\mathsf{global{.}get}~x)` is valid with the function typ * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathit{mut}}, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathit{mut}}~t)`. @@ -421,7 +421,7 @@ The instruction :math:`(\mathsf{global{.}set}~x)` is valid with the function typ * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}~t)`. @@ -467,7 +467,7 @@ The instruction :math:`({t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{loa * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M, {\mathit{sx}})`. + * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is equal to :math:`{\mathsf{i}}{n}`. @@ -531,7 +531,7 @@ The instruction :math:`({t{.}\mathsf{load}}{\epsilon}~{\mathit{memarg}})` is val -The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{(M, {\mathit{sx}})}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathsf{i}}{n}` if: +The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{M~{\mathit{sx}}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathsf{i}}{n}` if: * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. @@ -646,7 +646,7 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. @@ -661,7 +661,7 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. @@ -701,7 +701,7 @@ The global :math:`(\mathsf{global}~{\mathit{gt}}~{\mathit{expr}})` is valid with * The global type :math:`{\mathit{gt}}` is valid. - * The global type :math:`{\mathit{gt}}` is equal to :math:`({\mathit{mut}}, t)`. + * The global type :math:`{\mathit{gt}}` is equal to :math:`({\mathit{mut}}~t)`. * The expression :math:`{\mathit{expr}}` is valid with the number type :math:`t`. @@ -1388,7 +1388,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n, {\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: @@ -1400,7 +1400,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n, {\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. @@ -2910,7 +2910,7 @@ Functype_ok - the function type t_1* -> t_2? is valid. Globaltype_ok -- the global type (MUT?, t) is valid. +- the global type (MUT? t) is valid. Tabletype_ok - the table type limits is valid if: @@ -3106,12 +3106,12 @@ Instr_ok/local.tee Instr_ok/global.get - the instruction (GLOBAL.GET x) is valid with the function type [] -> [t] if: - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (mut, t). + - C.GLOBALS[x] is (mut t). Instr_ok/global.set - the instruction (GLOBAL.SET x) is valid with the function type [t] -> [] if: - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (?(MUT), t). + - C.GLOBALS[x] is (?(MUT) t). Instr_ok/memory.size - the instruction MEMORY.SIZE is valid with the function type [] -> [I32] if: @@ -3134,7 +3134,7 @@ Instr_ok/load - (2 ^ memarg.ALIGN) is less than or equal to ($size(t) / 8). - Or: - t_u1 is Inn. - - loadop__u1? is ?((M, sx)). + - loadop__u1? is ?((M sx)). - t_u3 is Inn. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -3167,7 +3167,7 @@ Instr_ok/load-val - (2 ^ memarg.ALIGN) is less than or equal to ($size(t) / 8). Instr_ok/load-pack -- the instruction (LOAD Inn ?((M, sx)) memarg) is valid with the function type [I32] -> [Inn] if: +- the instruction (LOAD Inn ?((M sx)) memarg) is valid with the function type [I32] -> [Inn] if: - the memory type C.MEMS[0] exists. - C.MEMS[0] is mt. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -3225,7 +3225,7 @@ Instr_const - Or: - instr_u1 is (GLOBAL.GET x). - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (?(), t). + - C.GLOBALS[x] is (?() t). Instr_const/const - the instruction (t.CONST c) is constant. @@ -3233,7 +3233,7 @@ Instr_const/const Instr_const/global.get - the instruction (GLOBAL.GET x) is constant if: - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (?(), t). + - C.GLOBALS[x] is (?() t). Expr_const - the expression instr* is constant if: @@ -3253,7 +3253,7 @@ Func_ok Global_ok - the global (GLOBAL gt expr) is valid with the global type gt if: - gt is valid. - - gt is (mut, t). + - gt is (mut t). - the expression expr is valid with the number type ?(t). - expr is constant. @@ -3585,13 +3585,13 @@ Step_read/load t_u1 loadop__u1? ao 5. If the type of t_u1 is Inn, then: a. If loadop__u1? is defined, then: 1) Let ?(loadop__0) be loadop__u1?. - 2) Let (n, sx) be loadop__0. + 2) Let (n sx) be loadop__0. 3) If (((i + ao.OFFSET) + (n / 8)) > |$mem(z, 0).BYTES|), then: a) Trap. b. Let Inn be t_u1. c. If loadop__u1? is defined, then: 1) Let ?(loadop__0) be loadop__u1?. - 2) Let (n, sx) be loadop__0. + 2) Let (n sx) be loadop__0. 3) Let c be $ibytes__1^-1(n, $mem(z, 0).BYTES[(i + ao.OFFSET) : (n / 8)]). 4) Push the value (Inn.CONST $extend__(n, $size(Inn), sx, c)) to the stack. @@ -4326,12 +4326,12 @@ The function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. -The global type :math:`({\mathsf{mut}^?}, t)` is valid. +The global type :math:`({\mathsf{mut}^?}~t)` is valid. -The table type :math:`({\mathit{limits}}, {\mathit{reftype}})` is valid if: +The table type :math:`({\mathit{limits}}~{\mathit{reftype}})` is valid if: * The limits :math:`{\mathit{limits}}` is valid with :math:`{2^{32}} - 1`. @@ -4463,7 +4463,7 @@ The global type :math:`{\mathit{gt}}` matches itself. -The table type :math:`({\mathit{lim}}_1, {\mathit{rt}})` matches the table type :math:`({\mathit{lim}}_2, {\mathit{rt}})` if: +The table type :math:`({\mathit{lim}}_1~{\mathit{rt}})` matches the table type :math:`({\mathit{lim}}_2~{\mathit{rt}})` if: * The limits :math:`{\mathit{lim}}_1` matches the limits :math:`{\mathit{lim}}_2`. @@ -4712,7 +4712,7 @@ The instruction :math:`(\mathsf{call\_indirect}~x~y)` is valid with the function * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}, \mathsf{funcref})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~\mathsf{funcref})`. * The function type :math:`C{.}\mathsf{types}{}[y]` exists. @@ -4943,7 +4943,7 @@ The instruction :math:`(\mathsf{global{.}get}~x)` is valid with the function typ * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathit{mut}}, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathit{mut}}~t)`. @@ -4953,7 +4953,7 @@ The instruction :math:`(\mathsf{global{.}set}~x)` is valid with the function typ * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}~t)`. @@ -4963,7 +4963,7 @@ The instruction :math:`(\mathsf{table{.}get}~x)` is valid with the function type * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. @@ -4973,7 +4973,7 @@ The instruction :math:`(\mathsf{table{.}set}~x)` is valid with the function type * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. @@ -4983,7 +4983,7 @@ The instruction :math:`(\mathsf{table{.}size}~x)` is valid with the function typ * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. @@ -4993,7 +4993,7 @@ The instruction :math:`(\mathsf{table{.}grow}~x)` is valid with the function typ * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. @@ -5003,7 +5003,7 @@ The instruction :math:`(\mathsf{table{.}fill}~x)` is valid with the function typ * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. @@ -5013,11 +5013,11 @@ The instruction :math:`(\mathsf{table{.}copy}~x_1~x_2)` is valid with the functi * The table type :math:`C{.}\mathsf{tables}{}[x_1]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{lim}}_1, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{lim}}_1~{\mathit{rt}})`. * The table type :math:`C{.}\mathsf{tables}{}[x_2]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x_2]` is equal to :math:`({\mathit{lim}}_2, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x_2]` is equal to :math:`({\mathit{lim}}_2~{\mathit{rt}})`. @@ -5027,7 +5027,7 @@ The instruction :math:`(\mathsf{table{.}init}~x_1~x_2)` is valid with the functi * The table type :math:`C{.}\mathsf{tables}{}[x_1]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. * The element type :math:`C{.}\mathsf{elems}{}[x_2]` exists. @@ -5131,7 +5131,7 @@ The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{. * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M, {\mathit{sx}})`. + * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. @@ -5277,7 +5277,7 @@ The instruction :math:`({{\mathit{nt}}{.}\mathsf{load}}{\epsilon}~{\mathit{memar -The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{(M, {\mathit{sx}})}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathsf{i}}{n}` if: +The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{M~{\mathit{sx}}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathsf{i}}{n}` if: * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. @@ -5462,7 +5462,7 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. @@ -5492,7 +5492,7 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. @@ -5532,7 +5532,7 @@ The global :math:`(\mathsf{global}~{\mathit{gt}}~{\mathit{expr}})` is valid with * The global type :math:`{\mathit{gt}}` is valid. - * The global type :math:`{\mathit{gt}}` is equal to :math:`({\mathit{mut}}, t)`. + * The global type :math:`{\mathit{gt}}` is equal to :math:`({\mathit{mut}}~t)`. * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`t`. @@ -5566,7 +5566,7 @@ The memory :math:`(\mathsf{memory}~{\mathit{mt}})` is valid with the memory type * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. @@ -5587,7 +5587,7 @@ The memory :math:`(\mathsf{memory}~{\mathit{mt}})` is valid with the memory type * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. @@ -6931,7 +6931,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n, {\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: @@ -6943,7 +6943,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n, {\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. @@ -7150,7 +7150,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{(8, \mathsf{u})})`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}})`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. @@ -7164,7 +7164,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + n - 1)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{(8, \mathsf{u})})`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}})`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. @@ -9389,13 +9389,13 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as ................................................. -1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~i~..~j~]), {\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast} \}\end{array}` be :math:`{\mathit{ti}}`. +1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~i~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast} \}\end{array}` be :math:`{\mathit{ti}}`. #. Let :math:`{i'}` be :math:`{|{{r'}^\ast}|} + n`. #. If :math:`{i'} \leq j`, then: - a. Let :math:`{\mathit{ti}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~{i'}~..~j~]), {\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. + a. Let :math:`{\mathit{ti}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~{i'}~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. #. Return :math:`{\mathit{ti}'}`. @@ -9596,11 +9596,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. -:math:`{\mathrm{alloctable}}(s, (({}[~i~..~j~]), {\mathit{rt}}))` -................................................................. +:math:`{\mathrm{alloctable}}(s, ({}[~i~..~j~])~{\mathit{rt}})` +.............................................................. -1. Let :math:`{\mathit{ti}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~i~..~j~]), {\mathit{rt}}),\; \mathsf{refs}~{(\mathsf{ref{.}null}~{\mathit{rt}})^{i}} \}\end{array}`. +1. Let :math:`{\mathit{ti}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~i~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{(\mathsf{ref{.}null}~{\mathit{rt}})^{i}} \}\end{array}`. #. Let :math:`a` be :math:`{|s{.}\mathsf{tables}|}`. @@ -10003,10 +10003,10 @@ Functype_ok - the function type t_1* -> t_2* is valid. Globaltype_ok -- the global type (MUT?, t) is valid. +- the global type (MUT? t) is valid. Tabletype_ok -- the table type (limits, reftype) is valid if: +- the table type (limits reftype) is valid if: - the limits limits is valid with ((2 ^ 32) - 1). Memtype_ok @@ -10075,7 +10075,7 @@ Globaltype_sub - the global type gt matches itself. Tabletype_sub -- the table type (lim_1, rt) matches the table type (lim_2, rt) if: +- the table type (lim_1 rt) matches the table type (lim_2 rt) if: - the limits lim_1 matches the limits lim_2. Memtype_sub @@ -10202,7 +10202,7 @@ Instr_ok/call Instr_ok/call_indirect - the instruction (CALL_INDIRECT x y) is valid with the function type t_1* :: [I32] -> t_2* if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (lim, FUNCREF). + - C.TABLES[x] is (lim FUNCREF). - the function type C.TYPES[y] exists. - C.TYPES[y] is t_1* -> t_2*. @@ -10329,49 +10329,49 @@ Instr_ok/local.tee Instr_ok/global.get - the instruction (GLOBAL.GET x) is valid with the function type [] -> [t] if: - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (mut, t). + - C.GLOBALS[x] is (mut t). Instr_ok/global.set - the instruction (GLOBAL.SET x) is valid with the function type [t] -> [] if: - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (?(MUT), t). + - C.GLOBALS[x] is (?(MUT) t). Instr_ok/table.get - the instruction (TABLE.GET x) is valid with the function type [I32] -> [rt] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (lim, rt). + - C.TABLES[x] is (lim rt). Instr_ok/table.set - the instruction (TABLE.SET x) is valid with the function type [I32, rt] -> [] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (lim, rt). + - C.TABLES[x] is (lim rt). Instr_ok/table.size - the instruction (TABLE.SIZE x) is valid with the function type [] -> [I32] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (lim, rt). + - C.TABLES[x] is (lim rt). Instr_ok/table.grow - the instruction (TABLE.GROW x) is valid with the function type [rt, I32] -> [I32] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (lim, rt). + - C.TABLES[x] is (lim rt). Instr_ok/table.fill - the instruction (TABLE.FILL x) is valid with the function type [I32, rt, I32] -> [] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (lim, rt). + - C.TABLES[x] is (lim rt). Instr_ok/table.copy - the instruction (TABLE.COPY x_1 x_2) is valid with the function type [I32, I32, I32] -> [] if: - the table type C.TABLES[x_1] exists. - - C.TABLES[x_1] is (lim_1, rt). + - C.TABLES[x_1] is (lim_1 rt). - the table type C.TABLES[x_2] exists. - - C.TABLES[x_2] is (lim_2, rt). + - C.TABLES[x_2] is (lim_2 rt). Instr_ok/table.init - the instruction (TABLE.INIT x_1 x_2) is valid with the function type [I32, I32, I32] -> [] if: - the table type C.TABLES[x_1] exists. - - C.TABLES[x_1] is (lim, rt). + - C.TABLES[x_1] is (lim rt). - the element type C.ELEMS[x_2] exists. - C.ELEMS[x_2] is rt. @@ -10423,7 +10423,7 @@ Instr_ok/load - (2 ^ memarg.ALIGN) is less than or equal to ($size(nt) / 8). - Or: - nt_u1 is Inn. - - loadop__u1? is ?((M, sx)). + - loadop__u1? is ?((M sx)). - t_u1 is Inn. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -10498,7 +10498,7 @@ Instr_ok/load-val - (2 ^ memarg.ALIGN) is less than or equal to ($size(nt) / 8). Instr_ok/load-pack -- the instruction (LOAD Inn ?((M, sx)) memarg) is valid with the function type [I32] -> [Inn] if: +- the instruction (LOAD Inn ?((M sx)) memarg) is valid with the function type [I32] -> [Inn] if: - the memory type C.MEMS[0] exists. - C.MEMS[0] is mt. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -10593,7 +10593,7 @@ Instr_const - Or: - in_u1 is (GLOBAL.GET x). - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (?(), t). + - C.GLOBALS[x] is (?() t). Instr_const/const - the instruction (nt.CONST c) is constant. @@ -10610,7 +10610,7 @@ Instr_const/ref.func Instr_const/global.get - the instruction (GLOBAL.GET x) is constant if: - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (?(), t). + - C.GLOBALS[x] is (?() t). Expr_const - the expression instr* is constant if: @@ -10630,7 +10630,7 @@ Func_ok Global_ok - the global (GLOBAL gt expr) is valid with the global type gt if: - gt is valid. - - gt is (mut, t). + - gt is (mut t). - the expression expr is valid with the value type t. - expr is constant. @@ -10647,7 +10647,7 @@ Elemmode_ok - Either: - elemmode_u1 is (ACTIVE x expr). - the table type C.TABLES[x] exists. - - C.TABLES[x] is (lim, rt). + - C.TABLES[x] is (lim rt). - the expression expr is valid with the value type I32. - expr is constant. - Or: @@ -10658,7 +10658,7 @@ Elemmode_ok Elemmode_ok/active - (ACTIVE x expr) is valid with the reference type rt if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (lim, rt). + - C.TABLES[x] is (lim rt). - the expression expr is valid with the value type I32. - expr is constant. @@ -11307,13 +11307,13 @@ Step_read/load nt_u1 loadop__u1? ao 5. If the type of nt_u1 is Inn, then: a. If loadop__u1? is defined, then: 1) Let ?(loadop__0) be loadop__u1?. - 2) Let (n, sx) be loadop__0. + 2) Let (n sx) be loadop__0. 3) If (((i + ao.OFFSET) + (n / 8)) > |$mem(z, 0).BYTES|), then: a) Trap. b. Let Inn be nt_u1. c. If loadop__u1? is defined, then: 1) Let ?(loadop__0) be loadop__u1?. - 2) Let (n, sx) be loadop__0. + 2) Let (n sx) be loadop__0. 3) Let c be $ibytes__1^-1(n, $mem(z, 0).BYTES[(i + ao.OFFSET) : (n / 8)]). 4) Push the value (Inn.CONST $extend__(n, $size(Inn), sx, c)) to the stack. @@ -11414,14 +11414,14 @@ Step_read/memory.copy a. If (j <= i), then: 1) Push the value (I32.CONST j) to the stack. 2) Push the value (I32.CONST i) to the stack. - 3) Execute the instruction (LOAD I32 ?((8, U)) $memarg0()). + 3) Execute the instruction (LOAD I32 ?((8 U)) $memarg0()). 4) Execute the instruction (STORE I32 ?(8) $memarg0()). 5) Push the value (I32.CONST (j + 1)) to the stack. 6) Push the value (I32.CONST (i + 1)) to the stack. b. Else: 1) Push the value (I32.CONST ((j + n) - 1)) to the stack. 2) Push the value (I32.CONST ((i + n) - 1)) to the stack. - 3) Execute the instruction (LOAD I32 ?((8, U)) $memarg0()). + 3) Execute the instruction (LOAD I32 ?((8 U)) $memarg0()). 4) Execute the instruction (STORE I32 ?(8) $memarg0()). 5) Push the value (I32.CONST j) to the stack. 6) Push the value (I32.CONST i) to the stack. @@ -12479,10 +12479,10 @@ with_data z x b* 2. Replace s.DATAS[f.MODULE.DATAS[x]].BYTES with b*. growtable ti n r -1. Let { TYPE: (([ i .. j ]), rt); REFS: r'*; } be ti. +1. Let { TYPE: (([ i .. j ]) rt); REFS: r'*; } be ti. 2. Let i' be (|r'*| + n). 3. If (i' <= j), then: - a. Let ti' be { TYPE: (([ i' .. j ]), rt); REFS: r'* :: r^n; }. + a. Let ti' be { TYPE: (([ i' .. j ]) rt); REFS: r'* :: r^n; }. b. Return ti'. growmemory mi n @@ -12578,8 +12578,8 @@ allocglobals s gt_u1* v_u1* e. Let ga'* be $allocglobals(s, globaltype'*, val'*). f. Return [ga] :: ga'*. -alloctable s (([ i .. j ]), rt) -1. Let ti be { TYPE: (([ i .. j ]), rt); REFS: (REF.NULL rt)^i; }. +alloctable s (([ i .. j ]) rt) +1. Let ti be { TYPE: (([ i .. j ]) rt); REFS: (REF.NULL rt)^i; }. 2. Let a be |s.TABLES|. 3. Append ti to the s.TABLES. 4. Return a. @@ -12972,7 +12972,7 @@ The storage type :math:`{\mathit{packtype}}` is valid if: -The field type :math:`({\mathsf{mut}^?}, {\mathit{storagetype}})` is valid if: +The field type :math:`({\mathsf{mut}^?}~{\mathit{storagetype}})` is valid if: * The storage type :math:`{\mathit{storagetype}}` is valid. @@ -13488,7 +13488,7 @@ The storage type :math:`{\mathit{packtype}}_1` matches the storage type :math:`{ -The field type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}, {\mathit{zt}}_1)` matches the field type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}, {\mathit{zt}}_2)` if: +The field type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~{\mathit{zt}}_1)` matches the field type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}~{\mathit{zt}}_2)` if: * The storage type :math:`{\mathit{zt}}_1` matches the storage type :math:`{\mathit{zt}}_2`. @@ -13510,7 +13510,7 @@ The field type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}} -The field type :math:`(\epsilon, {\mathit{zt}}_1)` matches the field type :math:`(\epsilon, {\mathit{zt}}_2)` if: +The field type :math:`(\epsilon~{\mathit{zt}}_1)` matches the field type :math:`(\epsilon~{\mathit{zt}}_2)` if: * The storage type :math:`{\mathit{zt}}_1` matches the storage type :math:`{\mathit{zt}}_2`. @@ -13518,7 +13518,7 @@ The field type :math:`(\epsilon, {\mathit{zt}}_1)` matches the field type :math: -The field type :math:`(\mathsf{mut}, {\mathit{zt}}_1)` matches the field type :math:`(\mathsf{mut}, {\mathit{zt}}_2)` if: +The field type :math:`(\mathsf{mut}~{\mathit{zt}}_1)` matches the field type :math:`(\mathsf{mut}~{\mathit{zt}}_2)` if: * The storage type :math:`{\mathit{zt}}_1` matches the storage type :math:`{\mathit{zt}}_2`. @@ -13772,7 +13772,7 @@ The limits :math:`({}[~n~..~m~])` is valid with :math:`k` if: -The global type :math:`({\mathsf{mut}^?}, t)` is valid if: +The global type :math:`({\mathsf{mut}^?}~t)` is valid if: * The value type :math:`t` is valid. @@ -13780,7 +13780,7 @@ The global type :math:`({\mathsf{mut}^?}, t)` is valid if: -The table type :math:`({\mathit{addrtype}}, {\mathit{limits}}, {\mathit{reftype}})` is valid if: +The table type :math:`({\mathit{addrtype}}~{\mathit{limits}}~{\mathit{reftype}})` is valid if: * The limits :math:`{\mathit{limits}}` is valid with :math:`{2^{32}} - 1`. @@ -13902,7 +13902,7 @@ The instruction type :math:`{t_{11}^\ast}~{\rightarrow}_{{x_1^\ast}}\,{t_{12}^\a * For all :math:`t` in :math:`{t^\ast}` and :math:`x` in :math:`{x^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`(\mathsf{set}, t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`(\mathsf{set}~t)`. @@ -13917,7 +13917,7 @@ The limits :math:`({}[~n_1~..~m_1~])` matches the limits :math:`({}[~n_2~..~m_2~ -The global type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}, {\mathit{valtype}}_1)` matches the global type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}, {\mathit{valtype}}_2)` if: +The global type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~{\mathit{valtype}}_1)` matches the global type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}~{\mathit{valtype}}_2)` if: * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. @@ -13939,7 +13939,7 @@ The global type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1} -The global type :math:`(\epsilon, {\mathit{valtype}}_1)` matches the global type :math:`(\epsilon, {\mathit{valtype}}_2)` if: +The global type :math:`(\epsilon~{\mathit{valtype}}_1)` matches the global type :math:`(\epsilon~{\mathit{valtype}}_2)` if: * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. @@ -13947,7 +13947,7 @@ The global type :math:`(\epsilon, {\mathit{valtype}}_1)` matches the global type -The global type :math:`(\mathsf{mut}, {\mathit{valtype}}_1)` matches the global type :math:`(\mathsf{mut}, {\mathit{valtype}}_2)` if: +The global type :math:`(\mathsf{mut}~{\mathit{valtype}}_1)` matches the global type :math:`(\mathsf{mut}~{\mathit{valtype}}_2)` if: * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. @@ -13957,7 +13957,7 @@ The global type :math:`(\mathsf{mut}, {\mathit{valtype}}_1)` matches the global -The table type :math:`({\mathit{addrtype}}, {\mathit{limits}}_1, {\mathit{reftype}}_1)` matches the table type :math:`({\mathit{addrtype}}, {\mathit{limits}}_2, {\mathit{reftype}}_2)` if: +The table type :math:`({\mathit{addrtype}}~{\mathit{limits}}_1~{\mathit{reftype}}_1)` matches the table type :math:`({\mathit{addrtype}}~{\mathit{limits}}_2~{\mathit{reftype}}_2)` if: * The limits :math:`{\mathit{limits}}_1` matches the limits :math:`{\mathit{limits}}_2`. @@ -14420,7 +14420,7 @@ The instruction :math:`(\mathsf{call\_indirect}~x~y)` is valid with the instruct * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. * The reference type :math:`{\mathit{rt}}` matches the reference type :math:`(\mathsf{ref}~\mathsf{null}~\mathsf{func})`. @@ -14478,7 +14478,7 @@ The instruction :math:`(\mathsf{return\_call\_indirect}~x~y)` is valid with the * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. * The reference type :math:`{\mathit{rt}}` matches the reference type :math:`(\mathsf{ref}~\mathsf{null}~\mathsf{func})`. @@ -14643,7 +14643,7 @@ The instruction :math:`(\mathsf{struct{.}new}~x)` is valid with the instruction * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{({\mathsf{mut}^?}, {\mathit{zt}})^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{({\mathsf{mut}^?}~{\mathit{zt}})^\ast})`. * Let :math:`{t^\ast}` be the value type sequence :math:`{{\mathrm{unpack}}({\mathit{zt}})^\ast}`. @@ -14655,7 +14655,7 @@ The instruction :math:`(\mathsf{struct{.}new\_default}~x)` is valid with the ins * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{({\mathsf{mut}^?}, {\mathit{zt}})^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{({\mathsf{mut}^?}~{\mathit{zt}})^\ast})`. * For all :math:`{\mathit{zt}}` in :math:`{{\mathit{zt}}^\ast}`: @@ -14673,7 +14673,7 @@ The instruction :math:`({\mathsf{struct{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~ * :math:`{|{{\mathit{yt}}^\ast}|}` is greater than :math:`i`. - * The field type :math:`{{\mathit{yt}}^\ast}{}[i]` is equal to :math:`({\mathsf{mut}^?}, {\mathit{zt}})`. + * The field type :math:`{{\mathit{yt}}^\ast}{}[i]` is equal to :math:`({\mathsf{mut}^?}~{\mathit{zt}})`. * The signedness :math:`{{\mathit{sx}}^?}` is absent if and only if the storage type :math:`{\mathit{zt}}` is equal to :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14691,7 +14691,7 @@ The instruction :math:`(\mathsf{struct{.}set}~x~i)` is valid with the instructio * :math:`{|{{\mathit{yt}}^\ast}|}` is greater than :math:`i`. - * The field type :math:`{{\mathit{yt}}^\ast}{}[i]` is equal to :math:`(\mathsf{mut}, {\mathit{zt}})`. + * The field type :math:`{{\mathit{yt}}^\ast}{}[i]` is equal to :math:`(\mathsf{mut}~{\mathit{zt}})`. * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14703,7 +14703,7 @@ The instruction :math:`(\mathsf{array{.}new}~x)` is valid with the instruction t * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}, {\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14715,7 +14715,7 @@ The instruction :math:`(\mathsf{array{.}new\_default}~x)` is valid with the inst * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}, {\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. * A :ref:`default value <default-val>` for value type the value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is defined. @@ -14727,7 +14727,7 @@ The instruction :math:`(\mathsf{array{.}new\_fixed}~x~n)` is valid with the inst * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}, {\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14739,7 +14739,7 @@ The instruction :math:`(\mathsf{array{.}new\_elem}~x~y)` is valid with the instr * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}, {\mathit{rt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{rt}}))`. * The element type :math:`C{.}\mathsf{elems}{}[y]` exists. @@ -14753,7 +14753,7 @@ The instruction :math:`(\mathsf{array{.}new\_data}~x~y)` is valid with the instr * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}, {\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. * The value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{numtype}}` or :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{vectype}}`. @@ -14769,7 +14769,7 @@ The instruction :math:`({\mathsf{array{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~x * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}, {\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. * The signedness :math:`{{\mathit{sx}}^?}` is absent if and only if the storage type :math:`{\mathit{zt}}` is equal to :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14783,7 +14783,7 @@ The instruction :math:`(\mathsf{array{.}set}~x)` is valid with the instruction t * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}, {\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14800,7 +14800,7 @@ The instruction :math:`(\mathsf{array{.}fill}~x)` is valid with the instruction * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}, {\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14812,11 +14812,11 @@ The instruction :math:`(\mathsf{array{.}copy}~x_1~x_2)` is valid with the instru * The defined type :math:`C{.}\mathsf{types}{}[x_1]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x_1]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}, {\mathit{zt}}_1))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x_1]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}_1))`. * The defined type :math:`C{.}\mathsf{types}{}[x_2]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x_2]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}, {\mathit{zt}}_2))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x_2]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}_2))`. * The storage type :math:`{\mathit{zt}}_2` matches the storage type :math:`{\mathit{zt}}_1`. @@ -14828,7 +14828,7 @@ The instruction :math:`(\mathsf{array{.}init\_elem}~x~y)` is valid with the inst * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}, {\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. * The element type :math:`C{.}\mathsf{elems}{}[y]` exists. @@ -14842,7 +14842,7 @@ The instruction :math:`(\mathsf{array{.}init\_data}~x~y)` is valid with the inst * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}, {\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. * The value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{numtype}}` or :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{vectype}}`. @@ -15002,7 +15002,7 @@ The instruction :math:`(\mathsf{local{.}get}~x)` is valid with the instruction t * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`(\mathsf{set}, t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`(\mathsf{set}~t)`. @@ -15012,7 +15012,7 @@ The instruction :math:`(\mathsf{local{.}set}~x)` is valid with the instruction t * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`({\mathit{init}}, t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`({\mathit{init}}~t)`. @@ -15022,7 +15022,7 @@ The instruction :math:`(\mathsf{local{.}tee}~x)` is valid with the instruction t * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`({\mathit{init}}, t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`({\mathit{init}}~t)`. @@ -15032,7 +15032,7 @@ The instruction :math:`(\mathsf{global{.}get}~x)` is valid with the instruction * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}~t)`. @@ -15042,7 +15042,7 @@ The instruction :math:`(\mathsf{global{.}set}~x)` is valid with the instruction * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}~t)`. @@ -15052,7 +15052,7 @@ The instruction :math:`(\mathsf{table{.}get}~x)` is valid with the instruction t * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. @@ -15062,7 +15062,7 @@ The instruction :math:`(\mathsf{table{.}set}~x)` is valid with the instruction t * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. @@ -15072,7 +15072,7 @@ The instruction :math:`(\mathsf{table{.}size}~x)` is valid with the instruction * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. @@ -15082,7 +15082,7 @@ The instruction :math:`(\mathsf{table{.}grow}~x)` is valid with the instruction * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. @@ -15092,7 +15092,7 @@ The instruction :math:`(\mathsf{table{.}fill}~x)` is valid with the instruction * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. @@ -15102,11 +15102,11 @@ The instruction :math:`(\mathsf{table{.}copy}~x_1~x_2)` is valid with the instru * The table type :math:`C{.}\mathsf{tables}{}[x_1]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{at}}_1, {\mathit{lim}}_1, {\mathit{rt}}_1)`. + * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{at}}_1~{\mathit{lim}}_1~{\mathit{rt}}_1)`. * The table type :math:`C{.}\mathsf{tables}{}[x_2]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x_2]` is equal to :math:`({\mathit{at}}_2, {\mathit{lim}}_2, {\mathit{rt}}_2)`. + * The table type :math:`C{.}\mathsf{tables}{}[x_2]` is equal to :math:`({\mathit{at}}_2~{\mathit{lim}}_2~{\mathit{rt}}_2)`. * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}_1`. @@ -15120,7 +15120,7 @@ The instruction :math:`(\mathsf{table{.}init}~x~y)` is valid with the instructio * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}}_1)`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}}_1)`. * The element type :math:`C{.}\mathsf{elems}{}[y]` exists. @@ -15232,7 +15232,7 @@ The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{. * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. - * :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M, {\mathit{sx}})`. + * :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. @@ -15375,7 +15375,7 @@ The instruction :math:`({{\mathit{nt}}{.}\mathsf{load}}{\epsilon}~x~{\mathit{mem -The instruction :math:`({{\mathsf{i}}{N}{.}\mathsf{load}}{(M, {\mathit{sx}})}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~{\mathsf{i}}{N}` if: +The instruction :math:`({{\mathsf{i}}{N}{.}\mathsf{load}}{M~{\mathit{sx}}}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~{\mathsf{i}}{N}` if: * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. @@ -15486,9 +15486,9 @@ The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scripts * For all :math:`{\mathit{init}}` in :math:`{{\mathit{init}}^\ast}` and :math:`t` in :math:`{t^\ast}` and :math:`x_1` in :math:`{x_1^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x_1]` is equal to :math:`({\mathit{init}}, t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x_1]` is equal to :math:`({\mathit{init}}~t)`. - * Under the context :math:`C{}[{.}\mathsf{local}{}[{x_1^\ast}] = {(\mathsf{set}, t)^\ast}]`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_2^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_3^\ast}`. + * Under the context :math:`C{}[{.}\mathsf{local}{}[{x_1^\ast}] = {(\mathsf{set}~t)^\ast}]`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_2^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_3^\ast}`. * Or: * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. @@ -15533,9 +15533,9 @@ The instruction sequence :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}` is * For all :math:`{\mathit{init}}` in :math:`{{\mathit{init}}^\ast}` and :math:`t` in :math:`{t^\ast}` and :math:`x_1` in :math:`{x_1^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x_1]` is equal to :math:`({\mathit{init}}, t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x_1]` is equal to :math:`({\mathit{init}}~t)`. - * Under the context :math:`C{}[{.}\mathsf{local}{}[{x_1^\ast}] = {(\mathsf{set}, t)^\ast}]`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_2^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_3^\ast}`. + * Under the context :math:`C{}[{.}\mathsf{local}{}[{x_1^\ast}] = {(\mathsf{set}~t)^\ast}]`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_2^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_3^\ast}`. @@ -15616,7 +15616,7 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. * Or: * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathsf{i}}{N} {.} {\mathit{binop}})`. @@ -15693,7 +15693,7 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. @@ -15732,7 +15732,7 @@ The type definition :math:`(\mathsf{type}~{\mathit{rectype}})` is valid with the -The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`({\mathit{init}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}, t)` if: +The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`({\mathit{init}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~t)` if: * Either: @@ -15750,7 +15750,7 @@ The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`({\math -The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`(\mathsf{set}, t)` if: +The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`(\mathsf{set}~t)` if: * A :ref:`default value <default-val>` for value type the value type :math:`t` is defined. @@ -15758,7 +15758,7 @@ The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`(\maths -The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`(\mathsf{unset}, t)` if: +The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`(\mathsf{unset}~t)` if: * A :ref:`default value <default-val>` for value type the value type :math:`t` is not defined. @@ -15779,7 +15779,7 @@ The function :math:`(\mathsf{func}~x~{{\mathit{local}}^\ast}~{\mathit{expr}})` i * The local :math:`{\mathit{local}}` is valid with the local type :math:`{{\mathit{lt}}}`. - * Under the context :math:`C{}[{.}\mathsf{locals} \mathrel{{=}{\oplus}} {(\mathsf{set}, t_1)^\ast}~{{{\mathit{lt}}}^\ast}]{}[{.}\mathsf{labels} \mathrel{{=}{\oplus}} {t_2^\ast}]{}[{.}\mathsf{return} \mathrel{{=}{\oplus}} {t_2^\ast}]`, the expression :math:`{\mathit{expr}}` is valid with the result type :math:`{t_2^\ast}`. + * Under the context :math:`C{}[{.}\mathsf{locals} \mathrel{{=}{\oplus}} {(\mathsf{set}~t_1)^\ast}~{{{\mathit{lt}}}^\ast}]{}[{.}\mathsf{labels} \mathrel{{=}{\oplus}} {t_2^\ast}]{}[{.}\mathsf{return} \mathrel{{=}{\oplus}} {t_2^\ast}]`, the expression :math:`{\mathit{expr}}` is valid with the result type :math:`{t_2^\ast}`. @@ -15789,7 +15789,7 @@ The global :math:`(\mathsf{global}~{\mathit{globaltype}}~{\mathit{expr}})` is va * The global type :math:`{\mathit{gt}}` is valid. - * The global type :math:`{\mathit{globaltype}}` is equal to :math:`({\mathsf{mut}^?}, t)`. + * The global type :math:`{\mathit{globaltype}}` is equal to :math:`({\mathsf{mut}^?}~t)`. * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`t`. @@ -15803,7 +15803,7 @@ The table :math:`(\mathsf{table}~{\mathit{tabletype}}~{\mathit{expr}})` is valid * The table type :math:`{\mathit{tt}}` is valid. - * The table type :math:`{\mathit{tabletype}}` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}})`. + * The table type :math:`{\mathit{tabletype}}` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`{\mathit{rt}}`. @@ -15839,7 +15839,7 @@ The element mode :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1 * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}'})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}'})`. * The element type :math:`{\mathit{rt}}` matches the reference type :math:`{\mathit{rt}'}`. @@ -15862,7 +15862,7 @@ The element mode :math:`(\mathsf{active}~x~{\mathit{expr}})` is valid with the e * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}'})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}'})`. * The element type :math:`{\mathit{rt}}` matches the reference type :math:`{\mathit{rt}'}`. @@ -16226,7 +16226,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as * The context :math:`{C'}` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{dt}'}^\ast},\; \mathsf{recs}~\epsilon,\; \mathsf{funcs}~{{\mathit{dt}}_{\mathsf{i}}^\ast}~{{\mathit{dt}}^\ast},\; \mathsf{globals}~{{\mathit{gt}}_{\mathsf{i}}^\ast},\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{tags}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon,\; \mathsf{refs}~{x^\ast} \}\end{array}`. - * The function index sequence :math:`{x^\ast}` is equal to :math:`{\mathrm{funcidx}}(({{\mathit{global}}^\ast}, {{\mathit{table}}^\ast}, {{\mathit{mem}}^\ast}, {{\mathit{elem}}^\ast}, {{\mathit{data}}^\ast}))`. + * The function index sequence :math:`{x^\ast}` is equal to :math:`{\mathrm{funcidx}}({{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast})`. * The defined type sequence :math:`{{\mathit{dt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{funcs}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. @@ -16264,7 +16264,7 @@ The instruction sequence :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptst * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}~t)`. * Or: * The instruction sequence :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{instr}}^\ast})`. @@ -16292,7 +16292,7 @@ The instruction sequence :math:`(\mathsf{global{.}get}~x)` is valid with the fun * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}, t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}~t)`. @@ -17752,7 +17752,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`(\mathsf{struct}~{\mathit{structtype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. -#. Let :math:`{({\mathsf{mut}^?}, {\mathit{zt}})^\ast}` be :math:`{\mathit{structtype}}_0`. +#. Let :math:`{({\mathsf{mut}^?}~{\mathit{zt}})^\ast}` be :math:`{\mathit{structtype}}_0`. #. Assert: Due to validation, for all :math:`{\mathit{zt}}` in :math:`{{\mathit{zt}}^\ast}`, :math:`{{\mathrm{default}}}_{{\mathrm{unpack}}({\mathit{zt}})}` is defined. @@ -17789,7 +17789,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Let :math:`(\mathsf{struct}~{\mathit{structtype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #) Let :math:`{({\mathsf{mut}^?}, {\mathit{zt}})^\ast}` be :math:`{\mathit{structtype}}_0`. + #) Let :math:`{({\mathsf{mut}^?}~{\mathit{zt}})^\ast}` be :math:`{\mathit{structtype}}_0`. #) If :math:`i < {|{{\mathit{zt}}^\ast}|}`, then: @@ -17810,7 +17810,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. -#. Let :math:`({\mathsf{mut}^?}, {\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. +#. Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. #. Assert: Due to validation, :math:`{{\mathrm{default}}}_{{\mathrm{unpack}}({\mathit{zt}})}` is defined. @@ -17866,7 +17866,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. -#. Let :math:`({\mathsf{mut}^?}, {\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. +#. Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. #. If :math:`i + n \cdot {|{\mathit{zt}}|} / 8 > {|z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}|}`, then: @@ -17915,7 +17915,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #) Let :math:`({\mathsf{mut}^?}, {\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. + #) Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. #) Push the value :math:`{{{{\mathrm{unpack}}}_{{\mathit{zt}}}^{{{\mathit{sx}}^?}}}}{(z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i])}` to the stack. @@ -18068,7 +18068,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i a) Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x_2])`. - #) Let :math:`({\mathsf{mut}^?}, {\mathit{zt}}_2)` be :math:`{\mathit{arraytype}}_0`. + #) Let :math:`({\mathsf{mut}^?}~{\mathit{zt}}_2)` be :math:`{\mathit{arraytype}}_0`. #) Let :math:`{{\mathit{sx}}^?}` be :math:`{\mathrm{sx}}({\mathit{zt}}_2)`. @@ -18102,7 +18102,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x_2])`. - #. Let :math:`({\mathsf{mut}^?}, {\mathit{zt}}_2)` be :math:`{\mathit{arraytype}}_0`. + #. Let :math:`({\mathsf{mut}^?}~{\mathit{zt}}_2)` be :math:`{\mathit{arraytype}}_0`. #. Let :math:`{{\mathit{sx}}^?}` be :math:`{\mathrm{sx}}({\mathit{zt}}_2)`. @@ -18238,7 +18238,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1) Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #) Let :math:`({\mathsf{mut}^?}, {\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. + #) Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. #) If :math:`j + n \cdot {|{\mathit{zt}}|} / 8 > {|z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}|}`, then: @@ -18322,7 +18322,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Let :math:`z` be the current state. -#. Let :math:`({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}})` be :math:`z{.}\mathsf{tables}{}[x]{.}\mathsf{type}`. +#. Let :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})` be :math:`z{.}\mathsf{tables}{}[x]{.}\mathsf{type}`. #. Let :math:`n` be :math:`{|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`. @@ -18512,7 +18512,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n, {\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: @@ -18524,7 +18524,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n, {\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. @@ -18735,7 +18735,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{(8, \mathsf{u})}~x_2)`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}}~x_2)`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1)`. @@ -18749,7 +18749,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + n - 1)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{(8, \mathsf{u})}~x_2)`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}}~x_2)`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1)`. @@ -18850,7 +18850,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`(\mathsf{struct}~{\mathit{structtype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. -#. Let :math:`{({\mathsf{mut}^?}, {\mathit{zt}})^{n}}` be :math:`{\mathit{structtype}}_0`. +#. Let :math:`{({\mathsf{mut}^?}~{\mathit{zt}})^{n}}` be :math:`{\mathit{structtype}}_0`. #. Let :math:`a` be :math:`{|z{.}\mathsf{structs}|}`. @@ -18891,7 +18891,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`(\mathsf{struct}~{\mathit{structtype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #. Let :math:`{({\mathsf{mut}^?}, {\mathit{zt}})^\ast}` be :math:`{\mathit{structtype}}_0`. + #. Let :math:`{({\mathsf{mut}^?}~{\mathit{zt}})^\ast}` be :math:`{\mathit{structtype}}_0`. #. If :math:`i < {|{{\mathit{zt}}^\ast}|}`, then: @@ -18908,7 +18908,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. -#. Let :math:`({\mathsf{mut}^?}, {\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. +#. Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. #. Let :math:`a` be :math:`{|z{.}\mathsf{arrays}|}`. @@ -18957,7 +18957,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #. Let :math:`({\mathsf{mut}^?}, {\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. + #. Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. #. Perform :math:`z{}[{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i] = {{\mathrm{pack}}}_{{\mathit{zt}}}({\mathit{val}})]`. @@ -20121,11 +20121,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{{\mathit{pt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. -:math:`{({\mathsf{mut}^?}, {\mathit{zt}})}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` -............................................................................................... +:math:`{{\mathsf{mut}^?}~{\mathit{zt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` +............................................................................................ -1. Return :math:`({\mathsf{mut}^?}, {{\mathit{zt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. +1. Return :math:`({\mathsf{mut}^?}~{{\mathit{zt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. :math:`{{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` @@ -20186,18 +20186,18 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Return :math:`{\mathit{at}}`. -:math:`{({\mathsf{mut}^?}, t)}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` -................................................................................... +:math:`{{\mathsf{mut}^?}~t}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` +................................................................................ -1. Return :math:`({\mathsf{mut}^?}, {t}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. +1. Return :math:`({\mathsf{mut}^?}~{t}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. -:math:`{({\mathit{at}}, {\mathit{lim}}, {\mathit{rt}})}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` -............................................................................................................ +:math:`{{\mathit{at}}~{\mathit{lim}}~{\mathit{rt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` +........................................................................................................ -1. Return :math:`({\mathit{at}}, {\mathit{lim}}, {{\mathit{rt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. +1. Return :math:`({\mathit{at}}~{\mathit{lim}}~{{\mathit{rt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. :math:`{{\mathit{at}}~{\mathit{lim}}~\mathsf{page}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}` @@ -20691,8 +20691,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathrm{free}}_{\mathit{packtype}}({\mathit{packtype}})`. -:math:`{\mathrm{free}}_{\mathit{fieldtype}}(({\mathsf{mut}^?}, {\mathit{storagetype}}))` -........................................................................................ +:math:`{\mathrm{free}}_{\mathit{fieldtype}}({\mathsf{mut}^?}~{\mathit{storagetype}})` +..................................................................................... 1. Return :math:`{\mathrm{free}}_{\mathit{storagetype}}({\mathit{storagetype}})`. @@ -20763,15 +20763,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Return :math:`{\mathrm{free}}_{\mathit{rectype}}({\mathit{rectype}})`. -:math:`{\mathrm{free}}_{\mathit{globaltype}}(({\mathsf{mut}^?}, {\mathit{valtype}}))` -..................................................................................... +:math:`{\mathrm{free}}_{\mathit{globaltype}}({\mathsf{mut}^?}~{\mathit{valtype}})` +.................................................................................. 1. Return :math:`{\mathrm{free}}_{\mathit{valtype}}({\mathit{valtype}})`. -:math:`{\mathrm{free}}_{\mathit{tabletype}}(({\mathit{addrtype}}, {\mathit{limits}}, {\mathit{reftype}}))` -.......................................................................................................... +:math:`{\mathrm{free}}_{\mathit{tabletype}}({\mathit{addrtype}}~{\mathit{limits}}~{\mathit{reftype}})` +...................................................................................................... 1. Return `$free_addrtype(addrtype) ++ $free_reftype(reftype)`. @@ -21764,8 +21764,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`\epsilon`. -:math:`{\mathrm{funcidx}}(({{\mathit{global}}^\ast}, {{\mathit{table}}^\ast}, {{\mathit{mem}}^\ast}, {{\mathit{elem}}^\ast}, {{\mathit{data}}^\ast}))` -...................................................................................................................................................... +:math:`{\mathrm{funcidx}}({{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast})` +................................................................................................................................................ 1. Return :math:`{\mathrm{funcidx}}(\mathsf{module}~\epsilon~\epsilon~\epsilon~{{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~\epsilon~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast}~\epsilon~\epsilon)`. @@ -23852,13 +23852,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i ........................................................ -1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}, ({}[~i~..~j~]), {\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast} \}\end{array}` be :math:`{\mathit{tableinst}}`. +1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~i~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast} \}\end{array}` be :math:`{\mathit{tableinst}}`. #. If :math:`{|{{r'}^\ast}|} + n \leq j`, then: a. Let :math:`{i'}` be :math:`{|{{r'}^\ast}|} + n`. - #. Let :math:`{\mathit{tableinst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}, ({}[~{i'}~..~j~]), {\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. + #. Let :math:`{\mathit{tableinst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~{i'}~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. #. Return :math:`{\mathit{tableinst}'}`. @@ -24004,11 +24004,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. -:math:`{\mathrm{alloctable}}(s, ({\mathit{at}}, ({}[~i~..~j~]), {\mathit{rt}}), {\mathit{ref}})` -................................................................................................ +:math:`{\mathrm{alloctable}}(s, {\mathit{at}}~({}[~i~..~j~])~{\mathit{rt}}, {\mathit{ref}})` +............................................................................................ -1. Let :math:`{\mathit{tableinst}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}, ({}[~i~..~j~]), {\mathit{rt}}),\; \mathsf{refs}~{{\mathit{ref}}^{i}} \}\end{array}`. +1. Let :math:`{\mathit{tableinst}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~i~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{\mathit{ref}}^{i}} \}\end{array}`. #. Let :math:`a` be :math:`{|s{.}\mathsf{tables}|}`. @@ -24661,7 +24661,7 @@ Storagetype_ok/pack - packtype is valid. Fieldtype_ok -- the field type (MUT?, storagetype) is valid if: +- the field type (MUT? storagetype) is valid if: - the storage type storagetype is valid. Functype_ok @@ -24933,7 +24933,7 @@ Storagetype_sub/pack - packtype_1 matches packtype_2. Fieldtype_sub -- the field type (mut_u1, zt_1) matches the field type (mut_u2, zt_2) if: +- the field type (mut_u1 zt_1) matches the field type (mut_u2 zt_2) if: - the storage type zt_1 matches the storage type zt_2. - Either: - mut_u1 is ?(). @@ -24944,11 +24944,11 @@ Fieldtype_sub - zt_2 matches zt_1. Fieldtype_sub/const -- the field type (?(), zt_1) matches the field type (?(), zt_2) if: +- the field type (?() zt_1) matches the field type (?() zt_2) if: - the storage type zt_1 matches the storage type zt_2. Fieldtype_sub/var -- the field type (?(MUT), zt_1) matches the field type (?(MUT), zt_2) if: +- the field type (?(MUT) zt_1) matches the field type (?(MUT) zt_2) if: - the storage type zt_1 matches the storage type zt_2. - zt_2 matches zt_1. @@ -25077,11 +25077,11 @@ Limits_ok - m is less than or equal to k. Globaltype_ok -- the global type (MUT?, t) is valid if: +- the global type (MUT? t) is valid if: - the value type t is valid. Tabletype_ok -- the table type (addrtype, limits, reftype) is valid if: +- the table type (addrtype limits reftype) is valid if: - the limits limits is valid with ((2 ^ 32) - 1). - the reference type reftype is valid. @@ -25143,7 +25143,7 @@ Instrtype_sub - For all x in x*: - the local type C.LOCALS[x] exists. - For all t in t* and x in x*: - - C.LOCALS[x] is (SET, t). + - C.LOCALS[x] is (SET t). Limits_sub - the limits ([ n_1 .. m_1 ]) matches the limits ([ n_2 .. m_2 ]) if: @@ -25151,7 +25151,7 @@ Limits_sub - m_1 is less than or equal to m_2. Globaltype_sub -- the global type (mut_u1, valtype_1) matches the global type (mut_u2, valtype_2) if: +- the global type (mut_u1 valtype_1) matches the global type (mut_u2 valtype_2) if: - the value type valtype_1 matches the value type valtype_2. - Either: - mut_u1 is ?(). @@ -25162,16 +25162,16 @@ Globaltype_sub - valtype_2 matches valtype_1. Globaltype_sub/const -- the global type (?(), valtype_1) matches the global type (?(), valtype_2) if: +- the global type (?() valtype_1) matches the global type (?() valtype_2) if: - the value type valtype_1 matches the value type valtype_2. Globaltype_sub/var -- the global type (?(MUT), valtype_1) matches the global type (?(MUT), valtype_2) if: +- the global type (?(MUT) valtype_1) matches the global type (?(MUT) valtype_2) if: - the value type valtype_1 matches the value type valtype_2. - valtype_2 matches valtype_1. Tabletype_sub -- the table type (addrtype, limits_1, reftype_1) matches the table type (addrtype, limits_2, reftype_2) if: +- the table type (addrtype limits_1 reftype_1) matches the table type (addrtype limits_2 reftype_2) if: - the limits limits_1 matches the limits limits_2. - the reference type reftype_1 matches the reference type reftype_2. - reftype_2 matches reftype_1. @@ -25405,7 +25405,7 @@ Instr_ok/call_ref Instr_ok/call_indirect - the instruction (CALL_INDIRECT x (_IDX y)) is valid with the instruction type t_1* :: [at] -> t_2* if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (at, lim, rt). + - C.TABLES[x] is (at lim rt). - the reference type rt matches the reference type (REF ?(NULL) FUNC). - the defined type C.TYPES[y] exists. - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[y] is the composite type (FUNC t_1* -> t_2*). @@ -25434,7 +25434,7 @@ Instr_ok/return_call_ref Instr_ok/return_call_indirect - the instruction (RETURN_CALL_INDIRECT x (_IDX y)) is valid with the instruction type t_3* :: t_1* :: [at] -> t_4* if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (at, lim, rt). + - C.TABLES[x] is (at lim rt). - the reference type rt matches the reference type (REF ?(NULL) FUNC). - the defined type C.TYPES[y] exists. - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[y] is the composite type (FUNC t_1* -> t_2*). @@ -25521,13 +25521,13 @@ Instr_ok/i31.get Instr_ok/struct.new - the instruction (STRUCT.NEW x) is valid with the instruction type t* -> [(REF ?() (_IDX x))] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (STRUCT (mut, zt)*). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (STRUCT (mut zt)*). - Let t* be the value type sequence $unpack(zt)*. Instr_ok/struct.new_default - the instruction (STRUCT.NEW_DEFAULT x) is valid with the instruction type [] -> [(REF ?() (_IDX x))] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (STRUCT (mut, zt)*). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (STRUCT (mut zt)*). - For all zt in zt*: - A :ref:`default value <default-val>` for value type the value type $unpack(zt) is defined. @@ -25536,7 +25536,7 @@ Instr_ok/struct.get - the defined type C.TYPES[x] exists. - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (STRUCT yt*). - |yt*| is greater than i. - - the field type yt*[i] is (mut, zt). + - the field type yt*[i] is (mut zt). - the signedness sx? is ?() if and only if the storage type zt is $unpack(zt). - Let t be the value type $unpack(zt). @@ -25545,38 +25545,38 @@ Instr_ok/struct.set - the defined type C.TYPES[x] exists. - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (STRUCT yt*). - |yt*| is greater than i. - - the field type yt*[i] is (?(MUT), zt). + - the field type yt*[i] is (?(MUT) zt). - Let t be the value type $unpack(zt). Instr_ok/array.new - the instruction (ARRAY.NEW x) is valid with the instruction type [t, I32] -> [(REF ?() (_IDX x))] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut, zt)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut zt)). - Let t be the value type $unpack(zt). Instr_ok/array.new_default - the instruction (ARRAY.NEW_DEFAULT x) is valid with the instruction type [I32] -> [(REF ?() (_IDX x))] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut, zt)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut zt)). - A :ref:`default value <default-val>` for value type the value type $unpack(zt) is defined. Instr_ok/array.new_fixed - the instruction (ARRAY.NEW_FIXED x n) is valid with the instruction type t^n -> [(REF ?() (_IDX x))] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut, zt)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut zt)). - Let t be the value type $unpack(zt). Instr_ok/array.new_elem - the instruction (ARRAY.NEW_ELEM x y) is valid with the instruction type [I32, I32] -> [(REF ?() (_IDX x))] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut, rt)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut rt)). - the element type C.ELEMS[y] exists. - C.ELEMS[y] matches the reference type rt. Instr_ok/array.new_data - the instruction (ARRAY.NEW_DATA x y) is valid with the instruction type [I32, I32] -> [(REF ?() (_IDX x))] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut, zt)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut zt)). - $unpack(zt) is numtype or the value type $unpack(zt) is vectype. - the data type C.DATAS[y] exists. - C.DATAS[y] is OK. @@ -25584,14 +25584,14 @@ Instr_ok/array.new_data Instr_ok/array.get - the instruction (ARRAY.GET sx? x) is valid with the instruction type [(REF ?(NULL) (_IDX x)), I32] -> [t] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut, zt)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (mut zt)). - the signedness sx? is ?() if and only if the storage type zt is $unpack(zt). - Let t be the value type $unpack(zt). Instr_ok/array.set - the instruction (ARRAY.SET x) is valid with the instruction type [(REF ?(NULL) (_IDX x)), I32, t] -> [] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (?(MUT), zt)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (?(MUT) zt)). - Let t be the value type $unpack(zt). Instr_ok/array.len @@ -25600,28 +25600,28 @@ Instr_ok/array.len Instr_ok/array.fill - the instruction (ARRAY.FILL x) is valid with the instruction type [(REF ?(NULL) (_IDX x)), I32, t, I32] -> [] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (?(MUT), zt)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (?(MUT) zt)). - Let t be the value type $unpack(zt). Instr_ok/array.copy - the instruction (ARRAY.COPY x_1 x_2) is valid with the instruction type [(REF ?(NULL) (_IDX x_1)), I32, (REF ?(NULL) (_IDX x_2)), I32, I32] -> [] if: - the defined type C.TYPES[x_1] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x_1] is the composite type (ARRAY (?(MUT), zt_1)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x_1] is the composite type (ARRAY (?(MUT) zt_1)). - the defined type C.TYPES[x_2] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x_2] is the composite type (ARRAY (mut, zt_2)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x_2] is the composite type (ARRAY (mut zt_2)). - the storage type zt_2 matches the storage type zt_1. Instr_ok/array.init_elem - the instruction (ARRAY.INIT_ELEM x y) is valid with the instruction type [(REF ?(NULL) (_IDX x)), I32, I32, I32] -> [] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (?(MUT), zt)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (?(MUT) zt)). - the element type C.ELEMS[y] exists. - C.ELEMS[y] matches the storage type zt. Instr_ok/array.init_data - the instruction (ARRAY.INIT_DATA x y) is valid with the instruction type [(REF ?(NULL) (_IDX x)), I32, I32, I32] -> [] if: - the defined type C.TYPES[x] exists. - - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (?(MUT), zt)). + - The :ref:`expansion <aux-expand-deftype>` of C.TYPES[x] is the composite type (ARRAY (?(MUT) zt)). - $unpack(zt) is numtype or the value type $unpack(zt) is vectype. - the data type C.DATAS[y] exists. - C.DATAS[y] is OK. @@ -25710,66 +25710,66 @@ Instr_ok/vcvtop Instr_ok/local.get - the instruction (LOCAL.GET x) is valid with the instruction type [] -> [t] if: - the local type C.LOCALS[x] exists. - - C.LOCALS[x] is (SET, t). + - C.LOCALS[x] is (SET t). Instr_ok/local.set - the instruction (LOCAL.SET x) is valid with the instruction type [t] ->_ [x] [] if: - the local type C.LOCALS[x] exists. - - C.LOCALS[x] is (init, t). + - C.LOCALS[x] is (init t). Instr_ok/local.tee - the instruction (LOCAL.TEE x) is valid with the instruction type [t] ->_ [x] [t] if: - the local type C.LOCALS[x] exists. - - C.LOCALS[x] is (init, t). + - C.LOCALS[x] is (init t). Instr_ok/global.get - the instruction (GLOBAL.GET x) is valid with the instruction type [] -> [t] if: - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (mut, t). + - C.GLOBALS[x] is (mut t). Instr_ok/global.set - the instruction (GLOBAL.SET x) is valid with the instruction type [t] -> [] if: - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (?(MUT), t). + - C.GLOBALS[x] is (?(MUT) t). Instr_ok/table.get - the instruction (TABLE.GET x) is valid with the instruction type [at] -> [rt] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (at, lim, rt). + - C.TABLES[x] is (at lim rt). Instr_ok/table.set - the instruction (TABLE.SET x) is valid with the instruction type [at, rt] -> [] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (at, lim, rt). + - C.TABLES[x] is (at lim rt). Instr_ok/table.size - the instruction (TABLE.SIZE x) is valid with the instruction type [] -> [at] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (at, lim, rt). + - C.TABLES[x] is (at lim rt). Instr_ok/table.grow - the instruction (TABLE.GROW x) is valid with the instruction type [rt, at] -> [at] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (at, lim, rt). + - C.TABLES[x] is (at lim rt). Instr_ok/table.fill - the instruction (TABLE.FILL x) is valid with the instruction type [at, rt, at] -> [] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (at, lim, rt). + - C.TABLES[x] is (at lim rt). Instr_ok/table.copy - the instruction (TABLE.COPY x_1 x_2) is valid with the instruction type [at_1, at_2, t] -> [] if: - the table type C.TABLES[x_1] exists. - - C.TABLES[x_1] is (at_1, lim_1, rt_1). + - C.TABLES[x_1] is (at_1 lim_1 rt_1). - the table type C.TABLES[x_2] exists. - - C.TABLES[x_2] is (at_2, lim_2, rt_2). + - C.TABLES[x_2] is (at_2 lim_2 rt_2). - the reference type rt_2 matches the reference type rt_1. - Let t be the address type $minat(at_1, at_2). Instr_ok/table.init - the instruction (TABLE.INIT x y) is valid with the instruction type [at, I32, I32] -> [] if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (at, lim, rt_1). + - C.TABLES[x] is (at lim rt_1). - the element type C.ELEMS[y] exists. - C.ELEMS[y] is rt_2. - the reference type rt_2 matches the reference type rt_1. @@ -25825,7 +25825,7 @@ Instr_ok/load - (2 ^ memarg.ALIGN) is less than or equal to ($size(nt) / 8). - Or: - nt_u1 is Inn. - - loadop_u1? is ?((M, sx)). + - loadop_u1? is ?((M sx)). - t_u1 is Inn. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -25898,7 +25898,7 @@ Instr_ok/load-val - (2 ^ memarg.ALIGN) is less than or equal to ($size(nt) / 8). Instr_ok/load-pack -- the instruction (LOAD Inn ?((M, sx)) x memarg) is valid with the instruction type [at] -> [Inn] if: +- the instruction (LOAD Inn ?((M sx)) x memarg) is valid with the instruction type [at] -> [Inn] if: - the memory type C.MEMS[x] exists. - C.MEMS[x] is at lim PAGE. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -25953,8 +25953,8 @@ Instrs_ok - For all x_1 in x_1*: - the local type C.LOCALS[x_1] exists. - For all init in init* and t in t* and x_1 in x_1*: - - C.LOCALS[x_1] is (init, t). - - Under the context $with_locals(C, x_1*, (SET, t)*), the instruction sequence instr_2* is valid with the instruction type t_2* ->_ x_2* t_3*. + - C.LOCALS[x_1] is (init t). + - Under the context $with_locals(C, x_1*, (SET t)*), the instruction sequence instr_2* is valid with the instruction type t_2* ->_ x_2* t_3*. - Or: - instr_u1* is instr*. - instrtype_u1 is it'. @@ -25978,8 +25978,8 @@ Instrs_ok/seq - For all x_1 in x_1*: - the local type C.LOCALS[x_1] exists. - For all init in init* and t in t* and x_1 in x_1*: - - C.LOCALS[x_1] is (init, t). - - Under the context $with_locals(C, x_1*, (SET, t)*), the instruction sequence instr_2* is valid with the instruction type t_2* ->_ x_2* t_3*. + - C.LOCALS[x_1] is (init t). + - Under the context $with_locals(C, x_1*, (SET t)*), the instruction sequence instr_2* is valid with the instruction type t_2* ->_ x_2* t_3*. Instrs_ok/sub - the instruction sequence instr* is valid with the instruction type it' if: @@ -26025,7 +26025,7 @@ Instr_const - Or: - instr_u1 is (GLOBAL.GET x). - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (?(), t). + - C.GLOBALS[x] is (?() t). - Or: - instr_u1 is (BINOP Inn binop). - Inn is contained in [I32, I64]. @@ -26070,7 +26070,7 @@ Instr_const/extern.convert_any Instr_const/global.get - the instruction (GLOBAL.GET x) is constant if: - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (?(), t). + - C.GLOBALS[x] is (?() t). Instr_const/binop - the instruction (BINOP Inn binop) is constant if: @@ -26090,7 +26090,7 @@ Type_ok - Under the context C', the recursive type rectype is valid with (OK x). Local_ok -- the local (LOCAL t) is valid with the local type (init_u1, t) if: +- the local (LOCAL t) is valid with the local type (init_u1 t) if: - Either: - the initialization status init_u1 is SET. - A :ref:`default value <default-val>` for value type the value type t is defined. @@ -26099,11 +26099,11 @@ Local_ok - A :ref:`default value <default-val>` for value type t is not defined. Local_ok/set -- the local (LOCAL t) is valid with the local type (SET, t) if: +- the local (LOCAL t) is valid with the local type (SET t) if: - A :ref:`default value <default-val>` for value type the value type t is defined. Local_ok/unset -- the local (LOCAL t) is valid with the local type (UNSET, t) if: +- the local (LOCAL t) is valid with the local type (UNSET t) if: - A :ref:`default value <default-val>` for value type the value type t is not defined. Func_ok @@ -26113,19 +26113,19 @@ Func_ok - |local*| is |lct*|. - For all lct in lct* and local in local*: - the local local is valid with the local type lct. - - Under the context C with .LOCALS appended by (SET, t_1)* :: lct* with .LABELS appended by [t_2*] with .RETURN appended by ?(t_2*), the expression expr is valid with the result type t_2*. + - Under the context C with .LOCALS appended by (SET t_1)* :: lct* with .LABELS appended by [t_2*] with .RETURN appended by ?(t_2*), the expression expr is valid with the result type t_2*. Global_ok - the global (GLOBAL globaltype expr) is valid with the global type globaltype if: - the global type gt is valid. - - globaltype is (mut, t). + - globaltype is (mut t). - the expression expr is valid with the value type t. - expr is constant. Table_ok - the table (TABLE tabletype expr) is valid with the table type tabletype if: - the table type tt is valid. - - tabletype is (at, lim, rt). + - tabletype is (at lim rt). - the expression expr is valid with the value type rt. - expr is constant. @@ -26143,7 +26143,7 @@ Elemmode_ok - Either: - elemmode_u1 is (ACTIVE x expr). - the table type C.TABLES[x] exists. - - C.TABLES[x] is (at, lim, rt'). + - C.TABLES[x] is (at lim rt'). - rt matches the reference type rt'. - the expression expr is valid with the value type I32. - expr is constant. @@ -26155,7 +26155,7 @@ Elemmode_ok Elemmode_ok/active - the element mode (ACTIVE x expr) is valid with the element type rt if: - the table type C.TABLES[x] exists. - - C.TABLES[x] is (at, lim, rt'). + - C.TABLES[x] is (at lim rt'). - rt matches the reference type rt'. - the expression expr is valid with the value type I32. - expr is constant. @@ -26341,7 +26341,7 @@ Module_ok - $disjoint_(name, nm*) is true. - the context C is C' with .GLOBALS appended by gt* with .TABLES appended by tt_I* :: tt* with .MEMS appended by mt_I* :: mt* with .TAGS appended by jt_I* :: jt* with .ELEMS appended by rt* with .DATAS appended by ok*. - the context C' is { TYPES: dt'*; RECS: []; FUNCS: dt_I* :: dt*; GLOBALS: gt_I*; TABLES: []; MEMS: []; TAGS: []; ELEMS: []; DATAS: []; LOCALS: []; LABELS: []; RETURN: ?(); REFS: x*; }. - - the function index sequence x* is $funcidx_nonfuncs((global*, table*, mem*, elem*, data*)). + - the function index sequence x* is $funcidx_nonfuncs((global* table* mem* elem* data*)). - the defined type sequence dt_I* is $funcsxt(xt_I*). - the global type sequence gt_I* is $globalsxt(xt_I*). - the table type sequence tt_I* is $tablesxt(xt_I*). @@ -26360,7 +26360,7 @@ NotationTypingInstrScheme - t_u1* is []. - t_u3* is [t]. - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (mut, t). + - C.GLOBALS[x] is (mut t). - Or: - instr_u1 is (BLOCK blocktype instr*). - t_u1* is t_1*. @@ -26375,7 +26375,7 @@ NotationTypingInstrScheme/i32.add NotationTypingInstrScheme/global.get - the instruction sequence [(GLOBAL.GET x)] is valid with the function type [] -> [t] if: - the global type C.GLOBALS[x] exists. - - C.GLOBALS[x] is (mut, t). + - C.GLOBALS[x] is (mut t). NotationTypingInstrScheme/block - the instruction sequence [(BLOCK blocktype instr*)] is valid with the function type t_1* -> t_2* if: @@ -27060,7 +27060,7 @@ Step_read/struct.new_default x 1. Let z be the current state. 2. Assert: Due to validation, $expanddt($type(z, x)) is of the case STRUCT. 3. Let (STRUCT structtype_0) be $expanddt($type(z, x)). -4. Let (mut, zt)* be structtype_0. +4. Let (mut zt)* be structtype_0. 5. Assert: Due to validation, $default_($unpack(zt)) is defined*. 6. Let ?(val)* be $default_($unpack(zt))*. 7. Assert: Due to validation, (|val*| = |zt*|). @@ -27078,7 +27078,7 @@ Step_read/struct.get sx? x i b. If ((i < |$structinst(z)[a].FIELDS|) /\ (a < |$structinst(z)|)), then: 1) Assert: Due to validation, $expanddt($type(z, x)) is of the case STRUCT. 2) Let (STRUCT structtype_0) be $expanddt($type(z, x)). - 3) Let (mut, zt)* be structtype_0. + 3) Let (mut zt)* be structtype_0. 4) If (i < |zt*|), then: a) Push the value $unpackfield_(zt*[i], sx?, $structinst(z)[a].FIELDS[i]) to the stack. @@ -27088,7 +27088,7 @@ Step_read/array.new_default x 3. Pop the value (I32.CONST n) from the stack. 4. Assert: Due to validation, $expanddt($type(z, x)) is of the case ARRAY. 5. Let (ARRAY arraytype_0) be $expanddt($type(z, x)). -6. Let (mut, zt) be arraytype_0. +6. Let (mut zt) be arraytype_0. 7. Assert: Due to validation, $default_($unpack(zt)) is defined. 8. Let ?(val) be $default_($unpack(zt)). 9. Push the values val^n to the stack. @@ -27115,7 +27115,7 @@ Step_read/array.new_data x y 5. Pop the value (I32.CONST i) from the stack. 6. Assert: Due to validation, $expanddt($type(z, x)) is of the case ARRAY. 7. Let (ARRAY arraytype_0) be $expanddt($type(z, x)). -8. Let (mut, zt) be arraytype_0. +8. Let (mut zt) be arraytype_0. 9. If ((i + ((n * $zsize(zt)) / 8)) > |$data(z, y).BYTES|), then: a. Trap. 10. Assert: Due to validation, (|$concatn__1^-1(byte, ($zsize(zt) / 8), $data(z, y).BYTES[i : ((n * $zsize(zt)) / 8)])| = n). @@ -27139,7 +27139,7 @@ Step_read/array.get sx? x c. If ((i < |$arrayinst(z)[a].FIELDS|) /\ (a < |$arrayinst(z)|)), then: 1) Assert: Due to validation, $expanddt($type(z, x)) is of the case ARRAY. 2) Let (ARRAY arraytype_0) be $expanddt($type(z, x)). - 3) Let (mut, zt) be arraytype_0. + 3) Let (mut zt) be arraytype_0. 4) Push the value $unpackfield_(zt, sx?, $arrayinst(z)[a].FIELDS[i]) to the stack. Step_read/array.len @@ -27214,7 +27214,7 @@ Step_read/array.copy x_1 x_2 a) Do nothing. 6) Else if ((i_1 <= i_2) /\ $expanddt($type(z, x_2)) is of the case ARRAY), then: a) Let (ARRAY arraytype_0) be $expanddt($type(z, x_2)). - b) Let (mut, zt_2) be arraytype_0. + b) Let (mut zt_2) be arraytype_0. c) Let sx? be $sx(zt_2). d) Push the value (REF.ARRAY_ADDR a_1) to the stack. e) Push the value (I32.CONST i_1) to the stack. @@ -27230,7 +27230,7 @@ Step_read/array.copy x_1 x_2 o) Execute the instruction (ARRAY.COPY x_1 x_2). 7) Else if $expanddt($type(z, x_2)) is of the case ARRAY, then: a) Let (ARRAY arraytype_0) be $expanddt($type(z, x_2)). - b) Let (mut, zt_2) be arraytype_0. + b) Let (mut zt_2) be arraytype_0. c) Let sx? be $sx(zt_2). d) Push the value (REF.ARRAY_ADDR a_1) to the stack. e) Push the value (I32.CONST ((i_1 + n) - 1)) to the stack. @@ -27297,7 +27297,7 @@ Step_read/array.init_data x y 1) Trap. c. If $expanddt($type(z, x)) is of the case ARRAY, then: 1) Let (ARRAY arraytype_0) be $expanddt($type(z, x)). - 2) Let (mut, zt) be arraytype_0. + 2) Let (mut zt) be arraytype_0. 3) If ((j + ((n * $zsize(zt)) / 8)) > |$data(z, y).BYTES|), then: a) Trap. 4) If (n = 0), then: @@ -27337,7 +27337,7 @@ Step_read/table.get x Step_read/table.size x 1. Let z be the current state. -2. Let (at, lim, rt) be $table(z, x).TYPE. +2. Let (at lim rt) be $table(z, x).TYPE. 3. Let n be |$table(z, x).REFS|. 4. Push the value (at.CONST n) to the stack. @@ -27430,13 +27430,13 @@ Step_read/load nt_u1 loadop_u1? x ao 5. If the type of nt_u1 is Inn, then: a. If loadop_u1? is defined, then: 1) Let ?(loadop__0) be loadop_u1?. - 2) Let (n, sx) be loadop__0. + 2) Let (n sx) be loadop__0. 3) If (((i + ao.OFFSET) + (n / 8)) > |$mem(z, x).BYTES|), then: a) Trap. b. Let Inn be nt_u1. c. If loadop_u1? is defined, then: 1) Let ?(loadop__0) be loadop_u1?. - 2) Let (n, sx) be loadop__0. + 2) Let (n sx) be loadop__0. 3) Let c be $ibytes__1^-1(n, $mem(z, x).BYTES[(i + ao.OFFSET) : (n / 8)]). 4) Push the value (Inn.CONST $extend__(n, $size(Inn), sx, c)) to the stack. @@ -27539,14 +27539,14 @@ Step_read/memory.copy x_1 x_2 a. If (i_1 <= i_2), then: 1) Push the value (at_1.CONST i_1) to the stack. 2) Push the value (at_2.CONST i_2) to the stack. - 3) Execute the instruction (LOAD I32 ?((8, U)) x_2 $memarg0()). + 3) Execute the instruction (LOAD I32 ?((8 U)) x_2 $memarg0()). 4) Execute the instruction (STORE I32 ?(8) x_1 $memarg0()). 5) Push the value (at_1.CONST (i_1 + 1)) to the stack. 6) Push the value (at_2.CONST (i_2 + 1)) to the stack. b. Else: 1) Push the value (at_1.CONST ((i_1 + n) - 1)) to the stack. 2) Push the value (at_2.CONST ((i_2 + n) - 1)) to the stack. - 3) Execute the instruction (LOAD I32 ?((8, U)) x_2 $memarg0()). + 3) Execute the instruction (LOAD I32 ?((8 U)) x_2 $memarg0()). 4) Execute the instruction (STORE I32 ?(8) x_1 $memarg0()). 5) Push the value (at_1.CONST i_1) to the stack. 6) Push the value (at_2.CONST i_2) to the stack. @@ -27595,7 +27595,7 @@ Step/struct.new x 1. Let z be the current state. 2. Assert: Due to validation, $expanddt($type(z, x)) is of the case STRUCT. 3. Let (STRUCT structtype_0) be $expanddt($type(z, x)). -4. Let (mut, zt)^n be structtype_0. +4. Let (mut zt)^n be structtype_0. 5. Let a be |$structinst(z)|. 6. Assert: Due to validation, there are at least n values on the top of the stack. 7. Pop the values val^n from the stack. @@ -27615,7 +27615,7 @@ Step/struct.set x i a. Let (REF.STRUCT_ADDR a) be instr_u1. b. Assert: Due to validation, $expanddt($type(z, x)) is of the case STRUCT. c. Let (STRUCT structtype_0) be $expanddt($type(z, x)). - d. Let (mut, zt)* be structtype_0. + d. Let (mut zt)* be structtype_0. e. If (i < |zt*|), then: 1) Perform $with_struct(z, a, i, $packfield_(zt*[i], val)). @@ -27623,7 +27623,7 @@ Step/array.new_fixed x n 1. Let z be the current state. 2. Assert: Due to validation, $expanddt($type(z, x)) is of the case ARRAY. 3. Let (ARRAY arraytype_0) be $expanddt($type(z, x)). -4. Let (mut, zt) be arraytype_0. +4. Let (mut zt) be arraytype_0. 5. Let a be |$arrayinst(z)|. 6. Assert: Due to validation, there are at least n values on the top of the stack. 7. Pop the values val^n from the stack. @@ -27647,7 +27647,7 @@ Step/array.set x 1) Trap. c. Assert: Due to validation, $expanddt($type(z, x)) is of the case ARRAY. d. Let (ARRAY arraytype_0) be $expanddt($type(z, x)). - e. Let (mut, zt) be arraytype_0. + e. Let (mut zt) be arraytype_0. f. Perform $with_array(z, a, i, $packfield_(zt, val)). Step/local.set x @@ -28187,8 +28187,8 @@ subst_storagetype zt_u1 tv* tu* 3. Let pt be zt_u1. 4. Return $subst_packtype(pt, tv*, tu*). -subst_fieldtype (mut, zt) tv* tu* -1. Return (mut, $subst_storagetype(zt, tv*, tu*)). +subst_fieldtype (mut zt) tv* tu* +1. Return (mut $subst_storagetype(zt, tv*, tu*)). subst_comptype ct_u1 tv* tu* 1. If ct_u1 is of the case STRUCT, then: @@ -28216,11 +28216,11 @@ subst_functype t_1* -> t_2* tv* tu* subst_addrtype at tv* tu* 1. Return at. -subst_globaltype (mut, t) tv* tu* -1. Return (mut, $subst_valtype(t, tv*, tu*)). +subst_globaltype (mut t) tv* tu* +1. Return (mut $subst_valtype(t, tv*, tu*)). -subst_tabletype (at, lim, rt) tv* tu* -1. Return (at, lim, $subst_reftype(rt, tv*, tu*)). +subst_tabletype (at lim rt) tv* tu* +1. Return (at lim $subst_reftype(rt, tv*, tu*)). subst_memtype at lim PAGE tv* tu* 1. Return at lim PAGE. @@ -28445,7 +28445,7 @@ free_storagetype zt_u1 3. Let packtype be zt_u1. 4. Return $free_packtype(packtype). -free_fieldtype (mut, storagetype) +free_fieldtype (mut storagetype) 1. Return $free_storagetype(storagetype). free_structtype fieldtype* @@ -28477,10 +28477,10 @@ free_rectype (REC subtype*) free_deftype (DEF rectype n) 1. Return $free_rectype(rectype). -free_globaltype (mut, valtype) +free_globaltype (mut valtype) 1. Return $free_valtype(valtype). -free_tabletype (addrtype, limits, reftype) +free_tabletype (addrtype limits reftype) 1. Return $free_addrtype(addrtype) ++ $free_reftype(reftype). free_memtype addrtype limits PAGE @@ -28958,7 +28958,7 @@ default_ t_u1 7. Assert: Due to validation, NULL_opt_0 is not defined. 8. Return ?(). -funcidx_nonfuncs (global*, table*, mem*, elem*, data*) +funcidx_nonfuncs (global* table* mem* elem* data*) 1. Return $funcidx_module((MODULE [] [] [] global* table* mem* [] elem* data* ?() [])). relaxed2 i X X_1 X_2 @@ -29935,10 +29935,10 @@ add_exninst z exn* 1. Append exn* to the s.EXNS. growtable tableinst n r -1. Let { TYPE: (at, ([ i .. j ]), rt); REFS: r'*; } be tableinst. +1. Let { TYPE: (at ([ i .. j ]) rt); REFS: r'*; } be tableinst. 2. If ((|r'*| + n) <= j), then: a. Let i' be (|r'*| + n). - b. Let tableinst' be { TYPE: (at, ([ i' .. j ]), rt); REFS: r'* :: r^n; }. + b. Let tableinst' be { TYPE: (at ([ i' .. j ]) rt); REFS: r'* :: r^n; }. c. Return tableinst'. growmem meminst n @@ -30008,8 +30008,8 @@ allocglobals s gt_u1* v_u1* e. Let ga'* be $allocglobals(s, globaltype'*, val'*). f. Return [ga] :: ga'*. -alloctable s (at, ([ i .. j ]), rt) ref -1. Let tableinst be { TYPE: (at, ([ i .. j ]), rt); REFS: ref^i; }. +alloctable s (at ([ i .. j ]) rt) ref +1. Let tableinst be { TYPE: (at ([ i .. j ]) rt); REFS: ref^i; }. 2. Let a be |s.TABLES|. 3. Append tableinst to the s.TABLES. 4. Return a. From b0037bd45c1c90a96d59e737ada6e57365fe712b Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Thu, 9 Jan 2025 14:58:41 +0900 Subject: [PATCH 04/12] Patch on frame, state, store - argument order of some functions (e.g. allocXs) are shown the same with spec definition - term "evaluation context" to "frame" or "handler" - frame pop and push fixed - wrong equality between states fixed (e.g. Let z be f) - removed unneccessary LetI(..., CurFrameE) - unpack wrong state parameters for some functions (e.g. with_elem z x ... -> with_elem (s,f) x ...) - store and state are passed in pointer style --- spectec/src/backend-prose/gen.ml | 87 -- spectec/src/backend-prose/print.ml | 8 +- spectec/src/backend-prose/prose_util.ml | 14 + spectec/src/backend-prose/prose_util.mli | 1 + spectec/src/backend-prose/render.ml | 8 +- spectec/src/exe-watsup/main.ml | 5 +- spectec/src/il2al/translate.ml | 3 +- spectec/src/il2al/translate.mli | 2 +- spectec/src/il2al/transpile.ml | 202 ++-- spectec/src/il2al/transpile.mli | 1 + spectec/test-prose/TEST.md | 1129 +++++++++------------- 11 files changed, 636 insertions(+), 824 deletions(-) diff --git a/spectec/src/backend-prose/gen.ml b/spectec/src/backend-prose/gen.ml index a032d9ea67..372467fd98 100644 --- a/spectec/src/backend-prose/gen.ml +++ b/spectec/src/backend-prose/gen.ml @@ -555,34 +555,6 @@ let postprocess_prose defs = let gen_validation_prose () = !Langs.validation_il |> prose_of_rels -let get_state_arg_opt f = - let id = f $ no_region in - match Il.Env.find_opt_def (Il.Env.env_of_script !Langs.il) id with - | Some (params, _, _) -> - List.find_map ( - fun param -> - match param.it with - | Il.Ast.ExpP (id, ({ it = VarT ({ it = "state"; _ }, _); _ } as typ)) -> - Some (Al.Ast.ExpA ((Al.Ast.VarE "z") $$ id.at % typ) $ no_region) - | _ -> None - ) params - | None -> - None - -let get_store_arg_opt f = - let id = f $ no_region in - match Il.Env.find_opt_def (Il.Env.env_of_script !Langs.il) id with - | Some (params, _, _) -> - List.find_map ( - fun param -> - match param.it with - | Il.Ast.ExpP (id, ({ it = VarT ({ it = "store"; _ }, _); _ } as typ)) -> - Some (Al.Ast.ExpA ((Al.Ast.VarE "s") $$ id.at % typ) $ no_region) - | _ -> None - ) params - | None -> - None - let insert_state_binding algo = let open Al.Ast in let z_binding = ref 0 in @@ -625,71 +597,12 @@ let insert_state_binding algo = ) else algo - -let recover_state algo = - - let get_state_and_store_args name = - let args = [] in - let args = - match get_state_arg_opt name with - | Some arg -> arg :: args - | _ -> args - in - let args = - match get_store_arg_opt name with - | Some arg -> arg :: args - | _ -> args - in - args - in - - let algo = - match algo.it with - | Al.Ast.RuleA _ -> algo - | Al.Ast.FuncA (name, args, instrs) -> - let args = get_state_and_store_args name @ args in - {algo with it = Al.Ast.FuncA (name, args, instrs)} - in - - let recover_state_expr expr = - match expr.it with - | Al.Ast.CallE (f, args) -> - let args = get_state_and_store_args f @ args in - {expr with it = Al.Ast.CallE (f, args)} - | _ -> expr - in - - let recover_state_instr instr = - match instr.it with - | Al.Ast.PerformI (f, args) -> - let args = get_state_and_store_args f @ args in - [{instr with it = Al.Ast.PerformI (f, args)}] - | _ -> [instr] - in - - let walk_expr walker expr = - let expr1 = recover_state_expr expr in - Al.Walk.base_walker.walk_expr walker expr1 - in - let walk_instr walker instr = - let instr1 = recover_state_instr instr in - List.concat_map (Al.Walk.base_walker.walk_instr walker) instr1 - in - let walker = { Al.Walk.base_walker with - walk_expr = walk_expr; - walk_instr = walk_instr; - } - in - let algo' = walker.walk_algo walker algo in - algo' - (** Entry for generating execution prose **) let gen_execution_prose () = List.map (fun algo -> let algo = algo - |> recover_state |> insert_state_binding |> Il2al.Transpile.remove_exit |> Il2al.Transpile.remove_enter diff --git a/spectec/src/backend-prose/print.ml b/spectec/src/backend-prose/print.ml index 9ef7e59cb1..032fdc318e 100644 --- a/spectec/src/backend-prose/print.ml +++ b/spectec/src/backend-prose/print.ml @@ -234,13 +234,7 @@ let make_index depth = | _ -> assert false (* Prefix for stack push/pop operations *) -let string_of_stack_prefix expr = - match expr.it with - | GetCurContextE _ - | VarE ("F" | "L") -> "" - | _ when Il.Eq.eq_typ expr.note Al.Al_util.evalctxT -> "the evaluation context " - | IterE _ -> "the values " - | _ -> "the value " +let string_of_stack_prefix = Prose_util.string_of_stack_prefix let rec string_of_instr' depth instr = diff --git a/spectec/src/backend-prose/prose_util.ml b/spectec/src/backend-prose/prose_util.ml index 1a2b1e83cf..d5c3e27933 100644 --- a/spectec/src/backend-prose/prose_util.ml +++ b/spectec/src/backend-prose/prose_util.ml @@ -63,3 +63,17 @@ let apply_prose_hint hint args = let holes, template = split_prose_hint hint in let args = List.map (fun hole -> List.nth args (hole_to_int hole - 1)) holes in alternate template args |> String.concat "" + +let string_of_stack_prefix expr = + let open Al.Ast in + match expr.it with + | GetCurContextE _ + | VarE ("F" | "L") -> "" + | _ when Il.Eq.eq_typ expr.note Al.Al_util.frameT -> "the frame " + | CaseE (mixop, _) when Il.Eq.eq_typ expr.note Al.Al_util.evalctxT -> + let evalctx_name = Xl.Mixop.name (List.nth mixop 0) + |> fun s -> String.sub s 0 (String.length s - 1) + |> String.lowercase_ascii in + Printf.sprintf "the %s " evalctx_name + | IterE _ -> "the values " + | _ -> "the value " \ No newline at end of file diff --git a/spectec/src/backend-prose/prose_util.mli b/spectec/src/backend-prose/prose_util.mli index 0285ea6ac2..944f2e97d9 100644 --- a/spectec/src/backend-prose/prose_util.mli +++ b/spectec/src/backend-prose/prose_util.mli @@ -2,3 +2,4 @@ val find_relation : string -> El.Ast.def option val extract_desc : Il.Ast.typ -> string val alternate : 'a list -> 'a list -> 'a list val apply_prose_hint : string -> string list -> string +val string_of_stack_prefix : Al.Ast.expr -> string diff --git a/spectec/src/backend-prose/render.ml b/spectec/src/backend-prose/render.ml index 3ba8948b4e..64d806ba8a 100644 --- a/spectec/src/backend-prose/render.ml +++ b/spectec/src/backend-prose/render.ml @@ -790,13 +790,7 @@ and render_stmts env depth stmts = (* Instructions *) (* Prefix for stack push/pop operations *) -let render_stack_prefix expr = - match expr.it with - | Al.Ast.GetCurContextE _ - | Al.Ast.VarE ("F" | "L") -> "" - | _ when Il.Eq.eq_typ expr.note Al.Al_util.evalctxT -> "the evaluation context " - | Al.Ast.IterE _ -> "the values " - | _ -> "the value " +let render_stack_prefix = Prose_util.string_of_stack_prefix let rec render_instr env algoname index depth instr = match instr.it with diff --git a/spectec/src/exe-watsup/main.ml b/spectec/src/exe-watsup/main.ml index 98c19197d4..7ded18ffcf 100644 --- a/spectec/src/exe-watsup/main.ml +++ b/spectec/src/exe-watsup/main.ml @@ -201,7 +201,10 @@ let () = if not (!print_al || !print_al_o <> "") && (!target = Check || !target = Latex) then [] else ( log "Translating to AL..."; - (Il2al.Translate.translate il @ Il2al.Manual.manual_algos) + let interp = match !target with + | Interpreter _ -> true + | _ -> false in + Il2al.Translate.translate il interp @ Il2al.Manual.manual_algos ) in diff --git a/spectec/src/il2al/translate.ml b/spectec/src/il2al/translate.ml index 6d93b31116..f6b5e7cb1d 100644 --- a/spectec/src/il2al/translate.ml +++ b/spectec/src/il2al/translate.ml @@ -1203,7 +1203,8 @@ and translate_rgroup (rule: rule_def) = (* Entry *) -let translate il = +let translate il interp = + Transpile.for_interp := interp; let rules, helpers = Preprocess.preprocess il in let al = List.map translate_rgroup rules @ List.map translate_helper helpers diff --git a/spectec/src/il2al/translate.mli b/spectec/src/il2al/translate.mli index af6f1db6ce..1314e473e1 100644 --- a/spectec/src/il2al/translate.mli +++ b/spectec/src/il2al/translate.mli @@ -1,3 +1,3 @@ val translate_exp : Il.Ast.exp -> Al.Ast.expr val translate_argexp : Il.Ast.exp -> Al.Ast.expr list -val translate : Il.Ast.script -> Al.Ast.algorithm list +val translate : Il.Ast.script -> bool -> Al.Ast.algorithm list \ No newline at end of file diff --git a/spectec/src/il2al/transpile.ml b/spectec/src/il2al/transpile.ml index c029c03ca1..d21d22cd44 100644 --- a/spectec/src/il2al/transpile.ml +++ b/spectec/src/il2al/transpile.ml @@ -7,6 +7,7 @@ open Util.Source open Util.Record open Xl +let for_interp = ref false (* Helpers *) @@ -603,9 +604,12 @@ let is_state_arg arg = match arg.it with | DefA _ -> false let hide_state_args args = - args - |> Lib.List.filter_not is_state_arg - |> Lib.List.filter_not is_store_arg + if !for_interp then + args + |> Lib.List.filter_not is_state_arg + |> Lib.List.filter_not is_store_arg + else + args let is_state_param param = match param.it with | Il.Ast.ExpP (_, ({ it = VarT ({ it = "state"; _ }, _); _ })) -> true @@ -616,14 +620,27 @@ let hide_state_params params = |> Lib.List.filter_not is_state_param let hide_state_expr expr = - let expr' = - match expr.it with - | CallE (f, args) -> CallE (f, hide_state_args args) - | TupE [ s; e ] when is_store s -> e.it - | TupE [ z; e ] when is_state z -> e.it - | e -> e - in - { expr with it = expr' } + if !for_interp then + let expr' = + match expr.it with + | CallE (f, args) -> CallE (f, hide_state_args args) + | TupE [ s; e ] when is_store s -> e.it + | TupE [ z; e ] when is_state z -> e.it + | e -> e + in + { expr with it = expr' } + else + let expr' = + match expr.it with + | CallE (f, args) -> CallE (f, hide_state_args args) + | TupE [ _s; f ] when is_frame expr -> f.it + | TupE [ s; e ] when is_store s && not (is_frame e) -> e.it + | TupE [ z; e ] when is_state z -> e.it + | VarE _ when is_store expr -> VarE "s" + | VarE "z'" when is_state expr -> VarE "z" + | e -> e + in + { expr with it = expr' } let hide_state instr = let at = instr.at in @@ -683,41 +700,65 @@ let hide_state instr = | _ -> [ instr ] let remove_state algo = - let il_env = Al.Valid.il_env in - let defs = Al.Valid.IlEnv.Map.map (function - | (params, typ, clauses) -> (hide_state_params params, typ, clauses) - ) !il_env.defs in - il_env := { !il_env with defs }; - - let walk_expr walker expr = - let expr1 = hide_state_expr expr in - Al.Walk.base_walker.walk_expr walker expr1 - in - let walk_instr walker instr = - let instr1 = hide_state instr in - List.concat_map (Al.Walk.base_walker.walk_instr walker) instr1 - in - let walker = { Walk.base_walker with - walk_expr = walk_expr; - walk_instr = walk_instr; - } - in - let algo' = walker.walk_algo walker algo in - { algo' with it = - match algo'.it with - | FuncA (name, args, body) -> - let args' = - args - |> Lib.List.filter_not is_state_arg - |> Lib.List.filter_not is_store_arg - |> Lib.List.filter_not is_frame_arg - in - let body' = body - |> remove_dead_assignment - in - FuncA (name, args', body') - | rule -> rule - } + if !for_interp then ( + let il_env = Al.Valid.il_env in + let defs = Al.Valid.IlEnv.Map.map (function + | (params, typ, clauses) -> (hide_state_params params, typ, clauses) + ) !il_env.defs in + il_env := { !il_env with defs }; + + let walk_expr walker expr = + let expr1 = hide_state_expr expr in + Al.Walk.base_walker.walk_expr walker expr1 + in + let walk_instr walker instr = + let instr1 = hide_state instr in + List.concat_map (Al.Walk.base_walker.walk_instr walker) instr1 + in + let walker = { Walk.base_walker with + walk_expr = walk_expr; + walk_instr = walk_instr; + } + in + let algo' = walker.walk_algo walker algo in + { algo' with it = + match algo'.it with + | FuncA (name, args, body) -> + let args' = + args + |> Lib.List.filter_not is_state_arg + |> Lib.List.filter_not is_store_arg + |> Lib.List.filter_not is_frame_arg + in + let body' = body + |> remove_dead_assignment + in + FuncA (name, args', body') + | rule -> rule + } + ) else ( + let walk_expr walker expr = + let expr1 = hide_state_expr expr in + Al.Walk.base_walker.walk_expr walker expr1 + in + let walk_instr walker instr = + let instr1 = hide_state instr in + List.concat_map (Al.Walk.base_walker.walk_instr walker) instr1 + in + let walker = { Walk.base_walker with + walk_expr = walk_expr; + walk_instr = walk_instr; + } + in + { algo with it = + match algo.it with + | FuncA (name, args, body) -> + FuncA (name, args, body + |> List.concat_map (walker.walk_instr walker) + |> remove_dead_assignment) + | rule -> rule + } + ) (* Insert "Let f be the current frame" if necessary. *) let insert_frame_binding instrs = @@ -845,43 +886,58 @@ let handle_framed_algo a instrs = } in let instr_tl = List.concat_map (walker.walk_instr walker) instrs in - if !frame_appeared then instr_hd :: instr_tl else instr_tl + if !for_interp && !frame_appeared then instr_hd :: instr_tl else instr_tl (* Case 2 *) let handle_unframed_algo instrs = (* Helpers *) let frame_arg = ref None in let extract_frame_arg expr = - match expr.it with - | CallE (_, args) -> - List.iter (fun a -> - if (is_frame_arg a || is_state_arg a) then frame_arg := Some a - ) args; - expr - | _ -> - expr + match expr.it with + | CallE (_, args) -> + List.iter (fun a -> + if (is_frame_arg a || is_state_arg a) then frame_arg := Some a + ) args; + expr + | _ -> + expr + in + + let rec returned_frame e = match e.it with + | TupE [f'; _] -> Some f' + | IterE (e, _) -> returned_frame e + | _ -> None + in + + let postprocess_frame f = if !for_interp then f else match f.it with + | VarE "z" -> { f with it = CallE ("frame", [ExpA f $ f.at]) } + | VarE "z'" -> { f with it = VarE "f'" } + | _ -> f in let post_instr instr = let ret = - match !frame_arg with - | Some { it = ExpA f; _ } -> - let zeroE = natE Z.zero ~note:natT in - let frame = frameE (zeroE, f) ~at:f.at ~note:evalctxT in - let frame' = - match instr.it with - (* HARDCODE: the frame-passing-style *) - | LetI ( { it = TupE [f'; _]; _ }, _) -> - frameE (zeroE, f') ~at:f'.at ~note:evalctxT - | _ -> - frameE (zeroE, varE "_f" ~note:f.note) ~note:evalctxT - in - [ - pushI frame ~at:frame.at; - instr; - popI frame' ~at:frame'.at; - ] - | _ -> [ instr ] + match !frame_arg with + | Some { it = ExpA f; _ } -> + let zeroE = natE Z.zero ~note:natT in + let frame = frameE (zeroE, postprocess_frame f) ~at:f.at ~note:evalctxT in + let _f = frameE (zeroE, varE "_f" ~note:f.note) ~note:evalctxT in + let frame' = + match instr.it with + (* HARDCODE: the frame-passing-style *) + | LetI (e, _) -> (match returned_frame e with + | Some f' -> + frameE (zeroE, postprocess_frame f') ~at:f'.at ~note:evalctxT + | None -> _f + ) + | _ -> _f + in + [ + pushI frame ~at:frame.at; + instr; + popI frame' ~at:frame'.at; + ] + | _ -> [ instr ] in frame_arg := None; ret diff --git a/spectec/src/il2al/transpile.mli b/spectec/src/il2al/transpile.mli index a9f0eafddf..0b67f00e7d 100644 --- a/spectec/src/il2al/transpile.mli +++ b/spectec/src/il2al/transpile.mli @@ -1,5 +1,6 @@ open Al.Ast +val for_interp : bool ref val insert_nop : instr list -> instr list val merge_blocks : instr list list -> instr list val push_either :instr -> instr list diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index 21d28d7aab..e867998d4f 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -1337,7 +1337,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~{{\mathit{val}}^{k}}~{{{\mathrm{default}}}_{t}^\ast},\; \mathsf{module}~{\mathit{mm}} \}\end{array}`. -#. Push the evaluation context :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` to the stack. +#. Push the frame :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` to the stack. #. Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{n}}{\{}~\epsilon~\})`. @@ -2225,174 +2225,144 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{\mathrm{mems}}({{\mathit{xv}}^\ast})`. -:math:`z{.}\mathsf{store}` -.......................... +:math:`(s, f){.}\mathsf{store}` +............................... 1. Return. -:math:`z{.}\mathsf{frame}` -.......................... - - -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){.}\mathsf{frame}` +............................... -#. Return :math:`f`. +1. Return :math:`f`. -:math:`z{.}\mathsf{module}{.}\mathsf{funcs}` -............................................ +:math:`(s, f){.}\mathsf{module}{.}\mathsf{funcs}` +................................................. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Return :math:`f{.}\mathsf{module}{.}\mathsf{funcs}`. +1. Return :math:`f{.}\mathsf{module}{.}\mathsf{funcs}`. -:math:`z{.}\mathsf{funcs}` -.......................... +:math:`(s, f){.}\mathsf{funcs}` +............................... 1. Return :math:`s{.}\mathsf{funcs}`. -:math:`z{.}\mathsf{globals}` -............................ +:math:`(s, f){.}\mathsf{globals}` +................................. 1. Return :math:`s{.}\mathsf{globals}`. -:math:`z{.}\mathsf{tables}` -........................... +:math:`(s, f){.}\mathsf{tables}` +................................ 1. Return :math:`s{.}\mathsf{tables}`. -:math:`z{.}\mathsf{mems}` -......................... +:math:`(s, f){.}\mathsf{mems}` +.............................. 1. Return :math:`s{.}\mathsf{mems}`. -:math:`z{.}\mathsf{module}` -........................... - - -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Return :math:`f{.}\mathsf{module}`. - - -:math:`z{.}\mathsf{types}{}[x]` -............................... - - -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Return :math:`f{.}\mathsf{module}{.}\mathsf{types}{}[x]`. - - -:math:`z{.}\mathsf{funcs}{}[x]` -............................... - - -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){.}\mathsf{module}` +................................ -#. Return :math:`s{.}\mathsf{funcs}{}[f{.}\mathsf{module}{.}\mathsf{funcs}{}[x]]`. +1. Return :math:`f{.}\mathsf{module}`. -:math:`z{.}\mathsf{globals}{}[x]` -................................. +:math:`(s, f){.}\mathsf{types}{}[x]` +.................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Return :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]`. +1. Return :math:`f{.}\mathsf{module}{.}\mathsf{types}{}[x]`. -:math:`z{.}\mathsf{tables}{}[x]` -................................ +:math:`(s, f){.}\mathsf{funcs}{}[x]` +.................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +1. Return :math:`s{.}\mathsf{funcs}{}[f{.}\mathsf{module}{.}\mathsf{funcs}{}[x]]`. -#. Return :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]`. +:math:`(s, f){.}\mathsf{globals}{}[x]` +...................................... -:math:`z{.}\mathsf{mems}{}[x]` -.............................. +1. Return :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Return :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]`. +:math:`(s, f){.}\mathsf{tables}{}[x]` +..................................... -:math:`z{.}\mathsf{locals}{}[x]` -................................ +1. Return :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){.}\mathsf{mems}{}[x]` +................................... -#. Return :math:`f{.}\mathsf{locals}{}[x]`. +1. Return :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]`. -:math:`z{}[{.}\mathsf{locals}{}[x] = v]` -........................................ +:math:`(s, f){.}\mathsf{locals}{}[x]` +..................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`f{.}\mathsf{locals}{}[x]` with :math:`v`. +1. Return :math:`f{.}\mathsf{locals}{}[x]`. -:math:`z{}[{.}\mathsf{globals}{}[x]{.}\mathsf{value} = v]` -.......................................................... +:math:`(s, f){}[{.}\mathsf{locals}{}[x] = v]` +............................................. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +1. Replace :math:`f{.}\mathsf{locals}{}[x]` with :math:`v`. -#. Replace :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]{.}\mathsf{value}` with :math:`v`. +:math:`(s, f){}[{.}\mathsf{globals}{}[x]{.}\mathsf{value} = v]` +............................................................... -:math:`z{}[{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i] = a]` -............................................................. +1. Replace :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]{.}\mathsf{value}` with :math:`v`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]{.}\mathsf{refs}{}[i]` with :math:`a`. +:math:`(s, f){}[{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i] = a]` +.................................................................. -:math:`z{}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]` -.................................................... +1. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]{.}\mathsf{refs}{}[i]` with :math:`a`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]` with :math:`{\mathit{ti}}`. +:math:`(s, f){}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]` +......................................................... -:math:`z{}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i : j] = {b^\ast}]` -....................................................................... +1. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]` with :math:`{\mathit{ti}}`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i : j] = {b^\ast}]` +............................................................................ -#. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]{.}\mathsf{bytes}{}[i : j]` with :math:`{b^\ast}`. +1. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]{.}\mathsf{bytes}{}[i : j]` with :math:`{b^\ast}`. -:math:`z{}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]` -.................................................. +:math:`(s, f){}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]` +....................................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]` with :math:`{\mathit{mi}}`. +1. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]` with :math:`{\mathit{mi}}`. :math:`{\mathrm{growtable}}({\mathit{ti}}, n)` @@ -2813,25 +2783,25 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Let :math:`f_{\mathit{init}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~{\mathit{moduleinst}}_{\mathit{init}} \}\end{array}`. -#. Let :math:`z` be :math:`f_{\mathit{init}}`. +#. Let :math:`z` be :math:`(s, f_{\mathit{init}})`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~z~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{d}})^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}({\mathit{expr}}_{\mathsf{d}})^\ast}`. +#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{d}})^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{d}})^\ast}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~z~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{e}})^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}({\mathit{expr}}_{\mathsf{e}})^\ast}`. +#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{e}})^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{e}})^\ast}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~z~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{{\mathit{val}}^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}({\mathit{expr}}_{\mathsf{g}})^\ast}`. +#. Let :math:`{{\mathit{val}}^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{g}})^\ast}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. #. Let :math:`{\mathit{moduleinst}}` be :math:`{\mathrm{allocmodule}}(s, {\mathit{module}}, {{\mathit{externaddr}}^\ast}, {{\mathit{val}}^\ast})`. @@ -2841,11 +2811,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Perform :math:`{\mathrm{initdata}}(s, {\mathit{moduleinst}}, {i_{\mathsf{d}}^\ast}, {{b^\ast}^\ast})`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. #. Execute the sequence :math:`{(\mathsf{call}~{x'})^?}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Return :math:`f{.}\mathsf{module}`. @@ -2856,15 +2826,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{exports}~\epsilon \}\end{array} \}\end{array}`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~(s, f)~\})` to the stack. -#. Let :math:`{t_1^{n}}~\rightarrow~{t_2^\ast}` be :math:`z{.}\mathsf{funcs}{}[{\mathit{fa}}]{.}\mathsf{type}`. +#. Let :math:`{t_1^{n}}~\rightarrow~{t_2^\ast}` be :math:`(s, f){.}\mathsf{funcs}{}[{\mathit{fa}}]{.}\mathsf{type}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Let :math:`k` be :math:`{|{t_2^\ast}|}`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. @@ -2872,7 +2842,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. @@ -3561,7 +3531,7 @@ Step_read/call_addr a 8. Assert: Due to validation, there are at least k values on the top of the stack. 9. Pop the values val^k from the stack. 10. Let f be { LOCALS: val^k :: $default_(t)*; MODULE: mm; }. -11. Push the evaluation context (FRAME_ n { f }) to the stack. +11. Push the frame (FRAME_ n { f }) to the stack. 12. Enter instr* with label (LABEL_ n { [] }). Step_read/local.get x @@ -3985,80 +3955,65 @@ memsxa xv_u1* 4. Let [externaddr] :: xv* be xv_u1*. 5. Return $memsxa(xv*). -store z +store (s, f) 1. Return. -frame z -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f. +frame (s, f) +1. Return f. -funcaddr z -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.MODULE.FUNCS. +funcaddr (s, f) +1. Return f.MODULE.FUNCS. -funcinst z +funcinst (s, f) 1. Return s.FUNCS. -globalinst z +globalinst (s, f) 1. Return s.GLOBALS. -tableinst z +tableinst (s, f) 1. Return s.TABLES. -meminst z +meminst (s, f) 1. Return s.MEMS. -moduleinst z -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.MODULE. +moduleinst (s, f) +1. Return f.MODULE. -type z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.MODULE.TYPES[x]. +type (s, f) x +1. Return f.MODULE.TYPES[x]. -func z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.FUNCS[f.MODULE.FUNCS[x]]. +func (s, f) x +1. Return s.FUNCS[f.MODULE.FUNCS[x]]. -global z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.GLOBALS[f.MODULE.GLOBALS[x]]. +global (s, f) x +1. Return s.GLOBALS[f.MODULE.GLOBALS[x]]. -table z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.TABLES[f.MODULE.TABLES[x]]. +table (s, f) x +1. Return s.TABLES[f.MODULE.TABLES[x]]. -mem z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.MEMS[f.MODULE.MEMS[x]]. +mem (s, f) x +1. Return s.MEMS[f.MODULE.MEMS[x]]. -local z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.LOCALS[x]. +local (s, f) x +1. Return f.LOCALS[x]. -with_local z x v -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace f.LOCALS[x] with v. +with_local (s, f) x v +1. Replace f.LOCALS[x] with v. -with_global z x v -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.GLOBALS[f.MODULE.GLOBALS[x]].VALUE with v. +with_global (s, f) x v +1. Replace s.GLOBALS[f.MODULE.GLOBALS[x]].VALUE with v. -with_table z x i a -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.TABLES[f.MODULE.TABLES[x]].REFS[i] with ?(a). +with_table (s, f) x i a +1. Replace s.TABLES[f.MODULE.TABLES[x]].REFS[i] with ?(a). -with_tableinst z x ti -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.TABLES[f.MODULE.TABLES[x]] with ti. +with_tableinst (s, f) x ti +1. Replace s.TABLES[f.MODULE.TABLES[x]] with ti. -with_mem z x i j b* -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.MEMS[f.MODULE.MEMS[x]].BYTES[i : j] with b*. +with_mem (s, f) x i j b* +1. Replace s.MEMS[f.MODULE.MEMS[x]].BYTES[i : j] with b*. -with_meminst z x mi -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.MEMS[f.MODULE.MEMS[x]] with mi. +with_meminst (s, f) x mi +1. Replace s.MEMS[f.MODULE.MEMS[x]] with mi. growtable ti n 1. Let { TYPE: ([ i .. j ]); REFS: ?(a)*; } be ti. @@ -4259,36 +4214,36 @@ instantiate s module externaddr* 13. Let (GLOBAL globaltype expr_G)* be global*. 14. Let moduleinst_init be { TYPES: functype*; FUNCS: $funcs(externaddr*) :: (|s.FUNCS| + i_F)^(i_F<n_F); GLOBALS: $globals(externaddr*); TABLES: []; MEMS: []; EXPORTS: []; }. 15. Let f_init be { LOCALS: []; MODULE: moduleinst_init; }. -16. Let z be f_init. -17. Push the evaluation context (FRAME_ 0 { z }) to the stack. -18. Let [(I32.CONST i_D)]* be $eval_expr(expr_D)*. -19. Pop the evaluation context (FRAME_ 0 { _f }) from the stack. -20. Push the evaluation context (FRAME_ 0 { z }) to the stack. -21. Let [(I32.CONST i_E)]* be $eval_expr(expr_E)*. -22. Pop the evaluation context (FRAME_ 0 { _f }) from the stack. -23. Push the evaluation context (FRAME_ 0 { z }) to the stack. -24. Let [val]* be $eval_expr(expr_G)*. -25. Pop the evaluation context (FRAME_ 0 { _f }) from the stack. +16. Let z be (s, f_init). +17. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +18. Let [(I32.CONST i_D)]* be $eval_expr(z, expr_D)*. +19. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. +20. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +21. Let [(I32.CONST i_E)]* be $eval_expr(z, expr_E)*. +22. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. +23. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +24. Let [val]* be $eval_expr(z, expr_G)*. +25. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. 26. Let moduleinst be $allocmodule(s, module, externaddr*, val*). 27. Let f be { LOCALS: []; MODULE: moduleinst; }. 28. Perform $initelem(s, moduleinst, i_E*, moduleinst.FUNCS[x]**). 29. Perform $initdata(s, moduleinst, i_D*, b**). -30. Push the evaluation context (FRAME_ 0 { f }) to the stack. +30. Push the frame (FRAME_ 0 { f }) to the stack. 31. Execute the sequence ((CALL x')?). -32. Pop the evaluation context (FRAME_ 0 { f }) from the stack. +32. Pop the frame (FRAME_ 0 { f }) from the stack. 33. Return f.MODULE. invoke s fa val^n 1. Let f be { LOCALS: []; MODULE: { TYPES: []; FUNCS: []; GLOBALS: []; TABLES: []; MEMS: []; EXPORTS: []; }; }. -2. Push the evaluation context (FRAME_ 0 { f }) to the stack. -3. Let t_1^n -> t_2* be $funcinst(z)[fa].TYPE. -4. Pop the evaluation context (FRAME_ 0 { _f }) from the stack. +2. Push the frame (FRAME_ 0 { (s, f) }) to the stack. +3. Let t_1^n -> t_2* be $funcinst((s, f))[fa].TYPE. +4. Pop the frame (FRAME_ 0 { _f }) from the stack. 5. Let k be |t_2*|. -6. Push the evaluation context (FRAME_ k { f }) to the stack. +6. Push the frame (FRAME_ k { f }) to the stack. 7. Push the values val^n to the stack. 8. Execute the instruction (CALL_ADDR fa). 9. Pop all values val* from the top of the stack. -10. Pop the evaluation context (FRAME_ k { f }) from the stack. +10. Pop the frame (FRAME_ k { f }) from the stack. 11. Push the values val* to the stack. 12. Pop the values val^k from the stack. 13. Return val^k. @@ -6686,7 +6641,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~{{\mathit{val}}^{k}}~{{{\mathrm{default}}}_{t}^\ast},\; \mathsf{module}~{\mathit{mm}} \}\end{array}`. -#. Push the evaluation context :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` to the stack. +#. Push the frame :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` to the stack. #. Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{n}}{\{}~\epsilon~\})`. @@ -9165,224 +9120,186 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{\mathrm{mems}}({{\mathit{xv}}^\ast})`. -:math:`z{.}\mathsf{store}` -.......................... +:math:`(s, f){.}\mathsf{store}` +............................... 1. Return. -:math:`z{.}\mathsf{frame}` -.......................... - - -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){.}\mathsf{frame}` +............................... -#. Return :math:`f`. +1. Return :math:`f`. -:math:`z{.}\mathsf{module}{.}\mathsf{funcs}` -............................................ +:math:`(s, f){.}\mathsf{module}{.}\mathsf{funcs}` +................................................. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Return :math:`f{.}\mathsf{module}{.}\mathsf{funcs}`. +1. Return :math:`f{.}\mathsf{module}{.}\mathsf{funcs}`. -:math:`z{.}\mathsf{funcs}` -.......................... +:math:`(s, f){.}\mathsf{funcs}` +............................... 1. Return :math:`s{.}\mathsf{funcs}`. -:math:`z{.}\mathsf{globals}` -............................ +:math:`(s, f){.}\mathsf{globals}` +................................. 1. Return :math:`s{.}\mathsf{globals}`. -:math:`z{.}\mathsf{tables}` -........................... +:math:`(s, f){.}\mathsf{tables}` +................................ 1. Return :math:`s{.}\mathsf{tables}`. -:math:`z{.}\mathsf{mems}` -......................... +:math:`(s, f){.}\mathsf{mems}` +.............................. 1. Return :math:`s{.}\mathsf{mems}`. -:math:`z{.}\mathsf{elems}` -.......................... - - -1. Return :math:`s{.}\mathsf{elems}`. - - -:math:`z{.}\mathsf{datas}` -.......................... - - -1. Return :math:`s{.}\mathsf{datas}`. - - -:math:`z{.}\mathsf{module}` -........................... - - -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Return :math:`f{.}\mathsf{module}`. - - -:math:`z{.}\mathsf{types}{}[x]` +:math:`(s, f){.}\mathsf{elems}` ............................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Return :math:`f{.}\mathsf{module}{.}\mathsf{types}{}[x]`. +1. Return :math:`s{.}\mathsf{elems}`. -:math:`z{.}\mathsf{funcs}{}[x]` +:math:`(s, f){.}\mathsf{datas}` ............................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Return :math:`s{.}\mathsf{funcs}{}[f{.}\mathsf{module}{.}\mathsf{funcs}{}[x]]`. - - -:math:`z{.}\mathsf{globals}{}[x]` -................................. +1. Return :math:`s{.}\mathsf{datas}`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){.}\mathsf{module}` +................................ -#. Return :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]`. +1. Return :math:`f{.}\mathsf{module}`. -:math:`z{.}\mathsf{tables}{}[x]` -................................ +:math:`(s, f){.}\mathsf{types}{}[x]` +.................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Return :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]`. +1. Return :math:`f{.}\mathsf{module}{.}\mathsf{types}{}[x]`. -:math:`z{.}\mathsf{mems}{}[x]` -.............................. +:math:`(s, f){.}\mathsf{funcs}{}[x]` +.................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +1. Return :math:`s{.}\mathsf{funcs}{}[f{.}\mathsf{module}{.}\mathsf{funcs}{}[x]]`. -#. Return :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]`. +:math:`(s, f){.}\mathsf{globals}{}[x]` +...................................... -:math:`z{.}\mathsf{elems}{}[x]` -............................... +1. Return :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Return :math:`s{.}\mathsf{elems}{}[f{.}\mathsf{module}{.}\mathsf{elems}{}[x]]`. +:math:`(s, f){.}\mathsf{tables}{}[x]` +..................................... -:math:`z{.}\mathsf{datas}{}[x]` -............................... +1. Return :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){.}\mathsf{mems}{}[x]` +................................... -#. Return :math:`s{.}\mathsf{datas}{}[f{.}\mathsf{module}{.}\mathsf{datas}{}[x]]`. +1. Return :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]`. -:math:`z{.}\mathsf{locals}{}[x]` -................................ +:math:`(s, f){.}\mathsf{elems}{}[x]` +.................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Return :math:`f{.}\mathsf{locals}{}[x]`. +1. Return :math:`s{.}\mathsf{elems}{}[f{.}\mathsf{module}{.}\mathsf{elems}{}[x]]`. -:math:`z{}[{.}\mathsf{locals}{}[x] = v]` -........................................ +:math:`(s, f){.}\mathsf{datas}{}[x]` +.................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +1. Return :math:`s{.}\mathsf{datas}{}[f{.}\mathsf{module}{.}\mathsf{datas}{}[x]]`. -#. Replace :math:`f{.}\mathsf{locals}{}[x]` with :math:`v`. +:math:`(s, f){.}\mathsf{locals}{}[x]` +..................................... -:math:`z{}[{.}\mathsf{globals}{}[x]{.}\mathsf{value} = v]` -.......................................................... +1. Return :math:`f{.}\mathsf{locals}{}[x]`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]{.}\mathsf{value}` with :math:`v`. +:math:`(s, f){}[{.}\mathsf{locals}{}[x] = v]` +............................................. -:math:`z{}[{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i] = r]` -............................................................. +1. Replace :math:`f{.}\mathsf{locals}{}[x]` with :math:`v`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){}[{.}\mathsf{globals}{}[x]{.}\mathsf{value} = v]` +............................................................... -#. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]{.}\mathsf{refs}{}[i]` with :math:`r`. +1. Replace :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]{.}\mathsf{value}` with :math:`v`. -:math:`z{}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]` -.................................................... +:math:`(s, f){}[{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i] = r]` +.................................................................. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]` with :math:`{\mathit{ti}}`. +1. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]{.}\mathsf{refs}{}[i]` with :math:`r`. -:math:`z{}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i : j] = {b^\ast}]` -....................................................................... +:math:`(s, f){}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]` +......................................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +1. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]` with :math:`{\mathit{ti}}`. -#. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]{.}\mathsf{bytes}{}[i : j]` with :math:`{b^\ast}`. +:math:`(s, f){}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i : j] = {b^\ast}]` +............................................................................ -:math:`z{}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]` -.................................................. +1. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]{.}\mathsf{bytes}{}[i : j]` with :math:`{b^\ast}`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]` with :math:`{\mathit{mi}}`. +:math:`(s, f){}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]` +....................................................... -:math:`z{}[{.}\mathsf{elems}{}[x]{.}\mathsf{refs} = {r^\ast}]` -.............................................................. +1. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]` with :math:`{\mathit{mi}}`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){}[{.}\mathsf{elems}{}[x]{.}\mathsf{refs} = {r^\ast}]` +................................................................... -#. Replace :math:`s{.}\mathsf{elems}{}[f{.}\mathsf{module}{.}\mathsf{elems}{}[x]]{.}\mathsf{refs}` with :math:`{r^\ast}`. +1. Replace :math:`s{.}\mathsf{elems}{}[f{.}\mathsf{module}{.}\mathsf{elems}{}[x]]{.}\mathsf{refs}` with :math:`{r^\ast}`. -:math:`z{}[{.}\mathsf{datas}{}[x]{.}\mathsf{bytes} = {b^\ast}]` -............................................................... +:math:`(s, f){}[{.}\mathsf{datas}{}[x]{.}\mathsf{bytes} = {b^\ast}]` +.................................................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`s{.}\mathsf{datas}{}[f{.}\mathsf{module}{.}\mathsf{datas}{}[x]]{.}\mathsf{bytes}` with :math:`{b^\ast}`. +1. Replace :math:`s{.}\mathsf{datas}{}[f{.}\mathsf{module}{.}\mathsf{datas}{}[x]]{.}\mathsf{bytes}` with :math:`{b^\ast}`. :math:`{\mathrm{growtable}}({\mathit{ti}}, n, r)` @@ -9912,25 +9829,25 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Let :math:`f_{\mathit{init}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~{\mathit{moduleinst}}_{\mathit{init}} \}\end{array}`. -#. Let :math:`z` be :math:`f_{\mathit{init}}`. +#. Let :math:`z` be :math:`(s, f_{\mathit{init}})`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~z~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{{\mathit{val}}^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}({\mathit{expr}}_{\mathsf{g}})^\ast}`. +#. Let :math:`{{\mathit{val}}^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{g}})^\ast}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~z~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{{{\mathit{ref}}^\ast}^\ast}` be :math:`{{{\mathrm{eval}}_{\mathit{expr}}({\mathit{expr}}_{\mathsf{e}})^\ast}^\ast}`. +#. Let :math:`{{{\mathit{ref}}^\ast}^\ast}` be :math:`{{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{e}})^\ast}^\ast}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. #. Let :math:`{\mathit{moduleinst}}` be :math:`{\mathrm{allocmodule}}(s, {\mathit{module}}, {{\mathit{externaddr}}^\ast}, {{\mathit{val}}^\ast}, {{{\mathit{ref}}^\ast}^\ast})`. #. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~{\mathit{moduleinst}} \}\end{array}`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. #. Execute the sequence :math:`{{\mathit{instr}}_{\mathsf{e}}^\ast}`. @@ -9938,7 +9855,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Execute the sequence :math:`{(\mathsf{call}~x)^?}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Return :math:`f{.}\mathsf{module}`. @@ -9949,15 +9866,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{exports}~\epsilon \}\end{array} \}\end{array}`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~(s, f)~\})` to the stack. -#. Let :math:`{t_1^{n}}~\rightarrow~{t_2^\ast}` be :math:`z{.}\mathsf{funcs}{}[{\mathit{fa}}]{.}\mathsf{type}`. +#. Let :math:`{t_1^{n}}~\rightarrow~{t_2^\ast}` be :math:`(s, f){.}\mathsf{funcs}{}[{\mathit{fa}}]{.}\mathsf{type}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Let :math:`k` be :math:`{|{t_2^\ast}|}`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. @@ -9965,7 +9882,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. @@ -11189,7 +11106,7 @@ Step_read/call_addr a 8. Assert: Due to validation, there are at least k values on the top of the stack. 9. Pop the values val^k from the stack. 10. Let f be { LOCALS: val^k :: $default_(t)*; MODULE: mm; }. -11. Push the evaluation context (FRAME_ n { f }) to the stack. +11. Push the frame (FRAME_ n { f }) to the stack. 12. Enter instr* with label (LABEL_ n { [] }). Step_read/ref.func x @@ -12381,102 +12298,83 @@ memsxa xv_u1* 4. Let [externaddr] :: xv* be xv_u1*. 5. Return $memsxa(xv*). -store z +store (s, f) 1. Return. -frame z -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f. +frame (s, f) +1. Return f. -funcaddr z -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.MODULE.FUNCS. +funcaddr (s, f) +1. Return f.MODULE.FUNCS. -funcinst z +funcinst (s, f) 1. Return s.FUNCS. -globalinst z +globalinst (s, f) 1. Return s.GLOBALS. -tableinst z +tableinst (s, f) 1. Return s.TABLES. -meminst z +meminst (s, f) 1. Return s.MEMS. -eleminst z +eleminst (s, f) 1. Return s.ELEMS. -datainst z +datainst (s, f) 1. Return s.DATAS. -moduleinst z -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.MODULE. +moduleinst (s, f) +1. Return f.MODULE. -type z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.MODULE.TYPES[x]. +type (s, f) x +1. Return f.MODULE.TYPES[x]. -func z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.FUNCS[f.MODULE.FUNCS[x]]. +func (s, f) x +1. Return s.FUNCS[f.MODULE.FUNCS[x]]. -global z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.GLOBALS[f.MODULE.GLOBALS[x]]. +global (s, f) x +1. Return s.GLOBALS[f.MODULE.GLOBALS[x]]. -table z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.TABLES[f.MODULE.TABLES[x]]. +table (s, f) x +1. Return s.TABLES[f.MODULE.TABLES[x]]. -mem z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.MEMS[f.MODULE.MEMS[x]]. +mem (s, f) x +1. Return s.MEMS[f.MODULE.MEMS[x]]. -elem z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.ELEMS[f.MODULE.ELEMS[x]]. +elem (s, f) x +1. Return s.ELEMS[f.MODULE.ELEMS[x]]. -data z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.DATAS[f.MODULE.DATAS[x]]. +data (s, f) x +1. Return s.DATAS[f.MODULE.DATAS[x]]. -local z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.LOCALS[x]. +local (s, f) x +1. Return f.LOCALS[x]. -with_local z x v -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace f.LOCALS[x] with v. +with_local (s, f) x v +1. Replace f.LOCALS[x] with v. -with_global z x v -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.GLOBALS[f.MODULE.GLOBALS[x]].VALUE with v. +with_global (s, f) x v +1. Replace s.GLOBALS[f.MODULE.GLOBALS[x]].VALUE with v. -with_table z x i r -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.TABLES[f.MODULE.TABLES[x]].REFS[i] with r. +with_table (s, f) x i r +1. Replace s.TABLES[f.MODULE.TABLES[x]].REFS[i] with r. -with_tableinst z x ti -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.TABLES[f.MODULE.TABLES[x]] with ti. +with_tableinst (s, f) x ti +1. Replace s.TABLES[f.MODULE.TABLES[x]] with ti. -with_mem z x i j b* -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.MEMS[f.MODULE.MEMS[x]].BYTES[i : j] with b*. +with_mem (s, f) x i j b* +1. Replace s.MEMS[f.MODULE.MEMS[x]].BYTES[i : j] with b*. -with_meminst z x mi -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.MEMS[f.MODULE.MEMS[x]] with mi. +with_meminst (s, f) x mi +1. Replace s.MEMS[f.MODULE.MEMS[x]] with mi. -with_elem z x r* -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.ELEMS[f.MODULE.ELEMS[x]].REFS with r*. +with_elem (s, f) x r* +1. Replace s.ELEMS[f.MODULE.ELEMS[x]].REFS with r*. -with_data z x b* -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.DATAS[f.MODULE.DATAS[x]].BYTES with b*. +with_data (s, f) x b* +1. Replace s.DATAS[f.MODULE.DATAS[x]].BYTES with b*. growtable ti n r 1. Let { TYPE: (([ i .. j ]) rt); REFS: r'*; } be ti. @@ -12729,33 +12627,33 @@ instantiate s module externaddr* 15. Let instr_E* be $concat_(instr, $runelem(elem*[i], i)^(i<n_E)). 16. Let moduleinst_init be { TYPES: functype*; FUNCS: $funcs(externaddr*) :: (|s.FUNCS| + i_F)^(i_F<n_F); GLOBALS: $globals(externaddr*); TABLES: []; MEMS: []; ELEMS: []; DATAS: []; EXPORTS: []; }. 17. Let f_init be { LOCALS: []; MODULE: moduleinst_init; }. -18. Let z be f_init. -19. Push the evaluation context (FRAME_ 0 { z }) to the stack. -20. Let [val]* be $eval_expr(expr_G)*. -21. Pop the evaluation context (FRAME_ 0 { _f }) from the stack. -22. Push the evaluation context (FRAME_ 0 { z }) to the stack. -23. Let [ref]** be $eval_expr(expr_E)**. -24. Pop the evaluation context (FRAME_ 0 { _f }) from the stack. +18. Let z be (s, f_init). +19. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +20. Let [val]* be $eval_expr(z, expr_G)*. +21. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. +22. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +23. Let [ref]** be $eval_expr(z, expr_E)**. +24. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. 25. Let moduleinst be $allocmodule(s, module, externaddr*, val*, ref**). 26. Let f be { LOCALS: []; MODULE: moduleinst; }. -27. Push the evaluation context (FRAME_ 0 { f }) to the stack. +27. Push the frame (FRAME_ 0 { f }) to the stack. 28. Execute the sequence (instr_E*). 29. Execute the sequence (instr_D*). 30. Execute the sequence ((CALL x)?). -31. Pop the evaluation context (FRAME_ 0 { f }) from the stack. +31. Pop the frame (FRAME_ 0 { f }) from the stack. 32. Return f.MODULE. invoke s fa val^n 1. Let f be { LOCALS: []; MODULE: { TYPES: []; FUNCS: []; GLOBALS: []; TABLES: []; MEMS: []; ELEMS: []; DATAS: []; EXPORTS: []; }; }. -2. Push the evaluation context (FRAME_ 0 { f }) to the stack. -3. Let t_1^n -> t_2* be $funcinst(z)[fa].TYPE. -4. Pop the evaluation context (FRAME_ 0 { _f }) from the stack. +2. Push the frame (FRAME_ 0 { (s, f) }) to the stack. +3. Let t_1^n -> t_2* be $funcinst((s, f))[fa].TYPE. +4. Pop the frame (FRAME_ 0 { _f }) from the stack. 5. Let k be |t_2*|. -6. Push the evaluation context (FRAME_ k { f }) to the stack. +6. Push the frame (FRAME_ k { f }) to the stack. 7. Push the values val^n to the stack. 8. Execute the instruction (CALL_ADDR fa). 9. Pop all values val* from the top of the stack. -10. Pop the evaluation context (FRAME_ k { f }) from the stack. +10. Pop the frame (FRAME_ k { f }) from the stack. 11. Push the values val* to the stack. 12. Pop the values val^k from the stack. 13. Return val^k. @@ -17367,7 +17265,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~{{\mathit{val}}^{n}}~{{{\mathrm{default}}}_{t}^\ast},\; \mathsf{module}~{\mathit{fi}}{.}\mathsf{module} \}\end{array}`. - #) Push the evaluation context :math:`({{\mathsf{frame}}_{m}}{\{}~f~\})` to the stack. + #) Push the frame :math:`({{\mathsf{frame}}_{m}}{\{}~f~\})` to the stack. #) Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{m}}{\{}~\epsilon~\})`. @@ -17536,7 +17434,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Pop the current :math:`\mathsf{handler}` context from the stack. - #. Push the evaluation context :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #. Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. #. Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. @@ -17576,7 +17474,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the evaluation context :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. @@ -17592,7 +17490,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the evaluation context :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. @@ -17604,7 +17502,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the evaluation context :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. @@ -17636,7 +17534,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the evaluation context :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. @@ -17669,7 +17567,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Pop the values :math:`{{\mathit{val}}^{m}}` from the stack. -#. Push the evaluation context :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}}^\ast}~\})` to the stack. +#. Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}}^\ast}~\})` to the stack. #. Enter :math:`{{\mathit{val}}^{m}}~{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{n}}{\{}~\epsilon~\})`. @@ -23556,293 +23454,253 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathrm{tags}}({{\mathit{xa}}^\ast})`. -:math:`z{.}\mathsf{store}` -.......................... +:math:`(s, f){.}\mathsf{store}` +............................... 1. Return. -:math:`z{.}\mathsf{frame}` -.......................... - - -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Return :math:`f`. +:math:`(s, f){.}\mathsf{frame}` +............................... -:math:`z{.}\mathsf{tags}` -......................... +1. Return :math:`f`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){.}\mathsf{tags}` +.............................. -#. Return :math:`f{.}\mathsf{module}{.}\mathsf{tags}`. +1. Return :math:`f{.}\mathsf{module}{.}\mathsf{tags}`. -:math:`z{.}\mathsf{module}` -........................... +:math:`(s, f){.}\mathsf{module}` +................................ -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Return :math:`f{.}\mathsf{module}`. +1. Return :math:`f{.}\mathsf{module}`. -:math:`z{.}\mathsf{funcs}` -.......................... +:math:`(s, f){.}\mathsf{funcs}` +............................... 1. Return :math:`s{.}\mathsf{funcs}`. -:math:`z{.}\mathsf{globals}` -............................ +:math:`(s, f){.}\mathsf{globals}` +................................. 1. Return :math:`s{.}\mathsf{globals}`. -:math:`z{.}\mathsf{tables}` -........................... +:math:`(s, f){.}\mathsf{tables}` +................................ 1. Return :math:`s{.}\mathsf{tables}`. -:math:`z{.}\mathsf{mems}` -......................... +:math:`(s, f){.}\mathsf{mems}` +.............................. 1. Return :math:`s{.}\mathsf{mems}`. -:math:`z{.}\mathsf{tags}` -......................... +:math:`(s, f){.}\mathsf{tags}` +.............................. 1. Return :math:`s{.}\mathsf{tags}`. -:math:`z{.}\mathsf{elems}` -.......................... +:math:`(s, f){.}\mathsf{elems}` +............................... 1. Return :math:`s{.}\mathsf{elems}`. -:math:`z{.}\mathsf{datas}` -.......................... +:math:`(s, f){.}\mathsf{datas}` +............................... 1. Return :math:`s{.}\mathsf{datas}`. -:math:`z{.}\mathsf{structs}` -............................ +:math:`(s, f){.}\mathsf{structs}` +................................. 1. Return :math:`s{.}\mathsf{structs}`. -:math:`z{.}\mathsf{arrays}` -........................... +:math:`(s, f){.}\mathsf{arrays}` +................................ 1. Return :math:`s{.}\mathsf{arrays}`. -:math:`z{.}\mathsf{exns}` -......................... +:math:`(s, f){.}\mathsf{exns}` +.............................. 1. Return :math:`s{.}\mathsf{exns}`. -:math:`z{.}\mathsf{types}{}[x]` -............................... - - -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Return :math:`f{.}\mathsf{module}{.}\mathsf{types}{}[x]`. - - -:math:`z{.}\mathsf{funcs}{}[x]` -............................... - - -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Return :math:`s{.}\mathsf{funcs}{}[f{.}\mathsf{module}{.}\mathsf{funcs}{}[x]]`. - - -:math:`z{.}\mathsf{globals}{}[x]` -................................. - - -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Return :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]`. - - -:math:`z{.}\mathsf{tables}{}[x]` -................................ +:math:`(s, f){.}\mathsf{types}{}[x]` +.................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +1. Return :math:`f{.}\mathsf{module}{.}\mathsf{types}{}[x]`. -#. Return :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]`. +:math:`(s, f){.}\mathsf{funcs}{}[x]` +.................................... -:math:`z{.}\mathsf{mems}{}[x]` -.............................. +1. Return :math:`s{.}\mathsf{funcs}{}[f{.}\mathsf{module}{.}\mathsf{funcs}{}[x]]`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Return :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]`. +:math:`(s, f){.}\mathsf{globals}{}[x]` +...................................... -:math:`z{.}\mathsf{tags}{}[x]` -.............................. +1. Return :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){.}\mathsf{tables}{}[x]` +..................................... -#. Return :math:`s{.}\mathsf{tags}{}[f{.}\mathsf{module}{.}\mathsf{tags}{}[x]]`. +1. Return :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]`. -:math:`z{.}\mathsf{elems}{}[x]` -............................... +:math:`(s, f){.}\mathsf{mems}{}[x]` +................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Return :math:`s{.}\mathsf{elems}{}[f{.}\mathsf{module}{.}\mathsf{elems}{}[x]]`. +1. Return :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]`. -:math:`z{.}\mathsf{datas}{}[x]` -............................... +:math:`(s, f){.}\mathsf{tags}{}[x]` +................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Return :math:`s{.}\mathsf{datas}{}[f{.}\mathsf{module}{.}\mathsf{datas}{}[x]]`. +1. Return :math:`s{.}\mathsf{tags}{}[f{.}\mathsf{module}{.}\mathsf{tags}{}[x]]`. -:math:`z{.}\mathsf{locals}{}[x]` -................................ +:math:`(s, f){.}\mathsf{elems}{}[x]` +.................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +1. Return :math:`s{.}\mathsf{elems}{}[f{.}\mathsf{module}{.}\mathsf{elems}{}[x]]`. -#. Return :math:`f{.}\mathsf{locals}{}[x]`. +:math:`(s, f){.}\mathsf{datas}{}[x]` +.................................... -:math:`z{}[{.}\mathsf{locals}{}[x] = v]` -........................................ +1. Return :math:`s{.}\mathsf{datas}{}[f{.}\mathsf{module}{.}\mathsf{datas}{}[x]]`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`f{.}\mathsf{locals}{}[x]` with :math:`v`. +:math:`(s, f){.}\mathsf{locals}{}[x]` +..................................... -:math:`z{}[{.}\mathsf{globals}{}[x]{.}\mathsf{value} = v]` -.......................................................... +1. Return :math:`f{.}\mathsf{locals}{}[x]`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){}[{.}\mathsf{locals}{}[x] = v]` +............................................. -#. Replace :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]{.}\mathsf{value}` with :math:`v`. +1. Replace :math:`f{.}\mathsf{locals}{}[x]` with :math:`v`. -:math:`z{}[{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i] = r]` -............................................................. +:math:`(s, f){}[{.}\mathsf{globals}{}[x]{.}\mathsf{value} = v]` +............................................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]{.}\mathsf{refs}{}[i]` with :math:`r`. +1. Replace :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]{.}\mathsf{value}` with :math:`v`. -:math:`z{}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]` -.................................................... +:math:`(s, f){}[{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i] = r]` +.................................................................. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +1. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]{.}\mathsf{refs}{}[i]` with :math:`r`. -#. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]` with :math:`{\mathit{ti}}`. +:math:`(s, f){}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]` +......................................................... -:math:`z{}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i : j] = {b^\ast}]` -....................................................................... +1. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]` with :math:`{\mathit{ti}}`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]{.}\mathsf{bytes}{}[i : j]` with :math:`{b^\ast}`. +:math:`(s, f){}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i : j] = {b^\ast}]` +............................................................................ -:math:`z{}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]` -.................................................. +1. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]{.}\mathsf{bytes}{}[i : j]` with :math:`{b^\ast}`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. - -#. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]` with :math:`{\mathit{mi}}`. +:math:`(s, f){}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]` +....................................................... -:math:`z{}[{.}\mathsf{elems}{}[x]{.}\mathsf{refs} = {r^\ast}]` -.............................................................. +1. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]` with :math:`{\mathit{mi}}`. -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. +:math:`(s, f){}[{.}\mathsf{elems}{}[x]{.}\mathsf{refs} = {r^\ast}]` +................................................................... -#. Replace :math:`s{.}\mathsf{elems}{}[f{.}\mathsf{module}{.}\mathsf{elems}{}[x]]{.}\mathsf{refs}` with :math:`{r^\ast}`. +1. Replace :math:`s{.}\mathsf{elems}{}[f{.}\mathsf{module}{.}\mathsf{elems}{}[x]]{.}\mathsf{refs}` with :math:`{r^\ast}`. -:math:`z{}[{.}\mathsf{datas}{}[x]{.}\mathsf{bytes} = {b^\ast}]` -............................................................... +:math:`(s, f){}[{.}\mathsf{datas}{}[x]{.}\mathsf{bytes} = {b^\ast}]` +.................................................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~f~\})` be the current :math:`\mathsf{frame}` context. -#. Replace :math:`s{.}\mathsf{datas}{}[f{.}\mathsf{module}{.}\mathsf{datas}{}[x]]{.}\mathsf{bytes}` with :math:`{b^\ast}`. +1. Replace :math:`s{.}\mathsf{datas}{}[f{.}\mathsf{module}{.}\mathsf{datas}{}[x]]{.}\mathsf{bytes}` with :math:`{b^\ast}`. -:math:`z{}[{.}\mathsf{structs}{}[a]{.}\mathsf{fields}{}[i] = {\mathit{fv}}]` -............................................................................ +:math:`(s, f){}[{.}\mathsf{structs}{}[a]{.}\mathsf{fields}{}[i] = {\mathit{fv}}]` +................................................................................. 1. Replace :math:`s{.}\mathsf{structs}{}[a]{.}\mathsf{fields}{}[i]` with :math:`{\mathit{fv}}`. -:math:`z{}[{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i] = {\mathit{fv}}]` -........................................................................... +:math:`(s, f){}[{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i] = {\mathit{fv}}]` +................................................................................ 1. Replace :math:`s{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i]` with :math:`{\mathit{fv}}`. -:math:`z{}[{.}\mathsf{structs} \mathrel{{=}{\oplus}} {{\mathit{si}}^\ast}]` -........................................................................... +:math:`(s, f){}[{.}\mathsf{structs} \mathrel{{=}{\oplus}} {{\mathit{si}}^\ast}]` +................................................................................ 1. Append :math:`{{\mathit{si}}^\ast}` to :math:`s{.}\mathsf{structs}`. -:math:`z{}[{.}\mathsf{arrays} \mathrel{{=}{\oplus}} {{\mathit{ai}}^\ast}]` -.......................................................................... +:math:`(s, f){}[{.}\mathsf{arrays} \mathrel{{=}{\oplus}} {{\mathit{ai}}^\ast}]` +............................................................................... 1. Append :math:`{{\mathit{ai}}^\ast}` to :math:`s{.}\mathsf{arrays}`. -:math:`z{}[{.}\mathsf{exns} \mathrel{{=}{\oplus}} {{\mathit{exn}}^\ast}]` -......................................................................... +:math:`(s, f){}[{.}\mathsf{exns} \mathrel{{=}{\oplus}} {{\mathit{exn}}^\ast}]` +.............................................................................. 1. Append :math:`{{\mathit{exn}}^\ast}` to :math:`s{.}\mathsf{exns}`. @@ -24349,9 +24207,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i ........................................................................................................................................................... -1. Let :math:`({\mathsf{frame}}_{}\,\{~z~\})` be the current :math:`\mathsf{frame}` context. - -#. If :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{e_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: +1. If :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{e_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: a. Return :math:`\epsilon`. @@ -24363,15 +24219,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`{\mathit{gt}}~{{\mathit{gt}'}^\ast}` be :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. -#. Let :math:`f` be :math:`z`. +#. Let :math:`(s, f)` be :math:`z`. -#. Let :math:`{\mathit{val}}` be :math:`{\mathrm{eval}}_{\mathit{expr}}({\mathit{expr}})`. +#. Let :math:`{\mathit{val}}` be :math:`{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}})`. #. Let :math:`a` be :math:`{\mathrm{allocglobal}}(s, {\mathit{gt}}, {\mathit{val}})`. #. Append :math:`a` to :math:`f{.}\mathsf{module}{.}\mathsf{globals}`. -#. Let :math:`{{\mathit{val}'}^\ast}` be :math:`{{{\mathrm{evalglobal}}^\ast}}{(z, {{\mathit{gt}'}^\ast}, {{\mathit{expr}'}^\ast})}`. +#. Let :math:`{{\mathit{val}'}^\ast}` be :math:`{{{\mathrm{evalglobal}}^\ast}}{((s, f), {{\mathit{gt}'}^\ast}, {{\mathit{expr}'}^\ast})}`. #. Return :math:`{\mathit{val}}~{{\mathit{val}'}^\ast}`. @@ -24426,31 +24282,31 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`{{\mathit{instr}}_{\mathsf{s}}^?}` be :math:`{(\mathsf{call}~x)^?}`. -#. Let :math:`z` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~{\mathit{moduleinst}}_0 \}\end{array}`. +#. Let :math:`z` be :math:`(s, \{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~{\mathit{moduleinst}}_0 \}\end{array})`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~z~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. #. Let :math:`{{\mathit{val}}_{\mathsf{g}}^\ast}` be :math:`{{{\mathrm{evalglobal}}^\ast}}{(z, {{\mathit{globaltype}}^\ast}, {{\mathit{expr}}_{\mathsf{g}}^\ast})}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~{z'}~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~{z'}~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` to the stack. -#. Let :math:`{{\mathit{ref}}_{\mathsf{t}}^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}({\mathit{expr}}_{\mathsf{t}})^\ast}`. +#. Let :math:`{{\mathit{ref}}_{\mathsf{t}}^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{t}})^\ast}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~{z'}~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` to the stack. -#. Let :math:`{{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast}` be :math:`{{{\mathrm{eval}}_{\mathit{expr}}({\mathit{expr}}_{\mathsf{e}})^\ast}^\ast}`. +#. Let :math:`{{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast}` be :math:`{{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{e}})^\ast}^\ast}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. #. Let :math:`{\mathit{moduleinst}}` be :math:`{\mathrm{allocmodule}}(s, {\mathit{module}}, {{\mathit{externaddr}}^\ast}, {{\mathit{val}}_{\mathsf{g}}^\ast}, {{\mathit{ref}}_{\mathsf{t}}^\ast}, {{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast})`. #. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~{\mathit{moduleinst}} \}\end{array}`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. #. Execute the sequence :math:`{{\mathit{instr}}_{\mathsf{e}}^\ast}`. @@ -24458,7 +24314,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Execute the sequence :math:`{{\mathit{instr}}_{\mathsf{s}}^?}`. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Return :math:`f{.}\mathsf{module}`. @@ -24487,7 +24343,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`k` be :math:`{|{t_2^\ast}|}`. -#. Push the evaluation context :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. +#. Push the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. @@ -24497,7 +24353,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. -#. Pop the evaluation context :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. +#. Pop the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. @@ -24506,8 +24362,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{{\mathit{val}}^{k}}`. -:math:`{{{\mathrm{allocX}}^\ast}}{({\mathit{TODO}}, {X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}, {Y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast})}` -......................................................................................................................................................... +:math:`{{{\mathrm{allocX}}^\ast}}{(s, {X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}, {Y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast})}` +........................................................................................................................................... 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: @@ -24524,9 +24380,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`Y~{{Y'}^\ast}` be :math:`{Y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Let :math:`a` be :math:`{\mathrm{allocX}}(s, {\mathit{TODO}}, {\mathit{TODO}}, X, Y)`. + #. Let :math:`a` be :math:`{\mathrm{allocX}}({\mathit{TODO}}, {\mathit{TODO}}, s, X, Y)`. - #. Let :math:`{{a'}^\ast}` be :math:`{{{\mathrm{allocX}}^\ast}}{({\mathit{TODO}}, {{X'}^\ast}, {{Y'}^\ast})}`. + #. Let :math:`{{a'}^\ast}` be :math:`{{{\mathrm{allocX}}^\ast}}{(s, {{X'}^\ast}, {{Y'}^\ast})}`. #. Return :math:`a~{{a'}^\ast}`. @@ -26879,7 +26735,7 @@ Step_read/call_ref yy e) Assert: Due to validation, there are at least n values on the top of the stack. f) Pop the values val^n from the stack. g) Let f be { LOCALS: ?(val)^n :: $default_(t)*; MODULE: fi.MODULE; }. - h) Push the evaluation context (FRAME_ m { f }) to the stack. + h) Push the frame (FRAME_ m { f }) to the stack. i) Enter instr* with label (LABEL_ m { [] }). Step_read/return_call x @@ -26960,7 +26816,7 @@ Step_read/throw_ref c) Else if catch_0 is not of the case CATCH_ALL_REF, then: 1. Let [catch] :: catch'* be catch_u1*. 2. Pop the current HANDLER_ context from the stack. - 3. Push the evaluation context (HANDLER_ n { catch'* }) to the stack. + 3. Push the handler (HANDLER_ n { catch'* }) to the stack. 4. Push the value (REF.EXN_ADDR a) to the stack. 5. Execute the instruction THROW_REF. d) Else: @@ -26980,7 +26836,7 @@ Step_read/throw_ref 3. Else: a. Let [catch] :: catch'* be catch_u1*. b. Pop the current HANDLER_ context from the stack. - c. Push the evaluation context (HANDLER_ n { catch'* }) to the stack. + c. Push the handler (HANDLER_ n { catch'* }) to the stack. d. Push the value (REF.EXN_ADDR a) to the stack. e. Execute the instruction THROW_REF. d) Else if catch_0 is of the case CATCH_REF, then: @@ -26988,13 +26844,13 @@ Step_read/throw_ref 2. If (x >= |$tagaddr(z)|), then: a. Let [catch] :: catch'* be catch_u1*. b. Pop the current HANDLER_ context from the stack. - c. Push the evaluation context (HANDLER_ n { catch'* }) to the stack. + c. Push the handler (HANDLER_ n { catch'* }) to the stack. d. Push the value (REF.EXN_ADDR a) to the stack. e. Execute the instruction THROW_REF. 3. Else if ($exninst(z)[a].TAG =/= $tagaddr(z)[x]), then: a. Let [catch] :: catch'* be catch_u1*. b. Pop the current HANDLER_ context from the stack. - c. Push the evaluation context (HANDLER_ n { catch'* }) to the stack. + c. Push the handler (HANDLER_ n { catch'* }) to the stack. d. Push the value (REF.EXN_ADDR a) to the stack. e. Execute the instruction THROW_REF. 4. Else: @@ -27009,7 +26865,7 @@ Step_read/throw_ref f) Else if catch_0 is not of the case CATCH_ALL_REF, then: 1. Let [catch] :: catch'* be catch_u1*. 2. Pop the current HANDLER_ context from the stack. - 3. Push the evaluation context (HANDLER_ n { catch'* }) to the stack. + 3. Push the handler (HANDLER_ n { catch'* }) to the stack. 4. Push the value (REF.EXN_ADDR a) to the stack. 5. Execute the instruction THROW_REF. g) Else: @@ -27025,7 +26881,7 @@ Step_read/try_table bt catch* instr* 2. Let t_1^m -> t_2^n be $blocktype_(z, bt). 3. Assert: Due to validation, there are at least m values on the top of the stack. 4. Pop the values val^m from the stack. -5. Push the evaluation context (HANDLER_ n { catch* }) to the stack. +5. Push the handler (HANDLER_ n { catch* }) to the stack. 6. Enter val^m :: instr* with label (LABEL_ n { [] }). Step_read/ref.null (_IDX x) @@ -29806,132 +29662,112 @@ tagsxa xa_u1* 4. Let [externaddr] :: xa* be xa_u1*. 5. Return $tagsxa(xa*). -store z +store (s, f) 1. Return. -frame z -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f. +frame (s, f) +1. Return f. -tagaddr z -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.MODULE.TAGS. +tagaddr (s, f) +1. Return f.MODULE.TAGS. -moduleinst z -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.MODULE. +moduleinst (s, f) +1. Return f.MODULE. -funcinst z +funcinst (s, f) 1. Return s.FUNCS. -globalinst z +globalinst (s, f) 1. Return s.GLOBALS. -tableinst z +tableinst (s, f) 1. Return s.TABLES. -meminst z +meminst (s, f) 1. Return s.MEMS. -taginst z +taginst (s, f) 1. Return s.TAGS. -eleminst z +eleminst (s, f) 1. Return s.ELEMS. -datainst z +datainst (s, f) 1. Return s.DATAS. -structinst z +structinst (s, f) 1. Return s.STRUCTS. -arrayinst z +arrayinst (s, f) 1. Return s.ARRAYS. -exninst z +exninst (s, f) 1. Return s.EXNS. -type z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.MODULE.TYPES[x]. +type (s, f) x +1. Return f.MODULE.TYPES[x]. -func z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.FUNCS[f.MODULE.FUNCS[x]]. +func (s, f) x +1. Return s.FUNCS[f.MODULE.FUNCS[x]]. -global z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.GLOBALS[f.MODULE.GLOBALS[x]]. +global (s, f) x +1. Return s.GLOBALS[f.MODULE.GLOBALS[x]]. -table z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.TABLES[f.MODULE.TABLES[x]]. +table (s, f) x +1. Return s.TABLES[f.MODULE.TABLES[x]]. -mem z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.MEMS[f.MODULE.MEMS[x]]. +mem (s, f) x +1. Return s.MEMS[f.MODULE.MEMS[x]]. -tag z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.TAGS[f.MODULE.TAGS[x]]. +tag (s, f) x +1. Return s.TAGS[f.MODULE.TAGS[x]]. -elem z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.ELEMS[f.MODULE.ELEMS[x]]. +elem (s, f) x +1. Return s.ELEMS[f.MODULE.ELEMS[x]]. -data z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return s.DATAS[f.MODULE.DATAS[x]]. +data (s, f) x +1. Return s.DATAS[f.MODULE.DATAS[x]]. -local z x -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Return f.LOCALS[x]. +local (s, f) x +1. Return f.LOCALS[x]. -with_local z x v -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace f.LOCALS[x] with ?(v). +with_local (s, f) x v +1. Replace f.LOCALS[x] with ?(v). -with_global z x v -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.GLOBALS[f.MODULE.GLOBALS[x]].VALUE with v. +with_global (s, f) x v +1. Replace s.GLOBALS[f.MODULE.GLOBALS[x]].VALUE with v. -with_table z x i r -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.TABLES[f.MODULE.TABLES[x]].REFS[i] with r. +with_table (s, f) x i r +1. Replace s.TABLES[f.MODULE.TABLES[x]].REFS[i] with r. -with_tableinst z x ti -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.TABLES[f.MODULE.TABLES[x]] with ti. +with_tableinst (s, f) x ti +1. Replace s.TABLES[f.MODULE.TABLES[x]] with ti. -with_mem z x i j b* -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.MEMS[f.MODULE.MEMS[x]].BYTES[i : j] with b*. +with_mem (s, f) x i j b* +1. Replace s.MEMS[f.MODULE.MEMS[x]].BYTES[i : j] with b*. -with_meminst z x mi -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.MEMS[f.MODULE.MEMS[x]] with mi. +with_meminst (s, f) x mi +1. Replace s.MEMS[f.MODULE.MEMS[x]] with mi. -with_elem z x r* -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.ELEMS[f.MODULE.ELEMS[x]].REFS with r*. +with_elem (s, f) x r* +1. Replace s.ELEMS[f.MODULE.ELEMS[x]].REFS with r*. -with_data z x b* -1. Let (FRAME_ _ { f }) be the current FRAME_ context. -2. Replace s.DATAS[f.MODULE.DATAS[x]].BYTES with b*. +with_data (s, f) x b* +1. Replace s.DATAS[f.MODULE.DATAS[x]].BYTES with b*. -with_struct z a i fv +with_struct (s, f) a i fv 1. Replace s.STRUCTS[a].FIELDS[i] with fv. -with_array z a i fv +with_array (s, f) a i fv 1. Replace s.ARRAYS[a].FIELDS[i] with fv. -add_structinst z si* +add_structinst (s, f) si* 1. Append si* to the s.STRUCTS. -add_arrayinst z ai* +add_arrayinst (s, f) ai* 1. Append ai* to the s.ARRAYS. -add_exninst z exn* +add_exninst (s, f) exn* 1. Append exn* to the s.EXNS. growtable tableinst n r @@ -30172,19 +30008,18 @@ rundata_ x (DATA b^n datamode_u1) 4. Return instr* :: [(I32.CONST 0), (I32.CONST n), (MEMORY.INIT y x), (DATA.DROP x)]. evalglobals z gt_u1* e_u1* -1. Let (FRAME_ _ { z }) be the current FRAME_ context. -2. If ((gt_u1* = []) /\ (e_u1* = [])), then: +1. If ((gt_u1* = []) /\ (e_u1* = [])), then: a. Return []. -3. Assert: Due to validation, (|e_u1*| >= 1). -4. Let [expr] :: expr'* be e_u1*. -5. Assert: Due to validation, (|gt_u1*| >= 1). -6. Let [gt] :: gt'* be gt_u1*. -7. Let f be z. -8. Let [val] be $eval_expr(expr). -9. Let a be $allocglobal(s, gt, val). -10. Append a to the f.MODULE.GLOBALS. -11. Let val'* be $evalglobals(z, gt'*, expr'*). -12. Return [val] :: val'*. +2. Assert: Due to validation, (|e_u1*| >= 1). +3. Let [expr] :: expr'* be e_u1*. +4. Assert: Due to validation, (|gt_u1*| >= 1). +5. Let [gt] :: gt'* be gt_u1*. +6. Let (s, f) be z. +7. Let [val] be $eval_expr(z, expr). +8. Let a be $allocglobal(s, gt, val). +9. Append a to the f.MODULE.GLOBALS. +10. Let val'* be $evalglobals((s, f), gt'*, expr'*). +11. Return [val] :: val'*. instantiate s module externaddr* 1. Let xt_I* -> xt_E* be $Module_ok(module). @@ -30205,23 +30040,23 @@ instantiate s module externaddr* 15. Assert: Due to validation, elem is of the case ELEM*. 16. Let (ELEM reftype expr_E* elemmode)* be elem*. 17. Let instr_S? be (CALL x)?. -18. Let z be { LOCALS: []; MODULE: moduleinst_0; }. -19. Push the evaluation context (FRAME_ 0 { z }) to the stack. +18. Let z be (s, { LOCALS: []; MODULE: moduleinst_0; }). +19. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. 20. Let val_G* be $evalglobals(z, globaltype*, expr_G*). -21. Pop the evaluation context (FRAME_ 0 { z' }) from the stack. -22. Push the evaluation context (FRAME_ 0 { z' }) to the stack. -23. Let [ref_T]* be $eval_expr(expr_T)*. -24. Pop the evaluation context (FRAME_ 0 { _f }) from the stack. -25. Push the evaluation context (FRAME_ 0 { z' }) to the stack. -26. Let [ref_E]** be $eval_expr(expr_E)**. -27. Pop the evaluation context (FRAME_ 0 { _f }) from the stack. +21. Pop the frame (FRAME_ 0 { f' }) from the stack. +22. Push the frame (FRAME_ 0 { f' }) to the stack. +23. Let [ref_T]* be $eval_expr(z, expr_T)*. +24. Pop the frame (FRAME_ 0 { f' }) from the stack. +25. Push the frame (FRAME_ 0 { f' }) to the stack. +26. Let [ref_E]** be $eval_expr(z, expr_E)**. +27. Pop the frame (FRAME_ 0 { f' }) from the stack. 28. Let moduleinst be $allocmodule(s, module, externaddr*, val_G*, ref_T*, ref_E**). 29. Let f be { LOCALS: []; MODULE: moduleinst; }. -30. Push the evaluation context (FRAME_ 0 { f }) to the stack. +30. Push the frame (FRAME_ 0 { f }) to the stack. 31. Execute the sequence (instr_E*). 32. Execute the sequence (instr_D*). 33. Execute the sequence (instr_S?). -34. Pop the evaluation context (FRAME_ 0 { f }) from the stack. +34. Pop the frame (FRAME_ 0 { f }) from the stack. 35. Return f.MODULE. invoke s funcaddr val* @@ -30232,17 +30067,17 @@ invoke s funcaddr val* 5. If not $Val_type(val, t_1)*, then: a. Fail. 6. Let k be |t_2*|. -7. Push the evaluation context (FRAME_ k { f }) to the stack. +7. Push the frame (FRAME_ k { f }) to the stack. 8. Push the values val* to the stack. 9. Push the value (REF.FUNC_ADDR funcaddr) to the stack. 10. Execute the instruction (CALL_REF s.FUNCS[funcaddr].TYPE). 11. Pop all values val* from the top of the stack. -12. Pop the evaluation context (FRAME_ k { f }) from the stack. +12. Pop the frame (FRAME_ k { f }) from the stack. 13. Push the values val* to the stack. 14. Pop the values val^k from the stack. 15. Return val^k. -allocXs s X Y X_u1* Y_u1* +allocXs X Y s X_u1* Y_u1* 1. If (X_u1* = []), then: a. Assert: Due to validation, (Y_u1* = []). b. Return []. @@ -30250,8 +30085,8 @@ allocXs s X Y X_u1* Y_u1* a. Let [X] :: X'* be X_u1*. b. Assert: Due to validation, (|Y_u1*| >= 1). c. Let [Y] :: Y'* be Y_u1*. - d. Let a be $allocX(s, X, Y, X, Y). - e. Let a'* be $allocXs(s, X, Y, X'*, Y'*). + d. Let a be $allocX(X, Y, s, X, Y). + e. Let a'* be $allocXs(X, Y, s, X'*, Y'*). f. Return [a] :: a'*. var X From 3edf90f3cffc4184baa327aca9d8e5192ed7e5aa Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Thu, 9 Jan 2025 16:47:51 +0900 Subject: [PATCH 05/12] Eval_expr render fix --- spectec/src/backend-prose/render.ml | 27 ++++++++++++++++-------- spectec/src/il2al/translate.ml | 2 +- spectec/test-prose/TEST.md | 32 ++++++++++++++--------------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/spectec/src/backend-prose/render.ml b/spectec/src/backend-prose/render.ml index 64d806ba8a..743b434811 100644 --- a/spectec/src/backend-prose/render.ml +++ b/spectec/src/backend-prose/render.ml @@ -479,14 +479,25 @@ and render_expr' env expr = (match dir with | Al.Ast.Front -> sprintf "%s with %s prepended by %s" se1 sps se2 | Al.Ast.Back -> sprintf "%s with %s appended by %s" se1 sps se2) - | Al.Ast.CallE (_, al) -> - let args = List.map (render_arg env) al in - (match args with - | [arg1; arg2] -> - arg1 ^ " is :ref:`valid <valid-val>` with type " ^ arg2 - | [arg] -> "the type of " ^ arg - | _ -> error expr.at "Invalid arity for relation call"; - ) + | Al.Ast.CallE (id, al) -> + (* HARDCODE: relation call *) + if id = "Eval_expr" then + let args = List.map (render_arg env) al in + (match args with + | [z; expr] -> + "the result of :ref:`evaluating <exec-expr>` " ^ expr ^ " with state " ^ z + | [arg] -> "the type of " ^ arg + | _ -> error expr.at "Invalid arity for relation call"; + ) + else if String.ends_with ~suffix:"_type" id || String.ends_with ~suffix:"_ok" id then + let args = List.map (render_arg env) al in + (match args with + | [arg1; arg2] -> + arg1 ^ " is :ref:`valid <valid-val>` with type " ^ arg2 + | [arg] -> "the type of " ^ arg + | _ -> error expr.at "Invalid arity for relation call"; + ) + else error expr.at ("Not supported relation call: " ^ id); | Al.Ast.InvCallE (id, nl, al) -> let e = if id = "lsizenn" || id = "lsizenn1" || id = "lsizenn2" then Al.Al_util.varE "N" ~note:Al.Al_util.no_note diff --git a/spectec/src/il2al/translate.ml b/spectec/src/il2al/translate.ml index f6b5e7cb1d..18ccd4c63d 100644 --- a/spectec/src/il2al/translate.ml +++ b/spectec/src/il2al/translate.ml @@ -879,7 +879,7 @@ let translate_rulepr id exp = (* Note: State is automatically converted into frame by remove_state *) (* Note: Push/pop is automatically inserted by handle_frame *) let lhs = tupE [z'; vs] ~at:(over_region [z'.at; vs.at]) ~note:vs.note in - let rhs = callE ("eval_expr", [ expA z; expA is ]) ~note:vs.note in + let rhs = callE ("Eval_expr", [ expA z; expA is ]) ~note:vs.note in [ letI (lhs, rhs) ~at ] (* ".*_sub" *) | name, [_C; rt1; rt2] diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index e867998d4f..b495070527 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -2787,19 +2787,19 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{d}})^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{d}})^\ast}`. +#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{d}})^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{d}}` in :math:`{{\mathit{expr}}_{\mathsf{d}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{d}}` with state :math:`z`. #. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. #. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{e}})^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{e}})^\ast}`. +#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{e}})^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{e}}` in :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{e}}` with state :math:`z`. #. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. #. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{{\mathit{val}}^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{g}})^\ast}`. +#. Let :math:`{{\mathit{val}}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{g}}` in :math:`{{\mathit{expr}}_{\mathsf{g}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{g}}` with state :math:`z`. #. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. @@ -4216,13 +4216,13 @@ instantiate s module externaddr* 15. Let f_init be { LOCALS: []; MODULE: moduleinst_init; }. 16. Let z be (s, f_init). 17. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. -18. Let [(I32.CONST i_D)]* be $eval_expr(z, expr_D)*. +18. Let [(I32.CONST i_D)]* be $Eval_expr(z, expr_D)*. 19. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. 20. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. -21. Let [(I32.CONST i_E)]* be $eval_expr(z, expr_E)*. +21. Let [(I32.CONST i_E)]* be $Eval_expr(z, expr_E)*. 22. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. 23. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. -24. Let [val]* be $eval_expr(z, expr_G)*. +24. Let [val]* be $Eval_expr(z, expr_G)*. 25. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. 26. Let moduleinst be $allocmodule(s, module, externaddr*, val*). 27. Let f be { LOCALS: []; MODULE: moduleinst; }. @@ -9833,13 +9833,13 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{{\mathit{val}}^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{g}})^\ast}`. +#. Let :math:`{{\mathit{val}}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{g}}` in :math:`{{\mathit{expr}}_{\mathsf{g}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{g}}` with state :math:`z`. #. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. #. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{{{\mathit{ref}}^\ast}^\ast}` be :math:`{{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{e}})^\ast}^\ast}`. +#. Let :math:`{{{\mathit{ref}}^\ast}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{e*}}` in :math:`{{\mathit{expr}}_{\mathsf{e*}}^\ast}`, for all :math:`{\mathit{expr}}_{\mathsf{e}}` in :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{e}}` with state :math:`z`. #. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. @@ -12629,10 +12629,10 @@ instantiate s module externaddr* 17. Let f_init be { LOCALS: []; MODULE: moduleinst_init; }. 18. Let z be (s, f_init). 19. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. -20. Let [val]* be $eval_expr(z, expr_G)*. +20. Let [val]* be $Eval_expr(z, expr_G)*. 21. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. 22. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. -23. Let [ref]** be $eval_expr(z, expr_E)**. +23. Let [ref]** be $Eval_expr(z, expr_E)**. 24. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. 25. Let moduleinst be $allocmodule(s, module, externaddr*, val*, ref**). 26. Let f be { LOCALS: []; MODULE: moduleinst; }. @@ -24221,7 +24221,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`(s, f)` be :math:`z`. -#. Let :math:`{\mathit{val}}` be :math:`{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}})`. +#. Let :math:`{\mathit{val}}` be the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}` with state :math:`z`. #. Let :math:`a` be :math:`{\mathrm{allocglobal}}(s, {\mathit{gt}}, {\mathit{val}})`. @@ -24292,13 +24292,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` to the stack. -#. Let :math:`{{\mathit{ref}}_{\mathsf{t}}^\ast}` be :math:`{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{t}})^\ast}`. +#. Let :math:`{{\mathit{ref}}_{\mathsf{t}}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{t}}` in :math:`{{\mathit{expr}}_{\mathsf{t}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{t}}` with state :math:`z`. #. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. #. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` to the stack. -#. Let :math:`{{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast}` be :math:`{{{\mathrm{eval}}_{\mathit{expr}}(z, {\mathit{expr}}_{\mathsf{e}})^\ast}^\ast}`. +#. Let :math:`{{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{e*}}` in :math:`{{\mathit{expr}}_{\mathsf{e*}}^\ast}`, for all :math:`{\mathit{expr}}_{\mathsf{e}}` in :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{e}}` with state :math:`z`. #. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. @@ -30015,7 +30015,7 @@ evalglobals z gt_u1* e_u1* 4. Assert: Due to validation, (|gt_u1*| >= 1). 5. Let [gt] :: gt'* be gt_u1*. 6. Let (s, f) be z. -7. Let [val] be $eval_expr(z, expr). +7. Let [val] be $Eval_expr(z, expr). 8. Let a be $allocglobal(s, gt, val). 9. Append a to the f.MODULE.GLOBALS. 10. Let val'* be $evalglobals((s, f), gt'*, expr'*). @@ -30045,10 +30045,10 @@ instantiate s module externaddr* 20. Let val_G* be $evalglobals(z, globaltype*, expr_G*). 21. Pop the frame (FRAME_ 0 { f' }) from the stack. 22. Push the frame (FRAME_ 0 { f' }) to the stack. -23. Let [ref_T]* be $eval_expr(z, expr_T)*. +23. Let [ref_T]* be $Eval_expr(z, expr_T)*. 24. Pop the frame (FRAME_ 0 { f' }) from the stack. 25. Push the frame (FRAME_ 0 { f' }) to the stack. -26. Let [ref_E]** be $eval_expr(z, expr_E)**. +26. Let [ref_E]** be $Eval_expr(z, expr_E)**. 27. Pop the frame (FRAME_ 0 { f' }) from the stack. 28. Let moduleinst be $allocmodule(s, module, externaddr*, val_G*, ref_T*, ref_E**). 29. Let f be { LOCALS: []; MODULE: moduleinst; }. From 201be941efa8872804c946a46b3070c1830b88bb Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Fri, 10 Jan 2025 15:07:30 +0900 Subject: [PATCH 06/12] concat_ render fix --- spectec/src/backend-prose/render.ml | 60 +- spectec/src/il2al/manual.ml | 4 +- spectec/test-prose/TEST.md | 7502 +++++++++++++-------------- 3 files changed, 3787 insertions(+), 3779 deletions(-) diff --git a/spectec/src/backend-prose/render.ml b/spectec/src/backend-prose/render.ml index 743b434811..875eafd7a2 100644 --- a/spectec/src/backend-prose/render.ml +++ b/spectec/src/backend-prose/render.ml @@ -28,7 +28,7 @@ let env config inputs outputs render_latex : env = (* Helpers *) -let indent = " " +let indent = " " let rec repeat str num = if num = 0 then "" @@ -215,25 +215,25 @@ and al_to_el_expr expr = | Some _ -> None | _ -> - let elid = id $ no_region in - let* elal = al_to_el_args al in - (* Unwrap parenthsized args *) - let elal = List.map - (fun elarg -> - let elarg = match elarg with - | El.Ast.ExpA exp -> - let exp = match exp.it with - | ParenE exp' -> exp' - | _ -> exp + let elid = id $ no_region in + let* elal = al_to_el_args al in + (* Unwrap parenthsized args *) + let elal = List.map + (fun elarg -> + let elarg = match elarg with + | El.Ast.ExpA exp -> + let exp = match exp.it with + | ParenE exp' -> exp' + | _ -> exp + in + El.Ast.ExpA exp + | _ -> elarg in - El.Ast.ExpA exp - | _ -> elarg - in - (ref elarg) $ no_region - ) - elal - in - Some (El.Ast.CallE (elid, elal)) + (ref elarg) $ no_region + ) + elal + in + Some (El.Ast.CallE (elid, elal)) ) | Al.Ast.CatE (e1, e2) -> let* ele1 = al_to_el_expr e1 in @@ -481,16 +481,16 @@ and render_expr' env expr = | Al.Ast.Back -> sprintf "%s with %s appended by %s" se1 sps se2) | Al.Ast.CallE (id, al) -> (* HARDCODE: relation call *) + let args = List.map (render_arg env) al in if id = "Eval_expr" then - let args = List.map (render_arg env) al in (match args with | [z; expr] -> "the result of :ref:`evaluating <exec-expr>` " ^ expr ^ " with state " ^ z - | [arg] -> "the type of " ^ arg - | _ -> error expr.at "Invalid arity for relation call"; + | [instrs] -> + "the result of :ref:`evaluating <exec-expr>` " ^ instrs + | _ -> error expr.at (Printf.sprintf "Invalid arity for relation call: %d ([ %s ])" (List.length args) (String.concat " " args)); ) else if String.ends_with ~suffix:"_type" id || String.ends_with ~suffix:"_ok" id then - let args = List.map (render_arg env) al in (match args with | [arg1; arg2] -> arg1 ^ " is :ref:`valid <valid-val>` with type " ^ arg2 @@ -670,7 +670,7 @@ and render_paths env paths = let spaths = List.map (render_path env) paths in String.concat " of " spaths -let typs = ref Map.empty + let typs = ref Map.empty let init_typs () = typs := Map.empty let render_expr_with_type env e = let s = render_expr env e in @@ -970,8 +970,8 @@ let rec render_instr env algoname index depth instr = (render_expr env elhs) (render_math "=") (render_expr env erhs) - | Al.Ast.LetI (n, ({ it = Al.Ast.CallE (id, [{ it = ExpA arge; _ }]); _ } as e)) - when Option.is_some (Prose_util.find_relation id) -> + | Al.Ast.LetI (n, ({ it = Al.Ast.CallE (("Module_ok" | "Ref_type"), [{ it = ExpA arge; _ }]); _ } as e)) -> + (* HARDCODE: special function calls for LetI *) let to_expr exp' = exp' $$ (no_region, Il.Ast.BoolT $ no_region) in let to_instr instr' = instr' $$ (no_region, 0) in let is_valid = Al.Ast.IsValidE arge |> to_expr in @@ -983,6 +983,14 @@ let rec render_instr env algoname index depth instr = valid_check_string (render_order index depth) (render_expr env n) (render_expr env e) + | Al.Ast.LetI (n, ({ it = Al.Ast.CallE ("concat_", al); _ })) -> + let args = List.map (render_arg env) al in + let ce = (match args with + | [_; expr] -> + "the concatenation of " ^ expr + | _ -> error instr.at "Invalid arity for relation call"; + ) in + sprintf "%s Let %s be %s." (render_order index depth) (render_expr env n) ce | Al.Ast.LetI (n, e) -> sprintf "%s Let %s be %s." (render_order index depth) (render_expr env n) (render_expr env e) diff --git a/spectec/src/il2al/manual.ml b/spectec/src/il2al/manual.ml index 92c7be063b..36f109aba7 100644 --- a/spectec/src/il2al/manual.ml +++ b/spectec/src/il2al/manual.ml @@ -19,10 +19,10 @@ let eval_expr = (* Add function definition to AL environment *) let param = Il.Ast.ExpP ("_" $ no_region, ty_instrs) $ no_region in Al.Valid.il_env := - Il.Env.bind_def !Al.Valid.il_env ("eval_expr" $ no_region) ([param], ty_vals, []); + Il.Env.bind_def !Al.Valid.il_env ("Eval_expr" $ no_region) ([param], ty_vals, []); FuncA ( - "eval_expr", + "Eval_expr", [expA instrs], [ executeI instrs; diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index b495070527..0646f2f5bf 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -22,9 +22,9 @@ watsup 0.4 generator The limits :math:`({}[~n~..~m~])` is valid with :math:`k` if: - * :math:`n` is less than or equal to :math:`m`. + * :math:`n` is less than or equal to :math:`m`. - * :math:`m` is less than or equal to :math:`k`. + * :math:`m` is less than or equal to :math:`k`. @@ -42,7 +42,7 @@ The global type :math:`({\mathsf{mut}^?}~t)` is valid. The table type :math:`{\mathit{limits}}` is valid if: - * The table type :math:`{\mathit{limits}}` is valid with :math:`{2^{32}} - 1`. + * The table type :math:`{\mathit{limits}}` is valid with :math:`{2^{32}} - 1`. @@ -50,7 +50,7 @@ The table type :math:`{\mathit{limits}}` is valid if: The memory type :math:`{\mathit{limits}}` is valid if: - * The memory type :math:`{\mathit{limits}}` is valid with :math:`{2^{16}}`. + * The memory type :math:`{\mathit{limits}}` is valid with :math:`{2^{16}}`. @@ -58,27 +58,27 @@ The memory type :math:`{\mathit{limits}}` is valid if: The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid if: - * Either: + * Either: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{functype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{functype}})`. - * The function type :math:`{\mathit{functype}}` is valid. + * The function type :math:`{\mathit{functype}}` is valid. - * Or: + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{globaltype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{globaltype}})`. - * The global type :math:`{\mathit{globaltype}}` is valid. - * Or: + * The global type :math:`{\mathit{globaltype}}` is valid. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tabletype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tabletype}})`. - * The table type :math:`{\mathit{tabletype}}` is valid. - * Or: + * The table type :math:`{\mathit{tabletype}}` is valid. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{memtype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{memtype}})`. - * The memory type :math:`{\mathit{memtype}}` is valid. + * The memory type :math:`{\mathit{memtype}}` is valid. @@ -86,7 +86,7 @@ The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` The external type :math:`(\mathsf{func}~{\mathit{functype}})` is valid if: - * The function type :math:`{\mathit{functype}}` is valid. + * The function type :math:`{\mathit{functype}}` is valid. @@ -94,7 +94,7 @@ The external type :math:`(\mathsf{func}~{\mathit{functype}})` is valid if: The external type :math:`(\mathsf{global}~{\mathit{globaltype}})` is valid if: - * The global type :math:`{\mathit{globaltype}}` is valid. + * The global type :math:`{\mathit{globaltype}}` is valid. @@ -102,7 +102,7 @@ The external type :math:`(\mathsf{global}~{\mathit{globaltype}})` is valid if: The external type :math:`(\mathsf{table}~{\mathit{tabletype}})` is valid if: - * The table type :math:`{\mathit{tabletype}}` is valid. + * The table type :math:`{\mathit{tabletype}}` is valid. @@ -110,7 +110,7 @@ The external type :math:`(\mathsf{table}~{\mathit{tabletype}})` is valid if: The external type :math:`(\mathsf{mem}~{\mathit{memtype}})` is valid if: - * The memory type :math:`{\mathit{memtype}}` is valid. + * The memory type :math:`{\mathit{memtype}}` is valid. @@ -118,9 +118,9 @@ The external type :math:`(\mathsf{mem}~{\mathit{memtype}})` is valid if: The limits :math:`({}[~n_{11}~..~n_{12}~])` matches the limits :math:`({}[~n_{21}~..~n_{22}~])` if: - * :math:`n_{11}` is greater than or equal to :math:`n_{21}`. + * :math:`n_{11}` is greater than or equal to :math:`n_{21}`. - * :math:`n_{12}` is less than or equal to :math:`n_{22}`. + * :math:`n_{12}` is less than or equal to :math:`n_{22}`. @@ -138,7 +138,7 @@ The global type :math:`{\mathit{gt}}` matches itself. The table type :math:`{\mathit{lim}}_1` matches the table type :math:`{\mathit{lim}}_2` if: - * The table type :math:`{\mathit{lim}}_1` matches the table type :math:`{\mathit{lim}}_2`. + * The table type :math:`{\mathit{lim}}_1` matches the table type :math:`{\mathit{lim}}_2`. @@ -146,7 +146,7 @@ The table type :math:`{\mathit{lim}}_1` matches the table type :math:`{\mathit{l The memory type :math:`{\mathit{lim}}_1` matches the memory type :math:`{\mathit{lim}}_2` if: - * The memory type :math:`{\mathit{lim}}_1` matches the memory type :math:`{\mathit{lim}}_2`. + * The memory type :math:`{\mathit{lim}}_1` matches the memory type :math:`{\mathit{lim}}_2`. @@ -154,35 +154,35 @@ The memory type :math:`{\mathit{lim}}_1` matches the memory type :math:`{\mathit The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` matches the external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` if: - * Either: + * Either: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_2)`. - * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. + * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. - * Or: + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}}_2)`. - * The global type :math:`{\mathit{gt}}_1` matches the global type :math:`{\mathit{gt}}_2`. - * Or: + * The global type :math:`{\mathit{gt}}_1` matches the global type :math:`{\mathit{gt}}_2`. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}}_2)`. - * The table type :math:`{\mathit{tt}}_1` matches the table type :math:`{\mathit{tt}}_2`. - * Or: + * The table type :math:`{\mathit{tt}}_1` matches the table type :math:`{\mathit{tt}}_2`. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}}_2)`. - * The memory type :math:`{\mathit{mt}}_1` matches the memory type :math:`{\mathit{mt}}_2`. + * The memory type :math:`{\mathit{mt}}_1` matches the memory type :math:`{\mathit{mt}}_2`. @@ -190,7 +190,7 @@ The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` The external type :math:`(\mathsf{func}~{\mathit{ft}}_1)` matches the external type :math:`(\mathsf{func}~{\mathit{ft}}_2)` if: - * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. + * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. @@ -198,7 +198,7 @@ The external type :math:`(\mathsf{func}~{\mathit{ft}}_1)` matches the external t The external type :math:`(\mathsf{global}~{\mathit{gt}}_1)` matches the external type :math:`(\mathsf{global}~{\mathit{gt}}_2)` if: - * The global type :math:`{\mathit{gt}}_1` matches the global type :math:`{\mathit{gt}}_2`. + * The global type :math:`{\mathit{gt}}_1` matches the global type :math:`{\mathit{gt}}_2`. @@ -206,7 +206,7 @@ The external type :math:`(\mathsf{global}~{\mathit{gt}}_1)` matches the external The external type :math:`(\mathsf{table}~{\mathit{tt}}_1)` matches the external type :math:`(\mathsf{table}~{\mathit{tt}}_2)` if: - * The table type :math:`{\mathit{tt}}_1` matches the table type :math:`{\mathit{tt}}_2`. + * The table type :math:`{\mathit{tt}}_1` matches the table type :math:`{\mathit{tt}}_2`. @@ -214,7 +214,7 @@ The external type :math:`(\mathsf{table}~{\mathit{tt}}_1)` matches the external The external type :math:`(\mathsf{mem}~{\mathit{mt}}_1)` matches the external type :math:`(\mathsf{mem}~{\mathit{mt}}_2)` if: - * The memory type :math:`{\mathit{mt}}_1` matches the memory type :math:`{\mathit{mt}}_2`. + * The memory type :math:`{\mathit{mt}}_1` matches the memory type :math:`{\mathit{mt}}_2`. @@ -242,9 +242,9 @@ The instruction :math:`\mathsf{select}` is valid with the function type :math:`t The instruction :math:`(\mathsf{block}~{t^?}~{{\mathit{instr}}^\ast})` is valid with the function type :math:`\epsilon~\rightarrow~{t^?}` if: - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t^?}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t^?}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~{t^?}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~{t^?}`. @@ -252,7 +252,7 @@ The instruction :math:`(\mathsf{block}~{t^?}~{{\mathit{instr}}^\ast})` is valid The instruction :math:`(\mathsf{loop}~{t^?}~{{\mathit{instr}}^\ast})` is valid with the function type :math:`\epsilon~\rightarrow~{t^?}` if: - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~\epsilon`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~\epsilon`. @@ -260,11 +260,11 @@ The instruction :math:`(\mathsf{loop}~{t^?}~{{\mathit{instr}}^\ast})` is valid w The instruction :math:`(\mathsf{if}~{t^?}~{{\mathit{instr}}_1^\ast}~\mathsf{else}~{{\mathit{instr}}_2^\ast})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{t^?}` if: - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t^?}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t^?}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_1^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~{t^?}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_1^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~{t^?}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~{t^?}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~{t^?}`. @@ -272,9 +272,9 @@ The instruction :math:`(\mathsf{if}~{t^?}~{{\mathit{instr}}_1^\ast}~\mathsf{else The instruction :math:`(\mathsf{br}~l)` is valid with the function type :math:`{t_1^\ast}~{t^?}~\rightarrow~{t_2^\ast}` if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^?}`. + * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^?}`. @@ -282,9 +282,9 @@ The instruction :math:`(\mathsf{br}~l)` is valid with the function type :math:`{ The instruction :math:`(\mathsf{br\_if}~l)` is valid with the function type :math:`{t^?}~\mathsf{i{\scriptstyle 32}}~\rightarrow~{t^?}` if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^?}`. + * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^?}`. @@ -292,17 +292,17 @@ The instruction :math:`(\mathsf{br\_if}~l)` is valid with the function type :mat The instruction :math:`(\mathsf{br\_table}~{l^\ast}~{l'})` is valid with the function type :math:`{t_1^\ast}~{t^?}~\mathsf{i{\scriptstyle 32}}~\rightarrow~{t_2^\ast}` if: - * The result type :math:`C{.}\mathsf{labels}{}[{l'}]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[{l'}]` exists. - * The result type :math:`{t^?}` is equal to :math:`C{.}\mathsf{labels}{}[{l'}]`. + * The result type :math:`{t^?}` is equal to :math:`C{.}\mathsf{labels}{}[{l'}]`. - * For all :math:`l` in :math:`{l^\ast}`: + * For all :math:`l` in :math:`{l^\ast}`: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * For all :math:`l` in :math:`{l^\ast}`: + * For all :math:`l` in :math:`{l^\ast}`: - * The result type :math:`{t^?}` is equal to :math:`C{.}\mathsf{labels}{}[l]`. + * The result type :math:`{t^?}` is equal to :math:`C{.}\mathsf{labels}{}[l]`. @@ -310,9 +310,9 @@ The instruction :math:`(\mathsf{br\_table}~{l^\ast}~{l'})` is valid with the fun The instruction :math:`(\mathsf{call}~x)` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^?}` if: - * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^?}`. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^?}`. @@ -320,9 +320,9 @@ The instruction :math:`(\mathsf{call}~x)` is valid with the function type :math: The instruction :math:`(\mathsf{call\_indirect}~x)` is valid with the function type :math:`{t_1^\ast}~\mathsf{i{\scriptstyle 32}}~\rightarrow~{t_2^?}` if: - * The function type :math:`C{.}\mathsf{types}{}[x]` exists. + * The function type :math:`C{.}\mathsf{types}{}[x]` exists. - * The function type :math:`C{.}\mathsf{types}{}[x]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^?}`. + * The function type :math:`C{.}\mathsf{types}{}[x]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^?}`. @@ -330,7 +330,7 @@ The instruction :math:`(\mathsf{call\_indirect}~x)` is valid with the function t The instruction :math:`\mathsf{return}` is valid with the function type :math:`{t_1^\ast}~{t^?}~\rightarrow~{t_2^\ast}` if: - * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{t^?}`. + * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{t^?}`. @@ -363,15 +363,15 @@ The instruction :math:`(t {.} {\mathit{relop}}_t)` is valid with the function ty The instruction :math:`({\mathit{nt}}_1 {.} {{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}}{\mathsf{\_}}{{\mathit{nt}}_2})` is valid with the function type :math:`{\mathit{nt}}_2~\rightarrow~{\mathit{nt}}_1` if: - * Either: + * Either: - * :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{reinterpret}`. + * :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{reinterpret}`. - * :math:`{|{\mathit{nt}}_1|}` is equal to :math:`{|{\mathit{nt}}_2|}`. + * :math:`{|{\mathit{nt}}_1|}` is equal to :math:`{|{\mathit{nt}}_2|}`. - * Or: + * Or: - * :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{cvtop}}`. + * :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{cvtop}}`. @@ -379,9 +379,9 @@ The instruction :math:`({\mathit{nt}}_1 {.} {{\mathit{cvtop}}_{\mathit{u{\kern-0 The instruction :math:`(\mathsf{local{.}get}~x)` is valid with the function type :math:`\epsilon~\rightarrow~t` if: - * The number type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The number type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The number type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. + * The number type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. @@ -389,9 +389,9 @@ The instruction :math:`(\mathsf{local{.}get}~x)` is valid with the function type The instruction :math:`(\mathsf{local{.}set}~x)` is valid with the function type :math:`t~\rightarrow~\epsilon` if: - * The number type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The number type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The number type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. + * The number type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. @@ -399,9 +399,9 @@ The instruction :math:`(\mathsf{local{.}set}~x)` is valid with the function type The instruction :math:`(\mathsf{local{.}tee}~x)` is valid with the function type :math:`t~\rightarrow~t` if: - * The number type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The number type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The number type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. + * The number type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. @@ -409,9 +409,9 @@ The instruction :math:`(\mathsf{local{.}tee}~x)` is valid with the function type The instruction :math:`(\mathsf{global{.}get}~x)` is valid with the function type :math:`\epsilon~\rightarrow~t` if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathit{mut}}~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathit{mut}}~t)`. @@ -419,9 +419,9 @@ The instruction :math:`(\mathsf{global{.}get}~x)` is valid with the function typ The instruction :math:`(\mathsf{global{.}set}~x)` is valid with the function type :math:`t~\rightarrow~\epsilon` if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}~t)`. @@ -429,9 +429,9 @@ The instruction :math:`(\mathsf{global{.}set}~x)` is valid with the function typ The instruction :math:`\mathsf{memory{.}size}` is valid with the function type :math:`\epsilon~\rightarrow~\mathsf{i{\scriptstyle 32}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. @@ -439,9 +439,9 @@ The instruction :math:`\mathsf{memory{.}size}` is valid with the function type : The instruction :math:`\mathsf{memory{.}grow}` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~\mathsf{i{\scriptstyle 32}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. @@ -449,29 +449,29 @@ The instruction :math:`\mathsf{memory{.}grow}` is valid with the function type : The instruction :math:`({t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{load}}{{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * Either: + * Either: - * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`t`. + * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`t`. - * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. + * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. - * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is equal to :math:`t`. + * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is equal to :math:`t`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|t|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|t|} / 8`. - * Or: + * Or: - * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. + * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. + * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. - * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is equal to :math:`{\mathsf{i}}{n}`. + * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -479,29 +479,29 @@ The instruction :math:`({t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{loa The instruction :math:`({t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{store}}{{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * Either: + * Either: - * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`t`. + * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`t`. - * The pack size :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. + * The pack size :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. - * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`t`. + * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`t`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|t|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|t|} / 8`. - * Or: + * Or: - * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. + * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * The pack size :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`M`. + * The pack size :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`M`. - * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathsf{i}}{n}`. + * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -509,7 +509,7 @@ The instruction :math:`({t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{sto The instruction :math:`({\mathit{nt}}_1 {.} {\mathsf{reinterpret}}{\mathsf{\_}}{{\mathit{nt}}_2})` is valid with the function type :math:`{\mathit{nt}}_2~\rightarrow~{\mathit{nt}}_1` if: - * :math:`{|{\mathit{nt}}_1|}` is equal to :math:`{|{\mathit{nt}}_2|}`. + * :math:`{|{\mathit{nt}}_1|}` is equal to :math:`{|{\mathit{nt}}_2|}`. @@ -522,11 +522,11 @@ The instruction :math:`({\mathit{nt}}_1 {.} {{\mathit{cvtop}}}{\mathsf{\_}}{{\ma The instruction :math:`({t{.}\mathsf{load}}{\epsilon}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~t` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|t|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|t|} / 8`. @@ -534,11 +534,11 @@ The instruction :math:`({t{.}\mathsf{load}}{\epsilon}~{\mathit{memarg}})` is val The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{M~{\mathit{sx}}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathsf{i}}{n}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -546,11 +546,11 @@ The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{M~{\mathit{sx}}}~{\mat The instruction :math:`({t{.}\mathsf{store}}{\epsilon}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~t~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|t|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|t|} / 8`. @@ -558,11 +558,11 @@ The instruction :math:`({t{.}\mathsf{store}}{\epsilon}~{\mathit{memarg}})` is va The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{store}}{M}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~{\mathsf{i}}{n}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -570,34 +570,34 @@ The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{store}}{M}~{\mathit{memarg}}) The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is valid with the function type :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}~\rightarrow~{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` if: - * Either: + * Either: - * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`\epsilon`. + * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`\epsilon`. - * Or: + * Or: - * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}`. - * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t_1^\ast}`. + * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t_1^\ast}`. - * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t_3^\ast}`. + * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t_3^\ast}`. - * The instruction :math:`{\mathit{instr}}_1` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The instruction :math:`{\mathit{instr}}_1` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * The instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_2^\ast}~\rightarrow~{t_3^\ast}`. - * Or: + * The instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_2^\ast}~\rightarrow~{t_3^\ast}`. + * Or: - * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. - * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t^\ast}~{t_1^\ast}`. + * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t^\ast}~{t_1^\ast}`. - * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t^\ast}~{t_2^\ast}`. + * The number type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t^\ast}~{t_2^\ast}`. - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -610,9 +610,9 @@ The instruction sequence :math:`\epsilon` is valid with the function type :math: The instruction sequence :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_3^\ast}` if: - * The instruction :math:`{\mathit{instr}}_1` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The instruction :math:`{\mathit{instr}}_1` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * The instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_2^\ast}~\rightarrow~{t_3^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_2^\ast}~\rightarrow~{t_3^\ast}`. @@ -620,7 +620,7 @@ The instruction sequence :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}` is The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t^\ast}~{t_1^\ast}~\rightarrow~{t^\ast}~{t_2^\ast}` if: - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -628,7 +628,7 @@ The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the funct The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :math:`{t^?}` if: - * The expression :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~{t^?}`. + * The expression :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~{t^?}`. @@ -636,17 +636,17 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is const if: - * Either: + * Either: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(t{.}\mathsf{const}~c)`. + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(t{.}\mathsf{const}~c)`. - * Or: + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global{.}get}~x)`. + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global{.}get}~x)`. - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. @@ -659,9 +659,9 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma :math:`(\mathsf{global{.}get}~x)` is const if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. @@ -669,9 +669,9 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma :math:`{{\mathit{instr}}^\ast}` is const if: - * For all :math:`{\mathit{instr}}` in :math:`{{\mathit{instr}}^\ast}`: + * For all :math:`{\mathit{instr}}` in :math:`{{\mathit{instr}}^\ast}`: - * :math:`{\mathit{instr}}` is const. + * :math:`{\mathit{instr}}` is const. @@ -679,7 +679,7 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma The type :math:`(\mathsf{type}~{\mathit{ft}})` is valid with the function type :math:`{\mathit{ft}}` if: - * The function type :math:`{\mathit{ft}}` is valid. + * The function type :math:`{\mathit{ft}}` is valid. @@ -687,11 +687,11 @@ The type :math:`(\mathsf{type}~{\mathit{ft}})` is valid with the function type : The function :math:`(\mathsf{func}~x~{(\mathsf{local}~t)^\ast}~{\mathit{expr}})` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^?}` if: - * The function type :math:`C{.}\mathsf{types}{}[x]` exists. + * The function type :math:`C{.}\mathsf{types}{}[x]` exists. - * The function type :math:`C{.}\mathsf{types}{}[x]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^?}`. + * The function type :math:`C{.}\mathsf{types}{}[x]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^?}`. - * Under the context :math:`C{}[{.}\mathsf{locals} \mathrel{{=}{\oplus}} {t_1^\ast}~{t^\ast}]{}[{.}\mathsf{labels} \mathrel{{=}{\oplus}} {t_2^?}]{}[{.}\mathsf{return} \mathrel{{=}{\oplus}} {t_2^?}]`, the expression :math:`{\mathit{expr}}` is valid with the result type :math:`{t_2^?}`. + * Under the context :math:`C{}[{.}\mathsf{locals} \mathrel{{=}{\oplus}} {t_1^\ast}~{t^\ast}]{}[{.}\mathsf{labels} \mathrel{{=}{\oplus}} {t_2^?}]{}[{.}\mathsf{return} \mathrel{{=}{\oplus}} {t_2^?}]`, the expression :math:`{\mathit{expr}}` is valid with the result type :math:`{t_2^?}`. @@ -699,13 +699,13 @@ The function :math:`(\mathsf{func}~x~{(\mathsf{local}~t)^\ast}~{\mathit{expr}})` The global :math:`(\mathsf{global}~{\mathit{gt}}~{\mathit{expr}})` is valid with the global type :math:`{\mathit{gt}}` if: - * The global type :math:`{\mathit{gt}}` is valid. + * The global type :math:`{\mathit{gt}}` is valid. - * The global type :math:`{\mathit{gt}}` is equal to :math:`({\mathit{mut}}~t)`. + * The global type :math:`{\mathit{gt}}` is equal to :math:`({\mathit{mut}}~t)`. - * The expression :math:`{\mathit{expr}}` is valid with the number type :math:`t`. + * The expression :math:`{\mathit{expr}}` is valid with the number type :math:`t`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. @@ -713,7 +713,7 @@ The global :math:`(\mathsf{global}~{\mathit{gt}}~{\mathit{expr}})` is valid with The table :math:`(\mathsf{table}~{\mathit{tt}})` is valid with the table type :math:`{\mathit{tt}}` if: - * The table type :math:`{\mathit{tt}}` is valid. + * The table type :math:`{\mathit{tt}}` is valid. @@ -721,7 +721,7 @@ The table :math:`(\mathsf{table}~{\mathit{tt}})` is valid with the table type :m The memory :math:`(\mathsf{memory}~{\mathit{mt}})` is valid with the memory type :math:`{\mathit{mt}}` if: - * The memory type :math:`{\mathit{mt}}` is valid. + * The memory type :math:`{\mathit{mt}}` is valid. @@ -729,23 +729,23 @@ The memory :math:`(\mathsf{memory}~{\mathit{mt}})` is valid with the memory type The table segment :math:`(\mathsf{elem}~{\mathit{expr}}~{x^\ast})` is valid if: - * The table type :math:`C{.}\mathsf{tables}{}[0]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[0]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[0]` is equal to :math:`{\mathit{lim}}`. + * The table type :math:`C{.}\mathsf{tables}{}[0]` is equal to :math:`{\mathit{lim}}`. - * The expression :math:`{\mathit{expr}}` is valid with the number type :math:`\mathsf{i{\scriptstyle 32}}`. + * The expression :math:`{\mathit{expr}}` is valid with the number type :math:`\mathsf{i{\scriptstyle 32}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. - * :math:`{|{\mathit{x*}}|}` is equal to :math:`{|{\mathit{ft*}}|}`. + * :math:`{|{\mathit{x*}}|}` is equal to :math:`{|{\mathit{ft*}}|}`. - * For all :math:`x` in :math:`{x^\ast}`: + * For all :math:`x` in :math:`{x^\ast}`: - * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * For all :math:`{\mathit{ft}}` in :math:`{{\mathit{ft}}^\ast}` and :math:`x` in :math:`{x^\ast}`: + * For all :math:`{\mathit{ft}}` in :math:`{{\mathit{ft}}^\ast}` and :math:`x` in :math:`{x^\ast}`: - * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. @@ -753,13 +753,13 @@ The table segment :math:`(\mathsf{elem}~{\mathit{expr}}~{x^\ast})` is valid if: The memory segment :math:`(\mathsf{data}~{\mathit{expr}}~{b^\ast})` is valid if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{lim}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{lim}}`. - * The expression :math:`{\mathit{expr}}` is valid with the number type :math:`\mathsf{i{\scriptstyle 32}}`. + * The expression :math:`{\mathit{expr}}` is valid with the number type :math:`\mathsf{i{\scriptstyle 32}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. @@ -767,9 +767,9 @@ The memory segment :math:`(\mathsf{data}~{\mathit{expr}}~{b^\ast})` is valid if: The start function :math:`(\mathsf{start}~x)` is valid if: - * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`\epsilon~\rightarrow~\epsilon`. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`\epsilon~\rightarrow~\epsilon`. @@ -777,7 +777,7 @@ The start function :math:`(\mathsf{start}~x)` is valid if: The import :math:`(\mathsf{import}~{\mathit{name}}_1~{\mathit{name}}_2~{\mathit{xt}})` is valid with the external type :math:`{\mathit{xt}}` if: - * The external type :math:`{\mathit{xt}}` is valid. + * The external type :math:`{\mathit{xt}}` is valid. @@ -785,43 +785,43 @@ The import :math:`(\mathsf{import}~{\mathit{name}}_1~{\mathit{name}}_2~{\mathit{ The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid with the external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` if: - * Either: + * Either: - * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~x)`. + * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}})`. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. - * Or: + * Or: - * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~x)`. + * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}})`. - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. - * Or: + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. + * Or: - * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~x)`. + * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}})`. - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. - * Or: + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. + * Or: - * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~x)`. + * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}})`. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. @@ -829,9 +829,9 @@ The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyl The external index :math:`(\mathsf{func}~x)` is valid with the external type :math:`(\mathsf{func}~{\mathit{ft}})` if: - * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. @@ -839,9 +839,9 @@ The external index :math:`(\mathsf{func}~x)` is valid with the external type :ma The external index :math:`(\mathsf{global}~x)` is valid with the external type :math:`(\mathsf{global}~{\mathit{gt}})` if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. @@ -849,9 +849,9 @@ The external index :math:`(\mathsf{global}~x)` is valid with the external type : The external index :math:`(\mathsf{table}~x)` is valid with the external type :math:`(\mathsf{table}~{\mathit{tt}})` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. @@ -859,9 +859,9 @@ The external index :math:`(\mathsf{table}~x)` is valid with the external type :m The external index :math:`(\mathsf{mem}~x)` is valid with the external type :math:`(\mathsf{mem}~{\mathit{mt}})` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. @@ -869,7 +869,7 @@ The external index :math:`(\mathsf{mem}~x)` is valid with the external type :mat The export :math:`(\mathsf{export}~{\mathit{name}}~{\mathit{externidx}})` is valid with the external type :math:`{\mathit{xt}}` if: - * The external index :math:`{\mathit{externidx}}` is valid with the external type :math:`{\mathit{xt}}`. + * The external index :math:`{\mathit{externidx}}` is valid with the external type :math:`{\mathit{xt}}`. @@ -877,75 +877,75 @@ The export :math:`(\mathsf{export}~{\mathit{name}}~{\mathit{externidx}})` is val The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\ast}~{{\mathit{func}}^\ast}~{{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast}~{{\mathit{start}}^?}~{{\mathit{export}}^\ast})` is valid if: - * :math:`{|{\mathit{type*}}|}` is equal to :math:`{|{\mathit{ft'*}}|}`. + * :math:`{|{\mathit{type*}}|}` is equal to :math:`{|{\mathit{ft'*}}|}`. - * For all :math:`{\mathit{ft}'}` in :math:`{{\mathit{ft}'}^\ast}` and :math:`{\mathit{type}}` in :math:`{{\mathit{type}}^\ast}`: + * For all :math:`{\mathit{ft}'}` in :math:`{{\mathit{ft}'}^\ast}` and :math:`{\mathit{type}}` in :math:`{{\mathit{type}}^\ast}`: - * The type :math:`{\mathit{type}}` is valid with the function type :math:`{\mathit{ft}'}`. + * The type :math:`{\mathit{type}}` is valid with the function type :math:`{\mathit{ft}'}`. - * :math:`{|{\mathit{ixt*}}|}` is equal to :math:`{|{\mathit{import*}}|}`. + * :math:`{|{\mathit{ixt*}}|}` is equal to :math:`{|{\mathit{import*}}|}`. - * For all :math:`{\mathit{import}}` in :math:`{{\mathit{import}}^\ast}` and :math:`{\mathit{ixt}}` in :math:`{{\mathit{ixt}}^\ast}`: + * For all :math:`{\mathit{import}}` in :math:`{{\mathit{import}}^\ast}` and :math:`{\mathit{ixt}}` in :math:`{{\mathit{ixt}}^\ast}`: - * Under the context :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`, the import :math:`{\mathit{import}}` is valid with the external type :math:`{\mathit{ixt}}`. + * Under the context :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`, the import :math:`{\mathit{import}}` is valid with the external type :math:`{\mathit{ixt}}`. - * :math:`{|{\mathit{gt*}}|}` is equal to :math:`{|{\mathit{global*}}|}`. + * :math:`{|{\mathit{gt*}}|}` is equal to :math:`{|{\mathit{global*}}|}`. - * For all :math:`{\mathit{global}}` in :math:`{{\mathit{global}}^\ast}` and :math:`{\mathit{gt}}` in :math:`{{\mathit{gt}}^\ast}`: + * For all :math:`{\mathit{global}}` in :math:`{{\mathit{global}}^\ast}` and :math:`{\mathit{gt}}` in :math:`{{\mathit{gt}}^\ast}`: - * Under the context :math:`{C'}`, the global :math:`{\mathit{global}}` is valid with the global type :math:`{\mathit{gt}}`. + * Under the context :math:`{C'}`, the global :math:`{\mathit{global}}` is valid with the global type :math:`{\mathit{gt}}`. - * :math:`{|{\mathit{func*}}|}` is equal to :math:`{|{\mathit{ft*}}|}`. + * :math:`{|{\mathit{func*}}|}` is equal to :math:`{|{\mathit{ft*}}|}`. - * For all :math:`{\mathit{ft}}` in :math:`{{\mathit{ft}}^\ast}` and :math:`{\mathit{func}}` in :math:`{{\mathit{func}}^\ast}`: + * For all :math:`{\mathit{ft}}` in :math:`{{\mathit{ft}}^\ast}` and :math:`{\mathit{func}}` in :math:`{{\mathit{func}}^\ast}`: - * The function :math:`{\mathit{func}}` is valid with the function type :math:`{\mathit{ft}}`. + * The function :math:`{\mathit{func}}` is valid with the function type :math:`{\mathit{ft}}`. - * :math:`{|{\mathit{tt*}}|}` is equal to :math:`{|{\mathit{table*}}|}`. + * :math:`{|{\mathit{tt*}}|}` is equal to :math:`{|{\mathit{table*}}|}`. - * For all :math:`{\mathit{table}}` in :math:`{{\mathit{table}}^\ast}` and :math:`{\mathit{tt}}` in :math:`{{\mathit{tt}}^\ast}`: + * For all :math:`{\mathit{table}}` in :math:`{{\mathit{table}}^\ast}` and :math:`{\mathit{tt}}` in :math:`{{\mathit{tt}}^\ast}`: - * The table :math:`{\mathit{table}}` is valid with the table type :math:`{\mathit{tt}}`. + * The table :math:`{\mathit{table}}` is valid with the table type :math:`{\mathit{tt}}`. - * :math:`{|{\mathit{mt*}}|}` is equal to :math:`{|{\mathit{mem*}}|}`. + * :math:`{|{\mathit{mt*}}|}` is equal to :math:`{|{\mathit{mem*}}|}`. - * For all :math:`{\mathit{mem}}` in :math:`{{\mathit{mem}}^\ast}` and :math:`{\mathit{mt}}` in :math:`{{\mathit{mt}}^\ast}`: + * For all :math:`{\mathit{mem}}` in :math:`{{\mathit{mem}}^\ast}` and :math:`{\mathit{mt}}` in :math:`{{\mathit{mt}}^\ast}`: - * The memory :math:`{\mathit{mem}}` is valid with the memory type :math:`{\mathit{mt}}`. + * The memory :math:`{\mathit{mem}}` is valid with the memory type :math:`{\mathit{mt}}`. - * For all :math:`{\mathit{elem}}` in :math:`{{\mathit{elem}}^\ast}`: + * For all :math:`{\mathit{elem}}` in :math:`{{\mathit{elem}}^\ast}`: - * The table segment :math:`{\mathit{elem}}` is valid. + * The table segment :math:`{\mathit{elem}}` is valid. - * For all :math:`{\mathit{data}}` in :math:`{{\mathit{data}}^\ast}`: + * For all :math:`{\mathit{data}}` in :math:`{{\mathit{data}}^\ast}`: - * The memory segment :math:`{\mathit{data}}` is valid. + * The memory segment :math:`{\mathit{data}}` is valid. - * If :math:`{\mathit{start}}` is defined, then: + * If :math:`{\mathit{start}}` is defined, then: - * The start function :math:`{\mathit{start}}` is valid. + * The start function :math:`{\mathit{start}}` is valid. - * :math:`{|{\mathit{xt*}}|}` is equal to :math:`{|{\mathit{export*}}|}`. + * :math:`{|{\mathit{xt*}}|}` is equal to :math:`{|{\mathit{export*}}|}`. - * For all :math:`{\mathit{export}}` in :math:`{{\mathit{export}}^\ast}` and :math:`{\mathit{xt}}` in :math:`{{\mathit{xt}}^\ast}`: + * For all :math:`{\mathit{export}}` in :math:`{{\mathit{export}}^\ast}` and :math:`{\mathit{xt}}` in :math:`{{\mathit{xt}}^\ast}`: - * The export :math:`{\mathit{export}}` is valid with the external type :math:`{\mathit{xt}}`. + * The export :math:`{\mathit{export}}` is valid with the external type :math:`{\mathit{xt}}`. - * :math:`{|{{\mathit{tt}}^\ast}|}` is less than or equal to :math:`1`. + * :math:`{|{{\mathit{tt}}^\ast}|}` is less than or equal to :math:`1`. - * :math:`{|{{\mathit{mt}}^\ast}|}` is less than or equal to :math:`1`. + * :math:`{|{{\mathit{mt}}^\ast}|}` is less than or equal to :math:`1`. - * The context :math:`C` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~{{\mathit{ift}}^\ast}~{{\mathit{ft}}^\ast},\; \mathsf{globals}~{{\mathit{igt}}^\ast}~{{\mathit{gt}}^\ast},\; \mathsf{tables}~{{\mathit{itt}}^\ast}~{{\mathit{tt}}^\ast},\; \mathsf{mems}~{{\mathit{imt}}^\ast}~{{\mathit{mt}}^\ast},\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`. + * The context :math:`C` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~{{\mathit{ift}}^\ast}~{{\mathit{ft}}^\ast},\; \mathsf{globals}~{{\mathit{igt}}^\ast}~{{\mathit{gt}}^\ast},\; \mathsf{tables}~{{\mathit{itt}}^\ast}~{{\mathit{tt}}^\ast},\; \mathsf{mems}~{{\mathit{imt}}^\ast}~{{\mathit{mt}}^\ast},\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`. - * The context :math:`{C'}` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~{{\mathit{ift}}^\ast}~{{\mathit{ft}}^\ast},\; \mathsf{globals}~{{\mathit{igt}}^\ast},\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`. + * The context :math:`{C'}` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~{{\mathit{ift}}^\ast}~{{\mathit{ft}}^\ast},\; \mathsf{globals}~{{\mathit{igt}}^\ast},\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`. - * The function type sequence :math:`{{\mathit{ift}}^\ast}` is equal to :math:`{\mathrm{funcs}}({{\mathit{ixt}}^\ast})`. + * The function type sequence :math:`{{\mathit{ift}}^\ast}` is equal to :math:`{\mathrm{funcs}}({{\mathit{ixt}}^\ast})`. - * The global type sequence :math:`{{\mathit{igt}}^\ast}` is equal to :math:`{\mathrm{globals}}({{\mathit{ixt}}^\ast})`. + * The global type sequence :math:`{{\mathit{igt}}^\ast}` is equal to :math:`{\mathrm{globals}}({{\mathit{ixt}}^\ast})`. - * The table type sequence :math:`{{\mathit{itt}}^\ast}` is equal to :math:`{\mathrm{tables}}({{\mathit{ixt}}^\ast})`. + * The table type sequence :math:`{{\mathit{itt}}^\ast}` is equal to :math:`{\mathrm{tables}}({{\mathit{ixt}}^\ast})`. - * The memory type sequence :math:`{{\mathit{imt}}^\ast}` is equal to :math:`{\mathrm{mems}}({{\mathit{ixt}}^\ast})`. + * The memory type sequence :math:`{{\mathit{imt}}^\ast}` is equal to :math:`{\mathrm{mems}}({{\mathit{ixt}}^\ast})`. :math:`\mathsf{unreachable}` @@ -991,11 +991,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`c \neq 0`, then: - a. Push the value :math:`{\mathit{val}}_1` to the stack. + a. Push the value :math:`{\mathit{val}}_1` to the stack. #. Else: - a. Push the value :math:`{\mathit{val}}_2` to the stack. + a. Push the value :math:`{\mathit{val}}_2` to the stack. :math:`\mathsf{if}~{t^?}~{{\mathit{instr}}_1^\ast}~{{\mathit{instr}}_2^\ast}` @@ -1008,11 +1008,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`c \neq 0`, then: - a. Execute the instruction :math:`(\mathsf{block}~{t^?}~{{\mathit{instr}}_1^\ast})`. + a. Execute the instruction :math:`(\mathsf{block}~{t^?}~{{\mathit{instr}}_1^\ast})`. #. Else: - a. Execute the instruction :math:`(\mathsf{block}~{t^?}~{{\mathit{instr}}_2^\ast})`. + a. Execute the instruction :math:`(\mathsf{block}~{t^?}~{{\mathit{instr}}_2^\ast})`. :math:`\mathsf{label}` @@ -1038,31 +1038,31 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 0`, then: - a. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. + a. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. - #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. + #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. - #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. + #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{label}` context from the stack. + #. Pop the current :math:`\mathsf{label}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. + #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. - #. Execute the instruction :math:`{{\mathit{instr}'}^\ast}`. + #. Execute the instruction :math:`{{\mathit{instr}'}^\ast}`. #. Else: - a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #. If :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} \geq 1`, then: + #. If :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} \geq 1`, then: - 1) Let :math:`l` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} - 1`. + 1) Let :math:`l` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} - 1`. - #) Pop the current :math:`\mathsf{label}` context from the stack. + #) Pop the current :math:`\mathsf{label}` context from the stack. - #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #) Execute the instruction :math:`(\mathsf{br}~l)`. + #) Execute the instruction :math:`(\mathsf{br}~l)`. :math:`\mathsf{br\_if}~l` @@ -1075,11 +1075,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`c \neq 0`, then: - a. Execute the instruction :math:`(\mathsf{br}~l)`. + a. Execute the instruction :math:`(\mathsf{br}~l)`. #. Else: - a. Do nothing. + a. Do nothing. :math:`\mathsf{br\_table}~{l^\ast}~{l'}` @@ -1092,11 +1092,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i < {|{l^\ast}|}`, then: - a. Execute the instruction :math:`(\mathsf{br}~{l^\ast}{}[i])`. + a. Execute the instruction :math:`(\mathsf{br}~{l^\ast}{}[i])`. #. Else: - a. Execute the instruction :math:`(\mathsf{br}~{l'})`. + a. Execute the instruction :math:`(\mathsf{br}~{l'})`. :math:`\mathsf{frame}` @@ -1124,27 +1124,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the first non-value entry of the stack is a :math:`\mathsf{frame}`, then: - a. Let :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` be the current :math:`\mathsf{frame}` context. + a. Let :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` be the current :math:`\mathsf{frame}` context. - #. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. + #. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. - #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. + #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. - #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. + #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{frame}` context from the stack. + #. Pop the current :math:`\mathsf{frame}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. + #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. #. Else if the first non-value entry of the stack is a :math:`\mathsf{label}`, then: - a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{label}` context from the stack. + #. Pop the current :math:`\mathsf{label}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #. Execute the instruction :math:`\mathsf{return}`. + #. Execute the instruction :math:`\mathsf{return}`. :math:`t {.} {\mathit{unop}}` @@ -1157,7 +1157,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{|{{\mathit{unop}}}{{}_{t}}{(c_1)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{unop}}}{{}_{t}}{(c_1)}`. @@ -1178,7 +1178,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{|{{\mathit{binop}}}{{}_{t}}{(c_1, c_2)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{binop}}}{{}_{t}}{(c_1, c_2)}`. @@ -1225,7 +1225,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{|{{\mathit{cvtop}}}{{}_{t_1, t_2}}{(c_1)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{cvtop}}}{{}_{t_1, t_2}}{(c_1)}`. @@ -1255,13 +1255,13 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{t^?}` is not defined, then: - a. Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{n}}{\{}~\epsilon~\})`. + a. Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{n}}{\{}~\epsilon~\})`. #. Let :math:`n` be :math:`1`. #. If :math:`{t^?} \neq \epsilon`, then: - a. Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{n}}{\{}~\epsilon~\})`. + a. Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{n}}{\{}~\epsilon~\})`. :math:`\mathsf{loop}~{t^?}~{{\mathit{instr}}^\ast}` @@ -1294,21 +1294,21 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i \geq {|z{.}\mathsf{tables}{}[0]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`z{.}\mathsf{tables}{}[0]{.}\mathsf{refs}{}[i]` is not defined, then: - a. Trap. + a. Trap. #. Let :math:`a` be :math:`z{.}\mathsf{tables}{}[0]{.}\mathsf{refs}{}[i]`. #. If :math:`a \geq {|z{.}\mathsf{funcs}|}`, then: - a. Trap. + a. Trap. #. If :math:`z{.}\mathsf{types}{}[x] \neq z{.}\mathsf{funcs}{}[a]{.}\mathsf{type}`, then: - a. Trap. + a. Trap. #. Execute the instruction :math:`(\mathsf{call}~a)`. @@ -1372,39 +1372,39 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`t` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`t` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|t|} / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: + #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|t|} / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - 1) Trap. + 1) Trap. - #. Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{t}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|t|} / 8]`. + #. Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{t}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|t|} / 8]`. - #. Push the value :math:`(t{.}\mathsf{const}~c)` to the stack. + #. Push the value :math:`(t{.}\mathsf{const}~c)` to the stack. #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. If :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + a. If :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + #. If :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. - #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. + #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. - #) Push the value :math:`({\mathsf{i}}{n}{.}\mathsf{const}~{{{{\mathrm{extend}}}_{n, {|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{(c)})` to the stack. + #) Push the value :math:`({\mathsf{i}}{n}{.}\mathsf{const}~{{{{\mathrm{extend}}}_{n, {|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{(c)})` to the stack. :math:`\mathsf{memory{.}size}` @@ -1462,29 +1462,29 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|t|} / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}` and :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = t` and :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Trap. + a. Trap. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = t` and :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{t}(c)`. + a. Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{t}(c)`. - #. Perform :math:`z{}[{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|t|} / 8] = {b^\ast}]`. + #. Perform :math:`z{}[{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|t|} / 8] = {b^\ast}]`. #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = {\mathsf{i}}{n}` and :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = {\mathsf{i}}{n}` and :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`n` be :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`n` be :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #) Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}({{\mathrm{wrap}}}_{{|{\mathsf{i}}{n}|}, n}(c))`. + #) Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}({{\mathrm{wrap}}}_{{|{\mathsf{i}}{n}|}, n}(c))`. - #) Perform :math:`z{}[{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8] = {b^\ast}]`. + #) Perform :math:`z{}[{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8] = {b^\ast}]`. :math:`\mathsf{memory{.}grow}` @@ -1499,15 +1499,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Either: - a. Let :math:`{\mathit{mi}}` be :math:`{\mathrm{growmemory}}(z{.}\mathsf{mems}{}[0], n)`. + a. Let :math:`{\mathit{mi}}` be :math:`{\mathrm{growmemory}}(z{.}\mathsf{mems}{}[0], n)`. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|} / (64 \, {\mathrm{Ki}}))` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|} / (64 \, {\mathrm{Ki}}))` to the stack. - #. Perform :math:`z{}[{.}\mathsf{mems}{}[0] = {\mathit{mi}}]`. + #. Perform :math:`z{}[{.}\mathsf{mems}{}[0] = {\mathit{mi}}]`. #. Or: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{{{{\mathrm{signed}}}_{32}^{{-1}}}}{({-1})})` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{{{{\mathrm{signed}}}_{32}^{{-1}}}}{({-1})})` to the stack. :math:`{\mathrm{Ki}}` @@ -1523,7 +1523,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`i \leq j`, then: - a. Return :math:`i`. + a. Return :math:`i`. #. Return :math:`j`. @@ -1534,7 +1534,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`0`. + a. Return :math:`0`. #. Let :math:`n~{{n'}^\ast}` be :math:`{n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -1547,7 +1547,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, :math:`{|{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} = 1`. @@ -1562,7 +1562,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`w` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. @@ -1575,7 +1575,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{w^\ast}~{{{w'}^\ast}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -1588,7 +1588,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 32`, then: - a. Return :math:`23`. + a. Return :math:`23`. #. Assert: Due to validation, :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 64`. @@ -1601,7 +1601,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 32`, then: - a. Return :math:`8`. + a. Return :math:`8`. #. Assert: Due to validation, :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 64`. @@ -1649,19 +1649,19 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 32}}`, then: - a. Return :math:`32`. + a. Return :math:`32`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 64}}`, then: - a. Return :math:`64`. + a. Return :math:`64`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 32}}`, then: - a. Return :math:`32`. + a. Return :math:`32`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 64}}`, then: - a. Return :math:`64`. + a. Return :math:`64`. :math:`{\mathrm{funcs}}({{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast})` @@ -1670,15 +1670,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~{\mathit{ft}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{func}~{\mathit{ft}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{ft}}~{\mathrm{funcs}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{ft}}~{\mathrm{funcs}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -1691,15 +1691,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~{\mathit{gt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{global}~{\mathit{gt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{gt}}~{\mathrm{globals}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{gt}}~{\mathrm{globals}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -1712,15 +1712,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~{\mathit{tt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{table}~{\mathit{tt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{tt}}~{\mathrm{tables}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{tt}}~{\mathrm{tables}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -1733,15 +1733,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~{\mathit{mt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{mem}~{\mathit{mt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{mt}}~{\mathrm{mems}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{mt}}~{\mathrm{mems}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -1761,7 +1761,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`i < {2^{N - 1}}`, then: - a. Return :math:`i`. + a. Return :math:`i`. #. Assert: Due to validation, :math:`{2^{N - 1}} \leq i`. @@ -1785,21 +1785,21 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{\mathit{iN}}` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{clz}`, then: + #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{clz}`, then: - 1) Return :math:`{{\mathrm{iclz}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}})`. + 1) Return :math:`{{\mathrm{iclz}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}})`. - #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ctz}`, then: + #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ctz}`, then: - 1) Return :math:`{{\mathrm{ictz}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}})`. + 1) Return :math:`{{\mathrm{ictz}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}})`. - #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{popcnt}`, then: + #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{popcnt}`, then: - 1) Return :math:`{{\mathrm{ipopcnt}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}})`. + 1) Return :math:`{{\mathrm{ipopcnt}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}})`. #. Assert: Due to validation, the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -1809,27 +1809,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{abs}`, then: - a. Return :math:`{{\mathrm{fabs}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{fabs}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{neg}`, then: - a. Return :math:`{{\mathrm{fneg}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{fneg}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sqrt}`, then: - a. Return :math:`{{\mathrm{fsqrt}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{fsqrt}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ceil}`, then: - a. Return :math:`{{\mathrm{fceil}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{fceil}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{floor}`, then: - a. Return :math:`{{\mathrm{ffloor}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{ffloor}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{trunc}`, then: - a. Return :math:`{{\mathrm{ftrunc}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{ftrunc}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}})`. #. Assert: Due to validation, :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{nearest}`. @@ -1842,65 +1842,65 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}_1` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{\mathit{iN}}_1` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}_2` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + #. Let :math:`{\mathit{iN}}_2` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: - 1) Return :math:`{{\mathrm{iadd}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{iadd}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: - 1) Return :math:`{{\mathrm{isub}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{isub}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: - 1) Return :math:`{{\mathrm{imul}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{imul}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{div}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{div}`, then: - 1) Let :math:`({\mathsf{div}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{div}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{idiv}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{idiv}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{rem}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{rem}`, then: - 1) Let :math:`({\mathsf{rem}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{rem}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{irem}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{irem}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{and}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{and}`, then: - 1) Return :math:`{{\mathrm{iand}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{iand}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{or}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{or}`, then: - 1) Return :math:`{{\mathrm{ior}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{ior}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{xor}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{xor}`, then: - 1) Return :math:`{{\mathrm{ixor}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{ixor}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{shl}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{shl}`, then: - 1) Return :math:`{{\mathrm{ishl}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{ishl}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{shr}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{shr}`, then: - 1) Let :math:`({\mathsf{shr}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{shr}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ishr}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{ishr}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotl}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotl}`, then: - 1) Return :math:`{{\mathrm{irotl}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{irotl}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotr}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotr}`, then: - 1) Return :math:`{{\mathrm{irotr}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{irotr}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. #. Assert: Due to validation, the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -1912,27 +1912,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: - a. Return :math:`{{\mathrm{fadd}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fadd}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: - a. Return :math:`{{\mathrm{fsub}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fsub}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: - a. Return :math:`{{\mathrm{fmul}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fmul}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{div}`, then: - a. Return :math:`{{\mathrm{fdiv}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fdiv}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{min}`, then: - a. Return :math:`{{\mathrm{fmin}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fmin}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{max}`, then: - a. Return :math:`{{\mathrm{fmax}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fmax}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. Assert: Due to validation, :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{copysign}`. @@ -1952,43 +1952,43 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}_1` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{\mathit{iN}}_1` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}_2` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + #. Let :math:`{\mathit{iN}}_2` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: - 1) Return :math:`{{\mathrm{ieq}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{ieq}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: - 1) Return :math:`{{\mathrm{ine}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{ine}}}_{{|{\mathsf{i}}{n}|}}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{lt}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{lt}`, then: - 1) Let :math:`({\mathsf{lt}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{lt}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ilt}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{ilt}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{gt}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{gt}`, then: - 1) Let :math:`({\mathsf{gt}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{gt}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{igt}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{igt}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{le}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{le}`, then: - 1) Let :math:`({\mathsf{le}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{le}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ile}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{ile}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ge}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ge}`, then: - 1) Let :math:`({\mathsf{ge}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{ge}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ige}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{ige}}}_{{|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. #. Assert: Due to validation, the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -2000,23 +2000,23 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: - a. Return :math:`{{\mathrm{feq}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{feq}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: - a. Return :math:`{{\mathrm{fne}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fne}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{lt}`, then: - a. Return :math:`{{\mathrm{flt}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{flt}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{gt}`, then: - a. Return :math:`{{\mathrm{fgt}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fgt}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{le}`, then: - a. Return :math:`{{\mathrm{fle}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fle}}}_{{|{\mathsf{f}}{n}|}}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. Assert: Due to validation, :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ge}`. @@ -2029,63 +2029,63 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`, then: - a. Let :math:`(\mathsf{extend}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{extend}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{\mathit{iN}}` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 32}}` and :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}} = \mathsf{i{\scriptstyle 64}}`, then: + #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 32}}` and :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}} = \mathsf{i{\scriptstyle 64}}`, then: - 1) Return :math:`{{{{\mathrm{extend}}}_{32, 64}^{{\mathit{sx}}}}}{({\mathit{iN}})}`. + 1) Return :math:`{{{{\mathrm{extend}}}_{32, 64}^{{\mathit{sx}}}}}{({\mathit{iN}})}`. #. Let :math:`{\mathit{iN}}` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 64}}` and :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}} = \mathsf{i{\scriptstyle 32}}` and :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{wrap}`, then: - a. Return :math:`{{\mathrm{wrap}}}_{64, 32}({\mathit{iN}})`. + a. Return :math:`{{\mathrm{wrap}}}_{64, 32}({\mathit{iN}})`. #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: - a. Let :math:`{\mathsf{f}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{f}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is Inn, then: + #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is Inn, then: - 1) Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + 1) Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc}`, then: - a) Let :math:`(\mathsf{trunc}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`(\mathsf{trunc}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{\mathit{fN}}` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{fN}}` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{trunc}}}_{{|{\mathsf{f}}{n}|}, {|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{fN}})}`. + #) Return :math:`{{{{\mathrm{trunc}}}_{{|{\mathsf{f}}{n}|}, {|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{fN}})}`. #. Let :math:`{\mathit{fN}}` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 32}}` and :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}} = \mathsf{f{\scriptstyle 64}}` and :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{promote}`, then: - a. Return :math:`{{\mathrm{promote}}}_{32, 64}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{promote}}}_{32, 64}({\mathit{fN}})`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 64}}` and :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}} = \mathsf{f{\scriptstyle 32}}` and :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{demote}`, then: - a. Return :math:`{{\mathrm{demote}}}_{64, 32}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{demote}}}_{64, 32}({\mathit{fN}})`. #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is Fnn, then: + #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is Fnn, then: - 1) Let :math:`{\mathsf{f}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + 1) Let :math:`{\mathsf{f}}{n}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{convert}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{convert}`, then: - a) Let :math:`(\mathsf{convert}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`(\mathsf{convert}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{convert}}}_{{|{\mathsf{i}}{n}|}, {|{\mathsf{f}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}})}`. + #) Return :math:`{{{{\mathrm{convert}}}_{{|{\mathsf{i}}{n}|}, {|{\mathsf{f}}{n}|}}^{{\mathit{sx}}}}}{({\mathit{iN}})}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{reinterpret}` and :math:`{|{\mathsf{i}}{n}|} = {|{\mathsf{f}}{n}|}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{reinterpret}` and :math:`{|{\mathsf{i}}{n}|} = {|{\mathsf{f}}{n}|}`, then: - a) Return :math:`{{\mathrm{reinterpret}}}_{{\mathsf{i}}{n}, {\mathsf{f}}{n}}({\mathit{iN}})`. + a) Return :math:`{{\mathrm{reinterpret}}}_{{\mathsf{i}}{n}, {\mathsf{f}}{n}}({\mathit{iN}})`. #. Assert: Due to validation, the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -2126,15 +2126,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 32}}`, then: - a. Return :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)`. + a. Return :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 64}}`, then: - a. Return :math:`(\mathsf{i{\scriptstyle 64}}{.}\mathsf{const}~0)`. + a. Return :math:`(\mathsf{i{\scriptstyle 64}}{.}\mathsf{const}~0)`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 32}}`, then: - a. Return :math:`(\mathsf{f{\scriptstyle 32}}{.}\mathsf{const}~{+0})`. + a. Return :math:`(\mathsf{f{\scriptstyle 32}}{.}\mathsf{const}~{+0})`. #. Assert: Due to validation, :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 64}}`. @@ -2147,15 +2147,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~{\mathit{fa}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{func}~{\mathit{fa}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{fa}}~{\mathrm{funcs}}({{\mathit{xv}}^\ast})`. + #. Return :math:`{\mathit{fa}}~{\mathrm{funcs}}({{\mathit{xv}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2168,15 +2168,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~{\mathit{ga}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{global}~{\mathit{ga}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ga}}~{\mathrm{globals}}({{\mathit{xv}}^\ast})`. + #. Return :math:`{\mathit{ga}}~{\mathrm{globals}}({{\mathit{xv}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2189,15 +2189,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~{\mathit{ta}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{table}~{\mathit{ta}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ta}}~{\mathrm{tables}}({{\mathit{xv}}^\ast})`. + #. Return :math:`{\mathit{ta}}~{\mathrm{tables}}({{\mathit{xv}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2210,15 +2210,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~{\mathit{ma}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{mem}~{\mathit{ma}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ma}}~{\mathrm{mems}}({{\mathit{xv}}^\ast})`. + #. Return :math:`{\mathit{ma}}~{\mathrm{mems}}({{\mathit{xv}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2375,9 +2375,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{i'} \leq j`, then: - a. Let :math:`{\mathit{ti}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~{i'}~..~j~]),\; \mathsf{refs}~{a^\ast}~{\epsilon^{n}} \}\end{array}`. + a. Let :math:`{\mathit{ti}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~{i'}~..~j~]),\; \mathsf{refs}~{a^\ast}~{\epsilon^{n}} \}\end{array}`. - #. Return :math:`{\mathit{ti}'}`. + #. Return :math:`{\mathit{ti}'}`. :math:`{\mathrm{growmemory}}({\mathit{mi}}, n)` @@ -2390,9 +2390,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{i'} \leq j`, then: - a. Let :math:`{\mathit{mi}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~{i'}~..~j~]),\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. + a. Let :math:`{\mathit{mi}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~{i'}~..~j~]),\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. - #. Return :math:`{\mathit{mi}'}`. + #. Return :math:`{\mathit{mi}'}`. :math:`{\mathrm{funcs}}({{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast})` @@ -2401,15 +2401,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~{\mathit{fa}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{func}~{\mathit{fa}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{fa}}~{\mathrm{funcs}}({{\mathit{externaddr}'}^\ast})`. + #. Return :math:`{\mathit{fa}}~{\mathrm{funcs}}({{\mathit{externaddr}'}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2422,15 +2422,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~{\mathit{ga}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{global}~{\mathit{ga}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ga}}~{\mathrm{globals}}({{\mathit{externaddr}'}^\ast})`. + #. Return :math:`{\mathit{ga}}~{\mathrm{globals}}({{\mathit{externaddr}'}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2443,15 +2443,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~{\mathit{ta}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{table}~{\mathit{ta}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ta}}~{\mathrm{tables}}({{\mathit{externaddr}'}^\ast})`. + #. Return :math:`{\mathit{ta}}~{\mathrm{tables}}({{\mathit{externaddr}'}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2464,15 +2464,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~{\mathit{ma}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{mem}~{\mathit{ma}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ma}}~{\mathrm{mems}}({{\mathit{externaddr}'}^\ast})`. + #. Return :math:`{\mathit{ma}}~{\mathrm{mems}}({{\mathit{externaddr}'}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2502,7 +2502,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{func}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{func}}~{{\mathit{func}'}^\ast}` be :math:`{{\mathit{func}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2532,23 +2532,23 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Assert: Due to validation, :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. + a. Assert: Due to validation, :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. - #. Return :math:`\epsilon`. + #. Return :math:`\epsilon`. #. Else: - a. Let :math:`{\mathit{globaltype}}~{{\mathit{globaltype}'}^\ast}` be :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + a. Let :math:`{\mathit{globaltype}}~{{\mathit{globaltype}'}^\ast}` be :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Assert: Due to validation, :math:`{|{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. + #. Assert: Due to validation, :math:`{|{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. - #. Let :math:`{\mathit{val}}~{{\mathit{val}'}^\ast}` be :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + #. Let :math:`{\mathit{val}}~{{\mathit{val}'}^\ast}` be :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Let :math:`{\mathit{ga}}` be :math:`{\mathrm{allocglobal}}(s, {\mathit{globaltype}}, {\mathit{val}})`. + #. Let :math:`{\mathit{ga}}` be :math:`{\mathrm{allocglobal}}(s, {\mathit{globaltype}}, {\mathit{val}})`. - #. Let :math:`{{\mathit{ga}'}^\ast}` be :math:`{\mathrm{allocglobals}}(s, {{\mathit{globaltype}'}^\ast}, {{\mathit{val}'}^\ast})`. + #. Let :math:`{{\mathit{ga}'}^\ast}` be :math:`{\mathrm{allocglobals}}(s, {{\mathit{globaltype}'}^\ast}, {{\mathit{val}'}^\ast})`. - #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. + #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. :math:`{\mathrm{alloctable}}(s, {}[~i~..~j~])` @@ -2570,7 +2570,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{tt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{tabletype}}~{{\mathit{tabletype}'}^\ast}` be :math:`{{\mathit{tt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2600,7 +2600,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{mt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{memtype}}~{{\mathit{memtype}'}^\ast}` be :math:`{{\mathit{mt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -2617,21 +2617,21 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{func}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{func}~{{\mathit{fa}}^\ast}{}[x]) \}\end{array}`. + #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{func}~{{\mathit{fa}}^\ast}{}[x]) \}\end{array}`. #. If :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{global}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{global}~{{\mathit{ga}}^\ast}{}[x]) \}\end{array}`. + #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{global}~{{\mathit{ga}}^\ast}{}[x]) \}\end{array}`. #. If :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{table}~{{\mathit{ta}}^\ast}{}[x]) \}\end{array}`. + #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{table}~{{\mathit{ta}}^\ast}{}[x]) \}\end{array}`. #. Assert: Due to validation, :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{mem}`. @@ -2709,7 +2709,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{{\mathit{fa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return. + a. Return. #. Assert: Due to validation, :math:`{|{{\mathit{fa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. @@ -2732,7 +2732,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{b_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return. + a. Return. #. Assert: Due to validation, :math:`{|{b_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. @@ -2851,8 +2851,8 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{{\mathit{val}}^{k}}`. -:math:`{\mathrm{eval}}_{\mathit{expr}}({{\mathit{instr}}^\ast})` -................................................................ +the result of :ref:`evaluating <exec-expr>` :math:`{{\mathit{instr}}^\ast}` +........................................................................... 1. Execute the instruction :math:`{{\mathit{instr}}^\ast}`. @@ -4248,7 +4248,7 @@ invoke s fa val^n 12. Pop the values val^k from the stack. 13. Return val^k. -eval_expr instr* +Eval_expr instr* 1. Execute the instruction instr*. 2. Pop the value val from the stack. 3. Return [val]. @@ -4269,9 +4269,9 @@ watsup 0.4 generator The limits :math:`({}[~n~..~m~])` is valid with :math:`k` if: - * :math:`n` is less than or equal to :math:`m`. + * :math:`n` is less than or equal to :math:`m`. - * :math:`m` is less than or equal to :math:`k`. + * :math:`m` is less than or equal to :math:`k`. @@ -4289,7 +4289,7 @@ The global type :math:`({\mathsf{mut}^?}~t)` is valid. The table type :math:`({\mathit{limits}}~{\mathit{reftype}})` is valid if: - * The limits :math:`{\mathit{limits}}` is valid with :math:`{2^{32}} - 1`. + * The limits :math:`{\mathit{limits}}` is valid with :math:`{2^{32}} - 1`. @@ -4297,7 +4297,7 @@ The table type :math:`({\mathit{limits}}~{\mathit{reftype}})` is valid if: The memory type :math:`{\mathit{limits}}~\mathsf{page}` is valid if: - * The limits :math:`{\mathit{limits}}` is valid with :math:`{2^{16}}`. + * The limits :math:`{\mathit{limits}}` is valid with :math:`{2^{16}}`. @@ -4305,27 +4305,27 @@ The memory type :math:`{\mathit{limits}}~\mathsf{page}` is valid if: The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid if: - * Either: + * Either: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{functype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{functype}})`. - * The function type :math:`{\mathit{functype}}` is valid. + * The function type :math:`{\mathit{functype}}` is valid. - * Or: + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{globaltype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{globaltype}})`. - * The global type :math:`{\mathit{globaltype}}` is valid. - * Or: + * The global type :math:`{\mathit{globaltype}}` is valid. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tabletype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tabletype}})`. - * The table type :math:`{\mathit{tabletype}}` is valid. - * Or: + * The table type :math:`{\mathit{tabletype}}` is valid. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{memtype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{memtype}})`. - * The memory type :math:`{\mathit{memtype}}` is valid. + * The memory type :math:`{\mathit{memtype}}` is valid. @@ -4333,7 +4333,7 @@ The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` The external type :math:`(\mathsf{func}~{\mathit{functype}})` is valid if: - * The function type :math:`{\mathit{functype}}` is valid. + * The function type :math:`{\mathit{functype}}` is valid. @@ -4341,7 +4341,7 @@ The external type :math:`(\mathsf{func}~{\mathit{functype}})` is valid if: The external type :math:`(\mathsf{global}~{\mathit{globaltype}})` is valid if: - * The global type :math:`{\mathit{globaltype}}` is valid. + * The global type :math:`{\mathit{globaltype}}` is valid. @@ -4349,7 +4349,7 @@ The external type :math:`(\mathsf{global}~{\mathit{globaltype}})` is valid if: The external type :math:`(\mathsf{table}~{\mathit{tabletype}})` is valid if: - * The table type :math:`{\mathit{tabletype}}` is valid. + * The table type :math:`{\mathit{tabletype}}` is valid. @@ -4357,7 +4357,7 @@ The external type :math:`(\mathsf{table}~{\mathit{tabletype}})` is valid if: The external type :math:`(\mathsf{mem}~{\mathit{memtype}})` is valid if: - * The memory type :math:`{\mathit{memtype}}` is valid. + * The memory type :math:`{\mathit{memtype}}` is valid. @@ -4365,13 +4365,13 @@ The external type :math:`(\mathsf{mem}~{\mathit{memtype}})` is valid if: The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` matches the value type :math:`t` if: - * Either: + * Either: - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`t`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`t`. - * Or: + * Or: - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{bot}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{bot}`. @@ -4389,11 +4389,11 @@ The value type :math:`\mathsf{bot}` matches the value type :math:`t`. The value type sequence :math:`{t_1^\ast}` matches the value type sequence :math:`{t_2^\ast}` if: - * :math:`{|t_{\mathit{{\scriptstyle 2}*}}|}` is equal to :math:`{|t_{\mathit{{\scriptstyle 1}*}}|}`. + * :math:`{|t_{\mathit{{\scriptstyle 2}*}}|}` is equal to :math:`{|t_{\mathit{{\scriptstyle 1}*}}|}`. - * For all :math:`t_1` in :math:`{t_1^\ast}` and :math:`t_2` in :math:`{t_2^\ast}`: + * For all :math:`t_1` in :math:`{t_1^\ast}` and :math:`t_2` in :math:`{t_2^\ast}`: - * The value type :math:`t_1` matches the value type :math:`t_2`. + * The value type :math:`t_1` matches the value type :math:`t_2`. @@ -4401,9 +4401,9 @@ The value type sequence :math:`{t_1^\ast}` matches the value type sequence :math The limits :math:`({}[~n_{11}~..~n_{12}~])` matches the limits :math:`({}[~n_{21}~..~n_{22}~])` if: - * :math:`n_{11}` is greater than or equal to :math:`n_{21}`. + * :math:`n_{11}` is greater than or equal to :math:`n_{21}`. - * :math:`n_{12}` is less than or equal to :math:`n_{22}`. + * :math:`n_{12}` is less than or equal to :math:`n_{22}`. @@ -4421,7 +4421,7 @@ The global type :math:`{\mathit{gt}}` matches itself. The table type :math:`({\mathit{lim}}_1~{\mathit{rt}})` matches the table type :math:`({\mathit{lim}}_2~{\mathit{rt}})` if: - * The limits :math:`{\mathit{lim}}_1` matches the limits :math:`{\mathit{lim}}_2`. + * The limits :math:`{\mathit{lim}}_1` matches the limits :math:`{\mathit{lim}}_2`. @@ -4429,7 +4429,7 @@ The table type :math:`({\mathit{lim}}_1~{\mathit{rt}})` matches the table type : The memory type :math:`{\mathit{lim}}_1~\mathsf{page}` matches the memory type :math:`{\mathit{lim}}_2~\mathsf{page}` if: - * The limits :math:`{\mathit{lim}}_1` matches the limits :math:`{\mathit{lim}}_2`. + * The limits :math:`{\mathit{lim}}_1` matches the limits :math:`{\mathit{lim}}_2`. @@ -4437,35 +4437,35 @@ The memory type :math:`{\mathit{lim}}_1~\mathsf{page}` matches the memory type : The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` matches the external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` if: - * Either: + * Either: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_2)`. - * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. + * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. - * Or: + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}}_2)`. - * The global type :math:`{\mathit{gt}}_1` matches the global type :math:`{\mathit{gt}}_2`. - * Or: + * The global type :math:`{\mathit{gt}}_1` matches the global type :math:`{\mathit{gt}}_2`. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}}_2)`. - * The table type :math:`{\mathit{tt}}_1` matches the table type :math:`{\mathit{tt}}_2`. - * Or: + * The table type :math:`{\mathit{tt}}_1` matches the table type :math:`{\mathit{tt}}_2`. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}}_2)`. - * The memory type :math:`{\mathit{mt}}_1` matches the memory type :math:`{\mathit{mt}}_2`. + * The memory type :math:`{\mathit{mt}}_1` matches the memory type :math:`{\mathit{mt}}_2`. @@ -4473,7 +4473,7 @@ The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` The external type :math:`(\mathsf{func}~{\mathit{ft}}_1)` matches the external type :math:`(\mathsf{func}~{\mathit{ft}}_2)` if: - * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. + * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. @@ -4481,7 +4481,7 @@ The external type :math:`(\mathsf{func}~{\mathit{ft}}_1)` matches the external t The external type :math:`(\mathsf{global}~{\mathit{gt}}_1)` matches the external type :math:`(\mathsf{global}~{\mathit{gt}}_2)` if: - * The global type :math:`{\mathit{gt}}_1` matches the global type :math:`{\mathit{gt}}_2`. + * The global type :math:`{\mathit{gt}}_1` matches the global type :math:`{\mathit{gt}}_2`. @@ -4489,7 +4489,7 @@ The external type :math:`(\mathsf{global}~{\mathit{gt}}_1)` matches the external The external type :math:`(\mathsf{table}~{\mathit{tt}}_1)` matches the external type :math:`(\mathsf{table}~{\mathit{tt}}_2)` if: - * The table type :math:`{\mathit{tt}}_1` matches the table type :math:`{\mathit{tt}}_2`. + * The table type :math:`{\mathit{tt}}_1` matches the table type :math:`{\mathit{tt}}_2`. @@ -4497,7 +4497,7 @@ The external type :math:`(\mathsf{table}~{\mathit{tt}}_1)` matches the external The external type :math:`(\mathsf{mem}~{\mathit{mt}}_1)` matches the external type :math:`(\mathsf{mem}~{\mathit{mt}}_2)` if: - * The memory type :math:`{\mathit{mt}}_1` matches the memory type :math:`{\mathit{mt}}_2`. + * The memory type :math:`{\mathit{mt}}_1` matches the memory type :math:`{\mathit{mt}}_2`. @@ -4505,25 +4505,25 @@ The external type :math:`(\mathsf{mem}~{\mathit{mt}}_1)` matches the external ty The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid with the function type :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}~\rightarrow~{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` if: - * Either: + * Either: - * The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{{\mathit{valtype}}^?}`. + * The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{{\mathit{valtype}}^?}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{{\mathit{valtype}}^?}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{{\mathit{valtype}}^?}`. - * Or: + * Or: - * The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{typeidx}}`. + * The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{typeidx}}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t_1^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t_1^\ast}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t_2^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t_2^\ast}`. - * The function type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. + * The function type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. - * The function type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The function type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -4536,9 +4536,9 @@ The block type :math:`{{\mathit{valtype}}^?}` is valid with the function type :m The block type :math:`{\mathit{typeidx}}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The function type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. + * The function type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. - * The function type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The function type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -4561,17 +4561,17 @@ The instruction :math:`\mathsf{drop}` is valid with the function type :math:`t~\ The instruction :math:`(\mathsf{select}~{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?})` is valid with the function type :math:`t~t~\mathsf{i{\scriptstyle 32}}~\rightarrow~t` if: - * Either: + * Either: - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`t`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`t`. - * Or: + * Or: - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. - * The value type :math:`t` matches the value type :math:`{t'}`. + * The value type :math:`t` matches the value type :math:`{t'}`. - * The value type :math:`{t'}` is equal to :math:`{\mathit{numtype}}` or :math:`{t'}` is equal to :math:`{\mathit{vectype}}`. + * The value type :math:`{t'}` is equal to :math:`{\mathit{numtype}}` or :math:`{t'}` is equal to :math:`{\mathit{vectype}}`. @@ -4579,11 +4579,11 @@ The instruction :math:`(\mathsf{select}~{t_{\mathit{u{\kern-0.1em\scriptstyle 1} The instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}^\ast})` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The block type :math:`{\mathit{bt}}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The block type :math:`{\mathit{bt}}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -4591,11 +4591,11 @@ The instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}^\ast})` i The instruction :math:`(\mathsf{loop}~{\mathit{bt}}~{{\mathit{instr}}^\ast})` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The block type :math:`{\mathit{bt}}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The block type :math:`{\mathit{bt}}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_1^\ast}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_1^\ast}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -4603,13 +4603,13 @@ The instruction :math:`(\mathsf{loop}~{\mathit{bt}}~{{\mathit{instr}}^\ast})` is The instruction :math:`(\mathsf{if}~{\mathit{bt}}~{{\mathit{instr}}_1^\ast}~\mathsf{else}~{{\mathit{instr}}_2^\ast})` is valid with the function type :math:`{t_1^\ast}~\mathsf{i{\scriptstyle 32}}~\rightarrow~{t_2^\ast}` if: - * The block type :math:`{\mathit{bt}}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The block type :math:`{\mathit{bt}}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_1^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_1^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -4617,9 +4617,9 @@ The instruction :math:`(\mathsf{if}~{\mathit{bt}}~{{\mathit{instr}}_1^\ast}~\mat The instruction :math:`(\mathsf{br}~l)` is valid with the function type :math:`{t_1^\ast}~{t^\ast}~\rightarrow~{t_2^\ast}` if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}`. + * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}`. @@ -4627,9 +4627,9 @@ The instruction :math:`(\mathsf{br}~l)` is valid with the function type :math:`{ The instruction :math:`(\mathsf{br\_if}~l)` is valid with the function type :math:`{t^\ast}~\mathsf{i{\scriptstyle 32}}~\rightarrow~{t^\ast}` if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}`. + * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}`. @@ -4637,17 +4637,17 @@ The instruction :math:`(\mathsf{br\_if}~l)` is valid with the function type :mat The instruction :math:`(\mathsf{br\_table}~{l^\ast}~{l'})` is valid with the function type :math:`{t_1^\ast}~{t^\ast}~\mathsf{i{\scriptstyle 32}}~\rightarrow~{t_2^\ast}` if: - * For all :math:`l` in :math:`{l^\ast}`: + * For all :math:`l` in :math:`{l^\ast}`: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * For all :math:`l` in :math:`{l^\ast}`: + * For all :math:`l` in :math:`{l^\ast}`: - * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. + * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. - * The result type :math:`C{.}\mathsf{labels}{}[{l'}]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[{l'}]` exists. - * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[{l'}]`. + * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[{l'}]`. @@ -4655,9 +4655,9 @@ The instruction :math:`(\mathsf{br\_table}~{l^\ast}~{l'})` is valid with the fun The instruction :math:`(\mathsf{call}~x)` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -4665,13 +4665,13 @@ The instruction :math:`(\mathsf{call}~x)` is valid with the function type :math: The instruction :math:`(\mathsf{call\_indirect}~x~y)` is valid with the function type :math:`{t_1^\ast}~\mathsf{i{\scriptstyle 32}}~\rightarrow~{t_2^\ast}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~\mathsf{funcref})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~\mathsf{funcref})`. - * The function type :math:`C{.}\mathsf{types}{}[y]` exists. + * The function type :math:`C{.}\mathsf{types}{}[y]` exists. - * The function type :math:`C{.}\mathsf{types}{}[y]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The function type :math:`C{.}\mathsf{types}{}[y]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -4679,7 +4679,7 @@ The instruction :math:`(\mathsf{call\_indirect}~x~y)` is valid with the function The instruction :math:`\mathsf{return}` is valid with the function type :math:`{t_1^\ast}~{t^\ast}~\rightarrow~{t_2^\ast}` if: - * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{t^\ast}`. + * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{t^\ast}`. @@ -4712,15 +4712,15 @@ The instruction :math:`({\mathit{nt}} {.} {\mathit{relop}}_{\mathit{nt}})` is va The instruction :math:`({\mathit{nt}}_1 {.} {{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}}{\mathsf{\_}}{{\mathit{nt}}_2})` is valid with the function type :math:`{\mathit{nt}}_2~\rightarrow~{\mathit{nt}}_1` if: - * Either: + * Either: - * :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{reinterpret}`. + * :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{reinterpret}`. - * :math:`{|{\mathit{nt}}_1|}` is equal to :math:`{|{\mathit{nt}}_2|}`. + * :math:`{|{\mathit{nt}}_1|}` is equal to :math:`{|{\mathit{nt}}_2|}`. - * Or: + * Or: - * :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{cvtop}}`. + * :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{cvtop}}`. @@ -4733,9 +4733,9 @@ The instruction :math:`(\mathsf{ref{.}null}~{\mathit{rt}})` is valid with the fu The instruction :math:`(\mathsf{ref{.}func}~x)` is valid with the function type :math:`\epsilon~\rightarrow~\mathsf{funcref}` if: - * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. @@ -4808,9 +4808,9 @@ The instruction :math:`({\mathit{sh}}{.}\mathsf{swizzle})` is valid with the fun The instruction :math:`({\mathit{sh}}{.}\mathsf{shuffle}~{i^\ast})` is valid with the function type :math:`\mathsf{v{\scriptstyle 128}}~\mathsf{v{\scriptstyle 128}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * For all :math:`i` in :math:`{i^\ast}`: + * For all :math:`i` in :math:`{i^\ast}`: - * The lane index :math:`i` is less than :math:`2 \cdot {\mathrm{dim}}({\mathit{sh}})`. + * The lane index :math:`i` is less than :math:`2 \cdot {\mathrm{dim}}({\mathit{sh}})`. @@ -4818,7 +4818,7 @@ The instruction :math:`({\mathit{sh}}{.}\mathsf{shuffle}~{i^\ast})` is valid wit The instruction :math:`({\mathit{sh}}{.}\mathsf{splat})` is valid with the function type :math:`t~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. + * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. @@ -4826,9 +4826,9 @@ The instruction :math:`({\mathit{sh}}{.}\mathsf{splat})` is valid with the funct The instruction :math:`({{\mathit{sh}}{.}\mathsf{extract\_lane}}{{{\mathit{sx}}^?}}~i)` is valid with the function type :math:`\mathsf{v{\scriptstyle 128}}~\rightarrow~t` if: - * The lane index :math:`i` is less than :math:`{\mathrm{dim}}({\mathit{sh}})`. + * The lane index :math:`i` is less than :math:`{\mathrm{dim}}({\mathit{sh}})`. - * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. + * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. @@ -4836,9 +4836,9 @@ The instruction :math:`({{\mathit{sh}}{.}\mathsf{extract\_lane}}{{{\mathit{sx}}^ The instruction :math:`({\mathit{sh}}{.}\mathsf{replace\_lane}~i)` is valid with the function type :math:`\mathsf{v{\scriptstyle 128}}~t~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The lane index :math:`i` is less than :math:`{\mathrm{dim}}({\mathit{sh}})`. + * The lane index :math:`i` is less than :math:`{\mathrm{dim}}({\mathit{sh}})`. - * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. + * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. @@ -4866,9 +4866,9 @@ The instruction :math:`({\mathit{sh}}_1 {.} {{\mathit{sh}}_2}{\mathsf{\_}}{{\mat The instruction :math:`(\mathsf{local{.}get}~x)` is valid with the function type :math:`\epsilon~\rightarrow~t` if: - * The value type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The value type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The value type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. + * The value type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. @@ -4876,9 +4876,9 @@ The instruction :math:`(\mathsf{local{.}get}~x)` is valid with the function type The instruction :math:`(\mathsf{local{.}set}~x)` is valid with the function type :math:`t~\rightarrow~\epsilon` if: - * The value type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The value type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The value type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. + * The value type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. @@ -4886,9 +4886,9 @@ The instruction :math:`(\mathsf{local{.}set}~x)` is valid with the function type The instruction :math:`(\mathsf{local{.}tee}~x)` is valid with the function type :math:`t~\rightarrow~t` if: - * The value type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The value type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The value type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. + * The value type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`t`. @@ -4896,9 +4896,9 @@ The instruction :math:`(\mathsf{local{.}tee}~x)` is valid with the function type The instruction :math:`(\mathsf{global{.}get}~x)` is valid with the function type :math:`\epsilon~\rightarrow~t` if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathit{mut}}~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathit{mut}}~t)`. @@ -4906,9 +4906,9 @@ The instruction :math:`(\mathsf{global{.}get}~x)` is valid with the function typ The instruction :math:`(\mathsf{global{.}set}~x)` is valid with the function type :math:`t~\rightarrow~\epsilon` if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}~t)`. @@ -4916,9 +4916,9 @@ The instruction :math:`(\mathsf{global{.}set}~x)` is valid with the function typ The instruction :math:`(\mathsf{table{.}get}~x)` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathit{rt}}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. @@ -4926,9 +4926,9 @@ The instruction :math:`(\mathsf{table{.}get}~x)` is valid with the function type The instruction :math:`(\mathsf{table{.}set}~x)` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~{\mathit{rt}}~\rightarrow~\epsilon` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. @@ -4936,9 +4936,9 @@ The instruction :math:`(\mathsf{table{.}set}~x)` is valid with the function type The instruction :math:`(\mathsf{table{.}size}~x)` is valid with the function type :math:`\epsilon~\rightarrow~\mathsf{i{\scriptstyle 32}}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. @@ -4946,9 +4946,9 @@ The instruction :math:`(\mathsf{table{.}size}~x)` is valid with the function typ The instruction :math:`(\mathsf{table{.}grow}~x)` is valid with the function type :math:`{\mathit{rt}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\mathsf{i{\scriptstyle 32}}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. @@ -4956,9 +4956,9 @@ The instruction :math:`(\mathsf{table{.}grow}~x)` is valid with the function typ The instruction :math:`(\mathsf{table{.}fill}~x)` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~{\mathit{rt}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. @@ -4966,13 +4966,13 @@ The instruction :math:`(\mathsf{table{.}fill}~x)` is valid with the function typ The instruction :math:`(\mathsf{table{.}copy}~x_1~x_2)` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The table type :math:`C{.}\mathsf{tables}{}[x_1]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x_1]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{lim}}_1~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{lim}}_1~{\mathit{rt}})`. - * The table type :math:`C{.}\mathsf{tables}{}[x_2]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x_2]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x_2]` is equal to :math:`({\mathit{lim}}_2~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x_2]` is equal to :math:`({\mathit{lim}}_2~{\mathit{rt}})`. @@ -4980,13 +4980,13 @@ The instruction :math:`(\mathsf{table{.}copy}~x_1~x_2)` is valid with the functi The instruction :math:`(\mathsf{table{.}init}~x_1~x_2)` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The table type :math:`C{.}\mathsf{tables}{}[x_1]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x_1]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. - * The element type :math:`C{.}\mathsf{elems}{}[x_2]` exists. + * The element type :math:`C{.}\mathsf{elems}{}[x_2]` exists. - * The element type :math:`C{.}\mathsf{elems}{}[x_2]` is equal to :math:`{\mathit{rt}}`. + * The element type :math:`C{.}\mathsf{elems}{}[x_2]` is equal to :math:`{\mathit{rt}}`. @@ -4994,9 +4994,9 @@ The instruction :math:`(\mathsf{table{.}init}~x_1~x_2)` is valid with the functi The instruction :math:`(\mathsf{elem{.}drop}~x)` is valid with the function type :math:`\epsilon~\rightarrow~\epsilon` if: - * The element type :math:`C{.}\mathsf{elems}{}[x]` exists. + * The element type :math:`C{.}\mathsf{elems}{}[x]` exists. - * The element type :math:`C{.}\mathsf{elems}{}[x]` is equal to :math:`{\mathit{rt}}`. + * The element type :math:`C{.}\mathsf{elems}{}[x]` is equal to :math:`{\mathit{rt}}`. @@ -5004,9 +5004,9 @@ The instruction :math:`(\mathsf{elem{.}drop}~x)` is valid with the function type The instruction :math:`\mathsf{memory{.}size}` is valid with the function type :math:`\epsilon~\rightarrow~\mathsf{i{\scriptstyle 32}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. @@ -5014,9 +5014,9 @@ The instruction :math:`\mathsf{memory{.}size}` is valid with the function type : The instruction :math:`\mathsf{memory{.}grow}` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~\mathsf{i{\scriptstyle 32}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. @@ -5024,9 +5024,9 @@ The instruction :math:`\mathsf{memory{.}grow}` is valid with the function type : The instruction :math:`\mathsf{memory{.}fill}` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. @@ -5034,9 +5034,9 @@ The instruction :math:`\mathsf{memory{.}fill}` is valid with the function type : The instruction :math:`\mathsf{memory{.}copy}` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. @@ -5044,13 +5044,13 @@ The instruction :math:`\mathsf{memory{.}copy}` is valid with the function type : The instruction :math:`(\mathsf{memory{.}init}~x)` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * The data type :math:`C{.}\mathsf{datas}{}[x]` exists. + * The data type :math:`C{.}\mathsf{datas}{}[x]` exists. - * The data type :math:`C{.}\mathsf{datas}{}[x]` is equal to :math:`\mathsf{ok}`. + * The data type :math:`C{.}\mathsf{datas}{}[x]` is equal to :math:`\mathsf{ok}`. @@ -5058,9 +5058,9 @@ The instruction :math:`(\mathsf{memory{.}init}~x)` is valid with the function ty The instruction :math:`(\mathsf{data{.}drop}~x)` is valid with the function type :math:`\epsilon~\rightarrow~\epsilon` if: - * The data type :math:`C{.}\mathsf{datas}{}[x]` exists. + * The data type :math:`C{.}\mathsf{datas}{}[x]` exists. - * The data type :math:`C{.}\mathsf{datas}{}[x]` is equal to :math:`\mathsf{ok}`. + * The data type :math:`C{.}\mathsf{datas}{}[x]` is equal to :math:`\mathsf{ok}`. @@ -5068,29 +5068,29 @@ The instruction :math:`(\mathsf{data{.}drop}~x)` is valid with the function type The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{load}}{{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * Either: + * Either: - * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. + * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. - * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. + * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. - * Or: + * Or: - * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. + * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. + * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -5098,29 +5098,29 @@ The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{. The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{store}}{{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * Either: + * Either: - * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. + * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. - * The pack size :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. + * The pack size :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. - * Or: + * Or: - * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. + * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * The pack size :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`M`. + * The pack size :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`M`. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -5128,26 +5128,26 @@ The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{. The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * Either: + * Either: - * :math:`{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({M}{\mathsf{x}}{\mathsf{x}}{\mathsf{\_}}{N})`. + * :math:`{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({M}{\mathsf{x}}{\mathsf{x}}{\mathsf{\_}}{N})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8 \cdot N`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8 \cdot N`. - * Or: + * Or: - * :math:`{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({n}{\mathsf{\_}}{\mathsf{splat}})`. + * :math:`{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({n}{\mathsf{\_}}{\mathsf{splat}})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. - * Or: + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. + * Or: - * :math:`{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({n}{\mathsf{\_}}{\mathsf{zero}})`. + * :math:`{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({n}{\mathsf{\_}}{\mathsf{zero}})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. @@ -5155,13 +5155,13 @@ The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~{\mathit{vl The instruction :math:`(\mathsf{vload\_lane}~\mathsf{v{\scriptstyle 128}}~n~{\mathit{memarg}}~{\mathit{laneidx}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{v{\scriptstyle 128}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. - * :math:`{\mathit{laneidx}}` is less than :math:`128 / n`. + * :math:`{\mathit{laneidx}}` is less than :math:`128 / n`. @@ -5169,11 +5169,11 @@ The instruction :math:`(\mathsf{vload\_lane}~\mathsf{v{\scriptstyle 128}}~n~{\ma The instruction :math:`(\mathsf{vstore}~\mathsf{v{\scriptstyle 128}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{v{\scriptstyle 128}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|\mathsf{v{\scriptstyle 128}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|\mathsf{v{\scriptstyle 128}}|} / 8`. @@ -5181,13 +5181,13 @@ The instruction :math:`(\mathsf{vstore}~\mathsf{v{\scriptstyle 128}}~{\mathit{me The instruction :math:`(\mathsf{vstore\_lane}~\mathsf{v{\scriptstyle 128}}~n~{\mathit{memarg}}~{\mathit{laneidx}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{v{\scriptstyle 128}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. - * :math:`{\mathit{laneidx}}` is less than :math:`128 / n`. + * :math:`{\mathit{laneidx}}` is less than :math:`128 / n`. @@ -5200,9 +5200,9 @@ The instruction :math:`(\mathsf{select}~t)` is valid with the function type :mat The instruction :math:`(\mathsf{select}~\epsilon)` is valid with the function type :math:`t~t~\mathsf{i{\scriptstyle 32}}~\rightarrow~t` if: - * The value type :math:`t` matches the value type :math:`{t'}`. + * The value type :math:`t` matches the value type :math:`{t'}`. - * The value type :math:`{t'}` is equal to :math:`{\mathit{numtype}}` or :math:`{t'}` is equal to :math:`{\mathit{vectype}}`. + * The value type :math:`{t'}` is equal to :math:`{\mathit{numtype}}` or :math:`{t'}` is equal to :math:`{\mathit{vectype}}`. @@ -5210,7 +5210,7 @@ The instruction :math:`(\mathsf{select}~\epsilon)` is valid with the function ty The instruction :math:`({\mathit{nt}}_1 {.} {\mathsf{reinterpret}}{\mathsf{\_}}{{\mathit{nt}}_2})` is valid with the function type :math:`{\mathit{nt}}_2~\rightarrow~{\mathit{nt}}_1` if: - * :math:`{|{\mathit{nt}}_1|}` is equal to :math:`{|{\mathit{nt}}_2|}`. + * :math:`{|{\mathit{nt}}_1|}` is equal to :math:`{|{\mathit{nt}}_2|}`. @@ -5223,11 +5223,11 @@ The instruction :math:`({\mathit{nt}}_1 {.} {{\mathit{cvtop}}}{\mathsf{\_}}{{\ma The instruction :math:`({{\mathit{nt}}{.}\mathsf{load}}{\epsilon}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathit{nt}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. @@ -5235,11 +5235,11 @@ The instruction :math:`({{\mathit{nt}}{.}\mathsf{load}}{\epsilon}~{\mathit{memar The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{M~{\mathit{sx}}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathsf{i}}{n}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -5247,11 +5247,11 @@ The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{M~{\mathit{sx}}}~{\mat The instruction :math:`({{\mathit{nt}}{.}\mathsf{store}}{\epsilon}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~{\mathit{nt}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. @@ -5259,11 +5259,11 @@ The instruction :math:`({{\mathit{nt}}{.}\mathsf{store}}{\epsilon}~{\mathit{mema The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{store}}{M}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~{\mathsf{i}}{n}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -5271,11 +5271,11 @@ The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{store}}{M}~{\mathit{memarg}}) The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~({M}{\mathsf{x}}{\mathsf{x}}{\mathsf{\_}}{N})~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8 \cdot N`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8 \cdot N`. @@ -5283,11 +5283,11 @@ The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~({M}{\maths The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~({n}{\mathsf{\_}}{\mathsf{splat}})~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. @@ -5295,11 +5295,11 @@ The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~({n}{\maths The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~({n}{\mathsf{\_}}{\mathsf{zero}})~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`n / 8`. @@ -5307,47 +5307,47 @@ The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~({n}{\maths The instruction sequence :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is valid with the function type :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}~\rightarrow~{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` if: - * Either: + * Either: - * The instruction sequence :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The instruction sequence :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`\epsilon`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`\epsilon`. - * Or: + * Or: - * The instruction sequence :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}`. + * The instruction sequence :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t_1^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t_1^\ast}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t_3^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t_3^\ast}`. - * The instruction :math:`{\mathit{instr}}_1` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The instruction :math:`{\mathit{instr}}_1` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * The instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_2^\ast}~\rightarrow~{t_3^\ast}`. - * Or: + * The instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_2^\ast}~\rightarrow~{t_3^\ast}`. + * Or: - * The instruction sequence :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. + * The instruction sequence :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{t'}_1^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{t'}_1^\ast}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{{t'}_2^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{{t'}_2^\ast}`. - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * The value type sequence :math:`{{t'}_1^\ast}` matches the value type sequence :math:`{t_1^\ast}`. + * The value type sequence :math:`{{t'}_1^\ast}` matches the value type sequence :math:`{t_1^\ast}`. - * The value type sequence :math:`{t_2^\ast}` matches the value type sequence :math:`{{t'}_2^\ast}`. - * Or: + * The value type sequence :math:`{t_2^\ast}` matches the value type sequence :math:`{{t'}_2^\ast}`. + * Or: - * The instruction sequence :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. + * The instruction sequence :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t^\ast}~{t_1^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t^\ast}~{t_1^\ast}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t^\ast}~{t_2^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t^\ast}~{t_2^\ast}`. - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -5360,9 +5360,9 @@ The instruction sequence :math:`\epsilon` is valid with the function type :math: The instruction sequence :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_3^\ast}` if: - * The instruction :math:`{\mathit{instr}}_1` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The instruction :math:`{\mathit{instr}}_1` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * The instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_2^\ast}~\rightarrow~{t_3^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the function type :math:`{t_2^\ast}~\rightarrow~{t_3^\ast}`. @@ -5370,11 +5370,11 @@ The instruction sequence :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}` is The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{{t'}_1^\ast}~\rightarrow~{{t'}_2^\ast}` if: - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * The value type sequence :math:`{{t'}_1^\ast}` matches the value type sequence :math:`{t_1^\ast}`. + * The value type sequence :math:`{{t'}_1^\ast}` matches the value type sequence :math:`{t_1^\ast}`. - * The value type sequence :math:`{t_2^\ast}` matches the value type sequence :math:`{{t'}_2^\ast}`. + * The value type sequence :math:`{t_2^\ast}` matches the value type sequence :math:`{{t'}_2^\ast}`. @@ -5382,7 +5382,7 @@ The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the funct The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t^\ast}~{t_1^\ast}~\rightarrow~{t^\ast}~{t_2^\ast}` if: - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -5390,7 +5390,7 @@ The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the funct The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :math:`{t^\ast}` if: - * The expression :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~{t^\ast}`. + * The expression :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`\epsilon~\rightarrow~{t^\ast}`. @@ -5398,26 +5398,26 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is const if: - * Either: + * Either: - * The instruction :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathit{nt}}{.}\mathsf{const}~c)`. + * The instruction :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathit{nt}}{.}\mathsf{const}~c)`. - * Or: + * Or: - * The instruction :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathit{vt}}{.}\mathsf{const}~{\mathit{vc}})`. - * Or: + * The instruction :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathit{vt}}{.}\mathsf{const}~{\mathit{vc}})`. + * Or: - * The instruction :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{ref{.}null}~{\mathit{rt}})`. - * Or: + * The instruction :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{ref{.}null}~{\mathit{rt}})`. + * Or: - * The instruction :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{ref{.}func}~x)`. - * Or: + * The instruction :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{ref{.}func}~x)`. + * Or: - * The instruction :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global{.}get}~x)`. + * The instruction :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global{.}get}~x)`. - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. @@ -5445,9 +5445,9 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma :math:`(\mathsf{global{.}get}~x)` is const if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. @@ -5455,9 +5455,9 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma :math:`{{\mathit{instr}}^\ast}` is const if: - * For all :math:`{\mathit{instr}}` in :math:`{{\mathit{instr}}^\ast}`: + * For all :math:`{\mathit{instr}}` in :math:`{{\mathit{instr}}^\ast}`: - * :math:`{\mathit{instr}}` is const. + * :math:`{\mathit{instr}}` is const. @@ -5465,7 +5465,7 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma The type :math:`(\mathsf{type}~{\mathit{ft}})` is valid with the function type :math:`{\mathit{ft}}` if: - * The function type :math:`{\mathit{ft}}` is valid. + * The function type :math:`{\mathit{ft}}` is valid. @@ -5473,11 +5473,11 @@ The type :math:`(\mathsf{type}~{\mathit{ft}})` is valid with the function type : The function :math:`(\mathsf{func}~x~{(\mathsf{local}~t)^\ast}~{\mathit{expr}})` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The function type :math:`C{.}\mathsf{types}{}[x]` exists. + * The function type :math:`C{.}\mathsf{types}{}[x]` exists. - * The function type :math:`C{.}\mathsf{types}{}[x]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The function type :math:`C{.}\mathsf{types}{}[x]` is equal to :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Under the context :math:`C{}[{.}\mathsf{locals} \mathrel{{=}{\oplus}} {t_1^\ast}~{t^\ast}]{}[{.}\mathsf{labels} \mathrel{{=}{\oplus}} {t_2^\ast}]{}[{.}\mathsf{return} \mathrel{{=}{\oplus}} {t_2^\ast}]`, the expression :math:`{\mathit{expr}}` is valid with the result type :math:`{t_2^\ast}`. + * Under the context :math:`C{}[{.}\mathsf{locals} \mathrel{{=}{\oplus}} {t_1^\ast}~{t^\ast}]{}[{.}\mathsf{labels} \mathrel{{=}{\oplus}} {t_2^\ast}]{}[{.}\mathsf{return} \mathrel{{=}{\oplus}} {t_2^\ast}]`, the expression :math:`{\mathit{expr}}` is valid with the result type :math:`{t_2^\ast}`. @@ -5485,13 +5485,13 @@ The function :math:`(\mathsf{func}~x~{(\mathsf{local}~t)^\ast}~{\mathit{expr}})` The global :math:`(\mathsf{global}~{\mathit{gt}}~{\mathit{expr}})` is valid with the global type :math:`{\mathit{gt}}` if: - * The global type :math:`{\mathit{gt}}` is valid. + * The global type :math:`{\mathit{gt}}` is valid. - * The global type :math:`{\mathit{gt}}` is equal to :math:`({\mathit{mut}}~t)`. + * The global type :math:`{\mathit{gt}}` is equal to :math:`({\mathit{mut}}~t)`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`t`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`t`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. @@ -5499,7 +5499,7 @@ The global :math:`(\mathsf{global}~{\mathit{gt}}~{\mathit{expr}})` is valid with The table :math:`(\mathsf{table}~{\mathit{tt}})` is valid with the table type :math:`{\mathit{tt}}` if: - * The table type :math:`{\mathit{tt}}` is valid. + * The table type :math:`{\mathit{tt}}` is valid. @@ -5507,7 +5507,7 @@ The table :math:`(\mathsf{table}~{\mathit{tt}})` is valid with the table type :m The memory :math:`(\mathsf{memory}~{\mathit{mt}})` is valid with the memory type :math:`{\mathit{mt}}` if: - * The memory type :math:`{\mathit{mt}}` is valid. + * The memory type :math:`{\mathit{mt}}` is valid. @@ -5515,24 +5515,24 @@ The memory :math:`(\mathsf{memory}~{\mathit{mt}})` is valid with the memory type :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid with the reference type :math:`{\mathit{rt}}` if: - * Either: + * Either: - * :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{active}~x~{\mathit{expr}})`. + * :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{active}~x~{\mathit{expr}})`. - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. - * Or: + * Or: - * :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{passive}`. - * Or: + * :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{passive}`. + * Or: - * :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{declare}`. + * :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{declare}`. @@ -5540,13 +5540,13 @@ The memory :math:`(\mathsf{memory}~{\mathit{mt}})` is valid with the memory type :math:`(\mathsf{active}~x~{\mathit{expr}})` is valid with the reference type :math:`{\mathit{rt}}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{lim}}~{\mathit{rt}})`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. @@ -5564,13 +5564,13 @@ The memory :math:`(\mathsf{memory}~{\mathit{mt}})` is valid with the memory type The table segment :math:`(\mathsf{elem}~{\mathit{rt}}~{{\mathit{expr}}^\ast}~{\mathit{elemmode}})` is valid with the reference type :math:`{\mathit{rt}}` if: - * For all :math:`{\mathit{expr}}` in :math:`{{\mathit{expr}}^\ast}`: + * For all :math:`{\mathit{expr}}` in :math:`{{\mathit{expr}}^\ast}`: - * The expression :math:`{\mathit{expr}}` is valid with the reference type :math:`{\mathit{rt}}`. + * The expression :math:`{\mathit{expr}}` is valid with the reference type :math:`{\mathit{rt}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. - * :math:`{\mathit{elemmode}}` is valid with the reference type :math:`{\mathit{rt}}`. + * :math:`{\mathit{elemmode}}` is valid with the reference type :math:`{\mathit{rt}}`. @@ -5578,21 +5578,21 @@ The table segment :math:`(\mathsf{elem}~{\mathit{rt}}~{{\mathit{expr}}^\ast}~{\m :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid if: - * Either: + * Either: - * :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{active}~0~{\mathit{expr}})`. + * :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{active}~0~{\mathit{expr}})`. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. - * Or: + * Or: - * :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{passive}`. + * :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{passive}`. @@ -5600,13 +5600,13 @@ The table segment :math:`(\mathsf{elem}~{\mathit{rt}}~{{\mathit{expr}}^\ast}~{\m :math:`(\mathsf{active}~0~{\mathit{expr}})` is valid if: - * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[0]` is equal to :math:`{\mathit{mt}}`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. @@ -5619,7 +5619,7 @@ The table segment :math:`(\mathsf{elem}~{\mathit{rt}}~{{\mathit{expr}}^\ast}~{\m The memory segment :math:`(\mathsf{data}~{b^\ast}~{\mathit{datamode}})` is valid if: - * :math:`{\mathit{datamode}}` is valid. + * :math:`{\mathit{datamode}}` is valid. @@ -5627,9 +5627,9 @@ The memory segment :math:`(\mathsf{data}~{b^\ast}~{\mathit{datamode}})` is valid The start function :math:`(\mathsf{start}~x)` is valid if: - * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`\epsilon~\rightarrow~\epsilon`. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`\epsilon~\rightarrow~\epsilon`. @@ -5637,7 +5637,7 @@ The start function :math:`(\mathsf{start}~x)` is valid if: The import :math:`(\mathsf{import}~{\mathit{name}}_1~{\mathit{name}}_2~{\mathit{xt}})` is valid with the external type :math:`{\mathit{xt}}` if: - * The external type :math:`{\mathit{xt}}` is valid. + * The external type :math:`{\mathit{xt}}` is valid. @@ -5645,43 +5645,43 @@ The import :math:`(\mathsf{import}~{\mathit{name}}_1~{\mathit{name}}_2~{\mathit{ The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid with the external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` if: - * Either: + * Either: - * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~x)`. + * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}})`. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. - * Or: + * Or: - * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~x)`. + * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}})`. - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. - * Or: + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. + * Or: - * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~x)`. + * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}})`. - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. - * Or: + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. + * Or: - * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~x)`. + * The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}})`. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. @@ -5689,9 +5689,9 @@ The external index :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyl The external index :math:`(\mathsf{func}~x)` is valid with the external type :math:`(\mathsf{func}~{\mathit{ft}})` if: - * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. + * The function type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{ft}}`. @@ -5699,9 +5699,9 @@ The external index :math:`(\mathsf{func}~x)` is valid with the external type :ma The external index :math:`(\mathsf{global}~x)` is valid with the external type :math:`(\mathsf{global}~{\mathit{gt}})` if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. @@ -5709,9 +5709,9 @@ The external index :math:`(\mathsf{global}~x)` is valid with the external type : The external index :math:`(\mathsf{table}~x)` is valid with the external type :math:`(\mathsf{table}~{\mathit{tt}})` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. @@ -5719,9 +5719,9 @@ The external index :math:`(\mathsf{table}~x)` is valid with the external type :m The external index :math:`(\mathsf{mem}~x)` is valid with the external type :math:`(\mathsf{mem}~{\mathit{mt}})` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. @@ -5729,7 +5729,7 @@ The external index :math:`(\mathsf{mem}~x)` is valid with the external type :mat The export :math:`(\mathsf{export}~{\mathit{name}}~{\mathit{externidx}})` is valid with the external type :math:`{\mathit{xt}}` if: - * The external index :math:`{\mathit{externidx}}` is valid with the external type :math:`{\mathit{xt}}`. + * The external index :math:`{\mathit{externidx}}` is valid with the external type :math:`{\mathit{xt}}`. @@ -5737,75 +5737,75 @@ The export :math:`(\mathsf{export}~{\mathit{name}}~{\mathit{externidx}})` is val The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\ast}~{{\mathit{func}}^\ast}~{{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~{{\mathit{elem}}^\ast}~{{\mathit{data}}^{n}}~{{\mathit{start}}^?}~{{\mathit{export}}^\ast})` is valid if: - * :math:`{|{\mathit{type*}}|}` is equal to :math:`{|{\mathit{ft'*}}|}`. + * :math:`{|{\mathit{type*}}|}` is equal to :math:`{|{\mathit{ft'*}}|}`. - * For all :math:`{\mathit{ft}'}` in :math:`{{\mathit{ft}'}^\ast}` and :math:`{\mathit{type}}` in :math:`{{\mathit{type}}^\ast}`: + * For all :math:`{\mathit{ft}'}` in :math:`{{\mathit{ft}'}^\ast}` and :math:`{\mathit{type}}` in :math:`{{\mathit{type}}^\ast}`: - * The type :math:`{\mathit{type}}` is valid with the function type :math:`{\mathit{ft}'}`. + * The type :math:`{\mathit{type}}` is valid with the function type :math:`{\mathit{ft}'}`. - * :math:`{|{\mathit{ixt*}}|}` is equal to :math:`{|{\mathit{import*}}|}`. + * :math:`{|{\mathit{ixt*}}|}` is equal to :math:`{|{\mathit{import*}}|}`. - * For all :math:`{\mathit{import}}` in :math:`{{\mathit{import}}^\ast}` and :math:`{\mathit{ixt}}` in :math:`{{\mathit{ixt}}^\ast}`: + * For all :math:`{\mathit{import}}` in :math:`{{\mathit{import}}^\ast}` and :math:`{\mathit{ixt}}` in :math:`{{\mathit{ixt}}^\ast}`: - * Under the context :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`, the import :math:`{\mathit{import}}` is valid with the external type :math:`{\mathit{ixt}}`. + * Under the context :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`, the import :math:`{\mathit{import}}` is valid with the external type :math:`{\mathit{ixt}}`. - * :math:`{|{\mathit{gt*}}|}` is equal to :math:`{|{\mathit{global*}}|}`. + * :math:`{|{\mathit{gt*}}|}` is equal to :math:`{|{\mathit{global*}}|}`. - * For all :math:`{\mathit{global}}` in :math:`{{\mathit{global}}^\ast}` and :math:`{\mathit{gt}}` in :math:`{{\mathit{gt}}^\ast}`: + * For all :math:`{\mathit{global}}` in :math:`{{\mathit{global}}^\ast}` and :math:`{\mathit{gt}}` in :math:`{{\mathit{gt}}^\ast}`: - * Under the context :math:`{C'}`, the global :math:`{\mathit{global}}` is valid with the global type :math:`{\mathit{gt}}`. + * Under the context :math:`{C'}`, the global :math:`{\mathit{global}}` is valid with the global type :math:`{\mathit{gt}}`. - * :math:`{|{\mathit{tt*}}|}` is equal to :math:`{|{\mathit{table*}}|}`. + * :math:`{|{\mathit{tt*}}|}` is equal to :math:`{|{\mathit{table*}}|}`. - * For all :math:`{\mathit{table}}` in :math:`{{\mathit{table}}^\ast}` and :math:`{\mathit{tt}}` in :math:`{{\mathit{tt}}^\ast}`: + * For all :math:`{\mathit{table}}` in :math:`{{\mathit{table}}^\ast}` and :math:`{\mathit{tt}}` in :math:`{{\mathit{tt}}^\ast}`: - * Under the context :math:`{C'}`, the table :math:`{\mathit{table}}` is valid with the table type :math:`{\mathit{tt}}`. + * Under the context :math:`{C'}`, the table :math:`{\mathit{table}}` is valid with the table type :math:`{\mathit{tt}}`. - * :math:`{|{\mathit{mt*}}|}` is equal to :math:`{|{\mathit{mem*}}|}`. + * :math:`{|{\mathit{mt*}}|}` is equal to :math:`{|{\mathit{mem*}}|}`. - * For all :math:`{\mathit{mem}}` in :math:`{{\mathit{mem}}^\ast}` and :math:`{\mathit{mt}}` in :math:`{{\mathit{mt}}^\ast}`: + * For all :math:`{\mathit{mem}}` in :math:`{{\mathit{mem}}^\ast}` and :math:`{\mathit{mt}}` in :math:`{{\mathit{mt}}^\ast}`: - * Under the context :math:`{C'}`, the memory :math:`{\mathit{mem}}` is valid with the memory type :math:`{\mathit{mt}}`. + * Under the context :math:`{C'}`, the memory :math:`{\mathit{mem}}` is valid with the memory type :math:`{\mathit{mt}}`. - * :math:`{|{\mathit{rt*}}|}` is equal to :math:`{|{\mathit{elem*}}|}`. + * :math:`{|{\mathit{rt*}}|}` is equal to :math:`{|{\mathit{elem*}}|}`. - * For all :math:`{\mathit{elem}}` in :math:`{{\mathit{elem}}^\ast}` and :math:`{\mathit{rt}}` in :math:`{{\mathit{rt}}^\ast}`: + * For all :math:`{\mathit{elem}}` in :math:`{{\mathit{elem}}^\ast}` and :math:`{\mathit{rt}}` in :math:`{{\mathit{rt}}^\ast}`: - * Under the context :math:`{C'}`, the table segment :math:`{\mathit{elem}}` is valid with the reference type :math:`{\mathit{rt}}`. + * Under the context :math:`{C'}`, the table segment :math:`{\mathit{elem}}` is valid with the reference type :math:`{\mathit{rt}}`. - * For all :math:`{\mathit{data}}` in :math:`{{\mathit{data}}^\ast}`: + * For all :math:`{\mathit{data}}` in :math:`{{\mathit{data}}^\ast}`: - * Under the context :math:`{C'}`, the memory segment :math:`{\mathit{data}}` is valid. + * Under the context :math:`{C'}`, the memory segment :math:`{\mathit{data}}` is valid. - * :math:`{|{\mathit{func*}}|}` is equal to :math:`{|{\mathit{ft*}}|}`. + * :math:`{|{\mathit{func*}}|}` is equal to :math:`{|{\mathit{ft*}}|}`. - * For all :math:`{\mathit{ft}}` in :math:`{{\mathit{ft}}^\ast}` and :math:`{\mathit{func}}` in :math:`{{\mathit{func}}^\ast}`: + * For all :math:`{\mathit{ft}}` in :math:`{{\mathit{ft}}^\ast}` and :math:`{\mathit{func}}` in :math:`{{\mathit{func}}^\ast}`: - * The function :math:`{\mathit{func}}` is valid with the function type :math:`{\mathit{ft}}`. + * The function :math:`{\mathit{func}}` is valid with the function type :math:`{\mathit{ft}}`. - * If :math:`{\mathit{start}}` is defined, then: + * If :math:`{\mathit{start}}` is defined, then: - * The start function :math:`{\mathit{start}}` is valid. + * The start function :math:`{\mathit{start}}` is valid. - * :math:`{|{\mathit{xt*}}|}` is equal to :math:`{|{\mathit{export*}}|}`. + * :math:`{|{\mathit{xt*}}|}` is equal to :math:`{|{\mathit{export*}}|}`. - * For all :math:`{\mathit{export}}` in :math:`{{\mathit{export}}^\ast}` and :math:`{\mathit{xt}}` in :math:`{{\mathit{xt}}^\ast}`: + * For all :math:`{\mathit{export}}` in :math:`{{\mathit{export}}^\ast}` and :math:`{\mathit{xt}}` in :math:`{{\mathit{xt}}^\ast}`: - * The export :math:`{\mathit{export}}` is valid with the external type :math:`{\mathit{xt}}`. + * The export :math:`{\mathit{export}}` is valid with the external type :math:`{\mathit{xt}}`. - * :math:`{|{{\mathit{mt}}^\ast}|}` is less than or equal to :math:`1`. + * :math:`{|{{\mathit{mt}}^\ast}|}` is less than or equal to :math:`1`. - * The context :math:`C` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~{{\mathit{ift}}^\ast}~{{\mathit{ft}}^\ast},\; \mathsf{globals}~{{\mathit{igt}}^\ast}~{{\mathit{gt}}^\ast},\; \mathsf{tables}~{{\mathit{itt}}^\ast}~{{\mathit{tt}}^\ast},\; \mathsf{mems}~{{\mathit{imt}}^\ast}~{{\mathit{mt}}^\ast},\; \mathsf{elems}~{{\mathit{rt}}^\ast},\; \mathsf{datas}~{\mathsf{ok}^{n}},\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`. + * The context :math:`C` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~{{\mathit{ift}}^\ast}~{{\mathit{ft}}^\ast},\; \mathsf{globals}~{{\mathit{igt}}^\ast}~{{\mathit{gt}}^\ast},\; \mathsf{tables}~{{\mathit{itt}}^\ast}~{{\mathit{tt}}^\ast},\; \mathsf{mems}~{{\mathit{imt}}^\ast}~{{\mathit{mt}}^\ast},\; \mathsf{elems}~{{\mathit{rt}}^\ast},\; \mathsf{datas}~{\mathsf{ok}^{n}},\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`. - * The context :math:`{C'}` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~{{\mathit{ift}}^\ast}~{{\mathit{ft}}^\ast},\; \mathsf{globals}~{{\mathit{igt}}^\ast},\; \mathsf{tables}~{{\mathit{itt}}^\ast}~{{\mathit{tt}}^\ast},\; \mathsf{mems}~{{\mathit{imt}}^\ast}~{{\mathit{mt}}^\ast},\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`. + * The context :math:`{C'}` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{ft}'}^\ast},\; \mathsf{funcs}~{{\mathit{ift}}^\ast}~{{\mathit{ft}}^\ast},\; \mathsf{globals}~{{\mathit{igt}}^\ast},\; \mathsf{tables}~{{\mathit{itt}}^\ast}~{{\mathit{tt}}^\ast},\; \mathsf{mems}~{{\mathit{imt}}^\ast}~{{\mathit{mt}}^\ast},\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon \}\end{array}`. - * The function type sequence :math:`{{\mathit{ift}}^\ast}` is equal to :math:`{\mathrm{funcs}}({{\mathit{ixt}}^\ast})`. + * The function type sequence :math:`{{\mathit{ift}}^\ast}` is equal to :math:`{\mathrm{funcs}}({{\mathit{ixt}}^\ast})`. - * The global type sequence :math:`{{\mathit{igt}}^\ast}` is equal to :math:`{\mathrm{globals}}({{\mathit{ixt}}^\ast})`. + * The global type sequence :math:`{{\mathit{igt}}^\ast}` is equal to :math:`{\mathrm{globals}}({{\mathit{ixt}}^\ast})`. - * The table type sequence :math:`{{\mathit{itt}}^\ast}` is equal to :math:`{\mathrm{tables}}({{\mathit{ixt}}^\ast})`. + * The table type sequence :math:`{{\mathit{itt}}^\ast}` is equal to :math:`{\mathrm{tables}}({{\mathit{ixt}}^\ast})`. - * The memory type sequence :math:`{{\mathit{imt}}^\ast}` is equal to :math:`{\mathrm{mems}}({{\mathit{ixt}}^\ast})`. + * The memory type sequence :math:`{{\mathit{imt}}^\ast}` is equal to :math:`{\mathrm{mems}}({{\mathit{ixt}}^\ast})`. :math:`\mathsf{unreachable}` @@ -5851,11 +5851,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`c \neq 0`, then: - a. Push the value :math:`{\mathit{val}}_1` to the stack. + a. Push the value :math:`{\mathit{val}}_1` to the stack. #. Else: - a. Push the value :math:`{\mathit{val}}_2` to the stack. + a. Push the value :math:`{\mathit{val}}_2` to the stack. :math:`\mathsf{if}~{\mathit{bt}}~{{\mathit{instr}}_1^\ast}~{{\mathit{instr}}_2^\ast}` @@ -5868,11 +5868,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`c \neq 0`, then: - a. Execute the instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}_1^\ast})`. + a. Execute the instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}_1^\ast})`. #. Else: - a. Execute the instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}_2^\ast})`. + a. Execute the instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}_2^\ast})`. :math:`\mathsf{label}` @@ -5898,31 +5898,31 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 0`, then: - a. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. + a. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. - #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. + #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. - #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. + #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{label}` context from the stack. + #. Pop the current :math:`\mathsf{label}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. + #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. - #. Execute the instruction :math:`{{\mathit{instr}'}^\ast}`. + #. Execute the instruction :math:`{{\mathit{instr}'}^\ast}`. #. Else: - a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #. If :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} \geq 1`, then: + #. If :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} \geq 1`, then: - 1) Let :math:`l` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} - 1`. + 1) Let :math:`l` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} - 1`. - #) Pop the current :math:`\mathsf{label}` context from the stack. + #) Pop the current :math:`\mathsf{label}` context from the stack. - #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #) Execute the instruction :math:`(\mathsf{br}~l)`. + #) Execute the instruction :math:`(\mathsf{br}~l)`. :math:`\mathsf{br\_if}~l` @@ -5935,11 +5935,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`c \neq 0`, then: - a. Execute the instruction :math:`(\mathsf{br}~l)`. + a. Execute the instruction :math:`(\mathsf{br}~l)`. #. Else: - a. Do nothing. + a. Do nothing. :math:`\mathsf{br\_table}~{l^\ast}~{l'}` @@ -5952,11 +5952,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i < {|{l^\ast}|}`, then: - a. Execute the instruction :math:`(\mathsf{br}~{l^\ast}{}[i])`. + a. Execute the instruction :math:`(\mathsf{br}~{l^\ast}{}[i])`. #. Else: - a. Execute the instruction :math:`(\mathsf{br}~{l'})`. + a. Execute the instruction :math:`(\mathsf{br}~{l'})`. :math:`\mathsf{frame}` @@ -5984,27 +5984,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the first non-value entry of the stack is a :math:`\mathsf{frame}`, then: - a. Let :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` be the current :math:`\mathsf{frame}` context. + a. Let :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` be the current :math:`\mathsf{frame}` context. - #. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. + #. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. - #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. + #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. - #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. + #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{frame}` context from the stack. + #. Pop the current :math:`\mathsf{frame}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. + #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. #. Else if the first non-value entry of the stack is a :math:`\mathsf{label}`, then: - a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{label}` context from the stack. + #. Pop the current :math:`\mathsf{label}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #. Execute the instruction :math:`\mathsf{return}`. + #. Execute the instruction :math:`\mathsf{return}`. :math:`{\mathit{nt}} {.} {\mathit{unop}}` @@ -6017,7 +6017,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{|{{\mathit{unop}}}{{}_{{\mathit{nt}}}}{(c_1)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{unop}}}{{}_{{\mathit{nt}}}}{(c_1)}`. @@ -6038,7 +6038,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{|{{\mathit{binop}}}{{}_{{\mathit{nt}}}}{(c_1, c_2)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{binop}}}{{}_{{\mathit{nt}}}}{(c_1, c_2)}`. @@ -6085,7 +6085,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{|{{\mathit{cvtop}}}{{}_{{\mathit{nt}}_1, {\mathit{nt}}_2}}{(c_1)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{cvtop}}}{{}_{{\mathit{nt}}_1, {\mathit{nt}}_2}}{(c_1)}`. @@ -6102,11 +6102,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{ref}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. #. Else: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. :math:`\mathsf{v{\scriptstyle 128}} {.} {\mathit{vvunop}}` @@ -6183,7 +6183,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{|{{\mathit{vunop}}}{{}_{{\mathit{sh}}}}{(c_1)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{vunop}}}{{}_{{\mathit{sh}}}}{(c_1)}`. @@ -6204,7 +6204,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{|{{\mathit{vbinop}}}{{}_{{\mathit{sh}}}}{(c_1, c_2)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{vbinop}}}{{}_{{\mathit{sh}}}}{(c_1, c_2)}`. @@ -6223,11 +6223,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{({\mathit{ci}}_1 \neq 0)^\ast}`, then: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. #. Else: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. :math:`{\mathit{sh}} {.} {\mathit{vrelop}}` @@ -6354,27 +6354,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined and the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{nt}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{nt}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`i < {|{{\mathrm{lanes}}}_{{{\mathit{nt}}}{\mathsf{x}}{N}}(c_1)|}`, then: + #. If :math:`i < {|{{\mathrm{lanes}}}_{{{\mathit{nt}}}{\mathsf{x}}{N}}(c_1)|}`, then: - 1) Let :math:`c_2` be :math:`{{\mathrm{lanes}}}_{{{\mathit{nt}}}{\mathsf{x}}{N}}(c_1){}[i]`. + 1) Let :math:`c_2` be :math:`{{\mathrm{lanes}}}_{{{\mathit{nt}}}{\mathsf{x}}{N}}(c_1){}[i]`. - #) Push the value :math:`({\mathit{nt}}{.}\mathsf{const}~c_2)` to the stack. + #) Push the value :math:`({\mathit{nt}}{.}\mathsf{const}~c_2)` to the stack. #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type, then: - a. Let :math:`{\mathit{pt}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{pt}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + #. If :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`{\mathit{sx}}` be :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`{\mathit{sx}}` be :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) If :math:`i < {|{{\mathrm{lanes}}}_{{{\mathit{pt}}}{\mathsf{x}}{N}}(c_1)|}`, then: + #) If :math:`i < {|{{\mathrm{lanes}}}_{{{\mathit{pt}}}{\mathsf{x}}{N}}(c_1)|}`, then: - a) Let :math:`c_2` be :math:`{{{{\mathrm{extend}}}_{{|{\mathit{pt}}|}, 32}^{{\mathit{sx}}}}}{({{\mathrm{lanes}}}_{{{\mathit{pt}}}{\mathsf{x}}{N}}(c_1){}[i])}`. + a) Let :math:`c_2` be :math:`{{{{\mathrm{extend}}}_{{|{\mathit{pt}}|}, 32}^{{\mathit{sx}}}}}{({{\mathrm{lanes}}}_{{{\mathit{pt}}}{\mathsf{x}}{N}}(c_1){}[i])}`. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~c_2)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~c_2)` to the stack. :math:`{{\mathsf{i}}{n}}{\mathsf{x}}{N}{.}\mathsf{replace\_lane}~i` @@ -6461,73 +6461,73 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{{\mathit{hf}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined and :math:`{{\mathit{zero}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`M` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + #. Let :math:`M` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = M`, then: + #. If :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = M`, then: - 1) Let :math:`{{\mathit{ci}}^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M}}(c_1)`. + 1) Let :math:`{{\mathit{ci}}^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M}}(c_1)`. - #) Let :math:`{{{\mathit{cj}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{vcvtop}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M}, {{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M}}({\mathit{vcvtop}}, {\mathit{ci}})^\ast}`. + #) Let :math:`{{{\mathit{cj}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{vcvtop}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M}, {{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M}}({\mathit{vcvtop}}, {\mathit{ci}})^\ast}`. - #) If :math:`{|{{{\mathrm{invlanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M}}({{\mathit{cj}}^\ast})^\ast}|} > 0`, then: + #) If :math:`{|{{{\mathrm{invlanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M}}({{\mathit{cj}}^\ast})^\ast}|} > 0`, then: - a) Let :math:`c` be an element of :math:`{{{\mathrm{invlanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M}}({{\mathit{cj}}^\ast})^\ast}`. + a) Let :math:`c` be an element of :math:`{{{\mathrm{invlanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M}}({{\mathit{cj}}^\ast})^\ast}`. - #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. #. If :math:`{{\mathit{zero}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`M_1` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + #. Let :math:`M_1` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. Let :math:`M_2` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`M_2` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{{\mathit{hf}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + #. If :math:`{{\mathit{hf}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`{\mathit{half}}` be :math:`{{\mathit{hf}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`{\mathit{half}}` be :math:`{{\mathit{hf}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`{{\mathit{ci}}^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M_1}}(c_1){}[{\mathrm{half}}({\mathit{half}}, 0, M_2) : M_2]`. + #) Let :math:`{{\mathit{ci}}^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M_1}}(c_1){}[{\mathrm{half}}({\mathit{half}}, 0, M_2) : M_2]`. - #) Let :math:`{{{\mathit{cj}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{vcvtop}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}({\mathit{vcvtop}}, {\mathit{ci}})^\ast}`. + #) Let :math:`{{{\mathit{cj}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{vcvtop}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}({\mathit{vcvtop}}, {\mathit{ci}})^\ast}`. - #) If :math:`{|{{{\mathrm{invlanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}({{\mathit{cj}}^\ast})^\ast}|} > 0`, then: + #) If :math:`{|{{{\mathrm{invlanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}({{\mathit{cj}}^\ast})^\ast}|} > 0`, then: - a) Let :math:`c` be an element of :math:`{{{\mathrm{invlanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}({{\mathit{cj}}^\ast})^\ast}`. + a) Let :math:`c` be an element of :math:`{{{\mathrm{invlanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}({{\mathit{cj}}^\ast})^\ast}`. - #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. #. If :math:`{{\mathit{hf}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`M_1` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + a. Let :math:`M_1` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. Let :math:`M_2` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`M_2` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is number type, then: + #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is number type, then: - 1) Let :math:`{\mathit{nt}}_1` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + 1) Let :math:`{\mathit{nt}}_1` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #) If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: + #) If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a) Let :math:`{\mathit{nt}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`{\mathit{nt}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{{\mathit{zero}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + #) If :math:`{{\mathit{zero}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1. Let :math:`{{\mathit{ci}}^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathit{nt}}_1}{\mathsf{x}}{M_1}}(c_1)`. + 1. Let :math:`{{\mathit{ci}}^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathit{nt}}_1}{\mathsf{x}}{M_1}}(c_1)`. - #. Let :math:`{{{\mathit{cj}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{vcvtop}}}_{{{\mathit{nt}}_1}{\mathsf{x}}{M_1}, {{\mathit{nt}}_2}{\mathsf{x}}{M_2}}({\mathit{vcvtop}}, {\mathit{ci}})^\ast}~{{\mathrm{zero}}({\mathit{nt}}_2)^{M_1}}`. + #. Let :math:`{{{\mathit{cj}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{vcvtop}}}_{{{\mathit{nt}}_1}{\mathsf{x}}{M_1}, {{\mathit{nt}}_2}{\mathsf{x}}{M_2}}({\mathit{vcvtop}}, {\mathit{ci}})^\ast}~{{\mathrm{zero}}({\mathit{nt}}_2)^{M_1}}`. - #. If :math:`{|{{{\mathrm{invlanes}}}_{{{\mathit{nt}}_2}{\mathsf{x}}{M_2}}({{\mathit{cj}}^\ast})^\ast}|} > 0`, then: + #. If :math:`{|{{{\mathrm{invlanes}}}_{{{\mathit{nt}}_2}{\mathsf{x}}{M_2}}({{\mathit{cj}}^\ast})^\ast}|} > 0`, then: - a. Let :math:`c` be an element of :math:`{{{\mathrm{invlanes}}}_{{{\mathit{nt}}_2}{\mathsf{x}}{M_2}}({{\mathit{cj}}^\ast})^\ast}`. + a. Let :math:`c` be an element of :math:`{{{\mathrm{invlanes}}}_{{{\mathit{nt}}_2}{\mathsf{x}}{M_2}}({{\mathit{cj}}^\ast})^\ast}`. - #. Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #. Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. :math:`\mathsf{local{.}tee}~x` @@ -6598,21 +6598,21 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i \geq {|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i]` is not of the case :math:`\mathsf{ref{.}func\_addr}`, then: - a. Trap. + a. Trap. #. Let :math:`(\mathsf{ref{.}func\_addr}~a)` be :math:`z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i]`. #. If :math:`a \geq {|z{.}\mathsf{funcs}|}`, then: - a. Trap. + a. Trap. #. If :math:`z{.}\mathsf{types}{}[y] \neq z{.}\mathsf{funcs}{}[a]{.}\mathsf{type}`, then: - a. Trap. + a. Trap. #. Execute the instruction :math:`(\mathsf{call}~a)`. @@ -6687,7 +6687,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i \geq {|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. Push the value :math:`z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i]` to the stack. @@ -6723,27 +6723,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + n > {|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #. Push the value :math:`{\mathit{val}}` to the stack. + #. Push the value :math:`{\mathit{val}}` to the stack. - #. Execute the instruction :math:`(\mathsf{table{.}set}~x)`. + #. Execute the instruction :math:`(\mathsf{table{.}set}~x)`. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. - #. Push the value :math:`{\mathit{val}}` to the stack. + #. Push the value :math:`{\mathit{val}}` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{table{.}fill}~x)`. + #. Execute the instruction :math:`(\mathsf{table{.}fill}~x)`. :math:`\mathsf{table{.}copy}~x~y` @@ -6766,49 +6766,49 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + n > {|z{.}\mathsf{tables}{}[y]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`j + n > {|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. If :math:`j \leq i`, then: + a. If :math:`j \leq i`, then: - 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. + 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #) Execute the instruction :math:`(\mathsf{table{.}get}~y)`. + #) Execute the instruction :math:`(\mathsf{table{.}get}~y)`. - #) Execute the instruction :math:`(\mathsf{table{.}set}~x)`. + #) Execute the instruction :math:`(\mathsf{table{.}set}~x)`. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. - #. Else: + #. Else: - 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + n - 1)` to the stack. + 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + n - 1)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + n - 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + n - 1)` to the stack. - #) Execute the instruction :math:`(\mathsf{table{.}get}~y)`. + #) Execute the instruction :math:`(\mathsf{table{.}get}~y)`. - #) Execute the instruction :math:`(\mathsf{table{.}set}~x)`. + #) Execute the instruction :math:`(\mathsf{table{.}set}~x)`. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{table{.}copy}~x~y)`. + #. Execute the instruction :math:`(\mathsf{table{.}copy}~x~y)`. :math:`\mathsf{table{.}init}~x~y` @@ -6831,31 +6831,31 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + n > {|z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`j + n > {|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else if :math:`i < {|z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}|}`, then: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. - #. Push the value :math:`z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}{}[i]` to the stack. + #. Push the value :math:`z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}{}[i]` to the stack. - #. Execute the instruction :math:`(\mathsf{table{.}set}~x)`. + #. Execute the instruction :math:`(\mathsf{table{.}set}~x)`. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{table{.}init}~x~y)`. + #. Execute the instruction :math:`(\mathsf{table{.}init}~x~y)`. :math:`{{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{load}}{{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}}~{\mathit{ao}}` @@ -6870,39 +6870,39 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`{\mathit{nt}}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{nt}}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|{\mathit{nt}}|} / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: + #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|{\mathit{nt}}|} / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - 1) Trap. + 1) Trap. - #. Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathit{nt}}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|{\mathit{nt}}|} / 8]`. + #. Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathit{nt}}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|{\mathit{nt}}|} / 8]`. - #. Push the value :math:`({\mathit{nt}}{.}\mathsf{const}~c)` to the stack. + #. Push the value :math:`({\mathit{nt}}{.}\mathsf{const}~c)` to the stack. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. If :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + a. If :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + #. If :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. - #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. + #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. - #) Push the value :math:`({\mathsf{i}}{n}{.}\mathsf{const}~{{{{\mathrm{extend}}}_{n, {|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{(c)})` to the stack. + #) Push the value :math:`({\mathsf{i}}{n}{.}\mathsf{const}~{{{{\mathrm{extend}}}_{n, {|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{(c)})` to the stack. :math:`\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}~{\mathit{ao}}` @@ -6917,69 +6917,69 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|\mathsf{v{\scriptstyle 128}}|} / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}` and :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Trap. + a. Trap. #. If :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{\mathsf{v{\scriptstyle 128}}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|\mathsf{v{\scriptstyle 128}}|} / 8]`. + a. Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{\mathsf{v{\scriptstyle 128}}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|\mathsf{v{\scriptstyle 128}}|} / 8]`. - #. Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #. Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. #. Else: - a. Let :math:`{\mathit{vloadop}}_0` be :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + a. Let :math:`{\mathit{vloadop}}_0` be :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #. If :math:`{\mathit{vloadop}}_0` is of the case :math:`\mathsf{shape}`, then: + #. If :math:`{\mathit{vloadop}}_0` is of the case :math:`\mathsf{shape}`, then: - 1) Let :math:`({M}{\mathsf{x}}{\mathsf{x}}{\mathsf{\_}}{N})` be :math:`{\mathit{vloadop}}_0`. + 1) Let :math:`({M}{\mathsf{x}}{\mathsf{x}}{\mathsf{\_}}{N})` be :math:`{\mathit{vloadop}}_0`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + M \cdot N / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + M \cdot N / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #) Let :math:`{j^{N}}` be the result for which :math:`{({{\mathrm{bytes}}}_{{\mathsf{i}}{M}}({j^{N}}) = z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} + k \cdot M / 8 : M / 8])^{k<N}}`. + #) Let :math:`{j^{N}}` be the result for which :math:`{({{\mathrm{bytes}}}_{{\mathsf{i}}{M}}({j^{N}}) = z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} + k \cdot M / 8 : M / 8])^{k<N}}`. - #) If the type of :math:`{\mathit{fresh}}` for which :math:`{|{\mathit{fresh}}|}` :math:`=` :math:`M \cdot 2` is Jnn, then: + #) If the type of :math:`{\mathit{fresh}}` for which :math:`{|{\mathit{fresh}}|}` :math:`=` :math:`M \cdot 2` is Jnn, then: - a) Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`M \cdot 2`. + a) Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`M \cdot 2`. - #) Let :math:`c` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{N}}({{{{{\mathrm{extend}}}_{M, {|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{(j)}^{N}})`. + #) Let :math:`c` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{N}}({{{{{\mathrm{extend}}}_{M, {|{\mathsf{i}}{n}|}}^{{\mathit{sx}}}}}{(j)}^{N}})`. - #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. - #. If :math:`{\mathit{vloadop}}_0` is of the case :math:`\mathsf{splat}`, then: + #. If :math:`{\mathit{vloadop}}_0` is of the case :math:`\mathsf{splat}`, then: - 1) Let :math:`({N}{\mathsf{\_}}{\mathsf{splat}})` be :math:`{\mathit{vloadop}}_0`. + 1) Let :math:`({N}{\mathsf{\_}}{\mathsf{splat}})` be :math:`{\mathit{vloadop}}_0`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #) Let :math:`M` be :math:`128 / N`. + #) Let :math:`M` be :math:`128 / N`. - #) If the type of :math:`{\mathit{fresh}}` for which :math:`{|{\mathit{fresh}}|}` :math:`=` :math:`N` is Jnn, then: + #) If the type of :math:`{\mathit{fresh}}` for which :math:`{|{\mathit{fresh}}|}` :math:`=` :math:`N` is Jnn, then: - a) Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`N`. + a) Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`N`. - #) Let :math:`j` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(j)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. + #) Let :math:`j` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(j)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. - #) Let :math:`c` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({j^{M}})`. + #) Let :math:`c` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({j^{M}})`. - #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. - #. If :math:`{\mathit{vloadop}}_0` is of the case :math:`\mathsf{zero}`, then: + #. If :math:`{\mathit{vloadop}}_0` is of the case :math:`\mathsf{zero}`, then: - 1) Let :math:`({N}{\mathsf{\_}}{\mathsf{zero}})` be :math:`{\mathit{vloadop}}_0`. + 1) Let :math:`({N}{\mathsf{\_}}{\mathsf{zero}})` be :math:`{\mathit{vloadop}}_0`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #) Let :math:`j` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(j)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. + #) Let :math:`j` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(j)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. - #) Let :math:`c` be :math:`{{{{\mathrm{extend}}}_{N, 128}^{\mathsf{u}}}}{(j)}`. + #) Let :math:`c` be :math:`{{{{\mathrm{extend}}}_{N, 128}^{\mathsf{u}}}}{(j)}`. - #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. :math:`\mathsf{vload\_lane}~\mathsf{v{\scriptstyle 128}}~N~{\mathit{ao}}~j` @@ -6998,19 +6998,19 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. Let :math:`M` be :math:`128 / N`. #. If the type of :math:`{\mathit{fresh}}` for which :math:`{|{\mathit{fresh}}|}` :math:`=` :math:`N` is Jnn, then: - a. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`N`. + a. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`N`. - #. Let :math:`k` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(k)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. + #. Let :math:`k` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(k)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. - #. Let :math:`c` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}(c_1){}[{}[j] = k])`. + #. Let :math:`c` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}(c_1){}[{}[j] = k])`. - #. Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #. Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. :math:`\mathsf{memory{.}size}` @@ -7044,27 +7044,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + n > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #. Push the value :math:`{\mathit{val}}` to the stack. + #. Push the value :math:`{\mathit{val}}` to the stack. - #. Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. + #. Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. - #. Push the value :math:`{\mathit{val}}` to the stack. + #. Push the value :math:`{\mathit{val}}` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`\mathsf{memory{.}fill}`. + #. Execute the instruction :math:`\mathsf{memory{.}fill}`. :math:`\mathsf{memory{.}copy}` @@ -7087,49 +7087,49 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + n > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. If :math:`j + n > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. If :math:`j \leq i`, then: + a. If :math:`j \leq i`, then: - 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. + 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}})`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}})`. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. - #. Else: + #. Else: - 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + n - 1)` to the stack. + 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + n - 1)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + n - 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + n - 1)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}})`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}})`. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`\mathsf{memory{.}copy}`. + #. Execute the instruction :math:`\mathsf{memory{.}copy}`. :math:`\mathsf{memory{.}init}~x` @@ -7152,31 +7152,31 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + n > {|z{.}\mathsf{datas}{}[x]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. If :math:`j + n > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else if :math:`i < {|z{.}\mathsf{datas}{}[x]{.}\mathsf{bytes}|}`, then: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~z{.}\mathsf{datas}{}[x]{.}\mathsf{bytes}{}[i])` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~z{.}\mathsf{datas}{}[x]{.}\mathsf{bytes}{}[i])` to the stack. - #. Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. + #. Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{memory{.}init}~x)`. + #. Execute the instruction :math:`(\mathsf{memory{.}init}~x)`. :math:`\mathsf{local{.}set}~x` @@ -7221,7 +7221,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i \geq {|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. Perform :math:`z{}[{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i] = {\mathit{ref}}]`. @@ -7242,15 +7242,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Either: - a. Let :math:`{\mathit{ti}}` be :math:`{\mathrm{growtable}}(z{.}\mathsf{tables}{}[x], n, {\mathit{ref}})`. + a. Let :math:`{\mathit{ti}}` be :math:`{\mathrm{growtable}}(z{.}\mathsf{tables}{}[x], n, {\mathit{ref}})`. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|})` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|})` to the stack. - #. Perform :math:`z{}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]`. + #. Perform :math:`z{}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]`. #. Or: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{{{{\mathrm{signed}}}_{32}^{{-1}}}}{({-1})})` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{{{{\mathrm{signed}}}_{32}^{{-1}}}}{({-1})})` to the stack. :math:`\mathsf{elem{.}drop}~x` @@ -7280,29 +7280,29 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|{\mathit{nt}}|} / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}` and :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = {\mathit{nt}}` and :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = {\mathit{nt}}` and :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathit{nt}}}(c)`. + a. Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathit{nt}}}(c)`. - #. Perform :math:`z{}[{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|{\mathit{nt}}|} / 8] = {b^\ast}]`. + #. Perform :math:`z{}[{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|{\mathit{nt}}|} / 8] = {b^\ast}]`. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = {\mathsf{i}}{n}` and :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + #. If :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = {\mathsf{i}}{n}` and :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`n` be :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`n` be :math:`{{\mathit{sz}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #) Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}({{\mathrm{wrap}}}_{{|{\mathsf{i}}{n}|}, n}(c))`. + #) Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}({{\mathrm{wrap}}}_{{|{\mathsf{i}}{n}|}, n}(c))`. - #) Perform :math:`z{}[{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8] = {b^\ast}]`. + #) Perform :math:`z{}[{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8] = {b^\ast}]`. :math:`\mathsf{vstore}~\mathsf{v{\scriptstyle 128}}~{\mathit{ao}}` @@ -7321,7 +7321,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|\mathsf{v{\scriptstyle 128}}|} / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{\mathsf{v{\scriptstyle 128}}}(c)`. @@ -7344,19 +7344,19 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. Let :math:`M` be :math:`128 / N`. #. If the type of :math:`{\mathit{fresh}}` for which :math:`{|{\mathit{fresh}}|}` :math:`=` :math:`N` is Jnn, then: - a. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`N`. + a. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`N`. - #. If :math:`j < {|{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}(c)|}`, then: + #. If :math:`j < {|{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}(c)|}`, then: - 1) Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}({{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}(c){}[j])`. + 1) Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}({{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}(c){}[j])`. - #) Perform :math:`z{}[{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8] = {b^\ast}]`. + #) Perform :math:`z{}[{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8] = {b^\ast}]`. :math:`\mathsf{memory{.}grow}` @@ -7371,15 +7371,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Either: - a. Let :math:`{\mathit{mi}}` be :math:`{\mathrm{growmemory}}(z{.}\mathsf{mems}{}[0], n)`. + a. Let :math:`{\mathit{mi}}` be :math:`{\mathrm{growmemory}}(z{.}\mathsf{mems}{}[0], n)`. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|} / (64 \, {\mathrm{Ki}}))` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|} / (64 \, {\mathrm{Ki}}))` to the stack. - #. Perform :math:`z{}[{.}\mathsf{mems}{}[0] = {\mathit{mi}}]`. + #. Perform :math:`z{}[{.}\mathsf{mems}{}[0] = {\mathit{mi}}]`. #. Or: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{{{{\mathrm{signed}}}_{32}^{{-1}}}}{({-1})})` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{{{{\mathrm{signed}}}_{32}^{{-1}}}}{({-1})})` to the stack. :math:`\mathsf{data{.}drop}~x` @@ -7404,7 +7404,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`i \leq j`, then: - a. Return :math:`i`. + a. Return :math:`i`. #. Return :math:`j`. @@ -7415,7 +7415,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`0`. + a. Return :math:`0`. #. Let :math:`n~{{n'}^\ast}` be :math:`{n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7428,7 +7428,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, :math:`{|{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} = 1`. @@ -7443,7 +7443,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`w` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. @@ -7456,7 +7456,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{w^\ast}~{{{w'}^\ast}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7469,7 +7469,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{{w'}^\ast}~{{w^\ast}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7482,7 +7482,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`w_1~{{w'}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7495,7 +7495,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{w_1^\ast}~{{w^\ast}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7508,7 +7508,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 32`, then: - a. Return :math:`23`. + a. Return :math:`23`. #. Assert: Due to validation, :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 64`. @@ -7521,7 +7521,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 32`, then: - a. Return :math:`8`. + a. Return :math:`8`. #. Assert: Due to validation, :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 64`. @@ -7569,23 +7569,23 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 32}}`, then: - a. Return :math:`32`. + a. Return :math:`32`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 64}}`, then: - a. Return :math:`64`. + a. Return :math:`64`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 32}}`, then: - a. Return :math:`32`. + a. Return :math:`32`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 64}}`, then: - a. Return :math:`64`. + a. Return :math:`64`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{v{\scriptstyle 128}}`, then: - a. Return :math:`128`. + a. Return :math:`128`. :math:`{|{\mathsf{i}}{n}|}` @@ -7601,7 +7601,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{pt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 8}}`, then: - a. Return :math:`8`. + a. Return :math:`8`. #. Assert: Due to validation, :math:`{\mathit{pt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 16}}`. @@ -7614,9 +7614,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{|{\mathit{numtype}}|}`. + #. Return :math:`{|{\mathit{numtype}}|}`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -7680,7 +7680,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Return :math:`0`. + a. Return :math:`0`. #. Assert: Due to validation, the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -7709,7 +7709,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{b_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{b^\ast}~{{{b'}^\ast}^\ast}` be :math:`{b_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7722,9 +7722,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathit{numtype}}`. + #. Return :math:`{\mathit{numtype}}`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -7744,15 +7744,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~{\mathit{ft}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{func}~{\mathit{ft}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{ft}}~{\mathrm{funcs}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{ft}}~{\mathrm{funcs}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7765,15 +7765,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~{\mathit{gt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{global}~{\mathit{gt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{gt}}~{\mathrm{globals}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{gt}}~{\mathrm{globals}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7786,15 +7786,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~{\mathit{tt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{table}~{\mathit{tt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{tt}}~{\mathrm{tables}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{tt}}~{\mathrm{tables}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7807,15 +7807,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~{\mathit{mt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{mem}~{\mathit{mt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{mt}}~{\mathrm{mems}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{mt}}~{\mathrm{mems}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7828,15 +7828,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{memory{.}init}`, then: - a. Let :math:`(\mathsf{memory{.}init}~x)` be :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{memory{.}init}~x)` be :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`x`. + #. Return :math:`x`. #. If :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{data{.}drop}`, then: - a. Let :math:`(\mathsf{data{.}drop}~x)` be :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{data{.}drop}~x)` be :math:`{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`x`. + #. Return :math:`x`. #. Return :math:`\epsilon`. @@ -7847,7 +7847,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{instr}}~{{\mathit{instr}'}^\ast}` be :math:`{{\mathit{in}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7874,7 +7874,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{func}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{func}}~{{\mathit{func}'}^\ast}` be :math:`{{\mathit{func}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -7894,7 +7894,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`i < {2^{N - 1}}`, then: - a. Return :math:`i`. + a. Return :math:`i`. #. Assert: Due to validation, :math:`{2^{N - 1}} \leq i`. @@ -7918,27 +7918,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{\mathit{iN}}` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{clz}`, then: + #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{clz}`, then: - 1) Return :math:`{{\mathrm{iclz}}}_{N}({\mathit{iN}})`. + 1) Return :math:`{{\mathrm{iclz}}}_{N}({\mathit{iN}})`. - #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ctz}`, then: + #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ctz}`, then: - 1) Return :math:`{{\mathrm{ictz}}}_{N}({\mathit{iN}})`. + 1) Return :math:`{{\mathrm{ictz}}}_{N}({\mathit{iN}})`. - #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{popcnt}`, then: + #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{popcnt}`, then: - 1) Return :math:`{{\mathrm{ipopcnt}}}_{N}({\mathit{iN}})`. + 1) Return :math:`{{\mathrm{ipopcnt}}}_{N}({\mathit{iN}})`. - #. Assert: Due to validation, :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`. + #. Assert: Due to validation, :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`. - #. Let :math:`(\mathsf{extend}~M)` be :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`(\mathsf{extend}~M)` be :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{{{{\mathrm{extend}}}_{M, N}^{\mathsf{s}}}}{({{\mathrm{wrap}}}_{N, M}({\mathit{iN}}))}`. + #. Return :math:`{{{{\mathrm{extend}}}_{M, N}^{\mathsf{s}}}}{({{\mathrm{wrap}}}_{N, M}({\mathit{iN}}))}`. #. Assert: Due to validation, the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -7948,27 +7948,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{abs}`, then: - a. Return :math:`{{\mathrm{fabs}}}_{N}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{fabs}}}_{N}({\mathit{fN}})`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{neg}`, then: - a. Return :math:`{{\mathrm{fneg}}}_{N}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{fneg}}}_{N}({\mathit{fN}})`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sqrt}`, then: - a. Return :math:`{{\mathrm{fsqrt}}}_{N}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{fsqrt}}}_{N}({\mathit{fN}})`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ceil}`, then: - a. Return :math:`{{\mathrm{fceil}}}_{N}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{fceil}}}_{N}({\mathit{fN}})`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{floor}`, then: - a. Return :math:`{{\mathrm{ffloor}}}_{N}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{ffloor}}}_{N}({\mathit{fN}})`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{trunc}`, then: - a. Return :math:`{{\mathrm{ftrunc}}}_{N}({\mathit{fN}})`. + a. Return :math:`{{\mathrm{ftrunc}}}_{N}({\mathit{fN}})`. #. Assert: Due to validation, :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{nearest}`. @@ -7981,65 +7981,65 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}_2` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + #. Let :math:`{\mathit{iN}}_2` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: - 1) Return :math:`{{\mathrm{iadd}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{iadd}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: - 1) Return :math:`{{\mathrm{isub}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{isub}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: - 1) Return :math:`{{\mathrm{imul}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{imul}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{div}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{div}`, then: - 1) Let :math:`({\mathsf{div}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{div}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{idiv}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{idiv}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{rem}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{rem}`, then: - 1) Let :math:`({\mathsf{rem}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{rem}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{irem}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{irem}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{and}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{and}`, then: - 1) Return :math:`{{\mathrm{iand}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{iand}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{or}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{or}`, then: - 1) Return :math:`{{\mathrm{ior}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{ior}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{xor}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{xor}`, then: - 1) Return :math:`{{\mathrm{ixor}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{ixor}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{shl}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{shl}`, then: - 1) Return :math:`{{\mathrm{ishl}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{ishl}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{shr}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{shr}`, then: - 1) Let :math:`({\mathsf{shr}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{shr}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ishr}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{ishr}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotl}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotl}`, then: - 1) Return :math:`{{\mathrm{irotl}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{irotl}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotr}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotr}`, then: - 1) Return :math:`{{\mathrm{irotr}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{irotr}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. #. Assert: Due to validation, the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -8051,27 +8051,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: - a. Return :math:`{{\mathrm{fadd}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fadd}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: - a. Return :math:`{{\mathrm{fsub}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fsub}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: - a. Return :math:`{{\mathrm{fmul}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fmul}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{div}`, then: - a. Return :math:`{{\mathrm{fdiv}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fdiv}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{min}`, then: - a. Return :math:`{{\mathrm{fmin}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fmin}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{max}`, then: - a. Return :math:`{{\mathrm{fmax}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fmax}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. Assert: Due to validation, :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{copysign}`. @@ -8091,43 +8091,43 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{\mathit{iN}}_2` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + #. Let :math:`{\mathit{iN}}_2` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: - 1) Return :math:`{{\mathrm{ieq}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{ieq}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: - 1) Return :math:`{{\mathrm{ine}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. + 1) Return :math:`{{\mathrm{ine}}}_{N}({\mathit{iN}}_1, {\mathit{iN}}_2)`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{lt}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{lt}`, then: - 1) Let :math:`({\mathsf{lt}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{lt}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ilt}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{ilt}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{gt}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{gt}`, then: - 1) Let :math:`({\mathsf{gt}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{gt}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{igt}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{igt}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{le}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{le}`, then: - 1) Let :math:`({\mathsf{le}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{le}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ile}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{ile}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ge}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ge}`, then: - 1) Let :math:`({\mathsf{ge}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{ge}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ige}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. + #) Return :math:`{{{{\mathrm{ige}}}_{N}^{{\mathit{sx}}}}}{({\mathit{iN}}_1, {\mathit{iN}}_2)}`. #. Assert: Due to validation, the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -8139,23 +8139,23 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: - a. Return :math:`{{\mathrm{feq}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{feq}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: - a. Return :math:`{{\mathrm{fne}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fne}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{lt}`, then: - a. Return :math:`{{\mathrm{flt}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{flt}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{gt}`, then: - a. Return :math:`{{\mathrm{fgt}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fgt}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{le}`, then: - a. Return :math:`{{\mathrm{fle}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. + a. Return :math:`{{\mathrm{fle}}}_{N}({\mathit{fN}}_1, {\mathit{fN}}_2)`. #. Assert: Due to validation, :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ge}`. @@ -8168,97 +8168,97 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Inn, then: + #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Inn, then: - 1) Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + 1) Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`, then: - a) Let :math:`(\mathsf{extend}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`(\mathsf{extend}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{extend}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{iN}}_1)}`. + #) Return :math:`{{{{\mathrm{extend}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{iN}}_1)}`. - #) Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{wrap}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{wrap}`, then: - a) Return :math:`{{\mathrm{wrap}}}_{N_1, N_2}({\mathit{iN}}_1)`. + a) Return :math:`{{\mathrm{wrap}}}_{N_1, N_2}({\mathit{iN}}_1)`. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: - a. Let :math:`{{\mathsf{f}}{n}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{f}}{n}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Inn, then: + #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Inn, then: - 1) Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + 1) Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc}`, then: - a) Let :math:`(\mathsf{trunc}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`(\mathsf{trunc}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{\mathit{fN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{fN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{trunc}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{fN}}_1)}`. + #) Return :math:`{{{{\mathrm{trunc}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{fN}}_1)}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc\_sat}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc\_sat}`, then: - a) Let :math:`(\mathsf{trunc\_sat}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`(\mathsf{trunc\_sat}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{\mathit{fN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{fN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{trunc\_sat}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{fN}}_1)}`. + #) Return :math:`{{{{\mathrm{trunc\_sat}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{fN}}_1)}`. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: + #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: - 1) Let :math:`{{\mathsf{f}}{n}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + 1) Let :math:`{{\mathsf{f}}{n}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{convert}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{convert}`, then: - a) Let :math:`(\mathsf{convert}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`(\mathsf{convert}~{\mathit{sx}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{convert}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{iN}}_1)}`. + #) Return :math:`{{{{\mathrm{convert}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{iN}}_1)}`. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: - a. Let :math:`{{\mathsf{f}}{n}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{f}}{n}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: + #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: - 1) Let :math:`{{\mathsf{f}}{n}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + 1) Let :math:`{{\mathsf{f}}{n}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #) Let :math:`{\mathit{fN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{fN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{promote}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{promote}`, then: - a) Return :math:`{{\mathrm{promote}}}_{N_1, N_2}({\mathit{fN}}_1)`. + a) Return :math:`{{\mathrm{promote}}}_{N_1, N_2}({\mathit{fN}}_1)`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{demote}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{demote}`, then: - a) Return :math:`{{\mathrm{demote}}}_{N_1, N_2}({\mathit{fN}}_1)`. + a) Return :math:`{{\mathrm{demote}}}_{N_1, N_2}({\mathit{fN}}_1)`. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: + #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: - 1) Let :math:`{{\mathsf{f}}{n}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + 1) Let :math:`{{\mathsf{f}}{n}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #) Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{iN}}_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{reinterpret}` and :math:`{|{{\mathsf{i}}{n}}_1|} = {|{{\mathsf{f}}{n}}_2|}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{reinterpret}` and :math:`{|{{\mathsf{i}}{n}}_1|} = {|{{\mathsf{f}}{n}}_2|}`, then: - a) Return :math:`{{\mathrm{reinterpret}}}_{{{\mathsf{i}}{n}}_1, {{\mathsf{f}}{n}}_2}({\mathit{iN}}_1)`. + a) Return :math:`{{\mathrm{reinterpret}}}_{{{\mathsf{i}}{n}}_1, {{\mathsf{f}}{n}}_2}({\mathit{iN}}_1)`. #. Assert: Due to validation, the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -8301,7 +8301,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Return :math:`c`. + a. Return :math:`c`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -8316,7 +8316,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Return :math:`c`. + a. Return :math:`c`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -8340,7 +8340,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{hf}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{low}`, then: - a. Return :math:`i`. + a. Return :math:`i`. #. Assert: Due to validation, :math:`{\mathit{hf}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{high}`. @@ -8360,15 +8360,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{vvbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{and}`, then: - a. Return :math:`{{\mathrm{iand}}}_{{|\mathsf{v{\scriptstyle 128}}|}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1, {\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + a. Return :math:`{{\mathrm{iand}}}_{{|\mathsf{v{\scriptstyle 128}}|}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1, {\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. #. If :math:`{\mathit{vvbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{andnot}`, then: - a. Return :math:`{{\mathrm{iandnot}}}_{{|\mathsf{v{\scriptstyle 128}}|}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1, {\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + a. Return :math:`{{\mathrm{iandnot}}}_{{|\mathsf{v{\scriptstyle 128}}|}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1, {\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. #. If :math:`{\mathit{vvbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{or}`, then: - a. Return :math:`{{\mathrm{ior}}}_{{|\mathsf{v{\scriptstyle 128}}|}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1, {\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + a. Return :math:`{{\mathrm{ior}}}_{{|\mathsf{v{\scriptstyle 128}}|}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1, {\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. #. Assert: Due to validation, :math:`{\mathit{vvbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{xor}`. @@ -8388,31 +8388,31 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{abs}`, then: + #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{abs}`, then: - 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{iabs}}}_{N}({\mathit{lane}}_1)^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{iabs}}}_{N}({\mathit{lane}}_1)^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{neg}`, then: + #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{neg}`, then: - 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{ineg}}}_{N}({\mathit{lane}}_1)^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{ineg}}}_{N}({\mathit{lane}}_1)^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{popcnt}`, then: + #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{popcnt}`, then: - 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{ipopcnt}}}_{N}({\mathit{lane}}_1)^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{ipopcnt}}}_{N}({\mathit{lane}}_1)^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -8420,63 +8420,63 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{abs}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fabs}}}_{N}({\mathit{lane}}_1)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fabs}}}_{N}({\mathit{lane}}_1)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{neg}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fneg}}}_{N}({\mathit{lane}}_1)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fneg}}}_{N}({\mathit{lane}}_1)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sqrt}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fsqrt}}}_{N}({\mathit{lane}}_1)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fsqrt}}}_{N}({\mathit{lane}}_1)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ceil}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fceil}}}_{N}({\mathit{lane}}_1)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fceil}}}_{N}({\mathit{lane}}_1)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{floor}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{ffloor}}}_{N}({\mathit{lane}}_1)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{ffloor}}}_{N}({\mathit{lane}}_1)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{trunc}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{ftrunc}}}_{N}({\mathit{lane}}_1)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{ftrunc}}}_{N}({\mathit{lane}}_1)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. Assert: Due to validation, :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{nearest}`. @@ -8495,105 +8495,105 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: - 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{iadd}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{iadd}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: - 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{isub}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{isub}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{min}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{min}`, then: - 1) Let :math:`({\mathsf{min}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{min}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{imin}}}_{N}({\mathit{sx}}, {\mathit{lane}}_1, {\mathit{lane}}_2)^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{imin}}}_{N}({\mathit{sx}}, {\mathit{lane}}_1, {\mathit{lane}}_2)^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{max}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{max}`, then: - 1) Let :math:`({\mathsf{max}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{max}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{imax}}}_{N}({\mathit{sx}}, {\mathit{lane}}_1, {\mathit{lane}}_2)^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{imax}}}_{N}({\mathit{sx}}, {\mathit{lane}}_1, {\mathit{lane}}_2)^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{add\_sat}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{add\_sat}`, then: - 1) Let :math:`({\mathsf{add\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{add\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{{{\mathrm{iadd\_sat}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)}^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{{{\mathrm{iadd\_sat}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)}^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{sub\_sat}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{sub\_sat}`, then: - 1) Let :math:`({\mathsf{sub\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{sub\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{{{\mathrm{isub\_sat}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)}^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{{{\mathrm{isub\_sat}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)}^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: - 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{imul}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{\mathrm{imul}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: - 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{{{\mathrm{iavgr}}}_{N}^{\mathsf{u}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)}^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{{{\mathrm{iavgr}}}_{N}^{\mathsf{u}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)}^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: - 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{{{\mathrm{iq{\kern-0.1em\scriptstyle 15\kern-0.1em}mulr\_sat}}}_{N}^{\mathsf{s}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)}^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{{{{\mathrm{iq{\kern-0.1em\scriptstyle 15\kern-0.1em}mulr\_sat}}}_{N}^{\mathsf{s}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)}^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -8601,87 +8601,87 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fadd}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fadd}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fsub}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fsub}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fmul}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fmul}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{div}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fdiv}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fdiv}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{min}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fmin}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fmin}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{max}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fmax}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fmax}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{pmin}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fpmin}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. + #. Let :math:`{{{\mathit{lane}}^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{fpmin}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2)^\ast}`. - #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. + #. Let :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}` be :math:`{{{\mathrm{invlanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}^\ast})^\ast}`. - #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. + #. Return :math:`{{\mathit{v{\kern-0.1em\scriptstyle 128}}}^\ast}`. #. Assert: Due to validation, :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{pmax}`. @@ -8702,87 +8702,87 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: - a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{n}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: - 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{ieq}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. + #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{ieq}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: - 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + 1) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{ine}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. + #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{ine}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{lt}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{lt}`, then: - 1) Let :math:`(\mathsf{lt}~{\mathit{sx}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`(\mathsf{lt}~{\mathit{sx}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{{{\mathrm{ilt}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)})}^\ast}`. + #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{{{\mathrm{ilt}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)})}^\ast}`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{gt}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{gt}`, then: - 1) Let :math:`(\mathsf{gt}~{\mathit{sx}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`(\mathsf{gt}~{\mathit{sx}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{{{\mathrm{igt}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)})}^\ast}`. + #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{{{\mathrm{igt}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)})}^\ast}`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{le}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{le}`, then: - 1) Let :math:`(\mathsf{le}~{\mathit{sx}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`(\mathsf{le}~{\mathit{sx}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{{{\mathrm{ile}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)})}^\ast}`. + #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{{{\mathrm{ile}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)})}^\ast}`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ge}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ge}`, then: - 1) Let :math:`(\mathsf{ge}~{\mathit{sx}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`(\mathsf{ge}~{\mathit{sx}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + #) Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #) Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{{{\mathrm{ige}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)})}^\ast}`. + #) Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{{{\mathrm{ige}}}_{N}^{{\mathit{sx}}}}}{({\mathit{lane}}_1, {\mathit{lane}}_2)})}^\ast}`. - #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #) Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #) Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -8790,73 +8790,73 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`{|{\mathsf{f}}{n}|}`. + #. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`{|{\mathsf{f}}{n}|}`. - #. Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{feq}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. + #. Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{feq}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. - #. Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #. Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #. Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #. Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`{|{\mathsf{f}}{n}|}`. + #. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`{|{\mathsf{f}}{n}|}`. - #. Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{fne}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. + #. Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{fne}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. - #. Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #. Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #. Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #. Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{lt}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`{|{\mathsf{f}}{n}|}`. + #. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`{|{\mathsf{f}}{n}|}`. - #. Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{flt}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. + #. Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{flt}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. - #. Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #. Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #. Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #. Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{gt}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`{|{\mathsf{f}}{n}|}`. + #. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`{|{\mathsf{f}}{n}|}`. - #. Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{fgt}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. + #. Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{fgt}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. - #. Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #. Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #. Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #. Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{le}`, then: - a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. + a. Let :math:`{{\mathit{lane}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_1)`. - #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. + #. Let :math:`{{\mathit{lane}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{\mathsf{f}}{n}}{\mathsf{x}}{M}}({\mathit{v{\kern-0.1em\scriptstyle 128}}}_2)`. - #. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`{|{\mathsf{f}}{n}|}`. + #. Let :math:`{\mathsf{i}}{n}` be the result for which :math:`{|{\mathsf{i}}{n}|}` :math:`=` :math:`{|{\mathsf{f}}{n}|}`. - #. Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{fle}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. + #. Let :math:`{{\mathit{lane}}_3^\ast}` be :math:`{{{{{\mathrm{extend}}}_{1, N}^{\mathsf{s}}}}{({{\mathrm{fle}}}_{N}({\mathit{lane}}_1, {\mathit{lane}}_2))}^\ast}`. - #. Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. + #. Let :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}` be :math:`{{\mathrm{invlanes}}}_{{{\mathsf{i}}{n}}{\mathsf{x}}{M}}({{\mathit{lane}}_3^\ast})`. - #. Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. + #. Return :math:`{\mathit{v{\kern-0.1em\scriptstyle 128}}}`. #. Assert: Due to validation, :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ge}`. @@ -8879,35 +8879,35 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is Jnn, then: - a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + a. Let :math:`{{\mathsf{i}}{n}}_1` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: + #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: - 1) Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`, then: + #) If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`, then: - a) Let :math:`(\mathsf{extend}~{\mathit{sx}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`(\mathsf{extend}~{\mathit{sx}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{\mathit{iN}}_1` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{iN}}_1` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{\mathit{iN}}_2` be :math:`{{{{\mathrm{extend}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{iN}}_1)}`. + #) Let :math:`{\mathit{iN}}_2` be :math:`{{{{\mathrm{extend}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{iN}}_1)}`. - #) Return :math:`{\mathit{iN}}_2`. + #) Return :math:`{\mathit{iN}}_2`. - #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: + #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: - 1) Let :math:`{{\mathsf{f}}{n}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`{{\mathsf{f}}{n}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{convert}`, then: + #) If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{convert}`, then: - a) Let :math:`(\mathsf{convert}~{\mathit{sx}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`(\mathsf{convert}~{\mathit{sx}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{\mathit{iN}}_1` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{iN}}_1` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{\mathit{fN}}_2` be :math:`{{{{\mathrm{convert}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{iN}}_1)}`. + #) Let :math:`{\mathit{fN}}_2` be :math:`{{{{\mathrm{convert}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{iN}}_1)}`. - #) Return :math:`{\mathit{fN}}_2`. + #) Return :math:`{\mathit{fN}}_2`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is Fnn. @@ -8915,17 +8915,17 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{i}}{n}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc\_sat}`, then: + #. If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc\_sat}`, then: - 1) Let :math:`(\mathsf{trunc\_sat}~{\mathit{sx}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`(\mathsf{trunc\_sat}~{\mathit{sx}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{\mathit{fN}}_1` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`{\mathit{fN}}_1` be :math:`c_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{{\mathit{iN}}_2^?}` be :math:`{{{{\mathrm{trunc\_sat}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{fN}}_1)}`. + #) Let :math:`{{\mathit{iN}}_2^?}` be :math:`{{{{\mathrm{trunc\_sat}}}_{N_1, N_2}^{{\mathit{sx}}}}}{({\mathit{fN}}_1)}`. - #) Return :math:`{{\mathit{iN}}_2^?}`. + #) Return :math:`{{\mathit{iN}}_2^?}`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -8935,9 +8935,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{demote}`, then: - a. Let :math:`{{\mathit{fN}}_2^\ast}` be :math:`{{\mathrm{demote}}}_{N_1, N_2}({\mathit{fN}}_1)`. + a. Let :math:`{{\mathit{fN}}_2^\ast}` be :math:`{{\mathrm{demote}}}_{N_1, N_2}({\mathit{fN}}_1)`. - #. Return :math:`{{\mathit{fN}}_2^\ast}`. + #. Return :math:`{{\mathit{fN}}_2^\ast}`. #. Assert: Due to validation, :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{promote}`. @@ -8965,15 +8965,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{vextbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extmul}`, then: - a. Let :math:`({\mathsf{extmul}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vextbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathsf{extmul}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vextbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`{{\mathit{ci}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}(c_1){}[{\mathrm{half}}({\mathit{hf}}, 0, M_1) : M_1]`. + #. Let :math:`{{\mathit{ci}}_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}(c_1){}[{\mathrm{half}}({\mathit{hf}}, 0, M_1) : M_1]`. - #. Let :math:`{{\mathit{ci}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}(c_2){}[{\mathrm{half}}({\mathit{hf}}, 0, M_1) : M_1]`. + #. Let :math:`{{\mathit{ci}}_2^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{n}}_2}{\mathsf{x}}{M_2}}(c_2){}[{\mathrm{half}}({\mathit{hf}}, 0, M_1) : M_1]`. - #. Let :math:`c` be :math:`{{\mathrm{invlanes}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M_1}}({{{\mathrm{imul}}}_{N_1}({{{{\mathrm{extend}}}_{N_2, N_1}^{{\mathit{sx}}}}}{({\mathit{ci}}_1)}, {{{{\mathrm{extend}}}_{N_2, N_1}^{{\mathit{sx}}}}}{({\mathit{ci}}_2)})^\ast})`. + #. Let :math:`c` be :math:`{{\mathrm{invlanes}}}_{{{{\mathsf{i}}{n}}_1}{\mathsf{x}}{M_1}}({{{\mathrm{imul}}}_{N_1}({{{{\mathrm{extend}}}_{N_2, N_1}^{{\mathit{sx}}}}}{({\mathit{ci}}_1)}, {{{{\mathrm{extend}}}_{N_2, N_1}^{{\mathit{sx}}}}}{({\mathit{ci}}_2)})^\ast})`. - #. Return :math:`c`. + #. Return :math:`c`. #. Assert: Due to validation, :math:`{\mathit{vextbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `. @@ -8994,7 +8994,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{vshiftop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{shl}`, then: - a. Return :math:`{{\mathrm{ishl}}}_{N}({\mathit{lane}}, n)`. + a. Return :math:`{{\mathrm{ishl}}}_{N}({\mathit{lane}}, n)`. #. Assert: Due to validation, :math:`{\mathit{vshiftop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{shr}`. @@ -9009,27 +9009,27 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 32}}`, then: - a. Return :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)`. + a. Return :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 64}}`, then: - a. Return :math:`(\mathsf{i{\scriptstyle 64}}{.}\mathsf{const}~0)`. + a. Return :math:`(\mathsf{i{\scriptstyle 64}}{.}\mathsf{const}~0)`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 32}}`, then: - a. Return :math:`(\mathsf{f{\scriptstyle 32}}{.}\mathsf{const}~{+0})`. + a. Return :math:`(\mathsf{f{\scriptstyle 32}}{.}\mathsf{const}~{+0})`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 64}}`, then: - a. Return :math:`(\mathsf{f{\scriptstyle 64}}{.}\mathsf{const}~{+0})`. + a. Return :math:`(\mathsf{f{\scriptstyle 64}}{.}\mathsf{const}~{+0})`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{v{\scriptstyle 128}}`, then: - a. Return :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~0)`. + a. Return :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~0)`. #. If :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{funcref}`, then: - a. Return :math:`(\mathsf{ref{.}null}~\mathsf{funcref})`. + a. Return :math:`(\mathsf{ref{.}null}~\mathsf{funcref})`. #. Assert: Due to validation, :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{externref}`. @@ -9042,15 +9042,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~{\mathit{fa}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{func}~{\mathit{fa}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{fa}}~{\mathrm{funcs}}({{\mathit{xv}}^\ast})`. + #. Return :math:`{\mathit{fa}}~{\mathrm{funcs}}({{\mathit{xv}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9063,15 +9063,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~{\mathit{ga}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{global}~{\mathit{ga}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ga}}~{\mathrm{globals}}({{\mathit{xv}}^\ast})`. + #. Return :math:`{\mathit{ga}}~{\mathrm{globals}}({{\mathit{xv}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9084,15 +9084,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~{\mathit{ta}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{table}~{\mathit{ta}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ta}}~{\mathrm{tables}}({{\mathit{xv}}^\ast})`. + #. Return :math:`{\mathit{ta}}~{\mathrm{tables}}({{\mathit{xv}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9105,15 +9105,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~{\mathit{ma}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{mem}~{\mathit{ma}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ma}}~{\mathrm{mems}}({{\mathit{xv}}^\ast})`. + #. Return :math:`{\mathit{ma}}~{\mathrm{mems}}({{\mathit{xv}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xv}}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9312,9 +9312,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{i'} \leq j`, then: - a. Let :math:`{\mathit{ti}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~{i'}~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. + a. Let :math:`{\mathit{ti}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~{i'}~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. - #. Return :math:`{\mathit{ti}'}`. + #. Return :math:`{\mathit{ti}'}`. :math:`{\mathrm{growmemory}}({\mathit{mi}}, n)` @@ -9327,9 +9327,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{i'} \leq j`, then: - a. Let :math:`{\mathit{mi}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~{i'}~..~j~])~\mathsf{page},\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. + a. Let :math:`{\mathit{mi}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~{i'}~..~j~])~\mathsf{page},\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. - #. Return :math:`{\mathit{mi}'}`. + #. Return :math:`{\mathit{mi}'}`. :math:`{{\mathrm{blocktype}}}_{z}({\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}})` @@ -9338,17 +9338,17 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \epsilon`, then: - a. Return :math:`\epsilon~\rightarrow~\epsilon`. + a. Return :math:`\epsilon~\rightarrow~\epsilon`. #. If :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case , then: - a. Let :math:`{{\mathit{valtype}}_0^?}` be :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathit{valtype}}_0^?}` be :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{{\mathit{valtype}}_0^?}` is defined, then: + #. If :math:`{{\mathit{valtype}}_0^?}` is defined, then: - 1) Let :math:`t` be :math:`{{\mathit{valtype}}_0^?}`. + 1) Let :math:`t` be :math:`{{\mathit{valtype}}_0^?}`. - #) Return :math:`\epsilon~\rightarrow~t`. + #) Return :math:`\epsilon~\rightarrow~t`. #. Assert: Due to validation, :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case . @@ -9363,15 +9363,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~{\mathit{fa}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{func}~{\mathit{fa}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{fa}}~{\mathrm{funcs}}({{\mathit{externaddr}'}^\ast})`. + #. Return :math:`{\mathit{fa}}~{\mathrm{funcs}}({{\mathit{externaddr}'}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9384,15 +9384,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~{\mathit{ga}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{global}~{\mathit{ga}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ga}}~{\mathrm{globals}}({{\mathit{externaddr}'}^\ast})`. + #. Return :math:`{\mathit{ga}}~{\mathrm{globals}}({{\mathit{externaddr}'}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9405,15 +9405,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~{\mathit{ta}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{table}~{\mathit{ta}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ta}}~{\mathrm{tables}}({{\mathit{externaddr}'}^\ast})`. + #. Return :math:`{\mathit{ta}}~{\mathrm{tables}}({{\mathit{externaddr}'}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9426,15 +9426,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~{\mathit{ma}})` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{mem}~{\mathit{ma}})` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`{\mathit{ma}}~{\mathrm{mems}}({{\mathit{externaddr}'}^\ast})`. + #. Return :math:`{\mathit{ma}}~{\mathrm{mems}}({{\mathit{externaddr}'}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{externaddr}'}^\ast}` be :math:`{{\mathit{xv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9464,7 +9464,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{func}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{func}}~{{\mathit{func}'}^\ast}` be :math:`{{\mathit{func}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9494,23 +9494,23 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Assert: Due to validation, :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. + a. Assert: Due to validation, :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. - #. Return :math:`\epsilon`. + #. Return :math:`\epsilon`. #. Else: - a. Let :math:`{\mathit{globaltype}}~{{\mathit{globaltype}'}^\ast}` be :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + a. Let :math:`{\mathit{globaltype}}~{{\mathit{globaltype}'}^\ast}` be :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Assert: Due to validation, :math:`{|{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. + #. Assert: Due to validation, :math:`{|{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. - #. Let :math:`{\mathit{val}}~{{\mathit{val}'}^\ast}` be :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + #. Let :math:`{\mathit{val}}~{{\mathit{val}'}^\ast}` be :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Let :math:`{\mathit{ga}}` be :math:`{\mathrm{allocglobal}}(s, {\mathit{globaltype}}, {\mathit{val}})`. + #. Let :math:`{\mathit{ga}}` be :math:`{\mathrm{allocglobal}}(s, {\mathit{globaltype}}, {\mathit{val}})`. - #. Let :math:`{{\mathit{ga}'}^\ast}` be :math:`{\mathrm{allocglobals}}(s, {{\mathit{globaltype}'}^\ast}, {{\mathit{val}'}^\ast})`. + #. Let :math:`{{\mathit{ga}'}^\ast}` be :math:`{\mathrm{allocglobals}}(s, {{\mathit{globaltype}'}^\ast}, {{\mathit{val}'}^\ast})`. - #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. + #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. :math:`{\mathrm{alloctable}}(s, ({}[~i~..~j~])~{\mathit{rt}})` @@ -9532,7 +9532,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{tt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{tabletype}}~{{\mathit{tabletype}'}^\ast}` be :math:`{{\mathit{tt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9562,7 +9562,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{mt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{memtype}}~{{\mathit{memtype}'}^\ast}` be :math:`{{\mathit{mt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9592,7 +9592,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{{\mathit{rt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{r_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, :math:`{|{r_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. @@ -9628,7 +9628,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{b_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{{\mathit{byte}}^\ast}~{{{\mathit{byte}'}^\ast}^\ast}` be :math:`{b_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -9645,21 +9645,21 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{func}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{func}~{{\mathit{fa}}^\ast}{}[x]) \}\end{array}`. + #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{func}~{{\mathit{fa}}^\ast}{}[x]) \}\end{array}`. #. If :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{global}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{global}~{{\mathit{ga}}^\ast}{}[x]) \}\end{array}`. + #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{global}~{{\mathit{ga}}^\ast}{}[x]) \}\end{array}`. #. If :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table}~x)` be :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{table}~{{\mathit{ta}}^\ast}{}[x]) \}\end{array}`. + #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{table}~{{\mathit{ta}}^\ast}{}[x]) \}\end{array}`. #. Assert: Due to validation, :math:`{\mathit{externidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{mem}`. @@ -9757,11 +9757,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{passive}`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. If :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{declare}`, then: - a. Return :math:`(\mathsf{elem{.}drop}~i)`. + a. Return :math:`(\mathsf{elem{.}drop}~i)`. #. Assert: Due to validation, :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{active}`. @@ -9778,7 +9778,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. If :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{passive}`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{active}`. @@ -9821,9 +9821,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Let :math:`{(\mathsf{elem}~{\mathit{reftype}}~{{\mathit{expr}}_{\mathsf{e}}^\ast}~{\mathit{elemmode}})^\ast}` be :math:`{{\mathit{elem}}^\ast}`. -#. Let :math:`{{\mathit{instr}}_{\mathsf{d}}^\ast}` be :math:`{\mathrm{concat}}({{\mathrm{rundata}}({{\mathit{data}}^\ast}{}[j], j)^{j<n_{\mathsf{d}}}})`. +#. Let :math:`{{\mathit{instr}}_{\mathsf{d}}^\ast}` be the concatenation of :math:`{{\mathrm{rundata}}({{\mathit{data}}^\ast}{}[j], j)^{j<n_{\mathsf{d}}}}`. -#. Let :math:`{{\mathit{instr}}_{\mathsf{e}}^\ast}` be :math:`{\mathrm{concat}}({{\mathrm{runelem}}({{\mathit{elem}}^\ast}{}[i], i)^{i<n_{\mathsf{e}}}})`. +#. Let :math:`{{\mathit{instr}}_{\mathsf{e}}^\ast}` be the concatenation of :math:`{{\mathrm{runelem}}({{\mathit{elem}}^\ast}{}[i], i)^{i<n_{\mathsf{e}}}}`. #. Let :math:`{\mathit{moduleinst}}_{\mathit{init}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{functype}}^\ast},\; \mathsf{funcs}~{\mathrm{funcs}}({{\mathit{externaddr}}^\ast})~{({|s{.}\mathsf{funcs}|} + i_{\mathsf{f}})^{i_{\mathsf{f}}<n_{\mathsf{f}}}},\; \mathsf{globals}~{\mathrm{globals}}({{\mathit{externaddr}}^\ast}),\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{exports}~\epsilon \}\end{array}`. @@ -9891,8 +9891,8 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{{\mathit{val}}^{k}}`. -:math:`{\mathrm{eval}}_{\mathit{expr}}({{\mathit{instr}}^\ast})` -................................................................ +the result of :ref:`evaluating <exec-expr>` :math:`{{\mathit{instr}}^\ast}` +........................................................................... 1. Execute the instruction :math:`{{\mathit{instr}}^\ast}`. @@ -12658,7 +12658,7 @@ invoke s fa val^n 12. Pop the values val^k from the stack. 13. Return val^k. -eval_expr instr* +Eval_expr instr* 1. Execute the instruction instr*. 2. Pop the value val from the stack. 3. Return [val]. @@ -12691,24 +12691,24 @@ The vector type :math:`{\mathit{vectype}}` is valid. The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid if: - * Either: + * Either: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{absheaptype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{absheaptype}}`. - * Or: + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{typeidx}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{typeidx}}`. - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is equal to :math:`{\mathit{dt}}`. - * Or: + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is equal to :math:`{\mathit{dt}}`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{rec}~i)`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{rec}~i)`. - * The sub type :math:`C{.}\mathsf{recs}{}[i]` exists. + * The sub type :math:`C{.}\mathsf{recs}{}[i]` exists. - * The sub type :math:`C{.}\mathsf{recs}{}[i]` is equal to :math:`{\mathit{st}}`. + * The sub type :math:`C{.}\mathsf{recs}{}[i]` is equal to :math:`{\mathit{st}}`. @@ -12721,9 +12721,9 @@ The heap type :math:`{\mathit{absheaptype}}` is valid. The heap type :math:`{\mathit{typeidx}}` is valid if: - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is equal to :math:`{\mathit{dt}}`. + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is equal to :math:`{\mathit{dt}}`. @@ -12731,9 +12731,9 @@ The heap type :math:`{\mathit{typeidx}}` is valid if: The heap type :math:`(\mathsf{rec}~i)` is valid if: - * The sub type :math:`C{.}\mathsf{recs}{}[i]` exists. + * The sub type :math:`C{.}\mathsf{recs}{}[i]` exists. - * The sub type :math:`C{.}\mathsf{recs}{}[i]` is equal to :math:`{\mathit{st}}`. + * The sub type :math:`C{.}\mathsf{recs}{}[i]` is equal to :math:`{\mathit{st}}`. @@ -12741,7 +12741,7 @@ The heap type :math:`(\mathsf{rec}~i)` is valid if: The reference type :math:`(\mathsf{ref}~{\mathsf{null}^?}~{\mathit{heaptype}})` is valid if: - * The heap type :math:`{\mathit{heaptype}}` is valid. + * The heap type :math:`{\mathit{heaptype}}` is valid. @@ -12749,25 +12749,25 @@ The reference type :math:`(\mathsf{ref}~{\mathsf{null}^?}~{\mathit{heaptype}})` The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid if: - * Either: + * Either: - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{numtype}}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{numtype}}`. - * The number type :math:`{\mathit{numtype}}` is valid. + * The number type :math:`{\mathit{numtype}}` is valid. - * Or: + * Or: - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{vectype}}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{vectype}}`. - * The vector type :math:`{\mathit{vectype}}` is valid. - * Or: + * The vector type :math:`{\mathit{vectype}}` is valid. + * Or: - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{reftype}}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{reftype}}`. - * The reference type :math:`{\mathit{reftype}}` is valid. - * Or: + * The reference type :math:`{\mathit{reftype}}` is valid. + * Or: - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{bot}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{bot}`. @@ -12775,7 +12775,7 @@ The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid if: The value type :math:`{\mathit{numtype}}` is valid if: - * The value type :math:`{\mathit{numtype}}` is valid. + * The value type :math:`{\mathit{numtype}}` is valid. @@ -12783,7 +12783,7 @@ The value type :math:`{\mathit{numtype}}` is valid if: The value type :math:`{\mathit{vectype}}` is valid if: - * The value type :math:`{\mathit{vectype}}` is valid. + * The value type :math:`{\mathit{vectype}}` is valid. @@ -12791,7 +12791,7 @@ The value type :math:`{\mathit{vectype}}` is valid if: The value type :math:`{\mathit{reftype}}` is valid if: - * The value type :math:`{\mathit{reftype}}` is valid. + * The value type :math:`{\mathit{reftype}}` is valid. @@ -12804,9 +12804,9 @@ The value type :math:`\mathsf{bot}` is valid. The result type :math:`{t^\ast}` is valid if: - * For all :math:`t` in :math:`{t^\ast}`: + * For all :math:`t` in :math:`{t^\ast}`: - * The value type :math:`t` is valid. + * The value type :math:`t` is valid. @@ -12814,19 +12814,19 @@ The result type :math:`{t^\ast}` is valid if: The instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}` is valid if: - * The result type :math:`{t_1^\ast}` is valid. + * The result type :math:`{t_1^\ast}` is valid. - * The result type :math:`{t_2^\ast}` is valid. + * The result type :math:`{t_2^\ast}` is valid. - * :math:`{|{\mathit{x*}}|}` is equal to :math:`{|{\mathit{lct*}}|}`. + * :math:`{|{\mathit{x*}}|}` is equal to :math:`{|{\mathit{lct*}}|}`. - * For all :math:`x` in :math:`{x^\ast}`: + * For all :math:`x` in :math:`{x^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. - * For all :math:`{{\mathit{lt}}}` in :math:`{{{\mathit{lt}}}^\ast}` and :math:`x` in :math:`{x^\ast}`: + * For all :math:`{{\mathit{lt}}}` in :math:`{{{\mathit{lt}}}^\ast}` and :math:`x` in :math:`{x^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`{{\mathit{lt}}}`. + * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`{{\mathit{lt}}}`. @@ -12839,17 +12839,17 @@ The packed type :math:`{\mathit{packtype}}` is valid. The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid if: - * Either: + * Either: - * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{valtype}}`. + * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{valtype}}`. - * The value type :math:`{\mathit{valtype}}` is valid. + * The value type :math:`{\mathit{valtype}}` is valid. - * Or: + * Or: - * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{packtype}}`. + * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{packtype}}`. - * The packed type :math:`{\mathit{packtype}}` is valid. + * The packed type :math:`{\mathit{packtype}}` is valid. @@ -12857,7 +12857,7 @@ The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` i The storage type :math:`{\mathit{valtype}}` is valid if: - * The storage type :math:`{\mathit{valtype}}` is valid. + * The storage type :math:`{\mathit{valtype}}` is valid. @@ -12865,7 +12865,7 @@ The storage type :math:`{\mathit{valtype}}` is valid if: The storage type :math:`{\mathit{packtype}}` is valid if: - * The storage type :math:`{\mathit{packtype}}` is valid. + * The storage type :math:`{\mathit{packtype}}` is valid. @@ -12873,7 +12873,7 @@ The storage type :math:`{\mathit{packtype}}` is valid if: The field type :math:`({\mathsf{mut}^?}~{\mathit{storagetype}})` is valid if: - * The storage type :math:`{\mathit{storagetype}}` is valid. + * The storage type :math:`{\mathit{storagetype}}` is valid. @@ -12881,9 +12881,9 @@ The field type :math:`({\mathsf{mut}^?}~{\mathit{storagetype}})` is valid if: The function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid if: - * The result type :math:`{t_1^\ast}` is valid. + * The result type :math:`{t_1^\ast}` is valid. - * The result type :math:`{t_2^\ast}` is valid. + * The result type :math:`{t_2^\ast}` is valid. @@ -12891,24 +12891,24 @@ The function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid if: The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid if: - * Either: + * Either: - * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{struct}~{{\mathit{fieldtype}}^\ast})`. + * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{struct}~{{\mathit{fieldtype}}^\ast})`. - * For all :math:`{\mathit{fieldtype}}` in :math:`{{\mathit{fieldtype}}^\ast}`: + * For all :math:`{\mathit{fieldtype}}` in :math:`{{\mathit{fieldtype}}^\ast}`: - * The field type :math:`{\mathit{fieldtype}}` is valid. + * The field type :math:`{\mathit{fieldtype}}` is valid. - * Or: + * Or: - * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{array}~{\mathit{fieldtype}})`. + * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{array}~{\mathit{fieldtype}})`. - * The field type :math:`{\mathit{fieldtype}}` is valid. - * Or: + * The field type :math:`{\mathit{fieldtype}}` is valid. + * Or: - * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{functype}})`. + * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{functype}})`. - * The function type :math:`{\mathit{functype}}` is valid. + * The function type :math:`{\mathit{functype}}` is valid. @@ -12916,9 +12916,9 @@ The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` The composite type :math:`(\mathsf{struct}~{{\mathit{fieldtype}}^\ast})` is valid if: - * For all :math:`{\mathit{fieldtype}}` in :math:`{{\mathit{fieldtype}}^\ast}`: + * For all :math:`{\mathit{fieldtype}}` in :math:`{{\mathit{fieldtype}}^\ast}`: - * The field type :math:`{\mathit{fieldtype}}` is valid. + * The field type :math:`{\mathit{fieldtype}}` is valid. @@ -12926,7 +12926,7 @@ The composite type :math:`(\mathsf{struct}~{{\mathit{fieldtype}}^\ast})` is vali The composite type :math:`(\mathsf{array}~{\mathit{fieldtype}})` is valid if: - * The field type :math:`{\mathit{fieldtype}}` is valid. + * The field type :math:`{\mathit{fieldtype}}` is valid. @@ -12934,7 +12934,7 @@ The composite type :math:`(\mathsf{array}~{\mathit{fieldtype}})` is valid if: The composite type :math:`(\mathsf{func}~{\mathit{functype}})` is valid if: - * The function type :math:`{\mathit{functype}}` is valid. + * The function type :math:`{\mathit{functype}}` is valid. @@ -12952,17 +12952,17 @@ The number type :math:`{\mathit{numtype}}` matches itself. The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\mathit{deftype}}_2` if: - * Either: + * Either: - * The defined type :math:`{{\mathrm{clos}}}_{C}({\mathit{deftype}}_1)` is equal to :math:`{{\mathrm{clos}}}_{C}({\mathit{deftype}}_2)`. + * The defined type :math:`{{\mathrm{clos}}}_{C}({\mathit{deftype}}_1)` is equal to :math:`{{\mathrm{clos}}}_{C}({\mathit{deftype}}_2)`. - * Or: + * Or: - * The sub type :math:`{\mathrm{unroll}}({\mathit{deftype}}_1)` is equal to :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{ct}})`. + * The sub type :math:`{\mathrm{unroll}}({\mathit{deftype}}_1)` is equal to :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{ct}})`. - * :math:`{|{{\mathit{typeuse}}^\ast}|}` is greater than :math:`i`. + * :math:`{|{{\mathit{typeuse}}^\ast}|}` is greater than :math:`i`. - * The type use :math:`{{\mathit{typeuse}}^\ast}{}[i]` matches the defined type :math:`{\mathit{deftype}}_2`. + * The type use :math:`{{\mathit{typeuse}}^\ast}{}[i]` matches the defined type :math:`{\mathit{deftype}}_2`. @@ -12970,7 +12970,7 @@ The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\ The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\mathit{deftype}}_2` if: - * The defined type :math:`{{\mathrm{clos}}}_{C}({\mathit{deftype}}_1)` is equal to :math:`{{\mathrm{clos}}}_{C}({\mathit{deftype}}_2)`. + * The defined type :math:`{{\mathrm{clos}}}_{C}({\mathit{deftype}}_1)` is equal to :math:`{{\mathrm{clos}}}_{C}({\mathit{deftype}}_2)`. @@ -12978,11 +12978,11 @@ The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\ The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\mathit{deftype}}_2` if: - * The sub type :math:`{\mathrm{unroll}}({\mathit{deftype}}_1)` is equal to :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{ct}})`. + * The sub type :math:`{\mathrm{unroll}}({\mathit{deftype}}_1)` is equal to :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{ct}})`. - * :math:`{|{{\mathit{typeuse}}^\ast}|}` is greater than :math:`i`. + * :math:`{|{{\mathit{typeuse}}^\ast}|}` is greater than :math:`i`. - * The type use :math:`{{\mathit{typeuse}}^\ast}{}[i]` matches the defined type :math:`{\mathit{deftype}}_2`. + * The type use :math:`{{\mathit{typeuse}}^\ast}{}[i]` matches the defined type :math:`{\mathit{deftype}}_2`. @@ -12990,126 +12990,126 @@ The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\ The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` matches the heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` if: - * Either: + * Either: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{heaptype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{heaptype}}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. - * Or: + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{heaptype}}_1`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{heaptype}}_1`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}_2`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}_2`. - * The heap type :math:`{\mathit{heaptype}'}` is valid. + * The heap type :math:`{\mathit{heaptype}'}` is valid. - * The heap type :math:`{\mathit{heaptype}}_1` matches the heap type :math:`{\mathit{heaptype}'}`. + * The heap type :math:`{\mathit{heaptype}}_1` matches the heap type :math:`{\mathit{heaptype}'}`. - * The heap type :math:`{\mathit{heaptype}'}` matches the heap type :math:`{\mathit{heaptype}}_2`. - * Or: + * The heap type :math:`{\mathit{heaptype}'}` matches the heap type :math:`{\mathit{heaptype}}_2`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{eq}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{eq}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{any}`. - * Or: + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{any}`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{i{\scriptstyle 31}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{i{\scriptstyle 31}}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{eq}`. - * Or: + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{eq}`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{struct}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{struct}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{eq}`. - * Or: + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{eq}`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{array}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{array}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{eq}`. - * Or: + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{eq}`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{deftype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{deftype}}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{struct}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{struct}`. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{struct}~{{\mathit{fieldtype}}^\ast})`. - * Or: + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{struct}~{{\mathit{fieldtype}}^\ast})`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{deftype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{deftype}}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{array}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{array}`. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{array}~{\mathit{fieldtype}})`. - * Or: + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{array}~{\mathit{fieldtype}})`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{deftype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{deftype}}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{func}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{func}`. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. - * Or: + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{deftype}}_1`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{deftype}}_1`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{deftype}}_2`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{deftype}}_2`. - * The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\mathit{deftype}}_2`. - * Or: + * The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\mathit{deftype}}_2`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{typeidx}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{typeidx}}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` matches the heap type :math:`{\mathit{heaptype}}`. - * Or: + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` matches the heap type :math:`{\mathit{heaptype}}`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{heaptype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{heaptype}}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{typeidx}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{typeidx}}`. - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. - * The heap type :math:`{\mathit{heaptype}}` matches the defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]`. - * Or: + * The heap type :math:`{\mathit{heaptype}}` matches the defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{rec}~i)`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{rec}~i)`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{{\mathit{typeuse}}^\ast}{}[j]`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{{\mathit{typeuse}}^\ast}{}[j]`. - * :math:`{|{{\mathit{typeuse}}^\ast}|}` is greater than :math:`j`. + * :math:`{|{{\mathit{typeuse}}^\ast}|}` is greater than :math:`j`. - * The sub type :math:`C{.}\mathsf{recs}{}[i]` exists. + * The sub type :math:`C{.}\mathsf{recs}{}[i]` exists. - * The sub type :math:`C{.}\mathsf{recs}{}[i]` is equal to :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{ct}})`. - * Or: + * The sub type :math:`C{.}\mathsf{recs}{}[i]` is equal to :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{ct}})`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{none}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{none}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. - * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{any}`. - * Or: + * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{any}`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{nofunc}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{nofunc}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. - * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{func}`. - * Or: + * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{func}`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{noextern}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{noextern}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. - * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{extern}`. - * Or: + * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{extern}`. + * Or: - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{bot}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{bot}`. - * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. + * The heap type :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{heaptype}}`. @@ -13122,11 +13122,11 @@ The heap type :math:`{\mathit{heaptype}}` matches itself. The heap type :math:`{\mathit{heaptype}}_1` matches the heap type :math:`{\mathit{heaptype}}_2` if: - * The heap type :math:`{\mathit{heaptype}'}` is valid. + * The heap type :math:`{\mathit{heaptype}'}` is valid. - * The heap type :math:`{\mathit{heaptype}}_1` matches the heap type :math:`{\mathit{heaptype}'}`. + * The heap type :math:`{\mathit{heaptype}}_1` matches the heap type :math:`{\mathit{heaptype}'}`. - * The heap type :math:`{\mathit{heaptype}'}` matches the heap type :math:`{\mathit{heaptype}}_2`. + * The heap type :math:`{\mathit{heaptype}'}` matches the heap type :math:`{\mathit{heaptype}}_2`. @@ -13154,7 +13154,7 @@ The heap type :math:`\mathsf{array}` matches the heap type :math:`\mathsf{eq}`. The heap type :math:`{\mathit{deftype}}` matches the heap type :math:`\mathsf{struct}` if: - * The :ref:`expansion <aux-expand-deftype>` of the heap type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{struct}~{{\mathit{fieldtype}}^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the heap type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{struct}~{{\mathit{fieldtype}}^\ast})`. @@ -13162,7 +13162,7 @@ The heap type :math:`{\mathit{deftype}}` matches the heap type :math:`\mathsf{st The heap type :math:`{\mathit{deftype}}` matches the heap type :math:`\mathsf{array}` if: - * The :ref:`expansion <aux-expand-deftype>` of the heap type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{array}~{\mathit{fieldtype}})`. + * The :ref:`expansion <aux-expand-deftype>` of the heap type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{array}~{\mathit{fieldtype}})`. @@ -13170,7 +13170,7 @@ The heap type :math:`{\mathit{deftype}}` matches the heap type :math:`\mathsf{ar The heap type :math:`{\mathit{deftype}}` matches the heap type :math:`\mathsf{func}` if: - * The :ref:`expansion <aux-expand-deftype>` of the heap type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. + * The :ref:`expansion <aux-expand-deftype>` of the heap type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. @@ -13178,7 +13178,7 @@ The heap type :math:`{\mathit{deftype}}` matches the heap type :math:`\mathsf{fu The heap type :math:`{\mathit{deftype}}_1` matches the heap type :math:`{\mathit{deftype}}_2` if: - * The heap type :math:`{\mathit{deftype}}_1` matches the heap type :math:`{\mathit{deftype}}_2`. + * The heap type :math:`{\mathit{deftype}}_1` matches the heap type :math:`{\mathit{deftype}}_2`. @@ -13186,9 +13186,9 @@ The heap type :math:`{\mathit{deftype}}_1` matches the heap type :math:`{\mathit The heap type :math:`{\mathit{typeidx}}` matches the heap type :math:`{\mathit{heaptype}}` if: - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` matches the heap type :math:`{\mathit{heaptype}}`. + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` matches the heap type :math:`{\mathit{heaptype}}`. @@ -13196,9 +13196,9 @@ The heap type :math:`{\mathit{typeidx}}` matches the heap type :math:`{\mathit{h The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`{\mathit{typeidx}}` if: - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. - * The heap type :math:`{\mathit{heaptype}}` matches the defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]`. + * The heap type :math:`{\mathit{heaptype}}` matches the defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]`. @@ -13206,11 +13206,11 @@ The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`{\mathit{ The heap type :math:`(\mathsf{rec}~i)` matches the type use :math:`{{\mathit{typeuse}}^\ast}{}[j]` if: - * :math:`{|{{\mathit{typeuse}}^\ast}|}` is greater than :math:`j`. + * :math:`{|{{\mathit{typeuse}}^\ast}|}` is greater than :math:`j`. - * The sub type :math:`C{.}\mathsf{recs}{}[i]` exists. + * The sub type :math:`C{.}\mathsf{recs}{}[i]` exists. - * The sub type :math:`C{.}\mathsf{recs}{}[i]` is equal to :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{ct}})`. + * The sub type :math:`C{.}\mathsf{recs}{}[i]` is equal to :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{ct}})`. @@ -13218,7 +13218,7 @@ The heap type :math:`(\mathsf{rec}~i)` matches the type use :math:`{{\mathit{typ The heap type :math:`\mathsf{none}` matches the heap type :math:`{\mathit{heaptype}}` if: - * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{any}`. + * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{any}`. @@ -13226,7 +13226,7 @@ The heap type :math:`\mathsf{none}` matches the heap type :math:`{\mathit{heapty The heap type :math:`\mathsf{nofunc}` matches the heap type :math:`{\mathit{heaptype}}` if: - * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{func}`. + * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{func}`. @@ -13234,7 +13234,7 @@ The heap type :math:`\mathsf{nofunc}` matches the heap type :math:`{\mathit{heap The heap type :math:`\mathsf{noextern}` matches the heap type :math:`{\mathit{heaptype}}` if: - * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{extern}`. + * The heap type :math:`{\mathit{heaptype}}` matches the heap type :math:`\mathsf{extern}`. @@ -13247,19 +13247,19 @@ The heap type :math:`\mathsf{bot}` matches the heap type :math:`{\mathit{heaptyp The reference type :math:`(\mathsf{ref}~{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~{\mathit{ht}}_1)` matches the reference type :math:`(\mathsf{ref}~{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}~{\mathit{ht}}_2)` if: - * The heap type :math:`{\mathit{ht}}_1` matches the heap type :math:`{\mathit{ht}}_2`. + * The heap type :math:`{\mathit{ht}}_1` matches the heap type :math:`{\mathit{ht}}_2`. - * Either: + * Either: - * :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is absent. + * :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is absent. - * :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is absent. + * :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is absent. - * Or: + * Or: - * :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{null}^?}`. + * :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{null}^?}`. - * :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{null}`. + * :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{null}`. @@ -13267,7 +13267,7 @@ The reference type :math:`(\mathsf{ref}~{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1 The reference type :math:`(\mathsf{ref}~\epsilon~{\mathit{ht}}_1)` matches the reference type :math:`(\mathsf{ref}~\epsilon~{\mathit{ht}}_2)` if: - * The heap type :math:`{\mathit{ht}}_1` matches the heap type :math:`{\mathit{ht}}_2`. + * The heap type :math:`{\mathit{ht}}_1` matches the heap type :math:`{\mathit{ht}}_2`. @@ -13275,7 +13275,7 @@ The reference type :math:`(\mathsf{ref}~\epsilon~{\mathit{ht}}_1)` matches the r The reference type :math:`(\mathsf{ref}~{\mathsf{null}^?}~{\mathit{ht}}_1)` matches the reference type :math:`(\mathsf{ref}~\mathsf{null}~{\mathit{ht}}_2)` if: - * The heap type :math:`{\mathit{ht}}_1` matches the heap type :math:`{\mathit{ht}}_2`. + * The heap type :math:`{\mathit{ht}}_1` matches the heap type :math:`{\mathit{ht}}_2`. @@ -13288,33 +13288,33 @@ The vector type :math:`{\mathit{vectype}}` matches itself. The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` matches the value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` if: - * Either: + * Either: - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{numtype}}_1`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{numtype}}_1`. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{numtype}}_2`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{numtype}}_2`. - * The number type :math:`{\mathit{numtype}}_1` matches the number type :math:`{\mathit{numtype}}_2`. + * The number type :math:`{\mathit{numtype}}_1` matches the number type :math:`{\mathit{numtype}}_2`. - * Or: + * Or: - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{vectype}}_1`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{vectype}}_1`. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{vectype}}_2`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{vectype}}_2`. - * The vector type :math:`{\mathit{vectype}}_1` matches the vector type :math:`{\mathit{vectype}}_2`. - * Or: + * The vector type :math:`{\mathit{vectype}}_1` matches the vector type :math:`{\mathit{vectype}}_2`. + * Or: - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{reftype}}_1`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{reftype}}_1`. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{reftype}}_2`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{reftype}}_2`. - * The reference type :math:`{\mathit{reftype}}_1` matches the reference type :math:`{\mathit{reftype}}_2`. - * Or: + * The reference type :math:`{\mathit{reftype}}_1` matches the reference type :math:`{\mathit{reftype}}_2`. + * Or: - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{bot}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{bot}`. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{valtype}}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{valtype}}`. @@ -13322,7 +13322,7 @@ The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` matches the val The value type :math:`{\mathit{numtype}}_1` matches the value type :math:`{\mathit{numtype}}_2` if: - * The value type :math:`{\mathit{numtype}}_1` matches the value type :math:`{\mathit{numtype}}_2`. + * The value type :math:`{\mathit{numtype}}_1` matches the value type :math:`{\mathit{numtype}}_2`. @@ -13330,7 +13330,7 @@ The value type :math:`{\mathit{numtype}}_1` matches the value type :math:`{\math The value type :math:`{\mathit{vectype}}_1` matches the value type :math:`{\mathit{vectype}}_2` if: - * The value type :math:`{\mathit{vectype}}_1` matches the value type :math:`{\mathit{vectype}}_2`. + * The value type :math:`{\mathit{vectype}}_1` matches the value type :math:`{\mathit{vectype}}_2`. @@ -13338,7 +13338,7 @@ The value type :math:`{\mathit{vectype}}_1` matches the value type :math:`{\math The value type :math:`{\mathit{reftype}}_1` matches the value type :math:`{\mathit{reftype}}_2` if: - * The value type :math:`{\mathit{reftype}}_1` matches the value type :math:`{\mathit{reftype}}_2`. + * The value type :math:`{\mathit{reftype}}_1` matches the value type :math:`{\mathit{reftype}}_2`. @@ -13351,21 +13351,21 @@ The value type :math:`\mathsf{bot}` matches the value type :math:`{\mathit{valty The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` matches the storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` if: - * Either: + * Either: - * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{valtype}}_1`. + * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{valtype}}_1`. - * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{valtype}}_2`. + * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{valtype}}_2`. - * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. + * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. - * Or: + * Or: - * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{packtype}}_1`. + * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{packtype}}_1`. - * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{packtype}}_2`. + * The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`{\mathit{packtype}}_2`. - * The packed type :math:`{\mathit{packtype}}_1` matches the packed type :math:`{\mathit{packtype}}_2`. + * The packed type :math:`{\mathit{packtype}}_1` matches the packed type :math:`{\mathit{packtype}}_2`. @@ -13373,7 +13373,7 @@ The storage type :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` m The storage type :math:`{\mathit{valtype}}_1` matches the storage type :math:`{\mathit{valtype}}_2` if: - * The storage type :math:`{\mathit{valtype}}_1` matches the storage type :math:`{\mathit{valtype}}_2`. + * The storage type :math:`{\mathit{valtype}}_1` matches the storage type :math:`{\mathit{valtype}}_2`. @@ -13381,7 +13381,7 @@ The storage type :math:`{\mathit{valtype}}_1` matches the storage type :math:`{\ The storage type :math:`{\mathit{packtype}}_1` matches the storage type :math:`{\mathit{packtype}}_2` if: - * The storage type :math:`{\mathit{packtype}}_1` matches the storage type :math:`{\mathit{packtype}}_2`. + * The storage type :math:`{\mathit{packtype}}_1` matches the storage type :math:`{\mathit{packtype}}_2`. @@ -13389,21 +13389,21 @@ The storage type :math:`{\mathit{packtype}}_1` matches the storage type :math:`{ The field type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~{\mathit{zt}}_1)` matches the field type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}~{\mathit{zt}}_2)` if: - * The storage type :math:`{\mathit{zt}}_1` matches the storage type :math:`{\mathit{zt}}_2`. + * The storage type :math:`{\mathit{zt}}_1` matches the storage type :math:`{\mathit{zt}}_2`. - * Either: + * Either: - * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is absent. + * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is absent. - * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is absent. + * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is absent. - * Or: + * Or: - * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{mut}`. + * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{mut}`. - * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{mut}`. + * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{mut}`. - * The storage type :math:`{\mathit{zt}}_2` matches the storage type :math:`{\mathit{zt}}_1`. + * The storage type :math:`{\mathit{zt}}_2` matches the storage type :math:`{\mathit{zt}}_1`. @@ -13411,7 +13411,7 @@ The field type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}} The field type :math:`(\epsilon~{\mathit{zt}}_1)` matches the field type :math:`(\epsilon~{\mathit{zt}}_2)` if: - * The storage type :math:`{\mathit{zt}}_1` matches the storage type :math:`{\mathit{zt}}_2`. + * The storage type :math:`{\mathit{zt}}_1` matches the storage type :math:`{\mathit{zt}}_2`. @@ -13419,9 +13419,9 @@ The field type :math:`(\epsilon~{\mathit{zt}}_1)` matches the field type :math:` The field type :math:`(\mathsf{mut}~{\mathit{zt}}_1)` matches the field type :math:`(\mathsf{mut}~{\mathit{zt}}_2)` if: - * The storage type :math:`{\mathit{zt}}_1` matches the storage type :math:`{\mathit{zt}}_2`. + * The storage type :math:`{\mathit{zt}}_1` matches the storage type :math:`{\mathit{zt}}_2`. - * The storage type :math:`{\mathit{zt}}_2` matches the storage type :math:`{\mathit{zt}}_1`. + * The storage type :math:`{\mathit{zt}}_2` matches the storage type :math:`{\mathit{zt}}_1`. @@ -13429,11 +13429,11 @@ The field type :math:`(\mathsf{mut}~{\mathit{zt}}_1)` matches the field type :ma The value type sequence :math:`{t_1^\ast}` matches the value type sequence :math:`{t_2^\ast}` if: - * :math:`{|t_{\mathit{{\scriptstyle 2}*}}|}` is equal to :math:`{|t_{\mathit{{\scriptstyle 1}*}}|}`. + * :math:`{|t_{\mathit{{\scriptstyle 2}*}}|}` is equal to :math:`{|t_{\mathit{{\scriptstyle 1}*}}|}`. - * For all :math:`t_1` in :math:`{t_1^\ast}` and :math:`t_2` in :math:`{t_2^\ast}`: + * For all :math:`t_1` in :math:`{t_1^\ast}` and :math:`t_2` in :math:`{t_2^\ast}`: - * The value type :math:`t_1` matches the value type :math:`t_2`. + * The value type :math:`t_1` matches the value type :math:`t_2`. @@ -13441,9 +13441,9 @@ The value type sequence :math:`{t_1^\ast}` matches the value type sequence :math The function type :math:`{t_{11}^\ast}~\rightarrow~{t_{12}^\ast}` matches the function type :math:`{t_{21}^\ast}~\rightarrow~{t_{22}^\ast}` if: - * The value type sequence :math:`{t_{21}^\ast}` matches the value type sequence :math:`{t_{11}^\ast}`. + * The value type sequence :math:`{t_{21}^\ast}` matches the value type sequence :math:`{t_{11}^\ast}`. - * The value type sequence :math:`{t_{12}^\ast}` matches the value type sequence :math:`{t_{22}^\ast}`. + * The value type sequence :math:`{t_{12}^\ast}` matches the value type sequence :math:`{t_{22}^\ast}`. @@ -13451,32 +13451,32 @@ The function type :math:`{t_{11}^\ast}~\rightarrow~{t_{12}^\ast}` matches the fu The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` matches the composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` if: - * Either: + * Either: - * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{struct}~{{\mathit{yt}}_1^\ast}~{\mathit{yt}'}_1)`. + * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{struct}~{{\mathit{yt}}_1^\ast}~{\mathit{yt}'}_1)`. - * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{struct}~{{\mathit{yt}}_2^\ast})`. + * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{struct}~{{\mathit{yt}}_2^\ast})`. - * :math:`{|{\mathit{yt}}_{\mathit{{\scriptstyle 2}*}}|}` is equal to :math:`{|{\mathit{yt}}_{\mathit{{\scriptstyle 1}*}}|}`. + * :math:`{|{\mathit{yt}}_{\mathit{{\scriptstyle 2}*}}|}` is equal to :math:`{|{\mathit{yt}}_{\mathit{{\scriptstyle 1}*}}|}`. - * For all :math:`{\mathit{yt}}_1` in :math:`{{\mathit{yt}}_1^\ast}` and :math:`{\mathit{yt}}_2` in :math:`{{\mathit{yt}}_2^\ast}`: + * For all :math:`{\mathit{yt}}_1` in :math:`{{\mathit{yt}}_1^\ast}` and :math:`{\mathit{yt}}_2` in :math:`{{\mathit{yt}}_2^\ast}`: - * The field type :math:`{\mathit{yt}}_1` matches the field type :math:`{\mathit{yt}}_2`. + * The field type :math:`{\mathit{yt}}_1` matches the field type :math:`{\mathit{yt}}_2`. - * Or: + * Or: - * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{array}~{\mathit{yt}}_1)`. + * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{array}~{\mathit{yt}}_1)`. - * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{array}~{\mathit{yt}}_2)`. + * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{array}~{\mathit{yt}}_2)`. - * The field type :math:`{\mathit{yt}}_1` matches the field type :math:`{\mathit{yt}}_2`. - * Or: + * The field type :math:`{\mathit{yt}}_1` matches the field type :math:`{\mathit{yt}}_2`. + * Or: - * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_1)`. + * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_1)`. - * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_2)`. + * The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{func}~{\mathit{ft}}_2)`. - * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. + * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. @@ -13484,11 +13484,11 @@ The composite type :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` The composite type :math:`(\mathsf{struct}~{{\mathit{yt}}_1^\ast}~{\mathit{yt}'}_1)` matches the composite type :math:`(\mathsf{struct}~{{\mathit{yt}}_2^\ast})` if: - * :math:`{|{\mathit{yt}}_{\mathit{{\scriptstyle 2}*}}|}` is equal to :math:`{|{\mathit{yt}}_{\mathit{{\scriptstyle 1}*}}|}`. + * :math:`{|{\mathit{yt}}_{\mathit{{\scriptstyle 2}*}}|}` is equal to :math:`{|{\mathit{yt}}_{\mathit{{\scriptstyle 1}*}}|}`. - * For all :math:`{\mathit{yt}}_1` in :math:`{{\mathit{yt}}_1^\ast}` and :math:`{\mathit{yt}}_2` in :math:`{{\mathit{yt}}_2^\ast}`: + * For all :math:`{\mathit{yt}}_1` in :math:`{{\mathit{yt}}_1^\ast}` and :math:`{\mathit{yt}}_2` in :math:`{{\mathit{yt}}_2^\ast}`: - * The field type :math:`{\mathit{yt}}_1` matches the field type :math:`{\mathit{yt}}_2`. + * The field type :math:`{\mathit{yt}}_1` matches the field type :math:`{\mathit{yt}}_2`. @@ -13496,7 +13496,7 @@ The composite type :math:`(\mathsf{struct}~{{\mathit{yt}}_1^\ast}~{\mathit{yt}'} The composite type :math:`(\mathsf{array}~{\mathit{yt}}_1)` matches the composite type :math:`(\mathsf{array}~{\mathit{yt}}_2)` if: - * The field type :math:`{\mathit{yt}}_1` matches the field type :math:`{\mathit{yt}}_2`. + * The field type :math:`{\mathit{yt}}_1` matches the field type :math:`{\mathit{yt}}_2`. @@ -13504,7 +13504,7 @@ The composite type :math:`(\mathsf{array}~{\mathit{yt}}_1)` matches the composit The composite type :math:`(\mathsf{func}~{\mathit{ft}}_1)` matches the composite type :math:`(\mathsf{func}~{\mathit{ft}}_2)` if: - * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. + * The function type :math:`{\mathit{ft}}_1` matches the function type :math:`{\mathit{ft}}_2`. @@ -13512,29 +13512,29 @@ The composite type :math:`(\mathsf{func}~{\mathit{ft}}_1)` matches the composite The sub type :math:`(\mathsf{sub}~{\mathsf{final}^?}~{x^\ast}~{\mathit{comptype}})` is valid with :math:`({\mathsf{ok}}{x_0})` if: - * :math:`{|{x^\ast}|}` is less than or equal to :math:`1`. + * :math:`{|{x^\ast}|}` is less than or equal to :math:`1`. - * For all :math:`x` in :math:`{x^\ast}`: + * For all :math:`x` in :math:`{x^\ast}`: - * The index :math:`x` is less than :math:`x_0`. + * The index :math:`x` is less than :math:`x_0`. - * :math:`{|{\mathit{x*}}|}` is equal to :math:`{|{\mathit{comptype'*}}|}`. + * :math:`{|{\mathit{x*}}|}` is equal to :math:`{|{\mathit{comptype'*}}|}`. - * :math:`{|{\mathit{x'**}}|}` is equal to :math:`{|{\mathit{comptype'*}}|}`. + * :math:`{|{\mathit{x'**}}|}` is equal to :math:`{|{\mathit{comptype'*}}|}`. - * For all :math:`x` in :math:`{x^\ast}`: + * For all :math:`x` in :math:`{x^\ast}`: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * For all :math:`{\mathit{comptype}'}` in :math:`{{\mathit{comptype}'}^\ast}` and :math:`x` in :math:`{x^\ast}` and :math:`{\mathit{x'*}}` in :math:`{{\mathit{x'*}}^\ast}`: + * For all :math:`{\mathit{comptype}'}` in :math:`{{\mathit{comptype}'}^\ast}` and :math:`x` in :math:`{x^\ast}` and :math:`{\mathit{x'*}}` in :math:`{{\mathit{x'*}}^\ast}`: - * The sub type :math:`{\mathrm{unroll}}(C{.}\mathsf{types}{}[x])` is equal to :math:`(\mathsf{sub}~\epsilon~{{x'}^\ast}~{\mathit{comptype}'})`. + * The sub type :math:`{\mathrm{unroll}}(C{.}\mathsf{types}{}[x])` is equal to :math:`(\mathsf{sub}~\epsilon~{{x'}^\ast}~{\mathit{comptype}'})`. - * The composite type :math:`{\mathit{comptype}}` is valid. + * The composite type :math:`{\mathit{comptype}}` is valid. - * For all :math:`{\mathit{comptype}'}` in :math:`{{\mathit{comptype}'}^\ast}`: + * For all :math:`{\mathit{comptype}'}` in :math:`{{\mathit{comptype}'}^\ast}`: - * The composite type :math:`{\mathit{comptype}}` matches the composite type :math:`{\mathit{comptype}'}`. + * The composite type :math:`{\mathit{comptype}}` matches the composite type :math:`{\mathit{comptype}'}`. @@ -13542,25 +13542,25 @@ The sub type :math:`(\mathsf{sub}~{\mathsf{final}^?}~{x^\ast}~{\mathit{comptype} The sub type :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{\mathit{compttype}})` is valid with :math:`({\mathsf{ok}}{(x, i)})` if: - * :math:`{|{{\mathit{typeuse}}^\ast}|}` is less than or equal to :math:`1`. + * :math:`{|{{\mathit{typeuse}}^\ast}|}` is less than or equal to :math:`1`. - * For all :math:`{\mathit{typeuse}}` in :math:`{{\mathit{typeuse}}^\ast}`: + * For all :math:`{\mathit{typeuse}}` in :math:`{{\mathit{typeuse}}^\ast}`: - * :math:`{\mathit{typeuse}} \prec x, i` is equal to true. + * :math:`{\mathit{typeuse}} \prec x, i` is equal to true. - * :math:`{|{\mathit{typeuse*}}|}` is equal to :math:`{|{\mathit{comptype'*}}|}`. + * :math:`{|{\mathit{typeuse*}}|}` is equal to :math:`{|{\mathit{comptype'*}}|}`. - * :math:`{|{\mathit{typeuse'**}}|}` is equal to :math:`{|{\mathit{comptype'*}}|}`. + * :math:`{|{\mathit{typeuse'**}}|}` is equal to :math:`{|{\mathit{comptype'*}}|}`. - * For all :math:`{\mathit{comptype}'}` in :math:`{{\mathit{comptype}'}^\ast}` and :math:`{\mathit{typeuse}}` in :math:`{{\mathit{typeuse}}^\ast}` and :math:`{\mathit{typeuse'*}}` in :math:`{{\mathit{typeuse'*}}^\ast}`: + * For all :math:`{\mathit{comptype}'}` in :math:`{{\mathit{comptype}'}^\ast}` and :math:`{\mathit{typeuse}}` in :math:`{{\mathit{typeuse}}^\ast}` and :math:`{\mathit{typeuse'*}}` in :math:`{{\mathit{typeuse'*}}^\ast}`: - * The sub type :math:`{{\mathrm{unroll}}}_{C}({\mathit{typeuse}})` is equal to :math:`(\mathsf{sub}~\epsilon~{{\mathit{typeuse}'}^\ast}~{\mathit{comptype}'})`. + * The sub type :math:`{{\mathrm{unroll}}}_{C}({\mathit{typeuse}})` is equal to :math:`(\mathsf{sub}~\epsilon~{{\mathit{typeuse}'}^\ast}~{\mathit{comptype}'})`. - * The composite type :math:`{\mathit{comptype}}` is valid. + * The composite type :math:`{\mathit{comptype}}` is valid. - * For all :math:`{\mathit{comptype}'}` in :math:`{{\mathit{comptype}'}^\ast}`: + * For all :math:`{\mathit{comptype}'}` in :math:`{{\mathit{comptype}'}^\ast}`: - * The composite type :math:`{\mathit{comptype}}` matches the composite type :math:`{\mathit{comptype}'}`. + * The composite type :math:`{\mathit{comptype}}` matches the composite type :math:`{\mathit{comptype}'}`. @@ -13568,17 +13568,17 @@ The sub type :math:`(\mathsf{sub}~{\mathsf{final}^?}~{{\mathit{typeuse}}^\ast}~{ The recursive type :math:`(\mathsf{rec}~{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast})` is valid with :math:`({\mathsf{ok}}{(x, i)})` if: - * Either: + * Either: - * The sub type sequence :math:`{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The sub type sequence :math:`{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * Or: + * Or: - * The sub type sequence :math:`{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{subtype}}_1~{{\mathit{subtype}}^\ast}`. + * The sub type sequence :math:`{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{subtype}}_1~{{\mathit{subtype}}^\ast}`. - * The sub type :math:`{\mathit{subtype}}_1` is valid with :math:`({\mathsf{ok}}{(x, i)})`. + * The sub type :math:`{\mathit{subtype}}_1` is valid with :math:`({\mathsf{ok}}{(x, i)})`. - * The recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{(x + 1, i + 1)})`. + * The recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{(x + 1, i + 1)})`. @@ -13591,9 +13591,9 @@ The recursive type :math:`(\mathsf{rec}~\epsilon)` is valid with :math:`({\maths The recursive type :math:`(\mathsf{rec}~{\mathit{subtype}}_1~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{(x, i)})` if: - * The sub type :math:`{\mathit{subtype}}_1` is valid with :math:`({\mathsf{ok}}{(x, i)})`. + * The sub type :math:`{\mathit{subtype}}_1` is valid with :math:`({\mathsf{ok}}{(x, i)})`. - * The recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{(x + 1, i + 1)})`. + * The recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{(x + 1, i + 1)})`. @@ -13601,24 +13601,24 @@ The recursive type :math:`(\mathsf{rec}~{\mathit{subtype}}_1~{{\mathit{subtype}} The recursive type :math:`(\mathsf{rec}~{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast})` is valid with :math:`({\mathsf{ok}}{x})` if: - * Either: + * Either: - * The sub type sequence :math:`{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The sub type sequence :math:`{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * Or: + * Or: - * The sub type sequence :math:`{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{subtype}}_1~{{\mathit{subtype}}^\ast}`. + * The sub type sequence :math:`{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{subtype}}_1~{{\mathit{subtype}}^\ast}`. - * The sub type :math:`{\mathit{subtype}}_1` is valid with :math:`({\mathsf{ok}}{x})`. + * The sub type :math:`{\mathit{subtype}}_1` is valid with :math:`({\mathsf{ok}}{x})`. - * The recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{x + 1})`. - * Or: + * The recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{x + 1})`. + * Or: - * The sub type sequence :math:`{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{subtype}}^\ast}`. + * The sub type sequence :math:`{{\mathit{st}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{subtype}}^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the sub type sequence :math:`{{\mathit{subtype}}^\ast}` prepended to the field :math:`\mathsf{recs}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the sub type sequence :math:`{{\mathit{subtype}}^\ast}` prepended to the field :math:`\mathsf{recs}`. - * Under the context :math:`{C'}`, the recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{(x, 0)})`. + * Under the context :math:`{C'}`, the recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{(x, 0)})`. @@ -13631,9 +13631,9 @@ The recursive type :math:`(\mathsf{rec}~\epsilon)` is valid with :math:`({\maths The recursive type :math:`(\mathsf{rec}~{\mathit{subtype}}_1~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{x})` if: - * The sub type :math:`{\mathit{subtype}}_1` is valid with :math:`({\mathsf{ok}}{x})`. + * The sub type :math:`{\mathit{subtype}}_1` is valid with :math:`({\mathsf{ok}}{x})`. - * The recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{x + 1})`. + * The recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{x + 1})`. @@ -13641,9 +13641,9 @@ The recursive type :math:`(\mathsf{rec}~{\mathit{subtype}}_1~{{\mathit{subtype}} The recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{x})` if: - * Let :math:`{C'}` be the same context as :math:`C`, but with the sub type sequence :math:`{{\mathit{subtype}}^\ast}` prepended to the field :math:`\mathsf{recs}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the sub type sequence :math:`{{\mathit{subtype}}^\ast}` prepended to the field :math:`\mathsf{recs}`. - * Under the context :math:`{C'}`, the recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{(x, 0)})`. + * Under the context :math:`{C'}`, the recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid with :math:`({\mathsf{ok}}{(x, 0)})`. @@ -13651,11 +13651,11 @@ The recursive type :math:`(\mathsf{rec}~{{\mathit{subtype}}^\ast})` is valid wit The defined type :math:`({\mathit{rectype}} {.} i)` is valid if: - * The recursive type :math:`{\mathit{rectype}}` is valid with :math:`({\mathsf{ok}}{x})`. + * The recursive type :math:`{\mathit{rectype}}` is valid with :math:`({\mathsf{ok}}{x})`. - * The recursive type :math:`{\mathit{rectype}}` is equal to :math:`(\mathsf{rec}~{{\mathit{subtype}}^{n}})`. + * The recursive type :math:`{\mathit{rectype}}` is equal to :math:`(\mathsf{rec}~{{\mathit{subtype}}^{n}})`. - * :math:`i` is less than :math:`n`. + * :math:`i` is less than :math:`n`. @@ -13663,9 +13663,9 @@ The defined type :math:`({\mathit{rectype}} {.} i)` is valid if: The limits :math:`({}[~n~..~m~])` is valid with :math:`k` if: - * :math:`n` is less than or equal to :math:`m`. + * :math:`n` is less than or equal to :math:`m`. - * :math:`m` is less than or equal to :math:`k`. + * :math:`m` is less than or equal to :math:`k`. @@ -13673,7 +13673,7 @@ The limits :math:`({}[~n~..~m~])` is valid with :math:`k` if: The global type :math:`({\mathsf{mut}^?}~t)` is valid if: - * The value type :math:`t` is valid. + * The value type :math:`t` is valid. @@ -13681,9 +13681,9 @@ The global type :math:`({\mathsf{mut}^?}~t)` is valid if: The table type :math:`({\mathit{addrtype}}~{\mathit{limits}}~{\mathit{reftype}})` is valid if: - * The limits :math:`{\mathit{limits}}` is valid with :math:`{2^{32}} - 1`. + * The limits :math:`{\mathit{limits}}` is valid with :math:`{2^{32}} - 1`. - * The reference type :math:`{\mathit{reftype}}` is valid. + * The reference type :math:`{\mathit{reftype}}` is valid. @@ -13691,7 +13691,7 @@ The table type :math:`({\mathit{addrtype}}~{\mathit{limits}}~{\mathit{reftype}}) The memory type :math:`({\mathit{addrtype}}~{\mathit{limits}}~\mathsf{page})` is valid if: - * The limits :math:`{\mathit{limits}}` is valid with :math:`{2^{16}}`. + * The limits :math:`{\mathit{limits}}` is valid with :math:`{2^{16}}`. @@ -13699,9 +13699,9 @@ The memory type :math:`({\mathit{addrtype}}~{\mathit{limits}}~\mathsf{page})` is The tag type :math:`{\mathit{deftype}}` is valid if: - * The tag type :math:`{\mathit{deftype}}` is valid. + * The tag type :math:`{\mathit{deftype}}` is valid. - * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. + * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. @@ -13709,34 +13709,34 @@ The tag type :math:`{\mathit{deftype}}` is valid if: The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid if: - * Either: + * Either: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{deftype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{deftype}})`. - * The defined type :math:`{\mathit{deftype}}` is valid. + * The defined type :math:`{\mathit{deftype}}` is valid. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. - * Or: + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{globaltype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{globaltype}})`. - * The global type :math:`{\mathit{globaltype}}` is valid. - * Or: + * The global type :math:`{\mathit{globaltype}}` is valid. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tabletype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tabletype}})`. - * The table type :math:`{\mathit{tabletype}}` is valid. - * Or: + * The table type :math:`{\mathit{tabletype}}` is valid. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{memtype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{memtype}})`. - * The memory type :math:`{\mathit{memtype}}` is valid. - * Or: + * The memory type :math:`{\mathit{memtype}}` is valid. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{tag}~{\mathit{tagtype}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{tag}~{\mathit{tagtype}})`. - * The tag type :math:`{\mathit{tagtype}}` is valid. + * The tag type :math:`{\mathit{tagtype}}` is valid. @@ -13744,9 +13744,9 @@ The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` The external type :math:`(\mathsf{func}~{\mathit{deftype}})` is valid if: - * The defined type :math:`{\mathit{deftype}}` is valid. + * The defined type :math:`{\mathit{deftype}}` is valid. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`{\mathit{deftype}}` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. @@ -13754,7 +13754,7 @@ The external type :math:`(\mathsf{func}~{\mathit{deftype}})` is valid if: The external type :math:`(\mathsf{global}~{\mathit{globaltype}})` is valid if: - * The global type :math:`{\mathit{globaltype}}` is valid. + * The global type :math:`{\mathit{globaltype}}` is valid. @@ -13762,7 +13762,7 @@ The external type :math:`(\mathsf{global}~{\mathit{globaltype}})` is valid if: The external type :math:`(\mathsf{table}~{\mathit{tabletype}})` is valid if: - * The table type :math:`{\mathit{tabletype}}` is valid. + * The table type :math:`{\mathit{tabletype}}` is valid. @@ -13770,7 +13770,7 @@ The external type :math:`(\mathsf{table}~{\mathit{tabletype}})` is valid if: The external type :math:`(\mathsf{mem}~{\mathit{memtype}})` is valid if: - * The memory type :math:`{\mathit{memtype}}` is valid. + * The memory type :math:`{\mathit{memtype}}` is valid. @@ -13778,7 +13778,7 @@ The external type :math:`(\mathsf{mem}~{\mathit{memtype}})` is valid if: The external type :math:`(\mathsf{tag}~{\mathit{tagtype}})` is valid if: - * The tag type :math:`{\mathit{tagtype}}` is valid. + * The tag type :math:`{\mathit{tagtype}}` is valid. @@ -13786,21 +13786,21 @@ The external type :math:`(\mathsf{tag}~{\mathit{tagtype}})` is valid if: The instruction type :math:`{t_{11}^\ast}~{\rightarrow}_{{x_1^\ast}}\,{t_{12}^\ast}` matches the instruction type :math:`{t_{21}^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_{22}^\ast}` if: - * The value type sequence :math:`{t_{21}^\ast}` matches the value type sequence :math:`{t_{11}^\ast}`. + * The value type sequence :math:`{t_{21}^\ast}` matches the value type sequence :math:`{t_{11}^\ast}`. - * The value type sequence :math:`{t_{12}^\ast}` matches the value type sequence :math:`{t_{22}^\ast}`. + * The value type sequence :math:`{t_{12}^\ast}` matches the value type sequence :math:`{t_{22}^\ast}`. - * The local index sequence :math:`{x^\ast}` is equal to :math:`{x_2^\ast} \setminus {x_1^\ast}`. + * The local index sequence :math:`{x^\ast}` is equal to :math:`{x_2^\ast} \setminus {x_1^\ast}`. - * :math:`{|{\mathit{x*}}|}` is equal to :math:`{|{\mathit{t*}}|}`. + * :math:`{|{\mathit{x*}}|}` is equal to :math:`{|{\mathit{t*}}|}`. - * For all :math:`x` in :math:`{x^\ast}`: + * For all :math:`x` in :math:`{x^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. - * For all :math:`t` in :math:`{t^\ast}` and :math:`x` in :math:`{x^\ast}`: + * For all :math:`t` in :math:`{t^\ast}` and :math:`x` in :math:`{x^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`(\mathsf{set}~t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`(\mathsf{set}~t)`. @@ -13808,9 +13808,9 @@ The instruction type :math:`{t_{11}^\ast}~{\rightarrow}_{{x_1^\ast}}\,{t_{12}^\a The limits :math:`({}[~n_1~..~m_1~])` matches the limits :math:`({}[~n_2~..~m_2~])` if: - * :math:`n_1` is greater than or equal to :math:`n_2`. + * :math:`n_1` is greater than or equal to :math:`n_2`. - * :math:`m_1` is less than or equal to :math:`m_2`. + * :math:`m_1` is less than or equal to :math:`m_2`. @@ -13818,21 +13818,21 @@ The limits :math:`({}[~n_1~..~m_1~])` matches the limits :math:`({}[~n_2~..~m_2~ The global type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~{\mathit{valtype}}_1)` matches the global type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}~{\mathit{valtype}}_2)` if: - * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. + * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. - * Either: + * Either: - * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is absent. + * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is absent. - * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is absent. + * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is absent. - * Or: + * Or: - * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{mut}`. + * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{mut}`. - * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{mut}`. + * :math:`{{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`\mathsf{mut}`. - * The value type :math:`{\mathit{valtype}}_2` matches the value type :math:`{\mathit{valtype}}_1`. + * The value type :math:`{\mathit{valtype}}_2` matches the value type :math:`{\mathit{valtype}}_1`. @@ -13840,7 +13840,7 @@ The global type :math:`({{\mathsf{mut}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1} The global type :math:`(\epsilon~{\mathit{valtype}}_1)` matches the global type :math:`(\epsilon~{\mathit{valtype}}_2)` if: - * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. + * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. @@ -13848,9 +13848,9 @@ The global type :math:`(\epsilon~{\mathit{valtype}}_1)` matches the global type The global type :math:`(\mathsf{mut}~{\mathit{valtype}}_1)` matches the global type :math:`(\mathsf{mut}~{\mathit{valtype}}_2)` if: - * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. + * The value type :math:`{\mathit{valtype}}_1` matches the value type :math:`{\mathit{valtype}}_2`. - * The value type :math:`{\mathit{valtype}}_2` matches the value type :math:`{\mathit{valtype}}_1`. + * The value type :math:`{\mathit{valtype}}_2` matches the value type :math:`{\mathit{valtype}}_1`. @@ -13858,11 +13858,11 @@ The global type :math:`(\mathsf{mut}~{\mathit{valtype}}_1)` matches the global t The table type :math:`({\mathit{addrtype}}~{\mathit{limits}}_1~{\mathit{reftype}}_1)` matches the table type :math:`({\mathit{addrtype}}~{\mathit{limits}}_2~{\mathit{reftype}}_2)` if: - * The limits :math:`{\mathit{limits}}_1` matches the limits :math:`{\mathit{limits}}_2`. + * The limits :math:`{\mathit{limits}}_1` matches the limits :math:`{\mathit{limits}}_2`. - * The reference type :math:`{\mathit{reftype}}_1` matches the reference type :math:`{\mathit{reftype}}_2`. + * The reference type :math:`{\mathit{reftype}}_1` matches the reference type :math:`{\mathit{reftype}}_2`. - * The reference type :math:`{\mathit{reftype}}_2` matches the reference type :math:`{\mathit{reftype}}_1`. + * The reference type :math:`{\mathit{reftype}}_2` matches the reference type :math:`{\mathit{reftype}}_1`. @@ -13870,7 +13870,7 @@ The table type :math:`({\mathit{addrtype}}~{\mathit{limits}}_1~{\mathit{reftype} The memory type :math:`({\mathit{addrtype}}~{\mathit{limits}}_1~\mathsf{page})` matches the memory type :math:`({\mathit{addrtype}}~{\mathit{limits}}_2~\mathsf{page})` if: - * The limits :math:`{\mathit{limits}}_1` matches the limits :math:`{\mathit{limits}}_2`. + * The limits :math:`{\mathit{limits}}_1` matches the limits :math:`{\mathit{limits}}_2`. @@ -13878,9 +13878,9 @@ The memory type :math:`({\mathit{addrtype}}~{\mathit{limits}}_1~\mathsf{page})` The tag type :math:`{\mathit{deftype}}_1` matches the tag type :math:`{\mathit{deftype}}_2` if: - * The tag type :math:`{\mathit{deftype}}_1` matches the tag type :math:`{\mathit{deftype}}_2`. + * The tag type :math:`{\mathit{deftype}}_1` matches the tag type :math:`{\mathit{deftype}}_2`. - * The tag type :math:`{\mathit{deftype}}_2` matches the tag type :math:`{\mathit{deftype}}_1`. + * The tag type :math:`{\mathit{deftype}}_2` matches the tag type :math:`{\mathit{deftype}}_1`. @@ -13888,42 +13888,42 @@ The tag type :math:`{\mathit{deftype}}_1` matches the tag type :math:`{\mathit{d The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` matches the external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` if: - * Either: + * Either: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{deftype}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{deftype}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{func}~{\mathit{deftype}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{func}~{\mathit{deftype}}_2)`. - * The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\mathit{deftype}}_2`. + * The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\mathit{deftype}}_2`. - * Or: + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{globaltype}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{globaltype}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{global}~{\mathit{globaltype}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{global}~{\mathit{globaltype}}_2)`. - * The global type :math:`{\mathit{globaltype}}_1` matches the global type :math:`{\mathit{globaltype}}_2`. - * Or: + * The global type :math:`{\mathit{globaltype}}_1` matches the global type :math:`{\mathit{globaltype}}_2`. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tabletype}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tabletype}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{table}~{\mathit{tabletype}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{table}~{\mathit{tabletype}}_2)`. - * The table type :math:`{\mathit{tabletype}}_1` matches the table type :math:`{\mathit{tabletype}}_2`. - * Or: + * The table type :math:`{\mathit{tabletype}}_1` matches the table type :math:`{\mathit{tabletype}}_2`. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{memtype}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{memtype}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{mem}~{\mathit{memtype}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{mem}~{\mathit{memtype}}_2)`. - * The memory type :math:`{\mathit{memtype}}_1` matches the memory type :math:`{\mathit{memtype}}_2`. - * Or: + * The memory type :math:`{\mathit{memtype}}_1` matches the memory type :math:`{\mathit{memtype}}_2`. + * Or: - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{tag}~{\mathit{tagtype}}_1)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{tag}~{\mathit{tagtype}}_1)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{tag}~{\mathit{tagtype}}_2)`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is equal to :math:`(\mathsf{tag}~{\mathit{tagtype}}_2)`. - * The tag type :math:`{\mathit{tagtype}}_1` matches the tag type :math:`{\mathit{tagtype}}_2`. + * The tag type :math:`{\mathit{tagtype}}_1` matches the tag type :math:`{\mathit{tagtype}}_2`. @@ -13931,7 +13931,7 @@ The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` The external type :math:`(\mathsf{func}~{\mathit{deftype}}_1)` matches the external type :math:`(\mathsf{func}~{\mathit{deftype}}_2)` if: - * The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\mathit{deftype}}_2`. + * The defined type :math:`{\mathit{deftype}}_1` matches the defined type :math:`{\mathit{deftype}}_2`. @@ -13939,7 +13939,7 @@ The external type :math:`(\mathsf{func}~{\mathit{deftype}}_1)` matches the exter The external type :math:`(\mathsf{global}~{\mathit{globaltype}}_1)` matches the external type :math:`(\mathsf{global}~{\mathit{globaltype}}_2)` if: - * The global type :math:`{\mathit{globaltype}}_1` matches the global type :math:`{\mathit{globaltype}}_2`. + * The global type :math:`{\mathit{globaltype}}_1` matches the global type :math:`{\mathit{globaltype}}_2`. @@ -13947,7 +13947,7 @@ The external type :math:`(\mathsf{global}~{\mathit{globaltype}}_1)` matches the The external type :math:`(\mathsf{table}~{\mathit{tabletype}}_1)` matches the external type :math:`(\mathsf{table}~{\mathit{tabletype}}_2)` if: - * The table type :math:`{\mathit{tabletype}}_1` matches the table type :math:`{\mathit{tabletype}}_2`. + * The table type :math:`{\mathit{tabletype}}_1` matches the table type :math:`{\mathit{tabletype}}_2`. @@ -13955,7 +13955,7 @@ The external type :math:`(\mathsf{table}~{\mathit{tabletype}}_1)` matches the ex The external type :math:`(\mathsf{mem}~{\mathit{memtype}}_1)` matches the external type :math:`(\mathsf{mem}~{\mathit{memtype}}_2)` if: - * The memory type :math:`{\mathit{memtype}}_1` matches the memory type :math:`{\mathit{memtype}}_2`. + * The memory type :math:`{\mathit{memtype}}_1` matches the memory type :math:`{\mathit{memtype}}_2`. @@ -13963,7 +13963,7 @@ The external type :math:`(\mathsf{mem}~{\mathit{memtype}}_1)` matches the extern The external type :math:`(\mathsf{tag}~{\mathit{tagtype}}_1)` matches the external type :math:`(\mathsf{tag}~{\mathit{tagtype}}_2)` if: - * The tag type :math:`{\mathit{tagtype}}_1` matches the tag type :math:`{\mathit{tagtype}}_2`. + * The tag type :math:`{\mathit{tagtype}}_1` matches the tag type :math:`{\mathit{tagtype}}_2`. @@ -13971,29 +13971,29 @@ The external type :math:`(\mathsf{tag}~{\mathit{tagtype}}_1)` matches the extern The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid with the instruction type :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}~\rightarrow~{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` if: - * Either: + * Either: - * The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{{\mathit{valtype}}^?}`. + * The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{{\mathit{valtype}}^?}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{{\mathit{valtype}}^?}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{{\mathit{valtype}}^?}`. - * If :math:`{\mathit{valtype}}` is defined, then: + * If :math:`{\mathit{valtype}}` is defined, then: - * The value type :math:`{\mathit{valtype}}` is valid. + * The value type :math:`{\mathit{valtype}}` is valid. - * Or: + * Or: - * The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{typeidx}}`. + * The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{typeidx}}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t_1^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t_1^\ast}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t_2^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 2}}}^\ast}` is equal to :math:`{t_2^\ast}`. - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. @@ -14001,9 +14001,9 @@ The block type :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is The block type :math:`{{\mathit{valtype}}^?}` is valid with the instruction type :math:`\epsilon~\rightarrow~{{\mathit{valtype}}^?}` if: - * If :math:`{\mathit{valtype}}` is defined, then: + * If :math:`{\mathit{valtype}}` is defined, then: - * The value type :math:`{\mathit{valtype}}` is valid. + * The value type :math:`{\mathit{valtype}}` is valid. @@ -14011,9 +14011,9 @@ The block type :math:`{{\mathit{valtype}}^?}` is valid with the instruction type The block type :math:`{\mathit{typeidx}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[{\mathit{typeidx}}]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. @@ -14021,37 +14021,37 @@ The block type :math:`{\mathit{typeidx}}` is valid with the instruction type :ma The catch clause :math:`{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * Either: + * Either: - * The catch clause :math:`{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{catch}~x~l)`. + * The catch clause :math:`{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{catch}~x~l)`. - * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. + * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{tags}{}[x]` is the composite type :math:`(\mathsf{func}~{t^\ast}~\rightarrow~\epsilon)`. + * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{tags}{}[x]` is the composite type :math:`(\mathsf{func}~{t^\ast}~\rightarrow~\epsilon)`. - * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. + * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. - * Or: + * Or: - * The catch clause :math:`{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{catch\_ref}~x~l)`. + * The catch clause :math:`{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{catch\_ref}~x~l)`. - * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. + * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{tags}{}[x]` is the composite type :math:`(\mathsf{func}~{t^\ast}~\rightarrow~\epsilon)`. + * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{tags}{}[x]` is the composite type :math:`(\mathsf{func}~{t^\ast}~\rightarrow~\epsilon)`. - * The value type sequence :math:`{t^\ast}~(\mathsf{ref}~\epsilon~\mathsf{exn})` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. - * Or: + * The value type sequence :math:`{t^\ast}~(\mathsf{ref}~\epsilon~\mathsf{exn})` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. + * Or: - * The catch clause :math:`{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{catch\_all}~l)`. + * The catch clause :math:`{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{catch\_all}~l)`. - * The value type sequence :math:`\epsilon` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. - * Or: + * The value type sequence :math:`\epsilon` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. + * Or: - * The catch clause :math:`{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{catch\_all\_ref}~l)`. + * The catch clause :math:`{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{catch\_all\_ref}~l)`. - * The value type sequence :math:`(\mathsf{ref}~\epsilon~\mathsf{exn})` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. + * The value type sequence :math:`(\mathsf{ref}~\epsilon~\mathsf{exn})` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. @@ -14059,13 +14059,13 @@ The catch clause :math:`{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} The catch clause :math:`(\mathsf{catch}~x~l)` is valid if: - * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. + * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{tags}{}[x]` is the composite type :math:`(\mathsf{func}~{t^\ast}~\rightarrow~\epsilon)`. + * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{tags}{}[x]` is the composite type :math:`(\mathsf{func}~{t^\ast}~\rightarrow~\epsilon)`. - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. + * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. @@ -14073,13 +14073,13 @@ The catch clause :math:`(\mathsf{catch}~x~l)` is valid if: The catch clause :math:`(\mathsf{catch\_ref}~x~l)` is valid if: - * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. + * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{tags}{}[x]` is the composite type :math:`(\mathsf{func}~{t^\ast}~\rightarrow~\epsilon)`. + * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{tags}{}[x]` is the composite type :math:`(\mathsf{func}~{t^\ast}~\rightarrow~\epsilon)`. - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The value type sequence :math:`{t^\ast}~(\mathsf{ref}~\epsilon~\mathsf{exn})` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. + * The value type sequence :math:`{t^\ast}~(\mathsf{ref}~\epsilon~\mathsf{exn})` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. @@ -14087,9 +14087,9 @@ The catch clause :math:`(\mathsf{catch\_ref}~x~l)` is valid if: The catch clause :math:`(\mathsf{catch\_all}~l)` is valid if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The value type sequence :math:`\epsilon` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. + * The value type sequence :math:`\epsilon` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. @@ -14097,9 +14097,9 @@ The catch clause :math:`(\mathsf{catch\_all}~l)` is valid if: The catch clause :math:`(\mathsf{catch\_all\_ref}~l)` is valid if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The value type sequence :math:`(\mathsf{ref}~\epsilon~\mathsf{exn})` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. + * The value type sequence :math:`(\mathsf{ref}~\epsilon~\mathsf{exn})` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. @@ -14107,7 +14107,7 @@ The catch clause :math:`(\mathsf{catch\_all\_ref}~l)` is valid if: The value type :math:`t` is defaultable if: - * The value :math:`{{\mathrm{default}}}_{t}` is not absent. + * The value :math:`{{\mathrm{default}}}_{t}` is not absent. @@ -14120,7 +14120,7 @@ The instruction :math:`\mathsf{nop}` is valid with the instruction type :math:`\ The instruction :math:`\mathsf{unreachable}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. + * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. @@ -14128,7 +14128,7 @@ The instruction :math:`\mathsf{unreachable}` is valid with the instruction type The instruction :math:`\mathsf{drop}` is valid with the instruction type :math:`t~\rightarrow~\epsilon` if: - * The value type :math:`t` is valid. + * The value type :math:`t` is valid. @@ -14136,19 +14136,19 @@ The instruction :math:`\mathsf{drop}` is valid with the instruction type :math:` The instruction :math:`(\mathsf{select}~{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?})` is valid with the instruction type :math:`t~t~\mathsf{i{\scriptstyle 32}}~\rightarrow~t` if: - * The value type :math:`t` is valid. + * The value type :math:`t` is valid. - * Either: + * Either: - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`t`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`t`. - * Or: + * Or: - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. - * The value type :math:`t` matches the value type :math:`{t'}`. + * The value type :math:`t` matches the value type :math:`{t'}`. - * The value type :math:`{t'}` is equal to :math:`{\mathit{numtype}}` or :math:`{t'}` is equal to :math:`{\mathit{vectype}}`. + * The value type :math:`{t'}` is equal to :math:`{\mathit{numtype}}` or :math:`{t'}` is equal to :math:`{\mathit{vectype}}`. @@ -14156,11 +14156,11 @@ The instruction :math:`(\mathsf{select}~{t_{\mathit{u{\kern-0.1em\scriptstyle 1} The instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}^\ast})` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The block type :math:`{\mathit{bt}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The block type :math:`{\mathit{bt}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}`. @@ -14168,11 +14168,11 @@ The instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}^\ast})` i The instruction :math:`(\mathsf{loop}~{\mathit{bt}}~{{\mathit{instr}}^\ast})` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The block type :math:`{\mathit{bt}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The block type :math:`{\mathit{bt}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_1^\ast}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_1^\ast}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}`. @@ -14180,13 +14180,13 @@ The instruction :math:`(\mathsf{loop}~{\mathit{bt}}~{{\mathit{instr}}^\ast})` is The instruction :math:`(\mathsf{if}~{\mathit{bt}}~{{\mathit{instr}}_1^\ast}~\mathsf{else}~{{\mathit{instr}}_2^\ast})` is valid with the instruction type :math:`{t_1^\ast}~\mathsf{i{\scriptstyle 32}}~\rightarrow~{t_2^\ast}` if: - * The block type :math:`{\mathit{bt}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The block type :math:`{\mathit{bt}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_1^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x_1^\ast}}\,{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_1^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x_1^\ast}}\,{t_2^\ast}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_2^\ast}`. @@ -14194,11 +14194,11 @@ The instruction :math:`(\mathsf{if}~{\mathit{bt}}~{{\mathit{instr}}_1^\ast}~\mat The instruction :math:`(\mathsf{br}~l)` is valid with the instruction type :math:`{t_1^\ast}~{t^\ast}~\rightarrow~{t_2^\ast}` if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}`. + * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}`. - * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. + * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. @@ -14206,9 +14206,9 @@ The instruction :math:`(\mathsf{br}~l)` is valid with the instruction type :math The instruction :math:`(\mathsf{br\_if}~l)` is valid with the instruction type :math:`{t^\ast}~\mathsf{i{\scriptstyle 32}}~\rightarrow~{t^\ast}` if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}`. + * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}`. @@ -14216,19 +14216,19 @@ The instruction :math:`(\mathsf{br\_if}~l)` is valid with the instruction type : The instruction :math:`(\mathsf{br\_table}~{l^\ast}~{l'})` is valid with the instruction type :math:`{t_1^\ast}~{t^\ast}~\mathsf{i{\scriptstyle 32}}~\rightarrow~{t_2^\ast}` if: - * For all :math:`l` in :math:`{l^\ast}`: + * For all :math:`l` in :math:`{l^\ast}`: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * For all :math:`l` in :math:`{l^\ast}`: + * For all :math:`l` in :math:`{l^\ast}`: - * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. + * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[l]`. - * The result type :math:`C{.}\mathsf{labels}{}[{l'}]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[{l'}]` exists. - * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[{l'}]`. + * The value type sequence :math:`{t^\ast}` matches the result type :math:`C{.}\mathsf{labels}{}[{l'}]`. - * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. + * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. @@ -14236,11 +14236,11 @@ The instruction :math:`(\mathsf{br\_table}~{l^\ast}~{l'})` is valid with the ins The instruction :math:`(\mathsf{br\_on\_null}~l)` is valid with the instruction type :math:`{t^\ast}~(\mathsf{ref}~\mathsf{null}~{\mathit{ht}})~\rightarrow~{t^\ast}~(\mathsf{ref}~\epsilon~{\mathit{ht}})` if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}`. + * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}`. - * The heap type :math:`{\mathit{ht}}` is valid. + * The heap type :math:`{\mathit{ht}}` is valid. @@ -14248,9 +14248,9 @@ The instruction :math:`(\mathsf{br\_on\_null}~l)` is valid with the instruction The instruction :math:`(\mathsf{br\_on\_non\_null}~l)` is valid with the instruction type :math:`{t^\ast}~(\mathsf{ref}~\mathsf{null}~{\mathit{ht}})~\rightarrow~{t^\ast}` if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}~(\mathsf{ref}~\epsilon~{\mathit{ht}})`. + * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}~(\mathsf{ref}~\epsilon~{\mathit{ht}})`. @@ -14258,19 +14258,19 @@ The instruction :math:`(\mathsf{br\_on\_non\_null}~l)` is valid with the instruc The instruction :math:`(\mathsf{br\_on\_cast}~l~{\mathit{rt}}_1~{\mathit{rt}}_2)` is valid with the instruction type :math:`{t^\ast}~{\mathit{rt}}_1~\rightarrow~{t^\ast}~{t'}` if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}~{\mathit{rt}}`. + * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}~{\mathit{rt}}`. - * The reference type :math:`{\mathit{rt}}_1` is valid. + * The reference type :math:`{\mathit{rt}}_1` is valid. - * The reference type :math:`{\mathit{rt}}_2` is valid. + * The reference type :math:`{\mathit{rt}}_2` is valid. - * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}_1`. + * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}_1`. - * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}`. + * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}`. - * Let :math:`{t'}` be the reference type :math:`{\mathit{rt}}_1 \setminus {\mathit{rt}}_2`. + * Let :math:`{t'}` be the reference type :math:`{\mathit{rt}}_1 \setminus {\mathit{rt}}_2`. @@ -14278,17 +14278,17 @@ The instruction :math:`(\mathsf{br\_on\_cast}~l~{\mathit{rt}}_1~{\mathit{rt}}_2) The instruction :math:`(\mathsf{br\_on\_cast\_fail}~l~{\mathit{rt}}_1~{\mathit{rt}}_2)` is valid with the instruction type :math:`{t^\ast}~{\mathit{rt}}_1~\rightarrow~{t^\ast}~{\mathit{rt}}_2` if: - * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. + * The result type :math:`C{.}\mathsf{labels}{}[l]` exists. - * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}~{\mathit{rt}}`. + * The result type :math:`C{.}\mathsf{labels}{}[l]` is equal to :math:`{t^\ast}~{\mathit{rt}}`. - * The reference type :math:`{\mathit{rt}}_1` is valid. + * The reference type :math:`{\mathit{rt}}_1` is valid. - * The reference type :math:`{\mathit{rt}}_2` is valid. + * The reference type :math:`{\mathit{rt}}_2` is valid. - * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}_1`. + * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}_1`. - * The reference type :math:`{\mathit{rt}}_1 \setminus {\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}`. + * The reference type :math:`{\mathit{rt}}_1 \setminus {\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}`. @@ -14296,9 +14296,9 @@ The instruction :math:`(\mathsf{br\_on\_cast\_fail}~l~{\mathit{rt}}_1~{\mathit{r The instruction :math:`(\mathsf{call}~x)` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{funcs}{}[x]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{funcs}{}[x]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. @@ -14306,9 +14306,9 @@ The instruction :math:`(\mathsf{call}~x)` is valid with the instruction type :ma The instruction :math:`(\mathsf{call\_ref}~x)` is valid with the instruction type :math:`{t_1^\ast}~(\mathsf{ref}~\mathsf{null}~x)~\rightarrow~{t_2^\ast}` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. @@ -14316,15 +14316,15 @@ The instruction :math:`(\mathsf{call\_ref}~x)` is valid with the instruction typ The instruction :math:`(\mathsf{call\_indirect}~x~y)` is valid with the instruction type :math:`{t_1^\ast}~{\mathit{at}}~\rightarrow~{t_2^\ast}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. - * The reference type :math:`{\mathit{rt}}` matches the reference type :math:`(\mathsf{ref}~\mathsf{null}~\mathsf{func})`. + * The reference type :math:`{\mathit{rt}}` matches the reference type :math:`(\mathsf{ref}~\mathsf{null}~\mathsf{func})`. - * The defined type :math:`C{.}\mathsf{types}{}[y]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[y]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[y]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[y]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. @@ -14332,9 +14332,9 @@ The instruction :math:`(\mathsf{call\_indirect}~x~y)` is valid with the instruct The instruction :math:`\mathsf{return}` is valid with the instruction type :math:`{t_1^\ast}~{t^\ast}~\rightarrow~{t_2^\ast}` if: - * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{t^\ast}`. + * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{t^\ast}`. - * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. + * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. @@ -14342,15 +14342,15 @@ The instruction :math:`\mathsf{return}` is valid with the instruction type :math The instruction :math:`(\mathsf{return\_call}~x)` is valid with the instruction type :math:`{t_3^\ast}~{t_1^\ast}~\rightarrow~{t_4^\ast}` if: - * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{funcs}{}[x]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{funcs}{}[x]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. - * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{{t'}_2^\ast}`. + * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{{t'}_2^\ast}`. - * The value type sequence :math:`{t_2^\ast}` matches the value type sequence :math:`{{t'}_2^\ast}`. + * The value type sequence :math:`{t_2^\ast}` matches the value type sequence :math:`{{t'}_2^\ast}`. - * The instruction type :math:`{t_3^\ast}~\rightarrow~{t_4^\ast}` is valid. + * The instruction type :math:`{t_3^\ast}~\rightarrow~{t_4^\ast}` is valid. @@ -14358,15 +14358,15 @@ The instruction :math:`(\mathsf{return\_call}~x)` is valid with the instruction The instruction :math:`(\mathsf{return\_call\_ref}~x)` is valid with the instruction type :math:`{t_3^\ast}~{t_1^\ast}~(\mathsf{ref}~\mathsf{null}~x)~\rightarrow~{t_4^\ast}` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. - * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{{t'}_2^\ast}`. + * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{{t'}_2^\ast}`. - * The value type sequence :math:`{t_2^\ast}` matches the value type sequence :math:`{{t'}_2^\ast}`. + * The value type sequence :math:`{t_2^\ast}` matches the value type sequence :math:`{{t'}_2^\ast}`. - * The instruction type :math:`{t_3^\ast}~\rightarrow~{t_4^\ast}` is valid. + * The instruction type :math:`{t_3^\ast}~\rightarrow~{t_4^\ast}` is valid. @@ -14374,21 +14374,21 @@ The instruction :math:`(\mathsf{return\_call\_ref}~x)` is valid with the instruc The instruction :math:`(\mathsf{return\_call\_indirect}~x~y)` is valid with the instruction type :math:`{t_3^\ast}~{t_1^\ast}~{\mathit{at}}~\rightarrow~{t_4^\ast}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. - * The reference type :math:`{\mathit{rt}}` matches the reference type :math:`(\mathsf{ref}~\mathsf{null}~\mathsf{func})`. + * The reference type :math:`{\mathit{rt}}` matches the reference type :math:`(\mathsf{ref}~\mathsf{null}~\mathsf{func})`. - * The defined type :math:`C{.}\mathsf{types}{}[y]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[y]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[y]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[y]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. - * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{{t'}_2^\ast}`. + * The result type :math:`C{.}\mathsf{return}` is equal to :math:`{{t'}_2^\ast}`. - * The value type sequence :math:`{t_2^\ast}` matches the value type sequence :math:`{{t'}_2^\ast}`. + * The value type sequence :math:`{t_2^\ast}` matches the value type sequence :math:`{{t'}_2^\ast}`. - * The instruction type :math:`{t_3^\ast}~\rightarrow~{t_4^\ast}` is valid. + * The instruction type :math:`{t_3^\ast}~\rightarrow~{t_4^\ast}` is valid. @@ -14396,11 +14396,11 @@ The instruction :math:`(\mathsf{return\_call\_indirect}~x~y)` is valid with the The instruction :math:`(\mathsf{throw}~x)` is valid with the instruction type :math:`{t_1^\ast}~{t^\ast}~\rightarrow~{t_2^\ast}` if: - * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. + * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{tags}{}[x]` is the composite type :math:`(\mathsf{func}~{t^\ast}~\rightarrow~\epsilon)`. + * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{tags}{}[x]` is the composite type :math:`(\mathsf{func}~{t^\ast}~\rightarrow~\epsilon)`. - * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. + * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. @@ -14408,7 +14408,7 @@ The instruction :math:`(\mathsf{throw}~x)` is valid with the instruction type :m The instruction :math:`\mathsf{throw\_ref}` is valid with the instruction type :math:`{t_1^\ast}~(\mathsf{ref}~\mathsf{null}~\mathsf{exn})~\rightarrow~{t_2^\ast}` if: - * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. + * The instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` is valid. @@ -14416,15 +14416,15 @@ The instruction :math:`\mathsf{throw\_ref}` is valid with the instruction type : The instruction :math:`(\mathsf{try\_table}~{\mathit{bt}}~{{\mathit{catch}}^\ast}~{{\mathit{instr}}^\ast})` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The block type :math:`{\mathit{bt}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The block type :math:`{\mathit{bt}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}`. - * For all :math:`{\mathit{catch}}` in :math:`{{\mathit{catch}}^\ast}`: + * For all :math:`{\mathit{catch}}` in :math:`{{\mathit{catch}}^\ast}`: - * The catch clause :math:`{\mathit{catch}}` is valid. + * The catch clause :math:`{\mathit{catch}}` is valid. @@ -14462,7 +14462,7 @@ The instruction :math:`({\mathit{nt}}_1 {.} {{\mathit{cvtop}}}{\mathsf{\_}}{{\ma The instruction :math:`(\mathsf{ref{.}null}~{\mathit{ht}})` is valid with the instruction type :math:`\epsilon~\rightarrow~(\mathsf{ref}~\mathsf{null}~{\mathit{ht}})` if: - * The heap type :math:`{\mathit{ht}}` is valid. + * The heap type :math:`{\mathit{ht}}` is valid. @@ -14470,13 +14470,13 @@ The instruction :math:`(\mathsf{ref{.}null}~{\mathit{ht}})` is valid with the in The instruction :math:`(\mathsf{ref{.}func}~x)` is valid with the instruction type :math:`\epsilon~\rightarrow~(\mathsf{ref}~\epsilon~{\mathit{dt}})` if: - * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The defined type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{dt}}`. + * The defined type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{dt}}`. - * The index :math:`C{.}\mathsf{refs}{}[0]` exists. + * The index :math:`C{.}\mathsf{refs}{}[0]` exists. - * :math:`x` is contained in :math:`C{.}\mathsf{refs}`. + * :math:`x` is contained in :math:`C{.}\mathsf{refs}`. @@ -14489,7 +14489,7 @@ The instruction :math:`\mathsf{ref{.}i{\scriptstyle 31}}` is valid with the inst The instruction :math:`\mathsf{ref{.}is\_null}` is valid with the instruction type :math:`(\mathsf{ref}~\mathsf{null}~{\mathit{ht}})~\rightarrow~\mathsf{i{\scriptstyle 32}}` if: - * The heap type :math:`{\mathit{ht}}` is valid. + * The heap type :math:`{\mathit{ht}}` is valid. @@ -14497,7 +14497,7 @@ The instruction :math:`\mathsf{ref{.}is\_null}` is valid with the instruction ty The instruction :math:`\mathsf{ref{.}as\_non\_null}` is valid with the instruction type :math:`(\mathsf{ref}~\mathsf{null}~{\mathit{ht}})~\rightarrow~(\mathsf{ref}~\epsilon~{\mathit{ht}})` if: - * The heap type :math:`{\mathit{ht}}` is valid. + * The heap type :math:`{\mathit{ht}}` is valid. @@ -14510,11 +14510,11 @@ The instruction :math:`\mathsf{ref{.}eq}` is valid with the instruction type :ma The instruction :math:`(\mathsf{ref{.}test}~{\mathit{rt}})` is valid with the instruction type :math:`{\mathit{rt}'}~\rightarrow~\mathsf{i{\scriptstyle 32}}` if: - * The reference type :math:`{\mathit{rt}}` is valid. + * The reference type :math:`{\mathit{rt}}` is valid. - * The reference type :math:`{\mathit{rt}'}` is valid. + * The reference type :math:`{\mathit{rt}'}` is valid. - * The reference type :math:`{\mathit{rt}}` matches the reference type :math:`{\mathit{rt}'}`. + * The reference type :math:`{\mathit{rt}}` matches the reference type :math:`{\mathit{rt}'}`. @@ -14522,11 +14522,11 @@ The instruction :math:`(\mathsf{ref{.}test}~{\mathit{rt}})` is valid with the in The instruction :math:`(\mathsf{ref{.}cast}~{\mathit{rt}})` is valid with the instruction type :math:`{\mathit{rt}'}~\rightarrow~{\mathit{rt}}` if: - * The reference type :math:`{\mathit{rt}}` is valid. + * The reference type :math:`{\mathit{rt}}` is valid. - * The reference type :math:`{\mathit{rt}'}` is valid. + * The reference type :math:`{\mathit{rt}'}` is valid. - * The reference type :math:`{\mathit{rt}}` matches the reference type :math:`{\mathit{rt}'}`. + * The reference type :math:`{\mathit{rt}}` matches the reference type :math:`{\mathit{rt}'}`. @@ -14539,11 +14539,11 @@ The instruction :math:`({\mathsf{i{\scriptstyle 31}{.}get}}{\mathsf{\_}}{{\mathi The instruction :math:`(\mathsf{struct{.}new}~x)` is valid with the instruction type :math:`{t^\ast}~\rightarrow~(\mathsf{ref}~\epsilon~x)` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{({\mathsf{mut}^?}~{\mathit{zt}})^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{({\mathsf{mut}^?}~{\mathit{zt}})^\ast})`. - * Let :math:`{t^\ast}` be the value type sequence :math:`{{\mathrm{unpack}}({\mathit{zt}})^\ast}`. + * Let :math:`{t^\ast}` be the value type sequence :math:`{{\mathrm{unpack}}({\mathit{zt}})^\ast}`. @@ -14551,13 +14551,13 @@ The instruction :math:`(\mathsf{struct{.}new}~x)` is valid with the instruction The instruction :math:`(\mathsf{struct{.}new\_default}~x)` is valid with the instruction type :math:`\epsilon~\rightarrow~(\mathsf{ref}~\epsilon~x)` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{({\mathsf{mut}^?}~{\mathit{zt}})^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{({\mathsf{mut}^?}~{\mathit{zt}})^\ast})`. - * For all :math:`{\mathit{zt}}` in :math:`{{\mathit{zt}}^\ast}`: + * For all :math:`{\mathit{zt}}` in :math:`{{\mathit{zt}}^\ast}`: - * A :ref:`default value <default-val>` for value type the value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is defined. + * A :ref:`default value <default-val>` for value type the value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is defined. @@ -14565,17 +14565,17 @@ The instruction :math:`(\mathsf{struct{.}new\_default}~x)` is valid with the ins The instruction :math:`({\mathsf{struct{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~x~i)` is valid with the instruction type :math:`(\mathsf{ref}~\mathsf{null}~x)~\rightarrow~t` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{{\mathit{yt}}^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{{\mathit{yt}}^\ast})`. - * :math:`{|{{\mathit{yt}}^\ast}|}` is greater than :math:`i`. + * :math:`{|{{\mathit{yt}}^\ast}|}` is greater than :math:`i`. - * The field type :math:`{{\mathit{yt}}^\ast}{}[i]` is equal to :math:`({\mathsf{mut}^?}~{\mathit{zt}})`. + * The field type :math:`{{\mathit{yt}}^\ast}{}[i]` is equal to :math:`({\mathsf{mut}^?}~{\mathit{zt}})`. - * The signedness :math:`{{\mathit{sx}}^?}` is absent if and only if the storage type :math:`{\mathit{zt}}` is equal to :math:`{\mathrm{unpack}}({\mathit{zt}})`. + * The signedness :math:`{{\mathit{sx}}^?}` is absent if and only if the storage type :math:`{\mathit{zt}}` is equal to :math:`{\mathrm{unpack}}({\mathit{zt}})`. - * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. + * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14583,15 +14583,15 @@ The instruction :math:`({\mathsf{struct{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~ The instruction :math:`(\mathsf{struct{.}set}~x~i)` is valid with the instruction type :math:`(\mathsf{ref}~\mathsf{null}~x)~t~\rightarrow~\epsilon` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{{\mathit{yt}}^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{struct}~{{\mathit{yt}}^\ast})`. - * :math:`{|{{\mathit{yt}}^\ast}|}` is greater than :math:`i`. + * :math:`{|{{\mathit{yt}}^\ast}|}` is greater than :math:`i`. - * The field type :math:`{{\mathit{yt}}^\ast}{}[i]` is equal to :math:`(\mathsf{mut}~{\mathit{zt}})`. + * The field type :math:`{{\mathit{yt}}^\ast}{}[i]` is equal to :math:`(\mathsf{mut}~{\mathit{zt}})`. - * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. + * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14599,11 +14599,11 @@ The instruction :math:`(\mathsf{struct{.}set}~x~i)` is valid with the instructio The instruction :math:`(\mathsf{array{.}new}~x)` is valid with the instruction type :math:`t~\mathsf{i{\scriptstyle 32}}~\rightarrow~(\mathsf{ref}~\epsilon~x)` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. - * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. + * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14611,11 +14611,11 @@ The instruction :math:`(\mathsf{array{.}new}~x)` is valid with the instruction t The instruction :math:`(\mathsf{array{.}new\_default}~x)` is valid with the instruction type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~(\mathsf{ref}~\epsilon~x)` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. - * A :ref:`default value <default-val>` for value type the value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is defined. + * A :ref:`default value <default-val>` for value type the value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is defined. @@ -14623,11 +14623,11 @@ The instruction :math:`(\mathsf{array{.}new\_default}~x)` is valid with the inst The instruction :math:`(\mathsf{array{.}new\_fixed}~x~n)` is valid with the instruction type :math:`{t^{n}}~\rightarrow~(\mathsf{ref}~\epsilon~x)` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. - * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. + * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14635,13 +14635,13 @@ The instruction :math:`(\mathsf{array{.}new\_fixed}~x~n)` is valid with the inst The instruction :math:`(\mathsf{array{.}new\_elem}~x~y)` is valid with the instruction type :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~(\mathsf{ref}~\epsilon~x)` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{rt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{rt}}))`. - * The element type :math:`C{.}\mathsf{elems}{}[y]` exists. + * The element type :math:`C{.}\mathsf{elems}{}[y]` exists. - * The element type :math:`C{.}\mathsf{elems}{}[y]` matches the reference type :math:`{\mathit{rt}}`. + * The element type :math:`C{.}\mathsf{elems}{}[y]` matches the reference type :math:`{\mathit{rt}}`. @@ -14649,15 +14649,15 @@ The instruction :math:`(\mathsf{array{.}new\_elem}~x~y)` is valid with the instr The instruction :math:`(\mathsf{array{.}new\_data}~x~y)` is valid with the instruction type :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~(\mathsf{ref}~\epsilon~x)` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. - * The value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{numtype}}` or :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{vectype}}`. + * The value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{numtype}}` or :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{vectype}}`. - * The data type :math:`C{.}\mathsf{datas}{}[y]` exists. + * The data type :math:`C{.}\mathsf{datas}{}[y]` exists. - * The data type :math:`C{.}\mathsf{datas}{}[y]` is equal to :math:`\mathsf{ok}`. + * The data type :math:`C{.}\mathsf{datas}{}[y]` is equal to :math:`\mathsf{ok}`. @@ -14665,13 +14665,13 @@ The instruction :math:`(\mathsf{array{.}new\_data}~x~y)` is valid with the instr The instruction :math:`({\mathsf{array{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~x)` is valid with the instruction type :math:`(\mathsf{ref}~\mathsf{null}~x)~\mathsf{i{\scriptstyle 32}}~\rightarrow~t` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}))`. - * The signedness :math:`{{\mathit{sx}}^?}` is absent if and only if the storage type :math:`{\mathit{zt}}` is equal to :math:`{\mathrm{unpack}}({\mathit{zt}})`. + * The signedness :math:`{{\mathit{sx}}^?}` is absent if and only if the storage type :math:`{\mathit{zt}}` is equal to :math:`{\mathrm{unpack}}({\mathit{zt}})`. - * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. + * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14679,11 +14679,11 @@ The instruction :math:`({\mathsf{array{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~x The instruction :math:`(\mathsf{array{.}set}~x)` is valid with the instruction type :math:`(\mathsf{ref}~\mathsf{null}~x)~\mathsf{i{\scriptstyle 32}}~t~\rightarrow~\epsilon` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. - * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. + * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14696,11 +14696,11 @@ The instruction :math:`\mathsf{array{.}len}` is valid with the instruction type The instruction :math:`(\mathsf{array{.}fill}~x)` is valid with the instruction type :math:`(\mathsf{ref}~\mathsf{null}~x)~\mathsf{i{\scriptstyle 32}}~t~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. - * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. + * Let :math:`t` be the value type :math:`{\mathrm{unpack}}({\mathit{zt}})`. @@ -14708,15 +14708,15 @@ The instruction :math:`(\mathsf{array{.}fill}~x)` is valid with the instruction The instruction :math:`(\mathsf{array{.}copy}~x_1~x_2)` is valid with the instruction type :math:`(\mathsf{ref}~\mathsf{null}~x_1)~\mathsf{i{\scriptstyle 32}}~(\mathsf{ref}~\mathsf{null}~x_2)~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The defined type :math:`C{.}\mathsf{types}{}[x_1]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x_1]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x_1]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}_1))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x_1]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}_1))`. - * The defined type :math:`C{.}\mathsf{types}{}[x_2]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x_2]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x_2]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}_2))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x_2]` is the composite type :math:`(\mathsf{array}~({\mathsf{mut}^?}~{\mathit{zt}}_2))`. - * The storage type :math:`{\mathit{zt}}_2` matches the storage type :math:`{\mathit{zt}}_1`. + * The storage type :math:`{\mathit{zt}}_2` matches the storage type :math:`{\mathit{zt}}_1`. @@ -14724,13 +14724,13 @@ The instruction :math:`(\mathsf{array{.}copy}~x_1~x_2)` is valid with the instru The instruction :math:`(\mathsf{array{.}init\_elem}~x~y)` is valid with the instruction type :math:`(\mathsf{ref}~\mathsf{null}~x)~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. - * The element type :math:`C{.}\mathsf{elems}{}[y]` exists. + * The element type :math:`C{.}\mathsf{elems}{}[y]` exists. - * The element type :math:`C{.}\mathsf{elems}{}[y]` matches the storage type :math:`{\mathit{zt}}`. + * The element type :math:`C{.}\mathsf{elems}{}[y]` matches the storage type :math:`{\mathit{zt}}`. @@ -14738,15 +14738,15 @@ The instruction :math:`(\mathsf{array{.}init\_elem}~x~y)` is valid with the inst The instruction :math:`(\mathsf{array{.}init\_data}~x~y)` is valid with the instruction type :math:`(\mathsf{ref}~\mathsf{null}~x)~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{array}~(\mathsf{mut}~{\mathit{zt}}))`. - * The value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{numtype}}` or :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{vectype}}`. + * The value type :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{numtype}}` or :math:`{\mathrm{unpack}}({\mathit{zt}})` is equal to :math:`{\mathit{vectype}}`. - * The data type :math:`C{.}\mathsf{datas}{}[y]` exists. + * The data type :math:`C{.}\mathsf{datas}{}[y]` exists. - * The data type :math:`C{.}\mathsf{datas}{}[y]` is equal to :math:`\mathsf{ok}`. + * The data type :math:`C{.}\mathsf{datas}{}[y]` is equal to :math:`\mathsf{ok}`. @@ -14754,7 +14754,7 @@ The instruction :math:`(\mathsf{array{.}init\_data}~x~y)` is valid with the inst The instruction :math:`\mathsf{extern{.}convert\_any}` is valid with the instruction type :math:`(\mathsf{ref}~{\mathsf{null}}{{{}_{1}^?}}~\mathsf{any})~\rightarrow~(\mathsf{ref}~{\mathsf{null}}{{{}_{2}^?}}~\mathsf{extern})` if: - * :math:`{\mathsf{null}}{{{}_{1}^?}}` is equal to :math:`{\mathsf{null}}{{{}_{2}^?}}`. + * :math:`{\mathsf{null}}{{{}_{1}^?}}` is equal to :math:`{\mathsf{null}}{{{}_{2}^?}}`. @@ -14762,7 +14762,7 @@ The instruction :math:`\mathsf{extern{.}convert\_any}` is valid with the instruc The instruction :math:`\mathsf{any{.}convert\_extern}` is valid with the instruction type :math:`(\mathsf{ref}~{\mathsf{null}}{{{}_{1}^?}}~\mathsf{extern})~\rightarrow~(\mathsf{ref}~{\mathsf{null}}{{{}_{2}^?}}~\mathsf{any})` if: - * :math:`{\mathsf{null}}{{{}_{1}^?}}` is equal to :math:`{\mathsf{null}}{{{}_{2}^?}}`. + * :math:`{\mathsf{null}}{{{}_{1}^?}}` is equal to :math:`{\mathsf{null}}{{{}_{2}^?}}`. @@ -14835,9 +14835,9 @@ The instruction :math:`({\mathit{sh}} {.} {\mathit{vswizzlop}})` is valid with t The instruction :math:`({\mathit{sh}}{.}\mathsf{shuffle}~{i^\ast})` is valid with the instruction type :math:`\mathsf{v{\scriptstyle 128}}~\mathsf{v{\scriptstyle 128}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * For all :math:`i` in :math:`{i^\ast}`: + * For all :math:`i` in :math:`{i^\ast}`: - * The lane index :math:`i` is less than :math:`2 \cdot {\mathrm{dim}}({\mathit{sh}})`. + * The lane index :math:`i` is less than :math:`2 \cdot {\mathrm{dim}}({\mathit{sh}})`. @@ -14845,7 +14845,7 @@ The instruction :math:`({\mathit{sh}}{.}\mathsf{shuffle}~{i^\ast})` is valid wit The instruction :math:`({\mathit{sh}}{.}\mathsf{splat})` is valid with the instruction type :math:`t~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. + * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. @@ -14853,9 +14853,9 @@ The instruction :math:`({\mathit{sh}}{.}\mathsf{splat})` is valid with the instr The instruction :math:`({{\mathit{sh}}{.}\mathsf{extract\_lane}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~i)` is valid with the instruction type :math:`\mathsf{v{\scriptstyle 128}}~\rightarrow~t` if: - * The lane index :math:`i` is less than :math:`{\mathrm{dim}}({\mathit{sh}})`. + * The lane index :math:`i` is less than :math:`{\mathrm{dim}}({\mathit{sh}})`. - * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. + * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. @@ -14863,9 +14863,9 @@ The instruction :math:`({{\mathit{sh}}{.}\mathsf{extract\_lane}}{\mathsf{\_}}{{{ The instruction :math:`({\mathit{sh}}{.}\mathsf{replace\_lane}~i)` is valid with the instruction type :math:`\mathsf{v{\scriptstyle 128}}~t~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The lane index :math:`i` is less than :math:`{\mathrm{dim}}({\mathit{sh}})`. + * The lane index :math:`i` is less than :math:`{\mathrm{dim}}({\mathit{sh}})`. - * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. + * Let :math:`t` be the number type :math:`{\mathrm{unpack}}({\mathit{sh}})`. @@ -14898,9 +14898,9 @@ The instruction :math:`({\mathit{sh}}_1 {.} {{\mathit{vcvtop}}}{\mathsf{\_}}{{{\ The instruction :math:`(\mathsf{local{.}get}~x)` is valid with the instruction type :math:`\epsilon~\rightarrow~t` if: - * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`(\mathsf{set}~t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`(\mathsf{set}~t)`. @@ -14908,9 +14908,9 @@ The instruction :math:`(\mathsf{local{.}get}~x)` is valid with the instruction t The instruction :math:`(\mathsf{local{.}set}~x)` is valid with the instruction type :math:`t~{\rightarrow}_{x}\,\epsilon` if: - * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`({\mathit{init}}~t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`({\mathit{init}}~t)`. @@ -14918,9 +14918,9 @@ The instruction :math:`(\mathsf{local{.}set}~x)` is valid with the instruction t The instruction :math:`(\mathsf{local{.}tee}~x)` is valid with the instruction type :math:`t~{\rightarrow}_{x}\,t` if: - * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. + * The local type :math:`C{.}\mathsf{locals}{}[x]` exists. - * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`({\mathit{init}}~t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x]` is equal to :math:`({\mathit{init}}~t)`. @@ -14928,9 +14928,9 @@ The instruction :math:`(\mathsf{local{.}tee}~x)` is valid with the instruction t The instruction :math:`(\mathsf{global{.}get}~x)` is valid with the instruction type :math:`\epsilon~\rightarrow~t` if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}~t)`. @@ -14938,9 +14938,9 @@ The instruction :math:`(\mathsf{global{.}get}~x)` is valid with the instruction The instruction :math:`(\mathsf{global{.}set}~x)` is valid with the instruction type :math:`t~\rightarrow~\epsilon` if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\mathsf{mut}~t)`. @@ -14948,9 +14948,9 @@ The instruction :math:`(\mathsf{global{.}set}~x)` is valid with the instruction The instruction :math:`(\mathsf{table{.}get}~x)` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~{\mathit{rt}}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. @@ -14958,9 +14958,9 @@ The instruction :math:`(\mathsf{table{.}get}~x)` is valid with the instruction t The instruction :math:`(\mathsf{table{.}set}~x)` is valid with the instruction type :math:`{\mathit{at}}~{\mathit{rt}}~\rightarrow~\epsilon` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. @@ -14968,9 +14968,9 @@ The instruction :math:`(\mathsf{table{.}set}~x)` is valid with the instruction t The instruction :math:`(\mathsf{table{.}size}~x)` is valid with the instruction type :math:`\epsilon~\rightarrow~{\mathit{at}}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. @@ -14978,9 +14978,9 @@ The instruction :math:`(\mathsf{table{.}size}~x)` is valid with the instruction The instruction :math:`(\mathsf{table{.}grow}~x)` is valid with the instruction type :math:`{\mathit{rt}}~{\mathit{at}}~\rightarrow~{\mathit{at}}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. @@ -14988,9 +14988,9 @@ The instruction :math:`(\mathsf{table{.}grow}~x)` is valid with the instruction The instruction :math:`(\mathsf{table{.}fill}~x)` is valid with the instruction type :math:`{\mathit{at}}~{\mathit{rt}}~{\mathit{at}}~\rightarrow~\epsilon` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. @@ -14998,17 +14998,17 @@ The instruction :math:`(\mathsf{table{.}fill}~x)` is valid with the instruction The instruction :math:`(\mathsf{table{.}copy}~x_1~x_2)` is valid with the instruction type :math:`{\mathit{at}}_1~{\mathit{at}}_2~t~\rightarrow~\epsilon` if: - * The table type :math:`C{.}\mathsf{tables}{}[x_1]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x_1]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{at}}_1~{\mathit{lim}}_1~{\mathit{rt}}_1)`. + * The table type :math:`C{.}\mathsf{tables}{}[x_1]` is equal to :math:`({\mathit{at}}_1~{\mathit{lim}}_1~{\mathit{rt}}_1)`. - * The table type :math:`C{.}\mathsf{tables}{}[x_2]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x_2]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x_2]` is equal to :math:`({\mathit{at}}_2~{\mathit{lim}}_2~{\mathit{rt}}_2)`. + * The table type :math:`C{.}\mathsf{tables}{}[x_2]` is equal to :math:`({\mathit{at}}_2~{\mathit{lim}}_2~{\mathit{rt}}_2)`. - * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}_1`. + * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}_1`. - * Let :math:`t` be the address type :math:`{\mathrm{min}}({\mathit{at}}_1, {\mathit{at}}_2)`. + * Let :math:`t` be the address type :math:`{\mathrm{min}}({\mathit{at}}_1, {\mathit{at}}_2)`. @@ -15016,15 +15016,15 @@ The instruction :math:`(\mathsf{table{.}copy}~x_1~x_2)` is valid with the instru The instruction :math:`(\mathsf{table{.}init}~x~y)` is valid with the instruction type :math:`{\mathit{at}}~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}}_1)`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}}_1)`. - * The element type :math:`C{.}\mathsf{elems}{}[y]` exists. + * The element type :math:`C{.}\mathsf{elems}{}[y]` exists. - * The element type :math:`C{.}\mathsf{elems}{}[y]` is equal to :math:`{\mathit{rt}}_2`. + * The element type :math:`C{.}\mathsf{elems}{}[y]` is equal to :math:`{\mathit{rt}}_2`. - * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}_1`. + * The reference type :math:`{\mathit{rt}}_2` matches the reference type :math:`{\mathit{rt}}_1`. @@ -15032,9 +15032,9 @@ The instruction :math:`(\mathsf{table{.}init}~x~y)` is valid with the instructio The instruction :math:`(\mathsf{elem{.}drop}~x)` is valid with the instruction type :math:`\epsilon~\rightarrow~\epsilon` if: - * The element type :math:`C{.}\mathsf{elems}{}[x]` exists. + * The element type :math:`C{.}\mathsf{elems}{}[x]` exists. - * The element type :math:`C{.}\mathsf{elems}{}[x]` is equal to :math:`{\mathit{rt}}`. + * The element type :math:`C{.}\mathsf{elems}{}[x]` is equal to :math:`{\mathit{rt}}`. @@ -15042,9 +15042,9 @@ The instruction :math:`(\mathsf{elem{.}drop}~x)` is valid with the instruction t The instruction :math:`(\mathsf{memory{.}size}~x)` is valid with the instruction type :math:`\epsilon~\rightarrow~{\mathit{at}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. @@ -15052,9 +15052,9 @@ The instruction :math:`(\mathsf{memory{.}size}~x)` is valid with the instruction The instruction :math:`(\mathsf{memory{.}grow}~x)` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~{\mathit{at}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. @@ -15062,9 +15062,9 @@ The instruction :math:`(\mathsf{memory{.}grow}~x)` is valid with the instruction The instruction :math:`(\mathsf{memory{.}fill}~x)` is valid with the instruction type :math:`{\mathit{at}}~\mathsf{i{\scriptstyle 32}}~{\mathit{at}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. @@ -15072,15 +15072,15 @@ The instruction :math:`(\mathsf{memory{.}fill}~x)` is valid with the instruction The instruction :math:`(\mathsf{memory{.}copy}~x_1~x_2)` is valid with the instruction type :math:`{\mathit{at}}_1~{\mathit{at}}_2~t~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x_1]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x_1]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x_1]` is equal to :math:`({\mathit{at}}_1~{\mathit{lim}}_1~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x_1]` is equal to :math:`({\mathit{at}}_1~{\mathit{lim}}_1~\mathsf{page})`. - * The memory type :math:`C{.}\mathsf{mems}{}[x_2]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x_2]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x_2]` is equal to :math:`({\mathit{at}}_2~{\mathit{lim}}_2~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x_2]` is equal to :math:`({\mathit{at}}_2~{\mathit{lim}}_2~\mathsf{page})`. - * Let :math:`t` be the address type :math:`{\mathrm{min}}({\mathit{at}}_1, {\mathit{at}}_2)`. + * Let :math:`t` be the address type :math:`{\mathrm{min}}({\mathit{at}}_1, {\mathit{at}}_2)`. @@ -15088,13 +15088,13 @@ The instruction :math:`(\mathsf{memory{.}copy}~x_1~x_2)` is valid with the instr The instruction :math:`(\mathsf{memory{.}init}~x~y)` is valid with the instruction type :math:`{\mathit{at}}~\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * The data type :math:`C{.}\mathsf{datas}{}[y]` exists. + * The data type :math:`C{.}\mathsf{datas}{}[y]` exists. - * The data type :math:`C{.}\mathsf{datas}{}[y]` is equal to :math:`\mathsf{ok}`. + * The data type :math:`C{.}\mathsf{datas}{}[y]` is equal to :math:`\mathsf{ok}`. @@ -15102,9 +15102,9 @@ The instruction :math:`(\mathsf{memory{.}init}~x~y)` is valid with the instructi The instruction :math:`(\mathsf{data{.}drop}~x)` is valid with the instruction type :math:`\epsilon~\rightarrow~\epsilon` if: - * The data type :math:`C{.}\mathsf{datas}{}[x]` exists. + * The data type :math:`C{.}\mathsf{datas}{}[x]` exists. - * The data type :math:`C{.}\mathsf{datas}{}[x]` is equal to :math:`\mathsf{ok}`. + * The data type :math:`C{.}\mathsf{datas}{}[x]` is equal to :math:`\mathsf{ok}`. @@ -15112,29 +15112,29 @@ The instruction :math:`(\mathsf{data{.}drop}~x)` is valid with the instruction t The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{load}}{{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * Either: + * Either: - * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. + * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. - * :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. + * :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. - * Or: + * Or: - * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. + * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. - * :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. + * :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -15142,29 +15142,29 @@ The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{. The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{store}}{{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * Either: + * Either: - * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. + * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. - * :math:`{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. + * :math:`{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{nt}}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. - * Or: + * Or: - * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. + * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. - * :math:`{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`M`. + * :math:`{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`M`. - * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. + * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -15172,31 +15172,31 @@ The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{. The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * Either: + * Either: - * :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. + * :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is absent. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|\mathsf{v{\scriptstyle 128}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|\mathsf{v{\scriptstyle 128}}|} / 8`. - * Or: + * Or: - * :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`({M}{\mathsf{x}}{N}{\mathsf{\_}}{{\mathit{sx}}})`. + * :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`({M}{\mathsf{x}}{N}{\mathsf{\_}}{{\mathit{sx}}})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8 \cdot N`. - * Or: + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8 \cdot N`. + * Or: - * :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`({N}{\mathsf{\_}}{\mathsf{splat}})`. + * :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`({N}{\mathsf{\_}}{\mathsf{splat}})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. - * Or: + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. + * Or: - * :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`({N}{\mathsf{\_}}{\mathsf{zero}})`. + * :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`({N}{\mathsf{\_}}{\mathsf{zero}})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. @@ -15204,13 +15204,13 @@ The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{{{\mathit The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{N}{\mathsf{\_}}{\mathsf{lane}}~x~{\mathit{memarg}}~i)` is valid with the instruction type :math:`{\mathit{at}}~\mathsf{v{\scriptstyle 128}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. - * :math:`i` is less than :math:`128 / N`. + * :math:`i` is less than :math:`128 / N`. @@ -15218,11 +15218,11 @@ The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{N}{\maths The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{store}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\mathsf{v{\scriptstyle 128}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|\mathsf{v{\scriptstyle 128}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|\mathsf{v{\scriptstyle 128}}|} / 8`. @@ -15230,13 +15230,13 @@ The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{store}~x~{\mathit The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{store}}{N}{\mathsf{\_}}{\mathsf{lane}}~x~{\mathit{memarg}}~i)` is valid with the instruction type :math:`{\mathit{at}}~\mathsf{v{\scriptstyle 128}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. - * :math:`i` is less than :math:`128 / N`. + * :math:`i` is less than :math:`128 / N`. @@ -15244,7 +15244,7 @@ The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{store}}{N}{\math The instruction :math:`(\mathsf{select}~t)` is valid with the instruction type :math:`t~t~\mathsf{i{\scriptstyle 32}}~\rightarrow~t` if: - * The value type :math:`t` is valid. + * The value type :math:`t` is valid. @@ -15252,11 +15252,11 @@ The instruction :math:`(\mathsf{select}~t)` is valid with the instruction type : The instruction :math:`(\mathsf{select}~\epsilon)` is valid with the instruction type :math:`t~t~\mathsf{i{\scriptstyle 32}}~\rightarrow~t` if: - * The value type :math:`t` is valid. + * The value type :math:`t` is valid. - * The value type :math:`t` matches the value type :math:`{t'}`. + * The value type :math:`t` matches the value type :math:`{t'}`. - * The value type :math:`{t'}` is equal to :math:`{\mathit{numtype}}` or :math:`{t'}` is equal to :math:`{\mathit{vectype}}`. + * The value type :math:`{t'}` is equal to :math:`{\mathit{numtype}}` or :math:`{t'}` is equal to :math:`{\mathit{vectype}}`. @@ -15264,11 +15264,11 @@ The instruction :math:`(\mathsf{select}~\epsilon)` is valid with the instruction The instruction :math:`({{\mathit{nt}}{.}\mathsf{load}}{\epsilon}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~{\mathit{nt}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. @@ -15276,11 +15276,11 @@ The instruction :math:`({{\mathit{nt}}{.}\mathsf{load}}{\epsilon}~x~{\mathit{mem The instruction :math:`({{\mathsf{i}}{N}{.}\mathsf{load}}{M~{\mathit{sx}}}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~{\mathsf{i}}{N}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -15288,11 +15288,11 @@ The instruction :math:`({{\mathsf{i}}{N}{.}\mathsf{load}}{M~{\mathit{sx}}}~x~{\m The instruction :math:`({{\mathit{nt}}{.}\mathsf{store}}{\epsilon}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~{\mathit{nt}}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|{\mathit{nt}}|} / 8`. @@ -15300,11 +15300,11 @@ The instruction :math:`({{\mathit{nt}}{.}\mathsf{store}}{\epsilon}~x~{\mathit{me The instruction :math:`({{\mathsf{i}}{N}{.}\mathsf{store}}{M}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~{\mathsf{i}}{N}~\rightarrow~\epsilon` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8`. @@ -15312,11 +15312,11 @@ The instruction :math:`({{\mathsf{i}}{N}{.}\mathsf{store}}{M}~x~{\mathit{memarg} The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{\epsilon}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|\mathsf{v{\scriptstyle 128}}|} / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`{|\mathsf{v{\scriptstyle 128}}|} / 8`. @@ -15324,11 +15324,11 @@ The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{\epsilon} The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{{M}{\mathsf{x}}{N}{\mathsf{\_}}{{\mathit{sx}}}}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8 \cdot N`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8 \cdot N`. @@ -15336,11 +15336,11 @@ The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{{M}{\math The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{{N}{\mathsf{\_}}{\mathsf{splat}}}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. @@ -15348,11 +15348,11 @@ The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{{N}{\math The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{{N}{\mathsf{\_}}{\mathsf{zero}}}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~\mathsf{page})`. - * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. + * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`N / 8`. @@ -15360,53 +15360,53 @@ The instruction :math:`({\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{{N}{\math The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is valid with the instruction type :math:`{\mathit{instrtype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` if: - * Either: + * Either: - * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * The instruction type :math:`{\mathit{instrtype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\epsilon~\rightarrow~\epsilon`. + * The instruction type :math:`{\mathit{instrtype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\epsilon~\rightarrow~\epsilon`. - * Or: + * Or: - * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}`. - * The instruction type :math:`{\mathit{instrtype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{t_1^\ast}~{\rightarrow}_{{x_1^\ast}~{x_2^\ast}}\,{t_3^\ast}`. + * The instruction type :math:`{\mathit{instrtype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{t_1^\ast}~{\rightarrow}_{{x_1^\ast}~{x_2^\ast}}\,{t_3^\ast}`. - * The instruction :math:`{\mathit{instr}}_1` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x_1^\ast}}\,{t_2^\ast}`. + * The instruction :math:`{\mathit{instr}}_1` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x_1^\ast}}\,{t_2^\ast}`. - * :math:`{|{\mathit{t*}}|}` is equal to :math:`{|{\mathit{init*}}|}`. + * :math:`{|{\mathit{t*}}|}` is equal to :math:`{|{\mathit{init*}}|}`. - * :math:`{|x_{\mathit{{\scriptstyle 1}*}}|}` is equal to :math:`{|{\mathit{init*}}|}`. + * :math:`{|x_{\mathit{{\scriptstyle 1}*}}|}` is equal to :math:`{|{\mathit{init*}}|}`. - * For all :math:`x_1` in :math:`{x_1^\ast}`: + * For all :math:`x_1` in :math:`{x_1^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x_1]` exists. + * The local type :math:`C{.}\mathsf{locals}{}[x_1]` exists. - * For all :math:`{\mathit{init}}` in :math:`{{\mathit{init}}^\ast}` and :math:`t` in :math:`{t^\ast}` and :math:`x_1` in :math:`{x_1^\ast}`: + * For all :math:`{\mathit{init}}` in :math:`{{\mathit{init}}^\ast}` and :math:`t` in :math:`{t^\ast}` and :math:`x_1` in :math:`{x_1^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x_1]` is equal to :math:`({\mathit{init}}~t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x_1]` is equal to :math:`({\mathit{init}}~t)`. - * Under the context :math:`C{}[{.}\mathsf{local}{}[{x_1^\ast}] = {(\mathsf{set}~t)^\ast}]`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_2^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_3^\ast}`. - * Or: + * Under the context :math:`C{}[{.}\mathsf{local}{}[{x_1^\ast}] = {(\mathsf{set}~t)^\ast}]`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_2^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_3^\ast}`. + * Or: - * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. - * The instruction type :math:`{\mathit{instrtype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{it}'}`. + * The instruction type :math:`{\mathit{instrtype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathit{it}'}`. - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{\mathit{it}}`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{\mathit{it}}`. - * The instruction type :math:`{\mathit{it}}` matches the instruction type :math:`{\mathit{it}'}`. + * The instruction type :math:`{\mathit{it}}` matches the instruction type :math:`{\mathit{it}'}`. - * The instruction type :math:`{\mathit{it}'}` is valid. - * Or: + * The instruction type :math:`{\mathit{it}'}` is valid. + * Or: - * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{instr}}^\ast}`. - * The instruction type :math:`{\mathit{instrtype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{t^\ast}~{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t^\ast}~{t_2^\ast}`. + * The instruction type :math:`{\mathit{instrtype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{t^\ast}~{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t^\ast}~{t_2^\ast}`. - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}`. - * The result type :math:`{t^\ast}` is valid. + * The result type :math:`{t^\ast}` is valid. @@ -15419,21 +15419,21 @@ The instruction sequence :math:`\epsilon` is valid with the instruction type :ma The instruction sequence :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x_1^\ast}~{x_2^\ast}}\,{t_3^\ast}` if: - * The instruction :math:`{\mathit{instr}}_1` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x_1^\ast}}\,{t_2^\ast}`. + * The instruction :math:`{\mathit{instr}}_1` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x_1^\ast}}\,{t_2^\ast}`. - * :math:`{|{\mathit{t*}}|}` is equal to :math:`{|{\mathit{init*}}|}`. + * :math:`{|{\mathit{t*}}|}` is equal to :math:`{|{\mathit{init*}}|}`. - * :math:`{|x_{\mathit{{\scriptstyle 1}*}}|}` is equal to :math:`{|{\mathit{init*}}|}`. + * :math:`{|x_{\mathit{{\scriptstyle 1}*}}|}` is equal to :math:`{|{\mathit{init*}}|}`. - * For all :math:`x_1` in :math:`{x_1^\ast}`: + * For all :math:`x_1` in :math:`{x_1^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x_1]` exists. + * The local type :math:`C{.}\mathsf{locals}{}[x_1]` exists. - * For all :math:`{\mathit{init}}` in :math:`{{\mathit{init}}^\ast}` and :math:`t` in :math:`{t^\ast}` and :math:`x_1` in :math:`{x_1^\ast}`: + * For all :math:`{\mathit{init}}` in :math:`{{\mathit{init}}^\ast}` and :math:`t` in :math:`{t^\ast}` and :math:`x_1` in :math:`{x_1^\ast}`: - * The local type :math:`C{.}\mathsf{locals}{}[x_1]` is equal to :math:`({\mathit{init}}~t)`. + * The local type :math:`C{.}\mathsf{locals}{}[x_1]` is equal to :math:`({\mathit{init}}~t)`. - * Under the context :math:`C{}[{.}\mathsf{local}{}[{x_1^\ast}] = {(\mathsf{set}~t)^\ast}]`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_2^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_3^\ast}`. + * Under the context :math:`C{}[{.}\mathsf{local}{}[{x_1^\ast}] = {(\mathsf{set}~t)^\ast}]`, the instruction sequence :math:`{{\mathit{instr}}_2^\ast}` is valid with the instruction type :math:`{t_2^\ast}~{\rightarrow}_{{x_2^\ast}}\,{t_3^\ast}`. @@ -15441,11 +15441,11 @@ The instruction sequence :math:`{\mathit{instr}}_1~{{\mathit{instr}}_2^\ast}` is The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{\mathit{it}'}` if: - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{\mathit{it}}`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{\mathit{it}}`. - * The instruction type :math:`{\mathit{it}}` matches the instruction type :math:`{\mathit{it}'}`. + * The instruction type :math:`{\mathit{it}}` matches the instruction type :math:`{\mathit{it}'}`. - * The instruction type :math:`{\mathit{it}'}` is valid. + * The instruction type :math:`{\mathit{it}'}` is valid. @@ -15453,9 +15453,9 @@ The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instr The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t^\ast}~{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t^\ast}~{t_2^\ast}` if: - * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}`. + * The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~{\rightarrow}_{{x^\ast}}\,{t_2^\ast}`. - * The result type :math:`{t^\ast}` is valid. + * The result type :math:`{t^\ast}` is valid. @@ -15463,7 +15463,7 @@ The instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instr The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :math:`{t^\ast}` if: - * The expression :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`\epsilon~\rightarrow~{t^\ast}`. + * The expression :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`\epsilon~\rightarrow~{t^\ast}`. @@ -15471,57 +15471,57 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is const if: - * Either: + * Either: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathit{nt}}{.}\mathsf{const}~c_{\mathit{nt}})`. + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathit{nt}}{.}\mathsf{const}~c_{\mathit{nt}})`. - * Or: + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathit{vt}}{.}\mathsf{const}~c_{\mathit{vt}})`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathit{vt}}{.}\mathsf{const}~c_{\mathit{vt}})`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{ref{.}null}~{\mathit{ht}})`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{ref{.}null}~{\mathit{ht}})`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{ref{.}i{\scriptstyle 31}}`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{ref{.}i{\scriptstyle 31}}`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{ref{.}func}~x)`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{ref{.}func}~x)`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{struct{.}new}~x)`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{struct{.}new}~x)`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{struct{.}new\_default}~x)`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{struct{.}new\_default}~x)`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{array{.}new}~x)`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{array{.}new}~x)`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{array{.}new\_default}~x)`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{array{.}new\_default}~x)`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{array{.}new\_fixed}~x~n)`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{array{.}new\_fixed}~x~n)`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{any{.}convert\_extern}`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{any{.}convert\_extern}`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{extern{.}convert\_any}`. - * Or: + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{extern{.}convert\_any}`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global{.}get}~x)`. + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global{.}get}~x)`. - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. - * Or: + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. + * Or: - * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathsf{i}}{N} {.} {\mathit{binop}})`. + * The instruction :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({\mathsf{i}}{N} {.} {\mathit{binop}})`. - * :math:`{\mathsf{i}}{N}` is contained in [:math:`\mathsf{i{\scriptstyle 32}}`; :math:`\mathsf{i{\scriptstyle 64}}`]. + * :math:`{\mathsf{i}}{N}` is contained in [:math:`\mathsf{i{\scriptstyle 32}}`; :math:`\mathsf{i{\scriptstyle 64}}`]. - * :math:`{\mathit{binop}}` is contained in [:math:`\mathsf{add}`; :math:`\mathsf{sub}`; :math:`\mathsf{mul}`]. + * :math:`{\mathit{binop}}` is contained in [:math:`\mathsf{add}`; :math:`\mathsf{sub}`; :math:`\mathsf{mul}`]. @@ -15589,9 +15589,9 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma :math:`(\mathsf{global{.}get}~x)` is const if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`(\epsilon~t)`. @@ -15599,9 +15599,9 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma :math:`({\mathsf{i}}{N} {.} {\mathit{binop}})` is const if: - * :math:`{\mathsf{i}}{N}` is contained in [:math:`\mathsf{i{\scriptstyle 32}}`; :math:`\mathsf{i{\scriptstyle 64}}`]. + * :math:`{\mathsf{i}}{N}` is contained in [:math:`\mathsf{i{\scriptstyle 32}}`; :math:`\mathsf{i{\scriptstyle 64}}`]. - * :math:`{\mathit{binop}}` is contained in [:math:`\mathsf{add}`; :math:`\mathsf{sub}`; :math:`\mathsf{mul}`]. + * :math:`{\mathit{binop}}` is contained in [:math:`\mathsf{add}`; :math:`\mathsf{sub}`; :math:`\mathsf{mul}`]. @@ -15609,9 +15609,9 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma :math:`{{\mathit{instr}}^\ast}` is const if: - * For all :math:`{\mathit{instr}}` in :math:`{{\mathit{instr}}^\ast}`: + * For all :math:`{\mathit{instr}}` in :math:`{{\mathit{instr}}^\ast}`: - * :math:`{\mathit{instr}}` is const. + * :math:`{\mathit{instr}}` is const. @@ -15619,13 +15619,13 @@ The expression :math:`{{\mathit{instr}}^\ast}` is valid with the result type :ma The type definition :math:`(\mathsf{type}~{\mathit{rectype}})` is valid with the defined type sequence :math:`{{\mathit{dt}}^\ast}` if: - * :math:`{|C{.}\mathsf{types}|}` is equal to :math:`x`. + * :math:`{|C{.}\mathsf{types}|}` is equal to :math:`x`. - * The defined type sequence :math:`{{\mathit{dt}}^\ast}` is equal to :math:`{{{{\mathrm{roll}}}_{x}^\ast}}{({\mathit{rectype}})}`. + * The defined type sequence :math:`{{\mathit{dt}}^\ast}` is equal to :math:`{{{{\mathrm{roll}}}_{x}^\ast}}{({\mathit{rectype}})}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the defined type sequence :math:`{{\mathit{dt}}^\ast}` appended to the field :math:`\mathsf{types}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the defined type sequence :math:`{{\mathit{dt}}^\ast}` appended to the field :math:`\mathsf{types}`. - * Under the context :math:`{C'}`, the recursive type :math:`{\mathit{rectype}}` is valid with :math:`({\mathsf{ok}}{x})`. + * Under the context :math:`{C'}`, the recursive type :math:`{\mathit{rectype}}` is valid with :math:`({\mathsf{ok}}{x})`. @@ -15633,17 +15633,17 @@ The type definition :math:`(\mathsf{type}~{\mathit{rectype}})` is valid with the The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`({\mathit{init}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}~t)` if: - * Either: + * Either: - * The initialization status :math:`{\mathit{init}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{set}`. + * The initialization status :math:`{\mathit{init}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{set}`. - * A :ref:`default value <default-val>` for value type the value type :math:`t` is defined. + * A :ref:`default value <default-val>` for value type the value type :math:`t` is defined. - * Or: + * Or: - * The initialization status :math:`{\mathit{init}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{unset}`. + * The initialization status :math:`{\mathit{init}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{unset}`. - * A :ref:`default value <default-val>` for value type the value type :math:`t` is not defined. + * A :ref:`default value <default-val>` for value type the value type :math:`t` is not defined. @@ -15651,7 +15651,7 @@ The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`({\math The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`(\mathsf{set}~t)` if: - * A :ref:`default value <default-val>` for value type the value type :math:`t` is defined. + * A :ref:`default value <default-val>` for value type the value type :math:`t` is defined. @@ -15659,7 +15659,7 @@ The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`(\maths The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`(\mathsf{unset}~t)` if: - * A :ref:`default value <default-val>` for value type the value type :math:`t` is not defined. + * A :ref:`default value <default-val>` for value type the value type :math:`t` is not defined. @@ -15667,17 +15667,17 @@ The local :math:`(\mathsf{local}~t)` is valid with the local type :math:`(\maths The function :math:`(\mathsf{func}~x~{{\mathit{local}}^\ast}~{\mathit{expr}})` is valid with the defined type :math:`C{.}\mathsf{types}{}[x]` if: - * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{func}~{t_1^\ast}~\rightarrow~{t_2^\ast})`. - * :math:`{|{\mathit{local*}}|}` is equal to :math:`{|{\mathit{lct*}}|}`. + * :math:`{|{\mathit{local*}}|}` is equal to :math:`{|{\mathit{lct*}}|}`. - * For all :math:`{{\mathit{lt}}}` in :math:`{{{\mathit{lt}}}^\ast}` and :math:`{\mathit{local}}` in :math:`{{\mathit{local}}^\ast}`: + * For all :math:`{{\mathit{lt}}}` in :math:`{{{\mathit{lt}}}^\ast}` and :math:`{\mathit{local}}` in :math:`{{\mathit{local}}^\ast}`: - * The local :math:`{\mathit{local}}` is valid with the local type :math:`{{\mathit{lt}}}`. + * The local :math:`{\mathit{local}}` is valid with the local type :math:`{{\mathit{lt}}}`. - * Under the context :math:`C{}[{.}\mathsf{locals} \mathrel{{=}{\oplus}} {(\mathsf{set}~t_1)^\ast}~{{{\mathit{lt}}}^\ast}]{}[{.}\mathsf{labels} \mathrel{{=}{\oplus}} {t_2^\ast}]{}[{.}\mathsf{return} \mathrel{{=}{\oplus}} {t_2^\ast}]`, the expression :math:`{\mathit{expr}}` is valid with the result type :math:`{t_2^\ast}`. + * Under the context :math:`C{}[{.}\mathsf{locals} \mathrel{{=}{\oplus}} {(\mathsf{set}~t_1)^\ast}~{{{\mathit{lt}}}^\ast}]{}[{.}\mathsf{labels} \mathrel{{=}{\oplus}} {t_2^\ast}]{}[{.}\mathsf{return} \mathrel{{=}{\oplus}} {t_2^\ast}]`, the expression :math:`{\mathit{expr}}` is valid with the result type :math:`{t_2^\ast}`. @@ -15685,13 +15685,13 @@ The function :math:`(\mathsf{func}~x~{{\mathit{local}}^\ast}~{\mathit{expr}})` i The global :math:`(\mathsf{global}~{\mathit{globaltype}}~{\mathit{expr}})` is valid with the global type :math:`{\mathit{globaltype}}` if: - * The global type :math:`{\mathit{gt}}` is valid. + * The global type :math:`{\mathit{gt}}` is valid. - * The global type :math:`{\mathit{globaltype}}` is equal to :math:`({\mathsf{mut}^?}~t)`. + * The global type :math:`{\mathit{globaltype}}` is equal to :math:`({\mathsf{mut}^?}~t)`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`t`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`t`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. @@ -15699,13 +15699,13 @@ The global :math:`(\mathsf{global}~{\mathit{globaltype}}~{\mathit{expr}})` is va The table :math:`(\mathsf{table}~{\mathit{tabletype}}~{\mathit{expr}})` is valid with the table type :math:`{\mathit{tabletype}}` if: - * The table type :math:`{\mathit{tt}}` is valid. + * The table type :math:`{\mathit{tt}}` is valid. - * The table type :math:`{\mathit{tabletype}}` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. + * The table type :math:`{\mathit{tabletype}}` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}})`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`{\mathit{rt}}`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`{\mathit{rt}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. @@ -15713,7 +15713,7 @@ The table :math:`(\mathsf{table}~{\mathit{tabletype}}~{\mathit{expr}})` is valid The memory :math:`(\mathsf{memory}~{\mathit{memtype}})` is valid with the memory type :math:`{\mathit{memtype}}` if: - * The memory type :math:`{\mathit{memtype}}` is valid. + * The memory type :math:`{\mathit{memtype}}` is valid. @@ -15721,9 +15721,9 @@ The memory :math:`(\mathsf{memory}~{\mathit{memtype}})` is valid with the memory The tag :math:`(\mathsf{tag}~x)` is valid with the tag type :math:`C{.}\mathsf{types}{}[x]` if: - * The tag type :math:`C{.}\mathsf{types}{}[x]` exists. + * The tag type :math:`C{.}\mathsf{types}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. + * The :ref:`expansion <aux-expand-deftype>` of the tag type :math:`C{.}\mathsf{types}{}[x]` is the composite type :math:`(\mathsf{func}~{\mathit{functype}})`. @@ -15731,26 +15731,26 @@ The tag :math:`(\mathsf{tag}~x)` is valid with the tag type :math:`C{.}\mathsf{t The element mode :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid with the element type :math:`{\mathit{rt}}` if: - * Either: + * Either: - * The element mode :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{active}~x~{\mathit{expr}})`. + * The element mode :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{active}~x~{\mathit{expr}})`. - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}'})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}'})`. - * The element type :math:`{\mathit{rt}}` matches the reference type :math:`{\mathit{rt}'}`. + * The element type :math:`{\mathit{rt}}` matches the reference type :math:`{\mathit{rt}'}`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. - * Or: + * Or: - * The element mode :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{passive}`. - * Or: + * The element mode :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{passive}`. + * Or: - * The element mode :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{declare}`. + * The element mode :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{declare}`. @@ -15758,15 +15758,15 @@ The element mode :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1 The element mode :math:`(\mathsf{active}~x~{\mathit{expr}})` is valid with the element type :math:`{\mathit{rt}}` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}'})`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`({\mathit{at}}~{\mathit{lim}}~{\mathit{rt}'})`. - * The element type :math:`{\mathit{rt}}` matches the reference type :math:`{\mathit{rt}'}`. + * The element type :math:`{\mathit{rt}}` matches the reference type :math:`{\mathit{rt}'}`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. @@ -15784,15 +15784,15 @@ The element mode :math:`\mathsf{declare}` is valid with the element type :math:` The table segment :math:`(\mathsf{elem}~{\mathit{elemtype}}~{{\mathit{expr}}^\ast}~{\mathit{elemmode}})` is valid with the element type :math:`{\mathit{elemtype}}` if: - * The element type :math:`{\mathit{elemtype}}` is valid. + * The element type :math:`{\mathit{elemtype}}` is valid. - * For all :math:`{\mathit{expr}}` in :math:`{{\mathit{expr}}^\ast}`: + * For all :math:`{\mathit{expr}}` in :math:`{{\mathit{expr}}^\ast}`: - * The expression :math:`{\mathit{expr}}` is valid with the element type :math:`{\mathit{elemtype}}`. + * The expression :math:`{\mathit{expr}}` is valid with the element type :math:`{\mathit{elemtype}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. - * The element mode :math:`{\mathit{elemmode}}` is valid with the element type :math:`{\mathit{elemtype}}`. + * The element mode :math:`{\mathit{elemmode}}` is valid with the element type :math:`{\mathit{elemtype}}`. @@ -15800,21 +15800,21 @@ The table segment :math:`(\mathsf{elem}~{\mathit{elemtype}}~{{\mathit{expr}}^\as The data mode :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid with the data type :math:`\mathsf{ok}` if: - * Either: + * Either: - * The data mode :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{active}~x~{\mathit{expr}})`. + * The data mode :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{active}~x~{\mathit{expr}})`. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. - * Or: + * Or: - * The data mode :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{passive}`. + * The data mode :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`\mathsf{passive}`. @@ -15822,13 +15822,13 @@ The data mode :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} The data mode :math:`(\mathsf{active}~x~{\mathit{expr}})` is valid with the data type :math:`\mathsf{ok}` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. - * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. + * The expression :math:`{\mathit{expr}}` is valid with the value type :math:`\mathsf{i{\scriptstyle 32}}`. - * :math:`{\mathit{expr}}` is const. + * :math:`{\mathit{expr}}` is const. @@ -15841,7 +15841,7 @@ The data mode :math:`\mathsf{passive}` is valid with the data type :math:`\maths The memory segment :math:`(\mathsf{data}~{b^\ast}~{\mathit{datamode}})` is valid with the data type :math:`\mathsf{ok}` if: - * The data mode :math:`{\mathit{datamode}}` is valid with the data type :math:`\mathsf{ok}`. + * The data mode :math:`{\mathit{datamode}}` is valid with the data type :math:`\mathsf{ok}`. @@ -15849,9 +15849,9 @@ The memory segment :math:`(\mathsf{data}~{b^\ast}~{\mathit{datamode}})` is valid The start function :math:`(\mathsf{start}~x)` is valid if: - * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{funcs}{}[x]` is the composite type :math:`(\mathsf{func}~\epsilon~\rightarrow~\epsilon)`. + * The :ref:`expansion <aux-expand-deftype>` of the defined type :math:`C{.}\mathsf{funcs}{}[x]` is the composite type :math:`(\mathsf{func}~\epsilon~\rightarrow~\epsilon)`. @@ -15859,7 +15859,7 @@ The start function :math:`(\mathsf{start}~x)` is valid if: The import :math:`(\mathsf{import}~{\mathit{name}}_1~{\mathit{name}}_2~{\mathit{xt}})` is valid with the external type :math:`{\mathit{xt}}` if: - * The external type :math:`{\mathit{xt}}` is valid. + * The external type :math:`{\mathit{xt}}` is valid. @@ -15867,52 +15867,52 @@ The import :math:`(\mathsf{import}~{\mathit{name}}_1~{\mathit{name}}_2~{\mathit{ The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid with the external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` if: - * Either: + * Either: - * The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~x)`. + * The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{dt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{func}~{\mathit{dt}})`. - * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The defined type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{dt}}`. + * The defined type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{dt}}`. - * Or: + * Or: - * The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~x)`. + * The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global}~{\mathit{gt}})`. - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. - * Or: + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. + * Or: - * The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~x)`. + * The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{table}~{\mathit{tt}})`. - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. - * Or: + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. + * Or: - * The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~x)`. + * The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{mem}~{\mathit{mt}})`. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. - * Or: + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. + * Or: - * The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{tag}~x)`. + * The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{tag}~x)`. - * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{tag}~{\mathit{jt}})`. + * The external type :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{tag}~{\mathit{jt}})`. - * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. + * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. - * The tag type :math:`C{.}\mathsf{tags}{}[x]` is equal to :math:`{\mathit{jt}}`. + * The tag type :math:`C{.}\mathsf{tags}{}[x]` is equal to :math:`{\mathit{jt}}`. @@ -15920,9 +15920,9 @@ The external index :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` The external index :math:`(\mathsf{func}~x)` is valid with the external type :math:`(\mathsf{func}~{\mathit{dt}})` if: - * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. + * The defined type :math:`C{.}\mathsf{funcs}{}[x]` exists. - * The defined type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{dt}}`. + * The defined type :math:`C{.}\mathsf{funcs}{}[x]` is equal to :math:`{\mathit{dt}}`. @@ -15930,9 +15930,9 @@ The external index :math:`(\mathsf{func}~x)` is valid with the external type :ma The external index :math:`(\mathsf{global}~x)` is valid with the external type :math:`(\mathsf{global}~{\mathit{gt}})` if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`{\mathit{gt}}`. @@ -15940,9 +15940,9 @@ The external index :math:`(\mathsf{global}~x)` is valid with the external type : The external index :math:`(\mathsf{table}~x)` is valid with the external type :math:`(\mathsf{table}~{\mathit{tt}})` if: - * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. + * The table type :math:`C{.}\mathsf{tables}{}[x]` exists. - * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. + * The table type :math:`C{.}\mathsf{tables}{}[x]` is equal to :math:`{\mathit{tt}}`. @@ -15950,9 +15950,9 @@ The external index :math:`(\mathsf{table}~x)` is valid with the external type :m The external index :math:`(\mathsf{mem}~x)` is valid with the external type :math:`(\mathsf{mem}~{\mathit{mt}})` if: - * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. - * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. + * The memory type :math:`C{.}\mathsf{mems}{}[x]` is equal to :math:`{\mathit{mt}}`. @@ -15960,9 +15960,9 @@ The external index :math:`(\mathsf{mem}~x)` is valid with the external type :mat The external index :math:`(\mathsf{tag}~x)` is valid with the external type :math:`(\mathsf{tag}~{\mathit{jt}})` if: - * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. + * The tag type :math:`C{.}\mathsf{tags}{}[x]` exists. - * The tag type :math:`C{.}\mathsf{tags}{}[x]` is equal to :math:`{\mathit{jt}}`. + * The tag type :math:`C{.}\mathsf{tags}{}[x]` is equal to :math:`{\mathit{jt}}`. @@ -15970,7 +15970,7 @@ The external index :math:`(\mathsf{tag}~x)` is valid with the external type :mat The export :math:`(\mathsf{export}~{\mathit{name}}~{\mathit{externidx}})` is valid with the name :math:`{\mathit{name}}` and the external type :math:`{\mathit{xt}}` if: - * The external index :math:`{\mathit{externidx}}` is valid with the external type :math:`{\mathit{xt}}`. + * The external index :math:`{\mathit{externidx}}` is valid with the external type :math:`{\mathit{xt}}`. @@ -15978,23 +15978,23 @@ The export :math:`(\mathsf{export}~{\mathit{name}}~{\mathit{externidx}})` is val The global sequence :math:`{{\mathit{global}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is valid with the global type sequence :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` if: - * Either: + * Either: - * The global sequence :math:`{{\mathit{global}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The global sequence :math:`{{\mathit{global}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * The global type sequence :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The global type sequence :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * Or: + * Or: - * The global sequence :math:`{{\mathit{global}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{global}}_1~{{\mathit{global}}^\ast}`. + * The global sequence :math:`{{\mathit{global}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{global}}_1~{{\mathit{global}}^\ast}`. - * The global type sequence :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{gt}}_1~{{\mathit{gt}}^\ast}`. + * The global type sequence :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{gt}}_1~{{\mathit{gt}}^\ast}`. - * The global :math:`{\mathit{global}}_1` is valid with the global type :math:`{\mathit{gt}}_1`. + * The global :math:`{\mathit{global}}_1` is valid with the global type :math:`{\mathit{gt}}_1`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the global type :math:`{\mathit{gt}}_1` appended to the field :math:`\mathsf{globals}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the global type :math:`{\mathit{gt}}_1` appended to the field :math:`\mathsf{globals}`. - * Under the context :math:`{C'}`, the global sequence :math:`{{\mathit{global}}^\ast}` is valid with the global type sequence :math:`{{\mathit{gt}}^\ast}`. + * Under the context :math:`{C'}`, the global sequence :math:`{{\mathit{global}}^\ast}` is valid with the global type sequence :math:`{{\mathit{gt}}^\ast}`. @@ -16007,11 +16007,11 @@ The global type sequence :math:`\epsilon` is valid with the global type sequence The global sequence :math:`{\mathit{global}}_1~{{\mathit{global}}^\ast}` is valid with the global type sequence :math:`{\mathit{gt}}_1~{{\mathit{gt}}^\ast}` if: - * The global :math:`{\mathit{global}}_1` is valid with the global type :math:`{\mathit{gt}}_1`. + * The global :math:`{\mathit{global}}_1` is valid with the global type :math:`{\mathit{gt}}_1`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the global type :math:`{\mathit{gt}}_1` appended to the field :math:`\mathsf{globals}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the global type :math:`{\mathit{gt}}_1` appended to the field :math:`\mathsf{globals}`. - * Under the context :math:`{C'}`, the global sequence :math:`{{\mathit{global}}^\ast}` is valid with the global type sequence :math:`{{\mathit{gt}}^\ast}`. + * Under the context :math:`{C'}`, the global sequence :math:`{{\mathit{global}}^\ast}` is valid with the global type sequence :math:`{{\mathit{gt}}^\ast}`. @@ -16019,23 +16019,23 @@ The global sequence :math:`{\mathit{global}}_1~{{\mathit{global}}^\ast}` is vali The type definition sequence :math:`{{\mathit{type}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is valid with the defined type sequence :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` if: - * Either: + * Either: - * The type definition sequence :math:`{{\mathit{type}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The type definition sequence :math:`{{\mathit{type}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * The defined type sequence :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The defined type sequence :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * Or: + * Or: - * The type definition sequence :math:`{{\mathit{type}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{type}}_1~{{\mathit{type}}^\ast}`. + * The type definition sequence :math:`{{\mathit{type}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{\mathit{type}}_1~{{\mathit{type}}^\ast}`. - * The defined type sequence :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{dt}}_1^\ast}~{{\mathit{dt}}^\ast}`. + * The defined type sequence :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{{\mathit{dt}}_1^\ast}~{{\mathit{dt}}^\ast}`. - * The type definition :math:`{\mathit{type}}_1` is valid with the defined type sequence :math:`{{\mathit{dt}}_1^\ast}`. + * The type definition :math:`{\mathit{type}}_1` is valid with the defined type sequence :math:`{{\mathit{dt}}_1^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the defined type sequence :math:`{{\mathit{dt}}_1^\ast}` appended to the field :math:`\mathsf{types}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the defined type sequence :math:`{{\mathit{dt}}_1^\ast}` appended to the field :math:`\mathsf{types}`. - * Under the context :math:`{C'}`, the type definition sequence :math:`{{\mathit{type}}^\ast}` is valid with the defined type sequence :math:`{{\mathit{dt}}^\ast}`. + * Under the context :math:`{C'}`, the type definition sequence :math:`{{\mathit{type}}^\ast}` is valid with the defined type sequence :math:`{{\mathit{dt}}^\ast}`. @@ -16048,11 +16048,11 @@ The defined type sequence :math:`\epsilon` is valid with the defined type sequen The type definition sequence :math:`{\mathit{type}}_1~{{\mathit{type}}^\ast}` is valid with the defined type sequence :math:`{{\mathit{dt}}_1^\ast}~{{\mathit{dt}}^\ast}` if: - * The type definition :math:`{\mathit{type}}_1` is valid with the defined type sequence :math:`{{\mathit{dt}}_1^\ast}`. + * The type definition :math:`{\mathit{type}}_1` is valid with the defined type sequence :math:`{{\mathit{dt}}_1^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the defined type sequence :math:`{{\mathit{dt}}_1^\ast}` appended to the field :math:`\mathsf{types}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the defined type sequence :math:`{{\mathit{dt}}_1^\ast}` appended to the field :math:`\mathsf{types}`. - * Under the context :math:`{C'}`, the type definition sequence :math:`{{\mathit{type}}^\ast}` is valid with the defined type sequence :math:`{{\mathit{dt}}^\ast}`. + * Under the context :math:`{C'}`, the type definition sequence :math:`{{\mathit{type}}^\ast}` is valid with the defined type sequence :math:`{{\mathit{dt}}^\ast}`. @@ -16060,83 +16060,83 @@ The type definition sequence :math:`{\mathit{type}}_1~{{\mathit{type}}^\ast}` is The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\ast}~{{\mathit{func}}^\ast}~{{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~{{\mathit{tag}}^\ast}~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast}~{{\mathit{start}}^?}~{{\mathit{export}}^\ast})` is valid with the module type :math:`t` if: - * Under the context :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{recs}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{tags}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon,\; \mathsf{refs}~\epsilon \}\end{array}`, the type definition sequence :math:`{{\mathit{type}}^\ast}` is valid with the defined type sequence :math:`{{\mathit{dt}'}^\ast}`. + * Under the context :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{recs}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{tags}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon,\; \mathsf{refs}~\epsilon \}\end{array}`, the type definition sequence :math:`{{\mathit{type}}^\ast}` is valid with the defined type sequence :math:`{{\mathit{dt}'}^\ast}`. - * :math:`{|{\mathit{xt}}_{\mathsf{i*}}|}` is equal to :math:`{|{\mathit{import*}}|}`. + * :math:`{|{\mathit{xt}}_{\mathsf{i*}}|}` is equal to :math:`{|{\mathit{import*}}|}`. - * For all :math:`{\mathit{import}}` in :math:`{{\mathit{import}}^\ast}` and :math:`{\mathit{xt}}_{\mathsf{i}}` in :math:`{{\mathit{xt}}_{\mathsf{i}}^\ast}`: + * For all :math:`{\mathit{import}}` in :math:`{{\mathit{import}}^\ast}` and :math:`{\mathit{xt}}_{\mathsf{i}}` in :math:`{{\mathit{xt}}_{\mathsf{i}}^\ast}`: - * Under the context :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{dt}'}^\ast},\; \mathsf{recs}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{tags}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon,\; \mathsf{refs}~\epsilon \}\end{array}`, the import :math:`{\mathit{import}}` is valid with the external type :math:`{\mathit{xt}}_{\mathsf{i}}`. + * Under the context :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{dt}'}^\ast},\; \mathsf{recs}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{tags}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon,\; \mathsf{refs}~\epsilon \}\end{array}`, the import :math:`{\mathit{import}}` is valid with the external type :math:`{\mathit{xt}}_{\mathsf{i}}`. - * Under the context :math:`{C'}`, the global sequence :math:`{{\mathit{global}}^\ast}` is valid with the global type sequence :math:`{{\mathit{gt}}^\ast}`. + * Under the context :math:`{C'}`, the global sequence :math:`{{\mathit{global}}^\ast}` is valid with the global type sequence :math:`{{\mathit{gt}}^\ast}`. - * :math:`{|{\mathit{tt*}}|}` is equal to :math:`{|{\mathit{table*}}|}`. + * :math:`{|{\mathit{tt*}}|}` is equal to :math:`{|{\mathit{table*}}|}`. - * For all :math:`{\mathit{table}}` in :math:`{{\mathit{table}}^\ast}` and :math:`{\mathit{tt}}` in :math:`{{\mathit{tt}}^\ast}`: + * For all :math:`{\mathit{table}}` in :math:`{{\mathit{table}}^\ast}` and :math:`{\mathit{tt}}` in :math:`{{\mathit{tt}}^\ast}`: - * Under the context :math:`{C'}`, the table :math:`{\mathit{table}}` is valid with the table type :math:`{\mathit{tt}}`. + * Under the context :math:`{C'}`, the table :math:`{\mathit{table}}` is valid with the table type :math:`{\mathit{tt}}`. - * :math:`{|{\mathit{mt*}}|}` is equal to :math:`{|{\mathit{mem*}}|}`. + * :math:`{|{\mathit{mt*}}|}` is equal to :math:`{|{\mathit{mem*}}|}`. - * For all :math:`{\mathit{mem}}` in :math:`{{\mathit{mem}}^\ast}` and :math:`{\mathit{mt}}` in :math:`{{\mathit{mt}}^\ast}`: + * For all :math:`{\mathit{mem}}` in :math:`{{\mathit{mem}}^\ast}` and :math:`{\mathit{mt}}` in :math:`{{\mathit{mt}}^\ast}`: - * Under the context :math:`{C'}`, the memory :math:`{\mathit{mem}}` is valid with the memory type :math:`{\mathit{mt}}`. + * Under the context :math:`{C'}`, the memory :math:`{\mathit{mem}}` is valid with the memory type :math:`{\mathit{mt}}`. - * :math:`{|{\mathit{tag*}}|}` is equal to :math:`{|{\mathit{jt*}}|}`. + * :math:`{|{\mathit{tag*}}|}` is equal to :math:`{|{\mathit{jt*}}|}`. - * For all :math:`{\mathit{jt}}` in :math:`{{\mathit{jt}}^\ast}` and :math:`{\mathit{tag}}` in :math:`{{\mathit{tag}}^\ast}`: + * For all :math:`{\mathit{jt}}` in :math:`{{\mathit{jt}}^\ast}` and :math:`{\mathit{tag}}` in :math:`{{\mathit{tag}}^\ast}`: - * Under the context :math:`{C'}`, the tag :math:`{\mathit{tag}}` is valid with the tag type :math:`{\mathit{jt}}`. + * Under the context :math:`{C'}`, the tag :math:`{\mathit{tag}}` is valid with the tag type :math:`{\mathit{jt}}`. - * :math:`{|{\mathit{func*}}|}` is equal to :math:`{|{\mathit{dt*}}|}`. + * :math:`{|{\mathit{func*}}|}` is equal to :math:`{|{\mathit{dt*}}|}`. - * For all :math:`{\mathit{dt}}` in :math:`{{\mathit{dt}}^\ast}` and :math:`{\mathit{func}}` in :math:`{{\mathit{func}}^\ast}`: + * For all :math:`{\mathit{dt}}` in :math:`{{\mathit{dt}}^\ast}` and :math:`{\mathit{func}}` in :math:`{{\mathit{func}}^\ast}`: - * The function :math:`{\mathit{func}}` is valid with the defined type :math:`{\mathit{dt}}`. + * The function :math:`{\mathit{func}}` is valid with the defined type :math:`{\mathit{dt}}`. - * :math:`{|{\mathit{rt*}}|}` is equal to :math:`{|{\mathit{elem*}}|}`. + * :math:`{|{\mathit{rt*}}|}` is equal to :math:`{|{\mathit{elem*}}|}`. - * For all :math:`{\mathit{elem}}` in :math:`{{\mathit{elem}}^\ast}` and :math:`{\mathit{rt}}` in :math:`{{\mathit{rt}}^\ast}`: + * For all :math:`{\mathit{elem}}` in :math:`{{\mathit{elem}}^\ast}` and :math:`{\mathit{rt}}` in :math:`{{\mathit{rt}}^\ast}`: - * The table segment :math:`{\mathit{elem}}` is valid with the element type :math:`{\mathit{rt}}`. + * The table segment :math:`{\mathit{elem}}` is valid with the element type :math:`{\mathit{rt}}`. - * :math:`{|{\mathit{ok*}}|}` is equal to :math:`{|{\mathit{data*}}|}`. + * :math:`{|{\mathit{ok*}}|}` is equal to :math:`{|{\mathit{data*}}|}`. - * For all :math:`{\mathit{data}}` in :math:`{{\mathit{data}}^\ast}` and :math:`{\mathit{ok}}` in :math:`{{\mathit{ok}}^\ast}`: + * For all :math:`{\mathit{data}}` in :math:`{{\mathit{data}}^\ast}` and :math:`{\mathit{ok}}` in :math:`{{\mathit{ok}}^\ast}`: - * The memory segment :math:`{\mathit{data}}` is valid with the data type :math:`{\mathit{ok}}`. + * The memory segment :math:`{\mathit{data}}` is valid with the data type :math:`{\mathit{ok}}`. - * If :math:`{\mathit{start}}` is defined, then: + * If :math:`{\mathit{start}}` is defined, then: - * The start function :math:`{\mathit{start}}` is valid. + * The start function :math:`{\mathit{start}}` is valid. - * :math:`{|{\mathit{nm*}}|}` is equal to :math:`{|{\mathit{export*}}|}`. + * :math:`{|{\mathit{nm*}}|}` is equal to :math:`{|{\mathit{export*}}|}`. - * :math:`{|{\mathit{xt}}_{\mathsf{e*}}|}` is equal to :math:`{|{\mathit{export*}}|}`. + * :math:`{|{\mathit{xt}}_{\mathsf{e*}}|}` is equal to :math:`{|{\mathit{export*}}|}`. - * For all :math:`{\mathit{export}}` in :math:`{{\mathit{export}}^\ast}` and :math:`{\mathit{nm}}` in :math:`{{\mathit{nm}}^\ast}` and :math:`{\mathit{xt}}_{\mathsf{e}}` in :math:`{{\mathit{xt}}_{\mathsf{e}}^\ast}`: + * For all :math:`{\mathit{export}}` in :math:`{{\mathit{export}}^\ast}` and :math:`{\mathit{nm}}` in :math:`{{\mathit{nm}}^\ast}` and :math:`{\mathit{xt}}_{\mathsf{e}}` in :math:`{{\mathit{xt}}_{\mathsf{e}}^\ast}`: - * The export :math:`{\mathit{export}}` is valid with the name :math:`{\mathit{nm}}` and the external type :math:`{\mathit{xt}}_{\mathsf{e}}`. + * The export :math:`{\mathit{export}}` is valid with the name :math:`{\mathit{nm}}` and the external type :math:`{\mathit{xt}}_{\mathsf{e}}`. - * :math:`{{\mathit{nm}}^\ast}~{\mathrm{disjoint}}` is equal to true. + * :math:`{{\mathit{nm}}^\ast}~{\mathrm{disjoint}}` is equal to true. - * The context :math:`C` is equal to :math:`{C'}{}[{.}\mathsf{globals} \mathrel{{=}{\oplus}} {{\mathit{gt}}^\ast}]{}[{.}\mathsf{tables} \mathrel{{=}{\oplus}} {{\mathit{tt}}_{\mathsf{i}}^\ast}~{{\mathit{tt}}^\ast}]{}[{.}\mathsf{mems} \mathrel{{=}{\oplus}} {{\mathit{mt}}_{\mathsf{i}}^\ast}~{{\mathit{mt}}^\ast}]{}[{.}\mathsf{tags} \mathrel{{=}{\oplus}} {{\mathit{jt}}_{\mathsf{i}}^\ast}~{{\mathit{jt}}^\ast}]{}[{.}\mathsf{elems} \mathrel{{=}{\oplus}} {{\mathit{rt}}^\ast}]{}[{.}\mathsf{datas} \mathrel{{=}{\oplus}} {{\mathit{ok}}^\ast}]`. + * The context :math:`C` is equal to :math:`{C'}{}[{.}\mathsf{globals} \mathrel{{=}{\oplus}} {{\mathit{gt}}^\ast}]{}[{.}\mathsf{tables} \mathrel{{=}{\oplus}} {{\mathit{tt}}_{\mathsf{i}}^\ast}~{{\mathit{tt}}^\ast}]{}[{.}\mathsf{mems} \mathrel{{=}{\oplus}} {{\mathit{mt}}_{\mathsf{i}}^\ast}~{{\mathit{mt}}^\ast}]{}[{.}\mathsf{tags} \mathrel{{=}{\oplus}} {{\mathit{jt}}_{\mathsf{i}}^\ast}~{{\mathit{jt}}^\ast}]{}[{.}\mathsf{elems} \mathrel{{=}{\oplus}} {{\mathit{rt}}^\ast}]{}[{.}\mathsf{datas} \mathrel{{=}{\oplus}} {{\mathit{ok}}^\ast}]`. - * The context :math:`{C'}` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{dt}'}^\ast},\; \mathsf{recs}~\epsilon,\; \mathsf{funcs}~{{\mathit{dt}}_{\mathsf{i}}^\ast}~{{\mathit{dt}}^\ast},\; \mathsf{globals}~{{\mathit{gt}}_{\mathsf{i}}^\ast},\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{tags}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon,\; \mathsf{refs}~{x^\ast} \}\end{array}`. + * The context :math:`{C'}` is equal to :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~{{\mathit{dt}'}^\ast},\; \mathsf{recs}~\epsilon,\; \mathsf{funcs}~{{\mathit{dt}}_{\mathsf{i}}^\ast}~{{\mathit{dt}}^\ast},\; \mathsf{globals}~{{\mathit{gt}}_{\mathsf{i}}^\ast},\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{tags}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon,\; \mathsf{return}~\epsilon,\; \mathsf{refs}~{x^\ast} \}\end{array}`. - * The function index sequence :math:`{x^\ast}` is equal to :math:`{\mathrm{funcidx}}({{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast})`. + * The function index sequence :math:`{x^\ast}` is equal to :math:`{\mathrm{funcidx}}({{\mathit{global}}^\ast}~{{\mathit{table}}^\ast}~{{\mathit{mem}}^\ast}~{{\mathit{elem}}^\ast}~{{\mathit{data}}^\ast})`. - * The defined type sequence :math:`{{\mathit{dt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{funcs}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. + * The defined type sequence :math:`{{\mathit{dt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{funcs}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. - * The global type sequence :math:`{{\mathit{gt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{globals}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. + * The global type sequence :math:`{{\mathit{gt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{globals}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. - * The table type sequence :math:`{{\mathit{tt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{tables}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. + * The table type sequence :math:`{{\mathit{tt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{tables}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. - * The memory type sequence :math:`{{\mathit{mt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{mems}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. + * The memory type sequence :math:`{{\mathit{mt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{mems}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. - * The tag type sequence :math:`{{\mathit{jt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{tags}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. + * The tag type sequence :math:`{{\mathit{jt}}_{\mathsf{i}}^\ast}` is equal to :math:`{\mathrm{tags}}({{\mathit{xt}}_{\mathsf{i}}^\ast})`. - * Let :math:`t` be the module type :math:`{{\mathrm{clos}}}_{C}({{\mathit{xt}}_{\mathsf{i}}^\ast}~\rightarrow~{{\mathit{xt}}_{\mathsf{e}}^\ast})`. + * Let :math:`t` be the module type :math:`{{\mathrm{clos}}}_{C}({{\mathit{xt}}_{\mathsf{i}}^\ast}~\rightarrow~{{\mathit{xt}}_{\mathsf{e}}^\ast})`. @@ -16144,38 +16144,38 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as The instruction sequence :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is valid with the function type :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}~\rightarrow~{t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}^\ast}` if: - * Either: + * Either: - * The instruction sequence :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{i{\scriptstyle 32}} {.} \mathsf{add})`. + * The instruction sequence :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{i{\scriptstyle 32}} {.} \mathsf{add})`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\mathsf{i{\scriptstyle 32}}~\mathsf{i{\scriptstyle 32}}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}^\ast}` is equal to :math:`\mathsf{i{\scriptstyle 32}}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}^\ast}` is equal to :math:`\mathsf{i{\scriptstyle 32}}`. - * Or: + * Or: - * The instruction sequence :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global{.}get}~x)`. + * The instruction sequence :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{global{.}get}~x)`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`\epsilon`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}^\ast}` is equal to :math:`t`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}^\ast}` is equal to :math:`t`. - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}~t)`. - * Or: + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}~t)`. + * Or: - * The instruction sequence :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{instr}}^\ast})`. + * The instruction sequence :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{instr}}^\ast})`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t_1^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}` is equal to :math:`{t_1^\ast}`. - * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}^\ast}` is equal to :math:`{t_2^\ast}`. + * The value type sequence :math:`{t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}^\ast}` is equal to :math:`{t_2^\ast}`. - * The block type :math:`{\mathit{blocktype}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The block type :math:`{\mathit{blocktype}}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the instruction type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. @@ -16188,9 +16188,9 @@ The instruction sequence :math:`(\mathsf{i{\scriptstyle 32}} {.} \mathsf{add})` The instruction sequence :math:`(\mathsf{global{.}get}~x)` is valid with the function type :math:`\epsilon~\rightarrow~t` if: - * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. + * The global type :math:`C{.}\mathsf{globals}{}[x]` exists. - * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}~t)`. + * The global type :math:`C{.}\mathsf{globals}{}[x]` is equal to :math:`({\mathsf{mut}^?}~t)`. @@ -16198,11 +16198,11 @@ The instruction sequence :math:`(\mathsf{global{.}get}~x)` is valid with the fun The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{instr}}^\ast})` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}` if: - * The block type :math:`{\mathit{blocktype}}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * The block type :math:`{\mathit{blocktype}}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. - * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. + * Let :math:`{C'}` be the same context as :math:`C`, but with the result type sequence :math:`{t_2^\ast}` prepended to the field :math:`\mathsf{labels}`. - * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. + * Under the context :math:`{C'}`, the instruction sequence :math:`{{\mathit{instr}}^\ast}` is valid with the function type :math:`{t_1^\ast}~\rightarrow~{t_2^\ast}`. :math:`\mathsf{unreachable}` @@ -16248,11 +16248,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`c \neq 0`, then: - a. Push the value :math:`{\mathit{val}}_1` to the stack. + a. Push the value :math:`{\mathit{val}}_1` to the stack. #. Else: - a. Push the value :math:`{\mathit{val}}_2` to the stack. + a. Push the value :math:`{\mathit{val}}_2` to the stack. :math:`\mathsf{if}~{\mathit{bt}}~{{\mathit{instr}}_1^\ast}~{{\mathit{instr}}_2^\ast}` @@ -16265,11 +16265,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`c \neq 0`, then: - a. Execute the instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}_1^\ast})`. + a. Execute the instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}_1^\ast})`. #. Else: - a. Execute the instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}_2^\ast})`. + a. Execute the instruction :math:`(\mathsf{block}~{\mathit{bt}}~{{\mathit{instr}}_2^\ast})`. :math:`\mathsf{label}` @@ -16291,43 +16291,43 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the first non-value entry of the stack is a :math:`\mathsf{label}`, then: - a. Let :math:`({{\mathsf{label}}_{n}}{\{}~{{\mathit{instr}'}^\ast}~\})` be the current :math:`\mathsf{label}` context. + a. Let :math:`({{\mathsf{label}}_{n}}{\{}~{{\mathit{instr}'}^\ast}~\})` be the current :math:`\mathsf{label}` context. - #. If :math:`l = 0`, then: + #. If :math:`l = 0`, then: - 1) Assert: Due to validation, there are at least :math:`n` values on the top of the stack. + 1) Assert: Due to validation, there are at least :math:`n` values on the top of the stack. - #) Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. + #) Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. - #) Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. + #) Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. - #) Pop the current :math:`\mathsf{label}` context from the stack. + #) Pop the current :math:`\mathsf{label}` context from the stack. - #) Push the values :math:`{{\mathit{val}}^{n}}` to the stack. + #) Push the values :math:`{{\mathit{val}}^{n}}` to the stack. - #) Execute the instruction :math:`{{\mathit{instr}'}^\ast}`. + #) Execute the instruction :math:`{{\mathit{instr}'}^\ast}`. - #. Else: + #. Else: - 1) Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + 1) Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #) If :math:`l > 0`, then: + #) If :math:`l > 0`, then: - a) Pop the current :math:`\mathsf{label}` context from the stack. + a) Pop the current :math:`\mathsf{label}` context from the stack. - #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #) Execute the instruction :math:`(\mathsf{br}~l - 1)`. + #) Execute the instruction :math:`(\mathsf{br}~l - 1)`. #. Else if the first non-value entry of the stack is a :math:`\mathsf{handler}`, then: - a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{handler}` context from the stack. + #. Pop the current :math:`\mathsf{handler}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #. Execute the instruction :math:`(\mathsf{br}~l)`. + #. Execute the instruction :math:`(\mathsf{br}~l)`. :math:`\mathsf{br\_if}~l` @@ -16340,11 +16340,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`c \neq 0`, then: - a. Execute the instruction :math:`(\mathsf{br}~l)`. + a. Execute the instruction :math:`(\mathsf{br}~l)`. #. Else: - a. Do nothing. + a. Do nothing. :math:`\mathsf{br\_table}~{l^\ast}~{l'}` @@ -16357,11 +16357,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i < {|{l^\ast}|}`, then: - a. Execute the instruction :math:`(\mathsf{br}~{l^\ast}{}[i])`. + a. Execute the instruction :math:`(\mathsf{br}~{l^\ast}{}[i])`. #. Else: - a. Execute the instruction :math:`(\mathsf{br}~{l'})`. + a. Execute the instruction :math:`(\mathsf{br}~{l'})`. :math:`\mathsf{br\_on\_null}~l` @@ -16374,11 +16374,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{val}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Execute the instruction :math:`(\mathsf{br}~l)`. + a. Execute the instruction :math:`(\mathsf{br}~l)`. #. Else: - a. Push the value :math:`{\mathit{val}}` to the stack. + a. Push the value :math:`{\mathit{val}}` to the stack. :math:`\mathsf{br\_on\_non\_null}~l` @@ -16391,13 +16391,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{val}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. Push the value :math:`{\mathit{val}}` to the stack. + a. Push the value :math:`{\mathit{val}}` to the stack. - #. Execute the instruction :math:`(\mathsf{br}~l)`. + #. Execute the instruction :math:`(\mathsf{br}~l)`. :math:`\mathsf{call\_indirect}~x~y` @@ -16447,39 +16447,39 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the first non-value entry of the stack is a :math:`\mathsf{frame}`, then: - a. Let :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` be the current :math:`\mathsf{frame}` context. + a. Let :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` be the current :math:`\mathsf{frame}` context. - #. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. + #. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. - #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. + #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. - #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. + #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{frame}` context from the stack. + #. Pop the current :math:`\mathsf{frame}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. + #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. #. Else if the first non-value entry of the stack is a :math:`\mathsf{label}`, then: - a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{label}` context from the stack. + #. Pop the current :math:`\mathsf{label}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #. Execute the instruction :math:`\mathsf{return}`. + #. Execute the instruction :math:`\mathsf{return}`. #. Else: - a. If the first non-value entry of the stack is a :math:`\mathsf{handler}`, then: + a. If the first non-value entry of the stack is a :math:`\mathsf{handler}`, then: - 1) Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + 1) Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #) Pop the current :math:`\mathsf{handler}` context from the stack. + #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #) Execute the instruction :math:`\mathsf{return}`. + #) Execute the instruction :math:`\mathsf{return}`. :math:`\mathsf{handler}` @@ -16505,7 +16505,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{|{{\mathit{unop}}}{{}_{{\mathit{nt}}}(c_1)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{unop}}}{{}_{{\mathit{nt}}}(c_1)}`. @@ -16526,7 +16526,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{|{{\mathit{binop}}}{{}_{{\mathit{nt}}}(c_1, c_2)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{binop}}}{{}_{{\mathit{nt}}}(c_1, c_2)}`. @@ -16573,7 +16573,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{|{{\mathit{cvtop}}}{{}_{{\mathit{nt}}_1, {\mathit{nt}}_2}(c_1)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{cvtop}}}{{}_{{\mathit{nt}}_1, {\mathit{nt}}_2}(c_1)}`. @@ -16601,11 +16601,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{ref}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. #. Else: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. :math:`\mathsf{ref{.}as\_non\_null}` @@ -16618,7 +16618,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{ref}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. Push the value :math:`{\mathit{ref}}` to the stack. @@ -16637,25 +16637,25 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{ref}}_1` is of the case :math:`\mathsf{ref{.}null}`, then: - a. If :math:`{\mathit{ref}}_2` is of the case :math:`\mathsf{ref{.}null}`, then: + a. If :math:`{\mathit{ref}}_2` is of the case :math:`\mathsf{ref{.}null}`, then: - 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. + 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. - #. Else if :math:`{\mathit{ref}}_1 = {\mathit{ref}}_2`, then: + #. Else if :math:`{\mathit{ref}}_1 = {\mathit{ref}}_2`, then: - 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. + 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. - #. Else: + #. Else: - 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. + 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. #. Else if :math:`{\mathit{ref}}_1 = {\mathit{ref}}_2`, then: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. #. Else: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. :math:`{\mathsf{i{\scriptstyle 31}{.}get}}{\mathsf{\_}}{{\mathit{sx}}}` @@ -16668,13 +16668,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}i{\scriptstyle 31}}`, then: - a. Let :math:`(\mathsf{ref{.}i{\scriptstyle 31}}~i)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}i{\scriptstyle 31}}~i)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{{{{\mathrm{extend}}}_{31, 32}^{{\mathit{sx}}}}}{(i)})` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{{{{\mathrm{extend}}}_{31, 32}^{{\mathit{sx}}}}}{(i)})` to the stack. :math:`\mathsf{array{.}new}~x` @@ -16704,13 +16704,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Push the value :math:`(\mathsf{ref{.}null}~\mathsf{extern})` to the stack. + a. Push the value :math:`(\mathsf{ref{.}null}~\mathsf{extern})` to the stack. #. If the type of :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is address value, then: - a. Let :math:`{\mathit{addrref}}` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{addrref}}` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Push the value :math:`(\mathsf{ref{.}extern}~{\mathit{addrref}})` to the stack. + #. Push the value :math:`(\mathsf{ref{.}extern}~{\mathit{addrref}})` to the stack. :math:`\mathsf{any{.}convert\_extern}` @@ -16723,13 +16723,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Push the value :math:`(\mathsf{ref{.}null}~\mathsf{any})` to the stack. + a. Push the value :math:`(\mathsf{ref{.}null}~\mathsf{any})` to the stack. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}extern}`, then: - a. Let :math:`(\mathsf{ref{.}extern}~{\mathit{addrref}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}extern}~{\mathit{addrref}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Push the value :math:`{\mathit{addrref}}` to the stack. + #. Push the value :math:`{\mathit{addrref}}` to the stack. :math:`\mathsf{v{\scriptstyle 128}} {.} {\mathit{vvunop}}` @@ -16812,7 +16812,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{|{{\mathit{vunop}}}{{}_{{\mathit{sh}}}(c_1)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{vunop}}}{{}_{{\mathit{sh}}}(c_1)}`. @@ -16833,7 +16833,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{|{{\mathit{vbinop}}}{{}_{{\mathit{sh}}}(c_1, c_2)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{vbinop}}}{{}_{{\mathit{sh}}}(c_1, c_2)}`. @@ -16858,7 +16858,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{|{{\mathit{vternop}}}{{}_{{\mathit{sh}}}(c_1, c_2, c_3)}|} \leq 0`, then: - a. Trap. + a. Trap. #. Let :math:`c` be an element of :math:`{{\mathit{vternop}}}{{}_{{\mathit{sh}}}(c_1, c_2, c_3)}`. @@ -16984,27 +16984,27 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined and the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{nt}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{nt}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`i < {|{{\mathrm{lanes}}}_{{{\mathit{nt}}}{\mathsf{x}}{M}}(c_1)|}`, then: + #. If :math:`i < {|{{\mathrm{lanes}}}_{{{\mathit{nt}}}{\mathsf{x}}{M}}(c_1)|}`, then: - 1) Let :math:`c_2` be :math:`{{\mathrm{lanes}}}_{{{\mathit{nt}}}{\mathsf{x}}{M}}(c_1){}[i]`. + 1) Let :math:`c_2` be :math:`{{\mathrm{lanes}}}_{{{\mathit{nt}}}{\mathsf{x}}{M}}(c_1){}[i]`. - #) Push the value :math:`({\mathit{nt}}{.}\mathsf{const}~c_2)` to the stack. + #) Push the value :math:`({\mathit{nt}}{.}\mathsf{const}~c_2)` to the stack. #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type, then: - a. Let :math:`{\mathit{pt}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{pt}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + #. If :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`{\mathit{sx}}` be :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`{\mathit{sx}}` be :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) If :math:`i < {|{{\mathrm{lanes}}}_{{{\mathit{pt}}}{\mathsf{x}}{M}}(c_1)|}`, then: + #) If :math:`i < {|{{\mathrm{lanes}}}_{{{\mathit{pt}}}{\mathsf{x}}{M}}(c_1)|}`, then: - a) Let :math:`c_2` be :math:`{{{{\mathrm{extend}}}_{{|{\mathit{pt}}|}, 32}^{{\mathit{sx}}}}}{({{\mathrm{lanes}}}_{{{\mathit{pt}}}{\mathsf{x}}{M}}(c_1){}[i])}`. + a) Let :math:`c_2` be :math:`{{{{\mathrm{extend}}}_{{|{\mathit{pt}}|}, 32}^{{\mathit{sx}}}}}{({{\mathrm{lanes}}}_{{{\mathit{pt}}}{\mathsf{x}}{M}}(c_1){}[i])}`. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~c_2)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~c_2)` to the stack. :math:`{{\mathsf{i}}{N}}{\mathsf{x}}{M}{.}\mathsf{replace\_lane}~i` @@ -17164,7 +17164,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{ref}}` is not :ref:`valid <valid-val>`, then: - a. Fail. + a. Fail. #. Let :math:`{\mathit{rt}}` be the type of :math:`{\mathit{ref}}`. @@ -17172,11 +17172,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{rt}}` does not match :math:`{{\mathrm{inst}}}_{f{.}\mathsf{module}}({\mathit{rt}}_2)`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. Execute the instruction :math:`(\mathsf{br}~l)`. + a. Execute the instruction :math:`(\mathsf{br}~l)`. :math:`\mathsf{br\_on\_cast\_fail}~l~{\mathit{rt}}_1~{\mathit{rt}}_2` @@ -17191,7 +17191,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{ref}}` is not :ref:`valid <valid-val>`, then: - a. Fail. + a. Fail. #. Let :math:`{\mathit{rt}}` be the type of :math:`{\mathit{ref}}`. @@ -17199,11 +17199,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{rt}}` matches :math:`{{\mathrm{inst}}}_{f{.}\mathsf{module}}({\mathit{rt}}_2)`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. Execute the instruction :math:`(\mathsf{br}~l)`. + a. Execute the instruction :math:`(\mathsf{br}~l)`. :math:`\mathsf{call}~x` @@ -17235,39 +17235,39 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}func}`, then: - a. Let :math:`(\mathsf{ref{.}func}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}func}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`a < {|z{.}\mathsf{funcs}|}`, then: + #. If :math:`a < {|z{.}\mathsf{funcs}|}`, then: - 1) Let :math:`{\mathit{fi}}` be :math:`z{.}\mathsf{funcs}{}[a]`. + 1) Let :math:`{\mathit{fi}}` be :math:`z{.}\mathsf{funcs}{}[a]`. - #) Assert: Due to validation, :math:`{\mathit{fi}}{.}\mathsf{code}` is of the case :math:`\mathsf{func}`. + #) Assert: Due to validation, :math:`{\mathit{fi}}{.}\mathsf{code}` is of the case :math:`\mathsf{func}`. - #) Let :math:`(\mathsf{func}~x~{{\mathit{local}}_0^\ast}~{{\mathit{instr}}^\ast})` be :math:`{\mathit{fi}}{.}\mathsf{code}`. + #) Let :math:`(\mathsf{func}~x~{{\mathit{local}}_0^\ast}~{{\mathit{instr}}^\ast})` be :math:`{\mathit{fi}}{.}\mathsf{code}`. - #) If for all :math:`{\mathit{local}}_0` in :math:`{{\mathit{local}}_0^\ast}`, :math:`{\mathit{local}}_0` is of the case :math:`\mathsf{local}`, then: + #) If for all :math:`{\mathit{local}}_0` in :math:`{{\mathit{local}}_0^\ast}`, :math:`{\mathit{local}}_0` is of the case :math:`\mathsf{local}`, then: - a) Let :math:`{(\mathsf{local}~t)^\ast}` be :math:`{{\mathit{local}}_0^\ast}`. + a) Let :math:`{(\mathsf{local}~t)^\ast}` be :math:`{{\mathit{local}}_0^\ast}`. - #) Assert: Due to validation, :math:`{\mathrm{expand}}({\mathit{fi}}{.}\mathsf{type})` is of the case :math:`\mathsf{func}`. + #) Assert: Due to validation, :math:`{\mathrm{expand}}({\mathit{fi}}{.}\mathsf{type})` is of the case :math:`\mathsf{func}`. - #) Let :math:`(\mathsf{func}~{\mathit{functype}}_0)` be :math:`{\mathrm{expand}}({\mathit{fi}}{.}\mathsf{type})`. + #) Let :math:`(\mathsf{func}~{\mathit{functype}}_0)` be :math:`{\mathrm{expand}}({\mathit{fi}}{.}\mathsf{type})`. - #) Let :math:`{t_1^{n}}~\rightarrow~{t_2^{m}}` be :math:`{\mathit{functype}}_0`. + #) Let :math:`{t_1^{n}}~\rightarrow~{t_2^{m}}` be :math:`{\mathit{functype}}_0`. - #) Assert: Due to validation, there are at least :math:`n` values on the top of the stack. + #) Assert: Due to validation, there are at least :math:`n` values on the top of the stack. - #) Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. + #) Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. - #) Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~{{\mathit{val}}^{n}}~{{{\mathrm{default}}}_{t}^\ast},\; \mathsf{module}~{\mathit{fi}}{.}\mathsf{module} \}\end{array}`. + #) Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~{{\mathit{val}}^{n}}~{{{\mathrm{default}}}_{t}^\ast},\; \mathsf{module}~{\mathit{fi}}{.}\mathsf{module} \}\end{array}`. - #) Push the frame :math:`({{\mathsf{frame}}_{m}}{\{}~f~\})` to the stack. + #) Push the frame :math:`({{\mathsf{frame}}_{m}}{\{}~f~\})` to the stack. - #) Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{m}}{\{}~\epsilon~\})`. + #) Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{m}}{\{}~\epsilon~\})`. :math:`\mathsf{return\_call}~x` @@ -17295,65 +17295,65 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If the first non-value entry of the stack is a :math:`\mathsf{label}`, then: - a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{label}` context from the stack. + #. Pop the current :math:`\mathsf{label}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #. Execute the instruction :math:`(\mathsf{return\_call\_ref}~y)`. + #. Execute the instruction :math:`(\mathsf{return\_call\_ref}~y)`. #. Else if the first non-value entry of the stack is a :math:`\mathsf{handler}`, then: - a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + a. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{handler}` context from the stack. + #. Pop the current :math:`\mathsf{handler}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #. Execute the instruction :math:`(\mathsf{return\_call\_ref}~y)`. + #. Execute the instruction :math:`(\mathsf{return\_call\_ref}~y)`. #. Else: - a. If the first non-value entry of the stack is a :math:`\mathsf{frame}`, then: + a. If the first non-value entry of the stack is a :math:`\mathsf{frame}`, then: - 1) Assert: Due to validation, an :ref:`instruction <syntax-instr>` is on the top of the stack. + 1) Assert: Due to validation, an :ref:`instruction <syntax-instr>` is on the top of the stack. - #) Pop the value :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` from the stack. + #) Pop the value :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` from the stack. - #) If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: + #) If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a) Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + a) Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #) Pop the current :math:`\mathsf{frame}` context from the stack. + #) Pop the current :math:`\mathsf{frame}` context from the stack. - #) Trap. + #) Trap. - #) If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}func}`, then: + #) If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}func}`, then: - a) Let :math:`(\mathsf{ref{.}func}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`(\mathsf{ref{.}func}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`a < {|z{.}\mathsf{funcs}|}`, then: + #) If :math:`a < {|z{.}\mathsf{funcs}|}`, then: - 1. Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{funcs}{}[a]{.}\mathsf{type})` is of the case :math:`\mathsf{func}`. + 1. Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{funcs}{}[a]{.}\mathsf{type})` is of the case :math:`\mathsf{func}`. - #. Let :math:`(\mathsf{func}~{\mathit{functype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{funcs}{}[a]{.}\mathsf{type})`. + #. Let :math:`(\mathsf{func}~{\mathit{functype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{funcs}{}[a]{.}\mathsf{type})`. - #. Let :math:`{t_1^{n}}~\rightarrow~{t_2^{m}}` be :math:`{\mathit{functype}}_0`. + #. Let :math:`{t_1^{n}}~\rightarrow~{t_2^{m}}` be :math:`{\mathit{functype}}_0`. - #. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. + #. Assert: Due to validation, there are at least :math:`n` values on the top of the stack. - #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. + #. Pop the values :math:`{{\mathit{val}}^{n}}` from the stack. - #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. + #. Pop all values :math:`{{\mathit{val}'}^\ast}` from the top of the stack. - #. Pop the current :math:`\mathsf{frame}` context from the stack. + #. Pop the current :math:`\mathsf{frame}` context from the stack. - #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. + #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. - #. Push the value :math:`(\mathsf{ref{.}func}~a)` to the stack. + #. Push the value :math:`(\mathsf{ref{.}func}~a)` to the stack. - #. Execute the instruction :math:`(\mathsf{call\_ref}~y)`. + #. Execute the instruction :math:`(\mathsf{call\_ref}~y)`. :math:`\mathsf{throw\_ref}` @@ -17368,191 +17368,191 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}exn}`, then: - a. Let :math:`(\mathsf{ref{.}exn}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}exn}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. + #. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. - #. If :math:`{{\mathit{val}}^\ast} \neq \epsilon`, then: + #. If :math:`{{\mathit{val}}^\ast} \neq \epsilon`, then: - 1) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + 1) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #) Execute the instruction :math:`\mathsf{throw\_ref}`. + #) Execute the instruction :math:`\mathsf{throw\_ref}`. - #. Else if the first non-value entry of the stack is a :math:`\mathsf{label}`, then: + #. Else if the first non-value entry of the stack is a :math:`\mathsf{label}`, then: - 1) Pop the current :math:`\mathsf{label}` context from the stack. + 1) Pop the current :math:`\mathsf{label}` context from the stack. - #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #) Execute the instruction :math:`\mathsf{throw\_ref}`. + #) Execute the instruction :math:`\mathsf{throw\_ref}`. - #. Else: + #. Else: - 1) If the first non-value entry of the stack is a :math:`\mathsf{frame}`, then: + 1) If the first non-value entry of the stack is a :math:`\mathsf{frame}`, then: - a) Pop the current :math:`\mathsf{frame}` context from the stack. + a) Pop the current :math:`\mathsf{frame}` context from the stack. - #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #) Execute the instruction :math:`\mathsf{throw\_ref}`. + #) Execute the instruction :math:`\mathsf{throw\_ref}`. - #) Else if not the first non-value entry of the stack is a :math:`\mathsf{handler}`, then: + #) Else if not the first non-value entry of the stack is a :math:`\mathsf{handler}`, then: - a) Throw the exception :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` as a result. + a) Throw the exception :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` as a result. - #) Else: + #) Else: - a) Let :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}~\})` be the current :math:`\mathsf{handler}` context. + a) Let :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}~\})` be the current :math:`\mathsf{handler}` context. - #) If :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: + #) If :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - 1. Pop the current :math:`\mathsf{handler}` context from the stack. + 1. Pop the current :math:`\mathsf{handler}` context from the stack. - #. Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #. Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #. Execute the instruction :math:`\mathsf{throw\_ref}`. + #. Execute the instruction :math:`\mathsf{throw\_ref}`. - #) Else if :math:`a \geq {|z{.}\mathsf{exns}|}`, then: + #) Else if :math:`a \geq {|z{.}\mathsf{exns}|}`, then: - 1. Let :math:`{\mathit{catch}}_0~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + 1. Let :math:`{\mathit{catch}}_0~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. If :math:`{\mathit{catch}}_0` is of the case :math:`\mathsf{catch\_all}`, then: + #. If :math:`{\mathit{catch}}_0` is of the case :math:`\mathsf{catch\_all}`, then: - a. Let :math:`(\mathsf{catch\_all}~l)` be :math:`{\mathit{catch}}_0`. + a. Let :math:`(\mathsf{catch\_all}~l)` be :math:`{\mathit{catch}}_0`. - #. Pop the current :math:`\mathsf{handler}` context from the stack. + #. Pop the current :math:`\mathsf{handler}` context from the stack. - #. Execute the instruction :math:`(\mathsf{br}~l)`. + #. Execute the instruction :math:`(\mathsf{br}~l)`. - #. Else if :math:`{\mathit{catch}}_0` is not of the case :math:`\mathsf{catch\_all\_ref}`, then: + #. Else if :math:`{\mathit{catch}}_0` is not of the case :math:`\mathsf{catch\_all\_ref}`, then: - a. Let :math:`{\mathit{catch}}~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + a. Let :math:`{\mathit{catch}}~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Pop the current :math:`\mathsf{handler}` context from the stack. + #. Pop the current :math:`\mathsf{handler}` context from the stack. - #. Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #. Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. - #. Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #. Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #. Execute the instruction :math:`\mathsf{throw\_ref}`. + #. Execute the instruction :math:`\mathsf{throw\_ref}`. - #. Else: + #. Else: - a. Let :math:`(\mathsf{catch\_all\_ref}~l)` be :math:`{\mathit{catch}}_0`. + a. Let :math:`(\mathsf{catch\_all\_ref}~l)` be :math:`{\mathit{catch}}_0`. - #. Pop the current :math:`\mathsf{handler}` context from the stack. + #. Pop the current :math:`\mathsf{handler}` context from the stack. - #. Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #. Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #. Execute the instruction :math:`(\mathsf{br}~l)`. + #. Execute the instruction :math:`(\mathsf{br}~l)`. - #) Else: + #) Else: - 1. Let :math:`{{\mathit{val}}^\ast}` be :math:`z{.}\mathsf{exns}{}[a]{.}\mathsf{fields}`. + 1. Let :math:`{{\mathit{val}}^\ast}` be :math:`z{.}\mathsf{exns}{}[a]{.}\mathsf{fields}`. - #. Let :math:`{\mathit{catch}}_0~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + #. Let :math:`{\mathit{catch}}_0~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. If :math:`{\mathit{catch}}_0` is of the case :math:`\mathsf{catch}`, then: + #. If :math:`{\mathit{catch}}_0` is of the case :math:`\mathsf{catch}`, then: - a. Let :math:`(\mathsf{catch}~x~l)` be :math:`{\mathit{catch}}_0`. + a. Let :math:`(\mathsf{catch}~x~l)` be :math:`{\mathit{catch}}_0`. - #. If :math:`x < {|z{.}\mathsf{tags}|}` and :math:`z{.}\mathsf{exns}{}[a]{.}\mathsf{tag} = z{.}\mathsf{tags}{}[x]`, then: + #. If :math:`x < {|z{.}\mathsf{tags}|}` and :math:`z{.}\mathsf{exns}{}[a]{.}\mathsf{tag} = z{.}\mathsf{tags}{}[x]`, then: - 1) Pop the current :math:`\mathsf{handler}` context from the stack. + 1) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #) Execute the instruction :math:`(\mathsf{br}~l)`. + #) Execute the instruction :math:`(\mathsf{br}~l)`. - #. Else: + #. Else: - 1) Let :math:`{\mathit{catch}}~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + 1) Let :math:`{\mathit{catch}}~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #) Pop the current :math:`\mathsf{handler}` context from the stack. + #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. - #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #) Execute the instruction :math:`\mathsf{throw\_ref}`. + #) Execute the instruction :math:`\mathsf{throw\_ref}`. - #. Else if :math:`{\mathit{catch}}_0` is of the case :math:`\mathsf{catch\_ref}`, then: + #. Else if :math:`{\mathit{catch}}_0` is of the case :math:`\mathsf{catch\_ref}`, then: - a. Let :math:`(\mathsf{catch\_ref}~x~l)` be :math:`{\mathit{catch}}_0`. + a. Let :math:`(\mathsf{catch\_ref}~x~l)` be :math:`{\mathit{catch}}_0`. - #. If :math:`x \geq {|z{.}\mathsf{tags}|}`, then: + #. If :math:`x \geq {|z{.}\mathsf{tags}|}`, then: - 1) Let :math:`{\mathit{catch}}~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + 1) Let :math:`{\mathit{catch}}~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #) Pop the current :math:`\mathsf{handler}` context from the stack. + #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. - #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #) Execute the instruction :math:`\mathsf{throw\_ref}`. + #) Execute the instruction :math:`\mathsf{throw\_ref}`. - #. Else if :math:`z{.}\mathsf{exns}{}[a]{.}\mathsf{tag} \neq z{.}\mathsf{tags}{}[x]`, then: + #. Else if :math:`z{.}\mathsf{exns}{}[a]{.}\mathsf{tag} \neq z{.}\mathsf{tags}{}[x]`, then: - 1) Let :math:`{\mathit{catch}}~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + 1) Let :math:`{\mathit{catch}}~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #) Pop the current :math:`\mathsf{handler}` context from the stack. + #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. - #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #) Execute the instruction :math:`\mathsf{throw\_ref}`. + #) Execute the instruction :math:`\mathsf{throw\_ref}`. - #. Else: + #. Else: - 1) Pop the current :math:`\mathsf{handler}` context from the stack. + 1) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. + #) Push the values :math:`{{\mathit{val}}^\ast}` to the stack. - #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #) Execute the instruction :math:`(\mathsf{br}~l)`. + #) Execute the instruction :math:`(\mathsf{br}~l)`. - #. Else: + #. Else: - a. If :math:`{\mathit{catch}}_0` is of the case :math:`\mathsf{catch\_all}`, then: + a. If :math:`{\mathit{catch}}_0` is of the case :math:`\mathsf{catch\_all}`, then: - 1) Let :math:`(\mathsf{catch\_all}~l)` be :math:`{\mathit{catch}}_0`. + 1) Let :math:`(\mathsf{catch\_all}~l)` be :math:`{\mathit{catch}}_0`. - #) Pop the current :math:`\mathsf{handler}` context from the stack. + #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Execute the instruction :math:`(\mathsf{br}~l)`. + #) Execute the instruction :math:`(\mathsf{br}~l)`. - #. Else if :math:`{\mathit{catch}}_0` is not of the case :math:`\mathsf{catch\_all\_ref}`, then: + #. Else if :math:`{\mathit{catch}}_0` is not of the case :math:`\mathsf{catch\_all\_ref}`, then: - 1) Let :math:`{\mathit{catch}}~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + 1) Let :math:`{\mathit{catch}}~{{\mathit{catch}'}^\ast}` be :math:`{{\mathit{catch}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #) Pop the current :math:`\mathsf{handler}` context from the stack. + #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. - #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #) Execute the instruction :math:`\mathsf{throw\_ref}`. + #) Execute the instruction :math:`\mathsf{throw\_ref}`. - #. Else: + #. Else: - 1) Let :math:`(\mathsf{catch\_all\_ref}~l)` be :math:`{\mathit{catch}}_0`. + 1) Let :math:`(\mathsf{catch\_all\_ref}~l)` be :math:`{\mathit{catch}}_0`. - #) Pop the current :math:`\mathsf{handler}` context from the stack. + #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. - #) Execute the instruction :math:`(\mathsf{br}~l)`. + #) Execute the instruction :math:`(\mathsf{br}~l)`. #. Else if not the first non-value entry of the stack is a :math:`\mathsf{label}` and not the first non-value entry of the stack is a :math:`\mathsf{frame}` and not the first non-value entry of the stack is a :math:`\mathsf{handler}`, then: - a. Throw the exception :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` as a result. + a. Throw the exception :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` as a result. :math:`\mathsf{try\_table}~{\mathit{bt}}~{{\mathit{catch}}^\ast}~{{\mathit{instr}}^\ast}` @@ -17604,17 +17604,17 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{ref}}` is not :ref:`valid <valid-val>`, then: - a. Fail. + a. Fail. #. Let :math:`{\mathit{rt}'}` be the type of :math:`{\mathit{ref}}`. #. If :math:`{\mathit{rt}'}` matches :math:`{{\mathrm{inst}}}_{f{.}\mathsf{module}}({\mathit{rt}})`, then: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1)` to the stack. #. Else: - a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. + a. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0)` to the stack. :math:`\mathsf{ref{.}cast}~{\mathit{rt}}` @@ -17629,13 +17629,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{ref}}` is not :ref:`valid <valid-val>`, then: - a. Fail. + a. Fail. #. Let :math:`{\mathit{rt}'}` be the type of :math:`{\mathit{ref}}`. #. If :math:`{\mathit{rt}'}` does not match :math:`{{\mathrm{inst}}}_{f{.}\mathsf{module}}({\mathit{rt}})`, then: - a. Trap. + a. Trap. #. Push the value :math:`{\mathit{ref}}` to the stack. @@ -17675,23 +17675,23 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}struct}`, then: - a. Let :math:`(\mathsf{ref{.}struct}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}struct}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`i < {|z{.}\mathsf{structs}{}[a]{.}\mathsf{fields}|}` and :math:`a < {|z{.}\mathsf{structs}|}`, then: + #. If :math:`i < {|z{.}\mathsf{structs}{}[a]{.}\mathsf{fields}|}` and :math:`a < {|z{.}\mathsf{structs}|}`, then: - 1) Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{struct}`. + 1) Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{struct}`. - #) Let :math:`(\mathsf{struct}~{\mathit{structtype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. + #) Let :math:`(\mathsf{struct}~{\mathit{structtype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #) Let :math:`{({\mathsf{mut}^?}~{\mathit{zt}})^\ast}` be :math:`{\mathit{structtype}}_0`. + #) Let :math:`{({\mathsf{mut}^?}~{\mathit{zt}})^\ast}` be :math:`{\mathit{structtype}}_0`. - #) If :math:`i < {|{{\mathit{zt}}^\ast}|}`, then: + #) If :math:`i < {|{{\mathit{zt}}^\ast}|}`, then: - a) Push the value :math:`{{{{\mathrm{unpack}}}_{{{\mathit{zt}}^\ast}{}[i]}^{{{\mathit{sx}}^?}}}}{(z{.}\mathsf{structs}{}[a]{.}\mathsf{fields}{}[i])}` to the stack. + a) Push the value :math:`{{{{\mathrm{unpack}}}_{{{\mathit{zt}}^\ast}{}[i]}^{{{\mathit{sx}}^?}}}}{(z{.}\mathsf{structs}{}[a]{.}\mathsf{fields}{}[i])}` to the stack. :math:`\mathsf{array{.}new\_default}~x` @@ -17735,7 +17735,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + n > {|z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. Assert: Due to validation, :math:`{|z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}{}[i : n]|} = n`. @@ -17768,7 +17768,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + n \cdot {|{\mathit{zt}}|} / 8 > {|z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. Assert: Due to validation, the length of :math:`({\mathit{fresh}}_1)` for which :math:`{\bigoplus}\, {\mathit{fresh}}_1` :math:`=` :math:`z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}{}[i : n \cdot {|{\mathit{zt}}|} / 8]` is :math:`n`. @@ -17797,25 +17797,25 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}array}`, then: - a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`a < {|z{.}\mathsf{arrays}|}` and :math:`i \geq {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}`, then: + #. If :math:`a < {|z{.}\mathsf{arrays}|}` and :math:`i \geq {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}`, then: - 1) Trap. + 1) Trap. - #. If :math:`i < {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}` and :math:`a < {|z{.}\mathsf{arrays}|}`, then: + #. If :math:`i < {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}` and :math:`a < {|z{.}\mathsf{arrays}|}`, then: - 1) Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{array}`. + 1) Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{array}`. - #) Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. + #) Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #) Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. + #) Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. - #) Push the value :math:`{{{{\mathrm{unpack}}}_{{\mathit{zt}}}^{{{\mathit{sx}}^?}}}}{(z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i])}` to the stack. + #) Push the value :math:`{{{{\mathrm{unpack}}}_{{\mathit{zt}}}^{{{\mathit{sx}}^?}}}}{(z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i])}` to the stack. :math:`\mathsf{array{.}len}` @@ -17830,15 +17830,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}array}`, then: - a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`a < {|z{.}\mathsf{arrays}|}`, then: + #. If :math:`a < {|z{.}\mathsf{arrays}|}`, then: - 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|})` to the stack. + 1) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~{|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|})` to the stack. :math:`\mathsf{array{.}fill}~x` @@ -17865,43 +17865,43 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}array}`, then: - a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`a \geq {|z{.}\mathsf{arrays}|}`, then: + #. If :math:`a \geq {|z{.}\mathsf{arrays}|}`, then: - 1) Do nothing. + 1) Do nothing. - #. Else if :math:`i + n > {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}`, then: + #. Else if :math:`i + n > {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}`, then: - 1) Trap. + 1) Trap. - #. If :math:`n = 0`, then: + #. If :math:`n = 0`, then: - 1) Do nothing. + 1) Do nothing. - #. Else: + #. Else: - 1) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. + 1) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #) Push the value :math:`{\mathit{val}}` to the stack. + #) Push the value :math:`{\mathit{val}}` to the stack. - #) Execute the instruction :math:`(\mathsf{array{.}set}~x)`. + #) Execute the instruction :math:`(\mathsf{array{.}set}~x)`. - #) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. - #) Push the value :math:`{\mathit{val}}` to the stack. + #) Push the value :math:`{\mathit{val}}` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #) Execute the instruction :math:`(\mathsf{array{.}fill}~x)`. + #) Execute the instruction :math:`(\mathsf{array{.}fill}~x)`. :math:`\mathsf{array{.}copy}~x_1~x_2` @@ -17932,105 +17932,105 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is of the case :math:`\mathsf{ref{.}null}` and the type of :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is reference value, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}` and the type of :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is reference value, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is of the case :math:`\mathsf{ref{.}array}`, then: - a. Let :math:`(\mathsf{ref{.}array}~a_1)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + a. Let :math:`(\mathsf{ref{.}array}~a_1)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}array}`, then: + #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}array}`, then: - 1) If :math:`a_1 < {|z{.}\mathsf{arrays}|}` and :math:`i_1 + n > {|z{.}\mathsf{arrays}{}[a_1]{.}\mathsf{fields}|}`, then: + 1) If :math:`a_1 < {|z{.}\mathsf{arrays}|}` and :math:`i_1 + n > {|z{.}\mathsf{arrays}{}[a_1]{.}\mathsf{fields}|}`, then: - a) Trap. + a) Trap. - #) Let :math:`(\mathsf{ref{.}array}~a_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`(\mathsf{ref{.}array}~a_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`a_2 \geq {|z{.}\mathsf{arrays}|}`, then: + #) If :math:`a_2 \geq {|z{.}\mathsf{arrays}|}`, then: - a) Do nothing. + a) Do nothing. - #) Else if :math:`i_2 + n > {|z{.}\mathsf{arrays}{}[a_2]{.}\mathsf{fields}|}`, then: + #) Else if :math:`i_2 + n > {|z{.}\mathsf{arrays}{}[a_2]{.}\mathsf{fields}|}`, then: - a) Trap. + a) Trap. - #) If :math:`n = 0`, then: + #) If :math:`n = 0`, then: - a) Do nothing. + a) Do nothing. - #) Else if :math:`i_1 \leq i_2` and :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x_2])` is of the case :math:`\mathsf{array}`, then: + #) Else if :math:`i_1 \leq i_2` and :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x_2])` is of the case :math:`\mathsf{array}`, then: - a) Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x_2])`. + a) Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x_2])`. - #) Let :math:`({\mathsf{mut}^?}~{\mathit{zt}}_2)` be :math:`{\mathit{arraytype}}_0`. + #) Let :math:`({\mathsf{mut}^?}~{\mathit{zt}}_2)` be :math:`{\mathit{arraytype}}_0`. - #) Let :math:`{{\mathit{sx}}^?}` be :math:`{\mathrm{sx}}({\mathit{zt}}_2)`. + #) Let :math:`{{\mathit{sx}}^?}` be :math:`{\mathrm{sx}}({\mathit{zt}}_2)`. - #) Push the value :math:`(\mathsf{ref{.}array}~a_1)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}array}~a_1)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_1)` to the stack. - #) Push the value :math:`(\mathsf{ref{.}array}~a_2)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}array}~a_2)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_2)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_2)` to the stack. - #) Execute the instruction :math:`({\mathsf{array{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~x_2)`. + #) Execute the instruction :math:`({\mathsf{array{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~x_2)`. - #) Execute the instruction :math:`(\mathsf{array{.}set}~x_1)`. + #) Execute the instruction :math:`(\mathsf{array{.}set}~x_1)`. - #) Push the value :math:`(\mathsf{ref{.}array}~a_1)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}array}~a_1)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_1 + 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_1 + 1)` to the stack. - #) Push the value :math:`(\mathsf{ref{.}array}~a_2)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}array}~a_2)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_2 + 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_2 + 1)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #) Execute the instruction :math:`(\mathsf{array{.}copy}~x_1~x_2)`. + #) Execute the instruction :math:`(\mathsf{array{.}copy}~x_1~x_2)`. - #) Else: + #) Else: - a) If :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x_2])` is of the case :math:`\mathsf{array}`, then: + a) If :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x_2])` is of the case :math:`\mathsf{array}`, then: - 1. Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x_2])`. + 1. Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x_2])`. - #. Let :math:`({\mathsf{mut}^?}~{\mathit{zt}}_2)` be :math:`{\mathit{arraytype}}_0`. + #. Let :math:`({\mathsf{mut}^?}~{\mathit{zt}}_2)` be :math:`{\mathit{arraytype}}_0`. - #. Let :math:`{{\mathit{sx}}^?}` be :math:`{\mathrm{sx}}({\mathit{zt}}_2)`. + #. Let :math:`{{\mathit{sx}}^?}` be :math:`{\mathrm{sx}}({\mathit{zt}}_2)`. - #. Push the value :math:`(\mathsf{ref{.}array}~a_1)` to the stack. + #. Push the value :math:`(\mathsf{ref{.}array}~a_1)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_1 + n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_1 + n - 1)` to the stack. - #. Push the value :math:`(\mathsf{ref{.}array}~a_2)` to the stack. + #. Push the value :math:`(\mathsf{ref{.}array}~a_2)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_2 + n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_2 + n - 1)` to the stack. - #. Execute the instruction :math:`({\mathsf{array{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~x_2)`. + #. Execute the instruction :math:`({\mathsf{array{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~x_2)`. - #. Execute the instruction :math:`(\mathsf{array{.}set}~x_1)`. + #. Execute the instruction :math:`(\mathsf{array{.}set}~x_1)`. - #. Push the value :math:`(\mathsf{ref{.}array}~a_1)` to the stack. + #. Push the value :math:`(\mathsf{ref{.}array}~a_1)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_1)` to the stack. - #. Push the value :math:`(\mathsf{ref{.}array}~a_2)` to the stack. + #. Push the value :math:`(\mathsf{ref{.}array}~a_2)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_2)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_2)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{array{.}copy}~x_1~x_2)`. + #. Execute the instruction :math:`(\mathsf{array{.}copy}~x_1~x_2)`. - #. Else if :math:`n \neq 0`, then: + #. Else if :math:`n \neq 0`, then: - 1) Do nothing. + 1) Do nothing. :math:`\mathsf{array{.}init\_elem}~x~y` @@ -18057,45 +18057,45 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}array}`, then: - a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`a < {|z{.}\mathsf{arrays}|}` and :math:`i + n > {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}`, then: + #. If :math:`a < {|z{.}\mathsf{arrays}|}` and :math:`i + n > {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}`, then: - 1) Trap. + 1) Trap. - #. If :math:`j + n > {|z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}|}`, then: + #. If :math:`j + n > {|z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}|}`, then: - 1) Trap. + 1) Trap. - #. If :math:`n = 0`, then: + #. If :math:`n = 0`, then: - 1) Do nothing. + 1) Do nothing. - #. Else if :math:`j < {|z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}|}`, then: + #. Else if :math:`j < {|z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}|}`, then: - 1) Let :math:`{\mathit{ref}}` be :math:`z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}{}[j]`. + 1) Let :math:`{\mathit{ref}}` be :math:`z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}{}[j]`. - #) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #) Push the value :math:`{\mathit{ref}}` to the stack. + #) Push the value :math:`{\mathit{ref}}` to the stack. - #) Execute the instruction :math:`(\mathsf{array{.}set}~x)`. + #) Execute the instruction :math:`(\mathsf{array{.}set}~x)`. - #) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #) Execute the instruction :math:`(\mathsf{array{.}init\_elem}~x~y)`. + #) Execute the instruction :math:`(\mathsf{array{.}init\_elem}~x~y)`. :math:`\mathsf{array{.}init\_data}~x~y` @@ -18122,55 +18122,55 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}array}`, then: - a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`a < {|z{.}\mathsf{arrays}|}` and :math:`i + n > {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}`, then: + #. If :math:`a < {|z{.}\mathsf{arrays}|}` and :math:`i + n > {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}`, then: - 1) Trap. + 1) Trap. - #. If :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{array}`, then: + #. If :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{array}`, then: - 1) Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. + 1) Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #) Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. + #) Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. - #) If :math:`j + n \cdot {|{\mathit{zt}}|} / 8 > {|z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}|}`, then: + #) If :math:`j + n \cdot {|{\mathit{zt}}|} / 8 > {|z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #) If :math:`n = 0`, then: + #) If :math:`n = 0`, then: - a) Do nothing. + a) Do nothing. - #) Else: + #) Else: - a) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathit{zt}}}(c)` :math:`=` :math:`z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}{}[j : {|{\mathit{zt}}|} / 8]`. + a) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathit{zt}}}(c)` :math:`=` :math:`z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}{}[j : {|{\mathit{zt}}|} / 8]`. - #) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #) Push the value :math:`{\mathrm{unpack}}({\mathit{zt}}){.}\mathsf{const}~{{\mathrm{unpack}}}_{{\mathit{zt}}}(c)` to the stack. + #) Push the value :math:`{\mathrm{unpack}}({\mathit{zt}}){.}\mathsf{const}~{{\mathrm{unpack}}}_{{\mathit{zt}}}(c)` to the stack. - #) Execute the instruction :math:`(\mathsf{array{.}set}~x)`. + #) Execute the instruction :math:`(\mathsf{array{.}set}~x)`. - #) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. + #) Push the value :math:`(\mathsf{ref{.}array}~a)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + {|{\mathit{zt}}|} / 8)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + {|{\mathit{zt}}|} / 8)` to the stack. - #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #) Execute the instruction :math:`(\mathsf{array{.}init\_data}~x~y)`. + #) Execute the instruction :math:`(\mathsf{array{.}init\_data}~x~y)`. - #. Else if :math:`n = 0`, then: + #. Else if :math:`n = 0`, then: - 1) Do nothing. + 1) Do nothing. :math:`\mathsf{local{.}get}~x` @@ -18209,7 +18209,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i \geq {|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. Push the value :math:`z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i]` to the stack. @@ -18247,27 +18247,27 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + n > {|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i)` to the stack. + a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i)` to the stack. - #. Push the value :math:`{\mathit{val}}` to the stack. + #. Push the value :math:`{\mathit{val}}` to the stack. - #. Execute the instruction :math:`(\mathsf{table{.}set}~x)`. + #. Execute the instruction :math:`(\mathsf{table{.}set}~x)`. - #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i + 1)` to the stack. + #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i + 1)` to the stack. - #. Push the value :math:`{\mathit{val}}` to the stack. + #. Push the value :math:`{\mathit{val}}` to the stack. - #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{table{.}fill}~x)`. + #. Execute the instruction :math:`(\mathsf{table{.}fill}~x)`. :math:`\mathsf{table{.}copy}~x_1~x_2` @@ -18290,49 +18290,49 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i_1 + n > {|z{.}\mathsf{tables}{}[x_1]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`i_2 + n > {|z{.}\mathsf{tables}{}[x_2]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. If :math:`i_1 \leq i_2`, then: + a. If :math:`i_1 \leq i_2`, then: - 1) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1)` to the stack. + 1) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1)` to the stack. - #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. + #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. - #) Execute the instruction :math:`(\mathsf{table{.}get}~x_2)`. + #) Execute the instruction :math:`(\mathsf{table{.}get}~x_2)`. - #) Execute the instruction :math:`(\mathsf{table{.}set}~x_1)`. + #) Execute the instruction :math:`(\mathsf{table{.}set}~x_1)`. - #) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1 + 1)` to the stack. + #) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1 + 1)` to the stack. - #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + 1)` to the stack. + #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + 1)` to the stack. - #. Else: + #. Else: - 1) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1 + n - 1)` to the stack. + 1) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1 + n - 1)` to the stack. - #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + n - 1)` to the stack. + #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + n - 1)` to the stack. - #) Execute the instruction :math:`(\mathsf{table{.}get}~x_2)`. + #) Execute the instruction :math:`(\mathsf{table{.}get}~x_2)`. - #) Execute the instruction :math:`(\mathsf{table{.}set}~x_1)`. + #) Execute the instruction :math:`(\mathsf{table{.}set}~x_1)`. - #) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1)` to the stack. + #) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1)` to the stack. - #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. + #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. - #. Push the value :math:`({\mathit{at}'}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`({\mathit{at}'}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{table{.}copy}~x_1~x_2)`. + #. Execute the instruction :math:`(\mathsf{table{.}copy}~x_1~x_2)`. :math:`\mathsf{table{.}init}~x~y` @@ -18355,31 +18355,31 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + n > {|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`j + n > {|z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else if :math:`j < {|z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}|}`, then: - a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i)` to the stack. + a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i)` to the stack. - #. Push the value :math:`z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}{}[j]` to the stack. + #. Push the value :math:`z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}{}[j]` to the stack. - #. Execute the instruction :math:`(\mathsf{table{.}set}~x)`. + #. Execute the instruction :math:`(\mathsf{table{.}set}~x)`. - #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i + 1)` to the stack. + #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i + 1)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{table{.}init}~x~y)`. + #. Execute the instruction :math:`(\mathsf{table{.}init}~x~y)`. :math:`{{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{load}}{{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}}~x~{\mathit{ao}}` @@ -18394,39 +18394,39 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`{\mathit{nt}}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{nt}}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|{\mathit{nt}}|} / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: + #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|{\mathit{nt}}|} / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - 1) Trap. + 1) Trap. - #. Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathit{nt}}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|{\mathit{nt}}|} / 8]`. + #. Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathit{nt}}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|{\mathit{nt}}|} / 8]`. - #. Push the value :math:`({\mathit{nt}}{.}\mathsf{const}~c)` to the stack. + #. Push the value :math:`({\mathit{nt}}{.}\mathsf{const}~c)` to the stack. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. If :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + a. If :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + #. If :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. - #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. + #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. - #) Push the value :math:`({\mathsf{i}}{N}{.}\mathsf{const}~{{{{\mathrm{extend}}}_{n, {|{\mathsf{i}}{N}|}}^{{\mathit{sx}}}}}{(c)})` to the stack. + #) Push the value :math:`({\mathsf{i}}{N}{.}\mathsf{const}~{{{{\mathrm{extend}}}_{n, {|{\mathsf{i}}{N}|}}^{{\mathit{sx}}}}}{(c)})` to the stack. :math:`{\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}}~x~{\mathit{ao}}` @@ -18441,69 +18441,69 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|\mathsf{v{\scriptstyle 128}}|} / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}` and :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Trap. + a. Trap. #. If :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{\mathsf{v{\scriptstyle 128}}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|\mathsf{v{\scriptstyle 128}}|} / 8]`. + a. Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{\mathsf{v{\scriptstyle 128}}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|\mathsf{v{\scriptstyle 128}}|} / 8]`. - #. Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #. Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. #. Else: - a. Let :math:`{\mathit{vloadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + a. Let :math:`{\mathit{vloadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #. If :math:`{\mathit{vloadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{shape}`, then: + #. If :math:`{\mathit{vloadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{shape}`, then: - 1) Let :math:`({M}{\mathsf{x}}{K}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vloadop\_{\scriptstyle 0}}}`. + 1) Let :math:`({M}{\mathsf{x}}{K}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vloadop\_{\scriptstyle 0}}}`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + M \cdot K / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + M \cdot K / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #) Let :math:`{j^{K}}` be the result for which :math:`{({{\mathrm{bytes}}}_{{\mathsf{i}}{M}}({j^{K}}) = z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} + k \cdot M / 8 : M / 8])^{k<K}}`. + #) Let :math:`{j^{K}}` be the result for which :math:`{({{\mathrm{bytes}}}_{{\mathsf{i}}{M}}({j^{K}}) = z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} + k \cdot M / 8 : M / 8])^{k<K}}`. - #) If the type of :math:`N` for which :math:`N` :math:`=` :math:`M \cdot 2` is Jnn, then: + #) If the type of :math:`N` for which :math:`N` :math:`=` :math:`M \cdot 2` is Jnn, then: - a) Let :math:`{\mathsf{i}}{N}` be the result for which :math:`N` :math:`=` :math:`M \cdot 2`. + a) Let :math:`{\mathsf{i}}{N}` be the result for which :math:`N` :math:`=` :math:`M \cdot 2`. - #) Let :math:`c` be :math:`{{{{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{K}}^{{-1}}}}{({{{{{\mathrm{extend}}}_{M, N}^{{\mathit{sx}}}}}{(j)}^{K}})}`. + #) Let :math:`c` be :math:`{{{{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{K}}^{{-1}}}}{({{{{{\mathrm{extend}}}_{M, N}^{{\mathit{sx}}}}}{(j)}^{K}})}`. - #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. - #. If :math:`{\mathit{vloadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{splat}`, then: + #. If :math:`{\mathit{vloadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{splat}`, then: - 1) Let :math:`({N}{\mathsf{\_}}{\mathsf{splat}})` be :math:`{\mathit{vloadop\_{\scriptstyle 0}}}`. + 1) Let :math:`({N}{\mathsf{\_}}{\mathsf{splat}})` be :math:`{\mathit{vloadop\_{\scriptstyle 0}}}`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #) Let :math:`M` be :math:`128 / N`. + #) Let :math:`M` be :math:`128 / N`. - #) If the type of :math:`{\mathit{fresh}}` for which :math:`{|{\mathit{fresh}}|}` :math:`=` :math:`N` is Jnn, then: + #) If the type of :math:`{\mathit{fresh}}` for which :math:`{|{\mathit{fresh}}|}` :math:`=` :math:`N` is Jnn, then: - a) Let :math:`{\mathsf{i}}{N}` be the result for which :math:`{|{\mathsf{i}}{N}|}` :math:`=` :math:`N`. + a) Let :math:`{\mathsf{i}}{N}` be the result for which :math:`{|{\mathsf{i}}{N}|}` :math:`=` :math:`N`. - #) Let :math:`j` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(j)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. + #) Let :math:`j` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(j)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. - #) Let :math:`c` be :math:`{{{{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}^{{-1}}}}{({j^{M}})}`. + #) Let :math:`c` be :math:`{{{{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}^{{-1}}}}{({j^{M}})}`. - #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. - #. If :math:`{\mathit{vloadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{zero}`, then: + #. If :math:`{\mathit{vloadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{zero}`, then: - 1) Let :math:`({N}{\mathsf{\_}}{\mathsf{zero}})` be :math:`{\mathit{vloadop\_{\scriptstyle 0}}}`. + 1) Let :math:`({N}{\mathsf{\_}}{\mathsf{zero}})` be :math:`{\mathit{vloadop\_{\scriptstyle 0}}}`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #) Let :math:`j` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(j)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. + #) Let :math:`j` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(j)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. - #) Let :math:`c` be :math:`{{{{\mathrm{extend}}}_{N, 128}^{\mathsf{u}}}}{(j)}`. + #) Let :math:`c` be :math:`{{{{\mathrm{extend}}}_{N, 128}^{\mathsf{u}}}}{(j)}`. - #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #) Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. :math:`{\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}}{N}{\mathsf{\_}}{\mathsf{lane}}~x~{\mathit{ao}}~j` @@ -18522,19 +18522,19 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. Let :math:`M` be :math:`{|\mathsf{v{\scriptstyle 128}}|} / N`. #. If the type of :math:`{\mathit{fresh}}` for which :math:`{|{\mathit{fresh}}|}` :math:`=` :math:`N` is Jnn, then: - a. Let :math:`{\mathsf{i}}{N}` be the result for which :math:`{|{\mathsf{i}}{N}|}` :math:`=` :math:`N`. + a. Let :math:`{\mathsf{i}}{N}` be the result for which :math:`{|{\mathsf{i}}{N}|}` :math:`=` :math:`N`. - #. Let :math:`k` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(k)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. + #. Let :math:`k` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}(k)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8]`. - #. Let :math:`c` be :math:`{{{{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}^{{-1}}}}{({{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}(c_1){}[{}[j] = k])}`. + #. Let :math:`c` be :math:`{{{{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}^{{-1}}}}{({{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}(c_1){}[{}[j] = k])}`. - #. Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. + #. Push the value :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{const}~c)` to the stack. :math:`\mathsf{memory{.}size}~x` @@ -18572,27 +18572,27 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + n > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i)` to the stack. + a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i)` to the stack. - #. Push the value :math:`{\mathit{val}}` to the stack. + #. Push the value :math:`{\mathit{val}}` to the stack. - #. Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x)`. + #. Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x)`. - #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i + 1)` to the stack. + #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i + 1)` to the stack. - #. Push the value :math:`{\mathit{val}}` to the stack. + #. Push the value :math:`{\mathit{val}}` to the stack. - #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{memory{.}fill}~x)`. + #. Execute the instruction :math:`(\mathsf{memory{.}fill}~x)`. :math:`\mathsf{memory{.}copy}~x_1~x_2` @@ -18615,49 +18615,49 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i_1 + n > {|z{.}\mathsf{mems}{}[x_1]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. If :math:`i_2 + n > {|z{.}\mathsf{mems}{}[x_2]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else: - a. If :math:`i_1 \leq i_2`, then: + a. If :math:`i_1 \leq i_2`, then: - 1) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1)` to the stack. + 1) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1)` to the stack. - #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. + #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}}~x_2)`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}}~x_2)`. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1)`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1)`. - #) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1 + 1)` to the stack. + #) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1 + 1)` to the stack. - #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + 1)` to the stack. + #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + 1)` to the stack. - #. Else: + #. Else: - 1) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1 + n - 1)` to the stack. + 1) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1 + n - 1)` to the stack. - #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + n - 1)` to the stack. + #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + n - 1)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}}~x_2)`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}}~x_2)`. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1)`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1)`. - #) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1)` to the stack. + #) Push the value :math:`({\mathit{at}}_1{.}\mathsf{const}~i_1)` to the stack. - #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. + #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. - #. Push the value :math:`({\mathit{at}'}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`({\mathit{at}'}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{memory{.}copy}~x_1~x_2)`. + #. Execute the instruction :math:`(\mathsf{memory{.}copy}~x_1~x_2)`. :math:`\mathsf{memory{.}init}~x~y` @@ -18680,31 +18680,31 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + n > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. If :math:`j + n > {|z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. If :math:`n = 0`, then: - a. Do nothing. + a. Do nothing. #. Else if :math:`j < {|z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}|}`, then: - a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i)` to the stack. + a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}{}[j])` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}{}[j])` to the stack. - #. Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x)`. + #. Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x)`. - #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i + 1)` to the stack. + #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~i + 1)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)` to the stack. - #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. + #. Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)` to the stack. - #. Execute the instruction :math:`(\mathsf{memory{.}init}~x~y)`. + #. Execute the instruction :math:`(\mathsf{memory{.}init}~x~y)`. :math:`\mathsf{throw}~x` @@ -18779,21 +18779,21 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}struct}`, then: - a. Let :math:`(\mathsf{ref{.}struct}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}struct}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{struct}`. + #. Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{struct}`. - #. Let :math:`(\mathsf{struct}~{\mathit{structtype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. + #. Let :math:`(\mathsf{struct}~{\mathit{structtype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #. Let :math:`{({\mathsf{mut}^?}~{\mathit{zt}})^\ast}` be :math:`{\mathit{structtype}}_0`. + #. Let :math:`{({\mathsf{mut}^?}~{\mathit{zt}})^\ast}` be :math:`{\mathit{structtype}}_0`. - #. If :math:`i < {|{{\mathit{zt}}^\ast}|}`, then: + #. If :math:`i < {|{{\mathit{zt}}^\ast}|}`, then: - 1) Perform :math:`z{}[{.}\mathsf{structs}{}[a]{.}\mathsf{fields}{}[i] = {{\mathrm{pack}}}_{{{\mathit{zt}}^\ast}{}[i]}({\mathit{val}})]`. + 1) Perform :math:`z{}[{.}\mathsf{structs}{}[a]{.}\mathsf{fields}{}[i] = {{\mathrm{pack}}}_{{{\mathit{zt}}^\ast}{}[i]}({\mathit{val}})]`. :math:`\mathsf{array{.}new\_fixed}~x~n` @@ -18841,23 +18841,23 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}array}`, then: - a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}array}~a)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`a < {|z{.}\mathsf{arrays}|}` and :math:`i \geq {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}`, then: + #. If :math:`a < {|z{.}\mathsf{arrays}|}` and :math:`i \geq {|z{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}|}`, then: - 1) Trap. + 1) Trap. - #. Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{array}`. + #. Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{array}`. - #. Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. + #. Let :math:`(\mathsf{array}~{\mathit{arraytype}}_0)` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #. Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. + #. Let :math:`({\mathsf{mut}^?}~{\mathit{zt}})` be :math:`{\mathit{arraytype}}_0`. - #. Perform :math:`z{}[{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i] = {{\mathrm{pack}}}_{{\mathit{zt}}}({\mathit{val}})]`. + #. Perform :math:`z{}[{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i] = {{\mathrm{pack}}}_{{\mathit{zt}}}({\mathit{val}})]`. :math:`\mathsf{local{.}set}~x` @@ -18902,7 +18902,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i \geq {|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|}`, then: - a. Trap. + a. Trap. #. Perform :math:`z{}[{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i] = {\mathit{ref}}]`. @@ -18923,15 +18923,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Either: - a. Let :math:`{\mathit{ti}}` be :math:`{\mathrm{growtable}}(z{.}\mathsf{tables}{}[x], n, {\mathit{ref}})`. + a. Let :math:`{\mathit{ti}}` be :math:`{\mathrm{growtable}}(z{.}\mathsf{tables}{}[x], n, {\mathit{ref}})`. - #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~{|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|})` to the stack. + #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~{|z{.}\mathsf{tables}{}[x]{.}\mathsf{refs}|})` to the stack. - #. Perform :math:`z{}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]`. + #. Perform :math:`z{}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]`. #. Or: - a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~{{{{\mathrm{signed}}}_{{|{\mathit{at}}|}}^{{-1}}}}{({-1})})` to the stack. + a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~{{{{\mathrm{signed}}}_{{|{\mathit{at}}|}}^{{-1}}}}{({-1})})` to the stack. :math:`\mathsf{elem{.}drop}~x` @@ -18961,29 +18961,29 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|{\mathit{nt}}|} / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}` and :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = {\mathit{nt}}` and :math:`{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Trap. + a. Trap. #. If :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = {\mathit{nt}}` and :math:`{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathit{nt}}}(c)`. + a. Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathit{nt}}}(c)`. - #. Perform :math:`z{}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|{\mathit{nt}}|} / 8] = {b^\ast}]`. + #. Perform :math:`z{}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|{\mathit{nt}}|} / 8] = {b^\ast}]`. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #. If :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = {\mathsf{i}}{N}` and :math:`{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: + #. If :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = {\mathsf{i}}{N}` and :math:`{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - 1) Let :math:`n` be :math:`{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + 1) Let :math:`n` be :math:`{{\mathit{storeop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: + #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - a) Trap. + a) Trap. - #) Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}({{\mathrm{wrap}}}_{{|{\mathsf{i}}{N}|}, n}(c))`. + #) Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}({{\mathrm{wrap}}}_{{|{\mathsf{i}}{N}|}, n}(c))`. - #) Perform :math:`z{}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8] = {b^\ast}]`. + #) Perform :math:`z{}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8] = {b^\ast}]`. :math:`\mathsf{v{\scriptstyle 128}}{.}\mathsf{store}~x~{\mathit{ao}}` @@ -19002,7 +19002,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + {|\mathsf{v{\scriptstyle 128}}|} / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{\mathsf{v{\scriptstyle 128}}}(c)`. @@ -19025,19 +19025,19 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + N > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: - a. Trap. + a. Trap. #. Let :math:`M` be :math:`128 / N`. #. If the type of :math:`{\mathit{fresh}}` for which :math:`{|{\mathit{fresh}}|}` :math:`=` :math:`N` is Jnn, then: - a. Let :math:`{\mathsf{i}}{N}` be the result for which :math:`{|{\mathsf{i}}{N}|}` :math:`=` :math:`N`. + a. Let :math:`{\mathsf{i}}{N}` be the result for which :math:`{|{\mathsf{i}}{N}|}` :math:`=` :math:`N`. - #. If :math:`j < {|{{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}(c)|}`, then: + #. If :math:`j < {|{{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}(c)|}`, then: - 1) Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}({{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}(c){}[j])`. + 1) Let :math:`{b^\ast}` be :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{N}}({{\mathrm{lanes}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}(c){}[j])`. - #) Perform :math:`z{}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8] = {b^\ast}]`. + #) Perform :math:`z{}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : N / 8] = {b^\ast}]`. :math:`\mathsf{memory{.}grow}~x` @@ -19052,15 +19052,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Either: - a. Let :math:`{\mathit{mi}}` be :math:`{\mathrm{growmem}}(z{.}\mathsf{mems}{}[x], n)`. + a. Let :math:`{\mathit{mi}}` be :math:`{\mathrm{growmem}}(z{.}\mathsf{mems}{}[x], n)`. - #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|} / (64 \, {\mathrm{Ki}}))` to the stack. + #. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~{|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|} / (64 \, {\mathrm{Ki}}))` to the stack. - #. Perform :math:`z{}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]`. + #. Perform :math:`z{}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]`. #. Or: - a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~{{{{\mathrm{signed}}}_{{|{\mathit{at}}|}}^{{-1}}}}{({-1})})` to the stack. + a. Push the value :math:`({\mathit{at}}{.}\mathsf{const}~{{{{\mathrm{signed}}}_{{|{\mathit{at}}|}}^{{-1}}}}{({-1})})` to the stack. :math:`\mathsf{data{.}drop}~x` @@ -19078,7 +19078,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`i \leq j`, then: - a. Return :math:`i`. + a. Return :math:`i`. #. Return :math:`j`. @@ -19089,7 +19089,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`0`. + a. Return :math:`0`. #. Let :math:`n~{{n'}^\ast}` be :math:`{n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19102,7 +19102,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`1`. + a. Return :math:`1`. #. Let :math:`n~{{n'}^\ast}` be :math:`{n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19115,7 +19115,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, :math:`{|{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} = 1`. @@ -19130,7 +19130,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{w^\ast}~{{{w'}^\ast}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19143,7 +19143,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{w^{n}}~{({{w'}^{n}})^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19156,7 +19156,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return true. + a. Return true. #. Let :math:`w~{{w'}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19169,13 +19169,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`w`. + a. Return :math:`w`. #. Let :math:`w_1~{{w'}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`w = w_1`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Return :math:`{{\mathrm{setminus{\kern-0.1em\scriptstyle 1}}}}_{{\mathit{TODO}}}(w, {{w'}^\ast})`. @@ -19186,7 +19186,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`w_1~{{w'}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19199,7 +19199,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{{w'}^\ast}~{{w^\ast}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19212,7 +19212,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`w_1~{{w'}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19225,7 +19225,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{w_1^\ast}~{{w^\ast}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19238,7 +19238,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 32`, then: - a. Return :math:`23`. + a. Return :math:`23`. #. Assert: Due to validation, :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 64`. @@ -19251,7 +19251,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 32`, then: - a. Return :math:`8`. + a. Return :math:`8`. #. Assert: Due to validation, :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 64`. @@ -19380,15 +19380,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 32}}`, then: - a. Return :math:`32`. + a. Return :math:`32`. #. If :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 64}}`, then: - a. Return :math:`64`. + a. Return :math:`64`. #. If :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 32}}`, then: - a. Return :math:`32`. + a. Return :math:`32`. #. Assert: Due to validation, :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{f{\scriptstyle 64}}`. @@ -19408,7 +19408,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{pt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 8}}`, then: - a. Return :math:`8`. + a. Return :math:`8`. #. Assert: Due to validation, :math:`{\mathit{pt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{i{\scriptstyle 16}}`. @@ -19421,9 +19421,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{|{\mathit{numtype}}|}`. + #. Return :math:`{|{\mathit{numtype}}|}`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -19438,15 +19438,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{|{\mathit{numtype}}|}`. + #. Return :math:`{|{\mathit{numtype}}|}`. #. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is vector type, then: - a. Let :math:`{\mathit{vectype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{vectype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{|{\mathit{vectype}}|}`. + #. Return :math:`{|{\mathit{vectype}}|}`. #. Assert: Due to validation, the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -19517,9 +19517,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathit{numtype}}`. + #. Return :math:`{\mathit{numtype}}`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -19532,9 +19532,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is value type, then: - a. Let :math:`{\mathit{valtype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{valtype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathit{valtype}}`. + #. Return :math:`{\mathit{valtype}}`. #. Assert: Due to validation, the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -19547,13 +19547,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathit{numtype}}`. + #. Return :math:`{\mathit{numtype}}`. #. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type, then: - a. Return :math:`\mathsf{i{\scriptstyle 32}}`. + a. Return :math:`\mathsf{i{\scriptstyle 32}}`. :math:`{\mathrm{unpack}}({\mathit{vectype}})` @@ -19569,19 +19569,19 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is literal type, then: - a. Let :math:`{\mathit{consttype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{consttype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathit{consttype}}`. + #. Return :math:`{\mathit{consttype}}`. #. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type, then: - a. Return :math:`\mathsf{i{\scriptstyle 32}}`. + a. Return :math:`\mathsf{i{\scriptstyle 32}}`. #. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is lane type, then: - a. Let :math:`{\mathit{lanetype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{lanetype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{unpack}}({\mathit{lanetype}})`. + #. Return :math:`{\mathrm{unpack}}({\mathit{lanetype}})`. :math:`{\mathrm{dim}}({{\mathsf{i}}{N}}{\mathsf{x}}{N})` @@ -19611,15 +19611,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externidx}}_0~{{\mathit{xx}}^\ast}` be :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externidx}}_0` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~x)` be :math:`{\mathit{externidx}}_0`. + a. Let :math:`(\mathsf{func}~x)` be :math:`{\mathit{externidx}}_0`. - #. Return :math:`x~{\mathrm{funcs}}({{\mathit{xx}}^\ast})`. + #. Return :math:`x~{\mathrm{funcs}}({{\mathit{xx}}^\ast})`. #. Let :math:`{\mathit{externidx}}~{{\mathit{xx}}^\ast}` be :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19632,15 +19632,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externidx}}_0~{{\mathit{xx}}^\ast}` be :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externidx}}_0` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~x)` be :math:`{\mathit{externidx}}_0`. + a. Let :math:`(\mathsf{global}~x)` be :math:`{\mathit{externidx}}_0`. - #. Return :math:`x~{\mathrm{globals}}({{\mathit{xx}}^\ast})`. + #. Return :math:`x~{\mathrm{globals}}({{\mathit{xx}}^\ast})`. #. Let :math:`{\mathit{externidx}}~{{\mathit{xx}}^\ast}` be :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19653,15 +19653,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externidx}}_0~{{\mathit{xx}}^\ast}` be :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externidx}}_0` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~x)` be :math:`{\mathit{externidx}}_0`. + a. Let :math:`(\mathsf{table}~x)` be :math:`{\mathit{externidx}}_0`. - #. Return :math:`x~{\mathrm{tables}}({{\mathit{xx}}^\ast})`. + #. Return :math:`x~{\mathrm{tables}}({{\mathit{xx}}^\ast})`. #. Let :math:`{\mathit{externidx}}~{{\mathit{xx}}^\ast}` be :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19674,15 +19674,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externidx}}_0~{{\mathit{xx}}^\ast}` be :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externidx}}_0` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~x)` be :math:`{\mathit{externidx}}_0`. + a. Let :math:`(\mathsf{mem}~x)` be :math:`{\mathit{externidx}}_0`. - #. Return :math:`x~{\mathrm{mems}}({{\mathit{xx}}^\ast})`. + #. Return :math:`x~{\mathrm{mems}}({{\mathit{xx}}^\ast})`. #. Let :math:`{\mathit{externidx}}~{{\mathit{xx}}^\ast}` be :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19695,15 +19695,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externidx}}_0~{{\mathit{xx}}^\ast}` be :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externidx}}_0` is of the case :math:`\mathsf{tag}`, then: - a. Let :math:`(\mathsf{tag}~x)` be :math:`{\mathit{externidx}}_0`. + a. Let :math:`(\mathsf{tag}~x)` be :math:`{\mathit{externidx}}_0`. - #. Return :math:`x~{\mathrm{tags}}({{\mathit{xx}}^\ast})`. + #. Return :math:`x~{\mathrm{tags}}({{\mathit{xx}}^\ast})`. #. Let :math:`{\mathit{externidx}}~{{\mathit{xx}}^\ast}` be :math:`{{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19716,7 +19716,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 32`, then: - a. Return :math:`\mathsf{i{\scriptstyle 32}}`. + a. Return :math:`\mathsf{i{\scriptstyle 32}}`. #. Assert: Due to validation, :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 64`. @@ -19729,7 +19729,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 32`, then: - a. Return :math:`\mathsf{f{\scriptstyle 32}}`. + a. Return :math:`\mathsf{f{\scriptstyle 32}}`. #. Assert: Due to validation, :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 64`. @@ -19742,15 +19742,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 8`, then: - a. Return :math:`\mathsf{i{\scriptstyle 8}}`. + a. Return :math:`\mathsf{i{\scriptstyle 8}}`. #. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 16`, then: - a. Return :math:`\mathsf{i{\scriptstyle 16}}`. + a. Return :math:`\mathsf{i{\scriptstyle 16}}`. #. If :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 32`, then: - a. Return :math:`\mathsf{i{\scriptstyle 32}}`. + a. Return :math:`\mathsf{i{\scriptstyle 32}}`. #. Assert: Due to validation, :math:`N_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = 64`. @@ -19763,7 +19763,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{|{\mathit{at}}_1|} \leq {|{\mathit{at}}_2|}`, then: - a. Return :math:`{\mathit{at}}_1`. + a. Return :math:`{\mathit{at}}_1`. #. Return :math:`{\mathit{at}}_2`. @@ -19774,7 +19774,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{null}`, then: - a. Return :math:`(\mathsf{ref}~\epsilon~{\mathit{ht}}_1)`. + a. Return :math:`(\mathsf{ref}~\epsilon~{\mathit{ht}}_1)`. #. Assert: Due to validation, :math:`{{\mathsf{null}^?}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is not defined. @@ -19787,15 +19787,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~{\mathit{dt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{func}~{\mathit{dt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{dt}}~{\mathrm{funcs}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{dt}}~{\mathrm{funcs}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19808,15 +19808,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~{\mathit{gt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{global}~{\mathit{gt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{gt}}~{\mathrm{globals}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{gt}}~{\mathrm{globals}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19829,15 +19829,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~{\mathit{tt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{table}~{\mathit{tt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{tt}}~{\mathrm{tables}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{tt}}~{\mathrm{tables}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19850,15 +19850,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~{\mathit{mt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{mem}~{\mathit{mt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{mt}}~{\mathrm{mems}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{mt}}~{\mathrm{mems}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19871,15 +19871,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externtype}}_0~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externtype}}_0` is of the case :math:`\mathsf{tag}`, then: - a. Let :math:`(\mathsf{tag}~{\mathit{jt}})` be :math:`{\mathit{externtype}}_0`. + a. Let :math:`(\mathsf{tag}~{\mathit{jt}})` be :math:`{\mathit{externtype}}_0`. - #. Return :math:`{\mathit{jt}}~{\mathrm{tags}}({{\mathit{xt}}^\ast})`. + #. Return :math:`{\mathit{jt}}~{\mathrm{tags}}({{\mathit{xt}}^\ast})`. #. Let :math:`{\mathit{externtype}}~{{\mathit{xt}}^\ast}` be :math:`{{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -19892,7 +19892,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{tv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`{\mathit{tv}}`. + a. Return :math:`{\mathit{tv}}`. #. Assert: Due to validation, :math:`{|{y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. @@ -19904,7 +19904,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{tv}} = {\mathit{tv}}_1`, then: - a. Return :math:`{\mathit{tu}}_1`. + a. Return :math:`{\mathit{tu}}_1`. #. Return :math:`{{\mathit{tv}}}{{}[ {{\mathit{tv}'}^\ast} := {{\mathit{tu}'}^\ast} ]}`. @@ -19936,9 +19936,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is type variable, then: - a. Let :math:`{\mathit{tv}'}` be :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{tv}'}` be :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{{\mathit{tv}'}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. + #. Return :math:`{{\mathit{tv}'}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. #. Assert: Due to validation, the type of :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is defined type. @@ -19953,15 +19953,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is type variable, then: - a. Let :math:`{\mathit{tv}'}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{tv}'}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{{\mathit{tv}'}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. + #. Return :math:`{{\mathit{tv}'}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. #. If the type of :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is defined type, then: - a. Let :math:`{\mathit{dt}}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{dt}}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{{\mathit{dt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. + #. Return :math:`{{\mathit{dt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. #. Let :math:`{\mathit{ht}}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. @@ -19981,21 +19981,21 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{nt}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{nt}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{{\mathit{nt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. + #. Return :math:`{{\mathit{nt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is vector type, then: - a. Let :math:`{\mathit{vt}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{vt}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{{\mathit{vt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. + #. Return :math:`{{\mathit{vt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is reference type, then: - a. Let :math:`{\mathit{rt}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{rt}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{{\mathit{rt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. + #. Return :math:`{{\mathit{rt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. #. Assert: Due to validation, :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{bot}`. @@ -20008,9 +20008,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is value type, then: - a. Let :math:`t` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`t` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{t}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. + #. Return :math:`{t}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}`. #. Assert: Due to validation, the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -20032,15 +20032,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{struct}`, then: - a. Let :math:`(\mathsf{struct}~{{\mathit{yt}}^\ast})` be :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{struct}~{{\mathit{yt}}^\ast})` be :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`(\mathsf{struct}~{{{\mathit{yt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}^\ast})`. + #. Return :math:`(\mathsf{struct}~{{{\mathit{yt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]}^\ast})`. #. If :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array}`, then: - a. Let :math:`(\mathsf{array}~{\mathit{yt}})` be :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array}~{\mathit{yt}})` be :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`(\mathsf{array}~{{\mathit{yt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. + #. Return :math:`(\mathsf{array}~{{\mathit{yt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. #. Assert: Due to validation, :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`. @@ -20118,27 +20118,27 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~{\mathit{dt}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{func}~{\mathit{dt}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`(\mathsf{func}~{{\mathit{dt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. + #. Return :math:`(\mathsf{func}~{{\mathit{dt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. #. If :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~{\mathit{gt}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{global}~{\mathit{gt}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`(\mathsf{global}~{{\mathit{gt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. + #. Return :math:`(\mathsf{global}~{{\mathit{gt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. #. If :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~{\mathit{tt}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table}~{\mathit{tt}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`(\mathsf{table}~{{\mathit{tt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. + #. Return :math:`(\mathsf{table}~{{\mathit{tt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. #. If :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~{\mathit{mt}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{mem}~{\mathit{mt}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`(\mathsf{mem}~{{\mathit{mt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. + #. Return :math:`(\mathsf{mem}~{{\mathit{mt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]})`. #. Assert: Due to validation, :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{tag}`. @@ -20209,7 +20209,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{dt}}_1~{{\mathit{dt}}^\ast}` be :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -20284,9 +20284,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{consttype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{consttype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{consttype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`({\mathit{numtype}}{.}\mathsf{const}~c)`. + #. Return :math:`({\mathit{numtype}}{.}\mathsf{const}~c)`. #. Assert: Due to validation, the type of :math:`{\mathit{consttype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is vector type. @@ -20301,7 +20301,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{free}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. Let :math:`{\mathit{free}}` be :math:`{{\mathit{free}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. @@ -20314,7 +20314,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{free}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. Let :math:`{\mathit{free}}~{{\mathit{free}'}^\ast}` be :math:`{{\mathit{free}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -20390,21 +20390,21 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~{\mathit{funcidx}})` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{func}~{\mathit{funcidx}})` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{funcidx}}({\mathit{funcidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{funcidx}}({\mathit{funcidx}})`. #. If :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~{\mathit{globalidx}})` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{global}~{\mathit{globalidx}})` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{globalidx}}({\mathit{globalidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{globalidx}}({\mathit{globalidx}})`. #. If :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~{\mathit{tableidx}})` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table}~{\mathit{tableidx}})` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. #. Assert: Due to validation, :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{mem}`. @@ -20440,9 +20440,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -20464,9 +20464,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{consttype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{consttype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{numtype}}` be :math:`{\mathit{consttype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. #. Assert: Due to validation, the type of :math:`{\mathit{consttype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is vector type. @@ -20488,9 +20488,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{tv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case , then: - a. Let :math:`{\mathit{typeidx}}` be :math:`{\mathit{tv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{typeidx}}` be :math:`{\mathit{tv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. #. Assert: Due to validation, :math:`{\mathit{tv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{rec}`. @@ -20503,9 +20503,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is abstract heap type, then: - a. Let :math:`{\mathit{absheaptype}}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{absheaptype}}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{absheaptype}}({\mathit{absheaptype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{absheaptype}}({\mathit{absheaptype}})`. #. Assert: Due to validation, the type of :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is type use. @@ -20527,9 +20527,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is type variable, then: - a. Let :math:`{\mathit{typevar}}` be :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{typevar}}` be :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typevar}}({\mathit{typevar}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typevar}}({\mathit{typevar}})`. #. Assert: Due to validation, the type of :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is defined type. @@ -20544,21 +20544,21 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Let :math:`{\mathit{numtype}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{numtype}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is vector type, then: - a. Let :math:`{\mathit{vectype}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{vectype}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is reference type, then: - a. Let :math:`{\mathit{reftype}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{reftype}}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{reftype}}({\mathit{reftype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{reftype}}({\mathit{reftype}})`. #. Assert: Due to validation, :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{bot}`. @@ -20578,9 +20578,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is value type, then: - a. Let :math:`{\mathit{valtype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{valtype}}` be :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{valtype}}({\mathit{valtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{valtype}}({\mathit{valtype}})`. #. Assert: Due to validation, the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -20623,15 +20623,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{struct}`, then: - a. Let :math:`(\mathsf{struct}~{\mathit{structtype}})` be :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{struct}~{\mathit{structtype}})` be :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{structtype}}({\mathit{structtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{structtype}}({\mathit{structtype}})`. #. If :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array}`, then: - a. Let :math:`(\mathsf{array}~{\mathit{arraytype}})` be :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array}~{\mathit{arraytype}})` be :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{arraytype}}({\mathit{arraytype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{arraytype}}({\mathit{arraytype}})`. #. Assert: Due to validation, :math:`{\mathit{ct}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`. @@ -20709,27 +20709,27 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~{\mathit{typeuse}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{func}~{\mathit{typeuse}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeuse}}({\mathit{typeuse}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeuse}}({\mathit{typeuse}})`. #. If :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~{\mathit{globaltype}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{global}~{\mathit{globaltype}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{globaltype}}({\mathit{globaltype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{globaltype}}({\mathit{globaltype}})`. #. If :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~{\mathit{tabletype}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table}~{\mathit{tabletype}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{tabletype}}({\mathit{tabletype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{tabletype}}({\mathit{tabletype}})`. #. If :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~{\mathit{memtype}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{mem}~{\mathit{memtype}})` be :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{memtype}}({\mathit{memtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{memtype}}({\mathit{memtype}})`. #. Assert: Due to validation, :math:`{\mathit{xt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{tag}`. @@ -20758,9 +20758,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case , then: - a. Let :math:`{{\mathit{valtype}}^?}` be :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathit{valtype}}^?}` be :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{opt}}({{\mathrm{free}}_{\mathit{valtype}}({\mathit{valtype}})^?})`. + #. Return :math:`{\mathrm{free}}_{\mathit{opt}}({{\mathrm{free}}_{\mathit{valtype}}({\mathit{valtype}})^?})`. #. Assert: Due to validation, :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case . @@ -20775,13 +20775,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{l_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{labelidx}}_0~{{\mathit{labelidx}'}^\ast}` be :math:`{l_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{labelidx}}_0 = 0`, then: - a. Return :math:`{\mathrm{shift}}_{\mathit{labelidxs}}({{\mathit{labelidx}'}^\ast})`. + a. Return :math:`{\mathrm{shift}}_{\mathit{labelidxs}}({{\mathit{labelidx}'}^\ast})`. #. Let :math:`{\mathit{labelidx}}~{{\mathit{labelidx}'}^\ast}` be :math:`{l_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -20794,571 +20794,571 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{nop}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{unreachable}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{drop}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{select}`, then: - a. Let :math:`(\mathsf{select}~{({{\mathit{valtype}}^\ast})^?})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{select}~{({{\mathit{valtype}}^\ast})^?})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{opt}}({{\mathrm{free}}_{\mathit{list}}({{\mathrm{free}}_{\mathit{valtype}}({\mathit{valtype}})^\ast})^?})`. + #. Return :math:`{\mathrm{free}}_{\mathit{opt}}({{\mathrm{free}}_{\mathit{list}}({{\mathrm{free}}_{\mathit{valtype}}({\mathit{valtype}})^\ast})^?})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{block}`, then: - a. Let :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{instr}}^\ast})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{instr}}^\ast})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_blocktype(blocktype) ++ $free_block(instr*{instr <- instr*})`. + #. Return `$free_blocktype(blocktype) ++ $free_block(instr*{instr <- instr*})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{loop}`, then: - a. Let :math:`(\mathsf{loop}~{\mathit{blocktype}}~{{\mathit{instr}}^\ast})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{loop}~{\mathit{blocktype}}~{{\mathit{instr}}^\ast})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_blocktype(blocktype) ++ $free_block(instr*{instr <- instr*})`. + #. Return `$free_blocktype(blocktype) ++ $free_block(instr*{instr <- instr*})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{if}`, then: - a. Let :math:`(\mathsf{if}~{\mathit{blocktype}}~{{\mathit{instr}}_1^\ast}~\mathsf{else}~{{\mathit{instr}}_2^\ast})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{if}~{\mathit{blocktype}}~{{\mathit{instr}}_1^\ast}~\mathsf{else}~{{\mathit{instr}}_2^\ast})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_blocktype(blocktype) ++ $free_block(instr_1*{instr_1 <- instr_1*}) ++ $free_block(instr_2*{instr_2 <- instr_2*})`. + #. Return `$free_blocktype(blocktype) ++ $free_block(instr_1*{instr_1 <- instr_1*}) ++ $free_block(instr_2*{instr_2 <- instr_2*})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{br}`, then: - a. Let :math:`(\mathsf{br}~{\mathit{labelidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{br}~{\mathit{labelidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{labelidx}}({\mathit{labelidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{labelidx}}({\mathit{labelidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{br\_if}`, then: - a. Let :math:`(\mathsf{br\_if}~{\mathit{labelidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{br\_if}~{\mathit{labelidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{labelidx}}({\mathit{labelidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{labelidx}}({\mathit{labelidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{br\_table}`, then: - a. Let :math:`(\mathsf{br\_table}~{{\mathit{labelidx}}^\ast}~{\mathit{labelidx}'})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{br\_table}~{{\mathit{labelidx}}^\ast}~{\mathit{labelidx}'})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_list($free_labelidx(labelidx)*{}) ++ $free_labelidx(labelidx)`. + #. Return `$free_list($free_labelidx(labelidx)*{}) ++ $free_labelidx(labelidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{br\_on\_null}`, then: - a. Let :math:`(\mathsf{br\_on\_null}~{\mathit{labelidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{br\_on\_null}~{\mathit{labelidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{labelidx}}({\mathit{labelidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{labelidx}}({\mathit{labelidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{br\_on\_non\_null}`, then: - a. Let :math:`(\mathsf{br\_on\_non\_null}~{\mathit{labelidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{br\_on\_non\_null}~{\mathit{labelidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{labelidx}}({\mathit{labelidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{labelidx}}({\mathit{labelidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{br\_on\_cast}`, then: - a. Let :math:`(\mathsf{br\_on\_cast}~{\mathit{labelidx}}~{\mathit{reftype}}_1~{\mathit{reftype}}_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{br\_on\_cast}~{\mathit{labelidx}}~{\mathit{reftype}}_1~{\mathit{reftype}}_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_labelidx(labelidx) ++ $free_reftype(reftype_1) ++ $free_reftype(reftype_2)`. + #. Return `$free_labelidx(labelidx) ++ $free_reftype(reftype_1) ++ $free_reftype(reftype_2)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{br\_on\_cast\_fail}`, then: - a. Let :math:`(\mathsf{br\_on\_cast\_fail}~{\mathit{labelidx}}~{\mathit{reftype}}_1~{\mathit{reftype}}_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{br\_on\_cast\_fail}~{\mathit{labelidx}}~{\mathit{reftype}}_1~{\mathit{reftype}}_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_labelidx(labelidx) ++ $free_reftype(reftype_1) ++ $free_reftype(reftype_2)`. + #. Return `$free_labelidx(labelidx) ++ $free_reftype(reftype_1) ++ $free_reftype(reftype_2)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{call}`, then: - a. Let :math:`(\mathsf{call}~{\mathit{funcidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{call}~{\mathit{funcidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{funcidx}}({\mathit{funcidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{funcidx}}({\mathit{funcidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{call\_ref}`, then: - a. Let :math:`(\mathsf{call\_ref}~{\mathit{typeuse}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{call\_ref}~{\mathit{typeuse}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeuse}}({\mathit{typeuse}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeuse}}({\mathit{typeuse}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{call\_indirect}`, then: - a. Let :math:`(\mathsf{call\_indirect}~{\mathit{tableidx}}~{\mathit{typeuse}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{call\_indirect}~{\mathit{tableidx}}~{\mathit{typeuse}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_tableidx(tableidx) ++ $free_typeuse(typeuse)`. + #. Return `$free_tableidx(tableidx) ++ $free_typeuse(typeuse)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{return}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{return\_call}`, then: - a. Let :math:`(\mathsf{return\_call}~{\mathit{funcidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{return\_call}~{\mathit{funcidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{funcidx}}({\mathit{funcidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{funcidx}}({\mathit{funcidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{return\_call\_ref}`, then: - a. Let :math:`(\mathsf{return\_call\_ref}~{\mathit{typeuse}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{return\_call\_ref}~{\mathit{typeuse}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeuse}}({\mathit{typeuse}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeuse}}({\mathit{typeuse}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{return\_call\_indirect}`, then: - a. Let :math:`(\mathsf{return\_call\_indirect}~{\mathit{tableidx}}~{\mathit{typeuse}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{return\_call\_indirect}~{\mathit{tableidx}}~{\mathit{typeuse}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_tableidx(tableidx) ++ $free_typeuse(typeuse)`. + #. Return `$free_tableidx(tableidx) ++ $free_typeuse(typeuse)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{const}`, then: - a. Let :math:`({\mathit{numtype}}{.}\mathsf{const}~{\mathit{numlit}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{numtype}}{.}\mathsf{const}~{\mathit{numlit}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{unop}`, then: - a. Let :math:`({\mathit{numtype}} {.} {\mathit{unop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{numtype}} {.} {\mathit{unop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{binop}`, then: - a. Let :math:`({\mathit{numtype}} {.} {\mathit{binop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{numtype}} {.} {\mathit{binop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{testop}`, then: - a. Let :math:`({\mathit{numtype}} {.} {\mathit{testop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{numtype}} {.} {\mathit{testop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{relop}`, then: - a. Let :math:`({\mathit{numtype}} {.} {\mathit{relop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{numtype}} {.} {\mathit{relop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{numtype}}({\mathit{numtype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{cvtop}`, then: - a. Let :math:`({\mathit{numtype}}_1 {.} {{\mathit{cvtop}}}{\mathsf{\_}}{{\mathit{numtype}}_2})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{numtype}}_1 {.} {{\mathit{cvtop}}}{\mathsf{\_}}{{\mathit{numtype}}_2})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_numtype(numtype_1) ++ $free_numtype(numtype_2)`. + #. Return `$free_numtype(numtype_1) ++ $free_numtype(numtype_2)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vconst}`, then: - a. Let :math:`({\mathit{vectype}}{.}\mathsf{const}~{\mathit{veclit}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{vectype}}{.}\mathsf{const}~{\mathit{veclit}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vvunop}`, then: - a. Let :math:`({\mathit{vectype}} {.} {\mathit{vvunop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{vectype}} {.} {\mathit{vvunop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vvbinop}`, then: - a. Let :math:`({\mathit{vectype}} {.} {\mathit{vvbinop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{vectype}} {.} {\mathit{vvbinop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vvternop}`, then: - a. Let :math:`({\mathit{vectype}} {.} {\mathit{vvternop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{vectype}} {.} {\mathit{vvternop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vvtestop}`, then: - a. Let :math:`({\mathit{vectype}} {.} {\mathit{vvtestop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{vectype}} {.} {\mathit{vvtestop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{vectype}}({\mathit{vectype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vunop}`, then: - a. Let :math:`({\mathit{shape}} {.} {\mathit{vunop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{shape}} {.} {\mathit{vunop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vbinop}`, then: - a. Let :math:`({\mathit{shape}} {.} {\mathit{vbinop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{shape}} {.} {\mathit{vbinop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vternop}`, then: - a. Let :math:`({\mathit{shape}} {.} {\mathit{vternop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{shape}} {.} {\mathit{vternop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vtestop}`, then: - a. Let :math:`({\mathit{shape}} {.} {\mathit{vtestop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{shape}} {.} {\mathit{vtestop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vrelop}`, then: - a. Let :math:`({\mathit{shape}} {.} {\mathit{vrelop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{shape}} {.} {\mathit{vrelop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vshiftop}`, then: - a. Let :math:`({\mathit{ishape}} {.} {\mathit{vshiftop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{ishape}} {.} {\mathit{vshiftop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{ishape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{ishape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vbitmask}`, then: - a. Let :math:`({\mathit{ishape}}{.}\mathsf{bitmask})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{ishape}}{.}\mathsf{bitmask})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{ishape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{ishape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vswizzlop}`, then: - a. Let :math:`({\mathit{bshape}} {.} {\mathit{vswizzlop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{bshape}} {.} {\mathit{vswizzlop}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{bshape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{bshape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vshuffle}`, then: - a. Let :math:`({\mathit{bshape}}{.}\mathsf{shuffle}~{{\mathit{laneidx}}^\ast})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{bshape}}{.}\mathsf{shuffle}~{{\mathit{laneidx}}^\ast})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{bshape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{bshape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vextunop}`, then: - a. Let :math:`({\mathit{ishape}}_1 {.} {{\mathit{vextunop}}}{\mathsf{\_}}{{\mathit{ishape}}_2})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{ishape}}_1 {.} {{\mathit{vextunop}}}{\mathsf{\_}}{{\mathit{ishape}}_2})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_shape(ishape_1) ++ $free_shape(ishape_2)`. + #. Return `$free_shape(ishape_1) ++ $free_shape(ishape_2)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vextbinop}`, then: - a. Let :math:`({\mathit{ishape}}_1 {.} {{\mathit{vextbinop}}}{\mathsf{\_}}{{\mathit{ishape}}_2})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{ishape}}_1 {.} {{\mathit{vextbinop}}}{\mathsf{\_}}{{\mathit{ishape}}_2})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_shape(ishape_1) ++ $free_shape(ishape_2)`. + #. Return `$free_shape(ishape_1) ++ $free_shape(ishape_2)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vnarrow}`, then: - a. Let :math:`({{\mathit{ishape}}_1{.}\mathsf{narrow}}{\mathsf{\_}}{{\mathit{ishape}}_2}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({{\mathit{ishape}}_1{.}\mathsf{narrow}}{\mathsf{\_}}{{\mathit{ishape}}_2}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_shape(ishape_1) ++ $free_shape(ishape_2)`. + #. Return `$free_shape(ishape_1) ++ $free_shape(ishape_2)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vcvtop}`, then: - a. Let :math:`({\mathit{shape}}_1 {.} {{\mathit{vcvtop}}}{\mathsf{\_}}{{{\mathit{zero}}^?}}{\mathsf{\_}}{{\mathit{shape}}_2}{\mathsf{\_}}{{{\mathit{half}}^?}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{shape}}_1 {.} {{\mathit{vcvtop}}}{\mathsf{\_}}{{{\mathit{zero}}^?}}{\mathsf{\_}}{{\mathit{shape}}_2}{\mathsf{\_}}{{{\mathit{half}}^?}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_shape(shape_1) ++ $free_shape(shape_2)`. + #. Return `$free_shape(shape_1) ++ $free_shape(shape_2)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vsplat}`, then: - a. Let :math:`({\mathit{shape}}{.}\mathsf{splat})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{shape}}{.}\mathsf{splat})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vextract\_lane}`, then: - a. Let :math:`({{\mathit{shape}}{.}\mathsf{extract\_lane}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~{\mathit{laneidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({{\mathit{shape}}{.}\mathsf{extract\_lane}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~{\mathit{laneidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vreplace\_lane}`, then: - a. Let :math:`({\mathit{shape}}{.}\mathsf{replace\_lane}~{\mathit{laneidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{shape}}{.}\mathsf{replace\_lane}~{\mathit{laneidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{shape}}({\mathit{shape}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}null}`, then: - a. Let :math:`(\mathsf{ref{.}null}~{\mathit{heaptype}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}null}~{\mathit{heaptype}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{heaptype}}({\mathit{heaptype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{heaptype}}({\mathit{heaptype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ref{.}is\_null}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ref{.}as\_non\_null}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ref{.}eq}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}test}`, then: - a. Let :math:`(\mathsf{ref{.}test}~{\mathit{reftype}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}test}~{\mathit{reftype}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{reftype}}({\mathit{reftype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{reftype}}({\mathit{reftype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}cast}`, then: - a. Let :math:`(\mathsf{ref{.}cast}~{\mathit{reftype}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}cast}~{\mathit{reftype}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{reftype}}({\mathit{reftype}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{reftype}}({\mathit{reftype}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref{.}func}`, then: - a. Let :math:`(\mathsf{ref{.}func}~{\mathit{funcidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{ref{.}func}~{\mathit{funcidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{funcidx}}({\mathit{funcidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{funcidx}}({\mathit{funcidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ref{.}i{\scriptstyle 31}}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{i{\scriptstyle 31}{.}get}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{struct{.}new}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{struct{.}new\_default}`, then: - a. Let :math:`(\mathsf{struct{.}new\_default}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{struct{.}new\_default}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{struct{.}get}`, then: - a. Let :math:`({\mathsf{struct{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~{\mathit{typeidx}}~{\mathit{u{\kern-0.1em\scriptstyle 32}}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathsf{struct{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~{\mathit{typeidx}}~{\mathit{u{\kern-0.1em\scriptstyle 32}}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{struct{.}set}`, then: - a. Let :math:`(\mathsf{struct{.}set}~{\mathit{typeidx}}~{\mathit{u{\kern-0.1em\scriptstyle 32}}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{struct{.}set}~{\mathit{typeidx}}~{\mathit{u{\kern-0.1em\scriptstyle 32}}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}new}`, then: - a. Let :math:`(\mathsf{array{.}new}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array{.}new}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}new\_default}`, then: - a. Let :math:`(\mathsf{array{.}new\_default}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array{.}new\_default}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}new\_fixed}`, then: - a. Let :math:`(\mathsf{array{.}new\_fixed}~{\mathit{typeidx}}~{\mathit{u{\kern-0.1em\scriptstyle 32}}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array{.}new\_fixed}~{\mathit{typeidx}}~{\mathit{u{\kern-0.1em\scriptstyle 32}}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}new\_data}`, then: - a. Let :math:`(\mathsf{array{.}new\_data}~{\mathit{typeidx}}~{\mathit{dataidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array{.}new\_data}~{\mathit{typeidx}}~{\mathit{dataidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_typeidx(typeidx) ++ $free_dataidx(dataidx)`. + #. Return `$free_typeidx(typeidx) ++ $free_dataidx(dataidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}new\_elem}`, then: - a. Let :math:`(\mathsf{array{.}new\_elem}~{\mathit{typeidx}}~{\mathit{elemidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array{.}new\_elem}~{\mathit{typeidx}}~{\mathit{elemidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_typeidx(typeidx) ++ $free_elemidx(elemidx)`. + #. Return `$free_typeidx(typeidx) ++ $free_elemidx(elemidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}get}`, then: - a. Let :math:`({\mathsf{array{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathsf{array{.}get}}{\mathsf{\_}}{{{\mathit{sx}}^?}}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}set}`, then: - a. Let :math:`(\mathsf{array{.}set}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array{.}set}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{array{.}len}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}fill}`, then: - a. Let :math:`(\mathsf{array{.}fill}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array{.}fill}~{\mathit{typeidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{typeidx}}({\mathit{typeidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}copy}`, then: - a. Let :math:`(\mathsf{array{.}copy}~{\mathit{typeidx}}_1~{\mathit{typeidx}}_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array{.}copy}~{\mathit{typeidx}}_1~{\mathit{typeidx}}_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_typeidx(typeidx_1) ++ $free_typeidx(typeidx_2)`. + #. Return `$free_typeidx(typeidx_1) ++ $free_typeidx(typeidx_2)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}init\_data}`, then: - a. Let :math:`(\mathsf{array{.}init\_data}~{\mathit{typeidx}}~{\mathit{dataidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array{.}init\_data}~{\mathit{typeidx}}~{\mathit{dataidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_typeidx(typeidx) ++ $free_dataidx(dataidx)`. + #. Return `$free_typeidx(typeidx) ++ $free_dataidx(dataidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{array{.}init\_elem}`, then: - a. Let :math:`(\mathsf{array{.}init\_elem}~{\mathit{typeidx}}~{\mathit{elemidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{array{.}init\_elem}~{\mathit{typeidx}}~{\mathit{elemidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_typeidx(typeidx) ++ $free_elemidx(elemidx)`. + #. Return `$free_typeidx(typeidx) ++ $free_elemidx(elemidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{extern{.}convert\_any}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{any{.}convert\_extern}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{local{.}get}`, then: - a. Let :math:`(\mathsf{local{.}get}~{\mathit{localidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{local{.}get}~{\mathit{localidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{localidx}}({\mathit{localidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{localidx}}({\mathit{localidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{local{.}set}`, then: - a. Let :math:`(\mathsf{local{.}set}~{\mathit{localidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{local{.}set}~{\mathit{localidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{localidx}}({\mathit{localidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{localidx}}({\mathit{localidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{local{.}tee}`, then: - a. Let :math:`(\mathsf{local{.}tee}~{\mathit{localidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{local{.}tee}~{\mathit{localidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{localidx}}({\mathit{localidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{localidx}}({\mathit{localidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{global{.}get}`, then: - a. Let :math:`(\mathsf{global{.}get}~{\mathit{globalidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{global{.}get}~{\mathit{globalidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{globalidx}}({\mathit{globalidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{globalidx}}({\mathit{globalidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{global{.}set}`, then: - a. Let :math:`(\mathsf{global{.}set}~{\mathit{globalidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{global{.}set}~{\mathit{globalidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{globalidx}}({\mathit{globalidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{globalidx}}({\mathit{globalidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table{.}get}`, then: - a. Let :math:`(\mathsf{table{.}get}~{\mathit{tableidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table{.}get}~{\mathit{tableidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table{.}set}`, then: - a. Let :math:`(\mathsf{table{.}set}~{\mathit{tableidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table{.}set}~{\mathit{tableidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table{.}size}`, then: - a. Let :math:`(\mathsf{table{.}size}~{\mathit{tableidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table{.}size}~{\mathit{tableidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table{.}grow}`, then: - a. Let :math:`(\mathsf{table{.}grow}~{\mathit{tableidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table{.}grow}~{\mathit{tableidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table{.}fill}`, then: - a. Let :math:`(\mathsf{table{.}fill}~{\mathit{tableidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table{.}fill}~{\mathit{tableidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{tableidx}}({\mathit{tableidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table{.}copy}`, then: - a. Let :math:`(\mathsf{table{.}copy}~{\mathit{tableidx}}_1~{\mathit{tableidx}}_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table{.}copy}~{\mathit{tableidx}}_1~{\mathit{tableidx}}_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_tableidx(tableidx_1) ++ $free_tableidx(tableidx_2)`. + #. Return `$free_tableidx(tableidx_1) ++ $free_tableidx(tableidx_2)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table{.}init}`, then: - a. Let :math:`(\mathsf{table{.}init}~{\mathit{tableidx}}~{\mathit{elemidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table{.}init}~{\mathit{tableidx}}~{\mathit{elemidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_tableidx(tableidx) ++ $free_elemidx(elemidx)`. + #. Return `$free_tableidx(tableidx) ++ $free_elemidx(elemidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{elem{.}drop}`, then: - a. Let :math:`(\mathsf{elem{.}drop}~{\mathit{elemidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{elem{.}drop}~{\mathit{elemidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{elemidx}}({\mathit{elemidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{elemidx}}({\mathit{elemidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{load}`, then: - a. Let :math:`({{\mathit{numtype}}{.}\mathsf{load}}{{{\mathit{loadop}}^?}}~{\mathit{memidx}}~{\mathit{memarg}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({{\mathit{numtype}}{.}\mathsf{load}}{{{\mathit{loadop}}^?}}~{\mathit{memidx}}~{\mathit{memarg}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_numtype(numtype) ++ $free_memidx(memidx)`. + #. Return `$free_numtype(numtype) ++ $free_memidx(memidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{store}`, then: - a. Let :math:`({{\mathit{numtype}}{.}\mathsf{store}}{{{\mathit{storeop}}^?}}~{\mathit{memidx}}~{\mathit{memarg}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({{\mathit{numtype}}{.}\mathsf{store}}{{{\mathit{storeop}}^?}}~{\mathit{memidx}}~{\mathit{memarg}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_numtype(numtype) ++ $free_memidx(memidx)`. + #. Return `$free_numtype(numtype) ++ $free_memidx(memidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vload}`, then: - a. Let :math:`({{\mathit{vectype}}{.}\mathsf{load}}{{{\mathit{vloadop}}^?}}~{\mathit{memidx}}~{\mathit{memarg}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({{\mathit{vectype}}{.}\mathsf{load}}{{{\mathit{vloadop}}^?}}~{\mathit{memidx}}~{\mathit{memarg}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_vectype(vectype) ++ $free_memidx(memidx)`. + #. Return `$free_vectype(vectype) ++ $free_memidx(memidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vload\_lane}`, then: - a. Let :math:`({{\mathit{vectype}}{.}\mathsf{load}}{{\mathit{sz}}}{\mathsf{\_}}{\mathsf{lane}}~{\mathit{memidx}}~{\mathit{memarg}}~{\mathit{laneidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({{\mathit{vectype}}{.}\mathsf{load}}{{\mathit{sz}}}{\mathsf{\_}}{\mathsf{lane}}~{\mathit{memidx}}~{\mathit{memarg}}~{\mathit{laneidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_vectype(vectype) ++ $free_memidx(memidx)`. + #. Return `$free_vectype(vectype) ++ $free_memidx(memidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vstore}`, then: - a. Let :math:`({\mathit{vectype}}{.}\mathsf{store}~{\mathit{memidx}}~{\mathit{memarg}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathit{vectype}}{.}\mathsf{store}~{\mathit{memidx}}~{\mathit{memarg}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_vectype(vectype) ++ $free_memidx(memidx)`. + #. Return `$free_vectype(vectype) ++ $free_memidx(memidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{vstore\_lane}`, then: - a. Let :math:`({{\mathit{vectype}}{.}\mathsf{store}}{{\mathit{sz}}}{\mathsf{\_}}{\mathsf{lane}}~{\mathit{memidx}}~{\mathit{memarg}}~{\mathit{laneidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({{\mathit{vectype}}{.}\mathsf{store}}{{\mathit{sz}}}{\mathsf{\_}}{\mathsf{lane}}~{\mathit{memidx}}~{\mathit{memarg}}~{\mathit{laneidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_vectype(vectype) ++ $free_memidx(memidx)`. + #. Return `$free_vectype(vectype) ++ $free_memidx(memidx)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{memory{.}size}`, then: - a. Let :math:`(\mathsf{memory{.}size}~{\mathit{memidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{memory{.}size}~{\mathit{memidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{memidx}}({\mathit{memidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{memidx}}({\mathit{memidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{memory{.}grow}`, then: - a. Let :math:`(\mathsf{memory{.}grow}~{\mathit{memidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{memory{.}grow}~{\mathit{memidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{memidx}}({\mathit{memidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{memidx}}({\mathit{memidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{memory{.}fill}`, then: - a. Let :math:`(\mathsf{memory{.}fill}~{\mathit{memidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{memory{.}fill}~{\mathit{memidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{free}}_{\mathit{memidx}}({\mathit{memidx}})`. + #. Return :math:`{\mathrm{free}}_{\mathit{memidx}}({\mathit{memidx}})`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{memory{.}copy}`, then: - a. Let :math:`(\mathsf{memory{.}copy}~{\mathit{memidx}}_1~{\mathit{memidx}}_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{memory{.}copy}~{\mathit{memidx}}_1~{\mathit{memidx}}_2)` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_memidx(memidx_1) ++ $free_memidx(memidx_2)`. + #. Return `$free_memidx(memidx_1) ++ $free_memidx(memidx_2)`. #. If :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{memory{.}init}`, then: - a. Let :math:`(\mathsf{memory{.}init}~{\mathit{memidx}}~{\mathit{dataidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{memory{.}init}~{\mathit{memidx}}~{\mathit{dataidx}})` be :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_memidx(memidx) ++ $free_dataidx(dataidx)`. + #. Return `$free_memidx(memidx) ++ $free_dataidx(dataidx)`. #. Assert: Due to validation, :math:`{\mathit{instr}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{data{.}drop}`. @@ -21438,13 +21438,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{active}`, then: - a. Let :math:`(\mathsf{active}~{\mathit{tableidx}}~{\mathit{expr}})` be :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{active}~{\mathit{tableidx}}~{\mathit{expr}})` be :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_tableidx(tableidx) ++ $free_expr(expr)`. + #. Return `$free_tableidx(tableidx) ++ $free_expr(expr)`. #. If :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{passive}`, then: - a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. + a. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{locals}~\epsilon,\; \mathsf{labels}~\epsilon \}\end{array}`. #. Assert: Due to validation, :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{declare}`. @@ -21464,9 +21464,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{active}`, then: - a. Let :math:`(\mathsf{active}~{\mathit{memidx}}~{\mathit{expr}})` be :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{active}~{\mathit{memidx}}~{\mathit{expr}})` be :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return `$free_memidx(memidx) ++ $free_expr(expr)`. + #. Return `$free_memidx(memidx) ++ $free_expr(expr)`. #. Assert: Due to validation, :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{passive}`. @@ -21528,7 +21528,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{localidx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{{{\mathit{lt}}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`C`. + a. Return :math:`C`. #. Assert: Due to validation, :math:`{|{{{\mathit{lt}}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. @@ -21547,7 +21547,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{{\mathit{dt}}^\ast}~{\mathit{dt}}_n` be :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -21589,13 +21589,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is defined type, then: - a. Return true. + a. Return true. #. If :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case , then: - a. Let :math:`{\mathit{typeidx}}` be :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{typeidx}}` be :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathit{typeidx}} < x`. + #. Return :math:`{\mathit{typeidx}} < x`. #. Assert: Due to validation, :math:`y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{rec}`. @@ -21610,15 +21610,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is defined type, then: - a. Let :math:`{\mathit{deftype}}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{deftype}}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{unroll}}({\mathit{deftype}})`. + #. Return :math:`{\mathrm{unroll}}({\mathit{deftype}})`. #. If :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case , then: - a. Let :math:`{\mathit{typeidx}}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{typeidx}}` be :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathrm{unroll}}(C{.}\mathsf{types}{}[{\mathit{typeidx}}])`. + #. Return :math:`{\mathrm{unroll}}(C{.}\mathsf{types}{}[{\mathit{typeidx}}])`. #. Assert: Due to validation, :math:`{\mathit{ht}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{rec}`. @@ -21633,21 +21633,21 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{N}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{N}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`({\mathsf{i}}{N}{.}\mathsf{const}~0)`. + #. Return :math:`({\mathsf{i}}{N}{.}\mathsf{const}~0)`. #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: - a. Let :math:`{\mathsf{f}}{N}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{f}}{N}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`({\mathsf{f}}{N}{.}\mathsf{const}~{+0})`. + #. Return :math:`({\mathsf{f}}{N}{.}\mathsf{const}~{+0})`. #. If the type of :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Vnn, then: - a. Let :math:`{\mathsf{v}}{N}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{v}}{N}` be :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`({\mathsf{v}}{N}{.}\mathsf{const}~0)`. + #. Return :math:`({\mathsf{v}}{N}{.}\mathsf{const}~0)`. #. Assert: Due to validation, :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ref}`. @@ -21655,7 +21655,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{NULL}}_{{\mathit{opt}}_0} = \mathsf{null}`, then: - a. Return :math:`(\mathsf{ref{.}null}~{\mathit{ht}})`. + a. Return :math:`(\mathsf{ref{.}null}~{\mathit{ht}})`. #. Assert: Due to validation, :math:`{\mathit{NULL}}_{{\mathit{opt}}_0}` is not defined. @@ -21675,7 +21675,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathrm{ND}}`, then: - a. Return :math:`X_1~X_2{}[i]`. + a. Return :math:`X_1~X_2{}[i]`. #. Return :math:`X_1~X_2{}[0]`. @@ -21686,7 +21686,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathrm{ND}}`, then: - a. Return :math:`X_1~X_2~X_3~X_4{}[i]`. + a. Return :math:`X_1~X_2~X_3~X_4{}[i]`. #. Return :math:`X_1~X_2~X_3~X_4{}[0]`. @@ -21715,7 +21715,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`i < {2^{N - 1}}`, then: - a. Return :math:`i`. + a. Return :math:`i`. #. Assert: Due to validation, :math:`{2^{N - 1}} \leq i`. @@ -21739,7 +21739,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is literal type, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -21752,7 +21752,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: - a. Return :math:`0`. + a. Return :math:`0`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -21767,7 +21767,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`b_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is false, then: - a. Return :math:`0`. + a. Return :math:`0`. #. Assert: Due to validation, :math:`b_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is true. @@ -21780,11 +21780,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`i < 0`, then: - a. Return :math:`0`. + a. Return :math:`0`. #. If :math:`i > {2^{N}} - 1`, then: - a. Return :math:`{2^{N}} - 1`. + a. Return :math:`{2^{N}} - 1`. #. Return :math:`i`. @@ -21795,11 +21795,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`i < {-{2^{N - 1}}}`, then: - a. Return :math:`{-{2^{N - 1}}}`. + a. Return :math:`{-{2^{N - 1}}}`. #. If :math:`i > {2^{N - 1}} - 1`, then: - a. Return :math:`{2^{N - 1}} - 1`. + a. Return :math:`{2^{N - 1}} - 1`. #. Return :math:`i`. @@ -21817,7 +21817,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathrm{signed}}}_{N}(i_1) \geq 0`, then: - a. Return :math:`i_1`. + a. Return :math:`i_1`. #. Return :math:`{{\mathrm{ineg}}}_{N}(i_1)`. @@ -21828,7 +21828,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{u}`, then: - a. Return :math:`i \mathbin{\mathrm{mod}} ({2^{M}})`. + a. Return :math:`i \mathbin{\mathrm{mod}} ({2^{M}})`. #. Assert: Due to validation, :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{s}`. @@ -21862,7 +21862,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{u}`, then: - a. Return :math:`{{\mathrm{sat\_u}}}_{N}(i_1 + i_2)`. + a. Return :math:`{{\mathrm{sat\_u}}}_{N}(i_1 + i_2)`. #. Assert: Due to validation, :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{s}`. @@ -21875,7 +21875,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{u}`, then: - a. Return :math:`{{\mathrm{sat\_u}}}_{N}(i_1 - i_2)`. + a. Return :math:`{{\mathrm{sat\_u}}}_{N}(i_1 - i_2)`. #. Assert: Due to validation, :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{s}`. @@ -21916,7 +21916,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{u}`, then: - a. Return :math:`\mathbb{B}(i_1 < i_2)`. + a. Return :math:`\mathbb{B}(i_1 < i_2)`. #. Assert: Due to validation, :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{s}`. @@ -21929,7 +21929,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{u}`, then: - a. Return :math:`\mathbb{B}(i_1 > i_2)`. + a. Return :math:`\mathbb{B}(i_1 > i_2)`. #. Assert: Due to validation, :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{s}`. @@ -21942,7 +21942,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{u}`, then: - a. Return :math:`\mathbb{B}(i_1 \leq i_2)`. + a. Return :math:`\mathbb{B}(i_1 \leq i_2)`. #. Assert: Due to validation, :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{s}`. @@ -21955,7 +21955,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{u}`, then: - a. Return :math:`\mathbb{B}(i_1 \geq i_2)`. + a. Return :math:`\mathbb{B}(i_1 \geq i_2)`. #. Assert: Due to validation, :math:`{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{s}`. @@ -21968,7 +21968,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Return :math:`c`. + a. Return :math:`c`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -21983,7 +21983,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is number type, then: - a. Return :math:`c`. + a. Return :math:`c`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -21998,7 +21998,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is literal type, then: - a. Return :math:`c`. + a. Return :math:`c`. #. Assert: Due to validation, the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -22013,7 +22013,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is literal type, then: - a. Return :math:`c`. + a. Return :math:`c`. #. Assert: Due to validation, the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -22028,27 +22028,27 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`i` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`i` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{clz}`, then: + #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{clz}`, then: - 1) Return :math:`{{\mathrm{iclz}}}_{N}(i)`. + 1) Return :math:`{{\mathrm{iclz}}}_{N}(i)`. - #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ctz}`, then: + #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ctz}`, then: - 1) Return :math:`{{\mathrm{ictz}}}_{N}(i)`. + 1) Return :math:`{{\mathrm{ictz}}}_{N}(i)`. - #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{popcnt}`, then: + #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{popcnt}`, then: - 1) Return :math:`{{\mathrm{ipopcnt}}}_{N}(i)`. + 1) Return :math:`{{\mathrm{ipopcnt}}}_{N}(i)`. - #. Assert: Due to validation, :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`. + #. Assert: Due to validation, :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`. - #. Let :math:`({\mathsf{extend}}{M}{\mathsf{\_}}{\mathsf{s}})` be :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`({\mathsf{extend}}{M}{\mathsf{\_}}{\mathsf{s}})` be :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{{{{\mathrm{iextend}}}_{N, M}^{\mathsf{s}}}}{(i)}`. + #. Return :math:`{{{{\mathrm{iextend}}}_{N, M}^{\mathsf{s}}}}{(i)}`. #. Assert: Due to validation, the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -22058,27 +22058,27 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{abs}`, then: - a. Return :math:`{{\mathrm{fabs}}}_{N}(f)`. + a. Return :math:`{{\mathrm{fabs}}}_{N}(f)`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{neg}`, then: - a. Return :math:`{{\mathrm{fneg}}}_{N}(f)`. + a. Return :math:`{{\mathrm{fneg}}}_{N}(f)`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sqrt}`, then: - a. Return :math:`{{\mathrm{fsqrt}}}_{N}(f)`. + a. Return :math:`{{\mathrm{fsqrt}}}_{N}(f)`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ceil}`, then: - a. Return :math:`{{\mathrm{fceil}}}_{N}(f)`. + a. Return :math:`{{\mathrm{fceil}}}_{N}(f)`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{floor}`, then: - a. Return :math:`{{\mathrm{ffloor}}}_{N}(f)`. + a. Return :math:`{{\mathrm{ffloor}}}_{N}(f)`. #. If :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{trunc}`, then: - a. Return :math:`{{\mathrm{ftrunc}}}_{N}(f)`. + a. Return :math:`{{\mathrm{ftrunc}}}_{N}(f)`. #. Assert: Due to validation, :math:`{\mathit{unop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{nearest}`. @@ -22091,65 +22091,65 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`i_2` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + #. Let :math:`i_2` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: - 1) Return :math:`{{\mathrm{iadd}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{iadd}}}_{N}(i_1, i_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: - 1) Return :math:`{{\mathrm{isub}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{isub}}}_{N}(i_1, i_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: - 1) Return :math:`{{\mathrm{imul}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{imul}}}_{N}(i_1, i_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{div}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{div}`, then: - 1) Let :math:`({\mathsf{div}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{div}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{idiv}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. + #) Return :math:`{{{{\mathrm{idiv}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{rem}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{rem}`, then: - 1) Let :math:`({\mathsf{rem}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{rem}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{irem}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. + #) Return :math:`{{{{\mathrm{irem}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{and}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{and}`, then: - 1) Return :math:`{{\mathrm{iand}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{iand}}}_{N}(i_1, i_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{or}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{or}`, then: - 1) Return :math:`{{\mathrm{ior}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{ior}}}_{N}(i_1, i_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{xor}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{xor}`, then: - 1) Return :math:`{{\mathrm{ixor}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{ixor}}}_{N}(i_1, i_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{shl}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{shl}`, then: - 1) Return :math:`{{\mathrm{ishl}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{ishl}}}_{N}(i_1, i_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{shr}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{shr}`, then: - 1) Let :math:`({\mathsf{shr}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{shr}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ishr}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. + #) Return :math:`{{{{\mathrm{ishr}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotl}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotl}`, then: - 1) Return :math:`{{\mathrm{irotl}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{irotl}}}_{N}(i_1, i_2)`. - #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotr}`, then: + #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{rotr}`, then: - 1) Return :math:`{{\mathrm{irotr}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{irotr}}}_{N}(i_1, i_2)`. #. Assert: Due to validation, the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -22161,27 +22161,27 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: - a. Return :math:`{{\mathrm{fadd}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{fadd}}}_{N}(f_1, f_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: - a. Return :math:`{{\mathrm{fsub}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{fsub}}}_{N}(f_1, f_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: - a. Return :math:`{{\mathrm{fmul}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{fmul}}}_{N}(f_1, f_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{div}`, then: - a. Return :math:`{{\mathrm{fdiv}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{fdiv}}}_{N}(f_1, f_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{min}`, then: - a. Return :math:`{{\mathrm{fmin}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{fmin}}}_{N}(f_1, f_2)`. #. If :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{max}`, then: - a. Return :math:`{{\mathrm{fmax}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{fmax}}}_{N}(f_1, f_2)`. #. Assert: Due to validation, :math:`{\mathit{binop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{copysign}`. @@ -22201,43 +22201,43 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #. Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`i_2` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. + #. Let :math:`i_2` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 2}}}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: - 1) Return :math:`{{\mathrm{ieq}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{ieq}}}_{N}(i_1, i_2)`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: - 1) Return :math:`{{\mathrm{ine}}}_{N}(i_1, i_2)`. + 1) Return :math:`{{\mathrm{ine}}}_{N}(i_1, i_2)`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{lt}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{lt}`, then: - 1) Let :math:`({\mathsf{lt}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{lt}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ilt}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. + #) Return :math:`{{{{\mathrm{ilt}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{gt}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{gt}`, then: - 1) Let :math:`({\mathsf{gt}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{gt}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{igt}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. + #) Return :math:`{{{{\mathrm{igt}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{le}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{le}`, then: - 1) Let :math:`({\mathsf{le}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{le}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ile}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. + #) Return :math:`{{{{\mathrm{ile}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. - #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ge}`, then: + #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ge}`, then: - 1) Let :math:`({\mathsf{ge}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{ge}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{ige}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. + #) Return :math:`{{{{\mathrm{ige}}}_{N}^{{\mathit{sx}}}}}{(i_1, i_2)}`. #. Assert: Due to validation, the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -22249,23 +22249,23 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: - a. Return :math:`{{\mathrm{feq}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{feq}}}_{N}(f_1, f_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: - a. Return :math:`{{\mathrm{fne}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{fne}}}_{N}(f_1, f_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{lt}`, then: - a. Return :math:`{{\mathrm{flt}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{flt}}}_{N}(f_1, f_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{gt}`, then: - a. Return :math:`{{\mathrm{fgt}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{fgt}}}_{N}(f_1, f_2)`. #. If :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{le}`, then: - a. Return :math:`{{\mathrm{fle}}}_{N}(f_1, f_2)`. + a. Return :math:`{{\mathrm{fle}}}_{N}(f_1, f_2)`. #. Assert: Due to validation, :math:`{\mathit{relop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ge}`. @@ -22278,97 +22278,97 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{{\mathsf{i}}{N}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{i}}{N}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Inn, then: + #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Inn, then: - 1) Let :math:`{{\mathsf{i}}{N}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + 1) Let :math:`{{\mathsf{i}}{N}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`, then: - a) Let :math:`({\mathsf{extend}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`({\mathsf{extend}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{extend}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(i_1)}`. + #) Return :math:`{{{{\mathrm{extend}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(i_1)}`. - #) Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{wrap}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{wrap}`, then: - a) Return :math:`{{\mathrm{wrap}}}_{N_1, N_2}(i_1)`. + a) Return :math:`{{\mathrm{wrap}}}_{N_1, N_2}(i_1)`. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: - a. Let :math:`{{\mathsf{f}}{N}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{f}}{N}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Inn, then: + #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Inn, then: - 1) Let :math:`{{\mathsf{i}}{N}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + 1) Let :math:`{{\mathsf{i}}{N}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc}`, then: - a) Let :math:`({\mathsf{trunc}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`({\mathsf{trunc}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`f_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`f_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{trunc}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(f_1)}`. + #) Return :math:`{{{{\mathrm{trunc}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(f_1)}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc\_sat}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc\_sat}`, then: - a) Let :math:`({\mathsf{trunc\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`({\mathsf{trunc\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`f_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`f_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{trunc\_sat}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(f_1)}`. + #) Return :math:`{{{{\mathrm{trunc\_sat}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(f_1)}`. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{{\mathsf{i}}{N}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{i}}{N}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: + #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: - 1) Let :math:`{{\mathsf{f}}{N}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + 1) Let :math:`{{\mathsf{f}}{N}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{convert}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{convert}`, then: - a) Let :math:`({\mathsf{convert}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`({\mathsf{convert}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{{{\mathrm{convert}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(i_1)}`. + #) Return :math:`{{{{\mathrm{convert}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(i_1)}`. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: - a. Let :math:`{{\mathsf{f}}{N}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{f}}{N}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: + #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: - 1) Let :math:`{{\mathsf{f}}{N}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + 1) Let :math:`{{\mathsf{f}}{N}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #) Let :math:`f_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`f_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{promote}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{promote}`, then: - a) Return :math:`{{\mathrm{promote}}}_{N_1, N_2}(f_1)`. + a) Return :math:`{{\mathrm{promote}}}_{N_1, N_2}(f_1)`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{demote}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{demote}`, then: - a) Return :math:`{{\mathrm{demote}}}_{N_1, N_2}(f_1)`. + a) Return :math:`{{\mathrm{demote}}}_{N_1, N_2}(f_1)`. #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{{\mathsf{i}}{N}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{i}}{N}}_1` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: + #. If the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn, then: - 1) Let :math:`{{\mathsf{f}}{N}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + 1) Let :math:`{{\mathsf{f}}{N}}_2` be :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #) Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + #) Let :math:`i_1` be :math:`i_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{reinterpret}` and :math:`{|{{\mathsf{i}}{N}}_1|} = {|{{\mathsf{f}}{N}}_2|}`, then: + #) If :math:`{\mathit{cvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{reinterpret}` and :math:`{|{{\mathsf{i}}{N}}_1|} = {|{{\mathsf{f}}{N}}_2|}`, then: - a) Return :math:`{{\mathrm{reinterpret}}}_{{{\mathsf{i}}{N}}_1, {{\mathsf{f}}{N}}_2}(i_1)`. + a) Return :math:`{{\mathrm{reinterpret}}}_{{{\mathsf{i}}{N}}_1, {{\mathsf{f}}{N}}_2}(i_1)`. #. Assert: Due to validation, the type of :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -22402,13 +22402,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn and the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is Jnn, then: - a. If :math:`{\mathit{half}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{low}`, then: + a. If :math:`{\mathit{half}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{low}`, then: - 1) Return :math:`i`. + 1) Return :math:`i`. - #. If :math:`{\mathit{half}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{high}`, then: + #. If :math:`{\mathit{half}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{high}`, then: - 1) Return :math:`j`. + 1) Return :math:`j`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 2}}}` is Fnn. @@ -22423,7 +22423,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`i < {|{c^\ast}|}`, then: - a. Return :math:`{c^\ast}{}[i]`. + a. Return :math:`{c^\ast}{}[i]`. #. Return :math:`0`. @@ -22434,11 +22434,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`i < {|{c^\ast}|}`, then: - a. Return :math:`{c^\ast}{}[i]`. + a. Return :math:`{c^\ast}{}[i]`. #. If :math:`{{\mathrm{signed}}}_{N}(i) < 0`, then: - a. Return :math:`0`. + a. Return :math:`0`. #. Return :math:`{{\mathrm{relaxed}}({\mathrm{R}}_{\mathit{swizzle}})}{{}[ 0, {c^\ast}{}[i \mathbin{\mathrm{mod}} {|{c^\ast}|}] ]}`. @@ -22684,15 +22684,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{vvbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{and}`, then: - a. Return :math:`{{\mathrm{iand}}}_{N}(v_1, v_2)`. + a. Return :math:`{{\mathrm{iand}}}_{N}(v_1, v_2)`. #. If :math:`{\mathit{vvbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{andnot}`, then: - a. Return :math:`{{\mathrm{iandnot}}}_{N}(v_1, v_2)`. + a. Return :math:`{{\mathrm{iandnot}}}_{N}(v_1, v_2)`. #. If :math:`{\mathit{vvbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{or}`, then: - a. Return :math:`{{\mathrm{ior}}}_{N}(v_1, v_2)`. + a. Return :math:`{{\mathrm{ior}}}_{N}(v_1, v_2)`. #. Assert: Due to validation, :math:`{\mathit{vvbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{xor}`. @@ -22712,35 +22712,35 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: - a. Let :math:`{\mathsf{f}}{N}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{f}}{N}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{abs}`, then: + #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{abs}`, then: - 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fabs}}, v)`. + 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fabs}}, v)`. - #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{neg}`, then: + #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{neg}`, then: - 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fneg}}, v)`. + 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fneg}}, v)`. - #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sqrt}`, then: + #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sqrt}`, then: - 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fsqrt}}, v)`. + 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fsqrt}}, v)`. - #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ceil}`, then: + #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ceil}`, then: - 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fceil}}, v)`. + 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fceil}}, v)`. - #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{floor}`, then: + #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{floor}`, then: - 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{ffloor}}, v)`. + 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{ffloor}}, v)`. - #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{trunc}`, then: + #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{trunc}`, then: - 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{ftrunc}}, v)`. + 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{ftrunc}}, v)`. - #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{nearest}`, then: + #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{nearest}`, then: - 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fnearest}}, v)`. + 1) Return :math:`{{\mathrm{fvunop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fnearest}}, v)`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn. @@ -22748,11 +22748,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{abs}`, then: - a. Return :math:`{{\mathrm{ivunop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{iabs}}, v)`. + a. Return :math:`{{\mathrm{ivunop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{iabs}}, v)`. #. If :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{neg}`, then: - a. Return :math:`{{\mathrm{ivunop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ineg}}, v)`. + a. Return :math:`{{\mathrm{ivunop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ineg}}, v)`. #. Assert: Due to validation, :math:`{\mathit{vunop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{popcnt}`. @@ -22765,55 +22765,55 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: - a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: - 1) Return :math:`{{\mathrm{ivbinop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{iadd}}, v_1, v_2)`. + 1) Return :math:`{{\mathrm{ivbinop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{iadd}}, v_1, v_2)`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: - 1) Return :math:`{{\mathrm{ivbinop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{isub}}, v_1, v_2)`. + 1) Return :math:`{{\mathrm{ivbinop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{isub}}, v_1, v_2)`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: - 1) Return :math:`{{\mathrm{ivbinop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{imul}}, v_1, v_2)`. + 1) Return :math:`{{\mathrm{ivbinop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{imul}}, v_1, v_2)`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{add\_sat}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{add\_sat}`, then: - 1) Let :math:`({\mathsf{add\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{add\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{iadd}}_{{\mathit{sat}}}, {\mathit{sx}}, v_1, v_2)`. + #) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{iadd}}_{{\mathit{sat}}}, {\mathit{sx}}, v_1, v_2)`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{sub\_sat}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{sub\_sat}`, then: - 1) Let :math:`({\mathsf{sub\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{sub\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{isub}}_{{\mathit{sat}}}, {\mathit{sx}}, v_1, v_2)`. + #) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{isub}}_{{\mathit{sat}}}, {\mathit{sx}}, v_1, v_2)`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{min}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{min}`, then: - 1) Let :math:`({\mathsf{min}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{min}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{imin}}, {\mathit{sx}}, v_1, v_2)`. + #) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{imin}}, {\mathit{sx}}, v_1, v_2)`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{max}`, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{max}`, then: - 1) Let :math:`({\mathsf{max}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{max}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{imax}}, {\mathit{sx}}, v_1, v_2)`. + #) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{imax}}, {\mathit{sx}}, v_1, v_2)`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: - 1) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{iavgr}}, \mathsf{u}, v_1, v_2)`. + 1) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{iavgr}}, \mathsf{u}, v_1, v_2)`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: - 1) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{iq{\kern-0.1em\scriptstyle 15\kern-0.1em}mulr}}_{{\mathit{sat}}}, \mathsf{s}, v_1, v_2)`. + 1) Return :math:`{{\mathrm{ivbinopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{iq{\kern-0.1em\scriptstyle 15\kern-0.1em}mulr}}_{{\mathit{sat}}}, \mathsf{s}, v_1, v_2)`. - #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: + #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: - 1) Return :math:`{{\mathrm{ivbinopsxnd}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{irelaxed}}_{{\mathit{q{\kern-0.1em\scriptstyle 15\kern-0.1em}mulr}}}, \mathsf{s}, v_1, v_2)`. + 1) Return :math:`{{\mathrm{ivbinopsxnd}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{irelaxed}}_{{\mathit{q{\kern-0.1em\scriptstyle 15\kern-0.1em}mulr}}}, \mathsf{s}, v_1, v_2)`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -22821,39 +22821,39 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{add}`, then: - a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fadd}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fadd}}, v_1, v_2)`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{sub}`, then: - a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fsub}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fsub}}, v_1, v_2)`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{mul}`, then: - a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fmul}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fmul}}, v_1, v_2)`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{div}`, then: - a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fdiv}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fdiv}}, v_1, v_2)`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{min}`, then: - a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fmin}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fmin}}, v_1, v_2)`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{max}`, then: - a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fmax}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fmax}}, v_1, v_2)`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{pmin}`, then: - a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fpmin}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fpmin}}, v_1, v_2)`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{pmax}`, then: - a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fpmax}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fpmax}}, v_1, v_2)`. #. If :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{relaxed\_min}`, then: - a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{frelaxed}}_{{\mathit{min}}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{frelaxed}}_{{\mathit{min}}}, v_1, v_2)`. #. Assert: Due to validation, :math:`{\mathit{vbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{relaxed\_max}`. @@ -22866,11 +22866,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: - a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{vternop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{relaxed\_laneselect}`, then: + #. If :math:`{\mathit{vternop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{relaxed\_laneselect}`, then: - 1) Return :math:`{{\mathrm{ivternopnd}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{irelaxed}}_{{\mathit{laneselect}}}, v_1, v_2, v_3)`. + 1) Return :math:`{{\mathrm{ivternopnd}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{irelaxed}}_{{\mathit{laneselect}}}, v_1, v_2, v_3)`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -22878,7 +22878,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{vternop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{relaxed\_madd}`, then: - a. Return :math:`{{\mathrm{fvternop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{frelaxed}}_{{\mathit{madd}}}, v_1, v_2, v_3)`. + a. Return :math:`{{\mathrm{fvternop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{frelaxed}}_{{\mathit{madd}}}, v_1, v_2, v_3)`. #. Assert: Due to validation, :math:`{\mathit{vternop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{relaxed\_nmadd}`. @@ -22898,39 +22898,39 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: - a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathsf{i}}{N}` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: - 1) Return :math:`{{\mathrm{ivrelop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ieq}}, v_1, v_2)`. + 1) Return :math:`{{\mathrm{ivrelop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ieq}}, v_1, v_2)`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: - 1) Return :math:`{{\mathrm{ivrelop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ine}}, v_1, v_2)`. + 1) Return :math:`{{\mathrm{ivrelop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ine}}, v_1, v_2)`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{lt}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{lt}`, then: - 1) Let :math:`({\mathsf{lt}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{lt}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{\mathrm{ivrelopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ilt}}, {\mathit{sx}}, v_1, v_2)`. + #) Return :math:`{{\mathrm{ivrelopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ilt}}, {\mathit{sx}}, v_1, v_2)`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{gt}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{gt}`, then: - 1) Let :math:`({\mathsf{gt}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{gt}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{\mathrm{ivrelopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{igt}}, {\mathit{sx}}, v_1, v_2)`. + #) Return :math:`{{\mathrm{ivrelopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{igt}}, {\mathit{sx}}, v_1, v_2)`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{le}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{le}`, then: - 1) Let :math:`({\mathsf{le}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{le}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{\mathrm{ivrelopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ile}}, {\mathit{sx}}, v_1, v_2)`. + #) Return :math:`{{\mathrm{ivrelopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ile}}, {\mathit{sx}}, v_1, v_2)`. - #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ge}`, then: + #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{ge}`, then: - 1) Let :math:`({\mathsf{ge}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{ge}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Return :math:`{{\mathrm{ivrelopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ige}}, {\mathit{sx}}, v_1, v_2)`. + #) Return :math:`{{\mathrm{ivrelopsx}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ige}}, {\mathit{sx}}, v_1, v_2)`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -22938,23 +22938,23 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{eq}`, then: - a. Return :math:`{{\mathrm{fvrelop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{feq}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvrelop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{feq}}, v_1, v_2)`. #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ne}`, then: - a. Return :math:`{{\mathrm{fvrelop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fne}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvrelop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fne}}, v_1, v_2)`. #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{lt}`, then: - a. Return :math:`{{\mathrm{fvrelop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{flt}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvrelop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{flt}}, v_1, v_2)`. #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{gt}`, then: - a. Return :math:`{{\mathrm{fvrelop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fgt}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvrelop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fgt}}, v_1, v_2)`. #. If :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{le}`, then: - a. Return :math:`{{\mathrm{fvrelop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fle}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{fvrelop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}}({\mathrm{fle}}, v_1, v_2)`. #. Assert: Due to validation, :math:`{\mathit{vrelop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{ge}`. @@ -22967,31 +22967,31 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Jnn, then: - a. Let :math:`{{\mathsf{i}}{N}}_1` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. + a. Let :math:`{{\mathsf{i}}{N}}_1` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}`. - #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: + #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Jnn, then: - 1) Let :math:`{{\mathsf{i}}{N}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`{{\mathsf{i}}{N}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`, then: + #) If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extend}`, then: - a) Let :math:`({\mathsf{extend}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`({\mathsf{extend}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`c` be :math:`{{{{\mathrm{extend}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(c_1)}`. + #) Let :math:`c` be :math:`{{{{\mathrm{extend}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(c_1)}`. - #) Return :math:`c`. + #) Return :math:`c`. - #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: + #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn, then: - 1) Let :math:`{{\mathsf{f}}{N}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`{{\mathsf{f}}{N}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{convert}`, then: + #) If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{convert}`, then: - a) Let :math:`({\mathsf{convert}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a) Let :math:`({\mathsf{convert}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`c` be :math:`{{{{\mathrm{convert}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(c_1)}`. + #) Let :math:`c` be :math:`{{{{\mathrm{convert}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(c_1)}`. - #) Return :math:`c`. + #) Return :math:`c`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is Fnn. @@ -22999,23 +22999,23 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Inn, then: - a. Let :math:`{{\mathsf{i}}{N}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{{\mathsf{i}}{N}}_2` be :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc\_sat}`, then: + #. If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{trunc\_sat}`, then: - 1) Let :math:`({\mathsf{trunc\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{trunc\_sat}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{c^?}` be :math:`{{{{\mathrm{trunc\_sat}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(c_1)}`. + #) Let :math:`{c^?}` be :math:`{{{{\mathrm{trunc\_sat}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(c_1)}`. - #) Return :math:`{c^?}`. + #) Return :math:`{c^?}`. - #. If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{relaxed\_trunc}`, then: + #. If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{relaxed\_trunc}`, then: - 1) Let :math:`({\mathsf{relaxed\_trunc}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + 1) Let :math:`({\mathsf{relaxed\_trunc}}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #) Let :math:`{c^?}` be :math:`{{{{\mathrm{relaxed\_trunc}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(c_1)}`. + #) Let :math:`{c^?}` be :math:`{{{{\mathrm{relaxed\_trunc}}}_{N_1, N_2}^{{\mathit{sx}}}}}{(c_1)}`. - #) Return :math:`{c^?}`. + #) Return :math:`{c^?}`. #. Assert: Due to validation, the type of :math:`{\mathit{lt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is Fnn. @@ -23023,9 +23023,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{demote}`, then: - a. Let :math:`{c^\ast}` be :math:`{{\mathrm{demote}}}_{N_1, N_2}(c_1)`. + a. Let :math:`{c^\ast}` be :math:`{{\mathrm{demote}}}_{N_1, N_2}(c_1)`. - #. Return :math:`{c^\ast}`. + #. Return :math:`{c^\ast}`. #. Assert: Due to validation, :math:`{\mathit{vcvtop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{promote}`. @@ -23042,13 +23042,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{{\mathit{half}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined and :math:`{{\mathit{zero}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined and :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = M`, then: - a. Let :math:`{c_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M}}(v_1)`. + a. Let :math:`{c_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M}}(v_1)`. - #. Let :math:`{{c^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{lcvtop}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M}}({\mathit{vcvtop}}, c_1)^\ast}`. + #. Let :math:`{{c^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{lcvtop}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M}}({\mathit{vcvtop}}, c_1)^\ast}`. - #. Let :math:`v` be an element of :math:`{{{{{\mathrm{lanes}}}_{{{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M}}^{{-1}}}}{({c^\ast})}^\ast}`. + #. Let :math:`v` be an element of :math:`{{{{{\mathrm{lanes}}}_{{{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M}}^{{-1}}}}{({c^\ast})}^\ast}`. - #. Return :math:`v`. + #. Return :math:`v`. #. Let :math:`M_1` be :math:`n_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. @@ -23056,15 +23056,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{{\mathit{zero}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined and :math:`{{\mathit{half}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is defined, then: - a. Let :math:`{\mathit{half}}` be :math:`{{\mathit{half}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. + a. Let :math:`{\mathit{half}}` be :math:`{{\mathit{half}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #. Let :math:`{c_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}}(v_1){}[{\mathrm{half}}({\mathit{half}}, 0, M_2) : M_2]`. + #. Let :math:`{c_1^\ast}` be :math:`{{\mathrm{lanes}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}}(v_1){}[{\mathrm{half}}({\mathit{half}}, 0, M_2) : M_2]`. - #. Let :math:`{{c^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{lcvtop}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}({\mathit{vcvtop}}, c_1)^\ast}`. + #. Let :math:`{{c^\ast}^\ast}` be :math:`\Large\times~{{{\mathrm{lcvtop}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}({\mathit{vcvtop}}, c_1)^\ast}`. - #. Let :math:`v` be an element of :math:`{{{{{\mathrm{lanes}}}_{{{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}^{{-1}}}}{({c^\ast})}^\ast}`. + #. Let :math:`v` be an element of :math:`{{{{{\mathrm{lanes}}}_{{{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}^{{-1}}}}{({c^\ast})}^\ast}`. - #. Return :math:`v`. + #. Return :math:`v`. #. Assert: Due to validation, :math:`{{\mathit{half}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined. @@ -23085,7 +23085,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{vshiftop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{shl}`, then: - a. Return :math:`{{\mathrm{ivshiftop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ishl}}, v, i)`. + a. Return :math:`{{\mathrm{ivshiftop}}}_{{{\mathsf{i}}{N}}{\mathsf{x}}{M}}({\mathrm{ishl}}, v, i)`. #. Assert: Due to validation, :math:`{\mathit{vshiftop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{shr}`. @@ -23107,7 +23107,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{swizzlop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{swizzle}`, then: - a. Return :math:`{{\mathrm{ivswizzlop}}}_{{\mathsf{i{\scriptstyle 8}}}{\mathsf{x}}{M}}({\mathrm{iswizzle}}_{{\mathit{lane}}}, v_1, v_2)`. + a. Return :math:`{{\mathrm{ivswizzlop}}}_{{\mathsf{i{\scriptstyle 8}}}{\mathsf{x}}{M}}({\mathrm{iswizzle}}_{{\mathit{lane}}}, v_1, v_2)`. #. Assert: Due to validation, :math:`{\mathit{swizzlop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{relaxed\_swizzle}`. @@ -23215,15 +23215,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{vextbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{extmul}`, then: - a. Let :math:`({\mathsf{extmul}}{\mathsf{\_}}{{\mathit{sx}}}{\mathsf{\_}}{{\mathit{half}}})` be :math:`{\mathit{vextbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`({\mathsf{extmul}}{\mathsf{\_}}{{\mathit{sx}}}{\mathsf{\_}}{{\mathit{half}}})` be :math:`{\mathit{vextbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Let :math:`i` be :math:`{\mathrm{half}}({\mathit{half}}, 0, M_2)`. + #. Let :math:`i` be :math:`{\mathrm{half}}({\mathit{half}}, 0, M_2)`. - #. Return :math:`{{\mathrm{ivextbinop}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}({\mathrm{ivmul}}, {\mathit{sx}}, {\mathit{sx}}, i, M_2, v_1, v_2)`. + #. Return :math:`{{\mathrm{ivextbinop}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}({\mathrm{ivmul}}, {\mathit{sx}}, {\mathit{sx}}, i, M_2, v_1, v_2)`. #. If :math:`{\mathit{vextbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `, then: - a. Return :math:`{{\mathrm{ivextbinop}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}({\mathrm{ivdot}}, \mathsf{s}, \mathsf{s}, 0, M_1, v_1, v_2)`. + a. Return :math:`{{\mathrm{ivextbinop}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}}({\mathrm{ivdot}}, \mathsf{s}, \mathsf{s}, 0, M_1, v_1, v_2)`. #. Assert: Due to validation, :math:`{\mathit{vextbinop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = `. @@ -23307,9 +23307,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is value type, then: - a. Let :math:`{\mathit{val}}` be :math:`v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{val}}` be :math:`v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`{\mathit{val}}`. + #. Return :math:`{\mathit{val}}`. #. Assert: Due to validation, the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is packed type. @@ -23330,11 +23330,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If the type of :math:`{\mathit{zt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is value type and the type of :math:`{\mathit{fv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is value, then: - a. Let :math:`{\mathit{val}}` be :math:`{\mathit{fv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`{\mathit{val}}` be :math:`{\mathit{fv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. If :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: + #. If :math:`{{\mathit{sx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is not defined, then: - 1) Return :math:`{\mathit{val}}`. + 1) Return :math:`{\mathit{val}}`. #. Assert: Due to validation, :math:`{\mathit{fv}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{pack}`. @@ -23355,15 +23355,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xa}}^\ast}` be :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~a)` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{func}~a)` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`a~{\mathrm{funcs}}({{\mathit{xa}}^\ast})`. + #. Return :math:`a~{\mathrm{funcs}}({{\mathit{xa}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xa}}^\ast}` be :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -23376,15 +23376,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xa}}^\ast}` be :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~a)` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{global}~a)` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`a~{\mathrm{globals}}({{\mathit{xa}}^\ast})`. + #. Return :math:`a~{\mathrm{globals}}({{\mathit{xa}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xa}}^\ast}` be :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -23397,15 +23397,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xa}}^\ast}` be :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~a)` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{table}~a)` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`a~{\mathrm{tables}}({{\mathit{xa}}^\ast})`. + #. Return :math:`a~{\mathrm{tables}}({{\mathit{xa}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xa}}^\ast}` be :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -23418,15 +23418,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xa}}^\ast}` be :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~a)` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{mem}~a)` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`a~{\mathrm{mems}}({{\mathit{xa}}^\ast})`. + #. Return :math:`a~{\mathrm{mems}}({{\mathit{xa}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xa}}^\ast}` be :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -23439,15 +23439,15 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{externaddr}}_0~{{\mathit{xa}}^\ast}` be :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. #. If :math:`{\mathit{externaddr}}_0` is of the case :math:`\mathsf{tag}`, then: - a. Let :math:`(\mathsf{tag}~a)` be :math:`{\mathit{externaddr}}_0`. + a. Let :math:`(\mathsf{tag}~a)` be :math:`{\mathit{externaddr}}_0`. - #. Return :math:`a~{\mathrm{tags}}({{\mathit{xa}}^\ast})`. + #. Return :math:`a~{\mathrm{tags}}({{\mathit{xa}}^\ast})`. #. Let :math:`{\mathit{externaddr}}~{{\mathit{xa}}^\ast}` be :math:`{{\mathit{xa}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -23714,11 +23714,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{|{{r'}^\ast}|} + n \leq j`, then: - a. Let :math:`{i'}` be :math:`{|{{r'}^\ast}|} + n`. + a. Let :math:`{i'}` be :math:`{|{{r'}^\ast}|} + n`. - #. Let :math:`{\mathit{tableinst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~{i'}~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. + #. Let :math:`{\mathit{tableinst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~{i'}~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. - #. Return :math:`{\mathit{tableinst}'}`. + #. Return :math:`{\mathit{tableinst}'}`. :math:`{\mathrm{growmem}}({\mathit{meminst}}, n)` @@ -23729,11 +23729,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n \leq j`, then: - a. Let :math:`{i'}` be :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n`. + a. Let :math:`{i'}` be :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n`. - #. Let :math:`{\mathit{meminst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~{i'}~..~j~])~\mathsf{page}),\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. + #. Let :math:`{\mathit{meminst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~{i'}~..~j~])~\mathsf{page}),\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. - #. Return :math:`{\mathit{meminst}'}`. + #. Return :math:`{\mathit{meminst}'}`. :math:`{{\mathrm{blocktype}}}_{z}({\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}})` @@ -23742,13 +23742,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case , then: - a. Let :math:`x` be :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`x` be :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{func}`. + #. Assert: Due to validation, :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])` is of the case :math:`\mathsf{func}`. - #. Let :math:`(\mathsf{func}~{\mathit{ft}})` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. + #. Let :math:`(\mathsf{func}~{\mathit{ft}})` be :math:`{\mathrm{expand}}(z{.}\mathsf{types}{}[x])`. - #. Return :math:`{\mathit{ft}}`. + #. Return :math:`{\mathit{ft}}`. #. Assert: Due to validation, :math:`{\mathit{bt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case . @@ -23763,7 +23763,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{type}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{{\mathit{type}'}^\ast}~{\mathit{type}}` be :math:`{{\mathit{type}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -23799,29 +23799,29 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Assert: Due to validation, :math:`{{{\mathit{code}}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. + a. Assert: Due to validation, :math:`{{{\mathit{code}}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. - #. Assert: Due to validation, :math:`{{\mathit{moduleinst}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. + #. Assert: Due to validation, :math:`{{\mathit{moduleinst}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. - #. Return :math:`\epsilon`. + #. Return :math:`\epsilon`. #. Else: - a. Let :math:`{\mathit{dt}}~{{\mathit{dt}'}^\ast}` be :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + a. Let :math:`{\mathit{dt}}~{{\mathit{dt}'}^\ast}` be :math:`{{\mathit{dt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Assert: Due to validation, :math:`{|{{{\mathit{code}}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. + #. Assert: Due to validation, :math:`{|{{{\mathit{code}}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. - #. Let :math:`{\mathit{code}}~{{{\mathit{code}}'}^\ast}` be :math:`{{{\mathit{code}}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + #. Let :math:`{\mathit{code}}~{{{\mathit{code}}'}^\ast}` be :math:`{{{\mathit{code}}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Assert: Due to validation, :math:`{|{{\mathit{moduleinst}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. + #. Assert: Due to validation, :math:`{|{{\mathit{moduleinst}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. - #. Let :math:`{\mathit{moduleinst}}~{{\mathit{moduleinst}'}^\ast}` be :math:`{{\mathit{moduleinst}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + #. Let :math:`{\mathit{moduleinst}}~{{\mathit{moduleinst}'}^\ast}` be :math:`{{\mathit{moduleinst}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Let :math:`{\mathit{fa}}` be :math:`{\mathrm{allocfunc}}(s, {\mathit{dt}}, {\mathit{code}}, {\mathit{moduleinst}})`. + #. Let :math:`{\mathit{fa}}` be :math:`{\mathrm{allocfunc}}(s, {\mathit{dt}}, {\mathit{code}}, {\mathit{moduleinst}})`. - #. Let :math:`{{\mathit{fa}'}^\ast}` be :math:`{{{\mathrm{allocfunc}}^\ast}}{(s, {{\mathit{dt}'}^\ast}, {{{\mathit{code}}'}^\ast}, {{\mathit{moduleinst}'}^\ast})}`. + #. Let :math:`{{\mathit{fa}'}^\ast}` be :math:`{{{\mathrm{allocfunc}}^\ast}}{(s, {{\mathit{dt}'}^\ast}, {{{\mathit{code}}'}^\ast}, {{\mathit{moduleinst}'}^\ast})}`. - #. Return :math:`{\mathit{fa}}~{{\mathit{fa}'}^\ast}`. + #. Return :math:`{\mathit{fa}}~{{\mathit{fa}'}^\ast}`. :math:`{\mathrm{allocglobal}}(s, {\mathit{globaltype}}, {\mathit{val}})` @@ -23843,23 +23843,23 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Assert: Due to validation, :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. + a. Assert: Due to validation, :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. - #. Return :math:`\epsilon`. + #. Return :math:`\epsilon`. #. Else: - a. Let :math:`{\mathit{globaltype}}~{{\mathit{globaltype}'}^\ast}` be :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + a. Let :math:`{\mathit{globaltype}}~{{\mathit{globaltype}'}^\ast}` be :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Assert: Due to validation, :math:`{|{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. + #. Assert: Due to validation, :math:`{|{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. - #. Let :math:`{\mathit{val}}~{{\mathit{val}'}^\ast}` be :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + #. Let :math:`{\mathit{val}}~{{\mathit{val}'}^\ast}` be :math:`{v_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Let :math:`{\mathit{ga}}` be :math:`{\mathrm{allocglobal}}(s, {\mathit{globaltype}}, {\mathit{val}})`. + #. Let :math:`{\mathit{ga}}` be :math:`{\mathrm{allocglobal}}(s, {\mathit{globaltype}}, {\mathit{val}})`. - #. Let :math:`{{\mathit{ga}'}^\ast}` be :math:`{{{\mathrm{allocglobal}}^\ast}}{(s, {{\mathit{globaltype}'}^\ast}, {{\mathit{val}'}^\ast})}`. + #. Let :math:`{{\mathit{ga}'}^\ast}` be :math:`{{{\mathrm{allocglobal}}^\ast}}{(s, {{\mathit{globaltype}'}^\ast}, {{\mathit{val}'}^\ast})}`. - #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. + #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. :math:`{\mathrm{alloctable}}(s, {\mathit{at}}~({}[~i~..~j~])~{\mathit{rt}}, {\mathit{ref}})` @@ -23881,7 +23881,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{tt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{r_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, :math:`{|{r_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. @@ -23917,7 +23917,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{mt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{memtype}}~{{\mathit{memtype}'}^\ast}` be :math:`{{\mathit{mt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -23947,7 +23947,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{jt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Let :math:`{\mathit{jt}}~{{\mathit{jt}'}^\ast}` be :math:`{{\mathit{jt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. @@ -23977,7 +23977,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{elemtype}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{r_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, :math:`{|{r_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. @@ -24013,7 +24013,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{ok}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{b_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, :math:`{|{b_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. @@ -24036,27 +24036,27 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{func}`, then: - a. Let :math:`(\mathsf{func}~x)` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{func}~x)` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{func}~{\mathit{moduleinst}}{.}\mathsf{funcs}{}[x]) \}\end{array}`. + #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{func}~{\mathit{moduleinst}}{.}\mathsf{funcs}{}[x]) \}\end{array}`. #. If :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{global}`, then: - a. Let :math:`(\mathsf{global}~x)` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{global}~x)` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{global}~{\mathit{moduleinst}}{.}\mathsf{globals}{}[x]) \}\end{array}`. + #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{global}~{\mathit{moduleinst}}{.}\mathsf{globals}{}[x]) \}\end{array}`. #. If :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{table}`, then: - a. Let :math:`(\mathsf{table}~x)` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{table}~x)` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{table}~{\mathit{moduleinst}}{.}\mathsf{tables}{}[x]) \}\end{array}`. + #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{table}~{\mathit{moduleinst}}{.}\mathsf{tables}{}[x]) \}\end{array}`. #. If :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{mem}`, then: - a. Let :math:`(\mathsf{mem}~x)` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. + a. Let :math:`(\mathsf{mem}~x)` be :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}`. - #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{mem}~{\mathit{moduleinst}}{.}\mathsf{mems}{}[x]) \}\end{array}`. + #. Return :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{name}~{\mathit{name}},\; \mathsf{addr}~(\mathsf{mem}~{\mathit{moduleinst}}{.}\mathsf{mems}{}[x]) \}\end{array}`. #. Assert: Due to validation, :math:`{\mathit{xx}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{tag}`. @@ -24175,11 +24175,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{passive}`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. If :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{declare}`, then: - a. Return :math:`(\mathsf{elem{.}drop}~x)`. + a. Return :math:`(\mathsf{elem{.}drop}~x)`. #. Assert: Due to validation, :math:`{\mathit{elemmode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{active}`. @@ -24194,7 +24194,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}} = \mathsf{passive}`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, :math:`{\mathit{datamode}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is of the case :math:`\mathsf{active}`. @@ -24209,7 +24209,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{{\mathit{gt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon` and :math:`{e_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Return :math:`\epsilon`. + a. Return :math:`\epsilon`. #. Assert: Due to validation, :math:`{|{e_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. @@ -24238,7 +24238,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{\mathit{module}}` is not :ref:`valid <valid-val>`, then: - a. Fail. + a. Fail. #. Let :math:`{{\mathit{xt}}_{\mathsf{i}}^\ast}~\rightarrow~{{\mathit{xt}}_{\mathsf{e}}^\ast}` be the type of :math:`{\mathit{module}}`. @@ -24248,17 +24248,17 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{|{{\mathit{externaddr}}^\ast}|} \neq {|{{\mathit{xt}}_{\mathsf{i}}^\ast}|}`, then: - a. Fail. + a. Fail. #. For all :math:`{\mathit{externaddr}}`, and :math:`{\mathit{xt}}_{\mathsf{i}}` in :math:`{({\mathit{externaddr}}, {\mathit{xt}}_{\mathsf{i}})^\ast}`: - a. If :math:`{\mathit{externaddr}}` is not :ref:`valid <valid-val>` with type :math:`{\mathit{xt}}_{\mathsf{i}}`, then: + a. If :math:`{\mathit{externaddr}}` is not :ref:`valid <valid-val>` with type :math:`{\mathit{xt}}_{\mathsf{i}}`, then: - 1) Fail. + 1) Fail. -#. Let :math:`{{\mathit{instr}}_{\mathsf{d}}^\ast}` be :math:`{\bigoplus}\, {{{\mathrm{rundata}}}_{i_{\mathsf{d}}}({{\mathit{data}}^\ast}{}[i_{\mathsf{d}}])^{i_{\mathsf{d}}<{|{{\mathit{data}}^\ast}|}}}`. +#. Let :math:`{{\mathit{instr}}_{\mathsf{d}}^\ast}` be the concatenation of :math:`{{{\mathrm{rundata}}}_{i_{\mathsf{d}}}({{\mathit{data}}^\ast}{}[i_{\mathsf{d}}])^{i_{\mathsf{d}}<{|{{\mathit{data}}^\ast}|}}}`. -#. Let :math:`{{\mathit{instr}}_{\mathsf{e}}^\ast}` be :math:`{\bigoplus}\, {{{\mathrm{runelem}}}_{i_{\mathsf{e}}}({{\mathit{elem}}^\ast}{}[i_{\mathsf{e}}])^{i_{\mathsf{e}}<{|{{\mathit{elem}}^\ast}|}}}`. +#. Let :math:`{{\mathit{instr}}_{\mathsf{e}}^\ast}` be the concatenation of :math:`{{{\mathrm{runelem}}}_{i_{\mathsf{e}}}({{\mathit{elem}}^\ast}{}[i_{\mathsf{e}}])^{i_{\mathsf{e}}<{|{{\mathit{elem}}^\ast}|}}}`. #. Assert: Due to validation, for all :math:`{\mathit{start}}` in :math:`{{\mathit{start}}^?}`, :math:`{\mathit{start}}` is of the case :math:`\mathsf{start}`. @@ -24333,13 +24333,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. If :math:`{|{t_1^\ast}|} \neq {|{{\mathit{val}}^\ast}|}`, then: - a. Fail. + a. Fail. #. For all :math:`t_1`, and :math:`{\mathit{val}}` in :math:`{(t_1, {\mathit{val}})^\ast}`: - a. If :math:`{\mathit{val}}` is not :ref:`valid <valid-val>` with type :math:`t_1`, then: + a. If :math:`{\mathit{val}}` is not :ref:`valid <valid-val>` with type :math:`t_1`, then: - 1) Fail. + 1) Fail. #. Let :math:`k` be :math:`{|{t_2^\ast}|}`. @@ -24368,23 +24368,23 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. If :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`, then: - a. Assert: Due to validation, :math:`{Y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. + a. Assert: Due to validation, :math:`{Y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast} = \epsilon`. - #. Return :math:`\epsilon`. + #. Return :math:`\epsilon`. #. Else: - a. Let :math:`X~{{X'}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + a. Let :math:`X~{{X'}^\ast}` be :math:`{X_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Assert: Due to validation, :math:`{|{Y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. + #. Assert: Due to validation, :math:`{|{Y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}|} \geq 1`. - #. Let :math:`Y~{{Y'}^\ast}` be :math:`{Y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. + #. Let :math:`Y~{{Y'}^\ast}` be :math:`{Y_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^\ast}`. - #. Let :math:`a` be :math:`{\mathrm{allocX}}({\mathit{TODO}}, {\mathit{TODO}}, s, X, Y)`. + #. Let :math:`a` be :math:`{\mathrm{allocX}}({\mathit{TODO}}, {\mathit{TODO}}, s, X, Y)`. - #. Let :math:`{{a'}^\ast}` be :math:`{{{\mathrm{allocX}}^\ast}}{(s, {{X'}^\ast}, {{Y'}^\ast})}`. + #. Let :math:`{{a'}^\ast}` be :math:`{{{\mathrm{allocX}}^\ast}}{(s, {{X'}^\ast}, {{Y'}^\ast})}`. - #. Return :math:`a~{{a'}^\ast}`. + #. Return :math:`a~{{a'}^\ast}`. :math:`{\mathit{TODO}}` @@ -24394,8 +24394,8 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Return :math:`0`. -:math:`{\mathrm{eval}}_{\mathit{expr}}({{\mathit{instr}}^\ast})` -................................................................ +the result of :ref:`evaluating <exec-expr>` :math:`{{\mathit{instr}}^\ast}` +........................................................................... 1. Execute the instruction :math:`{{\mathit{instr}}^\ast}`. @@ -30092,7 +30092,7 @@ allocXs X Y s X_u1* Y_u1* var X 1. Return 0. -eval_expr instr* +Eval_expr instr* 1. Execute the instruction instr*. 2. Pop the value val from the stack. 3. Return [val]. From 17f1ba4c2aa103223b726beaad4ddf5993ad500c Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Fri, 10 Jan 2025 15:16:03 +0900 Subject: [PATCH 07/12] Cross reference for frame, handler --- spectec/src/backend-prose/prose_util.ml | 4 +- spectec/test-prose/TEST.md | 164 ++++++++++++------------ 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/spectec/src/backend-prose/prose_util.ml b/spectec/src/backend-prose/prose_util.ml index d5c3e27933..91d7ffddaa 100644 --- a/spectec/src/backend-prose/prose_util.ml +++ b/spectec/src/backend-prose/prose_util.ml @@ -69,11 +69,11 @@ let string_of_stack_prefix expr = match expr.it with | GetCurContextE _ | VarE ("F" | "L") -> "" - | _ when Il.Eq.eq_typ expr.note Al.Al_util.frameT -> "the frame " + | _ when Il.Eq.eq_typ expr.note Al.Al_util.frameT -> "the :ref:`frame <syntax-frame>` " | CaseE (mixop, _) when Il.Eq.eq_typ expr.note Al.Al_util.evalctxT -> let evalctx_name = Xl.Mixop.name (List.nth mixop 0) |> fun s -> String.sub s 0 (String.length s - 1) |> String.lowercase_ascii in - Printf.sprintf "the %s " evalctx_name + Printf.sprintf "the :ref:`%s <syntax-%s>` " evalctx_name evalctx_name | IterE _ -> "the values " | _ -> "the value " \ No newline at end of file diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index 0646f2f5bf..40a71647a3 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -1337,7 +1337,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~{{\mathit{val}}^{k}}~{{{\mathrm{default}}}_{t}^\ast},\; \mathsf{module}~{\mathit{mm}} \}\end{array}`. -#. Push the frame :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` to the stack. #. Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{n}}{\{}~\epsilon~\})`. @@ -2785,23 +2785,23 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Let :math:`z` be :math:`(s, f_{\mathit{init}})`. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. #. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{d}})^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{d}}` in :math:`{{\mathit{expr}}_{\mathsf{d}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{d}}` with state :math:`z`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. #. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{e}})^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{e}}` in :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{e}}` with state :math:`z`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. #. Let :math:`{{\mathit{val}}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{g}}` in :math:`{{\mathit{expr}}_{\mathsf{g}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{g}}` with state :math:`z`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. #. Let :math:`{\mathit{moduleinst}}` be :math:`{\mathrm{allocmodule}}(s, {\mathit{module}}, {{\mathit{externaddr}}^\ast}, {{\mathit{val}}^\ast})`. @@ -2811,11 +2811,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Perform :math:`{\mathrm{initdata}}(s, {\mathit{moduleinst}}, {i_{\mathsf{d}}^\ast}, {{b^\ast}^\ast})`. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. #. Execute the sequence :math:`{(\mathsf{call}~{x'})^?}`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Return :math:`f{.}\mathsf{module}`. @@ -2826,15 +2826,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{exports}~\epsilon \}\end{array} \}\end{array}`. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~(s, f)~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~(s, f)~\})` to the stack. #. Let :math:`{t_1^{n}}~\rightarrow~{t_2^\ast}` be :math:`(s, f){.}\mathsf{funcs}{}[{\mathit{fa}}]{.}\mathsf{type}`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Let :math:`k` be :math:`{|{t_2^\ast}|}`. -#. Push the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. @@ -2842,7 +2842,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. -#. Pop the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. @@ -3531,7 +3531,7 @@ Step_read/call_addr a 8. Assert: Due to validation, there are at least k values on the top of the stack. 9. Pop the values val^k from the stack. 10. Let f be { LOCALS: val^k :: $default_(t)*; MODULE: mm; }. -11. Push the frame (FRAME_ n { f }) to the stack. +11. Push the :ref:`frame <syntax-frame>` (FRAME_ n { f }) to the stack. 12. Enter instr* with label (LABEL_ n { [] }). Step_read/local.get x @@ -4215,35 +4215,35 @@ instantiate s module externaddr* 14. Let moduleinst_init be { TYPES: functype*; FUNCS: $funcs(externaddr*) :: (|s.FUNCS| + i_F)^(i_F<n_F); GLOBALS: $globals(externaddr*); TABLES: []; MEMS: []; EXPORTS: []; }. 15. Let f_init be { LOCALS: []; MODULE: moduleinst_init; }. 16. Let z be (s, f_init). -17. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +17. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) to the stack. 18. Let [(I32.CONST i_D)]* be $Eval_expr(z, expr_D)*. -19. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. -20. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +19. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) from the stack. +20. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) to the stack. 21. Let [(I32.CONST i_E)]* be $Eval_expr(z, expr_E)*. -22. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. -23. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +22. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) from the stack. +23. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) to the stack. 24. Let [val]* be $Eval_expr(z, expr_G)*. -25. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. +25. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) from the stack. 26. Let moduleinst be $allocmodule(s, module, externaddr*, val*). 27. Let f be { LOCALS: []; MODULE: moduleinst; }. 28. Perform $initelem(s, moduleinst, i_E*, moduleinst.FUNCS[x]**). 29. Perform $initdata(s, moduleinst, i_D*, b**). -30. Push the frame (FRAME_ 0 { f }) to the stack. +30. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) to the stack. 31. Execute the sequence ((CALL x')?). -32. Pop the frame (FRAME_ 0 { f }) from the stack. +32. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) from the stack. 33. Return f.MODULE. invoke s fa val^n 1. Let f be { LOCALS: []; MODULE: { TYPES: []; FUNCS: []; GLOBALS: []; TABLES: []; MEMS: []; EXPORTS: []; }; }. -2. Push the frame (FRAME_ 0 { (s, f) }) to the stack. +2. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { (s, f) }) to the stack. 3. Let t_1^n -> t_2* be $funcinst((s, f))[fa].TYPE. -4. Pop the frame (FRAME_ 0 { _f }) from the stack. +4. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { _f }) from the stack. 5. Let k be |t_2*|. -6. Push the frame (FRAME_ k { f }) to the stack. +6. Push the :ref:`frame <syntax-frame>` (FRAME_ k { f }) to the stack. 7. Push the values val^n to the stack. 8. Execute the instruction (CALL_ADDR fa). 9. Pop all values val* from the top of the stack. -10. Pop the frame (FRAME_ k { f }) from the stack. +10. Pop the :ref:`frame <syntax-frame>` (FRAME_ k { f }) from the stack. 11. Push the values val* to the stack. 12. Pop the values val^k from the stack. 13. Return val^k. @@ -6641,7 +6641,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~{{\mathit{val}}^{k}}~{{{\mathrm{default}}}_{t}^\ast},\; \mathsf{module}~{\mathit{mm}} \}\end{array}`. -#. Push the frame :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({{\mathsf{frame}}_{n}}{\{}~f~\})` to the stack. #. Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{n}}{\{}~\epsilon~\})`. @@ -9831,23 +9831,23 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Let :math:`z` be :math:`(s, f_{\mathit{init}})`. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. #. Let :math:`{{\mathit{val}}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{g}}` in :math:`{{\mathit{expr}}_{\mathsf{g}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{g}}` with state :math:`z`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. #. Let :math:`{{{\mathit{ref}}^\ast}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{e*}}` in :math:`{{\mathit{expr}}_{\mathsf{e*}}^\ast}`, for all :math:`{\mathit{expr}}_{\mathsf{e}}` in :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{e}}` with state :math:`z`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. #. Let :math:`{\mathit{moduleinst}}` be :math:`{\mathrm{allocmodule}}(s, {\mathit{module}}, {{\mathit{externaddr}}^\ast}, {{\mathit{val}}^\ast}, {{{\mathit{ref}}^\ast}^\ast})`. #. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~{\mathit{moduleinst}} \}\end{array}`. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. #. Execute the sequence :math:`{{\mathit{instr}}_{\mathsf{e}}^\ast}`. @@ -9855,7 +9855,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Execute the sequence :math:`{(\mathsf{call}~x)^?}`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Return :math:`f{.}\mathsf{module}`. @@ -9866,15 +9866,15 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~\{ \begin{array}[t]{@{}l@{}}\mathsf{types}~\epsilon,\; \mathsf{funcs}~\epsilon,\; \mathsf{globals}~\epsilon,\; \mathsf{tables}~\epsilon,\; \mathsf{mems}~\epsilon,\; \mathsf{elems}~\epsilon,\; \mathsf{datas}~\epsilon,\; \mathsf{exports}~\epsilon \}\end{array} \}\end{array}`. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~(s, f)~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~(s, f)~\})` to the stack. #. Let :math:`{t_1^{n}}~\rightarrow~{t_2^\ast}` be :math:`(s, f){.}\mathsf{funcs}{}[{\mathit{fa}}]{.}\mathsf{type}`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Let :math:`k` be :math:`{|{t_2^\ast}|}`. -#. Push the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. #. Push the values :math:`{{\mathit{val}}^{n}}` to the stack. @@ -9882,7 +9882,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. -#. Pop the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. @@ -11106,7 +11106,7 @@ Step_read/call_addr a 8. Assert: Due to validation, there are at least k values on the top of the stack. 9. Pop the values val^k from the stack. 10. Let f be { LOCALS: val^k :: $default_(t)*; MODULE: mm; }. -11. Push the frame (FRAME_ n { f }) to the stack. +11. Push the :ref:`frame <syntax-frame>` (FRAME_ n { f }) to the stack. 12. Enter instr* with label (LABEL_ n { [] }). Step_read/ref.func x @@ -12628,32 +12628,32 @@ instantiate s module externaddr* 16. Let moduleinst_init be { TYPES: functype*; FUNCS: $funcs(externaddr*) :: (|s.FUNCS| + i_F)^(i_F<n_F); GLOBALS: $globals(externaddr*); TABLES: []; MEMS: []; ELEMS: []; DATAS: []; EXPORTS: []; }. 17. Let f_init be { LOCALS: []; MODULE: moduleinst_init; }. 18. Let z be (s, f_init). -19. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +19. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) to the stack. 20. Let [val]* be $Eval_expr(z, expr_G)*. -21. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. -22. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +21. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) from the stack. +22. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) to the stack. 23. Let [ref]** be $Eval_expr(z, expr_E)**. -24. Pop the frame (FRAME_ 0 { $frame(z) }) from the stack. +24. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) from the stack. 25. Let moduleinst be $allocmodule(s, module, externaddr*, val*, ref**). 26. Let f be { LOCALS: []; MODULE: moduleinst; }. -27. Push the frame (FRAME_ 0 { f }) to the stack. +27. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) to the stack. 28. Execute the sequence (instr_E*). 29. Execute the sequence (instr_D*). 30. Execute the sequence ((CALL x)?). -31. Pop the frame (FRAME_ 0 { f }) from the stack. +31. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) from the stack. 32. Return f.MODULE. invoke s fa val^n 1. Let f be { LOCALS: []; MODULE: { TYPES: []; FUNCS: []; GLOBALS: []; TABLES: []; MEMS: []; ELEMS: []; DATAS: []; EXPORTS: []; }; }. -2. Push the frame (FRAME_ 0 { (s, f) }) to the stack. +2. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { (s, f) }) to the stack. 3. Let t_1^n -> t_2* be $funcinst((s, f))[fa].TYPE. -4. Pop the frame (FRAME_ 0 { _f }) from the stack. +4. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { _f }) from the stack. 5. Let k be |t_2*|. -6. Push the frame (FRAME_ k { f }) to the stack. +6. Push the :ref:`frame <syntax-frame>` (FRAME_ k { f }) to the stack. 7. Push the values val^n to the stack. 8. Execute the instruction (CALL_ADDR fa). 9. Pop all values val* from the top of the stack. -10. Pop the frame (FRAME_ k { f }) from the stack. +10. Pop the :ref:`frame <syntax-frame>` (FRAME_ k { f }) from the stack. 11. Push the values val* to the stack. 12. Pop the values val^k from the stack. 13. Return val^k. @@ -17265,7 +17265,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~{{\mathit{val}}^{n}}~{{{\mathrm{default}}}_{t}^\ast},\; \mathsf{module}~{\mathit{fi}}{.}\mathsf{module} \}\end{array}`. - #) Push the frame :math:`({{\mathsf{frame}}_{m}}{\{}~f~\})` to the stack. + #) Push the :ref:`frame <syntax-frame>` :math:`({{\mathsf{frame}}_{m}}{\{}~f~\})` to the stack. #) Enter :math:`{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{m}}{\{}~\epsilon~\})`. @@ -17434,7 +17434,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Pop the current :math:`\mathsf{handler}` context from the stack. - #. Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #. Push the :ref:`handler <syntax-handler>` :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. #. Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. @@ -17474,7 +17474,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the :ref:`handler <syntax-handler>` :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. @@ -17490,7 +17490,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the :ref:`handler <syntax-handler>` :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. @@ -17502,7 +17502,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the :ref:`handler <syntax-handler>` :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. @@ -17534,7 +17534,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Pop the current :math:`\mathsf{handler}` context from the stack. - #) Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. + #) Push the :ref:`handler <syntax-handler>` :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}'}^\ast}~\})` to the stack. #) Push the value :math:`(\mathsf{ref{.}exn}~a)` to the stack. @@ -17567,7 +17567,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Pop the values :math:`{{\mathit{val}}^{m}}` from the stack. -#. Push the handler :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}}^\ast}~\})` to the stack. +#. Push the :ref:`handler <syntax-handler>` :math:`({{\mathsf{handler}}_{n}}{\{}~{{\mathit{catch}}^\ast}~\})` to the stack. #. Enter :math:`{{\mathit{val}}^{m}}~{{\mathit{instr}}^\ast}` with label :math:`({{\mathsf{label}}_{n}}{\{}~\epsilon~\})`. @@ -24284,29 +24284,29 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`z` be :math:`(s, \{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~{\mathit{moduleinst}}_0 \}\end{array})`. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. #. Let :math:`{{\mathit{val}}_{\mathsf{g}}^\ast}` be :math:`{{{\mathrm{evalglobal}}^\ast}}{(z, {{\mathit{globaltype}}^\ast}, {{\mathit{expr}}_{\mathsf{g}}^\ast})}`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` to the stack. #. Let :math:`{{\mathit{ref}}_{\mathsf{t}}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{t}}` in :math:`{{\mathit{expr}}_{\mathsf{t}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{t}}` with state :math:`z`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` to the stack. #. Let :math:`{{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{e*}}` in :math:`{{\mathit{expr}}_{\mathsf{e*}}^\ast}`, for all :math:`{\mathit{expr}}_{\mathsf{e}}` in :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{e}}` with state :math:`z`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. #. Let :math:`{\mathit{moduleinst}}` be :math:`{\mathrm{allocmodule}}(s, {\mathit{module}}, {{\mathit{externaddr}}^\ast}, {{\mathit{val}}_{\mathsf{g}}^\ast}, {{\mathit{ref}}_{\mathsf{t}}^\ast}, {{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast})`. #. Let :math:`f` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{locals}~\epsilon,\; \mathsf{module}~{\mathit{moduleinst}} \}\end{array}`. -#. Push the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. #. Execute the sequence :math:`{{\mathit{instr}}_{\mathsf{e}}^\ast}`. @@ -24314,7 +24314,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Execute the sequence :math:`{{\mathit{instr}}_{\mathsf{s}}^?}`. -#. Pop the frame :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Return :math:`f{.}\mathsf{module}`. @@ -24343,7 +24343,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`k` be :math:`{|{t_2^\ast}|}`. -#. Push the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{k}\,\{~f~\})` to the stack. #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. @@ -24353,7 +24353,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Pop all values :math:`{{\mathit{val}}^\ast}` from the top of the stack. -#. Pop the frame :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{k}\,\{~f~\})` from the stack. #. Push the values :math:`{{\mathit{val}}^\ast}` to the stack. @@ -26735,7 +26735,7 @@ Step_read/call_ref yy e) Assert: Due to validation, there are at least n values on the top of the stack. f) Pop the values val^n from the stack. g) Let f be { LOCALS: ?(val)^n :: $default_(t)*; MODULE: fi.MODULE; }. - h) Push the frame (FRAME_ m { f }) to the stack. + h) Push the :ref:`frame <syntax-frame>` (FRAME_ m { f }) to the stack. i) Enter instr* with label (LABEL_ m { [] }). Step_read/return_call x @@ -26816,7 +26816,7 @@ Step_read/throw_ref c) Else if catch_0 is not of the case CATCH_ALL_REF, then: 1. Let [catch] :: catch'* be catch_u1*. 2. Pop the current HANDLER_ context from the stack. - 3. Push the handler (HANDLER_ n { catch'* }) to the stack. + 3. Push the :ref:`handler <syntax-handler>` (HANDLER_ n { catch'* }) to the stack. 4. Push the value (REF.EXN_ADDR a) to the stack. 5. Execute the instruction THROW_REF. d) Else: @@ -26836,7 +26836,7 @@ Step_read/throw_ref 3. Else: a. Let [catch] :: catch'* be catch_u1*. b. Pop the current HANDLER_ context from the stack. - c. Push the handler (HANDLER_ n { catch'* }) to the stack. + c. Push the :ref:`handler <syntax-handler>` (HANDLER_ n { catch'* }) to the stack. d. Push the value (REF.EXN_ADDR a) to the stack. e. Execute the instruction THROW_REF. d) Else if catch_0 is of the case CATCH_REF, then: @@ -26844,13 +26844,13 @@ Step_read/throw_ref 2. If (x >= |$tagaddr(z)|), then: a. Let [catch] :: catch'* be catch_u1*. b. Pop the current HANDLER_ context from the stack. - c. Push the handler (HANDLER_ n { catch'* }) to the stack. + c. Push the :ref:`handler <syntax-handler>` (HANDLER_ n { catch'* }) to the stack. d. Push the value (REF.EXN_ADDR a) to the stack. e. Execute the instruction THROW_REF. 3. Else if ($exninst(z)[a].TAG =/= $tagaddr(z)[x]), then: a. Let [catch] :: catch'* be catch_u1*. b. Pop the current HANDLER_ context from the stack. - c. Push the handler (HANDLER_ n { catch'* }) to the stack. + c. Push the :ref:`handler <syntax-handler>` (HANDLER_ n { catch'* }) to the stack. d. Push the value (REF.EXN_ADDR a) to the stack. e. Execute the instruction THROW_REF. 4. Else: @@ -26865,7 +26865,7 @@ Step_read/throw_ref f) Else if catch_0 is not of the case CATCH_ALL_REF, then: 1. Let [catch] :: catch'* be catch_u1*. 2. Pop the current HANDLER_ context from the stack. - 3. Push the handler (HANDLER_ n { catch'* }) to the stack. + 3. Push the :ref:`handler <syntax-handler>` (HANDLER_ n { catch'* }) to the stack. 4. Push the value (REF.EXN_ADDR a) to the stack. 5. Execute the instruction THROW_REF. g) Else: @@ -26881,7 +26881,7 @@ Step_read/try_table bt catch* instr* 2. Let t_1^m -> t_2^n be $blocktype_(z, bt). 3. Assert: Due to validation, there are at least m values on the top of the stack. 4. Pop the values val^m from the stack. -5. Push the handler (HANDLER_ n { catch* }) to the stack. +5. Push the :ref:`handler <syntax-handler>` (HANDLER_ n { catch* }) to the stack. 6. Enter val^m :: instr* with label (LABEL_ n { [] }). Step_read/ref.null (_IDX x) @@ -30041,22 +30041,22 @@ instantiate s module externaddr* 16. Let (ELEM reftype expr_E* elemmode)* be elem*. 17. Let instr_S? be (CALL x)?. 18. Let z be (s, { LOCALS: []; MODULE: moduleinst_0; }). -19. Push the frame (FRAME_ 0 { $frame(z) }) to the stack. +19. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) to the stack. 20. Let val_G* be $evalglobals(z, globaltype*, expr_G*). -21. Pop the frame (FRAME_ 0 { f' }) from the stack. -22. Push the frame (FRAME_ 0 { f' }) to the stack. +21. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f' }) from the stack. +22. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { f' }) to the stack. 23. Let [ref_T]* be $Eval_expr(z, expr_T)*. -24. Pop the frame (FRAME_ 0 { f' }) from the stack. -25. Push the frame (FRAME_ 0 { f' }) to the stack. +24. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f' }) from the stack. +25. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { f' }) to the stack. 26. Let [ref_E]** be $Eval_expr(z, expr_E)**. -27. Pop the frame (FRAME_ 0 { f' }) from the stack. +27. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f' }) from the stack. 28. Let moduleinst be $allocmodule(s, module, externaddr*, val_G*, ref_T*, ref_E**). 29. Let f be { LOCALS: []; MODULE: moduleinst; }. -30. Push the frame (FRAME_ 0 { f }) to the stack. +30. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) to the stack. 31. Execute the sequence (instr_E*). 32. Execute the sequence (instr_D*). 33. Execute the sequence (instr_S?). -34. Pop the frame (FRAME_ 0 { f }) from the stack. +34. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) from the stack. 35. Return f.MODULE. invoke s funcaddr val* @@ -30067,12 +30067,12 @@ invoke s funcaddr val* 5. If not $Val_type(val, t_1)*, then: a. Fail. 6. Let k be |t_2*|. -7. Push the frame (FRAME_ k { f }) to the stack. +7. Push the :ref:`frame <syntax-frame>` (FRAME_ k { f }) to the stack. 8. Push the values val* to the stack. 9. Push the value (REF.FUNC_ADDR funcaddr) to the stack. 10. Execute the instruction (CALL_REF s.FUNCS[funcaddr].TYPE). 11. Pop all values val* from the top of the stack. -12. Pop the frame (FRAME_ k { f }) from the stack. +12. Pop the :ref:`frame <syntax-frame>` (FRAME_ k { f }) from the stack. 13. Push the values val* to the stack. 14. Pop the values val^k from the stack. 15. Return val^k. From 1b5b636ccdc0c0473063d19906f56b2512a8bada Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Fri, 10 Jan 2025 16:21:14 +0900 Subject: [PATCH 08/12] z hardcoding fix --- spectec/src/il2al/transpile.ml | 5 +++-- spectec/test-prose/TEST.md | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/spectec/src/il2al/transpile.ml b/spectec/src/il2al/transpile.ml index d21d22cd44..698cdcf05e 100644 --- a/spectec/src/il2al/transpile.ml +++ b/spectec/src/il2al/transpile.ml @@ -637,7 +637,7 @@ let hide_state_expr expr = | TupE [ s; e ] when is_store s && not (is_frame e) -> e.it | TupE [ z; e ] when is_state z -> e.it | VarE _ when is_store expr -> VarE "s" - | VarE "z'" when is_state expr -> VarE "z" + | VarE id when is_state expr && String.starts_with ~prefix:"z" id -> VarE "z" | e -> e in { expr with it = expr' } @@ -911,7 +911,8 @@ let handle_unframed_algo instrs = let postprocess_frame f = if !for_interp then f else match f.it with | VarE "z" -> { f with it = CallE ("frame", [ExpA f $ f.at]) } - | VarE "z'" -> { f with it = VarE "f'" } + | VarE id when String.starts_with ~prefix:"z" id -> + { f with it = VarE "f" } | _ -> f in diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index 40a71647a3..37ecec5891 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -24288,19 +24288,19 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Let :math:`{{\mathit{val}}_{\mathsf{g}}^\ast}` be :math:`{{{\mathrm{evalglobal}}^\ast}}{(z, {{\mathit{globaltype}}^\ast}, {{\mathit{expr}}_{\mathsf{g}}^\ast})}`. -#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. -#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. #. Let :math:`{{\mathit{ref}}_{\mathsf{t}}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{t}}` in :math:`{{\mathit{expr}}_{\mathsf{t}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{t}}` with state :math:`z`. -#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. -#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` to the stack. +#. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. #. Let :math:`{{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{e*}}` in :math:`{{\mathit{expr}}_{\mathsf{e*}}^\ast}`, for all :math:`{\mathit{expr}}_{\mathsf{e}}` in :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{e}}` with state :math:`z`. -#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~{f'}~\})` from the stack. +#. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Let :math:`{\mathit{moduleinst}}` be :math:`{\mathrm{allocmodule}}(s, {\mathit{module}}, {{\mathit{externaddr}}^\ast}, {{\mathit{val}}_{\mathsf{g}}^\ast}, {{\mathit{ref}}_{\mathsf{t}}^\ast}, {{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast})`. @@ -30043,13 +30043,13 @@ instantiate s module externaddr* 18. Let z be (s, { LOCALS: []; MODULE: moduleinst_0; }). 19. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { $frame(z) }) to the stack. 20. Let val_G* be $evalglobals(z, globaltype*, expr_G*). -21. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f' }) from the stack. -22. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { f' }) to the stack. +21. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) from the stack. +22. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) to the stack. 23. Let [ref_T]* be $Eval_expr(z, expr_T)*. -24. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f' }) from the stack. -25. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { f' }) to the stack. +24. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) from the stack. +25. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) to the stack. 26. Let [ref_E]** be $Eval_expr(z, expr_E)**. -27. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f' }) from the stack. +27. Pop the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) from the stack. 28. Let moduleinst be $allocmodule(s, module, externaddr*, val_G*, ref_T*, ref_E**). 29. Let f be { LOCALS: []; MODULE: moduleinst; }. 30. Push the :ref:`frame <syntax-frame>` (FRAME_ 0 { f }) to the stack. From af7fbf5e251236aeafd934722fab57a1fadc5c77 Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Mon, 13 Jan 2025 16:13:11 +0900 Subject: [PATCH 09/12] Fix: paren around brackets --- spectec/src/backend-prose/render.ml | 14 ++++++- spectec/test-prose/TEST.md | 64 ++++++++++++++--------------- 2 files changed, 45 insertions(+), 33 deletions(-) diff --git a/spectec/src/backend-prose/render.ml b/spectec/src/backend-prose/render.ml index 875eafd7a2..5df65869c2 100644 --- a/spectec/src/backend-prose/render.ml +++ b/spectec/src/backend-prose/render.ml @@ -293,13 +293,25 @@ and al_to_el_expr expr = (* Current rules for omitting parenthesis around a CaseE: 1) Has no argument 2) Is infix notation - 3) Is argument of CallE -> add first, omit later at CallE *) + 3) Is bracketed + 4) Is argument of CallE -> add first, omit later at CallE *) + let is_bracked mixop = + let s = Mixop.to_string mixop in + let first = String.get s 1 in + let last = String.get s (String.length s - 2) in + match first, last with + | '(', ')' + | '[', ']' + | '{', '}' -> true + | _ -> false + in let elal = mixop_to_el_exprs op in let* elel = al_to_el_exprs el in let ele = El.Ast.SeqE (case_to_el_exprs elal elel) in (match elal, elel with | _, [] -> Some ele | None :: Some _ :: _, _ -> Some ele + | _ when is_bracked op -> Some ele | _ -> Some (El.Ast.ParenE (ele $ no_region)) ) | Al.Ast.OptE (Some e) -> diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index 37ecec5891..3a68085259 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -19,7 +19,7 @@ watsup 0.4 generator -The limits :math:`({}[~n~..~m~])` is valid with :math:`k` if: +The limits :math:`{}[~n~..~m~]` is valid with :math:`k` if: * :math:`n` is less than or equal to :math:`m`. @@ -115,7 +115,7 @@ The external type :math:`(\mathsf{mem}~{\mathit{memtype}})` is valid if: -The limits :math:`({}[~n_{11}~..~n_{12}~])` matches the limits :math:`({}[~n_{21}~..~n_{22}~])` if: +The limits :math:`{}[~n_{11}~..~n_{12}~]` matches the limits :math:`{}[~n_{21}~..~n_{22}~]` if: * :math:`n_{11}` is greater than or equal to :math:`n_{21}`. @@ -2369,13 +2369,13 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as .............................................. -1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~]),\; \mathsf{refs}~{a^\ast} \}\end{array}` be :math:`{\mathit{ti}}`. +1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~{}[~i~..~j~],\; \mathsf{refs}~{a^\ast} \}\end{array}` be :math:`{\mathit{ti}}`. #. Let :math:`{i'}` be :math:`{|{a^\ast}|} + n`. #. If :math:`{i'} \leq j`, then: - a. Let :math:`{\mathit{ti}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~{i'}~..~j~]),\; \mathsf{refs}~{a^\ast}~{\epsilon^{n}} \}\end{array}`. + a. Let :math:`{\mathit{ti}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~{}[~{i'}~..~j~],\; \mathsf{refs}~{a^\ast}~{\epsilon^{n}} \}\end{array}`. #. Return :math:`{\mathit{ti}'}`. @@ -2384,13 +2384,13 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as ............................................... -1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~]),\; \mathsf{bytes}~{b^\ast} \}\end{array}` be :math:`{\mathit{mi}}`. +1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~{}[~i~..~j~],\; \mathsf{bytes}~{b^\ast} \}\end{array}` be :math:`{\mathit{mi}}`. #. Let :math:`{i'}` be :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n`. #. If :math:`{i'} \leq j`, then: - a. Let :math:`{\mathit{mi}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~{i'}~..~j~]),\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. + a. Let :math:`{\mathit{mi}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~{}[~{i'}~..~j~],\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. #. Return :math:`{\mathit{mi}'}`. @@ -2555,7 +2555,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as .............................................. -1. Let :math:`{\mathit{ti}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~]),\; \mathsf{refs}~{\epsilon^{i}} \}\end{array}`. +1. Let :math:`{\mathit{ti}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~{}[~i~..~j~],\; \mathsf{refs}~{\epsilon^{i}} \}\end{array}`. #. Let :math:`a` be :math:`{|s{.}\mathsf{tables}|}`. @@ -2585,7 +2585,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as ............................................ -1. Let :math:`{\mathit{mi}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~]),\; \mathsf{bytes}~{\mathtt{0x00}^{i \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. +1. Let :math:`{\mathit{mi}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~{}[~i~..~j~],\; \mathsf{bytes}~{\mathtt{0x00}^{i \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. #. Let :math:`a` be :math:`{|s{.}\mathsf{mems}|}`. @@ -4266,7 +4266,7 @@ watsup 0.4 generator -The limits :math:`({}[~n~..~m~])` is valid with :math:`k` if: +The limits :math:`{}[~n~..~m~]` is valid with :math:`k` if: * :math:`n` is less than or equal to :math:`m`. @@ -4398,7 +4398,7 @@ The value type sequence :math:`{t_1^\ast}` matches the value type sequence :math -The limits :math:`({}[~n_{11}~..~n_{12}~])` matches the limits :math:`({}[~n_{21}~..~n_{22}~])` if: +The limits :math:`{}[~n_{11}~..~n_{12}~]` matches the limits :math:`{}[~n_{21}~..~n_{22}~]` if: * :math:`n_{11}` is greater than or equal to :math:`n_{21}`. @@ -9306,13 +9306,13 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as ................................................. -1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~i~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast} \}\end{array}` be :math:`{\mathit{ti}}`. +1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~]~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast} \}\end{array}` be :math:`{\mathit{ti}}`. #. Let :math:`{i'}` be :math:`{|{{r'}^\ast}|} + n`. #. If :math:`{i'} \leq j`, then: - a. Let :math:`{\mathit{ti}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~{i'}~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. + a. Let :math:`{\mathit{ti}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~{i'}~..~j~]~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. #. Return :math:`{\mathit{ti}'}`. @@ -9321,13 +9321,13 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as ............................................... -1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~])~\mathsf{page},\; \mathsf{bytes}~{b^\ast} \}\end{array}` be :math:`{\mathit{mi}}`. +1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~{}[~i~..~j~]~\mathsf{page},\; \mathsf{bytes}~{b^\ast} \}\end{array}` be :math:`{\mathit{mi}}`. #. Let :math:`{i'}` be :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n`. #. If :math:`{i'} \leq j`, then: - a. Let :math:`{\mathit{mi}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~{i'}~..~j~])~\mathsf{page},\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. + a. Let :math:`{\mathit{mi}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~{}[~{i'}~..~j~]~\mathsf{page},\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. #. Return :math:`{\mathit{mi}'}`. @@ -9513,11 +9513,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. -:math:`{\mathrm{alloctable}}(s, ({}[~i~..~j~])~{\mathit{rt}})` -.............................................................. +:math:`{\mathrm{alloctable}}(s, {}[~i~..~j~]~{\mathit{rt}})` +............................................................ -1. Let :math:`{\mathit{ti}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~(({}[~i~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{(\mathsf{ref{.}null}~{\mathit{rt}})^{i}} \}\end{array}`. +1. Let :math:`{\mathit{ti}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~]~{\mathit{rt}}),\; \mathsf{refs}~{(\mathsf{ref{.}null}~{\mathit{rt}})^{i}} \}\end{array}`. #. Let :math:`a` be :math:`{|s{.}\mathsf{tables}|}`. @@ -9543,11 +9543,11 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Return :math:`{\mathit{ta}}~{{\mathit{ta}'}^\ast}`. -:math:`{\mathrm{allocmem}}(s, ({}[~i~..~j~])~\mathsf{page})` -............................................................ +:math:`{\mathrm{allocmem}}(s, {}[~i~..~j~]~\mathsf{page})` +.......................................................... -1. Let :math:`{\mathit{mi}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({}[~i~..~j~])~\mathsf{page},\; \mathsf{bytes}~{\mathtt{0x00}^{i \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. +1. Let :math:`{\mathit{mi}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~{}[~i~..~j~]~\mathsf{page},\; \mathsf{bytes}~{\mathtt{0x00}^{i \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. #. Let :math:`a` be :math:`{|s{.}\mathsf{mems}|}`. @@ -13660,7 +13660,7 @@ The defined type :math:`({\mathit{rectype}} {.} i)` is valid if: -The limits :math:`({}[~n~..~m~])` is valid with :math:`k` if: +The limits :math:`{}[~n~..~m~]` is valid with :math:`k` if: * :math:`n` is less than or equal to :math:`m`. @@ -13805,7 +13805,7 @@ The instruction type :math:`{t_{11}^\ast}~{\rightarrow}_{{x_1^\ast}}\,{t_{12}^\a -The limits :math:`({}[~n_1~..~m_1~])` matches the limits :math:`({}[~n_2~..~m_2~])` if: +The limits :math:`{}[~n_1~..~m_1~]` matches the limits :math:`{}[~n_2~..~m_2~]` if: * :math:`n_1` is greater than or equal to :math:`n_2`. @@ -23710,13 +23710,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i ........................................................ -1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~i~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast} \}\end{array}` be :math:`{\mathit{tableinst}}`. +1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~{}[~i~..~j~]~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast} \}\end{array}` be :math:`{\mathit{tableinst}}`. #. If :math:`{|{{r'}^\ast}|} + n \leq j`, then: a. Let :math:`{i'}` be :math:`{|{{r'}^\ast}|} + n`. - #. Let :math:`{\mathit{tableinst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~{i'}~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. + #. Let :math:`{\mathit{tableinst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~{}[~{i'}~..~j~]~{\mathit{rt}}),\; \mathsf{refs}~{{r'}^\ast}~{r^{n}} \}\end{array}`. #. Return :math:`{\mathit{tableinst}'}`. @@ -23725,13 +23725,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i ................................................. -1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~i~..~j~])~\mathsf{page}),\; \mathsf{bytes}~{b^\ast} \}\end{array}` be :math:`{\mathit{meminst}}`. +1. Let :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~{}[~i~..~j~]~\mathsf{page}),\; \mathsf{bytes}~{b^\ast} \}\end{array}` be :math:`{\mathit{meminst}}`. #. If :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n \leq j`, then: a. Let :math:`{i'}` be :math:`{|{b^\ast}|} / (64 \, {\mathrm{Ki}}) + n`. - #. Let :math:`{\mathit{meminst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~{i'}~..~j~])~\mathsf{page}),\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. + #. Let :math:`{\mathit{meminst}'}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~{}[~{i'}~..~j~]~\mathsf{page}),\; \mathsf{bytes}~{b^\ast}~{\mathtt{0x00}^{n \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. #. Return :math:`{\mathit{meminst}'}`. @@ -23862,11 +23862,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathit{ga}}~{{\mathit{ga}'}^\ast}`. -:math:`{\mathrm{alloctable}}(s, {\mathit{at}}~({}[~i~..~j~])~{\mathit{rt}}, {\mathit{ref}})` -............................................................................................ +:math:`{\mathrm{alloctable}}(s, {\mathit{at}}~{}[~i~..~j~]~{\mathit{rt}}, {\mathit{ref}})` +.......................................................................................... -1. Let :math:`{\mathit{tableinst}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~i~..~j~])~{\mathit{rt}}),\; \mathsf{refs}~{{\mathit{ref}}^{i}} \}\end{array}`. +1. Let :math:`{\mathit{tableinst}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~{}[~i~..~j~]~{\mathit{rt}}),\; \mathsf{refs}~{{\mathit{ref}}^{i}} \}\end{array}`. #. Let :math:`a` be :math:`{|s{.}\mathsf{tables}|}`. @@ -23898,11 +23898,11 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Return :math:`{\mathit{ta}}~{{\mathit{ta}'}^\ast}`. -:math:`{\mathrm{allocmem}}(s, {\mathit{at}}~({}[~i~..~j~])~\mathsf{page})` -.......................................................................... +:math:`{\mathrm{allocmem}}(s, {\mathit{at}}~{}[~i~..~j~]~\mathsf{page})` +........................................................................ -1. Let :math:`{\mathit{meminst}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~({}[~i~..~j~])~\mathsf{page}),\; \mathsf{bytes}~{\mathtt{0x00}^{i \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. +1. Let :math:`{\mathit{meminst}}` be :math:`\{ \begin{array}[t]{@{}l@{}}\mathsf{type}~({\mathit{at}}~{}[~i~..~j~]~\mathsf{page}),\; \mathsf{bytes}~{\mathtt{0x00}^{i \cdot 64 \, {\mathrm{Ki}}}} \}\end{array}`. #. Let :math:`a` be :math:`{|s{.}\mathsf{mems}|}`. From c433696b01f495abfe5ab226877d4a2ef08589b2 Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Mon, 13 Jan 2025 16:41:17 +0900 Subject: [PATCH 10/12] Eval_expr prose fix --- spectec/src/backend-prose/render.ml | 29 +++++++++++++++++++++++++---- spectec/test-prose/TEST.md | 14 +++++++------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/spectec/src/backend-prose/render.ml b/spectec/src/backend-prose/render.ml index 5df65869c2..21b736055c 100644 --- a/spectec/src/backend-prose/render.ml +++ b/spectec/src/backend-prose/render.ml @@ -496,8 +496,6 @@ and render_expr' env expr = let args = List.map (render_arg env) al in if id = "Eval_expr" then (match args with - | [z; expr] -> - "the result of :ref:`evaluating <exec-expr>` " ^ expr ^ " with state " ^ z | [instrs] -> "the result of :ref:`evaluating <exec-expr>` " ^ instrs | _ -> error expr.at (Printf.sprintf "Invalid arity for relation call: %d ([ %s ])" (List.length args) (String.concat " " args)); @@ -1004,8 +1002,31 @@ let rec render_instr env algoname index depth instr = ) in sprintf "%s Let %s be %s." (render_order index depth) (render_expr env n) ce | Al.Ast.LetI (n, e) -> - sprintf "%s Let %s be %s." (render_order index depth) (render_expr env n) - (render_expr env e) + let rec find_eval_expr e = match e.it with + | Al.Ast.CallE ("Eval_expr", [z; arg]) -> + Some (z, arg) + | Al.Ast.IterE (expr, ie) -> + let* z, arg = find_eval_expr expr in + let* arg = match arg.it with + | Al.Ast.ExpA e' -> + Some { arg with it = Al.Ast.ExpA { e' with it = Al.Ast.IterE (e', ie) } } + | _-> None + in + Some (z, arg) + | _ -> None + in + (match find_eval_expr e with + | Some (z, al) -> + let sz = render_arg env z in + let sal = render_arg env al in + let eval = + "the result of :ref:`evaluating <exec-expr>` " ^ sal ^ " with state " ^ sz + in + sprintf "%s Let %s be %s." (render_order index depth) (render_expr env n) eval + | _ -> + sprintf "%s Let %s be %s." (render_order index depth) (render_expr env n) + (render_expr env e) + ) | Al.Ast.TrapI -> sprintf "%s Trap." (render_order index depth) | Al.Ast.FailI -> sprintf "%s Fail." (render_order index depth) | Al.Ast.ThrowI e -> diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index 3a68085259..7296a91d8c 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -2787,19 +2787,19 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{d}})^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{d}}` in :math:`{{\mathit{expr}}_{\mathsf{d}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{d}}` with state :math:`z`. +#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{d}})^\ast}` be the result of :ref:`evaluating <exec-expr>` :math:`{{\mathit{expr}}_{\mathsf{d}}^\ast}` with state :math:`z`. #. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. #. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{e}})^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{e}}` in :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{e}}` with state :math:`z`. +#. Let :math:`{(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_{\mathsf{e}})^\ast}` be the result of :ref:`evaluating <exec-expr>` :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}` with state :math:`z`. #. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. #. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{{\mathit{val}}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{g}}` in :math:`{{\mathit{expr}}_{\mathsf{g}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{g}}` with state :math:`z`. +#. Let :math:`{{\mathit{val}}^\ast}` be the result of :ref:`evaluating <exec-expr>` :math:`{{\mathit{expr}}_{\mathsf{g}}^\ast}` with state :math:`z`. #. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. @@ -9833,13 +9833,13 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{{\mathit{val}}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{g}}` in :math:`{{\mathit{expr}}_{\mathsf{g}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{g}}` with state :math:`z`. +#. Let :math:`{{\mathit{val}}^\ast}` be the result of :ref:`evaluating <exec-expr>` :math:`{{\mathit{expr}}_{\mathsf{g}}^\ast}` with state :math:`z`. #. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. #. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` to the stack. -#. Let :math:`{{{\mathit{ref}}^\ast}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{e*}}` in :math:`{{\mathit{expr}}_{\mathsf{e*}}^\ast}`, for all :math:`{\mathit{expr}}_{\mathsf{e}}` in :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{e}}` with state :math:`z`. +#. Let :math:`{{{\mathit{ref}}^\ast}^\ast}` be the result of :ref:`evaluating <exec-expr>` :math:`{{{\mathit{expr}}_{\mathsf{e}}^\ast}^\ast}` with state :math:`z`. #. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~z{.}\mathsf{frame}~\})` from the stack. @@ -24292,13 +24292,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. -#. Let :math:`{{\mathit{ref}}_{\mathsf{t}}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{t}}` in :math:`{{\mathit{expr}}_{\mathsf{t}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{t}}` with state :math:`z`. +#. Let :math:`{{\mathit{ref}}_{\mathsf{t}}^\ast}` be the result of :ref:`evaluating <exec-expr>` :math:`{{\mathit{expr}}_{\mathsf{t}}^\ast}` with state :math:`z`. #. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. #. Push the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` to the stack. -#. Let :math:`{{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast}` be for all :math:`{\mathit{expr}}_{\mathsf{e*}}` in :math:`{{\mathit{expr}}_{\mathsf{e*}}^\ast}`, for all :math:`{\mathit{expr}}_{\mathsf{e}}` in :math:`{{\mathit{expr}}_{\mathsf{e}}^\ast}`, the result of :ref:`evaluating <exec-expr>` :math:`{\mathit{expr}}_{\mathsf{e}}` with state :math:`z`. +#. Let :math:`{{{\mathit{ref}}_{\mathsf{e}}^\ast}^\ast}` be the result of :ref:`evaluating <exec-expr>` :math:`{{{\mathit{expr}}_{\mathsf{e}}^\ast}^\ast}` with state :math:`z`. #. Pop the :ref:`frame <syntax-frame>` :math:`({\mathsf{frame}}_{0}\,\{~f~\})` from the stack. From 6960aca8a6bd37e2f22b56ce130e8a29bb6c9941 Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Tue, 14 Jan 2025 17:04:47 +0900 Subject: [PATCH 11/12] Merge branch 'main' into splice-modulesem --- document/core/binary/instructions.rst | 2 +- document/core/conf.py | 2 +- document/core/index.rst | 2 +- document/core/syntax/conventions.rst | 10 +- document/core/syntax/instructions.rst | 19 +- document/core/syntax/types.rst | 16 +- document/core/syntax/values.rst | 6 +- document/core/text/instructions.rst | 12 +- document/core/util/macros.def | 7 + document/core/valid/conventions.rst | 1 + spectec/Makefile | 3 + spectec/spec/wasm-1.0/1-syntax.watsup | 2 +- spectec/spec/wasm-1.0/6-typing.watsup | 4 +- spectec/spec/wasm-1.0/8-reduction.watsup | 4 +- spectec/spec/wasm-1.0/A-binary.watsup | 20 +- spectec/spec/wasm-2.0/1-syntax.watsup | 8 +- spectec/spec/wasm-2.0/6-typing.watsup | 6 +- spectec/spec/wasm-2.0/8-reduction.watsup | 12 +- spectec/spec/wasm-2.0/A-binary.watsup | 32 +- spectec/spec/wasm-3.0/1-syntax.watsup | 39 +- spectec/spec/wasm-3.0/3-typing.watsup | 6 +- spectec/spec/wasm-3.0/8-reduction.watsup | 12 +- spectec/spec/wasm-3.0/A-binary.watsup | 32 +- spectec/src/al/al_util.ml | 2 +- spectec/src/backend-interpreter/construct.ml | 5 +- spectec/src/backend-latex/render.ml | 5 +- spectec/src/il2al/translate.ml | 4 +- spectec/test-frontend/TEST.md | 118 ++++--- spectec/test-latex/TEST.md | 167 +++++---- spectec/test-middlend/TEST.md | 354 ++++++++++--------- spectec/test-prose/TEST.md | 138 +++++--- spectec/test-splice/TEST.md | 6 +- 32 files changed, 586 insertions(+), 470 deletions(-) diff --git a/document/core/binary/instructions.rst b/document/core/binary/instructions.rst index 0b62cc6e65..a54a47cc69 100644 --- a/document/core/binary/instructions.rst +++ b/document/core/binary/instructions.rst @@ -254,7 +254,7 @@ Vector loads and stores are followed by the encoding of their ${:memarg} immedia $${grammar: Blaneidx Binstr/vec-memory} -The ${:CONST} instruction for vectors is followed by 16 immediate bytes, which are converted into an ${:i128} in |littleendian| byte order: +The ${:CONST} instruction for vectors is followed by 16 immediate bytes, which are converted into an ${:u128} in |littleendian| byte order: $${grammar: Binstr/vec-const} diff --git a/document/core/conf.py b/document/core/conf.py index 06a9e1889e..f1fc09b9bb 100644 --- a/document/core/conf.py +++ b/document/core/conf.py @@ -60,7 +60,7 @@ name = 'WebAssembly' project = u'WebAssembly' title = u'WebAssembly Specification' -copyright = u'2017-2024, WebAssembly Community Group' +copyright = u'2017-2025, WebAssembly Community Group' author = u'WebAssembly Community Group' editor = u'Andreas Rossberg (editor)' logo = 'static/webassembly.png' diff --git a/document/core/index.rst b/document/core/index.rst index 7f39215f22..0179df7be6 100644 --- a/document/core/index.rst +++ b/document/core/index.rst @@ -3,7 +3,7 @@ WebAssembly Specification .. only:: html - | Release |release| (Draft, |today|) + | Release |release| | Editor: Andreas Rossberg diff --git a/document/core/syntax/conventions.rst b/document/core/syntax/conventions.rst index 09ee8cd353..2bd7ec7d79 100644 --- a/document/core/syntax/conventions.rst +++ b/document/core/syntax/conventions.rst @@ -39,7 +39,7 @@ The following conventions are adopted in defining grammar rules for abstract syn * Large productions may be split into multiple definitions, indicated by ending the first one with explicit ellipses, ${syntax: symsplit/1}, and starting continuations with ellipses, ${syntax: symsplit/2}. -* Some productions are augmented with side conditions, ":math:`(\iff \X{condition})`", that provide a shorthand for a combinatorial expansion of the production into many separate cases. +* Some productions are augmented with side conditions, ":math:`\iff \X{condition}`", that provide a shorthand for a combinatorial expansion of the production into many separate cases. * If the same meta variable or non-terminal symbol appears multiple times in a production, then all those occurrences must have the same instantiation. (This is a shorthand for a side condition requiring multiple different variables to be equal.) @@ -79,19 +79,21 @@ When dealing with syntactic constructs the following notation is also used: * ${:s_1++s_2} denotes the sequence ${:s_1} concatenated with ${:s_2}; this is equivalent to ${:s_1 s_2}, but used for clarity. -* ${:(++) s*} denotes the flat sequence formed by concatenating all sequences ${:s_i} in ${:s*}. +* ${:(++) s*} denotes the flattened sequence, formed by concatenating all sequences ${:s_i} in ${:s*}. -* ${:A <- s} denotes that ${:A} is contained in the sequence ${:s}, that is, ${:s} is of the form ${:s_1 A s_2} for some sequences ${:s_1}, ${:s_2}. +* ${:A <- s} denotes that ${:A} is a member of the sequence ${:s}, that is, ${:s} is of the form ${:s_1 A s_2} for some sequences ${:s_1}, ${:s_2}. Moreover, the following conventions are employed: * The notation ${:x^n}, where ${:x} is a non-terminal symbol, is treated as a meta variable ranging over respective sequences of ${:x} (similarly for ${:x*}, ${:x+}, ${:x?}). * When given a sequence ${:x^n}, - then the occurrences of ${:x} in an iterated sequence ${:(!%...x...!%)^n} are assumed to be in point-wise correspondence with ${:x^n} + then the occurrences of ${:x} in an iterated sequence ${:(!%...x...!%)^n} are assumed to denote the individual elements of ${:x^n}, respectively (similarly for ${:x*}, ${:x+}, ${:x?}). This implicitly expresses a form of mapping syntactic constructions over a sequence. +.. note:: + For example, if ${:x*} is the sequence ${:1 2 3}, then ${:($($f(x) + 1))*} denotes the sequence ${:($($f(1) + 1)) ($($f(2) + 1)) ($($f(3) + 1))}. Productions of the following form are interpreted as *records* that map a fixed set of fields ${:FIELD_ i} to "values" ${:A_i}, respectively: diff --git a/document/core/syntax/instructions.rst b/document/core/syntax/instructions.rst index 7c6ccec841..f9c1ba3ff7 100644 --- a/document/core/syntax/instructions.rst +++ b/document/core/syntax/instructions.rst @@ -38,7 +38,7 @@ The ${:UNREACHABLE} instruction causes an unconditional :ref:`trap <trap>`. The ${:DROP} instruction simply throws away a single operand. The ${:SELECT} instruction selects one of its first two operands based on whether its third operand is zero or not. -It may include a :ref:`value type <syntax-valtype>` determining the type of these operands. If missing, the operands must be of :ref:`numeric type <syntax-numtype>`. +It may include a :ref:`value type <syntax-valtype>` determining the type of these operands. If the type immediate is absent, the operands must be of :ref:`numeric type <syntax-numtype>`. .. note:: In future versions of WebAssembly, the type annotation on ${:SELECT} may allow for more than a single value being selected at the same time. @@ -119,22 +119,22 @@ Vector instructions (also known as *SIMD* instructions, *single instruction mult $${syntax: {lanetype dim shape ishape bshape} half__ zero__ laneidx instr/vec} -$${syntax: - vvunop vvbinop vvternop vvtestop - vunop_ vbinop_ vternop_ vtestop_ vrelop_ vswizzlop_ vshiftop_ vextunop__ vextbinop__ vextternop__ vcvtop__ -} - Vector instructions have a naming convention involving a *shape* prefix that determines how their operands will be interpreted, written ${:t#X#N}, and consisting of a *lane type* ${:t}, a possibly *packed* :ref:`numeric type <syntax-numtype>`, and the number of *lanes* ${:N} of that type. Operations are performed point-wise on the values of each lane. +Instructions prefixed with ${:V128} do not involve a specific interpretation, and treat the ${:V128} as either an ${:i128} value or a vector of ${:128} individual bits. + .. note:: For example, the shape ${shape: I32 X `4} interprets the operand as four ${:i32} values, packed into an ${:i128}. The bit width of the lane type ${:t} times ${:N} always is ${:128}. -Instructions prefixed with ${:V128} do not involve a specific interpretation, and treat the ${:V128} as either an ${:i128} value or a vector of ${:128} individual bits. +$${syntax: + vvunop vvbinop vvternop vvtestop + vunop_ vbinop_ vternop_ vtestop_ vrelop_ vswizzlop_ vshiftop_ vextunop__ vextbinop__ vextternop__ vcvtop__ +} Vector instructions can be grouped into several subcategories: @@ -352,11 +352,6 @@ The ${:MEMORY.INIT} instruction copies data from a :ref:`passive data segment <s The ${:DATA.DROP} instruction prevents further use of a passive data segment. This instruction is intended to be used as an optimization hint. After a data segment is dropped its data can no longer be retrieved, so the memory used by this segment may be freed. -.. note:: - In the current version of WebAssembly, - all memory instructions implicitly operate on :ref:`memory <syntax-mem>` :ref:`index <syntax-memidx>` ${:0}. - This restriction may be lifted in future versions. - .. index:: ! control instruction, ! structured control, ! exception, ! label, ! block, ! block type, ! branch, ! unwinding, stack type, label index, function index, type index, list, trap, function, table, tag, function type, value type, tag type, try block, type index pair: abstract syntax; instruction diff --git a/document/core/syntax/types.rst b/document/core/syntax/types.rst index a83f7dcb2a..2f31c22fe8 100644 --- a/document/core/syntax/types.rst +++ b/document/core/syntax/types.rst @@ -117,7 +117,7 @@ The type ${:ANY} denotes the common supertype of all aggregate types, as well as Dually, the type ${:NONE} denotes the common subtype of all forms of aggregate types. This type has no values. -The type ${:EQT} is a subtype of ${:ANY} that includes all types for which references can be compared, i.e., aggregate values and ${:I31}. +The type ${:EQ} is a subtype of ${:ANY} that includes all types for which references can be compared, i.e., aggregate values and ${:I31}. The types ${:STRUCT} and ${:ARRAY} denote the common supertypes of all :ref:`structure <syntax-structtype>` and :ref:`array <syntax-arraytype>` aggregates, respectively. @@ -125,10 +125,12 @@ The type ${:I31} denotes *unboxed scalars*, that is, integers injected into refe Their observable value range is limited to 31 bits. .. note:: - An ${:I31} value is not actually allocated in the store, + Values of type ${:I31} are not actually allocated in the store, but represented in a way that allows them to be mixed with actual references into the store without ambiguity. Engines need to perform some form of *pointer tagging* to achieve this, which is why one bit is reserved. + Since this type is to be reliably unboxed on all hardware platforms supported by WebAssembly, + it cannot be wider than 32 bits minus the tag bit. Although the types ${:NONE}, ${:NOFUNC}, ${:NOEXN}, and ${:NOEXTERN} are not inhabited by any values, they can be used to form the types of all null :ref:`references <syntax-reftype>` in their respective hierarchy. @@ -156,7 +158,7 @@ In addition, a reference type of the form ${:REF NULL ht} is *nullable*, meaning Other references are *non-null*. Reference types are *opaque*, meaning that neither their size nor their bit pattern can be observed. -Values of reference type can be stored in :ref:`tables <syntax-table>`. +Values of reference type can be stored in :ref:`tables <syntax-table>` but not in :ref:`memories <syntax-mem>`. Conventions ........... @@ -255,7 +257,7 @@ Aggregate Types *Aggregate types* describe compound objects consisting of multiple values. These are either *structures* or *arrays*, -which both consist of a list of possibly mutable and possibly packed *fields*. +which both consist of a list of possibly mutable, possibly packed *fields*. Structures are heterogeneous, but require static indexing, while arrays need to be homogeneous, but allow dynamic indexing. $${syntax: {structtype arraytype fieldtype storagetype packtype}} @@ -304,10 +306,12 @@ Recursive Types *Recursive types* denote a group of mutually recursive :ref:`composite types <syntax-comptype>`, each of which can optionally declare a list of :ref:`type indices <syntax-typeidx>` of supertypes that it :ref:`matches <match-comptype>`. Each type can also be declared *final*, preventing further subtyping. -$${syntax: {rectype subtype}} +$${syntax: {rectype subtype typeuse/syn}} In a :ref:`module <syntax-module>`, each member of a recursive type is assigned a separate :ref:`type index <syntax-typeidx>`. +The syntax of *type uses* representing these type indices is later :ref:`extended <syntax-typeuse-ext>` with additional forms for the purpose of specifying :ref:`validation <valid>` and :ref:`execution <exec>`. + .. _index:: ! address type, number type, bit width pair: abstract syntax; address type @@ -443,7 +447,7 @@ Tag Types \production{tag type} &\tagtype &::=& \functype \\ \end{array} -Currently tags are only used for categorizing exceptions. +Tags are used for categorizing exceptions. The parameters of |functype| define the list of values associated with the exception thrown with this tag. Furthermore, it is an invariant of the semantics that every |functype| in a :ref:`valid <valid-tagtype>` tag type for an exception has an empty result type. diff --git a/document/core/syntax/values.rst b/document/core/syntax/values.rst index 802864ee6f..4bf64221e3 100644 --- a/document/core/syntax/values.rst +++ b/document/core/syntax/values.rst @@ -54,7 +54,7 @@ In the abstract syntax, they are represented as unsigned values. However, some operations :ref:`convert <aux-signed>` them to signed based on a two's complement interpretation. .. note:: - The main integer types occurring in this specification are ${:u32}, ${:u64}, ${:s32}, ${:s64}, ${:i8}, ${:i16}, ${:i32}, ${:i64}. + The main integer types occurring in this specification are ${:u8}, ${:u32}, ${:u64}, and ${:u128}. However, other sizes occur as auxiliary constructions, e.g., in the definition of :ref:`floating-point <syntax-float>` numbers. ${syntax-ignore: u8 u16 u31 u32 u64 u128 s33} @@ -86,7 +86,7 @@ Floating-Point Every value has a *sign* and a *magnitude*. Magnitudes can either be expressed as *normal* numbers of the form ${:m_0`. m_1 m_2`... $(m_M *2^e)}, where ${:e} is the exponent and ${:m} is the *significand* whose most significant bit ${:m_0} is ${:1}`, or as a *subnormal* number where the exponent is fixed to the smallest possible value and ${:m_0} is ${:0}; among the subnormals are positive and negative zero values. -Since the significands are binary values, normals are represented in the form ${:$((1 + m*2^(-M)) * 2^e)}, where ${:M} is the bit width of ${:m}; similarly for subnormals. +Since the significands are binary values, normals are represented in the form ${:$((1 + m*2^(-M)) * 2^e)} in the abstract syntax, where ${:M} is the bit width of ${:m}; similarly for subnormals. Possible magnitudes also include the special values ${:infinity}` (infinity) and ${:NAN} (*NaN*, not a number). NaN values have a *payload* that describes the mantissa bits in the underlying :ref:`binary representation <aux-fbits>`. @@ -136,7 +136,7 @@ Vectors ~~~~~~~ *Numeric vectors* are 128-bit values that are processed by vector instructions (also known as *SIMD* instructions, single instruction multiple data). -They are represented in the abstract syntax using ${:i128}. The interpretation of lane types (:ref:`integer <syntax-int>` or :ref:`floating-point <syntax-float>` numbers) and lane sizes are determined by the specific instruction operating on them. +They are represented in the abstract syntax using ${:u128}. The interpretation of lane types (:ref:`integer <syntax-int>` or :ref:`floating-point <syntax-float>` numbers) and lane sizes are determined by the specific instruction operating on them. .. index:: ! name, byte, Unicode, UTF-8, character, binary format diff --git a/document/core/text/instructions.rst b/document/core/text/instructions.rst index cc104c282c..511066ab75 100644 --- a/document/core/text/instructions.rst +++ b/document/core/text/instructions.rst @@ -729,12 +729,12 @@ Vector constant instructions have a mandatory :ref:`shape <syntax-shape>` descri .. math:: \begin{array}{llclll} \phantom{\production{instruction}} & \phantom{\Tplaininstr_I} &\phantom{::=}& \phantom{averylonginstructionnameforvectext} && \phantom{vechasreallylonginstructionnames} \\[-2ex] &&|& - \text{v128.const}~~\text{i8x16}~~(n{:}\Ti8)^{16} &\Rightarrow& \V128.\VCONST~\bytes_{i128}^{-1}(\bytes_{i8}(n)^{16}) \\ &&|& - \text{v128.const}~~\text{i16x8}~~(n{:}\Ti16)^{8} &\Rightarrow& \V128.\VCONST~\bytes_{i128}^{-1}(\bytes_{i16}(n)^8) \\ &&|& - \text{v128.const}~~\text{i32x4}~~(n{:}\Ti32)^{4} &\Rightarrow& \V128.\VCONST~\bytes_{i128}^{-1}(\bytes_{i32}(n)^4) \\ &&|& - \text{v128.const}~~\text{i64x2}~~(n{:}\Ti64)^{2} &\Rightarrow& \V128.\VCONST~\bytes_{i128}^{-1}(\bytes_{i64}(n)^2) \\ &&|& - \text{v128.const}~~\text{f32x4}~~(z{:}\Tf32)^{4} &\Rightarrow& \V128.\VCONST~\bytes_{i128}^{-1}(\bytes_{f32}(z)^4) \\ &&|& - \text{v128.const}~~\text{f64x2}~~(z{:}\Tf64)^{2} &\Rightarrow& \V128.\VCONST~\bytes_{i128}^{-1}(\bytes_{f64}(z)^2) + \text{v128.const}~~\text{i8x16}~~(n{:}\Ti8)^{16} &\Rightarrow& \V128.\VCONST~\bytes_{\I128}^{-1}(\bytes_{i8}(n)^{16}) \\ &&|& + \text{v128.const}~~\text{i16x8}~~(n{:}\Ti16)^{8} &\Rightarrow& \V128.\VCONST~\bytes_{\I128}^{-1}(\bytes_{i16}(n)^8) \\ &&|& + \text{v128.const}~~\text{i32x4}~~(n{:}\Ti32)^{4} &\Rightarrow& \V128.\VCONST~\bytes_{\I128}^{-1}(\bytes_{i32}(n)^4) \\ &&|& + \text{v128.const}~~\text{i64x2}~~(n{:}\Ti64)^{2} &\Rightarrow& \V128.\VCONST~\bytes_{\I128}^{-1}(\bytes_{i64}(n)^2) \\ &&|& + \text{v128.const}~~\text{f32x4}~~(z{:}\Tf32)^{4} &\Rightarrow& \V128.\VCONST~\bytes_{\I128}^{-1}(\bytes_{f32}(z)^4) \\ &&|& + \text{v128.const}~~\text{f64x2}~~(z{:}\Tf64)^{2} &\Rightarrow& \V128.\VCONST~\bytes_{\I128}^{-1}(\bytes_{f64}(z)^2) \end{array} .. math:: diff --git a/document/core/util/macros.def b/document/core/util/macros.def index dbb585deaa..9e2a02e7ea 100644 --- a/document/core/util/macros.def +++ b/document/core/util/macros.def @@ -158,6 +158,7 @@ .. |u31| mathdef:: \xref{syntax/values}{syntax-int}{\X{u\scriptstyle\kern-0.1em31}} .. |u32| mathdef:: \xref{syntax/values}{syntax-int}{\X{u\scriptstyle\kern-0.1em32}} .. |u64| mathdef:: \xref{syntax/values}{syntax-int}{\X{u\scriptstyle\kern-0.1em64}} +.. |u128| mathdef:: \xref{syntax/values}{syntax-int}{\X{u\scriptstyle\kern-0.1em128}} .. |sNX| mathdef:: \xref{syntax/values}{syntax-int}{\X{s}\kern-0.1em} .. |sN| mathdef:: \xref{syntax/values}{syntax-int}{\X{s}\scriptstyle\kern-0.1emN} @@ -209,6 +210,7 @@ .. |I64| mathdef:: \xref{syntax/types}{syntax-numtype}{\K{i\scriptstyle64}} .. |F32| mathdef:: \xref{syntax/types}{syntax-numtype}{\K{f\scriptstyle32}} .. |F64| mathdef:: \xref{syntax/types}{syntax-numtype}{\K{f\scriptstyle64}} +.. |I128| mathdef:: \xref{syntax/types}{syntax-vectype}{\K{i\scriptstyle128}} .. |V128| mathdef:: \xref{syntax/types}{syntax-vectype}{\K{v\scriptstyle128}} .. |INX| mathdef:: \xref{syntax/types}{syntax-numtype}{\K{i}} .. |IN| mathdef:: \xref{syntax/types}{syntax-numtype}{\K{i}\scriptstyle\kern-0.1emN} @@ -217,6 +219,11 @@ .. |VNX| mathdef:: \xref{syntax/types}{syntax-vectype}{\K{v}} .. |VN| mathdef:: \xref{syntax/types}{syntax-vectype}{\K{v}\scriptstyle\kern-0.1emN} +.. |ntI| mathdef:: \xref{syntax/types}{syntax-numtype}{\K{i}} +.. |ntF| mathdef:: \xref{syntax/types}{syntax-numtype}{\K{f}} +.. |ntV| mathdef:: \xref{syntax/types}{syntax-numtype}{\K{v}} +.. |ntN| mathdef:: \xref{syntax/types}{syntax-numtype}{\scriptstyle\kern-0.1emN} + .. |ANYREF| mathdef:: \xref{syntax/types}{syntax-reftype}{\K{anyref}} .. |EQREF| mathdef:: \xref{syntax/types}{syntax-reftype}{\K{eqref}} .. |I31REF| mathdef:: \xref{syntax/types}{syntax-reftype}{\K{i{\scriptstyle31}ref}} diff --git a/document/core/valid/conventions.rst b/document/core/valid/conventions.rst index bb7f92687a..74e6e16c43 100644 --- a/document/core/valid/conventions.rst +++ b/document/core/valid/conventions.rst @@ -33,6 +33,7 @@ The skeleton of a sound and complete algorithm for type-checking instruction seq .. _syntax-valtype-ext: .. _syntax-heaptype-ext: .. _syntax-subtype-ext: +.. _syntax-typeuse-ext: .. _type-ext: .. _type-closed: diff --git a/spectec/Makefile b/spectec/Makefile index 3985e8f805..beab2e1ec9 100644 --- a/spectec/Makefile +++ b/spectec/Makefile @@ -92,3 +92,6 @@ distclean: clean rm -f ./$(NAME) rm -rf $(CLONEDIR) for dir in $(TESTDIRS); do (cd $$dir && make distclean); done + +specclean: + (cd ../document/core && make clean) diff --git a/spectec/spec/wasm-1.0/1-syntax.watsup b/spectec/spec/wasm-1.0/1-syntax.watsup index a52288d09b..f9bfe43ee7 100644 --- a/spectec/spec/wasm-1.0/1-syntax.watsup +++ b/spectec/spec/wasm-1.0/1-syntax.watsup @@ -184,7 +184,7 @@ syntax memarg hint(desc "memory argument") = {ALIGN u32, OFFSET u32} var ao : memarg syntax loadop_(valtype) -syntax loadop_(Inn) = sz sx hint(show %0#_#%1) -- if sz < $size(Inn) +syntax loadop_(Inn) = sz _ sx hint(show %0#_#%2) -- if sz < $size(Inn) ;; Instructions diff --git a/spectec/spec/wasm-1.0/6-typing.watsup b/spectec/spec/wasm-1.0/6-typing.watsup index 190b8142a8..2eec420acc 100644 --- a/spectec/spec/wasm-1.0/6-typing.watsup +++ b/spectec/spec/wasm-1.0/6-typing.watsup @@ -270,7 +270,7 @@ rule Instr_ok/memory.grow: (; rule Instr_ok/load: - C |- LOAD t (n sx)? memarg : I32 -> t + C |- LOAD t (n _ sx)? memarg : I32 -> t -- if C.MEMS[0] = mt -- if $(2^(memarg.ALIGN) <= $size(t)/8) -- if $(2^(memarg.ALIGN) <= n/8 < $size(t)/8)? @@ -283,7 +283,7 @@ rule Instr_ok/load-val: -- if $(2^(memarg.ALIGN) <= $size(t)/8) rule Instr_ok/load-pack: - C |- LOAD Inn (M sx) memarg : I32 -> Inn + C |- LOAD Inn (M _ sx) memarg : I32 -> Inn -- if C.MEMS[0] = mt -- if $(2^(memarg.ALIGN) <= M/8) diff --git a/spectec/spec/wasm-1.0/8-reduction.watsup b/spectec/spec/wasm-1.0/8-reduction.watsup index 407810159a..3bd8f5e7a1 100644 --- a/spectec/spec/wasm-1.0/8-reduction.watsup +++ b/spectec/spec/wasm-1.0/8-reduction.watsup @@ -233,11 +233,11 @@ rule Step_read/load-num-val: -- if $bytes_(t, c) = $mem(z, 0).BYTES[i + ao.OFFSET : $size(t)/8] rule Step_read/load-pack-trap: - z; (CONST I32 i) (LOAD Inn (n sx) ao) ~> TRAP + z; (CONST I32 i) (LOAD Inn (n _ sx) ao) ~> TRAP -- if $(i + ao.OFFSET + n/8 > |$mem(z, 0).BYTES|) rule Step_read/load-pack-val: - z; (CONST I32 i) (LOAD Inn (n sx) ao) ~> (CONST Inn $extend__(n, $size(Inn), sx, c)) + z; (CONST I32 i) (LOAD Inn (n _ sx) ao) ~> (CONST Inn $extend__(n, $size(Inn), sx, c)) -- if $ibytes_(n, c) = $mem(z, 0).BYTES[i + ao.OFFSET : n/8] diff --git a/spectec/spec/wasm-1.0/A-binary.watsup b/spectec/spec/wasm-1.0/A-binary.watsup index 803f46c6c5..0bfee6ab36 100644 --- a/spectec/spec/wasm-1.0/A-binary.watsup +++ b/spectec/spec/wasm-1.0/A-binary.watsup @@ -181,16 +181,16 @@ grammar Binstr/memory : instr = ... | 0x29 ao:Bmemarg => LOAD I64 ao | 0x2A ao:Bmemarg => LOAD F32 ao | 0x2B ao:Bmemarg => LOAD F64 ao - | 0x2C ao:Bmemarg => LOAD I32 (8 S) ao - | 0x2D ao:Bmemarg => LOAD I32 (8 U) ao - | 0x2E ao:Bmemarg => LOAD I32 (16 S) ao - | 0x2F ao:Bmemarg => LOAD I32 (16 U) ao - | 0x30 ao:Bmemarg => LOAD I64 (8 S) ao - | 0x31 ao:Bmemarg => LOAD I64 (8 U) ao - | 0x32 ao:Bmemarg => LOAD I64 (16 S) ao - | 0x33 ao:Bmemarg => LOAD I64 (16 U) ao - | 0x34 ao:Bmemarg => LOAD I64 (32 S) ao - | 0x35 ao:Bmemarg => LOAD I64 (32 U) ao + | 0x2C ao:Bmemarg => LOAD I32 (8 _ S) ao + | 0x2D ao:Bmemarg => LOAD I32 (8 _ U) ao + | 0x2E ao:Bmemarg => LOAD I32 (16 _ S) ao + | 0x2F ao:Bmemarg => LOAD I32 (16 _ U) ao + | 0x30 ao:Bmemarg => LOAD I64 (8 _ S) ao + | 0x31 ao:Bmemarg => LOAD I64 (8 _ U) ao + | 0x32 ao:Bmemarg => LOAD I64 (16 _ S) ao + | 0x33 ao:Bmemarg => LOAD I64 (16 _ U) ao + | 0x34 ao:Bmemarg => LOAD I64 (32 _ S) ao + | 0x35 ao:Bmemarg => LOAD I64 (32 _ U) ao | 0x36 ao:Bmemarg => STORE I32 ao | 0x37 ao:Bmemarg => STORE I64 ao | 0x38 ao:Bmemarg => STORE F32 ao diff --git a/spectec/spec/wasm-2.0/1-syntax.watsup b/spectec/spec/wasm-2.0/1-syntax.watsup index 6907f63143..ab4ec216bf 100644 --- a/spectec/spec/wasm-2.0/1-syntax.watsup +++ b/spectec/spec/wasm-2.0/1-syntax.watsup @@ -345,12 +345,12 @@ syntax memarg hint(desc "memory argument") = {ALIGN u32, OFFSET u32} var ao : memarg syntax loadop_(numtype) -syntax loadop_(Inn) = sz sx hint(show %0#_#%1) -- if sz < $sizenn(Inn) +syntax loadop_(Inn) = sz _ sx hint(show %0#_#%2) -- if sz < $sizenn(Inn) syntax vloadop = - | SHAPE nat X nat sx hint(show %#X#%#_#%) - | SPLAT nat hint(show %#_#SPLAT) - | ZERO nat hint(show %#_#ZERO) + | SHAPE nat X nat _ sx hint(show %1#X#%3#_#%5) + | SPLAT nat hint(show %#_#SPLAT) + | ZERO nat hint(show %#_#ZERO) ;; diff --git a/spectec/spec/wasm-2.0/6-typing.watsup b/spectec/spec/wasm-2.0/6-typing.watsup index b7a9fa6455..7806dd5a03 100644 --- a/spectec/spec/wasm-2.0/6-typing.watsup +++ b/spectec/spec/wasm-2.0/6-typing.watsup @@ -448,7 +448,7 @@ rule Instr_ok/data.drop: (; rule Instr_ok/load: - C |- LOAD nt (n sx)? memarg : I32 -> nt + C |- LOAD nt (n _ sx)? memarg : I32 -> nt -- if C.MEMS[0] = mt -- if $(2^(memarg.ALIGN) <= $size(nt)/8) -- if $(2^(memarg.ALIGN) <= n/8 < $size(nt)/8)? @@ -461,7 +461,7 @@ rule Instr_ok/load-val: -- if $(2^(memarg.ALIGN) <= $size(nt)/8) rule Instr_ok/load-pack: - C |- LOAD Inn (M sx) memarg : I32 -> Inn + C |- LOAD Inn (M _ sx) memarg : I32 -> Inn -- if C.MEMS[0] = mt -- if $(2^(memarg.ALIGN) <= M/8) @@ -485,7 +485,7 @@ rule Instr_ok/store-pack: -- if $(2^(memarg.ALIGN) <= M/8) rule Instr_ok/vload: - C |- VLOAD V128 (SHAPE M X N sx) memarg : I32 -> V128 + C |- VLOAD V128 (SHAPE M X N _ sx) memarg : I32 -> V128 -- if C.MEMS[0] = mt -- if $(2^(memarg.ALIGN) <= M/8 * N) diff --git a/spectec/spec/wasm-2.0/8-reduction.watsup b/spectec/spec/wasm-2.0/8-reduction.watsup index 01cfb44ea7..4e3b4d70d1 100644 --- a/spectec/spec/wasm-2.0/8-reduction.watsup +++ b/spectec/spec/wasm-2.0/8-reduction.watsup @@ -492,11 +492,11 @@ rule Step_read/load-num-val: -- if $nbytes_(nt, c) = $mem(z, 0).BYTES[i + ao.OFFSET : $size(nt)/8] rule Step_read/load-pack-trap: - z; (CONST I32 i) (LOAD Inn (n sx) ao) ~> TRAP + z; (CONST I32 i) (LOAD Inn (n _ sx) ao) ~> TRAP -- if $(i + ao.OFFSET + n/8 > |$mem(z, 0).BYTES|) rule Step_read/load-pack-val: - z; (CONST I32 i) (LOAD Inn (n sx) ao) ~> (CONST Inn $extend__(n, $size(Inn), sx, c)) + z; (CONST I32 i) (LOAD Inn (n _ sx) ao) ~> (CONST Inn $extend__(n, $size(Inn), sx, c)) -- if $ibytes_(n, c) = $mem(z, 0).BYTES[i + ao.OFFSET : n/8] rule Step_read/vload-oob: @@ -509,11 +509,11 @@ rule Step_read/vload-val: rule Step_read/vload-shape-oob: - z; (CONST I32 i) (VLOAD V128 (SHAPE M X N sx) ao) ~> TRAP + z; (CONST I32 i) (VLOAD V128 (SHAPE M X N _ sx) ao) ~> TRAP -- if $(i + ao.OFFSET + M * N/8) > |$mem(z, 0).BYTES| rule Step_read/vload-shape-val: - z; (CONST I32 i) (VLOAD V128 (SHAPE M X N sx) ao) ~> (VCONST V128 c) + z; (CONST I32 i) (VLOAD V128 (SHAPE M X N _ sx) ao) ~> (VCONST V128 c) -- (if $ibytes_(M, j) = $mem(z, 0).BYTES[i + ao.OFFSET + k * M/8 : M/8])^(k<N) -- if $lsize(Jnn) = $(M * 2) ;; TODO: relate implicitly -- if c = $invlanes_(Jnn X N, $extend__(M, $lsize(Jnn), sx, j)^N) @@ -629,14 +629,14 @@ rule Step_read/memory.copy-zero: rule Step_read/memory.copy-le: z; (CONST I32 j) (CONST I32 i) (CONST I32 n) (MEMORY.COPY) ~> - (CONST I32 j) (CONST I32 i) (LOAD I32 (8 U) $memarg0) (STORE I32 8 $memarg0) + (CONST I32 j) (CONST I32 i) (LOAD I32 (8 _ U) $memarg0) (STORE I32 8 $memarg0) (CONST I32 $(j+1)) (CONST I32 $(i+1)) (CONST I32 $(n-1)) (MEMORY.COPY) -- otherwise -- if j <= i rule Step_read/memory.copy-gt: z; (CONST I32 j) (CONST I32 i) (CONST I32 n) (MEMORY.COPY) ~> - (CONST I32 $(j+n-1)) (CONST I32 $(i+n-1)) (LOAD I32 (8 U) $memarg0) (STORE I32 8 $memarg0) + (CONST I32 $(j+n-1)) (CONST I32 $(i+n-1)) (LOAD I32 (8 _ U) $memarg0) (STORE I32 8 $memarg0) (CONST I32 j) (CONST I32 i) (CONST I32 $(n-1)) (MEMORY.COPY) -- otherwise diff --git a/spectec/spec/wasm-2.0/A-binary.watsup b/spectec/spec/wasm-2.0/A-binary.watsup index d3686843c2..012178babe 100644 --- a/spectec/spec/wasm-2.0/A-binary.watsup +++ b/spectec/spec/wasm-2.0/A-binary.watsup @@ -221,16 +221,16 @@ grammar Binstr/memory : instr = ... | 0x29 ao:Bmemarg => LOAD I64 ao | 0x2A ao:Bmemarg => LOAD F32 ao | 0x2B ao:Bmemarg => LOAD F64 ao - | 0x2C ao:Bmemarg => LOAD I32 (8 S) ao - | 0x2D ao:Bmemarg => LOAD I32 (8 U) ao - | 0x2E ao:Bmemarg => LOAD I32 (16 S) ao - | 0x2F ao:Bmemarg => LOAD I32 (16 U) ao - | 0x30 ao:Bmemarg => LOAD I64 (8 S) ao - | 0x31 ao:Bmemarg => LOAD I64 (8 U) ao - | 0x32 ao:Bmemarg => LOAD I64 (16 S) ao - | 0x33 ao:Bmemarg => LOAD I64 (16 U) ao - | 0x34 ao:Bmemarg => LOAD I64 (32 S) ao - | 0x35 ao:Bmemarg => LOAD I64 (32 U) ao + | 0x2C ao:Bmemarg => LOAD I32 (8 _ S) ao + | 0x2D ao:Bmemarg => LOAD I32 (8 _ U) ao + | 0x2E ao:Bmemarg => LOAD I32 (16 _ S) ao + | 0x2F ao:Bmemarg => LOAD I32 (16 _ U) ao + | 0x30 ao:Bmemarg => LOAD I64 (8 _ S) ao + | 0x31 ao:Bmemarg => LOAD I64 (8 _ U) ao + | 0x32 ao:Bmemarg => LOAD I64 (16 _ S) ao + | 0x33 ao:Bmemarg => LOAD I64 (16 _ U) ao + | 0x34 ao:Bmemarg => LOAD I64 (32 _ S) ao + | 0x35 ao:Bmemarg => LOAD I64 (32 _ U) ao | 0x36 ao:Bmemarg => STORE I32 ao | 0x37 ao:Bmemarg => STORE I64 ao | 0x38 ao:Bmemarg => STORE F32 ao @@ -454,12 +454,12 @@ grammar Blaneidx : laneidx = grammar Binstr/vector-memory : instr = ... | 0xFD 0:Bu32 ao:Bmemarg => VLOAD V128 ao - | 0xFD 1:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 8 X 8 S) ao - | 0xFD 2:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 8 X 8 U) ao - | 0xFD 3:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 16 X 4 S) ao - | 0xFD 4:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 16 X 4 U) ao - | 0xFD 5:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 32 X 2 S) ao - | 0xFD 6:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 32 X 2 U) ao + | 0xFD 1:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 8 X 8 _ S) ao + | 0xFD 2:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 8 X 8 _ U) ao + | 0xFD 3:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 16 X 4 _ S) ao + | 0xFD 4:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 16 X 4 _ U) ao + | 0xFD 5:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 32 X 2 _ S) ao + | 0xFD 6:Bu32 ao:Bmemarg => VLOAD V128 (SHAPE 32 X 2 _ U) ao | 0xFD 7:Bu32 ao:Bmemarg => VLOAD V128 (SPLAT 8) ao | 0xFD 8:Bu32 ao:Bmemarg => VLOAD V128 (SPLAT 16) ao | 0xFD 9:Bu32 ao:Bmemarg => VLOAD V128 (SPLAT 32) ao diff --git a/spectec/spec/wasm-3.0/1-syntax.watsup b/spectec/spec/wasm-3.0/1-syntax.watsup index dae038b961..9f1dc8d325 100644 --- a/spectec/spec/wasm-3.0/1-syntax.watsup +++ b/spectec/spec/wasm-3.0/1-syntax.watsup @@ -75,7 +75,7 @@ def $canon_(N) = $(2^($signif(N)-1)) ;; Vectors syntax vN(N) hint(desc "vector") hint(show v#%) hint(macro "vNX") = - iN(N) + uN(N) syntax v128 = vN(128) @@ -185,9 +185,9 @@ syntax valtype/syn hint(desc "value type") = syntax valtype/sem = | ... | BOT -syntax Inn hint(show I#N) hint(macro none) = I32 | I64 -syntax Fnn hint(show F#N) hint(macro none) = F32 | F64 -syntax Vnn hint(show V#N) hint(macro none) = V128 +syntax Inn hint(show I#N) hint(macro "nt%") = I32 | I64 +syntax Fnn hint(show F#N) hint(macro "nt%") = F32 | F64 +syntax Vnn hint(show V#N) hint(macro "nt%") = V128 syntax Cnn hint(show t) = Inn | Fnn | Vnn @@ -197,9 +197,11 @@ def $I31REF : reftype hint(show I31REF) def $STRUCTREF : reftype hint(show STRUCTREF) def $ARRAYREF : reftype hint(show ARRAYREF) def $FUNCREF : reftype hint(show FUNCREF) +def $EXNREF : reftype hint(show EXNREF) def $EXTERNREF : reftype hint(show EXTERNREF) def $NULLREF : reftype hint(show NULLREF) def $NULLFUNCREF : reftype hint(show NULLFUNCREF) +def $NULLEXNREF : reftype hint(show NULLEXNREF) def $NULLEXTERNREF : reftype hint(show NULLEXTERNREF) def $ANYREF = (REF NULL ANY) @@ -208,9 +210,11 @@ def $I31REF = (REF NULL I31) def $STRUCTREF = (REF NULL STRUCT) def $ARRAYREF = (REF NULL ARRAY) def $FUNCREF = (REF NULL FUNC) +def $EXNREF = (REF NULL EXTERN) def $EXTERNREF = (REF NULL EXTERN) def $NULLREF = (REF NULL NONE) def $NULLFUNCREF = (REF NULL NOFUNC) +def $NULLEXNREF = (REF NULL NOEXN) def $NULLEXTERNREF = (REF NULL NOEXTERN) @@ -220,9 +224,9 @@ syntax packtype hint(desc "packed type") = I8 | I16 syntax lanetype hint(desc "lane type") = numtype | packtype syntax storagetype hint(desc "storage type") = valtype | packtype -syntax Pnn hint(show I#N) hint(macro none) = I8 | I16 -syntax Jnn hint(show I#N) hint(macro none) = Inn | Pnn -syntax Lnn hint(show I#N) hint(macro none) = Inn | Fnn | Pnn +syntax Pnn hint(show I#N) hint(macro "nt%") = I8 | I16 +syntax Jnn hint(show I#N) hint(macro "nt%") = Inn | Pnn +syntax Lnn hint(show I#N) hint(macro "nt%") = Inn | Fnn | Pnn ;; Result types @@ -435,6 +439,7 @@ syntax relop_(Inn) = syntax relop_(Fnn) = | EQ | NE | LT | GT | LE | GE +;; TODO(3, rossberg): change order of parameters? syntax cvtop__(numtype_1, numtype_2) syntax cvtop__(Inn_1, Inn_2) = | EXTEND sx hint(show %0#_#%1) -- if $sizenn1(Inn_1) < $sizenn2(Inn_2) @@ -475,11 +480,11 @@ syntax bshape hint(desc "byte shape") = shape -- if $lanetype(shape) = I8 ;; Vector operators syntax half__(shape_1, shape_2) -syntax half__(Jnn_1 X M_1, Jnn_2 X M_2) = LOW | HIGH -- if $(2 * $lsizenn1(Jnn_1)) = $lsizenn1(Jnn_2) -syntax half__(Lnn_1 X M_1, Fnn_2 X M_2) = LOW -- if $(2 * $lsizenn1(Lnn_1)) = $sizenn1(Fnn_2) = `64 +syntax half__(Jnn_1 X M_1, Jnn_2 X M_2) = LOW | HIGH -- if $(2 * $lsizenn1(Jnn_1)) = $lsizenn2(Jnn_2) +syntax half__(Lnn_1 X M_1, Fnn_2 X M_2) = LOW -- if $(2 * $lsizenn1(Lnn_1)) = $sizenn2(Fnn_2) = 64 syntax zero__(shape_1, shape_2) -syntax zero__(Fnn_1 X M_1, Lnn_2 X M_2) = ZERO -- if $(2 * $lsizenn2(Lnn_2)) = $sizenn1(Fnn_1) = `64 +syntax zero__(Fnn_1 X M_1, Lnn_2 X M_2) = ZERO -- if $(2 * $lsizenn2(Lnn_2)) = $sizenn1(Fnn_1) = 64 syntax vvunop hint(macro "%" "V%") = NOT syntax vvbinop hint(macro "%" "V%") = AND | ANDNOT | OR | XOR @@ -503,7 +508,8 @@ syntax vbinop_(Jnn X M) = | RELAXED_Q15MULR S hint(show RELAXED_Q15MULR#_#%) -- if $lsizenn(Jnn) = `16 | MIN sx hint(show MIN#_#%) -- if $lsizenn(Jnn) <= `32 | MAX sx hint(show MAX#_#%) -- if $lsizenn(Jnn) <= `32 -syntax vbinop_(Fnn X M) = ADD | SUB | MUL | DIV | MIN | MAX | PMIN | PMAX | RELAXED_MIN | RELAXED_MAX +syntax vbinop_(Fnn X M) = ADD | SUB | MUL | DIV | MIN | MAX | PMIN | PMAX + | RELAXED_MIN | RELAXED_MAX syntax vternop_(shape) hint(macro "%" "V%") syntax vternop_(Jnn X M) = RELAXED_LANESELECT @@ -571,15 +577,15 @@ syntax memarg hint(desc "memory argument") = {ALIGN u32, OFFSET u32} var ao : memarg syntax loadop_(numtype) -syntax loadop_(Inn) = sz sx hint(show %0#_#%1) -- if sz < $sizenn(Inn) +syntax loadop_(Inn) = sz _ sx hint(show %0#_#%2) -- if sz < $sizenn(Inn) syntax storeop_(numtype) -syntax storeop_(Inn) = sz -- if sz < $sizenn(Inn) +syntax storeop_(Inn) = sz -- if sz < $sizenn(Inn) syntax vloadop_(vectype) hint(macro "%" "L%") = - | SHAPE sz X M sx hint(show %1#X#%3#_#%4) hint(macro "%shape") -- if $(sz * M = $vsize(vectype)/2) - | SPLAT sz hint(show %#_#SPLAT) - | ZERO sz hint(show %#_#ZERO) -- if sz >= `32 + | SHAPE sz X M _ sx hint(show %1#X#%3#_#%5) hint(macro "%shape") -- if $(sz * M = $vsize(vectype)/2) + | SPLAT sz hint(show %#_#SPLAT) + | ZERO sz hint(show %#_#ZERO) -- if sz >= `32 ;; Block types @@ -677,6 +683,7 @@ syntax instr/vec hint(desc "vector instruction") = ... | VNARROW ishape_1 ishape_2 sx hint(show ##%.NARROW#_# ##%#_#%) hint(macro "VNARROW") -- if $($lsize($lanetype(ishape_2)) = 2*$lsize($lanetype(ishape_1)) <= `32) | VCVTOP shape_1 shape_2 vcvtop__(shape_2, shape_1) half__(shape_2, shape_1)? zero__(shape_2, shape_1)? + ;; TODO(1, rossberg): fix overlong line hint(show ##%1.%3#_# ##%2) hint(show ##%1.%3#_# ##%2#_#%4) ;; TODO(2, rossberg): this is wrong when half is absent hint(show ##%1.%3#_#%5#_# ##%2#_#%4) ;; TODO(2, rossberg): this is wrong when half is present diff --git a/spectec/spec/wasm-3.0/3-typing.watsup b/spectec/spec/wasm-3.0/3-typing.watsup index 3170c421cc..87f34c261a 100644 --- a/spectec/spec/wasm-3.0/3-typing.watsup +++ b/spectec/spec/wasm-3.0/3-typing.watsup @@ -1074,7 +1074,7 @@ rule Instr_ok/data.drop: (; rule Instr_ok/load: - C |- LOAD nt (N sx)? x memarg : at -> nt + C |- LOAD nt (N _ sx)? x memarg : at -> nt -- if C.MEMS[x] = at lim PAGE -- if $(2^(memarg.ALIGN) <= $size(nt)/8) -- if $(2^(memarg.ALIGN) <= N/8 < $size(nt)/8)? @@ -1087,7 +1087,7 @@ rule Instr_ok/load-val: -- if $(2^(memarg.ALIGN) <= $size(nt)/8) rule Instr_ok/load-pack: - C |- LOAD Inn (M sx) x memarg : at -> Inn + C |- LOAD Inn (M _ sx) x memarg : at -> Inn -- if C.MEMS[x] = at lim PAGE -- if $(2^(memarg.ALIGN) <= M/8) @@ -1116,7 +1116,7 @@ rule Instr_ok/vload-val: -- if $(2^(memarg.ALIGN) <= $vsize(V128)/8) rule Instr_ok/vload-pack: - C |- VLOAD V128 (SHAPE M X N sx) x memarg : at -> V128 + C |- VLOAD V128 (SHAPE M X N _ sx) x memarg : at -> V128 -- if C.MEMS[x] = at lim PAGE -- if $(2^(memarg.ALIGN) <= M/8 * N) diff --git a/spectec/spec/wasm-3.0/8-reduction.watsup b/spectec/spec/wasm-3.0/8-reduction.watsup index dfc06ae7b7..2114d5223c 100644 --- a/spectec/spec/wasm-3.0/8-reduction.watsup +++ b/spectec/spec/wasm-3.0/8-reduction.watsup @@ -900,12 +900,12 @@ rule Step_read/load-num-val: -- if $nbytes_(nt, c) = $mem(z, x).BYTES[i + ao.OFFSET : $size(nt)/8] rule Step_read/load-pack-oob: - z; (CONST at i) (LOAD Inn (n sx) x ao) ~> TRAP + z; (CONST at i) (LOAD Inn (n _ sx) x ao) ~> TRAP ---- -- if $(i + ao.OFFSET + n/8 > |$mem(z, x).BYTES|) rule Step_read/load-pack-val: - z; (CONST at i) (LOAD Inn (n sx) x ao) ~> (CONST Inn $extend__(n, $size(Inn), sx, c)) + z; (CONST at i) (LOAD Inn (n _ sx) x ao) ~> (CONST Inn $extend__(n, $size(Inn), sx, c)) ---- -- if $ibytes_(n, c) = $mem(z, x).BYTES[i + ao.OFFSET : n/8] @@ -919,11 +919,11 @@ rule Step_read/vload-val: rule Step_read/vload-pack-oob: - z; (CONST at i) (VLOAD V128 (SHAPE M X K sx) x ao) ~> TRAP + z; (CONST at i) (VLOAD V128 (SHAPE M X K _ sx) x ao) ~> TRAP -- if $(i + ao.OFFSET + M * K/8) > |$mem(z, x).BYTES| rule Step_read/vload-pack-val: - z; (CONST at i) (VLOAD V128 (SHAPE M X K sx) x ao) ~> (VCONST V128 c) + z; (CONST at i) (VLOAD V128 (SHAPE M X K _ sx) x ao) ~> (VCONST V128 c) ---- ---- -- (if $ibytes_(M, j) = $mem(z, x).BYTES[i + ao.OFFSET + k * M/8 : M/8])^(k<K) -- if c = $invlanes_(Jnn X K, $extend__(M, $lsizenn(Jnn), sx, j)^K) @@ -1052,14 +1052,14 @@ rule Step_read/memory.copy-zero: rule Step_read/memory.copy-le: z; (CONST at_1 i_1) (CONST at_2 i_2) (CONST at' n) (MEMORY.COPY x_1 x_2) ~> - (CONST at_1 i_1) (CONST at_2 i_2) (LOAD I32 (8 U) x_2 $memarg0) (STORE I32 8 x_1 $memarg0) + (CONST at_1 i_1) (CONST at_2 i_2) (LOAD I32 (8 _ U) x_2 $memarg0) (STORE I32 8 x_1 $memarg0) (CONST at_1 $(i_1 + 1)) (CONST at_2 $(i_2 + 1)) (CONST at' $(n - 1)) (MEMORY.COPY x_1 x_2) -- otherwise -- if i_1 <= i_2 rule Step_read/memory.copy-gt: z; (CONST at_1 i_1) (CONST at_2 i_2) (CONST at' n) (MEMORY.COPY x_1 x_2) ~> - (CONST at_1 $(i_1+n-1)) (CONST at_2 $(i_2+n-1)) (LOAD I32 (8 U) x_2 $memarg0) (STORE I32 8 x_1 $memarg0) + (CONST at_1 $(i_1+n-1)) (CONST at_2 $(i_2+n-1)) (LOAD I32 (8 _ U) x_2 $memarg0) (STORE I32 8 x_1 $memarg0) (CONST at_1 i_1) (CONST at_2 i_2) (CONST at' $(n-1)) (MEMORY.COPY x_1 x_2) -- otherwise diff --git a/spectec/spec/wasm-3.0/A-binary.watsup b/spectec/spec/wasm-3.0/A-binary.watsup index 527de36102..19f2183e65 100644 --- a/spectec/spec/wasm-3.0/A-binary.watsup +++ b/spectec/spec/wasm-3.0/A-binary.watsup @@ -359,16 +359,16 @@ grammar Binstr/memory : instr = ... | 0x29 (x,ao):Bmemarg => LOAD I64 x ao | 0x2A (x,ao):Bmemarg => LOAD F32 x ao | 0x2B (x,ao):Bmemarg => LOAD F64 x ao - | 0x2C (x,ao):Bmemarg => LOAD I32 (`8 S) x ao - | 0x2D (x,ao):Bmemarg => LOAD I32 (`8 U) x ao - | 0x2E (x,ao):Bmemarg => LOAD I32 (`16 S) x ao - | 0x2F (x,ao):Bmemarg => LOAD I32 (`16 U) x ao - | 0x30 (x,ao):Bmemarg => LOAD I64 (`8 S) x ao - | 0x31 (x,ao):Bmemarg => LOAD I64 (`8 U) x ao - | 0x32 (x,ao):Bmemarg => LOAD I64 (`16 S) x ao - | 0x33 (x,ao):Bmemarg => LOAD I64 (`16 U) x ao - | 0x34 (x,ao):Bmemarg => LOAD I64 (`32 S) x ao - | 0x35 (x,ao):Bmemarg => LOAD I64 (`32 U) x ao + | 0x2C (x,ao):Bmemarg => LOAD I32 (`8 _ S) x ao + | 0x2D (x,ao):Bmemarg => LOAD I32 (`8 _ U) x ao + | 0x2E (x,ao):Bmemarg => LOAD I32 (`16 _ S) x ao + | 0x2F (x,ao):Bmemarg => LOAD I32 (`16 _ U) x ao + | 0x30 (x,ao):Bmemarg => LOAD I64 (`8 _ S) x ao + | 0x31 (x,ao):Bmemarg => LOAD I64 (`8 _ U) x ao + | 0x32 (x,ao):Bmemarg => LOAD I64 (`16 _ S) x ao + | 0x33 (x,ao):Bmemarg => LOAD I64 (`16 _ U) x ao + | 0x34 (x,ao):Bmemarg => LOAD I64 (`32 _ S) x ao + | 0x35 (x,ao):Bmemarg => LOAD I64 (`32 _ U) x ao | 0x36 (x,ao):Bmemarg => STORE I32 x ao | 0x37 (x,ao):Bmemarg => STORE I64 x ao | 0x38 (x,ao):Bmemarg => STORE F32 x ao @@ -596,12 +596,12 @@ grammar Blaneidx : laneidx = grammar Binstr/vec-memory : instr = ... | 0xFD 0:Bu32 (x,ao):Bmemarg => VLOAD V128 x ao - | 0xFD 1:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `8 X `8 S) x ao - | 0xFD 2:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `8 X `8 U) x ao - | 0xFD 3:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `16 X `4 S) x ao - | 0xFD 4:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `16 X `4 U) x ao - | 0xFD 5:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `32 X `2 S) x ao - | 0xFD 6:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `32 X `2 U) x ao + | 0xFD 1:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `8 X `8 _ S) x ao + | 0xFD 2:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `8 X `8 _ U) x ao + | 0xFD 3:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `16 X `4 _ S) x ao + | 0xFD 4:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `16 X `4 _ U) x ao + | 0xFD 5:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `32 X `2 _ S) x ao + | 0xFD 6:Bu32 (x,ao):Bmemarg => VLOAD V128 (SHAPE `32 X `2 _ U) x ao | 0xFD 7:Bu32 (x,ao):Bmemarg => VLOAD V128 (SPLAT `8) x ao | 0xFD 8:Bu32 (x,ao):Bmemarg => VLOAD V128 (SPLAT `16) x ao | 0xFD 9:Bu32 (x,ao):Bmemarg => VLOAD V128 (SPLAT `32) x ao diff --git a/spectec/src/al/al_util.ml b/spectec/src/al/al_util.ml index 6401016632..fb24f581f4 100644 --- a/spectec/src/al/al_util.ml +++ b/spectec/src/al/al_util.ml @@ -289,7 +289,7 @@ let frameE ?(at = no) ~note (arity, e) = let get_atom op = - match List.find_opt (fun al -> List.length al <> 0) op with + match List.find_opt (fun al -> al <> []) op with | Some al -> Some (List.hd al) | None -> None diff --git a/spectec/src/backend-interpreter/construct.ml b/spectec/src/backend-interpreter/construct.ml index 103f9db187..cba6e06862 100644 --- a/spectec/src/backend-interpreter/construct.ml +++ b/spectec/src/backend-interpreter/construct.ml @@ -694,7 +694,7 @@ let al_to_memop (f: value -> 'p) : value list -> idx * (num_type, 'p) memop = fu | v -> error_values "memop" v let al_to_pack_size_extension: value -> Pack.pack_size * Pack.extension = function - | CaseV (_, [ p; ext ]) -> al_to_pack_size p, al_to_extension ext + | CaseV ("_", [ p; ext ]) -> al_to_pack_size p, al_to_extension ext | v -> error_value "pack size, extension" v let al_to_loadop: value list -> idx * loadop = al_to_opt al_to_pack_size_extension |> al_to_memop @@ -1876,7 +1876,8 @@ let al_of_memop f idx memop = in [ al_of_num_type memop.ty; f memop.pack ] @ al_of_memidx idx @ [ StrV str ] -let al_of_pack_size_extension (p, s) = CaseV ("", [ al_of_pack_size p; al_of_extension s ]) +let al_of_pack_size_extension (p, s) = + CaseV ("_", [ al_of_pack_size p; al_of_extension s ]) let al_of_loadop = al_of_opt al_of_pack_size_extension |> al_of_memop diff --git a/spectec/src/backend-latex/render.ml b/spectec/src/backend-latex/render.ml index a79bd95d1a..d0b3c87369 100644 --- a/spectec/src/backend-latex/render.ml +++ b/spectec/src/backend-latex/render.ml @@ -427,6 +427,7 @@ let rec string_of_row sep br = function let rec string_of_table vsep vbr hsep hbr = function | [] -> "" + | (Row cols)::[] -> string_of_row hsep hbr cols | (Row cols)::Sep::rows -> string_of_row hsep hbr cols ^ vbr ^ string_of_table vsep vbr hsep hbr rows | (Row cols)::rows -> string_of_row hsep hbr cols ^ vsep ^ string_of_table vsep vbr hsep hbr rows | Sep::rows -> vbr ^ string_of_table vsep vbr hsep hbr rows @@ -1127,7 +1128,7 @@ and render_nottyp env t : table = [Row [Col ( "\\{ " ^ render_table env "@{}" ["l"; "l"] 0 0 - (concat_table "" (render_nl_list env (`H, " ") render_typfield tfs) [Row [Col " \\}"]]) + (concat_table "" (render_nl_list env (`H, ", ") render_typfield tfs) [Row [Col " \\}"]]) )]] | CaseT (dots1, ts, tcs, dots2) -> let render env = function @@ -1418,7 +1419,7 @@ and render_conditions env prems : row list = in prefix_row br ( match prems''' with - | [] -> [Row [Col pre]] + | [] -> [Row [Col ("\\quad " ^ pre)]] | [Elem prem] -> [Row [Col ("\\quad " ^ pre ^ "~ " ^ render_prem env prem)]] | _ -> [Row [Col diff --git a/spectec/src/il2al/translate.ml b/spectec/src/il2al/translate.ml index 18ccd4c63d..07cd89b37b 100644 --- a/spectec/src/il2al/translate.ml +++ b/spectec/src/il2al/translate.ml @@ -485,7 +485,7 @@ let get_lhs_var_expr e = let lhs_id = !lhs_id_ref in lhs_id_ref := (lhs_id + 1); let exp = Il2al_util.typ_to_var_exp e.note ~post_fix:("_" ^ string_of_int lhs_id) in - { (translate_exp exp) with note = e.note} + { (translate_exp exp) with at = e.at; note = e.note} (* Helper functions *) @@ -779,7 +779,7 @@ and handle_special_lhs lhs rhs free_ids = (match tag_opt with | Some ({ it = Atom.Atom _; _} as tag) -> [ ifI ( - inject_isCaseOf tag rhs, + inject_isCaseOf tag rhs, letI (caseE (op, es') ~at:lhs.at ~note:lhs.note, rhs) ~at:at :: translate_bindings free_ids bindings, [] diff --git a/spectec/test-frontend/TEST.md b/spectec/test-frontend/TEST.md index 0b0a778fe7..4c01f83384 100644 --- a/spectec/test-frontend/TEST.md +++ b/spectec/test-frontend/TEST.md @@ -283,7 +283,7 @@ def $canon_(N : N) : nat def $canon_{N : N}(N) = (2 ^ ((($signif(N) : nat <:> int) - (1 : nat <:> int)) : int <:> nat)) ;; 1-syntax.watsup -syntax vN{N : N}(N) = iN(N) +syntax vN{N : N}(N) = uN(N) ;; 1-syntax.watsup syntax v128 = vN(128) @@ -474,7 +474,7 @@ syntax valtype = | REF{nul : nul, heaptype : heaptype}(nul : nul, heaptype : heaptype) | BOT -;; 1-syntax.watsup:221.1-221.66 +;; 1-syntax.watsup:225.1-225.66 syntax storagetype = | BOT | I32 @@ -486,34 +486,34 @@ syntax storagetype = | I8 | I16 -;; 1-syntax.watsup:230.1-231.16 +;; 1-syntax.watsup:234.1-235.16 syntax resulttype = list(syntax valtype) -;; 1-syntax.watsup:243.1-243.60 +;; 1-syntax.watsup:247.1-247.60 syntax fieldtype = | `%%`{mut : mut, storagetype : storagetype}(mut : mut, storagetype : storagetype) -;; 1-syntax.watsup:245.1-245.90 +;; 1-syntax.watsup:249.1-249.90 syntax functype = | `%->%`{resulttype : resulttype}(resulttype : resulttype, resulttype) -;; 1-syntax.watsup:246.1-246.64 +;; 1-syntax.watsup:250.1-250.64 syntax structtype = list(syntax fieldtype) -;; 1-syntax.watsup:247.1-247.54 +;; 1-syntax.watsup:251.1-251.54 syntax arraytype = fieldtype -;; 1-syntax.watsup:249.1-252.18 +;; 1-syntax.watsup:253.1-256.18 syntax comptype = | STRUCT{structtype : structtype}(structtype : structtype) | ARRAY{arraytype : arraytype}(arraytype : arraytype) | FUNC{functype : functype}(functype : functype) -;; 1-syntax.watsup:254.1-255.30 +;; 1-syntax.watsup:258.1-259.30 syntax subtype = | SUB{fin : fin, `typeuse*` : typeuse*, comptype : comptype}(fin : fin, typeuse*{typeuse <- `typeuse*`} : typeuse*, comptype : comptype) -;; 1-syntax.watsup:257.1-258.22 +;; 1-syntax.watsup:261.1-262.22 syntax rectype = | REC{list : list(syntax subtype)}(list : list(syntax subtype)) } @@ -583,6 +583,11 @@ def $FUNCREF : reftype ;; 1-syntax.watsup def $FUNCREF = REF_reftype(?(NULL_NULL), FUNC_heaptype) +;; 1-syntax.watsup +def $EXNREF : reftype + ;; 1-syntax.watsup + def $EXNREF = REF_reftype(?(NULL_NULL), EXTERN_heaptype) + ;; 1-syntax.watsup def $EXTERNREF : reftype ;; 1-syntax.watsup @@ -598,6 +603,11 @@ def $NULLFUNCREF : reftype ;; 1-syntax.watsup def $NULLFUNCREF = REF_reftype(?(NULL_NULL), NOFUNC_heaptype) +;; 1-syntax.watsup +def $NULLEXNREF : reftype + ;; 1-syntax.watsup + def $NULLEXNREF = REF_reftype(?(NULL_NULL), NOEXN_heaptype) + ;; 1-syntax.watsup def $NULLEXTERNREF : reftype ;; 1-syntax.watsup @@ -1001,13 +1011,13 @@ syntax half__(shape_1 : shape, shape_2 : shape) syntax half__{Jnn_1 : Jnn, M_1 : M, Jnn_2 : Jnn, M_2 : M}(`%X%`_shape((Jnn_1 : Jnn <: lanetype), `%`_dim(M_1)), `%X%`_shape((Jnn_2 : Jnn <: lanetype), `%`_dim(M_2))) = | LOW | HIGH - -- if ((2 * $lsizenn1((Jnn_1 : Jnn <: lanetype))) = $lsizenn1((Jnn_2 : Jnn <: lanetype))) + -- if ((2 * $lsizenn1((Jnn_1 : Jnn <: lanetype))) = $lsizenn2((Jnn_2 : Jnn <: lanetype))) ;; 1-syntax.watsup syntax half__{Lnn_1 : Lnn, M_1 : M, Fnn_2 : Fnn, M_2 : M}(`%X%`_shape(Lnn_1, `%`_dim(M_1)), `%X%`_shape((Fnn_2 : Fnn <: lanetype), `%`_dim(M_2))) = | LOW - -- if (((2 * $lsizenn1(Lnn_1)) = $sizenn1((Fnn_2 : Fnn <: numtype))) /\ ($sizenn1((Fnn_2 : Fnn <: numtype)) = 64)) + -- if (((2 * $lsizenn1(Lnn_1)) = $sizenn2((Fnn_2 : Fnn <: numtype))) /\ ($sizenn2((Fnn_2 : Fnn <: numtype)) = 64)) ;; 1-syntax.watsup @@ -1204,7 +1214,7 @@ syntax memarg = ;; 1-syntax.watsup syntax loadop_{Inn : Inn}((Inn : Inn <: numtype)) = - | `%%`{sz : sz, sx : sx}(sz : sz, sx : sx) + | `%_%`{sz : sz, sx : sx}(sz : sz, sx : sx) -- if (sz!`%`_sz.0 < $sizenn((Inn : Inn <: numtype))) ;; 1-syntax.watsup @@ -1214,7 +1224,7 @@ syntax storeop_{Inn : Inn}((Inn : Inn <: numtype)) = ;; 1-syntax.watsup syntax vloadop_{vectype : vectype}(vectype) = - | `SHAPE%X%%`{sz : sz, M : M, sx : sx}(sz : sz, M : M, sx : sx) + | `SHAPE%X%_%`{sz : sz, M : M, sx : sx}(sz : sz, M : M, sx : sx) -- if (((sz!`%`_sz.0 * M) : nat <:> rat) = (($vsize(vectype) : nat <:> rat) / (2 : nat <:> rat))) | SPLAT{sz : sz}(sz : sz) | ZERO{sz : sz}(sz : sz) @@ -3792,7 +3802,7 @@ relation Instr_ok: `%|-%:%`(context, instr, instrtype) ;; 3-typing.watsup:1089.1-1092.35 rule `load-pack`{C : context, Inn : Inn, M : M, sx : sx, x : idx, memarg : memarg, at : addrtype, lim : limits}: - `%|-%:%`(C, LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(M), sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([(Inn : Inn <: valtype)]))) + `%|-%:%`(C, LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(M), sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([(Inn : Inn <: valtype)]))) -- if (C.MEMS_context[x!`%`_idx.0] = `%%PAGE`_memtype(at, lim)) -- if (((2 ^ memarg.ALIGN_memarg!`%`_u32.0) : nat <:> rat) <= ((M : nat <:> rat) / (8 : nat <:> rat))) @@ -3816,7 +3826,7 @@ relation Instr_ok: `%|-%:%`(context, instr, instrtype) ;; 3-typing.watsup:1118.1-1121.39 rule `vload-pack`{C : context, M : M, N : N, sx : sx, x : idx, memarg : memarg, at : addrtype, lim : limits}: - `%|-%:%`(C, VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), N, sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([V128_valtype]))) + `%|-%:%`(C, VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), N, sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([V128_valtype]))) -- if (C.MEMS_context[x!`%`_idx.0] = `%%PAGE`_memtype(at, lim)) -- if (((2 ^ memarg.ALIGN_memarg!`%`_u32.0) : nat <:> rat) <= (((M : nat <:> rat) / (8 : nat <:> rat)) * (N : nat <:> rat))) @@ -6585,12 +6595,12 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `load-pack-oob`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), Inn : Inn, n : n, sx : sx, x : idx, ao : memarg}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(n), sx)), x, ao)]), [TRAP_instr]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(n), sx)), x, ao)]), [TRAP_instr]) -- if (((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + (((n : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) > |$mem(z, x).BYTES_meminst|) ;; 8-reduction.watsup rule `load-pack-val`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), Inn : Inn, n : n, sx : sx, x : idx, ao : memarg, c : iN(n)}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(n), sx)), x, ao)]), [CONST_instr((Inn : Inn <: numtype), $extend__(n, $size((Inn : Inn <: numtype)), sx, c))]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(n), sx)), x, ao)]), [CONST_instr((Inn : Inn <: numtype), $extend__(n, $size((Inn : Inn <: numtype)), sx, c))]) -- if ($ibytes_(n, c) = $mem(z, x).BYTES_meminst[(i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) : (((n : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)]) ;; 8-reduction.watsup @@ -6605,12 +6615,12 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `vload-pack-oob`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), M : M, K : K, sx : sx, x : idx, ao : memarg}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [TRAP_instr]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [TRAP_instr]) -- if (((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + ((((M * K) : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) > |$mem(z, x).BYTES_meminst|) ;; 8-reduction.watsup rule `vload-pack-val`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), M : M, K : K, sx : sx, x : idx, ao : memarg, c : vec_(V128_Vnn), `j*` : iN(M)*, `k*` : nat*, Jnn : Jnn}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [VCONST_instr(V128_vectype, c)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [VCONST_instr(V128_vectype, c)]) -- (if ($ibytes_(M, j) = $mem(z, x).BYTES_meminst[((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + ((((k * M) : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) : (((M : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)]))^(k<K){j <- `j*`, k <- `k*`} -- if ((c = $invlanes_(`%X%`_shape((Jnn : Jnn <: lanetype), `%`_dim(K)), $extend__(M, $lsizenn((Jnn : Jnn <: lanetype)), sx, j)^K{j <- `j*`})) /\ ($lsizenn((Jnn : Jnn <: lanetype)) = (M * 2))) @@ -6686,13 +6696,13 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `memory.copy-le`{z : state, at_1 : addrtype, i_1 : num_((at_1 : addrtype <: numtype)), at_2 : addrtype, i_2 : num_((at_2 : addrtype <: numtype)), at' : addrtype, n : n, x_1 : idx, x_2 : idx}: - `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), `%`_num_((i_1!`%`_num_.0 + 1))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_((i_2!`%`_num_.0 + 1))) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), `%`_num_((i_1!`%`_num_.0 + 1))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_((i_2!`%`_num_.0 + 1))) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) -- otherwise -- if (i_1!`%`_num_.0 <= i_2!`%`_num_.0) ;; 8-reduction.watsup rule `memory.copy-gt`{z : state, at_1 : addrtype, i_1 : num_((at_1 : addrtype <: numtype)), at_2 : addrtype, i_2 : num_((at_2 : addrtype <: numtype)), at' : addrtype, n : n, x_1 : idx, x_2 : idx}: - `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), `%`_num_(((((i_1!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_(((((i_2!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), `%`_num_(((((i_1!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_(((((i_2!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) -- otherwise ;; 8-reduction.watsup @@ -7673,26 +7683,26 @@ grammar Binstr : instr prod{x : idx, ao : memarg} {0x2A (x, ao):Bmemarg} => LOAD_instr(F32_numtype, ?(), x, ao) ;; A-binary.watsup:361.5-361.41 prod{x : idx, ao : memarg} {0x2B (x, ao):Bmemarg} => LOAD_instr(F64_numtype, ?(), x, ao) - ;; A-binary.watsup:362.5-362.48 - prod{x : idx, ao : memarg} {0x2C (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), S_sx)), x, ao) - ;; A-binary.watsup:363.5-363.48 - prod{x : idx, ao : memarg} {0x2D (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x, ao) - ;; A-binary.watsup:364.5-364.49 - prod{x : idx, ao : memarg} {0x2E (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(16), S_sx)), x, ao) - ;; A-binary.watsup:365.5-365.49 - prod{x : idx, ao : memarg} {0x2F (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(16), U_sx)), x, ao) - ;; A-binary.watsup:366.5-366.48 - prod{x : idx, ao : memarg} {0x30 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(8), S_sx)), x, ao) - ;; A-binary.watsup:367.5-367.48 - prod{x : idx, ao : memarg} {0x31 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x, ao) - ;; A-binary.watsup:368.5-368.49 - prod{x : idx, ao : memarg} {0x32 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(16), S_sx)), x, ao) - ;; A-binary.watsup:369.5-369.49 - prod{x : idx, ao : memarg} {0x33 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(16), U_sx)), x, ao) - ;; A-binary.watsup:370.5-370.49 - prod{x : idx, ao : memarg} {0x34 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(32), S_sx)), x, ao) - ;; A-binary.watsup:371.5-371.49 - prod{x : idx, ao : memarg} {0x35 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(32), U_sx)), x, ao) + ;; A-binary.watsup:362.5-362.50 + prod{x : idx, ao : memarg} {0x2C (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), S_sx)), x, ao) + ;; A-binary.watsup:363.5-363.50 + prod{x : idx, ao : memarg} {0x2D (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x, ao) + ;; A-binary.watsup:364.5-364.51 + prod{x : idx, ao : memarg} {0x2E (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(16), S_sx)), x, ao) + ;; A-binary.watsup:365.5-365.51 + prod{x : idx, ao : memarg} {0x2F (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(16), U_sx)), x, ao) + ;; A-binary.watsup:366.5-366.50 + prod{x : idx, ao : memarg} {0x30 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(8), S_sx)), x, ao) + ;; A-binary.watsup:367.5-367.50 + prod{x : idx, ao : memarg} {0x31 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x, ao) + ;; A-binary.watsup:368.5-368.51 + prod{x : idx, ao : memarg} {0x32 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(16), S_sx)), x, ao) + ;; A-binary.watsup:369.5-369.51 + prod{x : idx, ao : memarg} {0x33 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(16), U_sx)), x, ao) + ;; A-binary.watsup:370.5-370.51 + prod{x : idx, ao : memarg} {0x34 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(32), S_sx)), x, ao) + ;; A-binary.watsup:371.5-371.51 + prod{x : idx, ao : memarg} {0x35 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(32), U_sx)), x, ao) ;; A-binary.watsup:372.5-372.42 prod{x : idx, ao : memarg} {0x36 (x, ao):Bmemarg} => STORE_instr(I32_numtype, ?(), x, ao) ;; A-binary.watsup:373.5-373.42 @@ -8005,18 +8015,18 @@ grammar Binstr : instr prod {0xFC `%`_u32(7):Bu32} => CVTOP_instr(I64_numtype, F64_numtype, TRUNC_SAT_cvtop__(U_sx)) ;; A-binary.watsup:598.5-598.50 prod{x : idx, ao : memarg} {0xFD `%`_u32(0):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(), x, ao) - ;; A-binary.watsup:599.5-599.68 - prod{x : idx, ao : memarg} {0xFD `%`_u32(1):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(8), 8, S_sx)), x, ao) - ;; A-binary.watsup:600.5-600.68 - prod{x : idx, ao : memarg} {0xFD `%`_u32(2):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(8), 8, U_sx)), x, ao) - ;; A-binary.watsup:601.5-601.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(3):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(16), 4, S_sx)), x, ao) - ;; A-binary.watsup:602.5-602.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(4):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(16), 4, U_sx)), x, ao) - ;; A-binary.watsup:603.5-603.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(5):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(32), 2, S_sx)), x, ao) - ;; A-binary.watsup:604.5-604.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(6):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(32), 2, U_sx)), x, ao) + ;; A-binary.watsup:599.5-599.70 + prod{x : idx, ao : memarg} {0xFD `%`_u32(1):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(8), 8, S_sx)), x, ao) + ;; A-binary.watsup:600.5-600.70 + prod{x : idx, ao : memarg} {0xFD `%`_u32(2):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(8), 8, U_sx)), x, ao) + ;; A-binary.watsup:601.5-601.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(3):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(16), 4, S_sx)), x, ao) + ;; A-binary.watsup:602.5-602.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(4):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(16), 4, U_sx)), x, ao) + ;; A-binary.watsup:603.5-603.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(5):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(32), 2, S_sx)), x, ao) + ;; A-binary.watsup:604.5-604.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(6):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(32), 2, U_sx)), x, ao) ;; A-binary.watsup:605.5-605.61 prod{x : idx, ao : memarg} {0xFD `%`_u32(7):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(SPLAT_vloadop_(`%`_sz(8))), x, ao) ;; A-binary.watsup:606.5-606.62 diff --git a/spectec/test-latex/TEST.md b/spectec/test-latex/TEST.md index 6e9fd4a390..9859a21a10 100644 --- a/spectec/test-latex/TEST.md +++ b/spectec/test-latex/TEST.md @@ -2392,7 +2392,7 @@ $$ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{min}}(i, j) & = & i & \quad \mbox{if}~ i \leq j \\ -{\mathrm{min}}(i, j) & = & j & \mbox{otherwise} \\ +{\mathrm{min}}(i, j) & = & j & \quad \mbox{otherwise} \\ \end{array} $$ @@ -2453,7 +2453,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {{\mathrm{setminus{\kern-0.1em\scriptstyle 1}}}}_{X}(w, \epsilon) & = & w \\ {{\mathrm{setminus{\kern-0.1em\scriptstyle 1}}}}_{X}(w, w_1~{{w'}^\ast}) & = & \epsilon & \quad \mbox{if}~ w = w_1 \\ -{{\mathrm{setminus{\kern-0.1em\scriptstyle 1}}}}_{X}(w, w_1~{{w'}^\ast}) & = & {{\mathrm{setminus{\kern-0.1em\scriptstyle 1}}}}_{X}(w, {{w'}^\ast}) & \mbox{otherwise} \\ +{{\mathrm{setminus{\kern-0.1em\scriptstyle 1}}}}_{X}(w, w_1~{{w'}^\ast}) & = & {{\mathrm{setminus{\kern-0.1em\scriptstyle 1}}}}_{X}(w, {{w'}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -2562,7 +2562,7 @@ $$ $$ \begin{array}[t]{@{}lrrl@{}l@{}} -\mbox{(vector)} & {v}{N} & ::= & {i}{N} \\ +\mbox{(vector)} & {v}{N} & ::= & {u}{N} \\ & {\mathit{v{\kern-0.1em\scriptstyle 128}}} & ::= & {v}{128} \\ \end{array} $$ @@ -2684,6 +2684,12 @@ $$ \end{array} $$ +$$ +\begin{array}[t]{@{}lcl@{}l@{}} +\mathsf{exnref} & = & (\mathsf{ref}~\mathsf{null}~\mathsf{extern}) \\ +\end{array} +$$ + $$ \begin{array}[t]{@{}lcl@{}l@{}} \mathsf{externref} & = & (\mathsf{ref}~\mathsf{null}~\mathsf{extern}) \\ @@ -2702,6 +2708,12 @@ $$ \end{array} $$ +$$ +\begin{array}[t]{@{}lcl@{}l@{}} +\mathsf{nullexnref} & = & (\mathsf{ref}~\mathsf{null}~\mathsf{noexn}) \\ +\end{array} +$$ + $$ \begin{array}[t]{@{}lcl@{}l@{}} \mathsf{nullexternref} & = & (\mathsf{ref}~\mathsf{null}~\mathsf{noextern}) \\ @@ -3015,14 +3027,14 @@ $$ $$ \begin{array}[t]{@{}lrrl@{}l@{}} -& {{\mathit{half}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}} & ::= & \mathsf{low} ~|~ \mathsf{high} & \quad \mbox{if}~ 2 \cdot N_1 = N_1 \\ -& {{\mathit{half}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{f}}{N}}_2}{\mathsf{x}}{M_2}} & ::= & \mathsf{low} & \quad \mbox{if}~ 2 \cdot N_1 = N_1 = \mathsf{{\scriptstyle 64}} \\ +& {{\mathit{half}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}} & ::= & \mathsf{low} ~|~ \mathsf{high} & \quad \mbox{if}~ 2 \cdot N_1 = N_2 \\ +& {{\mathit{half}}}_{{{{\mathsf{i}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{f}}{N}}_2}{\mathsf{x}}{M_2}} & ::= & \mathsf{low} & \quad \mbox{if}~ 2 \cdot N_1 = N_2 = 64 \\ \end{array} $$ $$ \begin{array}[t]{@{}lrrl@{}l@{}} -& {{\mathit{zero}}}_{{{{\mathsf{f}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}} & ::= & \mathsf{zero} & \quad \mbox{if}~ 2 \cdot N_2 = N_1 = \mathsf{{\scriptstyle 64}} \\ +& {{\mathit{zero}}}_{{{{\mathsf{f}}{N}}_1}{\mathsf{x}}{M_1}, {{{\mathsf{i}}{N}}_2}{\mathsf{x}}{M_2}} & ::= & \mathsf{zero} & \quad \mbox{if}~ 2 \cdot N_2 = N_1 = 64 \\ & {\mathit{vvunop}} & ::= & \mathsf{not} \\ & {\mathit{vvbinop}} & ::= & \mathsf{and} ~|~ \mathsf{andnot} ~|~ \mathsf{or} ~|~ \mathsf{xor} \\ & {\mathit{vvternop}} & ::= & \mathsf{bitselect} \\ @@ -3050,7 +3062,8 @@ $$ & & | & {\mathsf{relaxed\_q{\scriptstyle 15}mulr}}{\mathsf{\_}}{\mathsf{s}} & \quad \mbox{if}~ N = \mathsf{{\scriptstyle 16}} \\ & & | & {\mathsf{min}}{\mathsf{\_}}{{\mathit{sx}}} & \quad \mbox{if}~ N \leq \mathsf{{\scriptstyle 32}} \\ & & | & {\mathsf{max}}{\mathsf{\_}}{{\mathit{sx}}} & \quad \mbox{if}~ N \leq \mathsf{{\scriptstyle 32}} \\ -& {{\mathit{vbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}} & ::= & \mathsf{add} ~|~ \mathsf{sub} ~|~ \mathsf{mul} ~|~ \mathsf{div} ~|~ \mathsf{min} ~|~ \mathsf{max} ~|~ \mathsf{pmin} ~|~ \mathsf{pmax} ~|~ \mathsf{relaxed\_min} ~|~ \mathsf{relaxed\_max} \\ +& {{\mathit{vbinop}}}_{{{\mathsf{f}}{N}}{\mathsf{x}}{M}} & ::= & \mathsf{add} ~|~ \mathsf{sub} ~|~ \mathsf{mul} ~|~ \mathsf{div} ~|~ \mathsf{min} ~|~ \mathsf{max} ~|~ \mathsf{pmin} ~|~ \mathsf{pmax} \\ +& & | & \mathsf{relaxed\_min} ~|~ \mathsf{relaxed\_max} \\ \end{array} $$ @@ -3126,14 +3139,14 @@ $$ $$ \begin{array}[t]{@{}lrrl@{}l@{}} \mbox{(memory argument)} & {\mathit{memarg}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{align}~{\mathit{u{\kern-0.1em\scriptstyle 32}}} \mathsf{offset}~{\mathit{u{\kern-0.1em\scriptstyle 32}}} \} \\ +\mathsf{align}~{\mathit{u{\kern-0.1em\scriptstyle 32}}} , \mathsf{offset}~{\mathit{u{\kern-0.1em\scriptstyle 32}}} \} \\ \end{array} \\ \end{array} $$ $$ \begin{array}[t]{@{}lrrl@{}l@{}} -& {{\mathit{loadop}}}_{{\mathsf{i}}{N}} & ::= & {\mathit{sz}}~{\mathit{sx}} & \quad \mbox{if}~ {\mathit{sz}} < N \\ +& {{\mathit{loadop}}}_{{\mathsf{i}}{N}} & ::= & {{\mathit{sz}}}{\mathsf{\_}}{{\mathit{sx}}} & \quad \mbox{if}~ {\mathit{sz}} < N \\ \end{array} $$ @@ -3318,7 +3331,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{funcs}}(\epsilon) & = & \epsilon \\ {\mathrm{funcs}}((\mathsf{func}~x)~{{\mathit{xx}}^\ast}) & = & x~{\mathrm{funcs}}({{\mathit{xx}}^\ast}) \\ -{\mathrm{funcs}}({\mathit{externidx}}~{{\mathit{xx}}^\ast}) & = & {\mathrm{funcs}}({{\mathit{xx}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{funcs}}({\mathit{externidx}}~{{\mathit{xx}}^\ast}) & = & {\mathrm{funcs}}({{\mathit{xx}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3326,7 +3339,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{globals}}(\epsilon) & = & \epsilon \\ {\mathrm{globals}}((\mathsf{global}~x)~{{\mathit{xx}}^\ast}) & = & x~{\mathrm{globals}}({{\mathit{xx}}^\ast}) \\ -{\mathrm{globals}}({\mathit{externidx}}~{{\mathit{xx}}^\ast}) & = & {\mathrm{globals}}({{\mathit{xx}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{globals}}({\mathit{externidx}}~{{\mathit{xx}}^\ast}) & = & {\mathrm{globals}}({{\mathit{xx}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3334,7 +3347,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{tables}}(\epsilon) & = & \epsilon \\ {\mathrm{tables}}((\mathsf{table}~x)~{{\mathit{xx}}^\ast}) & = & x~{\mathrm{tables}}({{\mathit{xx}}^\ast}) \\ -{\mathrm{tables}}({\mathit{externidx}}~{{\mathit{xx}}^\ast}) & = & {\mathrm{tables}}({{\mathit{xx}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{tables}}({\mathit{externidx}}~{{\mathit{xx}}^\ast}) & = & {\mathrm{tables}}({{\mathit{xx}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3342,7 +3355,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{mems}}(\epsilon) & = & \epsilon \\ {\mathrm{mems}}((\mathsf{mem}~x)~{{\mathit{xx}}^\ast}) & = & x~{\mathrm{mems}}({{\mathit{xx}}^\ast}) \\ -{\mathrm{mems}}({\mathit{externidx}}~{{\mathit{xx}}^\ast}) & = & {\mathrm{mems}}({{\mathit{xx}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{mems}}({\mathit{externidx}}~{{\mathit{xx}}^\ast}) & = & {\mathrm{mems}}({{\mathit{xx}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3350,7 +3363,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{tags}}(\epsilon) & = & \epsilon \\ {\mathrm{tags}}((\mathsf{tag}~x)~{{\mathit{xx}}^\ast}) & = & x~{\mathrm{tags}}({{\mathit{xx}}^\ast}) \\ -{\mathrm{tags}}({\mathit{externidx}}~{{\mathit{xx}}^\ast}) & = & {\mathrm{tags}}({{\mathit{xx}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{tags}}({\mathit{externidx}}~{{\mathit{xx}}^\ast}) & = & {\mathrm{tags}}({{\mathit{xx}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3386,7 +3399,7 @@ $$ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{min}}({\mathit{at}}_1, {\mathit{at}}_2) & = & {\mathit{at}}_1 & \quad \mbox{if}~ {|{\mathit{at}}_1|} \leq {|{\mathit{at}}_2|} \\ -{\mathrm{min}}({\mathit{at}}_1, {\mathit{at}}_2) & = & {\mathit{at}}_2 & \mbox{otherwise} \\ +{\mathrm{min}}({\mathit{at}}_1, {\mathit{at}}_2) & = & {\mathit{at}}_2 & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3407,7 +3420,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{funcs}}(\epsilon) & = & \epsilon \\ {\mathrm{funcs}}((\mathsf{func}~{\mathit{dt}})~{{\mathit{xt}}^\ast}) & = & {\mathit{dt}}~{\mathrm{funcs}}({{\mathit{xt}}^\ast}) \\ -{\mathrm{funcs}}({\mathit{externtype}}~{{\mathit{xt}}^\ast}) & = & {\mathrm{funcs}}({{\mathit{xt}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{funcs}}({\mathit{externtype}}~{{\mathit{xt}}^\ast}) & = & {\mathrm{funcs}}({{\mathit{xt}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3415,7 +3428,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{globals}}(\epsilon) & = & \epsilon \\ {\mathrm{globals}}((\mathsf{global}~{\mathit{gt}})~{{\mathit{xt}}^\ast}) & = & {\mathit{gt}}~{\mathrm{globals}}({{\mathit{xt}}^\ast}) \\ -{\mathrm{globals}}({\mathit{externtype}}~{{\mathit{xt}}^\ast}) & = & {\mathrm{globals}}({{\mathit{xt}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{globals}}({\mathit{externtype}}~{{\mathit{xt}}^\ast}) & = & {\mathrm{globals}}({{\mathit{xt}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3423,7 +3436,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{tables}}(\epsilon) & = & \epsilon \\ {\mathrm{tables}}((\mathsf{table}~{\mathit{tt}})~{{\mathit{xt}}^\ast}) & = & {\mathit{tt}}~{\mathrm{tables}}({{\mathit{xt}}^\ast}) \\ -{\mathrm{tables}}({\mathit{externtype}}~{{\mathit{xt}}^\ast}) & = & {\mathrm{tables}}({{\mathit{xt}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{tables}}({\mathit{externtype}}~{{\mathit{xt}}^\ast}) & = & {\mathrm{tables}}({{\mathit{xt}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3431,7 +3444,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{mems}}(\epsilon) & = & \epsilon \\ {\mathrm{mems}}((\mathsf{mem}~{\mathit{mt}})~{{\mathit{xt}}^\ast}) & = & {\mathit{mt}}~{\mathrm{mems}}({{\mathit{xt}}^\ast}) \\ -{\mathrm{mems}}({\mathit{externtype}}~{{\mathit{xt}}^\ast}) & = & {\mathrm{mems}}({{\mathit{xt}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{mems}}({\mathit{externtype}}~{{\mathit{xt}}^\ast}) & = & {\mathrm{mems}}({{\mathit{xt}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3439,7 +3452,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{tags}}(\epsilon) & = & \epsilon \\ {\mathrm{tags}}((\mathsf{tag}~{\mathit{jt}})~{{\mathit{xt}}^\ast}) & = & {\mathit{jt}}~{\mathrm{tags}}({{\mathit{xt}}^\ast}) \\ -{\mathrm{tags}}({\mathit{externtype}}~{{\mathit{xt}}^\ast}) & = & {\mathrm{tags}}({{\mathit{xt}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{tags}}({\mathit{externtype}}~{{\mathit{xt}}^\ast}) & = & {\mathrm{tags}}({{\mathit{xt}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3451,7 +3464,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {{\mathit{tv}}}{{}[ \epsilon := \epsilon ]} & = & {\mathit{tv}} \\ {{\mathit{tv}}}{{}[ {\mathit{tv}}_1~{{\mathit{tv}'}^\ast} := {\mathit{tu}}_1~{{\mathit{tu}'}^\ast} ]} & = & {\mathit{tu}}_1 & \quad \mbox{if}~ {\mathit{tv}} = {\mathit{tv}}_1 \\ -{{\mathit{tv}}}{{}[ {\mathit{tv}}_1~{{\mathit{tv}'}^\ast} := {\mathit{tu}}_1~{{\mathit{tu}'}^\ast} ]} & = & {{\mathit{tv}}}{{}[ {{\mathit{tv}'}^\ast} := {{\mathit{tu}'}^\ast} ]} & \mbox{otherwise} \\ +{{\mathit{tv}}}{{}[ {\mathit{tv}}_1~{{\mathit{tv}'}^\ast} := {\mathit{tu}}_1~{{\mathit{tu}'}^\ast} ]} & = & {{\mathit{tv}}}{{}[ {{\mathit{tv}'}^\ast} := {{\mathit{tu}'}^\ast} ]} & \quad \mbox{otherwise} \\ \end{array} $$ @@ -3484,7 +3497,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {{\mathit{tv}'}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]} & = & {{\mathit{tv}'}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]} \\ {{\mathit{dt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]} & = & {{\mathit{dt}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]} \\ -{{\mathit{ht}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]} & = & {\mathit{ht}} & \mbox{otherwise} \\ +{{\mathit{ht}}}{{}[ {{\mathit{tv}}^\ast} := {{\mathit{tu}}^\ast} ]} & = & {\mathit{ht}} & \quad \mbox{otherwise} \\ \end{array} $$ @@ -7040,7 +7053,7 @@ C{.}\mathsf{mems}{}[x] = {\mathit{at}}~{\mathit{lim}}~\mathsf{page} \qquad {2^{{\mathit{memarg}}{.}\mathsf{align}}} \leq M / 8 }{ -C \vdash {{\mathsf{i}}{N}{.}\mathsf{load}}{M~{\mathit{sx}}}~x~{\mathit{memarg}} : {\mathit{at}} \rightarrow {\mathsf{i}}{N} +C \vdash {{\mathsf{i}}{N}{.}\mathsf{load}}{{M}{\mathsf{\_}}{{\mathit{sx}}}}~x~{\mathit{memarg}} : {\mathit{at}} \rightarrow {\mathsf{i}}{N} } \, {[\textsc{\scriptsize T{-}load{-}pack}]} \qquad \end{array} @@ -7866,14 +7879,14 @@ $$ $$ \begin{array}[t]{@{}lcl@{}l@{}} {{\mathrm{relaxed}}(i)}{{}[ X_1, X_2 ]} & = & (X_1~X_2){}[i] & \quad \mbox{if}~ {\mathrm{ND}} \\ -{{\mathrm{relaxed}}(i)}{{}[ X_1, X_2 ]} & = & (X_1~X_2){}[0] & \mbox{otherwise} \\ +{{\mathrm{relaxed}}(i)}{{}[ X_1, X_2 ]} & = & (X_1~X_2){}[0] & \quad \mbox{otherwise} \\ \end{array} $$ $$ \begin{array}[t]{@{}lcl@{}l@{}} {{\mathrm{relaxed}}(i)}{{}[ X_1, X_2, X_3, X_4 ]} & = & (X_1~X_2~X_3~X_4){}[i] & \quad \mbox{if}~ {\mathrm{ND}} \\ -{{\mathrm{relaxed}}(i)}{{}[ X_1, X_2, X_3, X_4 ]} & = & (X_1~X_2~X_3~X_4){}[0] & \mbox{otherwise} \\ +{{\mathrm{relaxed}}(i)}{{}[ X_1, X_2, X_3, X_4 ]} & = & (X_1~X_2~X_3~X_4){}[0] & \quad \mbox{otherwise} \\ \end{array} $$ @@ -7943,7 +7956,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {{\mathrm{sat\_u}}}_{N}(i) & = & 0 & \quad \mbox{if}~ i < 0 \\ {{\mathrm{sat\_u}}}_{N}(i) & = & {2^{N}} - 1 & \quad \mbox{if}~ i > {2^{N}} - 1 \\ -{{\mathrm{sat\_u}}}_{N}(i) & = & i & \mbox{otherwise} \\ +{{\mathrm{sat\_u}}}_{N}(i) & = & i & \quad \mbox{otherwise} \\ \end{array} $$ @@ -7951,7 +7964,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {{\mathrm{sat\_s}}}_{N}(i) & = & {-{2^{N - 1}}} & \quad \mbox{if}~ i < {-{2^{N - 1}}} \\ {{\mathrm{sat\_s}}}_{N}(i) & = & {2^{N - 1}} - 1 & \quad \mbox{if}~ i > {2^{N - 1}} - 1 \\ -{{\mathrm{sat\_s}}}_{N}(i) & = & i & \mbox{otherwise} \\ +{{\mathrm{sat\_s}}}_{N}(i) & = & i & \quad \mbox{otherwise} \\ \end{array} $$ @@ -7968,7 +7981,7 @@ $$ $$ \begin{array}[t]{@{}lcl@{}l@{}} {{\mathrm{iabs}}}_{N}(i_1) & = & i_1 & \quad \mbox{if}~ {{\mathrm{signed}}}_{N}(i_1) \geq 0 \\ -{{\mathrm{iabs}}}_{N}(i_1) & = & {{\mathrm{ineg}}}_{N}(i_1) & \mbox{otherwise} \\ +{{\mathrm{iabs}}}_{N}(i_1) & = & {{\mathrm{ineg}}}_{N}(i_1) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -8262,7 +8275,7 @@ $$ $$ \begin{array}[t]{@{}lcl@{}l@{}} {{\mathrm{iswizzle}}_{{\mathit{lane}}}}_{N}({c^\ast}, i) & = & {c^\ast}{}[i] & \quad \mbox{if}~ i < {|{c^\ast}|} \\ -{{\mathrm{iswizzle}}_{{\mathit{lane}}}}_{N}({c^\ast}, i) & = & 0 & \mbox{otherwise} \\ +{{\mathrm{iswizzle}}_{{\mathit{lane}}}}_{N}({c^\ast}, i) & = & 0 & \quad \mbox{otherwise} \\ \end{array} $$ @@ -8270,7 +8283,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {{\mathrm{irelaxed}}_{{\mathit{swizzle}}_{{\mathit{lane}}}}}_{N}({c^\ast}, i) & = & {c^\ast}{}[i] & \quad \mbox{if}~ i < {|{c^\ast}|} \\ {{\mathrm{irelaxed}}_{{\mathit{swizzle}}_{{\mathit{lane}}}}}_{N}({c^\ast}, i) & = & 0 & \quad \mbox{if}~ {{\mathrm{signed}}}_{N}(i) < 0 \\ -{{\mathrm{irelaxed}}_{{\mathit{swizzle}}_{{\mathit{lane}}}}}_{N}({c^\ast}, i) & = & {{\mathrm{relaxed}}({\mathrm{R}}_{\mathit{swizzle}})}{{}[ 0, {c^\ast}{}[i \mathbin{\mathrm{mod}} {|{c^\ast}|}] ]} & \mbox{otherwise} \\ +{{\mathrm{irelaxed}}_{{\mathit{swizzle}}_{{\mathit{lane}}}}}_{N}({c^\ast}, i) & = & {{\mathrm{relaxed}}({\mathrm{R}}_{\mathit{swizzle}})}{{}[ 0, {c^\ast}{}[i \mathbin{\mathrm{mod}} {|{c^\ast}|}] ]} & \quad \mbox{otherwise} \\ \end{array} $$ @@ -8803,28 +8816,28 @@ $$ \mbox{(host function)} & {\mathit{hostfunc}} & ::= & \ldots \\ & {\mathit{code}} & ::= & {\mathit{func}} ~|~ {\mathit{hostfunc}} \\ \mbox{(function instance)} & {\mathit{funcinst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{type}~{\mathit{deftype}} \mathsf{module}~{\mathit{moduleinst}} \mathsf{code}~{\mathit{code}} \} \\ +\mathsf{type}~{\mathit{deftype}} , \mathsf{module}~{\mathit{moduleinst}} , \mathsf{code}~{\mathit{code}} \} \\ \end{array} \\ \mbox{(global instance)} & {\mathit{globalinst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{type}~{\mathit{globaltype}} \mathsf{value}~{\mathit{val}} \} \\ +\mathsf{type}~{\mathit{globaltype}} , \mathsf{value}~{\mathit{val}} \} \\ \end{array} \\ \mbox{(table instance)} & {\mathit{tableinst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{type}~{\mathit{tabletype}} \mathsf{refs}~{{\mathit{ref}}^\ast} \} \\ +\mathsf{type}~{\mathit{tabletype}} , \mathsf{refs}~{{\mathit{ref}}^\ast} \} \\ \end{array} \\ \mbox{(memory instance)} & {\mathit{meminst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{type}~{\mathit{memtype}} \mathsf{bytes}~{{\mathit{byte}}^\ast} \} \\ +\mathsf{type}~{\mathit{memtype}} , \mathsf{bytes}~{{\mathit{byte}}^\ast} \} \\ \end{array} \\ \mbox{(tag instance)} & {\mathit{taginst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} \mathsf{type}~{\mathit{tagtype}} \} \\ \end{array} \\ \mbox{(element instance)} & {\mathit{eleminst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{type}~{\mathit{elemtype}} \mathsf{refs}~{{\mathit{ref}}^\ast} \} \\ +\mathsf{type}~{\mathit{elemtype}} , \mathsf{refs}~{{\mathit{ref}}^\ast} \} \\ \end{array} \\ \mbox{(data instance)} & {\mathit{datainst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} \mathsf{bytes}~{{\mathit{byte}}^\ast} \} \\ \end{array} \\ \mbox{(export instance)} & {\mathit{exportinst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{name}~{\mathit{name}} \mathsf{addr}~{\mathit{externaddr}} \} \\ +\mathsf{name}~{\mathit{name}} , \mathsf{addr}~{\mathit{externaddr}} \} \\ \end{array} \\ \end{array} $$ @@ -8836,13 +8849,13 @@ $$ \mbox{(packed value)} & {\mathit{packval}} & ::= & {\mathit{packtype}}{.}\mathsf{pack}~{i}{N} \\ \mbox{(field value)} & {\mathit{fieldval}} & ::= & {\mathit{val}} ~|~ {\mathit{packval}} \\ \mbox{(structure instance)} & {\mathit{structinst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{type}~{\mathit{deftype}} \mathsf{fields}~{{\mathit{fieldval}}^\ast} \} \\ +\mathsf{type}~{\mathit{deftype}} , \mathsf{fields}~{{\mathit{fieldval}}^\ast} \} \\ \end{array} \\ \mbox{(array instance)} & {\mathit{arrayinst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{type}~{\mathit{deftype}} \mathsf{fields}~{{\mathit{fieldval}}^\ast} \} \\ +\mathsf{type}~{\mathit{deftype}} , \mathsf{fields}~{{\mathit{fieldval}}^\ast} \} \\ \end{array} \\ \mbox{(exception instance)} & {\mathit{exninst}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{tag}~{\mathit{tagaddr}} \mathsf{fields}~{{\mathit{val}}^\ast} \} \\ +\mathsf{tag}~{\mathit{tagaddr}} , \mathsf{fields}~{{\mathit{val}}^\ast} \} \\ \end{array} \\ \end{array} $$ @@ -8882,7 +8895,7 @@ $$ \mathsf{exns}~{{\mathit{exninst}}^\ast} \} \\ \end{array} \\ \mbox{(frame)} & {\mathit{frame}} & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -\mathsf{locals}~{({{\mathit{val}}^?})^\ast} \mathsf{module}~{\mathit{moduleinst}} \} \\ +\mathsf{locals}~{({{\mathit{val}}^?})^\ast} , \mathsf{module}~{\mathit{moduleinst}} \} \\ \end{array} \\ \end{array} $$ @@ -9009,7 +9022,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{funcs}}(\epsilon) & = & \epsilon \\ {\mathrm{funcs}}((\mathsf{func}~a)~{{\mathit{xa}}^\ast}) & = & a~{\mathrm{funcs}}({{\mathit{xa}}^\ast}) \\ -{\mathrm{funcs}}({\mathit{externaddr}}~{{\mathit{xa}}^\ast}) & = & {\mathrm{funcs}}({{\mathit{xa}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{funcs}}({\mathit{externaddr}}~{{\mathit{xa}}^\ast}) & = & {\mathrm{funcs}}({{\mathit{xa}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9017,7 +9030,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{globals}}(\epsilon) & = & \epsilon \\ {\mathrm{globals}}((\mathsf{global}~a)~{{\mathit{xa}}^\ast}) & = & a~{\mathrm{globals}}({{\mathit{xa}}^\ast}) \\ -{\mathrm{globals}}({\mathit{externaddr}}~{{\mathit{xa}}^\ast}) & = & {\mathrm{globals}}({{\mathit{xa}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{globals}}({\mathit{externaddr}}~{{\mathit{xa}}^\ast}) & = & {\mathrm{globals}}({{\mathit{xa}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9025,7 +9038,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{tables}}(\epsilon) & = & \epsilon \\ {\mathrm{tables}}((\mathsf{table}~a)~{{\mathit{xa}}^\ast}) & = & a~{\mathrm{tables}}({{\mathit{xa}}^\ast}) \\ -{\mathrm{tables}}({\mathit{externaddr}}~{{\mathit{xa}}^\ast}) & = & {\mathrm{tables}}({{\mathit{xa}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{tables}}({\mathit{externaddr}}~{{\mathit{xa}}^\ast}) & = & {\mathrm{tables}}({{\mathit{xa}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9033,7 +9046,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{mems}}(\epsilon) & = & \epsilon \\ {\mathrm{mems}}((\mathsf{mem}~a)~{{\mathit{xa}}^\ast}) & = & a~{\mathrm{mems}}({{\mathit{xa}}^\ast}) \\ -{\mathrm{mems}}({\mathit{externaddr}}~{{\mathit{xa}}^\ast}) & = & {\mathrm{mems}}({{\mathit{xa}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{mems}}({\mathit{externaddr}}~{{\mathit{xa}}^\ast}) & = & {\mathrm{mems}}({{\mathit{xa}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9041,7 +9054,7 @@ $$ \begin{array}[t]{@{}lcl@{}l@{}} {\mathrm{tags}}(\epsilon) & = & \epsilon \\ {\mathrm{tags}}((\mathsf{tag}~a)~{{\mathit{xa}}^\ast}) & = & a~{\mathrm{tags}}({{\mathit{xa}}^\ast}) \\ -{\mathrm{tags}}({\mathit{externaddr}}~{{\mathit{xa}}^\ast}) & = & {\mathrm{tags}}({{\mathit{xa}}^\ast}) & \mbox{otherwise} \\ +{\mathrm{tags}}({\mathit{externaddr}}~{{\mathit{xa}}^\ast}) & = & {\mathrm{tags}}({{\mathit{xa}}^\ast}) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9655,7 +9668,7 @@ $$ $$ \begin{array}[t]{@{}lrcl@{}l@{}} {[\textsc{\scriptsize E{-}br\_on\_null{-}null}]} \quad & {\mathit{val}}~(\mathsf{br\_on\_null}~l) & \hookrightarrow & (\mathsf{br}~l) & \quad \mbox{if}~ {\mathit{val}} = \mathsf{ref{.}null}~{\mathit{ht}} \\ -{[\textsc{\scriptsize E{-}br\_on\_null{-}addr}]} \quad & {\mathit{val}}~(\mathsf{br\_on\_null}~l) & \hookrightarrow & {\mathit{val}} & \mbox{otherwise} \\ +{[\textsc{\scriptsize E{-}br\_on\_null{-}addr}]} \quad & {\mathit{val}}~(\mathsf{br\_on\_null}~l) & \hookrightarrow & {\mathit{val}} & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9664,7 +9677,7 @@ $$ $$ \begin{array}[t]{@{}lrcl@{}l@{}} {[\textsc{\scriptsize E{-}br\_on\_non\_null{-}null}]} \quad & {\mathit{val}}~(\mathsf{br\_on\_non\_null}~l) & \hookrightarrow & \epsilon & \quad \mbox{if}~ {\mathit{val}} = \mathsf{ref{.}null}~{\mathit{ht}} \\ -{[\textsc{\scriptsize E{-}br\_on\_non\_null{-}addr}]} \quad & {\mathit{val}}~(\mathsf{br\_on\_non\_null}~l) & \hookrightarrow & {\mathit{val}}~(\mathsf{br}~l) & \mbox{otherwise} \\ +{[\textsc{\scriptsize E{-}br\_on\_non\_null{-}addr}]} \quad & {\mathit{val}}~(\mathsf{br\_on\_non\_null}~l) & \hookrightarrow & {\mathit{val}}~(\mathsf{br}~l) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9678,7 +9691,7 @@ $$ {\land}~ \{ \begin{array}[t]{@{}l@{}} \}\end{array} \vdash {\mathit{rt}} \leq {{\mathrm{inst}}}_{f{.}\mathsf{module}}({\mathit{rt}}_2) \\ \end{array} \\ -{[\textsc{\scriptsize E{-}br\_on\_cast{-}fail}]} \quad & s ; f ; {\mathit{ref}}~(\mathsf{br\_on\_cast}~l~{\mathit{rt}}_1~{\mathit{rt}}_2) & \hookrightarrow & {\mathit{ref}} & \mbox{otherwise} \\ +{[\textsc{\scriptsize E{-}br\_on\_cast{-}fail}]} \quad & s ; f ; {\mathit{ref}}~(\mathsf{br\_on\_cast}~l~{\mathit{rt}}_1~{\mathit{rt}}_2) & \hookrightarrow & {\mathit{ref}} & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9692,7 +9705,7 @@ $$ {\land}~ \{ \begin{array}[t]{@{}l@{}} \}\end{array} \vdash {\mathit{rt}} \leq {{\mathrm{inst}}}_{f{.}\mathsf{module}}({\mathit{rt}}_2) \\ \end{array} \\ -{[\textsc{\scriptsize E{-}br\_on\_cast\_fail{-}fail}]} \quad & s ; f ; {\mathit{ref}}~(\mathsf{br\_on\_cast\_fail}~l~{\mathit{rt}}_1~{\mathit{rt}}_2) & \hookrightarrow & {\mathit{ref}}~(\mathsf{br}~l) & \mbox{otherwise} \\ +{[\textsc{\scriptsize E{-}br\_on\_cast\_fail{-}fail}]} \quad & s ; f ; {\mathit{ref}}~(\mathsf{br\_on\_cast\_fail}~l~{\mathit{rt}}_1~{\mathit{rt}}_2) & \hookrightarrow & {\mathit{ref}}~(\mathsf{br}~l) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9791,7 +9804,7 @@ $$ \end{array} \\ {[\textsc{\scriptsize E{-}throw\_ref{-}handler{-}catch\_all}]} \quad & z ; ({{\mathsf{handler}}_{n}}{\{ (\mathsf{catch\_all}~l)~{{\mathit{catch}'}^\ast} \}}~(\mathsf{ref{.}exn}~a)~\mathsf{throw\_ref}) & \hookrightarrow & (\mathsf{br}~l) \\ {[\textsc{\scriptsize E{-}throw\_ref{-}handler{-}catch\_all\_ref}]} \quad & z ; ({{\mathsf{handler}}_{n}}{\{ (\mathsf{catch\_all\_ref}~l)~{{\mathit{catch}'}^\ast} \}}~(\mathsf{ref{.}exn}~a)~\mathsf{throw\_ref}) & \hookrightarrow & (\mathsf{ref{.}exn}~a)~(\mathsf{br}~l) \\ -{[\textsc{\scriptsize E{-}throw\_ref{-}handler{-}next}]} \quad & z ; ({{\mathsf{handler}}_{n}}{\{ {\mathit{catch}}~{{\mathit{catch}'}^\ast} \}}~(\mathsf{ref{.}exn}~a)~\mathsf{throw\_ref}) & \hookrightarrow & ({{\mathsf{handler}}_{n}}{\{ {{\mathit{catch}'}^\ast} \}}~(\mathsf{ref{.}exn}~a)~\mathsf{throw\_ref}) & \mbox{otherwise} \\ +{[\textsc{\scriptsize E{-}throw\_ref{-}handler{-}next}]} \quad & z ; ({{\mathsf{handler}}_{n}}{\{ {\mathit{catch}}~{{\mathit{catch}'}^\ast} \}}~(\mathsf{ref{.}exn}~a)~\mathsf{throw\_ref}) & \hookrightarrow & ({{\mathsf{handler}}_{n}}{\{ {{\mathit{catch}'}^\ast} \}}~(\mathsf{ref{.}exn}~a)~\mathsf{throw\_ref}) & \quad \mbox{otherwise} \\ {[\textsc{\scriptsize E{-}try\_table}]} \quad & z ; {{\mathit{val}}^{m}}~(\mathsf{try\_table}~{\mathit{bt}}~{{\mathit{catch}}^\ast}~{{\mathit{instr}}^\ast}) & \hookrightarrow & ({{\mathsf{handler}}_{n}}{\{ {{\mathit{catch}}^\ast} \}}~({{\mathsf{label}}_{n}}{\{ \epsilon \}}~{{\mathit{val}}^{m}}~{{\mathit{instr}}^\ast})) & \quad \mbox{if}~ {{\mathrm{blocktype}}}_{z}({\mathit{bt}}) = {t_1^{m}} \rightarrow {t_2^{n}} \\ \end{array} $$ @@ -9870,7 +9883,7 @@ $$ $$ \begin{array}[t]{@{}lrcl@{}l@{}} {[\textsc{\scriptsize E{-}ref.is\_null{-}true}]} \quad & {\mathit{ref}}~\mathsf{ref{.}is\_null} & \hookrightarrow & (\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1) & \quad \mbox{if}~ {\mathit{ref}} = (\mathsf{ref{.}null}~{\mathit{ht}}) \\ -{[\textsc{\scriptsize E{-}ref.is\_null{-}false}]} \quad & {\mathit{ref}}~\mathsf{ref{.}is\_null} & \hookrightarrow & (\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0) & \mbox{otherwise} \\ +{[\textsc{\scriptsize E{-}ref.is\_null{-}false}]} \quad & {\mathit{ref}}~\mathsf{ref{.}is\_null} & \hookrightarrow & (\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9879,7 +9892,7 @@ $$ $$ \begin{array}[t]{@{}lrcl@{}l@{}} {[\textsc{\scriptsize E{-}ref.as\_non\_null{-}null}]} \quad & {\mathit{ref}}~\mathsf{ref{.}as\_non\_null} & \hookrightarrow & \mathsf{trap} & \quad \mbox{if}~ {\mathit{ref}} = (\mathsf{ref{.}null}~{\mathit{ht}}) \\ -{[\textsc{\scriptsize E{-}ref.as\_non\_null{-}addr}]} \quad & {\mathit{ref}}~\mathsf{ref{.}as\_non\_null} & \hookrightarrow & {\mathit{ref}} & \mbox{otherwise} \\ +{[\textsc{\scriptsize E{-}ref.as\_non\_null{-}addr}]} \quad & {\mathit{ref}}~\mathsf{ref{.}as\_non\_null} & \hookrightarrow & {\mathit{ref}} & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9889,7 +9902,7 @@ $$ \begin{array}[t]{@{}lrcl@{}l@{}} {[\textsc{\scriptsize E{-}ref.eq{-}null}]} \quad & {\mathit{ref}}_1~{\mathit{ref}}_2~\mathsf{ref{.}eq} & \hookrightarrow & (\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1) & \quad \mbox{if}~ {\mathit{ref}}_1 = (\mathsf{ref{.}null}~{\mathit{ht}}_1) \land {\mathit{ref}}_2 = (\mathsf{ref{.}null}~{\mathit{ht}}_2) \\ {[\textsc{\scriptsize E{-}ref.eq{-}true}]} \quad & {\mathit{ref}}_1~{\mathit{ref}}_2~\mathsf{ref{.}eq} & \hookrightarrow & (\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~1) & \quad \mbox{otherwise, if}~ {\mathit{ref}}_1 = {\mathit{ref}}_2 \\ -{[\textsc{\scriptsize E{-}ref.eq{-}false}]} \quad & {\mathit{ref}}_1~{\mathit{ref}}_2~\mathsf{ref{.}eq} & \hookrightarrow & (\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0) & \mbox{otherwise} \\ +{[\textsc{\scriptsize E{-}ref.eq{-}false}]} \quad & {\mathit{ref}}_1~{\mathit{ref}}_2~\mathsf{ref{.}eq} & \hookrightarrow & (\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9903,7 +9916,7 @@ $$ {\land}~ \{ \begin{array}[t]{@{}l@{}} \}\end{array} \vdash {\mathit{rt}'} \leq {{\mathrm{inst}}}_{f{.}\mathsf{module}}({\mathit{rt}}) \\ \end{array} \\ -{[\textsc{\scriptsize E{-}ref.test{-}false}]} \quad & s ; f ; {\mathit{ref}}~(\mathsf{ref{.}test}~{\mathit{rt}}) & \hookrightarrow & (\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0) & \mbox{otherwise} \\ +{[\textsc{\scriptsize E{-}ref.test{-}false}]} \quad & s ; f ; {\mathit{ref}}~(\mathsf{ref{.}test}~{\mathit{rt}}) & \hookrightarrow & (\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~0) & \quad \mbox{otherwise} \\ \end{array} $$ @@ -9917,7 +9930,7 @@ $$ {\land}~ \{ \begin{array}[t]{@{}l@{}} \}\end{array} \vdash {\mathit{rt}'} \leq {{\mathrm{inst}}}_{f{.}\mathsf{module}}({\mathit{rt}}) \\ \end{array} \\ -{[\textsc{\scriptsize E{-}ref.cast{-}fail}]} \quad & s ; f ; {\mathit{ref}}~(\mathsf{ref{.}cast}~{\mathit{rt}}) & \hookrightarrow & \mathsf{trap} & \mbox{otherwise} \\ +{[\textsc{\scriptsize E{-}ref.cast{-}fail}]} \quad & s ; f ; {\mathit{ref}}~(\mathsf{ref{.}cast}~{\mathit{rt}}) & \hookrightarrow & \mathsf{trap} & \quad \mbox{otherwise} \\ \end{array} $$ @@ -10085,7 +10098,7 @@ $$ & \multicolumn{4}{@{}l@{}}{\quad \begin{array}[t]{@{}l@{}l@{}} \begin{array}[t]{@{}l@{}} (\mathsf{ref{.}array}~a)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)~{\mathit{val}}~(\mathsf{array{.}set}~x) \\ - (\mathsf{ref{.}array}~a)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)~{\mathit{val}}~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)~(\mathsf{array{.}fill}~x) \end{array} & \mbox{otherwise} \\ + (\mathsf{ref{.}array}~a)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + 1)~{\mathit{val}}~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)~(\mathsf{array{.}fill}~x) \end{array} & \quad \mbox{otherwise} \\ \end{array} } \\ {[\textsc{\scriptsize E{-}array.copy{-}null1}]} \quad & z ; (\mathsf{ref{.}null}~{\mathit{ht}}_1)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_1)~{\mathit{ref}}~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i_2)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n)~(\mathsf{array{.}copy}~x_1~x_2) & \hookrightarrow & \mathsf{trap} \\ @@ -10490,7 +10503,7 @@ $$ & \multicolumn{4}{@{}l@{}}{\quad \begin{array}[t]{@{}l@{}l@{}} \begin{array}[t]{@{}l@{}} ({\mathit{at}}{.}\mathsf{const}~i)~{\mathit{val}}~(\mathsf{table{.}set}~x) \\ - ({\mathit{at}}{.}\mathsf{const}~i + 1)~{\mathit{val}}~({\mathit{at}}{.}\mathsf{const}~n - 1)~(\mathsf{table{.}fill}~x) \end{array} & \mbox{otherwise} \\ + ({\mathit{at}}{.}\mathsf{const}~i + 1)~{\mathit{val}}~({\mathit{at}}{.}\mathsf{const}~n - 1)~(\mathsf{table{.}fill}~x) \end{array} & \quad \mbox{otherwise} \\ \end{array} } \\ \end{array} @@ -10516,7 +10529,7 @@ $$ & \multicolumn{4}{@{}l@{}}{\quad \begin{array}[t]{@{}l@{}l@{}} \begin{array}[t]{@{}l@{}} ({\mathit{at}}_1{.}\mathsf{const}~i_1 + n - 1)~({\mathit{at}}_2{.}\mathsf{const}~i_2 + n - 1)~(\mathsf{table{.}get}~x_2)~(\mathsf{table{.}set}~x_1) \\ - ({\mathit{at}}_1{.}\mathsf{const}~i_1)~({\mathit{at}}_2{.}\mathsf{const}~i_2)~({\mathit{at}'}{.}\mathsf{const}~n - 1)~(\mathsf{table{.}copy}~x_1~x_2) \end{array} & \mbox{otherwise} \\ + ({\mathit{at}}_1{.}\mathsf{const}~i_1)~({\mathit{at}}_2{.}\mathsf{const}~i_2)~({\mathit{at}'}{.}\mathsf{const}~n - 1)~(\mathsf{table{.}copy}~x_1~x_2) \end{array} & \quad \mbox{otherwise} \\ \end{array} } \\ \end{array} @@ -10535,7 +10548,7 @@ $$ & \multicolumn{4}{@{}l@{}}{\quad \begin{array}[t]{@{}l@{}l@{}} \begin{array}[t]{@{}l@{}} ({\mathit{at}}{.}\mathsf{const}~i)~z{.}\mathsf{elems}{}[y]{.}\mathsf{refs}{}[j]~(\mathsf{table{.}set}~x) \\ - ({\mathit{at}}{.}\mathsf{const}~i + 1)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)~(\mathsf{table{.}init}~x~y) \end{array} & \mbox{otherwise} \\ + ({\mathit{at}}{.}\mathsf{const}~i + 1)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)~(\mathsf{table{.}init}~x~y) \end{array} & \quad \mbox{otherwise} \\ \end{array} } \\ \end{array} @@ -10561,11 +10574,11 @@ $$ &&& \multicolumn{2}{@{}l@{}}{\quad \quad \mbox{if}~ {{\mathrm{bytes}}}_{{\mathit{nt}}}(c) = z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : {|{\mathit{nt}}|} / 8] } \\ -{[\textsc{\scriptsize E{-}load{-}pack{-}oob}]} \quad & z ; ({\mathit{at}}{.}\mathsf{const}~i)~({{\mathsf{i}}{N}{.}\mathsf{load}}{n~{\mathit{sx}}}~x~{\mathit{ao}}) & \hookrightarrow & \mathsf{trap} & \\ +{[\textsc{\scriptsize E{-}load{-}pack{-}oob}]} \quad & z ; ({\mathit{at}}{.}\mathsf{const}~i)~({{\mathsf{i}}{N}{.}\mathsf{load}}{{n}{\mathsf{\_}}{{\mathit{sx}}}}~x~{\mathit{ao}}) & \hookrightarrow & \mathsf{trap} & \\ &&& \multicolumn{2}{@{}l@{}}{\quad \quad \mbox{if}~ i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|} } \\ -{[\textsc{\scriptsize E{-}load{-}pack{-}val}]} \quad & z ; ({\mathit{at}}{.}\mathsf{const}~i)~({{\mathsf{i}}{N}{.}\mathsf{load}}{n~{\mathit{sx}}}~x~{\mathit{ao}}) & \hookrightarrow & ({\mathsf{i}}{N}{.}\mathsf{const}~{{{{\mathrm{extend}}}_{n, {|{\mathsf{i}}{N}|}}^{{\mathit{sx}}}}}{(c)}) & \\ +{[\textsc{\scriptsize E{-}load{-}pack{-}val}]} \quad & z ; ({\mathit{at}}{.}\mathsf{const}~i)~({{\mathsf{i}}{N}{.}\mathsf{load}}{{n}{\mathsf{\_}}{{\mathit{sx}}}}~x~{\mathit{ao}}) & \hookrightarrow & ({\mathsf{i}}{N}{.}\mathsf{const}~{{{{\mathrm{extend}}}_{n, {|{\mathsf{i}}{N}|}}^{{\mathit{sx}}}}}{(c)}) & \\ &&& \multicolumn{2}{@{}l@{}}{\quad \quad \mbox{if}~ {{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c) = z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8] } \\ @@ -10715,7 +10728,7 @@ $$ & \multicolumn{4}{@{}l@{}}{\quad \begin{array}[t]{@{}l@{}l@{}} \begin{array}[t]{@{}l@{}} ({\mathit{at}}{.}\mathsf{const}~i)~{\mathit{val}}~({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x) \\ - ({\mathit{at}}{.}\mathsf{const}~i + 1)~{\mathit{val}}~({\mathit{at}}{.}\mathsf{const}~n - 1)~(\mathsf{memory{.}fill}~x) \end{array} & \mbox{otherwise} \\ + ({\mathit{at}}{.}\mathsf{const}~i + 1)~{\mathit{val}}~({\mathit{at}}{.}\mathsf{const}~n - 1)~(\mathsf{memory{.}fill}~x) \end{array} & \quad \mbox{otherwise} \\ \end{array} } \\ \end{array} @@ -10733,15 +10746,15 @@ $$ {[\textsc{\scriptsize E{-}memory.copy{-}le}]} \quad & z ; ({\mathit{at}}_1{.}\mathsf{const}~i_1)~({\mathit{at}}_2{.}\mathsf{const}~i_2)~({\mathit{at}'}{.}\mathsf{const}~n)~(\mathsf{memory{.}copy}~x_1~x_2) & \hookrightarrow & & \\ & \multicolumn{4}{@{}l@{}}{\quad \begin{array}[t]{@{}l@{}l@{}} -\begin{array}[t]{@{}l@{}} ({\mathit{at}}_1{.}\mathsf{const}~i_1)~({\mathit{at}}_2{.}\mathsf{const}~i_2)~({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}}~x_2)~({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1) \\ +\begin{array}[t]{@{}l@{}} ({\mathit{at}}_1{.}\mathsf{const}~i_1)~({\mathit{at}}_2{.}\mathsf{const}~i_2)~({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}}~x_2)~({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1) \\ ({\mathit{at}}_1{.}\mathsf{const}~i_1 + 1)~({\mathit{at}}_2{.}\mathsf{const}~i_2 + 1)~({\mathit{at}'}{.}\mathsf{const}~n - 1)~(\mathsf{memory{.}copy}~x_1~x_2) \end{array} & \quad \mbox{otherwise, if}~ i_1 \leq i_2 \\ \end{array} } \\ {[\textsc{\scriptsize E{-}memory.copy{-}gt}]} \quad & z ; ({\mathit{at}}_1{.}\mathsf{const}~i_1)~({\mathit{at}}_2{.}\mathsf{const}~i_2)~({\mathit{at}'}{.}\mathsf{const}~n)~(\mathsf{memory{.}copy}~x_1~x_2) & \hookrightarrow & & \\ & \multicolumn{4}{@{}l@{}}{\quad \begin{array}[t]{@{}l@{}l@{}} -\begin{array}[t]{@{}l@{}} ({\mathit{at}}_1{.}\mathsf{const}~i_1 + n - 1)~({\mathit{at}}_2{.}\mathsf{const}~i_2 + n - 1)~({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}}~x_2)~({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1) \\ - ({\mathit{at}}_1{.}\mathsf{const}~i_1)~({\mathit{at}}_2{.}\mathsf{const}~i_2)~({\mathit{at}'}{.}\mathsf{const}~n - 1)~(\mathsf{memory{.}copy}~x_1~x_2) \end{array} & \mbox{otherwise} \\ +\begin{array}[t]{@{}l@{}} ({\mathit{at}}_1{.}\mathsf{const}~i_1 + n - 1)~({\mathit{at}}_2{.}\mathsf{const}~i_2 + n - 1)~({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}}~x_2)~({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1) \\ + ({\mathit{at}}_1{.}\mathsf{const}~i_1)~({\mathit{at}}_2{.}\mathsf{const}~i_2)~({\mathit{at}'}{.}\mathsf{const}~n - 1)~(\mathsf{memory{.}copy}~x_1~x_2) \end{array} & \quad \mbox{otherwise} \\ \end{array} } \\ \end{array} @@ -10760,7 +10773,7 @@ $$ & \multicolumn{4}{@{}l@{}}{\quad \begin{array}[t]{@{}l@{}l@{}} \begin{array}[t]{@{}l@{}} ({\mathit{at}}{.}\mathsf{const}~i)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~z{.}\mathsf{datas}{}[y]{.}\mathsf{bytes}{}[j])~({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x) \\ - ({\mathit{at}}{.}\mathsf{const}~i + 1)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)~(\mathsf{memory{.}init}~x~y) \end{array} & \mbox{otherwise} \\ + ({\mathit{at}}{.}\mathsf{const}~i + 1)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~j + 1)~(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~n - 1)~(\mathsf{memory{.}init}~x~y) \end{array} & \quad \mbox{otherwise} \\ \end{array} } \\ \end{array} @@ -11479,16 +11492,16 @@ $$ & & | & \mathtt{0x29}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & \mathsf{i{\scriptstyle 64}}{.}\mathsf{load}~x~{\mathit{ao}} \\ & & | & \mathtt{0x2A}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & \mathsf{f{\scriptstyle 32}}{.}\mathsf{load}~x~{\mathit{ao}} \\ & & | & \mathtt{0x2B}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & \mathsf{f{\scriptstyle 64}}{.}\mathsf{load}~x~{\mathit{ao}} \\ -& & | & \mathtt{0x2C}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{\mathsf{{\scriptstyle 8}}~\mathsf{s}}~x~{\mathit{ao}} \\ -& & | & \mathtt{0x2D}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{\mathsf{{\scriptstyle 8}}~\mathsf{u}}~x~{\mathit{ao}} \\ -& & | & \mathtt{0x2E}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{\mathsf{{\scriptstyle 16}}~\mathsf{s}}~x~{\mathit{ao}} \\ -& & | & \mathtt{0x2F}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{\mathsf{{\scriptstyle 16}}~\mathsf{u}}~x~{\mathit{ao}} \\ -& & | & \mathtt{0x30}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{\mathsf{{\scriptstyle 8}}~\mathsf{s}}~x~{\mathit{ao}} \\ -& & | & \mathtt{0x31}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{\mathsf{{\scriptstyle 8}}~\mathsf{u}}~x~{\mathit{ao}} \\ -& & | & \mathtt{0x32}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{\mathsf{{\scriptstyle 16}}~\mathsf{s}}~x~{\mathit{ao}} \\ -& & | & \mathtt{0x33}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{\mathsf{{\scriptstyle 16}}~\mathsf{u}}~x~{\mathit{ao}} \\ -& & | & \mathtt{0x34}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{\mathsf{{\scriptstyle 32}}~\mathsf{s}}~x~{\mathit{ao}} \\ -& & | & \mathtt{0x35}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{\mathsf{{\scriptstyle 32}}~\mathsf{u}}~x~{\mathit{ao}} \\ +& & | & \mathtt{0x2C}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{\mathsf{{\scriptstyle 8}}}{\mathsf{\_}}{\mathsf{s}}}~x~{\mathit{ao}} \\ +& & | & \mathtt{0x2D}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{\mathsf{{\scriptstyle 8}}}{\mathsf{\_}}{\mathsf{u}}}~x~{\mathit{ao}} \\ +& & | & \mathtt{0x2E}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{\mathsf{{\scriptstyle 16}}}{\mathsf{\_}}{\mathsf{s}}}~x~{\mathit{ao}} \\ +& & | & \mathtt{0x2F}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{\mathsf{{\scriptstyle 16}}}{\mathsf{\_}}{\mathsf{u}}}~x~{\mathit{ao}} \\ +& & | & \mathtt{0x30}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{{\mathsf{{\scriptstyle 8}}}{\mathsf{\_}}{\mathsf{s}}}~x~{\mathit{ao}} \\ +& & | & \mathtt{0x31}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{{\mathsf{{\scriptstyle 8}}}{\mathsf{\_}}{\mathsf{u}}}~x~{\mathit{ao}} \\ +& & | & \mathtt{0x32}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{{\mathsf{{\scriptstyle 16}}}{\mathsf{\_}}{\mathsf{s}}}~x~{\mathit{ao}} \\ +& & | & \mathtt{0x33}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{{\mathsf{{\scriptstyle 16}}}{\mathsf{\_}}{\mathsf{u}}}~x~{\mathit{ao}} \\ +& & | & \mathtt{0x34}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{{\mathsf{{\scriptstyle 32}}}{\mathsf{\_}}{\mathsf{s}}}~x~{\mathit{ao}} \\ +& & | & \mathtt{0x35}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & {\mathsf{i{\scriptstyle 64}}{.}\mathsf{load}}{{\mathsf{{\scriptstyle 32}}}{\mathsf{\_}}{\mathsf{u}}}~x~{\mathit{ao}} \\ & & | & \mathtt{0x36}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & \mathsf{i{\scriptstyle 32}}{.}\mathsf{store}~x~{\mathit{ao}} \\ & & | & \mathtt{0x37}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & \mathsf{i{\scriptstyle 64}}{.}\mathsf{store}~x~{\mathit{ao}} \\ & & | & \mathtt{0x38}~~(x, {\mathit{ao}}){:}{\mathtt{memarg}} & \quad\Rightarrow\quad{} & \mathsf{f{\scriptstyle 32}}{.}\mathsf{store}~x~{\mathit{ao}} \\ @@ -12201,7 +12214,7 @@ $$ & {\mathit{sym}} & ::= & A_1 ~|~ A_2 \\ & & ::= & () \\ & r & ::= & \{ \begin{array}[t]{@{}l@{}l@{}} -{\mathsf{field}}_{1}~A_1 {\mathsf{field}}_{2}~A_2 \ldots~ \} \\ +{\mathsf{field}}_{1}~A_1 , {\mathsf{field}}_{2}~A_2 , \ldots~ \} \\ \end{array} \\ & {\mathit{pth}} & ::= & {({}[ i ]~\mid~{.}\mathsf{field})^{+}} \\ \end{array} diff --git a/spectec/test-middlend/TEST.md b/spectec/test-middlend/TEST.md index a37c19b3d6..3ad497e229 100644 --- a/spectec/test-middlend/TEST.md +++ b/spectec/test-middlend/TEST.md @@ -273,7 +273,7 @@ def $canon_(N : N) : nat def $canon_{N : N}(N) = (2 ^ ((($signif(N) : nat <:> int) - (1 : nat <:> int)) : int <:> nat)) ;; 1-syntax.watsup -syntax vN{N : N}(N) = iN(N) +syntax vN{N : N}(N) = uN(N) ;; 1-syntax.watsup syntax v128 = vN(128) @@ -464,7 +464,7 @@ syntax valtype = | REF{nul : nul, heaptype : heaptype}(nul : nul, heaptype : heaptype) | BOT -;; 1-syntax.watsup:221.1-221.66 +;; 1-syntax.watsup:225.1-225.66 syntax storagetype = | BOT | I32 @@ -476,34 +476,34 @@ syntax storagetype = | I8 | I16 -;; 1-syntax.watsup:230.1-231.16 +;; 1-syntax.watsup:234.1-235.16 syntax resulttype = list(syntax valtype) -;; 1-syntax.watsup:243.1-243.60 +;; 1-syntax.watsup:247.1-247.60 syntax fieldtype = | `%%`{mut : mut, storagetype : storagetype}(mut : mut, storagetype : storagetype) -;; 1-syntax.watsup:245.1-245.90 +;; 1-syntax.watsup:249.1-249.90 syntax functype = | `%->%`{resulttype : resulttype}(resulttype : resulttype, resulttype) -;; 1-syntax.watsup:246.1-246.64 +;; 1-syntax.watsup:250.1-250.64 syntax structtype = list(syntax fieldtype) -;; 1-syntax.watsup:247.1-247.54 +;; 1-syntax.watsup:251.1-251.54 syntax arraytype = fieldtype -;; 1-syntax.watsup:249.1-252.18 +;; 1-syntax.watsup:253.1-256.18 syntax comptype = | STRUCT{structtype : structtype}(structtype : structtype) | ARRAY{arraytype : arraytype}(arraytype : arraytype) | FUNC{functype : functype}(functype : functype) -;; 1-syntax.watsup:254.1-255.30 +;; 1-syntax.watsup:258.1-259.30 syntax subtype = | SUB{fin : fin, `typeuse*` : typeuse*, comptype : comptype}(fin : fin, typeuse*{typeuse <- `typeuse*`} : typeuse*, comptype : comptype) -;; 1-syntax.watsup:257.1-258.22 +;; 1-syntax.watsup:261.1-262.22 syntax rectype = | REC{list : list(syntax subtype)}(list : list(syntax subtype)) } @@ -573,6 +573,11 @@ def $FUNCREF : reftype ;; 1-syntax.watsup def $FUNCREF = REF_reftype(?(NULL_NULL), FUNC_heaptype) +;; 1-syntax.watsup +def $EXNREF : reftype + ;; 1-syntax.watsup + def $EXNREF = REF_reftype(?(NULL_NULL), EXTERN_heaptype) + ;; 1-syntax.watsup def $EXTERNREF : reftype ;; 1-syntax.watsup @@ -588,6 +593,11 @@ def $NULLFUNCREF : reftype ;; 1-syntax.watsup def $NULLFUNCREF = REF_reftype(?(NULL_NULL), NOFUNC_heaptype) +;; 1-syntax.watsup +def $NULLEXNREF : reftype + ;; 1-syntax.watsup + def $NULLEXNREF = REF_reftype(?(NULL_NULL), NOEXN_heaptype) + ;; 1-syntax.watsup def $NULLEXTERNREF : reftype ;; 1-syntax.watsup @@ -991,13 +1001,13 @@ syntax half__(shape_1 : shape, shape_2 : shape) syntax half__{Jnn_1 : Jnn, M_1 : M, Jnn_2 : Jnn, M_2 : M}(`%X%`_shape((Jnn_1 : Jnn <: lanetype), `%`_dim(M_1)), `%X%`_shape((Jnn_2 : Jnn <: lanetype), `%`_dim(M_2))) = | LOW | HIGH - -- if ((2 * $lsizenn1((Jnn_1 : Jnn <: lanetype))) = $lsizenn1((Jnn_2 : Jnn <: lanetype))) + -- if ((2 * $lsizenn1((Jnn_1 : Jnn <: lanetype))) = $lsizenn2((Jnn_2 : Jnn <: lanetype))) ;; 1-syntax.watsup syntax half__{Lnn_1 : Lnn, M_1 : M, Fnn_2 : Fnn, M_2 : M}(`%X%`_shape(Lnn_1, `%`_dim(M_1)), `%X%`_shape((Fnn_2 : Fnn <: lanetype), `%`_dim(M_2))) = | LOW - -- if (((2 * $lsizenn1(Lnn_1)) = $sizenn1((Fnn_2 : Fnn <: numtype))) /\ ($sizenn1((Fnn_2 : Fnn <: numtype)) = 64)) + -- if (((2 * $lsizenn1(Lnn_1)) = $sizenn2((Fnn_2 : Fnn <: numtype))) /\ ($sizenn2((Fnn_2 : Fnn <: numtype)) = 64)) ;; 1-syntax.watsup @@ -1194,7 +1204,7 @@ syntax memarg = ;; 1-syntax.watsup syntax loadop_{Inn : Inn}((Inn : Inn <: numtype)) = - | `%%`{sz : sz, sx : sx}(sz : sz, sx : sx) + | `%_%`{sz : sz, sx : sx}(sz : sz, sx : sx) -- if (sz!`%`_sz.0 < $sizenn((Inn : Inn <: numtype))) ;; 1-syntax.watsup @@ -1204,7 +1214,7 @@ syntax storeop_{Inn : Inn}((Inn : Inn <: numtype)) = ;; 1-syntax.watsup syntax vloadop_{vectype : vectype}(vectype) = - | `SHAPE%X%%`{sz : sz, M : M, sx : sx}(sz : sz, M : M, sx : sx) + | `SHAPE%X%_%`{sz : sz, M : M, sx : sx}(sz : sz, M : M, sx : sx) -- if (((sz!`%`_sz.0 * M) : nat <:> rat) = (($vsize(vectype) : nat <:> rat) / (2 : nat <:> rat))) | SPLAT{sz : sz}(sz : sz) | ZERO{sz : sz}(sz : sz) @@ -3782,7 +3792,7 @@ relation Instr_ok: `%|-%:%`(context, instr, instrtype) ;; 3-typing.watsup:1089.1-1092.35 rule `load-pack`{C : context, Inn : Inn, M : M, sx : sx, x : idx, memarg : memarg, at : addrtype, lim : limits}: - `%|-%:%`(C, LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(M), sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([(Inn : Inn <: valtype)]))) + `%|-%:%`(C, LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(M), sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([(Inn : Inn <: valtype)]))) -- if (C.MEMS_context[x!`%`_idx.0] = `%%PAGE`_memtype(at, lim)) -- if (((2 ^ memarg.ALIGN_memarg!`%`_u32.0) : nat <:> rat) <= ((M : nat <:> rat) / (8 : nat <:> rat))) @@ -3806,7 +3816,7 @@ relation Instr_ok: `%|-%:%`(context, instr, instrtype) ;; 3-typing.watsup:1118.1-1121.39 rule `vload-pack`{C : context, M : M, N : N, sx : sx, x : idx, memarg : memarg, at : addrtype, lim : limits}: - `%|-%:%`(C, VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), N, sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([V128_valtype]))) + `%|-%:%`(C, VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), N, sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([V128_valtype]))) -- if (C.MEMS_context[x!`%`_idx.0] = `%%PAGE`_memtype(at, lim)) -- if (((2 ^ memarg.ALIGN_memarg!`%`_u32.0) : nat <:> rat) <= (((M : nat <:> rat) / (8 : nat <:> rat)) * (N : nat <:> rat))) @@ -6575,12 +6585,12 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `load-pack-oob`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), Inn : Inn, n : n, sx : sx, x : idx, ao : memarg}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(n), sx)), x, ao)]), [TRAP_instr]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(n), sx)), x, ao)]), [TRAP_instr]) -- if (((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + (((n : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) > |$mem(z, x).BYTES_meminst|) ;; 8-reduction.watsup rule `load-pack-val`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), Inn : Inn, n : n, sx : sx, x : idx, ao : memarg, c : iN(n)}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(n), sx)), x, ao)]), [CONST_instr((Inn : Inn <: numtype), $extend__(n, $size((Inn : Inn <: numtype)), sx, c))]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(n), sx)), x, ao)]), [CONST_instr((Inn : Inn <: numtype), $extend__(n, $size((Inn : Inn <: numtype)), sx, c))]) -- if ($ibytes_(n, c) = $mem(z, x).BYTES_meminst[(i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) : (((n : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)]) ;; 8-reduction.watsup @@ -6595,12 +6605,12 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `vload-pack-oob`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), M : M, K : K, sx : sx, x : idx, ao : memarg}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [TRAP_instr]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [TRAP_instr]) -- if (((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + ((((M * K) : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) > |$mem(z, x).BYTES_meminst|) ;; 8-reduction.watsup rule `vload-pack-val`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), M : M, K : K, sx : sx, x : idx, ao : memarg, c : vec_(V128_Vnn), `j*` : iN(M)*, `k*` : nat*, Jnn : Jnn}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [VCONST_instr(V128_vectype, c)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [VCONST_instr(V128_vectype, c)]) -- (if ($ibytes_(M, j) = $mem(z, x).BYTES_meminst[((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + ((((k * M) : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) : (((M : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)]))^(k<K){j <- `j*`, k <- `k*`} -- if ((c = $invlanes_(`%X%`_shape((Jnn : Jnn <: lanetype), `%`_dim(K)), $extend__(M, $lsizenn((Jnn : Jnn <: lanetype)), sx, j)^K{j <- `j*`})) /\ ($lsizenn((Jnn : Jnn <: lanetype)) = (M * 2))) @@ -6676,13 +6686,13 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `memory.copy-le`{z : state, at_1 : addrtype, i_1 : num_((at_1 : addrtype <: numtype)), at_2 : addrtype, i_2 : num_((at_2 : addrtype <: numtype)), at' : addrtype, n : n, x_1 : idx, x_2 : idx}: - `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), `%`_num_((i_1!`%`_num_.0 + 1))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_((i_2!`%`_num_.0 + 1))) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), `%`_num_((i_1!`%`_num_.0 + 1))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_((i_2!`%`_num_.0 + 1))) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) -- otherwise -- if (i_1!`%`_num_.0 <= i_2!`%`_num_.0) ;; 8-reduction.watsup rule `memory.copy-gt`{z : state, at_1 : addrtype, i_1 : num_((at_1 : addrtype <: numtype)), at_2 : addrtype, i_2 : num_((at_2 : addrtype <: numtype)), at' : addrtype, n : n, x_1 : idx, x_2 : idx}: - `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), `%`_num_(((((i_1!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_(((((i_2!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), `%`_num_(((((i_1!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_(((((i_2!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) -- otherwise ;; 8-reduction.watsup @@ -7663,26 +7673,26 @@ grammar Binstr : instr prod{x : idx, ao : memarg} {0x2A (x, ao):Bmemarg} => LOAD_instr(F32_numtype, ?(), x, ao) ;; A-binary.watsup:361.5-361.41 prod{x : idx, ao : memarg} {0x2B (x, ao):Bmemarg} => LOAD_instr(F64_numtype, ?(), x, ao) - ;; A-binary.watsup:362.5-362.48 - prod{x : idx, ao : memarg} {0x2C (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), S_sx)), x, ao) - ;; A-binary.watsup:363.5-363.48 - prod{x : idx, ao : memarg} {0x2D (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x, ao) - ;; A-binary.watsup:364.5-364.49 - prod{x : idx, ao : memarg} {0x2E (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(16), S_sx)), x, ao) - ;; A-binary.watsup:365.5-365.49 - prod{x : idx, ao : memarg} {0x2F (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(16), U_sx)), x, ao) - ;; A-binary.watsup:366.5-366.48 - prod{x : idx, ao : memarg} {0x30 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(8), S_sx)), x, ao) - ;; A-binary.watsup:367.5-367.48 - prod{x : idx, ao : memarg} {0x31 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x, ao) - ;; A-binary.watsup:368.5-368.49 - prod{x : idx, ao : memarg} {0x32 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(16), S_sx)), x, ao) - ;; A-binary.watsup:369.5-369.49 - prod{x : idx, ao : memarg} {0x33 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(16), U_sx)), x, ao) - ;; A-binary.watsup:370.5-370.49 - prod{x : idx, ao : memarg} {0x34 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(32), S_sx)), x, ao) - ;; A-binary.watsup:371.5-371.49 - prod{x : idx, ao : memarg} {0x35 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(32), U_sx)), x, ao) + ;; A-binary.watsup:362.5-362.50 + prod{x : idx, ao : memarg} {0x2C (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), S_sx)), x, ao) + ;; A-binary.watsup:363.5-363.50 + prod{x : idx, ao : memarg} {0x2D (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x, ao) + ;; A-binary.watsup:364.5-364.51 + prod{x : idx, ao : memarg} {0x2E (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(16), S_sx)), x, ao) + ;; A-binary.watsup:365.5-365.51 + prod{x : idx, ao : memarg} {0x2F (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(16), U_sx)), x, ao) + ;; A-binary.watsup:366.5-366.50 + prod{x : idx, ao : memarg} {0x30 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(8), S_sx)), x, ao) + ;; A-binary.watsup:367.5-367.50 + prod{x : idx, ao : memarg} {0x31 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x, ao) + ;; A-binary.watsup:368.5-368.51 + prod{x : idx, ao : memarg} {0x32 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(16), S_sx)), x, ao) + ;; A-binary.watsup:369.5-369.51 + prod{x : idx, ao : memarg} {0x33 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(16), U_sx)), x, ao) + ;; A-binary.watsup:370.5-370.51 + prod{x : idx, ao : memarg} {0x34 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(32), S_sx)), x, ao) + ;; A-binary.watsup:371.5-371.51 + prod{x : idx, ao : memarg} {0x35 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(32), U_sx)), x, ao) ;; A-binary.watsup:372.5-372.42 prod{x : idx, ao : memarg} {0x36 (x, ao):Bmemarg} => STORE_instr(I32_numtype, ?(), x, ao) ;; A-binary.watsup:373.5-373.42 @@ -7995,18 +8005,18 @@ grammar Binstr : instr prod {0xFC `%`_u32(7):Bu32} => CVTOP_instr(I64_numtype, F64_numtype, TRUNC_SAT_cvtop__(U_sx)) ;; A-binary.watsup:598.5-598.50 prod{x : idx, ao : memarg} {0xFD `%`_u32(0):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(), x, ao) - ;; A-binary.watsup:599.5-599.68 - prod{x : idx, ao : memarg} {0xFD `%`_u32(1):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(8), 8, S_sx)), x, ao) - ;; A-binary.watsup:600.5-600.68 - prod{x : idx, ao : memarg} {0xFD `%`_u32(2):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(8), 8, U_sx)), x, ao) - ;; A-binary.watsup:601.5-601.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(3):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(16), 4, S_sx)), x, ao) - ;; A-binary.watsup:602.5-602.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(4):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(16), 4, U_sx)), x, ao) - ;; A-binary.watsup:603.5-603.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(5):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(32), 2, S_sx)), x, ao) - ;; A-binary.watsup:604.5-604.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(6):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(32), 2, U_sx)), x, ao) + ;; A-binary.watsup:599.5-599.70 + prod{x : idx, ao : memarg} {0xFD `%`_u32(1):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(8), 8, S_sx)), x, ao) + ;; A-binary.watsup:600.5-600.70 + prod{x : idx, ao : memarg} {0xFD `%`_u32(2):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(8), 8, U_sx)), x, ao) + ;; A-binary.watsup:601.5-601.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(3):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(16), 4, S_sx)), x, ao) + ;; A-binary.watsup:602.5-602.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(4):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(16), 4, U_sx)), x, ao) + ;; A-binary.watsup:603.5-603.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(5):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(32), 2, S_sx)), x, ao) + ;; A-binary.watsup:604.5-604.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(6):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(32), 2, U_sx)), x, ao) ;; A-binary.watsup:605.5-605.61 prod{x : idx, ao : memarg} {0xFD `%`_u32(7):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(SPLAT_vloadop_(`%`_sz(8))), x, ao) ;; A-binary.watsup:606.5-606.62 @@ -9123,7 +9133,7 @@ def $canon_(N : N) : nat def $canon_{N : N}(N) = (2 ^ ((($signif(N) : nat <:> int) - (1 : nat <:> int)) : int <:> nat)) ;; 1-syntax.watsup -syntax vN{N : N}(N) = iN(N) +syntax vN{N : N}(N) = uN(N) ;; 1-syntax.watsup syntax v128 = vN(128) @@ -9314,7 +9324,7 @@ syntax valtype = | REF{nul : nul, heaptype : heaptype}(nul : nul, heaptype : heaptype) | BOT -;; 1-syntax.watsup:221.1-221.66 +;; 1-syntax.watsup:225.1-225.66 syntax storagetype = | BOT | I32 @@ -9326,34 +9336,34 @@ syntax storagetype = | I8 | I16 -;; 1-syntax.watsup:230.1-231.16 +;; 1-syntax.watsup:234.1-235.16 syntax resulttype = list(syntax valtype) -;; 1-syntax.watsup:243.1-243.60 +;; 1-syntax.watsup:247.1-247.60 syntax fieldtype = | `%%`{mut : mut, storagetype : storagetype}(mut : mut, storagetype : storagetype) -;; 1-syntax.watsup:245.1-245.90 +;; 1-syntax.watsup:249.1-249.90 syntax functype = | `%->%`{resulttype : resulttype}(resulttype : resulttype, resulttype) -;; 1-syntax.watsup:246.1-246.64 +;; 1-syntax.watsup:250.1-250.64 syntax structtype = list(syntax fieldtype) -;; 1-syntax.watsup:247.1-247.54 +;; 1-syntax.watsup:251.1-251.54 syntax arraytype = fieldtype -;; 1-syntax.watsup:249.1-252.18 +;; 1-syntax.watsup:253.1-256.18 syntax comptype = | STRUCT{structtype : structtype}(structtype : structtype) | ARRAY{arraytype : arraytype}(arraytype : arraytype) | FUNC{functype : functype}(functype : functype) -;; 1-syntax.watsup:254.1-255.30 +;; 1-syntax.watsup:258.1-259.30 syntax subtype = | SUB{fin : fin, `typeuse*` : typeuse*, comptype : comptype}(fin : fin, typeuse*{typeuse <- `typeuse*`} : typeuse*, comptype : comptype) -;; 1-syntax.watsup:257.1-258.22 +;; 1-syntax.watsup:261.1-262.22 syntax rectype = | REC{list : list(syntax subtype)}(list : list(syntax subtype)) } @@ -9423,6 +9433,11 @@ def $FUNCREF : reftype ;; 1-syntax.watsup def $FUNCREF = REF_reftype(?(NULL_NULL), FUNC_heaptype) +;; 1-syntax.watsup +def $EXNREF : reftype + ;; 1-syntax.watsup + def $EXNREF = REF_reftype(?(NULL_NULL), EXTERN_heaptype) + ;; 1-syntax.watsup def $EXTERNREF : reftype ;; 1-syntax.watsup @@ -9438,6 +9453,11 @@ def $NULLFUNCREF : reftype ;; 1-syntax.watsup def $NULLFUNCREF = REF_reftype(?(NULL_NULL), NOFUNC_heaptype) +;; 1-syntax.watsup +def $NULLEXNREF : reftype + ;; 1-syntax.watsup + def $NULLEXNREF = REF_reftype(?(NULL_NULL), NOEXN_heaptype) + ;; 1-syntax.watsup def $NULLEXTERNREF : reftype ;; 1-syntax.watsup @@ -9844,13 +9864,13 @@ syntax half__(shape_1 : shape, shape_2 : shape) syntax half__{Jnn_1 : Jnn, M_1 : M, Jnn_2 : Jnn, M_2 : M}(`%X%`_shape((Jnn_1 : Jnn <: lanetype), `%`_dim(M_1)), `%X%`_shape((Jnn_2 : Jnn <: lanetype), `%`_dim(M_2))) = | LOW | HIGH - -- if ((2 * $lsizenn1((Jnn_1 : Jnn <: lanetype))) = $lsizenn1((Jnn_2 : Jnn <: lanetype))) + -- if ((2 * $lsizenn1((Jnn_1 : Jnn <: lanetype))) = $lsizenn2((Jnn_2 : Jnn <: lanetype))) ;; 1-syntax.watsup syntax half__{Lnn_1 : Lnn, M_1 : M, Fnn_2 : Fnn, M_2 : M}(`%X%`_shape(Lnn_1, `%`_dim(M_1)), `%X%`_shape((Fnn_2 : Fnn <: lanetype), `%`_dim(M_2))) = | LOW - -- if (((2 * $lsizenn1(Lnn_1)) = $sizenn1((Fnn_2 : Fnn <: numtype))) /\ ($sizenn1((Fnn_2 : Fnn <: numtype)) = 64)) + -- if (((2 * $lsizenn1(Lnn_1)) = $sizenn2((Fnn_2 : Fnn <: numtype))) /\ ($sizenn2((Fnn_2 : Fnn <: numtype)) = 64)) ;; 1-syntax.watsup @@ -10047,7 +10067,7 @@ syntax memarg = ;; 1-syntax.watsup syntax loadop_{Inn : Inn}((Inn : Inn <: numtype)) = - | `%%`{sz : sz, sx : sx}(sz : sz, sx : sx) + | `%_%`{sz : sz, sx : sx}(sz : sz, sx : sx) -- if (sz!`%`_sz.0 < $sizenn((Inn : Inn <: numtype))) ;; 1-syntax.watsup @@ -10057,7 +10077,7 @@ syntax storeop_{Inn : Inn}((Inn : Inn <: numtype)) = ;; 1-syntax.watsup syntax vloadop_{vectype : vectype}(vectype) = - | `SHAPE%X%%`{sz : sz, M : M, sx : sx}(sz : sz, M : M, sx : sx) + | `SHAPE%X%_%`{sz : sz, M : M, sx : sx}(sz : sz, M : M, sx : sx) -- if (((sz!`%`_sz.0 * M) : nat <:> rat) = (($vsize(vectype) : nat <:> rat) / (2 : nat <:> rat))) | SPLAT{sz : sz}(sz : sz) | ZERO{sz : sz}(sz : sz) @@ -12635,7 +12655,7 @@ relation Instr_ok: `%|-%:%`(context, instr, instrtype) ;; 3-typing.watsup:1089.1-1092.35 rule `load-pack`{C : context, Inn : Inn, M : M, sx : sx, x : idx, memarg : memarg, at : addrtype, lim : limits}: - `%|-%:%`(C, LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(M), sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([(Inn : Inn <: valtype)]))) + `%|-%:%`(C, LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(M), sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([(Inn : Inn <: valtype)]))) -- if (C.MEMS_context[x!`%`_idx.0] = `%%PAGE`_memtype(at, lim)) -- if (((2 ^ memarg.ALIGN_memarg!`%`_u32.0) : nat <:> rat) <= ((M : nat <:> rat) / (8 : nat <:> rat))) @@ -12659,7 +12679,7 @@ relation Instr_ok: `%|-%:%`(context, instr, instrtype) ;; 3-typing.watsup:1118.1-1121.39 rule `vload-pack`{C : context, M : M, N : N, sx : sx, x : idx, memarg : memarg, at : addrtype, lim : limits}: - `%|-%:%`(C, VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), N, sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([V128_valtype]))) + `%|-%:%`(C, VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), N, sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([V128_valtype]))) -- if (C.MEMS_context[x!`%`_idx.0] = `%%PAGE`_memtype(at, lim)) -- if (((2 ^ memarg.ALIGN_memarg!`%`_u32.0) : nat <:> rat) <= (((M : nat <:> rat) / (8 : nat <:> rat)) * (N : nat <:> rat))) @@ -15430,12 +15450,12 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `load-pack-oob`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), Inn : Inn, n : n, sx : sx, x : idx, ao : memarg}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(n), sx)), x, ao)]), [TRAP_instr]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(n), sx)), x, ao)]), [TRAP_instr]) -- if (((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + (((n : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) > |$mem(z, x).BYTES_meminst|) ;; 8-reduction.watsup rule `load-pack-val`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), Inn : Inn, n : n, sx : sx, x : idx, ao : memarg, c : iN(n)}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(n), sx)), x, ao)]), [CONST_instr((Inn : Inn <: numtype), $extend__(n, $size((Inn : Inn <: numtype)), sx, c))]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(n), sx)), x, ao)]), [CONST_instr((Inn : Inn <: numtype), $extend__(n, $size((Inn : Inn <: numtype)), sx, c))]) -- if ($ibytes_(n, c) = $mem(z, x).BYTES_meminst[(i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) : (((n : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)]) ;; 8-reduction.watsup @@ -15450,12 +15470,12 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `vload-pack-oob`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), M : M, K : K, sx : sx, x : idx, ao : memarg}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [TRAP_instr]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [TRAP_instr]) -- if (((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + ((((M * K) : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) > |$mem(z, x).BYTES_meminst|) ;; 8-reduction.watsup rule `vload-pack-val`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), M : M, K : K, sx : sx, x : idx, ao : memarg, c : vec_(V128_Vnn), `j*` : iN(M)*, `k*` : nat*, Jnn : Jnn}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [VCONST_instr(V128_vectype, c)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [VCONST_instr(V128_vectype, c)]) -- (if ($ibytes_(M, j) = $mem(z, x).BYTES_meminst[((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + ((((k * M) : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) : (((M : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)]))^(k<K){j <- `j*`, k <- `k*`} -- if ((c = $invlanes_(`%X%`_shape((Jnn : Jnn <: lanetype), `%`_dim(K)), $extend__(M, $lsizenn((Jnn : Jnn <: lanetype)), sx, j)^K{j <- `j*`})) /\ ($lsizenn((Jnn : Jnn <: lanetype)) = (M * 2))) @@ -15531,13 +15551,13 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `memory.copy-le`{z : state, at_1 : addrtype, i_1 : num_((at_1 : addrtype <: numtype)), at_2 : addrtype, i_2 : num_((at_2 : addrtype <: numtype)), at' : addrtype, n : n, x_1 : idx, x_2 : idx}: - `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), `%`_num_((i_1!`%`_num_.0 + 1))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_((i_2!`%`_num_.0 + 1))) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), `%`_num_((i_1!`%`_num_.0 + 1))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_((i_2!`%`_num_.0 + 1))) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) -- otherwise -- if (i_1!`%`_num_.0 <= i_2!`%`_num_.0) ;; 8-reduction.watsup rule `memory.copy-gt`{z : state, at_1 : addrtype, i_1 : num_((at_1 : addrtype <: numtype)), at_2 : addrtype, i_2 : num_((at_2 : addrtype <: numtype)), at' : addrtype, n : n, x_1 : idx, x_2 : idx}: - `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), `%`_num_(((((i_1!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_(((((i_2!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), `%`_num_(((((i_1!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_(((((i_2!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) -- otherwise ;; 8-reduction.watsup @@ -16518,26 +16538,26 @@ grammar Binstr : instr prod{x : idx, ao : memarg} {0x2A (x, ao):Bmemarg} => LOAD_instr(F32_numtype, ?(), x, ao) ;; A-binary.watsup:361.5-361.41 prod{x : idx, ao : memarg} {0x2B (x, ao):Bmemarg} => LOAD_instr(F64_numtype, ?(), x, ao) - ;; A-binary.watsup:362.5-362.48 - prod{x : idx, ao : memarg} {0x2C (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), S_sx)), x, ao) - ;; A-binary.watsup:363.5-363.48 - prod{x : idx, ao : memarg} {0x2D (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x, ao) - ;; A-binary.watsup:364.5-364.49 - prod{x : idx, ao : memarg} {0x2E (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(16), S_sx)), x, ao) - ;; A-binary.watsup:365.5-365.49 - prod{x : idx, ao : memarg} {0x2F (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(16), U_sx)), x, ao) - ;; A-binary.watsup:366.5-366.48 - prod{x : idx, ao : memarg} {0x30 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(8), S_sx)), x, ao) - ;; A-binary.watsup:367.5-367.48 - prod{x : idx, ao : memarg} {0x31 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x, ao) - ;; A-binary.watsup:368.5-368.49 - prod{x : idx, ao : memarg} {0x32 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(16), S_sx)), x, ao) - ;; A-binary.watsup:369.5-369.49 - prod{x : idx, ao : memarg} {0x33 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(16), U_sx)), x, ao) - ;; A-binary.watsup:370.5-370.49 - prod{x : idx, ao : memarg} {0x34 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(32), S_sx)), x, ao) - ;; A-binary.watsup:371.5-371.49 - prod{x : idx, ao : memarg} {0x35 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(32), U_sx)), x, ao) + ;; A-binary.watsup:362.5-362.50 + prod{x : idx, ao : memarg} {0x2C (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), S_sx)), x, ao) + ;; A-binary.watsup:363.5-363.50 + prod{x : idx, ao : memarg} {0x2D (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x, ao) + ;; A-binary.watsup:364.5-364.51 + prod{x : idx, ao : memarg} {0x2E (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(16), S_sx)), x, ao) + ;; A-binary.watsup:365.5-365.51 + prod{x : idx, ao : memarg} {0x2F (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(16), U_sx)), x, ao) + ;; A-binary.watsup:366.5-366.50 + prod{x : idx, ao : memarg} {0x30 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(8), S_sx)), x, ao) + ;; A-binary.watsup:367.5-367.50 + prod{x : idx, ao : memarg} {0x31 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x, ao) + ;; A-binary.watsup:368.5-368.51 + prod{x : idx, ao : memarg} {0x32 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(16), S_sx)), x, ao) + ;; A-binary.watsup:369.5-369.51 + prod{x : idx, ao : memarg} {0x33 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(16), U_sx)), x, ao) + ;; A-binary.watsup:370.5-370.51 + prod{x : idx, ao : memarg} {0x34 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(32), S_sx)), x, ao) + ;; A-binary.watsup:371.5-371.51 + prod{x : idx, ao : memarg} {0x35 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(32), U_sx)), x, ao) ;; A-binary.watsup:372.5-372.42 prod{x : idx, ao : memarg} {0x36 (x, ao):Bmemarg} => STORE_instr(I32_numtype, ?(), x, ao) ;; A-binary.watsup:373.5-373.42 @@ -16850,18 +16870,18 @@ grammar Binstr : instr prod {0xFC `%`_u32(7):Bu32} => CVTOP_instr(I64_numtype, F64_numtype, TRUNC_SAT_cvtop__(U_sx)) ;; A-binary.watsup:598.5-598.50 prod{x : idx, ao : memarg} {0xFD `%`_u32(0):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(), x, ao) - ;; A-binary.watsup:599.5-599.68 - prod{x : idx, ao : memarg} {0xFD `%`_u32(1):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(8), 8, S_sx)), x, ao) - ;; A-binary.watsup:600.5-600.68 - prod{x : idx, ao : memarg} {0xFD `%`_u32(2):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(8), 8, U_sx)), x, ao) - ;; A-binary.watsup:601.5-601.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(3):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(16), 4, S_sx)), x, ao) - ;; A-binary.watsup:602.5-602.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(4):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(16), 4, U_sx)), x, ao) - ;; A-binary.watsup:603.5-603.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(5):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(32), 2, S_sx)), x, ao) - ;; A-binary.watsup:604.5-604.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(6):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(32), 2, U_sx)), x, ao) + ;; A-binary.watsup:599.5-599.70 + prod{x : idx, ao : memarg} {0xFD `%`_u32(1):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(8), 8, S_sx)), x, ao) + ;; A-binary.watsup:600.5-600.70 + prod{x : idx, ao : memarg} {0xFD `%`_u32(2):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(8), 8, U_sx)), x, ao) + ;; A-binary.watsup:601.5-601.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(3):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(16), 4, S_sx)), x, ao) + ;; A-binary.watsup:602.5-602.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(4):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(16), 4, U_sx)), x, ao) + ;; A-binary.watsup:603.5-603.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(5):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(32), 2, S_sx)), x, ao) + ;; A-binary.watsup:604.5-604.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(6):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(32), 2, U_sx)), x, ao) ;; A-binary.watsup:605.5-605.61 prod{x : idx, ao : memarg} {0xFD `%`_u32(7):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(SPLAT_vloadop_(`%`_sz(8))), x, ao) ;; A-binary.watsup:606.5-606.62 @@ -17978,7 +17998,7 @@ def $canon_(N : N) : nat def $canon_{N : N}(N) = (2 ^ ((($signif(N) : nat <:> int) - (1 : nat <:> int)) : int <:> nat)) ;; 1-syntax.watsup -syntax vN{N : N}(N) = iN(N) +syntax vN{N : N}(N) = uN(N) ;; 1-syntax.watsup syntax v128 = vN(128) @@ -18169,7 +18189,7 @@ syntax valtype = | REF{nul : nul, heaptype : heaptype}(nul : nul, heaptype : heaptype) | BOT -;; 1-syntax.watsup:221.1-221.66 +;; 1-syntax.watsup:225.1-225.66 syntax storagetype = | BOT | I32 @@ -18181,34 +18201,34 @@ syntax storagetype = | I8 | I16 -;; 1-syntax.watsup:230.1-231.16 +;; 1-syntax.watsup:234.1-235.16 syntax resulttype = list(syntax valtype) -;; 1-syntax.watsup:243.1-243.60 +;; 1-syntax.watsup:247.1-247.60 syntax fieldtype = | `%%`{mut : mut, storagetype : storagetype}(mut : mut, storagetype : storagetype) -;; 1-syntax.watsup:245.1-245.90 +;; 1-syntax.watsup:249.1-249.90 syntax functype = | `%->%`{resulttype : resulttype}(resulttype : resulttype, resulttype) -;; 1-syntax.watsup:246.1-246.64 +;; 1-syntax.watsup:250.1-250.64 syntax structtype = list(syntax fieldtype) -;; 1-syntax.watsup:247.1-247.54 +;; 1-syntax.watsup:251.1-251.54 syntax arraytype = fieldtype -;; 1-syntax.watsup:249.1-252.18 +;; 1-syntax.watsup:253.1-256.18 syntax comptype = | STRUCT{structtype : structtype}(structtype : structtype) | ARRAY{arraytype : arraytype}(arraytype : arraytype) | FUNC{functype : functype}(functype : functype) -;; 1-syntax.watsup:254.1-255.30 +;; 1-syntax.watsup:258.1-259.30 syntax subtype = | SUB{fin : fin, `typeuse*` : typeuse*, comptype : comptype}(fin : fin, typeuse*{typeuse <- `typeuse*`} : typeuse*, comptype : comptype) -;; 1-syntax.watsup:257.1-258.22 +;; 1-syntax.watsup:261.1-262.22 syntax rectype = | REC{list : list(syntax subtype)}(list : list(syntax subtype)) } @@ -18278,6 +18298,11 @@ def $FUNCREF : reftype ;; 1-syntax.watsup def $FUNCREF = REF_reftype(?(NULL_NULL), FUNC_heaptype) +;; 1-syntax.watsup +def $EXNREF : reftype + ;; 1-syntax.watsup + def $EXNREF = REF_reftype(?(NULL_NULL), EXTERN_heaptype) + ;; 1-syntax.watsup def $EXTERNREF : reftype ;; 1-syntax.watsup @@ -18293,6 +18318,11 @@ def $NULLFUNCREF : reftype ;; 1-syntax.watsup def $NULLFUNCREF = REF_reftype(?(NULL_NULL), NOFUNC_heaptype) +;; 1-syntax.watsup +def $NULLEXNREF : reftype + ;; 1-syntax.watsup + def $NULLEXNREF = REF_reftype(?(NULL_NULL), NOEXN_heaptype) + ;; 1-syntax.watsup def $NULLEXTERNREF : reftype ;; 1-syntax.watsup @@ -18699,13 +18729,13 @@ syntax half__(shape_1 : shape, shape_2 : shape) syntax half__{Jnn_1 : Jnn, M_1 : M, Jnn_2 : Jnn, M_2 : M}(`%X%`_shape((Jnn_1 : Jnn <: lanetype), `%`_dim(M_1)), `%X%`_shape((Jnn_2 : Jnn <: lanetype), `%`_dim(M_2))) = | LOW | HIGH - -- if ((2 * $lsizenn1((Jnn_1 : Jnn <: lanetype))) = $lsizenn1((Jnn_2 : Jnn <: lanetype))) + -- if ((2 * $lsizenn1((Jnn_1 : Jnn <: lanetype))) = $lsizenn2((Jnn_2 : Jnn <: lanetype))) ;; 1-syntax.watsup syntax half__{Lnn_1 : Lnn, M_1 : M, Fnn_2 : Fnn, M_2 : M}(`%X%`_shape(Lnn_1, `%`_dim(M_1)), `%X%`_shape((Fnn_2 : Fnn <: lanetype), `%`_dim(M_2))) = | LOW - -- if (((2 * $lsizenn1(Lnn_1)) = $sizenn1((Fnn_2 : Fnn <: numtype))) /\ ($sizenn1((Fnn_2 : Fnn <: numtype)) = 64)) + -- if (((2 * $lsizenn1(Lnn_1)) = $sizenn2((Fnn_2 : Fnn <: numtype))) /\ ($sizenn2((Fnn_2 : Fnn <: numtype)) = 64)) ;; 1-syntax.watsup @@ -18902,7 +18932,7 @@ syntax memarg = ;; 1-syntax.watsup syntax loadop_{Inn : Inn}((Inn : Inn <: numtype)) = - | `%%`{sz : sz, sx : sx}(sz : sz, sx : sx) + | `%_%`{sz : sz, sx : sx}(sz : sz, sx : sx) -- if (sz!`%`_sz.0 < $sizenn((Inn : Inn <: numtype))) ;; 1-syntax.watsup @@ -18912,7 +18942,7 @@ syntax storeop_{Inn : Inn}((Inn : Inn <: numtype)) = ;; 1-syntax.watsup syntax vloadop_{vectype : vectype}(vectype) = - | `SHAPE%X%%`{sz : sz, M : M, sx : sx}(sz : sz, M : M, sx : sx) + | `SHAPE%X%_%`{sz : sz, M : M, sx : sx}(sz : sz, M : M, sx : sx) -- if (((sz!`%`_sz.0 * M) : nat <:> rat) = (($vsize(vectype) : nat <:> rat) / (2 : nat <:> rat))) | SPLAT{sz : sz}(sz : sz) | ZERO{sz : sz}(sz : sz) @@ -21580,7 +21610,7 @@ relation Instr_ok: `%|-%:%`(context, instr, instrtype) ;; 3-typing.watsup:1089.1-1092.35 rule `load-pack`{C : context, Inn : Inn, M : M, sx : sx, x : idx, memarg : memarg, at : addrtype, lim : limits}: - `%|-%:%`(C, LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(M), sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([(Inn : Inn <: valtype)]))) + `%|-%:%`(C, LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(M), sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([(Inn : Inn <: valtype)]))) -- if (x!`%`_idx.0 < |C.MEMS_context|) -- if (C.MEMS_context[x!`%`_idx.0] = `%%PAGE`_memtype(at, lim)) -- if (((2 ^ memarg.ALIGN_memarg!`%`_u32.0) : nat <:> rat) <= ((M : nat <:> rat) / (8 : nat <:> rat))) @@ -21608,7 +21638,7 @@ relation Instr_ok: `%|-%:%`(context, instr, instrtype) ;; 3-typing.watsup:1118.1-1121.39 rule `vload-pack`{C : context, M : M, N : N, sx : sx, x : idx, memarg : memarg, at : addrtype, lim : limits}: - `%|-%:%`(C, VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), N, sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([V128_valtype]))) + `%|-%:%`(C, VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), N, sx)), x, memarg), `%->_%%`_instrtype(`%`_resulttype([(at : addrtype <: valtype)]), [], `%`_resulttype([V128_valtype]))) -- if (x!`%`_idx.0 < |C.MEMS_context|) -- if (C.MEMS_context[x!`%`_idx.0] = `%%PAGE`_memtype(at, lim)) -- if (((2 ^ memarg.ALIGN_memarg!`%`_u32.0) : nat <:> rat) <= (((M : nat <:> rat) / (8 : nat <:> rat)) * (N : nat <:> rat))) @@ -24456,12 +24486,12 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `load-pack-oob`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), Inn : Inn, n : n, sx : sx, x : idx, ao : memarg}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(n), sx)), x, ao)]), [TRAP_instr]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(n), sx)), x, ao)]), [TRAP_instr]) -- if (((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + (((n : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) > |$mem(z, x).BYTES_meminst|) ;; 8-reduction.watsup rule `load-pack-val`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), Inn : Inn, n : n, sx : sx, x : idx, ao : memarg, c : iN(n)}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%%`_loadop_(`%`_sz(n), sx)), x, ao)]), [CONST_instr((Inn : Inn <: numtype), $extend__(n, $size((Inn : Inn <: numtype)), sx, c))]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) LOAD_instr((Inn : Inn <: numtype), ?(`%_%`_loadop_(`%`_sz(n), sx)), x, ao)]), [CONST_instr((Inn : Inn <: numtype), $extend__(n, $size((Inn : Inn <: numtype)), sx, c))]) -- if ($ibytes_(n, c) = $mem(z, x).BYTES_meminst[(i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) : (((n : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)]) ;; 8-reduction.watsup @@ -24476,12 +24506,12 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `vload-pack-oob`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), M : M, K : K, sx : sx, x : idx, ao : memarg}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [TRAP_instr]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [TRAP_instr]) -- if (((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + ((((M * K) : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) > |$mem(z, x).BYTES_meminst|) ;; 8-reduction.watsup rule `vload-pack-val`{z : state, at : addrtype, i : num_((at : addrtype <: numtype)), M : M, K : K, sx : sx, x : idx, ao : memarg, c : vec_(V128_Vnn), `j*` : iN(M)*, `k*` : nat*, Jnn : Jnn}: - `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [VCONST_instr(V128_vectype, c)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at : addrtype <: numtype), i) VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(M), K, sx)), x, ao)]), [VCONST_instr(V128_vectype, c)]) -- (if ($ibytes_(M, j) = $mem(z, x).BYTES_meminst[((i!`%`_num_.0 + ao.OFFSET_memarg!`%`_u32.0) + ((((k * M) : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)) : (((M : nat <:> rat) / (8 : nat <:> rat)) : rat <:> nat)]))^(k<K){j <- `j*`, k <- `k*`} -- if ((c = $invlanes_(`%X%`_shape((Jnn : Jnn <: lanetype), `%`_dim(K)), $extend__(M, $lsizenn((Jnn : Jnn <: lanetype)), sx, j)^K{j <- `j*`})) /\ ($lsizenn((Jnn : Jnn <: lanetype)) = (M * 2))) @@ -24557,13 +24587,13 @@ relation Step_read: `%~>%`(config, instr*) ;; 8-reduction.watsup rule `memory.copy-le`{z : state, at_1 : addrtype, i_1 : num_((at_1 : addrtype <: numtype)), at_2 : addrtype, i_2 : num_((at_2 : addrtype <: numtype)), at' : addrtype, n : n, x_1 : idx, x_2 : idx}: - `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), `%`_num_((i_1!`%`_num_.0 + 1))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_((i_2!`%`_num_.0 + 1))) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), `%`_num_((i_1!`%`_num_.0 + 1))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_((i_2!`%`_num_.0 + 1))) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) -- otherwise -- if (i_1!`%`_num_.0 <= i_2!`%`_num_.0) ;; 8-reduction.watsup rule `memory.copy-gt`{z : state, at_1 : addrtype, i_1 : num_((at_1 : addrtype <: numtype)), at_2 : addrtype, i_2 : num_((at_2 : addrtype <: numtype)), at' : addrtype, n : n, x_1 : idx, x_2 : idx}: - `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), `%`_num_(((((i_1!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_(((((i_2!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) + `%~>%`(`%;%`_config(z, [CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_(n)) MEMORY.COPY_instr(x_1, x_2)]), [CONST_instr((at_1 : addrtype <: numtype), `%`_num_(((((i_1!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) CONST_instr((at_2 : addrtype <: numtype), `%`_num_(((((i_2!`%`_num_.0 + n) : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x_2, $memarg0) STORE_instr(I32_numtype, ?(`%`_storeop_(`%`_sz(8))), x_1, $memarg0) CONST_instr((at_1 : addrtype <: numtype), i_1) CONST_instr((at_2 : addrtype <: numtype), i_2) CONST_instr((at' : addrtype <: numtype), `%`_num_((((n : nat <:> int) - (1 : nat <:> int)) : int <:> nat))) MEMORY.COPY_instr(x_1, x_2)]) -- otherwise ;; 8-reduction.watsup @@ -25551,26 +25581,26 @@ grammar Binstr : instr prod{x : idx, ao : memarg} {0x2A (x, ao):Bmemarg} => LOAD_instr(F32_numtype, ?(), x, ao) ;; A-binary.watsup:361.5-361.41 prod{x : idx, ao : memarg} {0x2B (x, ao):Bmemarg} => LOAD_instr(F64_numtype, ?(), x, ao) - ;; A-binary.watsup:362.5-362.48 - prod{x : idx, ao : memarg} {0x2C (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), S_sx)), x, ao) - ;; A-binary.watsup:363.5-363.48 - prod{x : idx, ao : memarg} {0x2D (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x, ao) - ;; A-binary.watsup:364.5-364.49 - prod{x : idx, ao : memarg} {0x2E (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(16), S_sx)), x, ao) - ;; A-binary.watsup:365.5-365.49 - prod{x : idx, ao : memarg} {0x2F (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%%`_loadop_(`%`_sz(16), U_sx)), x, ao) - ;; A-binary.watsup:366.5-366.48 - prod{x : idx, ao : memarg} {0x30 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(8), S_sx)), x, ao) - ;; A-binary.watsup:367.5-367.48 - prod{x : idx, ao : memarg} {0x31 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(8), U_sx)), x, ao) - ;; A-binary.watsup:368.5-368.49 - prod{x : idx, ao : memarg} {0x32 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(16), S_sx)), x, ao) - ;; A-binary.watsup:369.5-369.49 - prod{x : idx, ao : memarg} {0x33 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(16), U_sx)), x, ao) - ;; A-binary.watsup:370.5-370.49 - prod{x : idx, ao : memarg} {0x34 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(32), S_sx)), x, ao) - ;; A-binary.watsup:371.5-371.49 - prod{x : idx, ao : memarg} {0x35 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%%`_loadop_(`%`_sz(32), U_sx)), x, ao) + ;; A-binary.watsup:362.5-362.50 + prod{x : idx, ao : memarg} {0x2C (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), S_sx)), x, ao) + ;; A-binary.watsup:363.5-363.50 + prod{x : idx, ao : memarg} {0x2D (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x, ao) + ;; A-binary.watsup:364.5-364.51 + prod{x : idx, ao : memarg} {0x2E (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(16), S_sx)), x, ao) + ;; A-binary.watsup:365.5-365.51 + prod{x : idx, ao : memarg} {0x2F (x, ao):Bmemarg} => LOAD_instr(I32_numtype, ?(`%_%`_loadop_(`%`_sz(16), U_sx)), x, ao) + ;; A-binary.watsup:366.5-366.50 + prod{x : idx, ao : memarg} {0x30 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(8), S_sx)), x, ao) + ;; A-binary.watsup:367.5-367.50 + prod{x : idx, ao : memarg} {0x31 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(8), U_sx)), x, ao) + ;; A-binary.watsup:368.5-368.51 + prod{x : idx, ao : memarg} {0x32 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(16), S_sx)), x, ao) + ;; A-binary.watsup:369.5-369.51 + prod{x : idx, ao : memarg} {0x33 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(16), U_sx)), x, ao) + ;; A-binary.watsup:370.5-370.51 + prod{x : idx, ao : memarg} {0x34 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(32), S_sx)), x, ao) + ;; A-binary.watsup:371.5-371.51 + prod{x : idx, ao : memarg} {0x35 (x, ao):Bmemarg} => LOAD_instr(I64_numtype, ?(`%_%`_loadop_(`%`_sz(32), U_sx)), x, ao) ;; A-binary.watsup:372.5-372.42 prod{x : idx, ao : memarg} {0x36 (x, ao):Bmemarg} => STORE_instr(I32_numtype, ?(), x, ao) ;; A-binary.watsup:373.5-373.42 @@ -25883,18 +25913,18 @@ grammar Binstr : instr prod {0xFC `%`_u32(7):Bu32} => CVTOP_instr(I64_numtype, F64_numtype, TRUNC_SAT_cvtop__(U_sx)) ;; A-binary.watsup:598.5-598.50 prod{x : idx, ao : memarg} {0xFD `%`_u32(0):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(), x, ao) - ;; A-binary.watsup:599.5-599.68 - prod{x : idx, ao : memarg} {0xFD `%`_u32(1):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(8), 8, S_sx)), x, ao) - ;; A-binary.watsup:600.5-600.68 - prod{x : idx, ao : memarg} {0xFD `%`_u32(2):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(8), 8, U_sx)), x, ao) - ;; A-binary.watsup:601.5-601.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(3):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(16), 4, S_sx)), x, ao) - ;; A-binary.watsup:602.5-602.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(4):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(16), 4, U_sx)), x, ao) - ;; A-binary.watsup:603.5-603.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(5):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(32), 2, S_sx)), x, ao) - ;; A-binary.watsup:604.5-604.69 - prod{x : idx, ao : memarg} {0xFD `%`_u32(6):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%%`_vloadop_(`%`_sz(32), 2, U_sx)), x, ao) + ;; A-binary.watsup:599.5-599.70 + prod{x : idx, ao : memarg} {0xFD `%`_u32(1):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(8), 8, S_sx)), x, ao) + ;; A-binary.watsup:600.5-600.70 + prod{x : idx, ao : memarg} {0xFD `%`_u32(2):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(8), 8, U_sx)), x, ao) + ;; A-binary.watsup:601.5-601.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(3):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(16), 4, S_sx)), x, ao) + ;; A-binary.watsup:602.5-602.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(4):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(16), 4, U_sx)), x, ao) + ;; A-binary.watsup:603.5-603.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(5):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(32), 2, S_sx)), x, ao) + ;; A-binary.watsup:604.5-604.71 + prod{x : idx, ao : memarg} {0xFD `%`_u32(6):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(`SHAPE%X%_%`_vloadop_(`%`_sz(32), 2, U_sx)), x, ao) ;; A-binary.watsup:605.5-605.61 prod{x : idx, ao : memarg} {0xFD `%`_u32(7):Bu32 (x, ao):Bmemarg} => VLOAD_instr(V128_vectype, ?(SPLAT_vloadop_(`%`_sz(8))), x, ao) ;; A-binary.watsup:606.5-606.62 diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index 7296a91d8c..5282351456 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -467,7 +467,7 @@ The instruction :math:`({t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{loa * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. + * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`{M}{\mathsf{\_}}{{\mathit{sx}}}`. * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is equal to :math:`{\mathsf{i}}{n}`. @@ -531,7 +531,7 @@ The instruction :math:`({t{.}\mathsf{load}}{\epsilon}~{\mathit{memarg}})` is val -The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{M~{\mathit{sx}}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathsf{i}}{n}` if: +The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{{M}{\mathsf{\_}}{{\mathit{sx}}}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathsf{i}}{n}` if: * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. @@ -1388,7 +1388,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: @@ -1400,7 +1402,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. @@ -3104,7 +3108,7 @@ Instr_ok/load - (2 ^ memarg.ALIGN) is less than or equal to ($size(t) / 8). - Or: - t_u1 is Inn. - - loadop__u1? is ?((M sx)). + - loadop__u1? is ?(M _ sx). - t_u3 is Inn. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -3137,7 +3141,7 @@ Instr_ok/load-val - (2 ^ memarg.ALIGN) is less than or equal to ($size(t) / 8). Instr_ok/load-pack -- the instruction (LOAD Inn ?((M sx)) memarg) is valid with the function type [I32] -> [Inn] if: +- the instruction (LOAD Inn ?(M _ sx) memarg) is valid with the function type [I32] -> [Inn] if: - the memory type C.MEMS[0] exists. - C.MEMS[0] is mt. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -3555,15 +3559,17 @@ Step_read/load t_u1 loadop__u1? ao 5. If the type of t_u1 is Inn, then: a. If loadop__u1? is defined, then: 1) Let ?(loadop__0) be loadop__u1?. - 2) Let (n sx) be loadop__0. - 3) If (((i + ao.OFFSET) + (n / 8)) > |$mem(z, 0).BYTES|), then: + 2) Assert: Due to validation, loadop__0 is of the case _. + 3) Let n _ sx be loadop__0. + 4) If (((i + ao.OFFSET) + (n / 8)) > |$mem(z, 0).BYTES|), then: a) Trap. b. Let Inn be t_u1. c. If loadop__u1? is defined, then: 1) Let ?(loadop__0) be loadop__u1?. - 2) Let (n sx) be loadop__0. - 3) Let c be $ibytes__1^-1(n, $mem(z, 0).BYTES[(i + ao.OFFSET) : (n / 8)]). - 4) Push the value (Inn.CONST $extend__(n, $size(Inn), sx, c)) to the stack. + 2) Assert: Due to validation, loadop__0 is of the case _. + 3) Let n _ sx be loadop__0. + 4) Let c be $ibytes__1^-1(n, $mem(z, 0).BYTES[(i + ao.OFFSET) : (n / 8)]). + 5) Push the value (Inn.CONST $extend__(n, $size(Inn), sx, c)) to the stack. Step_read/memory.size 1. Let z be the current state. @@ -5086,7 +5092,7 @@ The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{. * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. + * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`{M}{\mathsf{\_}}{{\mathit{sx}}}`. * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. @@ -5134,7 +5140,7 @@ The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~{\mathit{vl * Either: - * :math:`{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({M}{\mathsf{x}}{\mathsf{x}}{\mathsf{\_}}{N})`. + * :math:`{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({M}{\mathsf{x}}{N}{\mathsf{\_}}{{\mathit{sx}}})`. * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8 \cdot N`. @@ -5232,7 +5238,7 @@ The instruction :math:`({{\mathit{nt}}{.}\mathsf{load}}{\epsilon}~{\mathit{memar -The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{M~{\mathit{sx}}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathsf{i}}{n}` if: +The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{load}}{{M}{\mathsf{\_}}{{\mathit{sx}}}}~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~{\mathsf{i}}{n}` if: * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. @@ -5268,7 +5274,7 @@ The instruction :math:`({{\mathsf{i}}{n}{.}\mathsf{store}}{M}~{\mathit{memarg}}) -The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~({M}{\mathsf{x}}{\mathsf{x}}{\mathsf{\_}}{N})~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: +The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~({M}{\mathsf{x}}{N}{\mathsf{\_}}{{\mathit{sx}}})~{\mathit{memarg}})` is valid with the function type :math:`\mathsf{i{\scriptstyle 32}}~\rightarrow~\mathsf{v{\scriptstyle 128}}` if: * The memory type :math:`C{.}\mathsf{mems}{}[0]` exists. @@ -6886,7 +6892,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: @@ -6898,7 +6906,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. @@ -6931,7 +6941,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{vloadop}}_0` is of the case :math:`\mathsf{shape}`, then: - 1) Let :math:`({M}{\mathsf{x}}{\mathsf{x}}{\mathsf{\_}}{N})` be :math:`{\mathit{vloadop}}_0`. + 1) Let :math:`({M}{\mathsf{x}}{N}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vloadop}}_0`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + M \cdot N / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: @@ -7105,7 +7115,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}})`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}})`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. @@ -7119,7 +7129,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + n - 1)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}})`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}})`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. @@ -10340,7 +10350,7 @@ Instr_ok/load - (2 ^ memarg.ALIGN) is less than or equal to ($size(nt) / 8). - Or: - nt_u1 is Inn. - - loadop__u1? is ?((M sx)). + - loadop__u1? is ?(M _ sx). - t_u1 is Inn. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -10364,7 +10374,7 @@ Instr_ok/vload - the memory type C.MEMS[0] exists. - C.MEMS[0] is mt. - Either: - - vloadop_u1 is (SHAPE M X N sx). + - vloadop_u1 is (SHAPE M X N _ sx). - (2 ^ memarg.ALIGN) is less than or equal to ((M / 8) * N). - Or: - vloadop_u1 is (SPLAT n). @@ -10415,7 +10425,7 @@ Instr_ok/load-val - (2 ^ memarg.ALIGN) is less than or equal to ($size(nt) / 8). Instr_ok/load-pack -- the instruction (LOAD Inn ?((M sx)) memarg) is valid with the function type [I32] -> [Inn] if: +- the instruction (LOAD Inn ?(M _ sx) memarg) is valid with the function type [I32] -> [Inn] if: - the memory type C.MEMS[0] exists. - C.MEMS[0] is mt. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -10433,7 +10443,7 @@ Instr_ok/store-pack - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). Instr_ok/vload -- the instruction (VLOAD V128 ?((SHAPE M X N sx)) memarg) is valid with the function type [I32] -> [V128] if: +- the instruction (VLOAD V128 ?((SHAPE M X N _ sx)) memarg) is valid with the function type [I32] -> [V128] if: - the memory type C.MEMS[0] exists. - C.MEMS[0] is mt. - (2 ^ memarg.ALIGN) is less than or equal to ((M / 8) * N). @@ -11224,15 +11234,17 @@ Step_read/load nt_u1 loadop__u1? ao 5. If the type of nt_u1 is Inn, then: a. If loadop__u1? is defined, then: 1) Let ?(loadop__0) be loadop__u1?. - 2) Let (n sx) be loadop__0. - 3) If (((i + ao.OFFSET) + (n / 8)) > |$mem(z, 0).BYTES|), then: + 2) Assert: Due to validation, loadop__0 is of the case _. + 3) Let n _ sx be loadop__0. + 4) If (((i + ao.OFFSET) + (n / 8)) > |$mem(z, 0).BYTES|), then: a) Trap. b. Let Inn be nt_u1. c. If loadop__u1? is defined, then: 1) Let ?(loadop__0) be loadop__u1?. - 2) Let (n sx) be loadop__0. - 3) Let c be $ibytes__1^-1(n, $mem(z, 0).BYTES[(i + ao.OFFSET) : (n / 8)]). - 4) Push the value (Inn.CONST $extend__(n, $size(Inn), sx, c)) to the stack. + 2) Assert: Due to validation, loadop__0 is of the case _. + 3) Let n _ sx be loadop__0. + 4) Let c be $ibytes__1^-1(n, $mem(z, 0).BYTES[(i + ao.OFFSET) : (n / 8)]). + 5) Push the value (Inn.CONST $extend__(n, $size(Inn), sx, c)) to the stack. Step_read/vload V128 vloadop_u1? ao 1. Let z be the current state. @@ -11246,7 +11258,7 @@ Step_read/vload V128 vloadop_u1? ao 6. Else: a. Let ?(vloadop_0) be vloadop_u1?. b. If vloadop_0 is of the case SHAPE, then: - 1) Let (SHAPE M X N sx) be vloadop_0. + 1) Let (SHAPE M X N _ sx) be vloadop_0. 2) If (((i + ao.OFFSET) + ((M * N) / 8)) > |$mem(z, 0).BYTES|), then: a) Trap. 3) Let j^N be $ibytes__1^-1(M, $mem(z, 0).BYTES[((i + ao.OFFSET) + ((k * M) / 8)) : (M / 8)])^(k<N). @@ -11331,14 +11343,14 @@ Step_read/memory.copy a. If (j <= i), then: 1) Push the value (I32.CONST j) to the stack. 2) Push the value (I32.CONST i) to the stack. - 3) Execute the instruction (LOAD I32 ?((8 U)) $memarg0()). + 3) Execute the instruction (LOAD I32 ?(8 _ U) $memarg0()). 4) Execute the instruction (STORE I32 ?(8) $memarg0()). 5) Push the value (I32.CONST (j + 1)) to the stack. 6) Push the value (I32.CONST (i + 1)) to the stack. b. Else: 1) Push the value (I32.CONST ((j + n) - 1)) to the stack. 2) Push the value (I32.CONST ((i + n) - 1)) to the stack. - 3) Execute the instruction (LOAD I32 ?((8 U)) $memarg0()). + 3) Execute the instruction (LOAD I32 ?(8 _ U) $memarg0()). 4) Execute the instruction (STORE I32 ?(8) $memarg0()). 5) Push the value (I32.CONST j) to the stack. 6) Push the value (I32.CONST i) to the stack. @@ -15130,7 +15142,7 @@ The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{. * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. - * :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`(M~{\mathit{sx}})`. + * :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`{M}{\mathsf{\_}}{{\mathit{sx}}}`. * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. @@ -15273,7 +15285,7 @@ The instruction :math:`({{\mathit{nt}}{.}\mathsf{load}}{\epsilon}~x~{\mathit{mem -The instruction :math:`({{\mathsf{i}}{N}{.}\mathsf{load}}{M~{\mathit{sx}}}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~{\mathsf{i}}{N}` if: +The instruction :math:`({{\mathsf{i}}{N}{.}\mathsf{load}}{{M}{\mathsf{\_}}{{\mathit{sx}}}}~x~{\mathit{memarg}})` is valid with the instruction type :math:`{\mathit{at}}~\rightarrow~{\mathsf{i}}{N}` if: * The memory type :math:`C{.}\mathsf{mems}{}[x]` exists. @@ -18410,7 +18422,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: @@ -18422,7 +18436,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Let :math:`(n~{\mathit{sx}})` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. @@ -18633,7 +18649,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}}~x_2)`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}}~x_2)`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1)`. @@ -18647,7 +18663,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + n - 1)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{8~\mathsf{u}}~x_2)`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}}~x_2)`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1)`. @@ -19346,6 +19362,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Return :math:`(\mathsf{ref}~\mathsf{null}~\mathsf{func})`. +:math:`\mathsf{exnref}` +....................... + + +1. Return :math:`(\mathsf{ref}~\mathsf{null}~\mathsf{extern})`. + + :math:`\mathsf{externref}` .......................... @@ -19367,6 +19390,13 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Return :math:`(\mathsf{ref}~\mathsf{null}~\mathsf{nofunc})`. +:math:`\mathsf{nullexnref}` +........................... + + +1. Return :math:`(\mathsf{ref}~\mathsf{null}~\mathsf{noexn})`. + + :math:`\mathsf{nullexternref}` .............................. @@ -25681,7 +25711,7 @@ Instr_ok/load - (2 ^ memarg.ALIGN) is less than or equal to ($size(nt) / 8). - Or: - nt_u1 is Inn. - - loadop_u1? is ?((M sx)). + - loadop_u1? is ?(M _ sx). - t_u1 is Inn. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -25708,7 +25738,7 @@ Instr_ok/vload - vloadop_u1? is ?(). - (2 ^ memarg.ALIGN) is less than or equal to ($vsize(V128) / 8). - Or: - - vloadop_u1? is ?((SHAPE M X N sx)). + - vloadop_u1? is ?((SHAPE M X N _ sx)). - (2 ^ memarg.ALIGN) is less than or equal to ((M / 8) * N). - Or: - vloadop_u1? is ?((SPLAT N)). @@ -25754,7 +25784,7 @@ Instr_ok/load-val - (2 ^ memarg.ALIGN) is less than or equal to ($size(nt) / 8). Instr_ok/load-pack -- the instruction (LOAD Inn ?((M sx)) x memarg) is valid with the instruction type [at] -> [Inn] if: +- the instruction (LOAD Inn ?(M _ sx) x memarg) is valid with the instruction type [at] -> [Inn] if: - the memory type C.MEMS[x] exists. - C.MEMS[x] is at lim PAGE. - (2 ^ memarg.ALIGN) is less than or equal to (M / 8). @@ -25778,7 +25808,7 @@ Instr_ok/vload-val - (2 ^ memarg.ALIGN) is less than or equal to ($vsize(V128) / 8). Instr_ok/vload-pack -- the instruction (VLOAD V128 ?((SHAPE M X N sx)) x memarg) is valid with the instruction type [at] -> [V128] if: +- the instruction (VLOAD V128 ?((SHAPE M X N _ sx)) x memarg) is valid with the instruction type [at] -> [V128] if: - the memory type C.MEMS[x] exists. - C.MEMS[x] is at lim PAGE. - (2 ^ memarg.ALIGN) is less than or equal to ((M / 8) * N). @@ -27286,15 +27316,17 @@ Step_read/load nt_u1 loadop_u1? x ao 5. If the type of nt_u1 is Inn, then: a. If loadop_u1? is defined, then: 1) Let ?(loadop__0) be loadop_u1?. - 2) Let (n sx) be loadop__0. - 3) If (((i + ao.OFFSET) + (n / 8)) > |$mem(z, x).BYTES|), then: + 2) Assert: Due to validation, loadop__0 is of the case _. + 3) Let n _ sx be loadop__0. + 4) If (((i + ao.OFFSET) + (n / 8)) > |$mem(z, x).BYTES|), then: a) Trap. b. Let Inn be nt_u1. c. If loadop_u1? is defined, then: 1) Let ?(loadop__0) be loadop_u1?. - 2) Let (n sx) be loadop__0. - 3) Let c be $ibytes__1^-1(n, $mem(z, x).BYTES[(i + ao.OFFSET) : (n / 8)]). - 4) Push the value (Inn.CONST $extend__(n, $size(Inn), sx, c)) to the stack. + 2) Assert: Due to validation, loadop__0 is of the case _. + 3) Let n _ sx be loadop__0. + 4) Let c be $ibytes__1^-1(n, $mem(z, x).BYTES[(i + ao.OFFSET) : (n / 8)]). + 5) Push the value (Inn.CONST $extend__(n, $size(Inn), sx, c)) to the stack. Step_read/vload V128 vloadop_u1? x ao 1. Let z be the current state. @@ -27308,7 +27340,7 @@ Step_read/vload V128 vloadop_u1? x ao 6. Else: a. Let ?(vloadop__0) be vloadop_u1?. b. If vloadop__0 is of the case SHAPE, then: - 1) Let (SHAPE M X K sx) be vloadop__0. + 1) Let (SHAPE M X K _ sx) be vloadop__0. 2) If (((i + ao.OFFSET) + ((M * K) / 8)) > |$mem(z, x).BYTES|), then: a) Trap. 3) Let j^K be $ibytes__1^-1(M, $mem(z, x).BYTES[((i + ao.OFFSET) + ((k * M) / 8)) : (M / 8)])^(k<K). @@ -27395,14 +27427,14 @@ Step_read/memory.copy x_1 x_2 a. If (i_1 <= i_2), then: 1) Push the value (at_1.CONST i_1) to the stack. 2) Push the value (at_2.CONST i_2) to the stack. - 3) Execute the instruction (LOAD I32 ?((8 U)) x_2 $memarg0()). + 3) Execute the instruction (LOAD I32 ?(8 _ U) x_2 $memarg0()). 4) Execute the instruction (STORE I32 ?(8) x_1 $memarg0()). 5) Push the value (at_1.CONST (i_1 + 1)) to the stack. 6) Push the value (at_2.CONST (i_2 + 1)) to the stack. b. Else: 1) Push the value (at_1.CONST ((i_1 + n) - 1)) to the stack. 2) Push the value (at_2.CONST ((i_2 + n) - 1)) to the stack. - 3) Execute the instruction (LOAD I32 ?((8 U)) x_2 $memarg0()). + 3) Execute the instruction (LOAD I32 ?(8 _ U) x_2 $memarg0()). 4) Execute the instruction (STORE I32 ?(8) x_1 $memarg0()). 5) Push the value (at_1.CONST i_1) to the stack. 6) Push the value (at_2.CONST i_2) to the stack. @@ -27731,6 +27763,9 @@ ARRAYREF FUNCREF 1. Return (REF ?(NULL) FUNC). +EXNREF +1. Return (REF ?(NULL) EXTERN). + EXTERNREF 1. Return (REF ?(NULL) EXTERN). @@ -27740,6 +27775,9 @@ NULLREF NULLFUNCREF 1. Return (REF ?(NULL) NOFUNC). +NULLEXNREF +1. Return (REF ?(NULL) NOEXN). + NULLEXTERNREF 1. Return (REF ?(NULL) NOEXTERN). diff --git a/spectec/test-splice/TEST.md b/spectec/test-splice/TEST.md index bc67e855ea..8320d2f4f4 100644 --- a/spectec/test-splice/TEST.md +++ b/spectec/test-splice/TEST.md @@ -1180,6 +1180,7 @@ warning: definition `ANYREF` was never spliced warning: definition `ARRAYREF` was never spliced warning: definition `E` was never spliced warning: definition `EQREF` was never spliced +warning: definition `EXNREF` was never spliced warning: definition `EXTERNREF` was never spliced warning: definition `FN` was never spliced warning: definition `FUNCREF` was never spliced @@ -1189,6 +1190,7 @@ warning: definition `JN` was never spliced warning: definition `Ki` was never spliced warning: definition `M` was never spliced warning: definition `ND` was never spliced +warning: definition `NULLEXNREF` was never spliced warning: definition `NULLEXTERNREF` was never spliced warning: definition `NULLFUNCREF` was never spliced warning: definition `NULLREF` was never spliced @@ -1980,7 +1982,9 @@ warning: definition prose `ANYREF` was never spliced warning: definition prose `ARRAYREF` was never spliced warning: definition prose `E` was never spliced warning: definition prose `EQREF` was never spliced +warning: definition prose `EXNREF` was never spliced warning: definition prose `EXTERNREF` was never spliced +warning: definition prose `Eval_expr` was never spliced warning: definition prose `FN` was never spliced warning: definition prose `FUNCREF` was never spliced warning: definition prose `I31REF` was never spliced @@ -1988,6 +1992,7 @@ warning: definition prose `IN` was never spliced warning: definition prose `JN` was never spliced warning: definition prose `Ki` was never spliced warning: definition prose `M` was never spliced +warning: definition prose `NULLEXNREF` was never spliced warning: definition prose `NULLEXTERNREF` was never spliced warning: definition prose `NULLFUNCREF` was never spliced warning: definition prose `NULLREF` was never spliced @@ -2041,7 +2046,6 @@ warning: definition prose `dim` was never spliced warning: definition prose `disjoint_` was never spliced warning: definition prose `elem` was never spliced warning: definition prose `eleminst` was never spliced -warning: definition prose `eval_expr` was never spliced warning: definition prose `evalglobals` was never spliced warning: definition prose `exninst` was never spliced warning: definition prose `expanddt` was never spliced From db4f6fb5db5b9c53a42addccfb50ccce6a7bad48 Mon Sep 17 00:00:00 2001 From: 702fbtngus <702fbtngus@kaist.ac.kr> Date: Tue, 14 Jan 2025 17:39:50 +0900 Subject: [PATCH 12/12] Update TEST.md --- spectec/test-prose/TEST.md | 42 +++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index f3462f39e5..5282351456 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -467,7 +467,7 @@ The instruction :math:`({t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{.}\mathsf{loa * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`{M}{\mathsf{\_}}{{\mathit{sx}}}`. + * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`{M}{\mathsf{\_}}{{\mathit{sx}}}`. * The number type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 3}}}` is equal to :math:`{\mathsf{i}}{n}`. @@ -1388,9 +1388,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. - #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: @@ -1402,9 +1402,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. - #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. @@ -5092,7 +5092,7 @@ The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{. * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. - * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`{M}{\mathsf{\_}}{{\mathit{sx}}}`. + * :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`{M}{\mathsf{\_}}{{\mathit{sx}}}`. * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{n}`. @@ -5140,7 +5140,7 @@ The instruction :math:`(\mathsf{v{\scriptstyle 128}}{.}\mathsf{load}~{\mathit{vl * Either: - * :math:`{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({M}{\mathsf{x}}{N}{\mathsf{\_}}{{\mathit{sx}}})`. + * :math:`{\mathit{vloadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`({M}{\mathsf{x}}{N}{\mathsf{\_}}{{\mathit{sx}}})`. * :math:`{2^{{\mathit{memarg}}{.}\mathsf{align}}}` is less than or equal to :math:`M / 8 \cdot N`. @@ -6892,9 +6892,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. - #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: @@ -6906,9 +6906,9 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop\_u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. - #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. @@ -6941,7 +6941,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #. If :math:`{\mathit{vloadop}}_0` is of the case :math:`\mathsf{shape}`, then: - 1) Let :math:`({M}{\mathsf{x}}{N}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vloadop}}_0`. + 1) Let :math:`({M}{\mathsf{x}}{N}{\mathsf{\_}}{{\mathit{sx}}})` be :math:`{\mathit{vloadop}}_0`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + M \cdot N / 8 > {|z{.}\mathsf{mems}{}[0]{.}\mathsf{bytes}|}`, then: @@ -7115,7 +7115,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}})`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}})`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. @@ -7129,7 +7129,7 @@ The module :math:`(\mathsf{module}~{{\mathit{type}}^\ast}~{{\mathit{import}}^\as #) Push the value :math:`(\mathsf{i{\scriptstyle 32}}{.}\mathsf{const}~i + n - 1)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}})`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}})`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8})`. @@ -15142,7 +15142,7 @@ The instruction :math:`({{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}{. * The number type :math:`{\mathit{nt}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. - * :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`{M}{\mathsf{\_}}{{\mathit{sx}}}`. + * :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}` is equal to :math:`{M}{\mathsf{\_}}{{\mathit{sx}}}`. * The value type :math:`t_{\mathit{u{\kern-0.1em\scriptstyle 1}}}` is equal to :math:`{\mathsf{i}}{N}`. @@ -18422,9 +18422,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. - #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) If :math:`i + {\mathit{ao}}{.}\mathsf{offset} + n / 8 > {|z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}|}`, then: @@ -18436,9 +18436,9 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1) Let :math:`{\mathit{loadop\_{\scriptstyle 0}}}` be :math:`{{\mathit{loadop}}_{\mathit{u{\kern-0.1em\scriptstyle 1}}}^?}`. - #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. + #) Assert: Due to validation, :math:`{\mathit{loadop\_{\scriptstyle 0}}}` is of the case :math:`\mathsf{\_}`. - #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. + #) Let :math:`{n}{\mathsf{\_}}{{\mathit{sx}}}` be :math:`{\mathit{loadop\_{\scriptstyle 0}}}`. #) Let :math:`c` be the result for which :math:`{{\mathrm{bytes}}}_{{\mathsf{i}}{n}}(c)` :math:`=` :math:`z{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i + {\mathit{ao}}{.}\mathsf{offset} : n / 8]`. @@ -18649,7 +18649,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}}~x_2)`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}}~x_2)`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1)`. @@ -18663,7 +18663,7 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i #) Push the value :math:`({\mathit{at}}_2{.}\mathsf{const}~i_2 + n - 1)` to the stack. - #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}}~x_2)`. + #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{load}}{{8}{\mathsf{\_}}{\mathsf{u}}}~x_2)`. #) Execute the instruction :math:`({\mathsf{i{\scriptstyle 32}}{.}\mathsf{store}}{8}~x_1)`.