|
| 1 | +;; |
| 2 | +;; Syntax of Values |
| 3 | +;; |
| 4 | + |
| 5 | +;; Integers |
| 6 | + |
| 7 | +syntax bit hint(desc "bit") = 0 | 1 |
| 8 | +syntax byte hint(desc "byte") = 0x00 | ... | 0xFF |
| 9 | + |
| 10 | +syntax uN(N) hint(desc "unsigned integer") hint(show u#%) hint(macro "uNX") = |
| 11 | + 0 | ... | $nat$(2^N-1) |
| 12 | +syntax sN(N) hint(desc "signed integer") hint(show s#%) hint(macro "sNX") = |
| 13 | + -2^(N-1) | ... | -1 | 0 | +1 | ... | +2^(N-1)-1 |
| 14 | +syntax iN(N) hint(desc "integer") hint(show i#%) hint(macro "iNX") = |
| 15 | + uN(N) |
| 16 | + |
| 17 | +syntax u8 = uN(`8) |
| 18 | +syntax u16 = uN(`16) |
| 19 | +syntax u31 = uN(`31) |
| 20 | +syntax u32 = uN(`32) |
| 21 | +syntax u64 = uN(`64) |
| 22 | +syntax s33 = sN(`33) |
| 23 | +syntax i32 = iN(`32) |
| 24 | +syntax i64 = iN(`64) |
| 25 | +syntax i128 = iN(`128) |
| 26 | + |
| 27 | +var b : byte |
| 28 | + |
| 29 | + |
| 30 | +;; Floating-point |
| 31 | + |
| 32 | +def $signif(N) : nat |
| 33 | +def $signif(32) = 23 |
| 34 | +def $signif(64) = 52 |
| 35 | + |
| 36 | +def $expon(N) : nat |
| 37 | +def $expon(32) = 8 |
| 38 | +def $expon(64) = 11 |
| 39 | + |
| 40 | +def $M(N) : nat hint(show `M) hint(macro none) |
| 41 | +def $M(N) = $signif(N) |
| 42 | + |
| 43 | +def $E(N) : nat hint(show `E) hint(macro none) |
| 44 | +def $E(N) = $expon(N) |
| 45 | + |
| 46 | +syntax fN(N) hint(desc "floating-point number") hint(show f#%) hint(macro "fNX") = |
| 47 | + | POS fNmag(N) hint(show $(+%)) \ |
| 48 | + | NEG fNmag(N) hint(show $(-%)) |
| 49 | + |
| 50 | +syntax exp hint(show e) hint(macro none) = int |
| 51 | +syntax fNmag(N) hint(desc "floating-point magnitude") hint(show fNmag) = |
| 52 | + | NORM m exp hint(show $((1 + %*2^(-$M(N))) * 2^%)) -- if $(m < 2^$M(N) /\ 2-2^($E(N)-1) <= exp <= 2^($E(N)-1)-1) |
| 53 | + | SUBNORM m hint(show $((0 + %*2^(-$M(N))) * 2^exp)) -- if $(m < 2^$M(N) /\ 2-2^($E(N)-1) = exp) |
| 54 | + | INF hint(show infinity) |
| 55 | + | NAN (m) hint(show NAN#(%)) -- if $(1 <= m < 2^$M(N)) |
| 56 | + |
| 57 | +syntax f32 = fN(`32) |
| 58 | +syntax f64 = fN(`64) |
| 59 | + |
| 60 | +def $fzero(N) : fN(N) hint(show $(+0)) |
| 61 | +def $fzero(N) = POS (SUBNORM 0) |
| 62 | + |
| 63 | +def $fnat(N, nat) : fN(N) hint(show $(+%)) |
| 64 | +def $fnat(N, n) = POS (NORM n 0) |
| 65 | + |
| 66 | +def $fone(N) : fN(N) hint(show $(+1)) |
| 67 | +def $fone(N) = POS (NORM 1 0) |
| 68 | + |
| 69 | +def $canon_(N) : nat |
| 70 | +def $canon_(N) = $(2^($signif(N)-1)) |
| 71 | + |
| 72 | + |
| 73 | +;; Vectors |
| 74 | + |
| 75 | +syntax vN(N) hint(desc "vector") hint(show v#%) hint(macro "vNX") = |
| 76 | + uN(N) |
| 77 | + |
| 78 | +syntax v128 = vN(`128) |
| 79 | + |
| 80 | + |
| 81 | +;; Lists |
| 82 | + |
| 83 | +;; TODO(3, rossberg): enable writing X^n |
| 84 | +syntax list(syntax X) = X* -- if |X*| < $(2^32) |
| 85 | + |
| 86 | + |
| 87 | +;; Names |
| 88 | + |
| 89 | +syntax char hint(desc "character") = U+0000 | ... | U+D7FF | U+E000 | ... | U+10FFFF |
| 90 | + |
| 91 | +def $utf8(char*) : byte* |
| 92 | + |
| 93 | +syntax name hint(desc "name") = char* -- if |$utf8(char*)| < $(2^32) |
| 94 | + |
| 95 | +var nm : name |
| 96 | + |
| 97 | + |
| 98 | +;; Indices |
| 99 | + |
| 100 | +syntax idx hint(desc "index") = u32 |
| 101 | +syntax laneidx hint(desc "lane index") = u8 |
| 102 | + |
| 103 | +syntax typeidx hint(desc "type index") = idx |
| 104 | +syntax funcidx hint(desc "function index") = idx |
| 105 | +syntax globalidx hint(desc "global index") = idx |
| 106 | +syntax tableidx hint(desc "table index") = idx |
| 107 | +syntax memidx hint(desc "memory index") = idx |
| 108 | +syntax tagidx hint(desc "tag index") = idx |
| 109 | +syntax elemidx hint(desc "elem index") = idx |
| 110 | +syntax dataidx hint(desc "data index") = idx |
| 111 | +syntax labelidx hint(desc "label index") = idx |
| 112 | +syntax localidx hint(desc "local index") = idx |
| 113 | +syntax fieldidx hint(desc "field index") = idx |
| 114 | + |
| 115 | +syntax externidx hint(desc "external index") hint(macro "%" "XX%") = |
| 116 | + | FUNC funcidx | GLOBAL globalidx | TABLE tableidx | MEM memidx | TAG tagidx |
| 117 | + |
| 118 | +var x : idx |
| 119 | +var y : idx |
| 120 | +var l : labelidx |
| 121 | +var xx : externidx |
| 122 | +var x33 : s33 hint(show x) |
| 123 | + |
| 124 | + |
| 125 | +;; Sort projection |
| 126 | + |
| 127 | +;; TODO(3, rossberg): add built-in notation for comprehensions? |
| 128 | + |
| 129 | +def $funcsxx(externidx*) : typeidx* hint(show $funcs(%)) hint(macro "funcsxx") |
| 130 | +def $globalsxx(externidx*) : globalidx* hint(show $globals(%)) hint(macro "globalsxx") |
| 131 | +def $tablesxx(externidx*) : tableidx* hint(show $tables(%)) hint(macro "tablesxx") |
| 132 | +def $memsxx(externidx*) : memidx* hint(show $mems(%)) hint(macro "memsxx") |
| 133 | +def $tagsxx(externidx*) : tagidx* hint(show $tags(%)) hint(macro "tagsxx") |
| 134 | + |
| 135 | +def $funcsxx(eps) = eps |
| 136 | +def $funcsxx((FUNC x) xx*) = x $funcsxx(xx*) |
| 137 | +def $funcsxx(externidx xx*) = $funcsxx(xx*) -- otherwise |
| 138 | + |
| 139 | +def $globalsxx(eps) = eps |
| 140 | +def $globalsxx((GLOBAL x) xx*) = x $globalsxx(xx*) |
| 141 | +def $globalsxx(externidx xx*) = $globalsxx(xx*) -- otherwise |
| 142 | + |
| 143 | +def $tablesxx(eps) = eps |
| 144 | +def $tablesxx((TABLE x) xx*) = x $tablesxx(xx*) |
| 145 | +def $tablesxx(externidx xx*) = $tablesxx(xx*) -- otherwise |
| 146 | + |
| 147 | +def $memsxx(eps) = eps |
| 148 | +def $memsxx((MEM x) xx*) = x $memsxx(xx*) |
| 149 | +def $memsxx(externidx xx*) = $memsxx(xx*) -- otherwise |
| 150 | + |
| 151 | +def $tagsxx(eps) = eps |
| 152 | +def $tagsxx((TAG x) xx*) = x $tagsxx(xx*) |
| 153 | +def $tagsxx(externidx xx*) = $tagsxx(xx*) -- otherwise |
| 154 | + |
| 155 | + |
| 156 | +;; Free indices |
| 157 | + |
| 158 | +syntax free = |
| 159 | + { TYPES typeidx*, |
| 160 | + FUNCS funcidx*, |
| 161 | + GLOBALS globalidx*, |
| 162 | + TABLES tableidx*, |
| 163 | + MEMS memidx*, |
| 164 | + ELEMS elemidx*, |
| 165 | + DATAS dataidx*, |
| 166 | + LOCALS localidx*, |
| 167 | + LABELS labelidx* |
| 168 | + } |
| 169 | + |
| 170 | + |
| 171 | +def $free_opt(free?) : free |
| 172 | +def $free_list(free*) : free |
| 173 | + |
| 174 | +def $free_opt(eps) = {} |
| 175 | +def $free_opt(free) = free |
| 176 | + |
| 177 | +def $free_list(eps) = {} |
| 178 | +def $free_list(free free'*) = free ++ $free_list(free'*) |
| 179 | + |
| 180 | + |
| 181 | +def $free_typeidx(typeidx) : free |
| 182 | +def $free_funcidx(funcidx) : free |
| 183 | +def $free_globalidx(globalidx) : free |
| 184 | +def $free_tableidx(tableidx) : free |
| 185 | +def $free_memidx(memidx) : free |
| 186 | +def $free_elemidx(elemidx) : free |
| 187 | +def $free_dataidx(dataidx) : free |
| 188 | +def $free_localidx(localidx) : free |
| 189 | +def $free_labelidx(labelidx) : free |
| 190 | +def $free_externidx(externidx) : free |
| 191 | + |
| 192 | +def $free_typeidx(typeidx) = {TYPES typeidx} |
| 193 | +def $free_funcidx(funcidx) = {FUNCS funcidx} |
| 194 | +def $free_globalidx(globalidx) = {GLOBALS globalidx} |
| 195 | +def $free_tableidx(tableidx) = {TABLES tableidx} |
| 196 | +def $free_memidx(memidx) = {MEMS memidx} |
| 197 | +def $free_elemidx(elemidx) = {ELEMS elemidx} |
| 198 | +def $free_dataidx(dataidx) = {DATAS dataidx} |
| 199 | +def $free_localidx(localidx) = {LOCALS localidx} |
| 200 | +def $free_labelidx(labelidx) = {LABELS labelidx} |
| 201 | + |
| 202 | +def $free_externidx(FUNC funcidx) = $free_funcidx(funcidx) |
| 203 | +def $free_externidx(GLOBAL globalidx) = $free_globalidx(globalidx) |
| 204 | +def $free_externidx(TABLE tableidx) = $free_tableidx(tableidx) |
| 205 | +def $free_externidx(MEM memidx) = $free_memidx(memidx) |
0 commit comments