Skip to content

Commit 7f44054

Browse files
Add Wide Arithmetic C + JS APIs (#8660)
Part of #8544.
1 parent a0981e5 commit 7f44054

8 files changed

Lines changed: 424 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ Current Trunk
2323
- Rename `BinaryenCopyMemorySegmentData` to `BinaryenCopyDataSegmentData` in c api.
2424
- Rename `module.getNumMemorySegments` to `module.getNumDataSegments` in js api.
2525
- Rename `module.getMemorySegmentInfo` to `module.getDataSegmentInfo` in js api.
26+
- Add C and JS APIs for the Wide Arithmetic proposal (#8660).
2627

2728
v129
2829
----

src/binaryen-c.cpp

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,10 @@ BinaryenOp BinaryenLtFloat64(void) { return LtFloat64; }
690690
BinaryenOp BinaryenLeFloat64(void) { return LeFloat64; }
691691
BinaryenOp BinaryenGtFloat64(void) { return GtFloat64; }
692692
BinaryenOp BinaryenGeFloat64(void) { return GeFloat64; }
693+
BinaryenOp BinaryenAddInt128(void) { return AddInt128; }
694+
BinaryenOp BinaryenSubInt128(void) { return SubInt128; }
695+
BinaryenOp BinaryenMulWideSInt64(void) { return MulWideSInt64; }
696+
BinaryenOp BinaryenMulWideUInt64(void) { return MulWideUInt64; }
693697
BinaryenOp BinaryenAtomicRMWAdd(void) { return RMWAdd; }
694698
BinaryenOp BinaryenAtomicRMWSub(void) { return RMWSub; }
695699
BinaryenOp BinaryenAtomicRMWAnd(void) { return RMWAnd; }
@@ -1315,6 +1319,26 @@ BinaryenExpressionRef BinaryenBinary(BinaryenModuleRef module,
13151319
Builder(*(Module*)module)
13161320
.makeBinary(BinaryOp(op), (Expression*)left, (Expression*)right));
13171321
}
1322+
BinaryenExpressionRef BinaryenWideIntAddSub(BinaryenModuleRef module,
1323+
BinaryenOp op,
1324+
BinaryenExpressionRef leftLow,
1325+
BinaryenExpressionRef leftHigh,
1326+
BinaryenExpressionRef rightLow,
1327+
BinaryenExpressionRef rightHigh) {
1328+
return Builder(*(Module*)module)
1329+
.makeWideIntAddSub(WideIntAddSubOp(op),
1330+
(Expression*)leftLow,
1331+
(Expression*)leftHigh,
1332+
(Expression*)rightLow,
1333+
(Expression*)rightHigh);
1334+
}
1335+
BinaryenExpressionRef BinaryenWideIntMul(BinaryenModuleRef module,
1336+
BinaryenOp op,
1337+
BinaryenExpressionRef left,
1338+
BinaryenExpressionRef right) {
1339+
return Builder(*(Module*)module)
1340+
.makeWideIntMul(WideIntMulOp(op), (Expression*)left, (Expression*)right);
1341+
}
13181342
BinaryenExpressionRef BinaryenSelect(BinaryenModuleRef module,
13191343
BinaryenExpressionRef condition,
13201344
BinaryenExpressionRef ifTrue,
@@ -2946,6 +2970,105 @@ void BinaryenBinarySetRight(BinaryenExpressionRef expr,
29462970
assert(rightExpr);
29472971
static_cast<Binary*>(expression)->right = (Expression*)rightExpr;
29482972
}
2973+
// WideIntAddSub
2974+
BinaryenOp BinaryenWideIntAddSubGetOp(BinaryenExpressionRef expr) {
2975+
auto* expression = (Expression*)expr;
2976+
assert(expression->is<WideIntAddSub>());
2977+
return static_cast<WideIntAddSub*>(expression)->op;
2978+
}
2979+
void BinaryenWideIntAddSubSetOp(BinaryenExpressionRef expr, BinaryenOp op) {
2980+
auto* expression = (Expression*)expr;
2981+
assert(expression->is<WideIntAddSub>());
2982+
static_cast<WideIntAddSub*>(expression)->op = WideIntAddSubOp(op);
2983+
}
2984+
BinaryenExpressionRef
2985+
BinaryenWideIntAddSubGetLeftLow(BinaryenExpressionRef expr) {
2986+
auto* expression = (Expression*)expr;
2987+
assert(expression->is<WideIntAddSub>());
2988+
return static_cast<WideIntAddSub*>(expression)->leftLow;
2989+
}
2990+
void BinaryenWideIntAddSubSetLeftLow(BinaryenExpressionRef expr,
2991+
BinaryenExpressionRef leftLowExpr) {
2992+
auto* expression = (Expression*)expr;
2993+
assert(expression->is<WideIntAddSub>());
2994+
assert(leftLowExpr);
2995+
static_cast<WideIntAddSub*>(expression)->leftLow = (Expression*)leftLowExpr;
2996+
}
2997+
BinaryenExpressionRef
2998+
BinaryenWideIntAddSubGetLeftHigh(BinaryenExpressionRef expr) {
2999+
auto* expression = (Expression*)expr;
3000+
assert(expression->is<WideIntAddSub>());
3001+
return static_cast<WideIntAddSub*>(expression)->leftHigh;
3002+
}
3003+
void BinaryenWideIntAddSubSetLeftHigh(BinaryenExpressionRef expr,
3004+
BinaryenExpressionRef leftHighExpr) {
3005+
auto* expression = (Expression*)expr;
3006+
assert(expression->is<WideIntAddSub>());
3007+
assert(leftHighExpr);
3008+
static_cast<WideIntAddSub*>(expression)->leftHigh = (Expression*)leftHighExpr;
3009+
}
3010+
BinaryenExpressionRef
3011+
BinaryenWideIntAddSubGetRightLow(BinaryenExpressionRef expr) {
3012+
auto* expression = (Expression*)expr;
3013+
assert(expression->is<WideIntAddSub>());
3014+
return static_cast<WideIntAddSub*>(expression)->rightLow;
3015+
}
3016+
void BinaryenWideIntAddSubSetRightLow(BinaryenExpressionRef expr,
3017+
BinaryenExpressionRef rightLowExpr) {
3018+
auto* expression = (Expression*)expr;
3019+
assert(expression->is<WideIntAddSub>());
3020+
assert(rightLowExpr);
3021+
static_cast<WideIntAddSub*>(expression)->rightLow = (Expression*)rightLowExpr;
3022+
}
3023+
BinaryenExpressionRef
3024+
BinaryenWideIntAddSubGetRightHigh(BinaryenExpressionRef expr) {
3025+
auto* expression = (Expression*)expr;
3026+
assert(expression->is<WideIntAddSub>());
3027+
return static_cast<WideIntAddSub*>(expression)->rightHigh;
3028+
}
3029+
void BinaryenWideIntAddSubSetRightHigh(BinaryenExpressionRef expr,
3030+
BinaryenExpressionRef rightHighExpr) {
3031+
auto* expression = (Expression*)expr;
3032+
assert(expression->is<WideIntAddSub>());
3033+
assert(rightHighExpr);
3034+
static_cast<WideIntAddSub*>(expression)->rightHigh =
3035+
(Expression*)rightHighExpr;
3036+
}
3037+
// WideIntMul
3038+
BinaryenOp BinaryenWideIntMulGetOp(BinaryenExpressionRef expr) {
3039+
auto* expression = (Expression*)expr;
3040+
assert(expression->is<WideIntMul>());
3041+
return static_cast<WideIntMul*>(expression)->op;
3042+
}
3043+
void BinaryenWideIntMulSetOp(BinaryenExpressionRef expr, BinaryenOp op) {
3044+
auto* expression = (Expression*)expr;
3045+
assert(expression->is<WideIntMul>());
3046+
static_cast<WideIntMul*>(expression)->op = WideIntMulOp(op);
3047+
}
3048+
BinaryenExpressionRef BinaryenWideIntMulGetLeft(BinaryenExpressionRef expr) {
3049+
auto* expression = (Expression*)expr;
3050+
assert(expression->is<WideIntMul>());
3051+
return static_cast<WideIntMul*>(expression)->left;
3052+
}
3053+
void BinaryenWideIntMulSetLeft(BinaryenExpressionRef expr,
3054+
BinaryenExpressionRef leftExpr) {
3055+
auto* expression = (Expression*)expr;
3056+
assert(expression->is<WideIntMul>());
3057+
assert(leftExpr);
3058+
static_cast<WideIntMul*>(expression)->left = (Expression*)leftExpr;
3059+
}
3060+
BinaryenExpressionRef BinaryenWideIntMulGetRight(BinaryenExpressionRef expr) {
3061+
auto* expression = (Expression*)expr;
3062+
assert(expression->is<WideIntMul>());
3063+
return static_cast<WideIntMul*>(expression)->right;
3064+
}
3065+
void BinaryenWideIntMulSetRight(BinaryenExpressionRef expr,
3066+
BinaryenExpressionRef rightExpr) {
3067+
auto* expression = (Expression*)expr;
3068+
assert(expression->is<WideIntMul>());
3069+
assert(rightExpr);
3070+
static_cast<WideIntMul*>(expression)->right = (Expression*)rightExpr;
3071+
}
29493072
// Select
29503073
BinaryenExpressionRef BinaryenSelectGetIfTrue(BinaryenExpressionRef expr) {
29513074
auto* expression = (Expression*)expr;

src/binaryen-c.h

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,10 @@ BINARYEN_API BinaryenOp BinaryenLtFloat64(void);
431431
BINARYEN_API BinaryenOp BinaryenLeFloat64(void);
432432
BINARYEN_API BinaryenOp BinaryenGtFloat64(void);
433433
BINARYEN_API BinaryenOp BinaryenGeFloat64(void);
434+
BINARYEN_API BinaryenOp BinaryenAddInt128(void);
435+
BINARYEN_API BinaryenOp BinaryenSubInt128(void);
436+
BINARYEN_API BinaryenOp BinaryenMulWideSInt64(void);
437+
BINARYEN_API BinaryenOp BinaryenMulWideUInt64(void);
434438
BINARYEN_API BinaryenOp BinaryenAtomicRMWAdd(void);
435439
BINARYEN_API BinaryenOp BinaryenAtomicRMWSub(void);
436440
BINARYEN_API BinaryenOp BinaryenAtomicRMWAnd(void);
@@ -841,6 +845,18 @@ BINARYEN_API BinaryenExpressionRef BinaryenBinary(BinaryenModuleRef module,
841845
BinaryenExpressionRef left,
842846
BinaryenExpressionRef right);
843847
BINARYEN_API BinaryenExpressionRef
848+
BinaryenWideIntAddSub(BinaryenModuleRef module,
849+
BinaryenOp op,
850+
BinaryenExpressionRef leftLow,
851+
BinaryenExpressionRef leftHigh,
852+
BinaryenExpressionRef rightLow,
853+
BinaryenExpressionRef rightHigh);
854+
BINARYEN_API BinaryenExpressionRef
855+
BinaryenWideIntMul(BinaryenModuleRef module,
856+
BinaryenOp op,
857+
BinaryenExpressionRef left,
858+
BinaryenExpressionRef right);
859+
BINARYEN_API BinaryenExpressionRef
844860
BinaryenSelect(BinaryenModuleRef module,
845861
BinaryenExpressionRef condition,
846862
BinaryenExpressionRef ifTrue,
@@ -1704,6 +1720,62 @@ BinaryenBinaryGetRight(BinaryenExpressionRef expr);
17041720
BINARYEN_API void BinaryenBinarySetRight(BinaryenExpressionRef expr,
17051721
BinaryenExpressionRef rightExpr);
17061722

1723+
// WideIntAddSub
1724+
1725+
// Gets the operation being performed by a wide int add/sub expression.
1726+
BINARYEN_API BinaryenOp BinaryenWideIntAddSubGetOp(BinaryenExpressionRef expr);
1727+
// Sets the operation being performed by a wide int add/sub expression.
1728+
BINARYEN_API void BinaryenWideIntAddSubSetOp(BinaryenExpressionRef expr,
1729+
BinaryenOp op);
1730+
// Gets the left low expression of a wide int add/sub expression.
1731+
BINARYEN_API BinaryenExpressionRef
1732+
BinaryenWideIntAddSubGetLeftLow(BinaryenExpressionRef expr);
1733+
// Sets the left low expression of a wide int add/sub expression.
1734+
BINARYEN_API void
1735+
BinaryenWideIntAddSubSetLeftLow(BinaryenExpressionRef expr,
1736+
BinaryenExpressionRef leftLowExpr);
1737+
// Gets the left high expression of a wide int add/sub expression.
1738+
BINARYEN_API BinaryenExpressionRef
1739+
BinaryenWideIntAddSubGetLeftHigh(BinaryenExpressionRef expr);
1740+
// Sets the left high expression of a wide int add/sub expression.
1741+
BINARYEN_API void
1742+
BinaryenWideIntAddSubSetLeftHigh(BinaryenExpressionRef expr,
1743+
BinaryenExpressionRef leftHighExpr);
1744+
// Gets the right low expression of a wide int add/sub expression.
1745+
BINARYEN_API BinaryenExpressionRef
1746+
BinaryenWideIntAddSubGetRightLow(BinaryenExpressionRef expr);
1747+
// Sets the right low expression of a wide int add/sub expression.
1748+
BINARYEN_API void
1749+
BinaryenWideIntAddSubSetRightLow(BinaryenExpressionRef expr,
1750+
BinaryenExpressionRef rightLowExpr);
1751+
// Gets the right high expression of a wide int add/sub expression.
1752+
BINARYEN_API BinaryenExpressionRef
1753+
BinaryenWideIntAddSubGetRightHigh(BinaryenExpressionRef expr);
1754+
// Sets the right high expression of a wide int add/sub expression.
1755+
BINARYEN_API void
1756+
BinaryenWideIntAddSubSetRightHigh(BinaryenExpressionRef expr,
1757+
BinaryenExpressionRef rightHighExpr);
1758+
1759+
// WideIntMul
1760+
1761+
// Gets the operation being performed by a wide int mul expression.
1762+
BINARYEN_API BinaryenOp BinaryenWideIntMulGetOp(BinaryenExpressionRef expr);
1763+
// Sets the operation being performed by a wide int mul expression.
1764+
BINARYEN_API void BinaryenWideIntMulSetOp(BinaryenExpressionRef expr,
1765+
BinaryenOp op);
1766+
// Gets the left expression of a wide int mul expression.
1767+
BINARYEN_API BinaryenExpressionRef
1768+
BinaryenWideIntMulGetLeft(BinaryenExpressionRef expr);
1769+
// Sets the left expression of a wide int mul expression.
1770+
BINARYEN_API void BinaryenWideIntMulSetLeft(BinaryenExpressionRef expr,
1771+
BinaryenExpressionRef leftExpr);
1772+
// Gets the right expression of a wide int mul expression.
1773+
BINARYEN_API BinaryenExpressionRef
1774+
BinaryenWideIntMulGetRight(BinaryenExpressionRef expr);
1775+
// Sets the right expression of a wide int mul expression.
1776+
BINARYEN_API void BinaryenWideIntMulSetRight(BinaryenExpressionRef expr,
1777+
BinaryenExpressionRef rightExpr);
1778+
17071779
// Select
17081780

17091781
// Gets the expression becoming selected by a `select` expression if the

src/js/binaryen.js-post.js

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,11 @@ function initializeConstants() {
613613
'StringEncodeLossyUTF8Array',
614614
'StringEncodeWTF16Array',
615615
'StringEqEqual',
616-
'StringEqCompare'
616+
'StringEqCompare',
617+
'AddInt128',
618+
'SubInt128',
619+
'MulWideSInt64',
620+
'MulWideUInt64'
617621
].forEach(name => {
618622
Module['Operations'][name] = Module[name] = Module['_Binaryen' + name]();
619623
});
@@ -1184,6 +1188,18 @@ function wrapModule(module, self = {}) {
11841188
'add'(left, right) {
11851189
return Module['_BinaryenBinary'](module, Module['AddInt64'], left, right);
11861190
},
1191+
'add128'(leftLow, leftHigh, rightLow, rightHigh) {
1192+
return Module['_BinaryenWideIntAddSub'](module, Module['AddInt128'], leftLow, leftHigh, rightLow, rightHigh);
1193+
},
1194+
'sub128'(leftLow, leftHigh, rightLow, rightHigh) {
1195+
return Module['_BinaryenWideIntAddSub'](module, Module['SubInt128'], leftLow, leftHigh, rightLow, rightHigh);
1196+
},
1197+
'mul_wide_s'(left, right) {
1198+
return Module['_BinaryenWideIntMul'](module, Module['MulWideSInt64'], left, right);
1199+
},
1200+
'mul_wide_u'(left, right) {
1201+
return Module['_BinaryenWideIntMul'](module, Module['MulWideUInt64'], left, right);
1202+
},
11871203
'sub'(left, right) {
11881204
return Module['_BinaryenBinary'](module, Module['SubInt64'], left, right);
11891205
},
@@ -4197,6 +4213,60 @@ Module['Binary'] = makeExpressionWrapper(Module['_BinaryenBinaryId'](), {
41974213
}
41984214
});
41994215

4216+
Module['WideIntAddSub'] = makeExpressionWrapper(Module['_BinaryenWideIntAddSubId'](), {
4217+
'getOp'(expr) {
4218+
return Module['_BinaryenWideIntAddSubGetOp'](expr);
4219+
},
4220+
'setOp'(expr, op) {
4221+
Module['_BinaryenWideIntAddSubSetOp'](expr, op);
4222+
},
4223+
'getLeftLow'(expr) {
4224+
return Module['_BinaryenWideIntAddSubGetLeftLow'](expr);
4225+
},
4226+
'setLeftLow'(expr, leftLowExpr) {
4227+
Module['_BinaryenWideIntAddSubSetLeftLow'](expr, leftLowExpr);
4228+
},
4229+
'getLeftHigh'(expr) {
4230+
return Module['_BinaryenWideIntAddSubGetLeftHigh'](expr);
4231+
},
4232+
'setLeftHigh'(expr, leftHighExpr) {
4233+
Module['_BinaryenWideIntAddSubSetLeftHigh'](expr, leftHighExpr);
4234+
},
4235+
'getRightLow'(expr) {
4236+
return Module['_BinaryenWideIntAddSubGetRightLow'](expr);
4237+
},
4238+
'setRightLow'(expr, rightLowExpr) {
4239+
Module['_BinaryenWideIntAddSubSetRightLow'](expr, rightLowExpr);
4240+
},
4241+
'getRightHigh'(expr) {
4242+
return Module['_BinaryenWideIntAddSubGetRightHigh'](expr);
4243+
},
4244+
'setRightHigh'(expr, rightHighExpr) {
4245+
Module['_BinaryenWideIntAddSubSetRightHigh'](expr, rightHighExpr);
4246+
}
4247+
});
4248+
4249+
Module['WideIntMul'] = makeExpressionWrapper(Module['_BinaryenWideIntMulId'](), {
4250+
'getOp'(expr) {
4251+
return Module['_BinaryenWideIntMulGetOp'](expr);
4252+
},
4253+
'setOp'(expr, op) {
4254+
Module['_BinaryenWideIntMulSetOp'](expr, op);
4255+
},
4256+
'getLeft'(expr) {
4257+
return Module['_BinaryenWideIntMulGetLeft'](expr);
4258+
},
4259+
'setLeft'(expr, leftExpr) {
4260+
Module['_BinaryenWideIntMulSetLeft'](expr, leftExpr);
4261+
},
4262+
'getRight'(expr) {
4263+
return Module['_BinaryenWideIntMulGetRight'](expr);
4264+
},
4265+
'setRight'(expr, rightExpr) {
4266+
Module['_BinaryenWideIntMulSetRight'](expr, rightExpr);
4267+
}
4268+
});
4269+
42004270
Module['Select'] = makeExpressionWrapper(Module['_BinaryenSelectId'](), {
42014271
'getIfTrue'(expr) {
42024272
return Module['_BinaryenSelectGetIfTrue'](expr);

0 commit comments

Comments
 (0)