Skip to content

Commit 034ed38

Browse files
authored
v128.andnot instruction (#2355)
As specified at WebAssembly/simd#102. Also fixes bugs in the JS API for other SIMD bitwise operators.
1 parent 835581f commit 034ed38

25 files changed

Lines changed: 928 additions & 770 deletions

build-js.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ export_function "_BinaryenNotVec128"
477477
export_function "_BinaryenAndVec128"
478478
export_function "_BinaryenOrVec128"
479479
export_function "_BinaryenXorVec128"
480+
export_function "_BinaryenAndNotVec128"
480481
export_function "_BinaryenBitselectVec128"
481482
export_function "_BinaryenNegVecI8x16"
482483
export_function "_BinaryenAnyTrueVecI8x16"

scripts/gen-s-parser.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@
355355
("v128.and", "makeBinary(s, BinaryOp::AndVec128)"),
356356
("v128.or", "makeBinary(s, BinaryOp::OrVec128)"),
357357
("v128.xor", "makeBinary(s, BinaryOp::XorVec128)"),
358+
("v128.andnot", "makeBinary(s, BinaryOp::AndNotVec128)"),
358359
("v128.bitselect", "makeSIMDTernary(s, SIMDTernaryOp::Bitselect)"),
359360
("i8x16.neg", "makeUnary(s, UnaryOp::NegVecI8x16)"),
360361
("i8x16.any_true", "makeUnary(s, UnaryOp::AnyTrueVecI8x16)"),

src/binaryen-c.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,7 @@ BinaryenOp BinaryenNotVec128(void) { return NotVec128; }
793793
BinaryenOp BinaryenAndVec128(void) { return AndVec128; }
794794
BinaryenOp BinaryenOrVec128(void) { return OrVec128; }
795795
BinaryenOp BinaryenXorVec128(void) { return XorVec128; }
796+
BinaryenOp BinaryenAndNotVec128(void) { return AndNotVec128; }
796797
BinaryenOp BinaryenBitselectVec128(void) { return Bitselect; }
797798
BinaryenOp BinaryenNegVecI8x16(void) { return NegVecI8x16; }
798799
BinaryenOp BinaryenAnyTrueVecI8x16(void) { return AnyTrueVecI8x16; }

src/binaryen-c.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ BINARYEN_API BinaryenOp BinaryenNotVec128(void);
449449
BINARYEN_API BinaryenOp BinaryenAndVec128(void);
450450
BINARYEN_API BinaryenOp BinaryenOrVec128(void);
451451
BINARYEN_API BinaryenOp BinaryenXorVec128(void);
452+
BINARYEN_API BinaryenOp BinaryenAndNotVec128(void);
452453
BINARYEN_API BinaryenOp BinaryenBitselectVec128(void);
453454
BINARYEN_API BinaryenOp BinaryenNegVecI8x16(void);
454455
BINARYEN_API BinaryenOp BinaryenAnyTrueVecI8x16(void);

src/gen-s-parser.inc

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2421,9 +2421,17 @@ switch (op[0]) {
24212421
switch (op[2]) {
24222422
case '2': {
24232423
switch (op[5]) {
2424-
case 'a':
2425-
if (strcmp(op, "v128.and") == 0) { return makeBinary(s, BinaryOp::AndVec128); }
2426-
goto parse_error;
2424+
case 'a': {
2425+
switch (op[8]) {
2426+
case '\0':
2427+
if (strcmp(op, "v128.and") == 0) { return makeBinary(s, BinaryOp::AndVec128); }
2428+
goto parse_error;
2429+
case 'n':
2430+
if (strcmp(op, "v128.andnot") == 0) { return makeBinary(s, BinaryOp::AndNotVec128); }
2431+
goto parse_error;
2432+
default: goto parse_error;
2433+
}
2434+
}
24272435
case 'b':
24282436
if (strcmp(op, "v128.bitselect") == 0) { return makeSIMDTernary(s, SIMDTernaryOp::Bitselect); }
24292437
goto parse_error;

src/ir/cost.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,9 @@ struct CostAnalyzer : public Visitor<CostAnalyzer, Index> {
558558
case XorVec128:
559559
ret = 1;
560560
break;
561+
case AndNotVec128:
562+
ret = 1;
563+
break;
561564
case AddVecI8x16:
562565
ret = 1;
563566
break;

src/js/binaryen.js-post.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ Module['NotVec128'] = Module['_BinaryenNotVec128']();
321321
Module['AndVec128'] = Module['_BinaryenAndVec128']();
322322
Module['OrVec128'] = Module['_BinaryenOrVec128']();
323323
Module['XorVec128'] = Module['_BinaryenXorVec128']();
324+
Module['AndNotVec128'] = Module['_BinaryenAndNotVec128']();
324325
Module['BitselectVec128'] = Module['_BinaryenBitselectVec128']();
325326
Module['NegVecI8x16'] = Module['_BinaryenNegVecI8x16']();
326327
Module['AnyTrueVecI8x16'] = Module['_BinaryenAnyTrueVecI8x16']();
@@ -1335,14 +1336,17 @@ function wrapModule(module, self) {
13351336
'not': function(value) {
13361337
return Module['_BinaryenUnary'](module, Module['NotVec128'], value);
13371338
},
1338-
'and': function(value) {
1339-
return Module['_BinaryenUnary'](module, Module['AndVec128'], value);
1339+
'and': function(left, right) {
1340+
return Module['_BinaryenBinary'](module, Module['AndVec128'], left, right);
1341+
},
1342+
'or': function(left, right) {
1343+
return Module['_BinaryenBinary'](module, Module['OrVec128'], left, right);
13401344
},
1341-
'or': function(value) {
1342-
return Module['_BinaryenUnary'](module, Module['OrVec128'], value);
1345+
'xor': function(left, right) {
1346+
return Module['_BinaryenBinary'](module, Module['XorVec128'], left, right);
13431347
},
1344-
'xor': function(value) {
1345-
return Module['_BinaryenUnary'](module, Module['XorVec128'], value);
1348+
'andnot': function(left, right) {
1349+
return Module['_BinaryenBinary'](module, Module['AndNotVec128'], left, right);
13461350
},
13471351
'bitselect': function(left, right, cond) {
13481352
return Module['_BinaryenSIMDTernary'](module, Module['BitselectVec128'], left, right, cond);

src/passes/Print.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,9 @@ struct PrintExpressionContents
11131113
case XorVec128:
11141114
o << "v128.xor";
11151115
break;
1116+
case AndNotVec128:
1117+
o << "v128.andnot";
1118+
break;
11161119

11171120
case AddVecI8x16:
11181121
o << "i8x16.add";

src/tools/fuzzing.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2139,6 +2139,7 @@ class TranslateToFuzzReader {
21392139
AndVec128,
21402140
OrVec128,
21412141
XorVec128,
2142+
AndNotVec128,
21422143
AddVecI8x16,
21432144
AddSatSVecI8x16,
21442145
AddSatUVecI8x16,

src/wasm-binary.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,7 @@ enum ASTNodes {
782782
V128And = 0x4d,
783783
V128Or = 0x4e,
784784
V128Xor = 0x4f,
785+
V128AndNot = 0xd8,
785786
V128Bitselect = 0x50,
786787
I8x16Neg = 0x51,
787788
I8x16AnyTrue = 0x52,

0 commit comments

Comments
 (0)