Skip to content

Implement final SIMD instructions #1844

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 27, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"url": "https://github.com/AssemblyScript/assemblyscript/issues"
},
"dependencies": {
"binaryen": "100.0.0-nightly.20210413",
"binaryen": "101.0.0-nightly.20210527",
"long": "^4.0.0",
"source-map-support": "^0.5.19",
"ts-node": "^6.2.0"
Expand Down
843 changes: 824 additions & 19 deletions src/builtins.ts

Large diffs are not rendered by default.

15 changes: 15 additions & 0 deletions src/glue/binaryen.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,21 @@ export declare function _BinaryenSIMDLoadSetAlign(expr: BinaryenExpressionRef, a
export declare function _BinaryenSIMDLoadGetPtr(expr: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenSIMDLoadSetPtr(expr: BinaryenExpressionRef, ptrExpr: BinaryenExpressionRef): void;

export declare function _BinaryenSIMDLoadStoreLane(module: BinaryenModuleRef, op: BinaryenOp, offset: u32, align: u32, index: u8, ptr: BinaryenExpressionRef, vec: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenSIMDLoadStoreLaneGetOp(expr: BinaryenExpressionRef): BinaryenOp;
export declare function _BinaryenSIMDLoadStoreLaneSetOp(expr: BinaryenExpressionRef, op: BinaryenOp): void;
export declare function _BinaryenSIMDLoadStoreLaneGetOffset(expr: BinaryenExpressionRef): u32;
export declare function _BinaryenSIMDLoadStoreLaneSetOffset(expr: BinaryenExpressionRef, offset: u32): void;
export declare function _BinaryenSIMDLoadStoreLaneGetAlign(expr: BinaryenExpressionRef): u32;
export declare function _BinaryenSIMDLoadStoreLaneSetAlign(expr: BinaryenExpressionRef, align: u32): void;
export declare function _BinaryenSIMDLoadStoreLaneGetIndex(expr: BinaryenExpressionRef): u8;
export declare function _BinaryenSIMDLoadStoreLaneSetIndex(expr: BinaryenExpressionRef, index: u8): void;
export declare function _BinaryenSIMDLoadStoreLaneGetPtr(expr: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenSIMDLoadStoreLaneSetPtr(expr: BinaryenExpressionRef, ptrExpr: BinaryenExpressionRef): void;
export declare function _BinaryenSIMDLoadStoreLaneGetVec(expr: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenSIMDLoadStoreLaneSetVec(expr: BinaryenExpressionRef, vecExpr: BinaryenExpressionRef): void;
export declare function _BinaryenSIMDLoadStoreLaneIsStore(expr: BinaryenExpressionRef): bool;

export declare function _BinaryenMemoryInit(module: BinaryenModuleRef, segmentIndex: u32, destExpr: BinaryenExpressionRef, offsetExpr: BinaryenExpressionRef, sizeExpr: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenMemoryInitGetSegment(expr: BinaryenExpressionRef): u32;
export declare function _BinaryenMemoryInitSetSegment(expr: BinaryenExpressionRef, segmentIndex: u32): void;
Expand Down
81 changes: 46 additions & 35 deletions src/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ export enum UnaryOp {
/** i8x16.bitmask */
BitmaskI8x16 = 71 /* _BinaryenBitmaskVecI8x16 */,
/** i8x16.popcnt */
PopcntI8x16 = 72 /* _BinaryenPopcntVecI8x16 */, // UNIMP
PopcntI8x16 = 72 /* _BinaryenPopcntVecI8x16 */,
/** i16x8.abs */
AbsI16x8 = 73 /* _BinaryenAbsVecI16x8 */,
/** i16x8.neg */
Expand All @@ -322,7 +322,7 @@ export enum UnaryOp {
/** i64x2.all_true */
AllTrueI64x2 = 83 /* _BinaryenAllTrueVecI64x2 */,
/** i64x2.bitmask */
BitmaskI64x2 = 84 /* _BinaryenBitmaskVecI64x2 */, // UNIMP
BitmaskI64x2 = 84 /* _BinaryenBitmaskVecI64x2 */,
/** f32x4.abs */
AbsF32x4 = 85 /* _BinaryenAbsVecF32x4 */,
/** f32x4.neg */
Expand Down Expand Up @@ -352,13 +352,13 @@ export enum UnaryOp {
/** f64x2.nearest */
NearestF64x2 = 98 /* _BinaryenNearestVecF64x2 */,
/** i16x8.extadd_pairwise_i8x16_s */
ExtaddPairwiseI8x16ToI16x8 = 99 /* _BinaryenExtAddPairwiseSVecI8x16ToI16x8 */, // UNIMP
ExtaddPairwiseI8x16ToI16x8 = 99 /* _BinaryenExtAddPairwiseSVecI8x16ToI16x8 */,
/** i16x8.extadd_pairwise.i8x16_u */
ExtaddPairwiseU8x16ToU16x8 = 100 /* _BinaryenExtAddPairwiseUVecI8x16ToI16x8 */, // UNIMP
ExtaddPairwiseU8x16ToU16x8 = 100 /* _BinaryenExtAddPairwiseUVecI8x16ToI16x8 */,
/** i32x4.extadd_pairwise.i16x8_s */
ExtaddPairwiseI16x8ToI32x4 = 101 /* _BinaryenExtAddPairwiseSVecI16x8ToI32x4 */, // UNIMP
ExtaddPairwiseI16x8ToI32x4 = 101 /* _BinaryenExtAddPairwiseSVecI16x8ToI32x4 */,
/** i32x4.extadd_pairwise.i64x8_u */
ExtaddPairwiseU16x8ToU32x4 = 102 /* _BinaryenExtAddPairwiseUVecI16x8ToI32x4 */, // UNIMP
ExtaddPairwiseU16x8ToU32x4 = 102 /* _BinaryenExtAddPairwiseUVecI16x8ToI32x4 */,
/** i32x4.trunc_sat_f32x4_s */
TruncSatF32x4ToI32x4 = 103 /* _BinaryenTruncSatSVecF32x4ToVecI32x4 */,
/** i32x4.trunc_sat_f32x4_u */
Expand Down Expand Up @@ -392,17 +392,17 @@ export enum UnaryOp {
/** i64x2.extend_high_i32x4_u */
ExtendHighU32x4ToU64x2 = 118 /* _BinaryenExtendHighUVecI32x4ToVecI64x2 */,
/** f32x4.convert_i32x4_s */
ConvertLowI32x4ToF64x2 = 119 /* _BinaryenConvertLowSVecI32x4ToVecF64x2 */, // UNIMP
ConvertLowI32x4ToF64x2 = 119 /* _BinaryenConvertLowSVecI32x4ToVecF64x2 */,
/** f32x4.convert_i32x4_u */
ConvertLowU32x4ToF64x2 = 120 /* _BinaryenConvertLowUVecI32x4ToVecF64x2 */, // UNIMP
ConvertLowU32x4ToF64x2 = 120 /* _BinaryenConvertLowUVecI32x4ToVecF64x2 */,
/** i32x4.trunc_sat_f64x2_s_zero */
TruncSatF64x2ToI32x4Zero = 121 /* _BinaryenTruncSatZeroSVecF64x2ToVecI32x4 */, // UNIMP
TruncSatF64x2ToI32x4Zero = 121 /* _BinaryenTruncSatZeroSVecF64x2ToVecI32x4 */,
/** i32x4.trunc_sat_f64x2_u_zero */
TruncSatF64x2ToU32x4Zero = 122 /* _BinaryenTruncSatZeroUVecF64x2ToVecI32x4 */, // UNIMP
TruncSatF64x2ToU32x4Zero = 122 /* _BinaryenTruncSatZeroUVecF64x2ToVecI32x4 */,
/** f32x4.demote_f64x2_zero */
DemoteZeroF64x2ToF32x4 = 123 /* _BinaryenDemoteZeroVecF64x2ToVecF32x4 */, // UNIMP
DemoteZeroF64x2ToF32x4 = 123 /* _BinaryenDemoteZeroVecF64x2ToVecF32x4 */,
/** f64x2.promote_low_f32x4 */
PromoteLowF32x4ToF64x2 = 124 /* _BinaryenPromoteLowVecF32x4ToVecF64x2 */, // UNIMP
PromoteLowF32x4ToF64x2 = 124 /* _BinaryenPromoteLowVecF32x4ToVecF64x2 */,

_last = PromoteLowF32x4ToF64x2,

Expand Down Expand Up @@ -725,15 +725,15 @@ export enum BinaryOp {
/** i16x8.avgr_u */
AvgrU16x8 = 150 /* _BinaryenAvgrUVecI16x8 */,
/** i16x8.q15mulr_sat_s */
Q15mulrSatI16x8 = 151 /* _BinaryenQ15MulrSatSVecI16x8 */, // UNIMP
Q15mulrSatI16x8 = 151 /* _BinaryenQ15MulrSatSVecI16x8 */,
/** i16x8.extmul_low_i8x16_s */
ExtmulLowI16x8 = 152 /* _BinaryenExtMulLowSVecI16x8 */, // UNIMP
ExtmulLowI16x8 = 152 /* _BinaryenExtMulLowSVecI16x8 */,
/** i16x8.extmul_high_i8x16_s */
ExtmulHighI16x8 = 153 /* _BinaryenExtMulHighSVecI16x8 */, // UNIMP
ExtmulHighI16x8 = 153 /* _BinaryenExtMulHighSVecI16x8 */,
/** i16x8.extmul_low_i8x16_u */
ExtmulLowU16x8 = 154 /* _BinaryenExtMulLowUVecI16x8 */, // UNIMP
ExtmulLowU16x8 = 154 /* _BinaryenExtMulLowUVecI16x8 */,
/** i16x8.extmul_high_i8x16_u */
ExtmulHighU16x8 = 155 /* _BinaryenExtMulHighUVecI16x8 */, // UNIMP
ExtmulHighU16x8 = 155 /* _BinaryenExtMulHighUVecI16x8 */,
/** i32x4.add */
AddI32x4 = 156 /* _BinaryenAddVecI32x4 */,
/** i32x4.sub */
Expand All @@ -751,27 +751,27 @@ export enum BinaryOp {
/** i32x4.dot_i16x8_s */
DotI16x8 = 163 /* _BinaryenDotSVecI16x8ToVecI32x4 */,
/** i32x4.extmul_low_i16x8_s */
ExtmulLowI32x4 = 164 /* _BinaryenExtMulLowSVecI32x4 */, // UNIMP
ExtmulLowI32x4 = 164 /* _BinaryenExtMulLowSVecI32x4 */,
/** i32x4.extmul_high_i16x8_s */
ExtmulHighI32x4 = 165 /* _BinaryenExtMulHighSVecI32x4 */, // UNIMP
ExtmulHighI32x4 = 165 /* _BinaryenExtMulHighSVecI32x4 */,
/** i32x4.extmul_low_i16x8_u */
ExtmulLowU32x4 = 166 /* _BinaryenExtMulLowUVecI32x4 */, // UNIMP
ExtmulLowU32x4 = 166 /* _BinaryenExtMulLowUVecI32x4 */,
/** i32x4.extmul_high_i16x8_u */
ExtmulHighU32x4 = 167 /* _BinaryenExtMulHighUVecI32x4 */, // UNIMP
ExtmulHighU32x4 = 167 /* _BinaryenExtMulHighUVecI32x4 */,
/** i64x2.add */
AddI64x2 = 168 /* _BinaryenAddVecI64x2 */,
/** i64x2.sub */
SubI64x2 = 169 /* _BinaryenSubVecI64x2 */,
/** i64x2.mul */
MulI64x2 = 170 /* _BinaryenMulVecI64x2 */,
/** i64x2.extmul_low_i32x4_s */
ExtmulLowI64x2 = 171 /* _BinaryenExtMulLowSVecI64x2 */, // UNIMP
ExtmulLowI64x2 = 171 /* _BinaryenExtMulLowSVecI64x2 */,
/** i64x2.extmul_high_i32x4_s */
ExtmulHighI64x2 = 172 /* _BinaryenExtMulHighSVecI64x2 */, // UNIMP
ExtmulHighI64x2 = 172 /* _BinaryenExtMulHighSVecI64x2 */,
/** i64x2.extmul_low_i32x4_u */
ExtmulLowU64x2 = 173 /* _BinaryenExtMulLowUVecI64x2 */, // UNIMP
ExtmulLowU64x2 = 173 /* _BinaryenExtMulLowUVecI64x2 */,
/** i64x2.extmul_high_i32x4_u */
ExtmulHighU64x2 = 174 /* _BinaryenExtMulHighUVecI64x2 */, // UNIMP
ExtmulHighU64x2 = 174 /* _BinaryenExtMulHighUVecI64x2 */,
/** f32x4.add */
AddF32x4 = 175 /* _BinaryenAddVecF32x4 */,
/** f32x4.sub */
Expand Down Expand Up @@ -969,28 +969,28 @@ export enum SIMDLoadOp {
/** v128.load32x2_u */
Load32x2U = 9 /* _BinaryenLoad32x2UVec128 */,
/** v128.load32_zero */
Load32Zero = 10 /* _BinaryenLoad32ZeroVec128 */, // UNIMP
Load32Zero = 10 /* _BinaryenLoad32ZeroVec128 */,
/** v128.load64_zero */
Load64Zero = 11 /* _BinaryenLoad64ZeroVec128 */, // UNIMP
Load64Zero = 11 /* _BinaryenLoad64ZeroVec128 */,
}

export enum SIMDLoadStoreLaneOp {
/** v128.load8_lane */
Load8Lane = 0 /* _BinaryenLoad8LaneVec128 */, // UNIMP
Load8Lane = 0 /* _BinaryenLoad8LaneVec128 */,
/** v128.load16_lane */
Load16Lane = 1 /* _BinaryenLoad16LaneVec128 */, // UNIMP
Load16Lane = 1 /* _BinaryenLoad16LaneVec128 */,
/** v128.load32_lane */
Load32Lane = 2 /* _BinaryenLoad32LaneVec128 */, // UNIMP
Load32Lane = 2 /* _BinaryenLoad32LaneVec128 */,
/** v128.load64_lane */
Load64Lane = 3 /* _BinaryenLoad64LaneVec128 */, // UNIMP
Load64Lane = 3 /* _BinaryenLoad64LaneVec128 */,
/** v128.store8_lane */
Store8Lane = 4 /* _BinaryenStore8LaneVec128 */, // UNIMP
Store8Lane = 4 /* _BinaryenStore8LaneVec128 */,
/** v128.store16_lane */
Store16Lane = 5 /* _BinaryenStore16LaneVec128 */, // UNIMP
Store16Lane = 5 /* _BinaryenStore16LaneVec128 */,
/** v128.store32_lane */
Store32Lane = 6 /* _BinaryenStore32LaneVec128 */, // UNIMP
Store32Lane = 6 /* _BinaryenStore32LaneVec128 */,
/** v128.store64_lane */
Store64Lane = 7 /* _BinaryenStore64LaneVec128 */, // UNIMP
Store64Lane = 7 /* _BinaryenStore64LaneVec128 */,
}

export enum SIMDTernaryOp {
Expand Down Expand Up @@ -1666,6 +1666,17 @@ export class Module {
return binaryen._BinaryenSIMDLoad(this.ref, op, offset, align, ptr);
}

simd_loadstorelane(
op: SIMDLoadStoreLaneOp,
ptr: ExpressionRef,
offset: u32,
align: u32,
index: u8,
vec: ExpressionRef
): ExpressionRef {
return binaryen._BinaryenSIMDLoadStoreLane(this.ref, op, offset, align, index, ptr, vec);
}

// reference types / gc

ref_is(
Expand Down
31 changes: 29 additions & 2 deletions src/passes/pass.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,10 @@ import {
_BinaryenSIMDShiftSetVec,
_BinaryenSIMDShiftSetShift,
_BinaryenSIMDLoadSetPtr,
_BinaryenSIMDLoadStoreLaneGetPtr,
_BinaryenSIMDLoadStoreLaneGetVec,
_BinaryenSIMDLoadStoreLaneSetPtr,
_BinaryenSIMDLoadStoreLaneSetVec,
_BinaryenMemoryInitSetDest,
_BinaryenMemoryInitSetOffset,
_BinaryenMemoryInitSetSize,
Expand Down Expand Up @@ -342,6 +346,10 @@ export abstract class Visitor {
// unimp
}

visitSIMDLoadStoreLane(expr: ExpressionRef): void {
// unimp
}

visitMemoryInit(expr: ExpressionRef): void {
// unimp
}
Expand Down Expand Up @@ -760,7 +768,14 @@ export abstract class Visitor {
this.visitSIMDLoad(expr);
break;
}
// TODO: SIMDLoadStoreLane
case ExpressionId.SIMDLoadStoreLane: {
this.stack.push(expr);
this.visit(_BinaryenSIMDLoadStoreLaneGetPtr(expr));
this.visit(_BinaryenSIMDLoadStoreLaneGetVec(expr));
assert(this.stack.pop() == expr);
this.visitSIMDLoadStoreLane(expr);
break;
}
case ExpressionId.MemoryInit: {
this.stack.push(expr);
this.visit(_BinaryenMemoryInitGetDest(expr));
Expand Down Expand Up @@ -1425,7 +1440,19 @@ export function replaceChild(
}
break;
}
// TODO: SIMDLoadStoreLane
case ExpressionId.SIMDLoadStoreLane: {
let ptr = _BinaryenSIMDLoadStoreLaneGetPtr(parent);
if (ptr == search) {
_BinaryenSIMDLoadStoreLaneSetPtr(parent, replacement);
return ptr;
}
let vec = _BinaryenSIMDLoadStoreLaneGetVec(parent);
if (vec == search) {
_BinaryenSIMDLoadStoreLaneSetVec(parent, replacement);
return ptr;
}
break;
}
case ExpressionId.MemoryInit: {
let dest = _BinaryenMemoryInitGetDest(parent);
if (dest == search) {
Expand Down
Loading