@@ -17,7 +17,9 @@ Sign extension instructions
17
17
18
18
Added new numeric instructions for performing sign extension within integer representations [#proposal-signext ]_.
19
19
20
- * New :ref: `numeric instructions <syntax-instr-numeric >`: :math: `\K {i}\X {nn}\K {.}\EXTEND\X {N}\K {\_s}`
20
+ * New :ref: `numeric instructions <syntax-instr-numeric >`:
21
+
22
+ - :math: `\K {i}\X {nn}\K {.}\EXTEND\X {N}\K {\_s}`
21
23
22
24
23
25
.. index :: instruction, trap, floating-point, integer
@@ -27,7 +29,9 @@ Non-trapping float-to-int conversions
27
29
28
30
Added new conversion instructions that avoid trapping when converting a floating-point number to an integer [#proposal-cvtsat ]_.
29
31
30
- * New :ref: `numeric instructions <syntax-instr-numeric >`: :math: `\K {i}\X {nn}\K {.}\TRUNC\K {\_sat\_f}\X {mm}\K {\_ }\sx `
32
+ * New :ref: `numeric instructions <syntax-instr-numeric >`:
33
+
34
+ - :math: `\K {i}\X {nn}\K {.}\TRUNC\K {\_sat\_f}\X {mm}\K {\_ }\sx `
31
35
32
36
33
37
.. index :: block, function, value type, result type
@@ -49,11 +53,20 @@ Reference types
49
53
50
54
Added |FUNCREF | and |EXTERNREF | as new value types and respective instructions [#proposal-reftype ]_.
51
55
52
- * New :ref: `value types <syntax-valtype >`: :ref: `reference types <syntax-reftype >` |FUNCREF | and |EXTERNREF |
56
+ * New :ref: `reference <syntax-reftype >` :ref: `value types <syntax-valtype >`:
57
+
58
+ - |FUNCREF |
59
+ - |EXTERNREF |
53
60
54
- * New :ref: `reference instructions <syntax-instr-ref >`: | REFNULL |, | REFFUNC |, | REFISNULL |
61
+ * New :ref: `reference instructions <syntax-instr-ref >`:
55
62
56
- * Enrich :ref: `parametric instruction <syntax-instr-parametric >`: |SELECT | with optional type immediate
63
+ - |REFNULL |
64
+ - |REFFUNC |
65
+ - |REFISNULL |
66
+
67
+ * Enrich :ref: `parametric instruction <syntax-instr-parametric >`:
68
+
69
+ - |SELECT | with optional type immediate
57
70
58
71
* New :ref: `declarative <syntax-elemmode >` form of :ref: `element segment <syntax-elem >`
59
72
@@ -67,7 +80,12 @@ Added instructions to directly access and modify tables [#proposal-reftype]_.
67
80
68
81
* :ref: `Table types <syntax-tabletype >` allow any :ref: `reference type <syntax-reftype >` as element type
69
82
70
- * New :ref: `table instructions <syntax-instr-table >`: |TABLEGET |, |TABLESET |, |TABLESIZE |, |TABLEGROW |
83
+ * New :ref: `table instructions <syntax-instr-table >`:
84
+
85
+ - |TABLEGET |
86
+ - |TABLESET |
87
+ - |TABLESIZE |
88
+ - |TABLEGROW |
71
89
72
90
73
91
.. index :: table, instruction, table index, element segment
@@ -77,9 +95,19 @@ Multiple tables
77
95
78
96
Added the ability to use multiple tables per module [#proposal-reftype ]_.
79
97
80
- * :ref: `Modules <syntax-module >` may :ref: ` define < syntax-table >`, :ref: ` import < syntax-import >`, and :ref: ` export < syntax-export >` multiple tables
98
+ * :ref: `Modules <syntax-module >` may
81
99
82
- * :ref: `Table instructions <syntax-instr-table >` take a :ref: `table index <syntax-tableidx >` immediate: |TABLEGET |, |TABLESET |, |TABLESIZE |, |TABLEGROW |, |CALLINDIRECT |
100
+ - :ref: `define <syntax-table >` multiple tables
101
+ - :ref: `import <syntax-import >` multiple tables
102
+ - :ref: `export <syntax-export >` multiple tables
103
+
104
+ * :ref: `Table instructions <syntax-instr-table >` take a :ref: `table index <syntax-tableidx >` immediate:
105
+
106
+ - |TABLEGET |
107
+ - |TABLESET |
108
+ - |TABLESIZE |
109
+ - |TABLEGROW |
110
+ - |CALLINDIRECT |
83
111
84
112
* :ref: `Element segments <syntax-elem >` take a :ref: `table index <syntax-tableidx >`
85
113
@@ -91,9 +119,19 @@ Bulk memory and table instructions
91
119
92
120
Added instructions that modify ranges of memory or table entries [#proposal-reftype ]_ [#proposal-bulk ]_
93
121
94
- * New :ref: `memory instructions <syntax-instr-memory >`: |MEMORYFILL |, |MEMORYINIT |, |MEMORYCOPY |, |DATADROP |
122
+ * New :ref: `memory instructions <syntax-instr-memory >`:
123
+
124
+ - |MEMORYFILL |
125
+ - |MEMORYINIT |
126
+ - |MEMORYCOPY |
127
+ - |DATADROP |
95
128
96
- * New :ref: `table instructions <syntax-instr-table >`: |TABLEFILL |, |TABLEINIT |, |TABLECOPY |, |ELEMDROP |
129
+ * New :ref: `table instructions <syntax-instr-table >`:
130
+
131
+ - |TABLEFILL |
132
+ - |TABLEINIT |
133
+ - |TABLECOPY |
134
+ - |ELEMDROP |
97
135
98
136
* New :ref: `passive <syntax-datamode >` form of :ref: `data segment <syntax-data >`
99
137
@@ -109,33 +147,128 @@ Added instructions that modify ranges of memory or table entries [#proposal-reft
109
147
Vector instructions
110
148
...................
111
149
112
- Added vector type and instructions that manipulate multiple numeric values in parallel (also known as *SIMD *, single instruction multiple data) [#proposal-vectype ]_
113
-
114
- * New :ref: `value type <syntax-valtype >`: |V128 |
115
-
116
- * New :ref: `memory instructions <syntax-instr-memory >`: :math: `\K {v128 .}\LOAD `, :math: `\K {v128 .}\LOAD {}\! N\!\K {x}\! M\!\K {\_ }\sx `, :math: `\K {v128 .}\LOAD {}N\K {\_zero}`, :math: `\K {v128 .}\LOAD {}N\K {\_splat}`, :math: `\K {v128 .}\LOAD {}N\K {\_lane}`, :math: `\K {v128 .}\STORE `, :math: `\K {v128 .}\STORE {}N\K {\_lane}`
117
-
118
- * New constant :ref: `vector instruction <syntax-instr-vec >`: :math: `\K {v128 .}\VCONST `
119
-
120
- * New unary :ref: `vector instructions <syntax-instr-vec >`: :math: `\K {v128 .not}`, :math: `\K {i}\! N\!\K {x}\! M\!\K {.abs}`, :math: `\K {i}\! N\!\K {x}\! M\!\K {.neg}`, :math: `\K {i8 x16 .popcnt}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.abs}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.neg}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.sqrt}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.ceil}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.floor}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.trunc}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.nearest}`
121
-
122
- * New binary :ref:`vector instructions <syntax-instr-vec>`: :math:`\K{v128.and}`, :math:`\K{v128.andnot}`, :math:`\K{v128.or}`, :math:`\K{v128.xor}`, :math:`\K{i}\!N\!\K{x}\!M\!\K{.add}`, :math:`\K{i}\!N\!\K{x}\!M\!\K{.sub}`, :math:`\K{i}\!N\!\K{x}\!M\!\K{.mul}`, :math:`\K{i}\!N\!\K{x}\!M\!\K{.add\_sat\_}\sx`, :math:`\K{i}\!N\!\K{x}\!M\!\K{.sub\_sat\_}\sx`, :math:`\K{i}\!N\!\K{x}\!M\!\K{.min\_}\sx`, :math:`\K{i}\!N\!\K{x}\!M\!\K{.max\_}\sx`, :math:`\K{i}\!N\!\K{x}\!M\!\K{.shl}`, :math:`\K{i}\!N\!\K{x}\!M\!\K{.shr\_}\sx`, :math:`\K{f}\!N\!\K{x}\!M\!\K{.add}`, :math:`\K{i}\!N\!\K{x}\!M\!\K{.extmul\_}\half\K{\_i}\!N'\!\K{x}\!M'\!\K{\_}\sx`, :math:`\K{i16x8.q15mulr\_sat\_s}`, :math:`\K{i32x4.dot\_i16x8\_s}`, :math:`\K{i16x8.extadd\_pairwise\_i8x16\_}\sx`, :math:`\K{i32x4.extadd\_pairwise\_i16x8\_}\sx`, :math:`\K{i8x16.avgr\_u}`, :math:`\K{i16x8.avgr\_u}`, :math:`\K{f}\!N\!\K{x}\!M\!\K{.sub}`, :math:`\K{f}\!N\!\K{x}\!M\!\K{.mul}`, :math:`\K{f}\!N\!\K{x}\!M\!\K{.div}`, :math:`\K{f}\!N\!\K{x}\!M\!\K{.min}`, :math:`\K{f}\!N\!\K{x}\!M\!\K{.max}`, :math:`\K{f}\!N\!\K{x}\!M\!\K{.pmin}`, :math:`\K{f}\!N\!\K{x}\!M\!\K{.pmax}`
123
-
124
- * New ternary :ref: `vector instruction <syntax-instr-vec >`: :math: `\K {v128 .bitselect}`
125
-
126
- * New test :ref: `vector instructions <syntax-instr-vec >`: :math: `\K {v128 .any\_true}`, :math: `\K {i}\! N\!\K {x}\! M\!\K {.all\_true}`
127
-
128
- * New relational :ref: `vector instructions <syntax-instr-vec >`: :math: `\K {i}\! N\!\K {x}\! M\!\K {.eq}`, :math: `\K {i}\! N\!\K {x}\! M\!\K {.ne}`, :math: `\K {i}\! N\!\K {x}\! M\!\K {.lt\_ }\sx `, :math: `\K {i}\! N\!\K {x}\! M\!\K {.gt\_ }\sx `, :math: `\K {i}\! N\!\K {x}\! M\!\K {.le\_ }\sx `, :math: `\K {i}\! N\!\K {x}\! M\!\K {.ge\_ }\sx `, :math: `\K {f}\! N\!\K {x}\! M\!\K {.eq}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.ne}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.lt}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.gt}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.le}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.ge}`
129
-
130
- * New conversion :ref: `vector instructions <syntax-instr-vec >`::math: `\K {i32 x4 .trunc\_sat\_f32 x4 \_ }\sx `, :math: `\K {i32 x4 .trunc\_sat\_f64 x2 \_ }\sx\K {\_zero}`, :math: `\K {f32 x4 .convert\_i32 x4 \_ }\sx `, :math: `\K {f32 x4 .demote\_f64 x2 \_zero}`, :math: `\K {f64 x2 .convert\_low\_i32 x4 \_ }\sx `, :math: `\K {f64 x2 .promote\_low\_f32 x4 }`
131
-
132
- * New lane access :ref: `vector instructions <syntax-instr-vec >`: :math: `\K {i}\! N\!\K {x}\! M\!\K {.extract\_lane\_ }\sx ^?`, :math: `\K {i}\! N\!\K {x}\! M\!\K {.replace\_lane}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.extract\_lane}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.replace\_lane}`
133
-
134
- * New lane splitting/combining :ref: `vector instructions <syntax-instr-vec >`: :math: `\K {i}\! N\!\K {x}\! M\!\K {.extend\_ }\half\K {\_i}\! N'\!\K {x}\! M'\!\K {\_ }\sx `, :math: `\K {i8 x16 .narrow\_i16 x8 \_ }\sx `, :math: `\K {i16 x8 .narrow\_i32 x4 \_ }\sx `
135
-
136
- * New byte reordering :ref: `vector instructions <syntax-instr-vec >`: :math: `\K {i8 x16 .shuffle}`, :math: `\K {i8 x16 .swizzle}`
137
-
138
- * New injection/projection :ref: `vector instructions <syntax-instr-vec >`: :math: `\K {i}\! N\!\K {x}\! M\!\K {.splat}`, :math: `\K {f}\! N\!\K {x}\! M\!\K {.splat}`, :math: `\K {i}\! N\!\K {x}\! M\!\K {.bitmask}`
150
+ Added vector type and instructions that manipulate multiple numeric values in parallel
151
+ (also known as *SIMD *, single instruction multiple data) [#proposal-vectype ]_
152
+
153
+ * New :ref: `value type <syntax-valtype >`:
154
+
155
+ - |V128 |
156
+
157
+ * New :ref: `memory instructions <syntax-instr-memory >`:
158
+
159
+ - :math: `\K {v128 .}\LOAD `
160
+ - :math: `\K {v128 .}\LOAD {}\! N\!\K {x}\! M\!\K {\_ }\sx `
161
+ - :math: `\K {v128 .}\LOAD {}N\K {\_zero}`
162
+ - :math: `\K {v128 .}\LOAD {}N\K {\_splat}`
163
+ - :math: `\K {v128 .}\LOAD {}N\K {\_lane}`
164
+ - :math: `\K {v128 .}\STORE `
165
+ - :math: `\K {v128 .}\STORE {}N\K {\_lane}`
166
+
167
+ * New constant :ref: `vector instruction <syntax-instr-vec >`:
168
+
169
+ - :math: `\K {v128 .}\VCONST `
170
+
171
+ * New unary :ref: `vector instructions <syntax-instr-vec >`:
172
+
173
+ - :math: `\K {v128 .not}`
174
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.abs}`
175
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.neg}`
176
+ - :math: `\K {i8 x16 .popcnt}`
177
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.abs}`
178
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.neg}`
179
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.sqrt}`
180
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.ceil}`
181
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.floor}`
182
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.trunc}`
183
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.nearest}`
184
+
185
+ * New binary :ref: `vector instructions <syntax-instr-vec >`:
186
+
187
+ - :math: `\K {v128 .and}`
188
+ - :math: `\K {v128 .andnot}`
189
+ - :math: `\K {v128 .or}`
190
+ - :math: `\K {v128 .xor}`
191
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.add}`
192
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.sub}`
193
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.mul}`
194
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.add\_sat\_ }\sx `
195
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.sub\_sat\_ }\sx `
196
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.min\_ }\sx `
197
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.max\_ }\sx `
198
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.shl}`
199
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.shr\_ }\sx `
200
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.add}`
201
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.sub}`
202
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.mul}`
203
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.div}`
204
+ - :math: `\K {i16 x8 .extadd\_pairwise\_i8 x16 \_ }\sx `
205
+ - :math: `\K {i32 x4 .extadd\_pairwise\_i16 x8 \_ }\sx `
206
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.extmul\_ }\half\K {\_i}\! N'\!\K {x}\! M'\!\K {\_ }\sx `
207
+ - :math: `\K {i16 x8 .q15 mulr\_sat\_s}`
208
+ - :math: `\K {i32 x4 .dot\_i16 x8 \_s}`
209
+ - :math: `\K {i8 x16 .avgr\_u}`
210
+ - :math: `\K {i16 x8 .avgr\_u}`
211
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.min}`
212
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.max}`
213
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.pmin}`
214
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.pmax}`
215
+
216
+ * New ternary :ref: `vector instruction <syntax-instr-vec >`:
217
+
218
+ - :math: `\K {v128 .bitselect}`
219
+
220
+ * New test :ref: `vector instructions <syntax-instr-vec >`:
221
+
222
+ - :math: `\K {v128 .any\_true}`
223
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.all\_true}`
224
+
225
+ * New relational :ref: `vector instructions <syntax-instr-vec >`:
226
+
227
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.eq}`
228
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.ne}`
229
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.lt\_ }\sx `
230
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.gt\_ }\sx `
231
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.le\_ }\sx `
232
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.ge\_ }\sx `
233
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.eq}`
234
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.ne}`
235
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.lt}`
236
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.gt}`
237
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.le}`
238
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.ge}`
239
+
240
+ * New conversion :ref: `vector instructions <syntax-instr-vec >`:
241
+
242
+ - :math: `\K {i32 x4 .trunc\_sat\_f32 x4 \_ }\sx `
243
+ - :math: `\K {i32 x4 .trunc\_sat\_f64 x2 \_ }\sx\K {\_zero}`
244
+ - :math: `\K {f32 x4 .convert\_i32 x4 \_ }\sx `
245
+ - :math: `\K {f32 x4 .demote\_f64 x2 \_zero}`
246
+ - :math: `\K {f64 x2 .convert\_low\_i32 x4 \_ }\sx `
247
+ - :math: `\K {f64 x2 .promote\_low\_f32 x4 }`
248
+
249
+ * New lane access :ref: `vector instructions <syntax-instr-vec >`:
250
+
251
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.extract\_lane\_ }\sx ^?`
252
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.replace\_lane}`
253
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.extract\_lane}`
254
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.replace\_lane}`
255
+
256
+ * New lane splitting/combining :ref: `vector instructions <syntax-instr-vec >`:
257
+
258
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.extend\_ }\half\K {\_i}\! N'\!\K {x}\! M'\!\K {\_ }\sx `
259
+ - :math: `\K {i8 x16 .narrow\_i16 x8 \_ }\sx `
260
+ - :math: `\K {i16 x8 .narrow\_i32 x4 \_ }\sx `
261
+
262
+ * New byte reordering :ref: `vector instructions <syntax-instr-vec >`:
263
+
264
+ - :math: `\K {i8 x16 .shuffle}`
265
+ - :math: `\K {i8 x16 .swizzle}`
266
+
267
+ * New injection/projection :ref: `vector instructions <syntax-instr-vec >`:
268
+
269
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.splat}`
270
+ - :math: `\K {f}\! N\!\K {x}\! M\!\K {.splat}`
271
+ - :math: `\K {i}\! N\!\K {x}\! M\!\K {.bitmask}`
139
272
140
273
141
274
.. [#proposal-signext ]
0 commit comments