Skip to content

Commit ed2c3cd

Browse files
authored
SIMD load and extend instructions (#2353)
Adds support for the new load and extend instructions. Also updates from C++11 to C++17 in order to use generic lambdas in the interpreter implementation.
1 parent 034ed38 commit ed2c3cd

29 files changed

+1136
-376
lines changed

CMakeLists.txt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ ELSE()
131131
SET(THREADS_PREFER_PTHREAD_FLAG ON)
132132
SET(CMAKE_THREAD_PREFER_PTHREAD ON)
133133
FIND_PACKAGE(Threads REQUIRED)
134-
ADD_CXX_FLAG("-std=c++11")
134+
ADD_CXX_FLAG("-std=c++17")
135135
if (NOT EMSCRIPTEN)
136136
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
137137
# wasm doesn't allow for x87 floating point math
@@ -213,7 +213,7 @@ SET(wasm-shell_SOURCES
213213
ADD_EXECUTABLE(wasm-shell
214214
${wasm-shell_SOURCES})
215215
TARGET_LINK_LIBRARIES(wasm-shell wasm asmjs emscripten-optimizer passes ir cfg support wasm)
216-
SET_PROPERTY(TARGET wasm-shell PROPERTY CXX_STANDARD 11)
216+
SET_PROPERTY(TARGET wasm-shell PROPERTY CXX_STANDARD 17)
217217
SET_PROPERTY(TARGET wasm-shell PROPERTY CXX_STANDARD_REQUIRED ON)
218218
INSTALL(TARGETS wasm-shell DESTINATION ${CMAKE_INSTALL_BINDIR})
219219

@@ -223,7 +223,7 @@ SET(wasm-opt_SOURCES
223223
ADD_EXECUTABLE(wasm-opt
224224
${wasm-opt_SOURCES})
225225
TARGET_LINK_LIBRARIES(wasm-opt wasm asmjs emscripten-optimizer passes ir cfg support wasm)
226-
SET_PROPERTY(TARGET wasm-opt PROPERTY CXX_STANDARD 11)
226+
SET_PROPERTY(TARGET wasm-opt PROPERTY CXX_STANDARD 17)
227227
SET_PROPERTY(TARGET wasm-opt PROPERTY CXX_STANDARD_REQUIRED ON)
228228
INSTALL(TARGETS wasm-opt DESTINATION ${CMAKE_INSTALL_BINDIR})
229229

@@ -233,7 +233,7 @@ SET(wasm-metadce_SOURCES
233233
ADD_EXECUTABLE(wasm-metadce
234234
${wasm-metadce_SOURCES})
235235
TARGET_LINK_LIBRARIES(wasm-metadce wasm asmjs emscripten-optimizer passes ir cfg support wasm)
236-
SET_PROPERTY(TARGET wasm-metadce PROPERTY CXX_STANDARD 11)
236+
SET_PROPERTY(TARGET wasm-metadce PROPERTY CXX_STANDARD 17)
237237
SET_PROPERTY(TARGET wasm-metadce PROPERTY CXX_STANDARD_REQUIRED ON)
238238
INSTALL(TARGETS wasm-metadce DESTINATION bin)
239239

@@ -243,7 +243,7 @@ SET(asm2wasm_SOURCES
243243
ADD_EXECUTABLE(asm2wasm
244244
${asm2wasm_SOURCES})
245245
TARGET_LINK_LIBRARIES(asm2wasm emscripten-optimizer passes wasm asmjs ir cfg support)
246-
SET_PROPERTY(TARGET asm2wasm PROPERTY CXX_STANDARD 11)
246+
SET_PROPERTY(TARGET asm2wasm PROPERTY CXX_STANDARD 17)
247247
SET_PROPERTY(TARGET asm2wasm PROPERTY CXX_STANDARD_REQUIRED ON)
248248
INSTALL(TARGETS asm2wasm DESTINATION ${CMAKE_INSTALL_BINDIR})
249249

@@ -253,7 +253,7 @@ SET(wasm2js_SOURCES
253253
ADD_EXECUTABLE(wasm2js
254254
${wasm2js_SOURCES})
255255
TARGET_LINK_LIBRARIES(wasm2js passes wasm asmjs emscripten-optimizer ir cfg support)
256-
SET_PROPERTY(TARGET wasm2js PROPERTY CXX_STANDARD 11)
256+
SET_PROPERTY(TARGET wasm2js PROPERTY CXX_STANDARD 17)
257257
SET_PROPERTY(TARGET wasm2js PROPERTY CXX_STANDARD_REQUIRED ON)
258258
INSTALL(TARGETS wasm2js DESTINATION ${CMAKE_INSTALL_BINDIR})
259259

@@ -263,7 +263,7 @@ SET(wasm-emscripten-finalize_SOURCES
263263
ADD_EXECUTABLE(wasm-emscripten-finalize
264264
${wasm-emscripten-finalize_SOURCES})
265265
TARGET_LINK_LIBRARIES(wasm-emscripten-finalize passes wasm asmjs ir cfg support)
266-
SET_PROPERTY(TARGET wasm-emscripten-finalize PROPERTY CXX_STANDARD 11)
266+
SET_PROPERTY(TARGET wasm-emscripten-finalize PROPERTY CXX_STANDARD 17)
267267
SET_PROPERTY(TARGET wasm-emscripten-finalize PROPERTY CXX_STANDARD_REQUIRED ON)
268268
INSTALL(TARGETS wasm-emscripten-finalize DESTINATION ${CMAKE_INSTALL_BINDIR})
269269

@@ -273,7 +273,7 @@ SET(wasm_as_SOURCES
273273
ADD_EXECUTABLE(wasm-as
274274
${wasm_as_SOURCES})
275275
TARGET_LINK_LIBRARIES(wasm-as wasm asmjs passes ir cfg support wasm)
276-
SET_PROPERTY(TARGET wasm-as PROPERTY CXX_STANDARD 11)
276+
SET_PROPERTY(TARGET wasm-as PROPERTY CXX_STANDARD 17)
277277
SET_PROPERTY(TARGET wasm-as PROPERTY CXX_STANDARD_REQUIRED ON)
278278
INSTALL(TARGETS wasm-as DESTINATION ${CMAKE_INSTALL_BINDIR})
279279

@@ -283,7 +283,7 @@ SET(wasm_dis_SOURCES
283283
ADD_EXECUTABLE(wasm-dis
284284
${wasm_dis_SOURCES})
285285
TARGET_LINK_LIBRARIES(wasm-dis passes wasm asmjs ir cfg support)
286-
SET_PROPERTY(TARGET wasm-dis PROPERTY CXX_STANDARD 11)
286+
SET_PROPERTY(TARGET wasm-dis PROPERTY CXX_STANDARD 17)
287287
SET_PROPERTY(TARGET wasm-dis PROPERTY CXX_STANDARD_REQUIRED ON)
288288
INSTALL(TARGETS wasm-dis DESTINATION ${CMAKE_INSTALL_BINDIR})
289289

@@ -293,7 +293,7 @@ SET(wasm-ctor-eval_SOURCES
293293
ADD_EXECUTABLE(wasm-ctor-eval
294294
${wasm-ctor-eval_SOURCES})
295295
TARGET_LINK_LIBRARIES(wasm-ctor-eval emscripten-optimizer passes wasm asmjs ir cfg support)
296-
SET_PROPERTY(TARGET wasm-ctor-eval PROPERTY CXX_STANDARD 11)
296+
SET_PROPERTY(TARGET wasm-ctor-eval PROPERTY CXX_STANDARD 17)
297297
SET_PROPERTY(TARGET wasm-ctor-eval PROPERTY CXX_STANDARD_REQUIRED ON)
298298
INSTALL(TARGETS wasm-ctor-eval DESTINATION bin)
299299

@@ -303,7 +303,7 @@ SET(wasm-reduce_SOURCES
303303
ADD_EXECUTABLE(wasm-reduce
304304
${wasm-reduce_SOURCES})
305305
TARGET_LINK_LIBRARIES(wasm-reduce wasm asmjs passes wasm ir cfg support)
306-
SET_PROPERTY(TARGET wasm-reduce PROPERTY CXX_STANDARD 11)
306+
SET_PROPERTY(TARGET wasm-reduce PROPERTY CXX_STANDARD 17)
307307
SET_PROPERTY(TARGET wasm-reduce PROPERTY CXX_STANDARD_REQUIRED ON)
308308
INSTALL(TARGETS wasm-reduce DESTINATION ${CMAKE_INSTALL_BINDIR})
309309

Contributing.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,4 @@ Use this handy checklist to make sure your new instructions are fully supported:
2828
- [ ] C API tested in test/example/c-api-kitchen-sink.c
2929
- [ ] JS API tested in test/binaryen.js/kitchen-sink.js
3030
- [ ] Tests added in test/spec
31+
- [ ] Tests added in top-level test/

build-js.sh

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ elif [ ! -d "$EMSCRIPTEN" ]; then
3737
exit 1
3838
fi
3939

40-
EMCC_ARGS="-std=c++11 --memory-init-file 0"
40+
EMCC_ARGS="-std=gnu++17 --memory-init-file 0"
4141
EMCC_ARGS="$EMCC_ARGS -s ALLOW_MEMORY_GROWTH=1"
4242
EMCC_ARGS="$EMCC_ARGS -s DEMANGLE_SUPPORT=1"
4343
EMCC_ARGS="$EMCC_ARGS -s NO_FILESYSTEM=0"
@@ -556,6 +556,12 @@ export_function "_BinaryenLoadSplatVec8x16"
556556
export_function "_BinaryenLoadSplatVec16x8"
557557
export_function "_BinaryenLoadSplatVec32x4"
558558
export_function "_BinaryenLoadSplatVec64x2"
559+
export_function "_BinaryenLoadExtSVec8x8ToVecI16x8"
560+
export_function "_BinaryenLoadExtUVec8x8ToVecI16x8"
561+
export_function "_BinaryenLoadExtSVec16x4ToVecI32x4"
562+
export_function "_BinaryenLoadExtUVec16x4ToVecI32x4"
563+
export_function "_BinaryenLoadExtSVec32x2ToVecI64x2"
564+
export_function "_BinaryenLoadExtUVec32x2ToVecI64x2"
559565
export_function "_BinaryenNarrowSVecI16x8ToVecI8x16"
560566
export_function "_BinaryenNarrowUVecI16x8ToVecI8x16"
561567
export_function "_BinaryenNarrowSVecI32x4ToVecI16x8"

scripts/gen-s-parser.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,12 @@
434434
("v16x8.load_splat", "makeSIMDLoad(s, SIMDLoadOp::LoadSplatVec16x8)"),
435435
("v32x4.load_splat", "makeSIMDLoad(s, SIMDLoadOp::LoadSplatVec32x4)"),
436436
("v64x2.load_splat", "makeSIMDLoad(s, SIMDLoadOp::LoadSplatVec64x2)"),
437+
("i16x8.load8x8_s", "makeSIMDLoad(s, SIMDLoadOp::LoadExtSVec8x8ToVecI16x8)"),
438+
("i16x8.load8x8_u", "makeSIMDLoad(s, SIMDLoadOp::LoadExtUVec8x8ToVecI16x8)"),
439+
("i32x4.load16x4_s", "makeSIMDLoad(s, SIMDLoadOp::LoadExtSVec16x4ToVecI32x4)"),
440+
("i32x4.load16x4_u", "makeSIMDLoad(s, SIMDLoadOp::LoadExtUVec16x4ToVecI32x4)"),
441+
("i64x2.load32x2_s", "makeSIMDLoad(s, SIMDLoadOp::LoadExtSVec32x2ToVecI64x2)"),
442+
("i64x2.load32x2_u", "makeSIMDLoad(s, SIMDLoadOp::LoadExtUVec32x2ToVecI64x2)"),
437443
("i8x16.narrow_i16x8_s", "makeBinary(s, BinaryOp::NarrowSVecI16x8ToVecI8x16)"),
438444
("i8x16.narrow_i16x8_u", "makeBinary(s, BinaryOp::NarrowUVecI16x8ToVecI8x16)"),
439445
("i16x8.narrow_i32x4_s", "makeBinary(s, BinaryOp::NarrowSVecI32x4ToVecI16x8)"),

src/binaryen-c.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,24 @@ BinaryenOp BinaryenLoadSplatVec8x16(void) { return LoadSplatVec8x16; }
888888
BinaryenOp BinaryenLoadSplatVec16x8(void) { return LoadSplatVec16x8; }
889889
BinaryenOp BinaryenLoadSplatVec32x4(void) { return LoadSplatVec32x4; }
890890
BinaryenOp BinaryenLoadSplatVec64x2(void) { return LoadSplatVec64x2; }
891+
BinaryenOp BinaryenLoadExtSVec8x8ToVecI16x8(void) {
892+
return LoadExtSVec8x8ToVecI16x8;
893+
}
894+
BinaryenOp BinaryenLoadExtUVec8x8ToVecI16x8(void) {
895+
return LoadExtUVec8x8ToVecI16x8;
896+
}
897+
BinaryenOp BinaryenLoadExtSVec16x4ToVecI32x4(void) {
898+
return LoadExtSVec16x4ToVecI32x4;
899+
}
900+
BinaryenOp BinaryenLoadExtUVec16x4ToVecI32x4(void) {
901+
return LoadExtUVec16x4ToVecI32x4;
902+
}
903+
BinaryenOp BinaryenLoadExtSVec32x2ToVecI64x2(void) {
904+
return LoadExtSVec32x2ToVecI64x2;
905+
}
906+
BinaryenOp BinaryenLoadExtUVec32x2ToVecI64x2(void) {
907+
return LoadExtUVec32x2ToVecI64x2;
908+
}
891909
BinaryenOp BinaryenNarrowSVecI16x8ToVecI8x16(void) {
892910
return NarrowSVecI16x8ToVecI8x16;
893911
}

src/binaryen-c.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,12 @@ BINARYEN_API BinaryenOp BinaryenLoadSplatVec8x16(void);
528528
BINARYEN_API BinaryenOp BinaryenLoadSplatVec16x8(void);
529529
BINARYEN_API BinaryenOp BinaryenLoadSplatVec32x4(void);
530530
BINARYEN_API BinaryenOp BinaryenLoadSplatVec64x2(void);
531+
BINARYEN_API BinaryenOp BinaryenLoadExtSVec8x8ToVecI16x8(void);
532+
BINARYEN_API BinaryenOp BinaryenLoadExtUVec8x8ToVecI16x8(void);
533+
BINARYEN_API BinaryenOp BinaryenLoadExtSVec16x4ToVecI32x4(void);
534+
BINARYEN_API BinaryenOp BinaryenLoadExtUVec16x4ToVecI32x4(void);
535+
BINARYEN_API BinaryenOp BinaryenLoadExtSVec32x2ToVecI64x2(void);
536+
BINARYEN_API BinaryenOp BinaryenLoadExtUVec32x2ToVecI64x2(void);
531537
BINARYEN_API BinaryenOp BinaryenNarrowSVecI16x8ToVecI8x16(void);
532538
BINARYEN_API BinaryenOp BinaryenNarrowUVecI16x8ToVecI8x16(void);
533539
BINARYEN_API BinaryenOp BinaryenNarrowSVecI32x4ToVecI16x8(void);

src/emscripten-optimizer/istring.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,13 @@ struct IString {
161161

162162
namespace std {
163163

164-
template<>
165-
struct hash<cashew::IString> : public unary_function<cashew::IString, size_t> {
164+
template<> struct hash<cashew::IString> {
166165
size_t operator()(const cashew::IString& str) const {
167166
return std::hash<size_t>{}(size_t(str.str));
168167
}
169168
};
170169

171-
template<>
172-
struct equal_to<cashew::IString>
173-
: public binary_function<cashew::IString, cashew::IString, bool> {
170+
template<> struct equal_to<cashew::IString> {
174171
bool operator()(const cashew::IString& x, const cashew::IString& y) const {
175172
return x == y;
176173
}

src/gen-s-parser.inc

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,17 @@ switch (op[0]) {
760760
default: goto parse_error;
761761
}
762762
}
763+
case 'o': {
764+
switch (op[14]) {
765+
case 's':
766+
if (strcmp(op, "i16x8.load8x8_s") == 0) { return makeSIMDLoad(s, SIMDLoadOp::LoadExtSVec8x8ToVecI16x8); }
767+
goto parse_error;
768+
case 'u':
769+
if (strcmp(op, "i16x8.load8x8_u") == 0) { return makeSIMDLoad(s, SIMDLoadOp::LoadExtUVec8x8ToVecI16x8); }
770+
goto parse_error;
771+
default: goto parse_error;
772+
}
773+
}
763774
case 't': {
764775
switch (op[9]) {
765776
case 's':
@@ -1414,6 +1425,17 @@ switch (op[0]) {
14141425
default: goto parse_error;
14151426
}
14161427
}
1428+
case 'o': {
1429+
switch (op[15]) {
1430+
case 's':
1431+
if (strcmp(op, "i32x4.load16x4_s") == 0) { return makeSIMDLoad(s, SIMDLoadOp::LoadExtSVec16x4ToVecI32x4); }
1432+
goto parse_error;
1433+
case 'u':
1434+
if (strcmp(op, "i32x4.load16x4_u") == 0) { return makeSIMDLoad(s, SIMDLoadOp::LoadExtUVec16x4ToVecI32x4); }
1435+
goto parse_error;
1436+
default: goto parse_error;
1437+
}
1438+
}
14171439
case 't': {
14181440
switch (op[9]) {
14191441
case 's':
@@ -2069,6 +2091,17 @@ switch (op[0]) {
20692091
case 'e':
20702092
if (strcmp(op, "i64x2.extract_lane") == 0) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecI64x2, 2); }
20712093
goto parse_error;
2094+
case 'l': {
2095+
switch (op[15]) {
2096+
case 's':
2097+
if (strcmp(op, "i64x2.load32x2_s") == 0) { return makeSIMDLoad(s, SIMDLoadOp::LoadExtSVec32x2ToVecI64x2); }
2098+
goto parse_error;
2099+
case 'u':
2100+
if (strcmp(op, "i64x2.load32x2_u") == 0) { return makeSIMDLoad(s, SIMDLoadOp::LoadExtUVec32x2ToVecI64x2); }
2101+
goto parse_error;
2102+
default: goto parse_error;
2103+
}
2104+
}
20722105
case 'n':
20732106
if (strcmp(op, "i64x2.neg") == 0) { return makeUnary(s, UnaryOp::NegVecI64x2); }
20742107
goto parse_error;

src/js/binaryen.js-post.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,12 @@ Module['LoadSplatVec8x16'] = Module['_BinaryenLoadSplatVec8x16']();
400400
Module['LoadSplatVec16x8'] = Module['_BinaryenLoadSplatVec16x8']();
401401
Module['LoadSplatVec32x4'] = Module['_BinaryenLoadSplatVec32x4']();
402402
Module['LoadSplatVec64x2'] = Module['_BinaryenLoadSplatVec64x2']();
403+
Module['LoadExtSVec8x8ToVecI16x8'] = Module['_BinaryenLoadExtSVec8x8ToVecI16x8']();
404+
Module['LoadExtUVec8x8ToVecI16x8'] = Module['_BinaryenLoadExtUVec8x8ToVecI16x8']();
405+
Module['LoadExtSVec16x4ToVecI32x4'] = Module['_BinaryenLoadExtSVec16x4ToVecI32x4']();
406+
Module['LoadExtUVec16x4ToVecI32x4'] = Module['_BinaryenLoadExtUVec16x4ToVecI32x4']();
407+
Module['LoadExtSVec32x2ToVecI64x2'] = Module['_BinaryenLoadExtSVec32x2ToVecI64x2']();
408+
Module['LoadExtUVec32x2ToVecI64x2'] = Module['_BinaryenLoadExtUVec32x2ToVecI64x2']();
403409
Module['NarrowSVecI16x8ToVecI8x16'] = Module['_BinaryenNarrowSVecI16x8ToVecI8x16']();
404410
Module['NarrowUVecI16x8ToVecI8x16'] = Module['_BinaryenNarrowUVecI16x8ToVecI8x16']();
405411
Module['NarrowSVecI32x4ToVecI16x8'] = Module['_BinaryenNarrowSVecI32x4ToVecI16x8']();
@@ -1546,6 +1552,12 @@ function wrapModule(module, self) {
15461552
'widen_high_i8x16_u': function(value) {
15471553
return Module['_BinaryenUnary'](module, Module['WidenHighUVecI8x16ToVecI16x8'], value);
15481554
},
1555+
'load8x8_s': function(offset, align, ptr) {
1556+
return Module['_BinaryenSIMDLoad'](module, Module['LoadExtSVec8x8ToVecI16x8'], offset, align, ptr);
1557+
},
1558+
'load8x8_u': function(offset, align, ptr) {
1559+
return Module['_BinaryenSIMDLoad'](module, Module['LoadExtUVec8x8ToVecI16x8'], offset, align, ptr);
1560+
},
15491561
};
15501562

15511563
self['i32x4'] = {
@@ -1633,6 +1645,12 @@ function wrapModule(module, self) {
16331645
'widen_high_i16x8_u': function(value) {
16341646
return Module['_BinaryenUnary'](module, Module['WidenHighUVecI16x8ToVecI32x4'], value);
16351647
},
1648+
'load16x4_s': function(offset, align, ptr) {
1649+
return Module['_BinaryenSIMDLoad'](module, Module['LoadExtSVec16x4ToVecI32x4'], offset, align, ptr);
1650+
},
1651+
'load16x4_u': function(offset, align, ptr) {
1652+
return Module['_BinaryenSIMDLoad'](module, Module['LoadExtUVec16x4ToVecI32x4'], offset, align, ptr);
1653+
},
16361654
};
16371655

16381656
self['i64x2'] = {
@@ -1675,6 +1693,12 @@ function wrapModule(module, self) {
16751693
'trunc_sat_f64x2_u': function(value) {
16761694
return Module['_BinaryenUnary'](module, Module['TruncSatUVecF64x2ToVecI64x2'], value);
16771695
},
1696+
'load32x2_s': function(offset, align, ptr) {
1697+
return Module['_BinaryenSIMDLoad'](module, Module['LoadExtSVec32x2ToVecI64x2'], offset, align, ptr);
1698+
},
1699+
'load32x2_u': function(offset, align, ptr) {
1700+
return Module['_BinaryenSIMDLoad'](module, Module['LoadExtUVec32x2ToVecI64x2'], offset, align, ptr);
1701+
},
16781702
};
16791703

16801704
self['f32x4'] = {

src/passes/Print.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,24 @@ struct PrintExpressionContents
406406
case LoadSplatVec64x2:
407407
o << "v64x2.load_splat";
408408
break;
409+
case LoadExtSVec8x8ToVecI16x8:
410+
o << "i16x8.load8x8_s";
411+
break;
412+
case LoadExtUVec8x8ToVecI16x8:
413+
o << "i16x8.load8x8_u";
414+
break;
415+
case LoadExtSVec16x4ToVecI32x4:
416+
o << "i32x4.load16x4_s";
417+
break;
418+
case LoadExtUVec16x4ToVecI32x4:
419+
o << "i32x4.load16x4_u";
420+
break;
421+
case LoadExtSVec32x2ToVecI64x2:
422+
o << "i64x2.load32x2_s";
423+
break;
424+
case LoadExtUVec32x2ToVecI64x2:
425+
o << "i64x2.load32x2_u";
426+
break;
409427
}
410428
restoreNormalColor(o);
411429
if (curr->offset) {

0 commit comments

Comments
 (0)