Skip to content

Commit 3f70d11

Browse files
authored
feat: Implement final SIMD instructions (AssemblyScript#1844)
1 parent 5e19467 commit 3f70d11

File tree

267 files changed

+2600
-1369
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

267 files changed

+2600
-1369
lines changed

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"url": "https://github.com/AssemblyScript/assemblyscript/issues"
2222
},
2323
"dependencies": {
24-
"binaryen": "100.0.0-nightly.20210413",
24+
"binaryen": "101.0.0-nightly.20210527",
2525
"long": "^4.0.0",
2626
"source-map-support": "^0.5.19",
2727
"ts-node": "^6.2.0"

src/builtins.ts

Lines changed: 824 additions & 19 deletions
Large diffs are not rendered by default.

src/glue/binaryen.d.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,21 @@ export declare function _BinaryenSIMDLoadSetAlign(expr: BinaryenExpressionRef, a
769769
export declare function _BinaryenSIMDLoadGetPtr(expr: BinaryenExpressionRef): BinaryenExpressionRef;
770770
export declare function _BinaryenSIMDLoadSetPtr(expr: BinaryenExpressionRef, ptrExpr: BinaryenExpressionRef): void;
771771

772+
export declare function _BinaryenSIMDLoadStoreLane(module: BinaryenModuleRef, op: BinaryenOp, offset: u32, align: u32, index: u8, ptr: BinaryenExpressionRef, vec: BinaryenExpressionRef): BinaryenExpressionRef;
773+
export declare function _BinaryenSIMDLoadStoreLaneGetOp(expr: BinaryenExpressionRef): BinaryenOp;
774+
export declare function _BinaryenSIMDLoadStoreLaneSetOp(expr: BinaryenExpressionRef, op: BinaryenOp): void;
775+
export declare function _BinaryenSIMDLoadStoreLaneGetOffset(expr: BinaryenExpressionRef): u32;
776+
export declare function _BinaryenSIMDLoadStoreLaneSetOffset(expr: BinaryenExpressionRef, offset: u32): void;
777+
export declare function _BinaryenSIMDLoadStoreLaneGetAlign(expr: BinaryenExpressionRef): u32;
778+
export declare function _BinaryenSIMDLoadStoreLaneSetAlign(expr: BinaryenExpressionRef, align: u32): void;
779+
export declare function _BinaryenSIMDLoadStoreLaneGetIndex(expr: BinaryenExpressionRef): u8;
780+
export declare function _BinaryenSIMDLoadStoreLaneSetIndex(expr: BinaryenExpressionRef, index: u8): void;
781+
export declare function _BinaryenSIMDLoadStoreLaneGetPtr(expr: BinaryenExpressionRef): BinaryenExpressionRef;
782+
export declare function _BinaryenSIMDLoadStoreLaneSetPtr(expr: BinaryenExpressionRef, ptrExpr: BinaryenExpressionRef): void;
783+
export declare function _BinaryenSIMDLoadStoreLaneGetVec(expr: BinaryenExpressionRef): BinaryenExpressionRef;
784+
export declare function _BinaryenSIMDLoadStoreLaneSetVec(expr: BinaryenExpressionRef, vecExpr: BinaryenExpressionRef): void;
785+
export declare function _BinaryenSIMDLoadStoreLaneIsStore(expr: BinaryenExpressionRef): bool;
786+
772787
export declare function _BinaryenMemoryInit(module: BinaryenModuleRef, segmentIndex: u32, destExpr: BinaryenExpressionRef, offsetExpr: BinaryenExpressionRef, sizeExpr: BinaryenExpressionRef): BinaryenExpressionRef;
773788
export declare function _BinaryenMemoryInitGetSegment(expr: BinaryenExpressionRef): u32;
774789
export declare function _BinaryenMemoryInitSetSegment(expr: BinaryenExpressionRef, segmentIndex: u32): void;

src/module.ts

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ export enum UnaryOp {
298298
/** i8x16.bitmask */
299299
BitmaskI8x16 = 71 /* _BinaryenBitmaskVecI8x16 */,
300300
/** i8x16.popcnt */
301-
PopcntI8x16 = 72 /* _BinaryenPopcntVecI8x16 */, // UNIMP
301+
PopcntI8x16 = 72 /* _BinaryenPopcntVecI8x16 */,
302302
/** i16x8.abs */
303303
AbsI16x8 = 73 /* _BinaryenAbsVecI16x8 */,
304304
/** i16x8.neg */
@@ -322,7 +322,7 @@ export enum UnaryOp {
322322
/** i64x2.all_true */
323323
AllTrueI64x2 = 83 /* _BinaryenAllTrueVecI64x2 */,
324324
/** i64x2.bitmask */
325-
BitmaskI64x2 = 84 /* _BinaryenBitmaskVecI64x2 */, // UNIMP
325+
BitmaskI64x2 = 84 /* _BinaryenBitmaskVecI64x2 */,
326326
/** f32x4.abs */
327327
AbsF32x4 = 85 /* _BinaryenAbsVecF32x4 */,
328328
/** f32x4.neg */
@@ -352,13 +352,13 @@ export enum UnaryOp {
352352
/** f64x2.nearest */
353353
NearestF64x2 = 98 /* _BinaryenNearestVecF64x2 */,
354354
/** i16x8.extadd_pairwise_i8x16_s */
355-
ExtaddPairwiseI8x16ToI16x8 = 99 /* _BinaryenExtAddPairwiseSVecI8x16ToI16x8 */, // UNIMP
355+
ExtaddPairwiseI8x16ToI16x8 = 99 /* _BinaryenExtAddPairwiseSVecI8x16ToI16x8 */,
356356
/** i16x8.extadd_pairwise.i8x16_u */
357-
ExtaddPairwiseU8x16ToU16x8 = 100 /* _BinaryenExtAddPairwiseUVecI8x16ToI16x8 */, // UNIMP
357+
ExtaddPairwiseU8x16ToU16x8 = 100 /* _BinaryenExtAddPairwiseUVecI8x16ToI16x8 */,
358358
/** i32x4.extadd_pairwise.i16x8_s */
359-
ExtaddPairwiseI16x8ToI32x4 = 101 /* _BinaryenExtAddPairwiseSVecI16x8ToI32x4 */, // UNIMP
359+
ExtaddPairwiseI16x8ToI32x4 = 101 /* _BinaryenExtAddPairwiseSVecI16x8ToI32x4 */,
360360
/** i32x4.extadd_pairwise.i64x8_u */
361-
ExtaddPairwiseU16x8ToU32x4 = 102 /* _BinaryenExtAddPairwiseUVecI16x8ToI32x4 */, // UNIMP
361+
ExtaddPairwiseU16x8ToU32x4 = 102 /* _BinaryenExtAddPairwiseUVecI16x8ToI32x4 */,
362362
/** i32x4.trunc_sat_f32x4_s */
363363
TruncSatF32x4ToI32x4 = 103 /* _BinaryenTruncSatSVecF32x4ToVecI32x4 */,
364364
/** i32x4.trunc_sat_f32x4_u */
@@ -392,17 +392,17 @@ export enum UnaryOp {
392392
/** i64x2.extend_high_i32x4_u */
393393
ExtendHighU32x4ToU64x2 = 118 /* _BinaryenExtendHighUVecI32x4ToVecI64x2 */,
394394
/** f32x4.convert_i32x4_s */
395-
ConvertLowI32x4ToF64x2 = 119 /* _BinaryenConvertLowSVecI32x4ToVecF64x2 */, // UNIMP
395+
ConvertLowI32x4ToF64x2 = 119 /* _BinaryenConvertLowSVecI32x4ToVecF64x2 */,
396396
/** f32x4.convert_i32x4_u */
397-
ConvertLowU32x4ToF64x2 = 120 /* _BinaryenConvertLowUVecI32x4ToVecF64x2 */, // UNIMP
397+
ConvertLowU32x4ToF64x2 = 120 /* _BinaryenConvertLowUVecI32x4ToVecF64x2 */,
398398
/** i32x4.trunc_sat_f64x2_s_zero */
399-
TruncSatF64x2ToI32x4Zero = 121 /* _BinaryenTruncSatZeroSVecF64x2ToVecI32x4 */, // UNIMP
399+
TruncSatF64x2ToI32x4Zero = 121 /* _BinaryenTruncSatZeroSVecF64x2ToVecI32x4 */,
400400
/** i32x4.trunc_sat_f64x2_u_zero */
401-
TruncSatF64x2ToU32x4Zero = 122 /* _BinaryenTruncSatZeroUVecF64x2ToVecI32x4 */, // UNIMP
401+
TruncSatF64x2ToU32x4Zero = 122 /* _BinaryenTruncSatZeroUVecF64x2ToVecI32x4 */,
402402
/** f32x4.demote_f64x2_zero */
403-
DemoteZeroF64x2ToF32x4 = 123 /* _BinaryenDemoteZeroVecF64x2ToVecF32x4 */, // UNIMP
403+
DemoteZeroF64x2ToF32x4 = 123 /* _BinaryenDemoteZeroVecF64x2ToVecF32x4 */,
404404
/** f64x2.promote_low_f32x4 */
405-
PromoteLowF32x4ToF64x2 = 124 /* _BinaryenPromoteLowVecF32x4ToVecF64x2 */, // UNIMP
405+
PromoteLowF32x4ToF64x2 = 124 /* _BinaryenPromoteLowVecF32x4ToVecF64x2 */,
406406

407407
_last = PromoteLowF32x4ToF64x2,
408408

@@ -725,15 +725,15 @@ export enum BinaryOp {
725725
/** i16x8.avgr_u */
726726
AvgrU16x8 = 150 /* _BinaryenAvgrUVecI16x8 */,
727727
/** i16x8.q15mulr_sat_s */
728-
Q15mulrSatI16x8 = 151 /* _BinaryenQ15MulrSatSVecI16x8 */, // UNIMP
728+
Q15mulrSatI16x8 = 151 /* _BinaryenQ15MulrSatSVecI16x8 */,
729729
/** i16x8.extmul_low_i8x16_s */
730-
ExtmulLowI16x8 = 152 /* _BinaryenExtMulLowSVecI16x8 */, // UNIMP
730+
ExtmulLowI16x8 = 152 /* _BinaryenExtMulLowSVecI16x8 */,
731731
/** i16x8.extmul_high_i8x16_s */
732-
ExtmulHighI16x8 = 153 /* _BinaryenExtMulHighSVecI16x8 */, // UNIMP
732+
ExtmulHighI16x8 = 153 /* _BinaryenExtMulHighSVecI16x8 */,
733733
/** i16x8.extmul_low_i8x16_u */
734-
ExtmulLowU16x8 = 154 /* _BinaryenExtMulLowUVecI16x8 */, // UNIMP
734+
ExtmulLowU16x8 = 154 /* _BinaryenExtMulLowUVecI16x8 */,
735735
/** i16x8.extmul_high_i8x16_u */
736-
ExtmulHighU16x8 = 155 /* _BinaryenExtMulHighUVecI16x8 */, // UNIMP
736+
ExtmulHighU16x8 = 155 /* _BinaryenExtMulHighUVecI16x8 */,
737737
/** i32x4.add */
738738
AddI32x4 = 156 /* _BinaryenAddVecI32x4 */,
739739
/** i32x4.sub */
@@ -751,27 +751,27 @@ export enum BinaryOp {
751751
/** i32x4.dot_i16x8_s */
752752
DotI16x8 = 163 /* _BinaryenDotSVecI16x8ToVecI32x4 */,
753753
/** i32x4.extmul_low_i16x8_s */
754-
ExtmulLowI32x4 = 164 /* _BinaryenExtMulLowSVecI32x4 */, // UNIMP
754+
ExtmulLowI32x4 = 164 /* _BinaryenExtMulLowSVecI32x4 */,
755755
/** i32x4.extmul_high_i16x8_s */
756-
ExtmulHighI32x4 = 165 /* _BinaryenExtMulHighSVecI32x4 */, // UNIMP
756+
ExtmulHighI32x4 = 165 /* _BinaryenExtMulHighSVecI32x4 */,
757757
/** i32x4.extmul_low_i16x8_u */
758-
ExtmulLowU32x4 = 166 /* _BinaryenExtMulLowUVecI32x4 */, // UNIMP
758+
ExtmulLowU32x4 = 166 /* _BinaryenExtMulLowUVecI32x4 */,
759759
/** i32x4.extmul_high_i16x8_u */
760-
ExtmulHighU32x4 = 167 /* _BinaryenExtMulHighUVecI32x4 */, // UNIMP
760+
ExtmulHighU32x4 = 167 /* _BinaryenExtMulHighUVecI32x4 */,
761761
/** i64x2.add */
762762
AddI64x2 = 168 /* _BinaryenAddVecI64x2 */,
763763
/** i64x2.sub */
764764
SubI64x2 = 169 /* _BinaryenSubVecI64x2 */,
765765
/** i64x2.mul */
766766
MulI64x2 = 170 /* _BinaryenMulVecI64x2 */,
767767
/** i64x2.extmul_low_i32x4_s */
768-
ExtmulLowI64x2 = 171 /* _BinaryenExtMulLowSVecI64x2 */, // UNIMP
768+
ExtmulLowI64x2 = 171 /* _BinaryenExtMulLowSVecI64x2 */,
769769
/** i64x2.extmul_high_i32x4_s */
770-
ExtmulHighI64x2 = 172 /* _BinaryenExtMulHighSVecI64x2 */, // UNIMP
770+
ExtmulHighI64x2 = 172 /* _BinaryenExtMulHighSVecI64x2 */,
771771
/** i64x2.extmul_low_i32x4_u */
772-
ExtmulLowU64x2 = 173 /* _BinaryenExtMulLowUVecI64x2 */, // UNIMP
772+
ExtmulLowU64x2 = 173 /* _BinaryenExtMulLowUVecI64x2 */,
773773
/** i64x2.extmul_high_i32x4_u */
774-
ExtmulHighU64x2 = 174 /* _BinaryenExtMulHighUVecI64x2 */, // UNIMP
774+
ExtmulHighU64x2 = 174 /* _BinaryenExtMulHighUVecI64x2 */,
775775
/** f32x4.add */
776776
AddF32x4 = 175 /* _BinaryenAddVecF32x4 */,
777777
/** f32x4.sub */
@@ -969,28 +969,28 @@ export enum SIMDLoadOp {
969969
/** v128.load32x2_u */
970970
Load32x2U = 9 /* _BinaryenLoad32x2UVec128 */,
971971
/** v128.load32_zero */
972-
Load32Zero = 10 /* _BinaryenLoad32ZeroVec128 */, // UNIMP
972+
Load32Zero = 10 /* _BinaryenLoad32ZeroVec128 */,
973973
/** v128.load64_zero */
974-
Load64Zero = 11 /* _BinaryenLoad64ZeroVec128 */, // UNIMP
974+
Load64Zero = 11 /* _BinaryenLoad64ZeroVec128 */,
975975
}
976976

977977
export enum SIMDLoadStoreLaneOp {
978978
/** v128.load8_lane */
979-
Load8Lane = 0 /* _BinaryenLoad8LaneVec128 */, // UNIMP
979+
Load8Lane = 0 /* _BinaryenLoad8LaneVec128 */,
980980
/** v128.load16_lane */
981-
Load16Lane = 1 /* _BinaryenLoad16LaneVec128 */, // UNIMP
981+
Load16Lane = 1 /* _BinaryenLoad16LaneVec128 */,
982982
/** v128.load32_lane */
983-
Load32Lane = 2 /* _BinaryenLoad32LaneVec128 */, // UNIMP
983+
Load32Lane = 2 /* _BinaryenLoad32LaneVec128 */,
984984
/** v128.load64_lane */
985-
Load64Lane = 3 /* _BinaryenLoad64LaneVec128 */, // UNIMP
985+
Load64Lane = 3 /* _BinaryenLoad64LaneVec128 */,
986986
/** v128.store8_lane */
987-
Store8Lane = 4 /* _BinaryenStore8LaneVec128 */, // UNIMP
987+
Store8Lane = 4 /* _BinaryenStore8LaneVec128 */,
988988
/** v128.store16_lane */
989-
Store16Lane = 5 /* _BinaryenStore16LaneVec128 */, // UNIMP
989+
Store16Lane = 5 /* _BinaryenStore16LaneVec128 */,
990990
/** v128.store32_lane */
991-
Store32Lane = 6 /* _BinaryenStore32LaneVec128 */, // UNIMP
991+
Store32Lane = 6 /* _BinaryenStore32LaneVec128 */,
992992
/** v128.store64_lane */
993-
Store64Lane = 7 /* _BinaryenStore64LaneVec128 */, // UNIMP
993+
Store64Lane = 7 /* _BinaryenStore64LaneVec128 */,
994994
}
995995

996996
export enum SIMDTernaryOp {
@@ -1666,6 +1666,17 @@ export class Module {
16661666
return binaryen._BinaryenSIMDLoad(this.ref, op, offset, align, ptr);
16671667
}
16681668

1669+
simd_loadstorelane(
1670+
op: SIMDLoadStoreLaneOp,
1671+
ptr: ExpressionRef,
1672+
offset: u32,
1673+
align: u32,
1674+
index: u8,
1675+
vec: ExpressionRef
1676+
): ExpressionRef {
1677+
return binaryen._BinaryenSIMDLoadStoreLane(this.ref, op, offset, align, index, ptr, vec);
1678+
}
1679+
16691680
// reference types / gc
16701681

16711682
ref_is(

src/passes/pass.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ import {
134134
_BinaryenSIMDShiftSetVec,
135135
_BinaryenSIMDShiftSetShift,
136136
_BinaryenSIMDLoadSetPtr,
137+
_BinaryenSIMDLoadStoreLaneGetPtr,
138+
_BinaryenSIMDLoadStoreLaneGetVec,
139+
_BinaryenSIMDLoadStoreLaneSetPtr,
140+
_BinaryenSIMDLoadStoreLaneSetVec,
137141
_BinaryenMemoryInitSetDest,
138142
_BinaryenMemoryInitSetOffset,
139143
_BinaryenMemoryInitSetSize,
@@ -342,6 +346,10 @@ export abstract class Visitor {
342346
// unimp
343347
}
344348

349+
visitSIMDLoadStoreLane(expr: ExpressionRef): void {
350+
// unimp
351+
}
352+
345353
visitMemoryInit(expr: ExpressionRef): void {
346354
// unimp
347355
}
@@ -760,7 +768,14 @@ export abstract class Visitor {
760768
this.visitSIMDLoad(expr);
761769
break;
762770
}
763-
// TODO: SIMDLoadStoreLane
771+
case ExpressionId.SIMDLoadStoreLane: {
772+
this.stack.push(expr);
773+
this.visit(_BinaryenSIMDLoadStoreLaneGetPtr(expr));
774+
this.visit(_BinaryenSIMDLoadStoreLaneGetVec(expr));
775+
assert(this.stack.pop() == expr);
776+
this.visitSIMDLoadStoreLane(expr);
777+
break;
778+
}
764779
case ExpressionId.MemoryInit: {
765780
this.stack.push(expr);
766781
this.visit(_BinaryenMemoryInitGetDest(expr));
@@ -1425,7 +1440,19 @@ export function replaceChild(
14251440
}
14261441
break;
14271442
}
1428-
// TODO: SIMDLoadStoreLane
1443+
case ExpressionId.SIMDLoadStoreLane: {
1444+
let ptr = _BinaryenSIMDLoadStoreLaneGetPtr(parent);
1445+
if (ptr == search) {
1446+
_BinaryenSIMDLoadStoreLaneSetPtr(parent, replacement);
1447+
return ptr;
1448+
}
1449+
let vec = _BinaryenSIMDLoadStoreLaneGetVec(parent);
1450+
if (vec == search) {
1451+
_BinaryenSIMDLoadStoreLaneSetVec(parent, replacement);
1452+
return ptr;
1453+
}
1454+
break;
1455+
}
14291456
case ExpressionId.MemoryInit: {
14301457
let dest = _BinaryenMemoryInitGetDest(parent);
14311458
if (dest == search) {

0 commit comments

Comments
 (0)