summaryrefslogtreecommitdiff
path: root/src/passes/Print.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/Print.cpp')
-rw-r--r--src/passes/Print.cpp259
1 files changed, 233 insertions, 26 deletions
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index 51c7e9f97..64dd0deae 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -234,6 +234,60 @@ struct PrintExpressionContents : public Visitor<PrintExpressionContents> {
o << " offset=" << curr->offset;
}
}
+ void visitSIMDExtract(SIMDExtract* curr) {
+ prepareColor(o);
+ switch (curr->op) {
+ case ExtractLaneSVecI8x16: o << "i8x16.extract_lane_s"; break;
+ case ExtractLaneUVecI8x16: o << "i8x16.extract_lane_u"; break;
+ case ExtractLaneSVecI16x8: o << "i16x8.extract_lane_s"; break;
+ case ExtractLaneUVecI16x8: o << "i16x8.extract_lane_u"; break;
+ case ExtractLaneVecI32x4: o << "i32x4.extract_lane"; break;
+ case ExtractLaneVecI64x2: o << "i64x2.extract_lane"; break;
+ case ExtractLaneVecF32x4: o << "f32x4.extract_lane"; break;
+ case ExtractLaneVecF64x2: o << "f64x2.extract_lane"; break;
+ }
+ o << " " << int(curr->idx);
+ }
+ void visitSIMDReplace(SIMDReplace* curr) {
+ prepareColor(o);
+ switch (curr->op) {
+ case ReplaceLaneVecI8x16: o << "i8x16.replace_lane"; break;
+ case ReplaceLaneVecI16x8: o << "i16x8.replace_lane"; break;
+ case ReplaceLaneVecI32x4: o << "i32x4.replace_lane"; break;
+ case ReplaceLaneVecI64x2: o << "i64x2.replace_lane"; break;
+ case ReplaceLaneVecF32x4: o << "f32x4.replace_lane"; break;
+ case ReplaceLaneVecF64x2: o << "f64x2.replace_lane"; break;
+ }
+ o << " " << int(curr->idx);
+ }
+ void visitSIMDShuffle(SIMDShuffle* curr) {
+ prepareColor(o);
+ o << "v8x16.shuffle";
+ for (uint8_t mask_index : curr->mask) {
+ o << " " << std::to_string(mask_index);
+ }
+ }
+ void visitSIMDBitselect(SIMDBitselect* curr) {
+ prepareColor(o);
+ o << "v128.bitselect";
+ }
+ void visitSIMDShift(SIMDShift* curr) {
+ prepareColor(o);
+ switch (curr->op) {
+ case ShlVecI8x16: o << "i8x16.shl"; break;
+ case ShrSVecI8x16: o << "i8x16.shr_s"; break;
+ case ShrUVecI8x16: o << "i8x16.shr_u"; break;
+ case ShlVecI16x8: o << "i16x8.shl"; break;
+ case ShrSVecI16x8: o << "i16x8.shr_s"; break;
+ case ShrUVecI16x8: o << "i16x8.shr_u"; break;
+ case ShlVecI32x4: o << "i32x4.shl"; break;
+ case ShrSVecI32x4: o << "i32x4.shr_s"; break;
+ case ShrUVecI32x4: o << "i32x4.shr_u"; break;
+ case ShlVecI64x2: o << "i64x2.shl"; break;
+ case ShrSVecI64x2: o << "i64x2.shr_s"; break;
+ case ShrUVecI64x2: o << "i64x2.shr_u"; break;
+ }
+ }
void visitConst(Const* curr) {
o << curr->value;
}
@@ -262,36 +316,36 @@ struct PrintExpressionContents : public Visitor<PrintExpressionContents> {
case TruncFloat64: o << "f64.trunc"; break;
case NearestFloat64: o << "f64.nearest"; break;
case SqrtFloat64: o << "f64.sqrt"; break;
- case ExtendSInt32: o << "i64.extend_s/i32"; break;
- case ExtendUInt32: o << "i64.extend_u/i32"; break;
- case WrapInt64: o << "i32.wrap/i64"; break;
- case TruncSFloat32ToInt32: o << "i32.trunc_s/f32"; break;
- case TruncSFloat32ToInt64: o << "i64.trunc_s/f32"; break;
- case TruncUFloat32ToInt32: o << "i32.trunc_u/f32"; break;
- case TruncUFloat32ToInt64: o << "i64.trunc_u/f32"; break;
- case TruncSFloat64ToInt32: o << "i32.trunc_s/f64"; break;
- case TruncSFloat64ToInt64: o << "i64.trunc_s/f64"; break;
- case TruncUFloat64ToInt32: o << "i32.trunc_u/f64"; break;
- case TruncUFloat64ToInt64: o << "i64.trunc_u/f64"; break;
+ case ExtendSInt32: o << "i64.extend_s/i32"; break;
+ case ExtendUInt32: o << "i64.extend_u/i32"; break;
+ case WrapInt64: o << "i32.wrap/i64"; break;
+ case TruncSFloat32ToInt32: o << "i32.trunc_s/f32"; break;
+ case TruncSFloat32ToInt64: o << "i64.trunc_s/f32"; break;
+ case TruncUFloat32ToInt32: o << "i32.trunc_u/f32"; break;
+ case TruncUFloat32ToInt64: o << "i64.trunc_u/f32"; break;
+ case TruncSFloat64ToInt32: o << "i32.trunc_s/f64"; break;
+ case TruncSFloat64ToInt64: o << "i64.trunc_s/f64"; break;
+ case TruncUFloat64ToInt32: o << "i32.trunc_u/f64"; break;
+ case TruncUFloat64ToInt64: o << "i64.trunc_u/f64"; break;
case ReinterpretFloat32: o << "i32.reinterpret/f32"; break;
case ReinterpretFloat64: o << "i64.reinterpret/f64"; break;
- case ConvertUInt32ToFloat32: o << "f32.convert_u/i32"; break;
- case ConvertUInt32ToFloat64: o << "f64.convert_u/i32"; break;
- case ConvertSInt32ToFloat32: o << "f32.convert_s/i32"; break;
- case ConvertSInt32ToFloat64: o << "f64.convert_s/i32"; break;
- case ConvertUInt64ToFloat32: o << "f32.convert_u/i64"; break;
- case ConvertUInt64ToFloat64: o << "f64.convert_u/i64"; break;
- case ConvertSInt64ToFloat32: o << "f32.convert_s/i64"; break;
- case ConvertSInt64ToFloat64: o << "f64.convert_s/i64"; break;
- case PromoteFloat32: o << "f64.promote/f32"; break;
- case DemoteFloat64: o << "f32.demote/f64"; break;
+ case ConvertUInt32ToFloat32: o << "f32.convert_u/i32"; break;
+ case ConvertUInt32ToFloat64: o << "f64.convert_u/i32"; break;
+ case ConvertSInt32ToFloat32: o << "f32.convert_s/i32"; break;
+ case ConvertSInt32ToFloat64: o << "f64.convert_s/i32"; break;
+ case ConvertUInt64ToFloat32: o << "f32.convert_u/i64"; break;
+ case ConvertUInt64ToFloat64: o << "f64.convert_u/i64"; break;
+ case ConvertSInt64ToFloat32: o << "f32.convert_s/i64"; break;
+ case ConvertSInt64ToFloat64: o << "f64.convert_s/i64"; break;
+ case PromoteFloat32: o << "f64.promote/f32"; break;
+ case DemoteFloat64: o << "f32.demote/f64"; break;
case ReinterpretInt32: o << "f32.reinterpret/i32"; break;
case ReinterpretInt64: o << "f64.reinterpret/i64"; break;
- case ExtendS8Int32: o << "i32.extend8_s"; break;
- case ExtendS16Int32: o << "i32.extend16_s"; break;
- case ExtendS8Int64: o << "i64.extend8_s"; break;
- case ExtendS16Int64: o << "i64.extend16_s"; break;
- case ExtendS32Int64: o << "i64.extend32_s"; break;
+ case ExtendS8Int32: o << "i32.extend8_s"; break;
+ case ExtendS16Int32: o << "i32.extend16_s"; break;
+ case ExtendS8Int64: o << "i64.extend8_s"; break;
+ case ExtendS16Int64: o << "i64.extend16_s"; break;
+ case ExtendS32Int64: o << "i64.extend32_s"; break;
case TruncSatSFloat32ToInt32: o << "i32.trunc_s:sat/f32"; break;
case TruncSatUFloat32ToInt32: o << "i32.trunc_u:sat/f32"; break;
case TruncSatSFloat64ToInt32: o << "i32.trunc_s:sat/f64"; break;
@@ -300,6 +354,39 @@ struct PrintExpressionContents : public Visitor<PrintExpressionContents> {
case TruncSatUFloat32ToInt64: o << "i64.trunc_u:sat/f32"; break;
case TruncSatSFloat64ToInt64: o << "i64.trunc_s:sat/f64"; break;
case TruncSatUFloat64ToInt64: o << "i64.trunc_u:sat/f64"; break;
+ case SplatVecI8x16: o << "i8x16.splat"; break;
+ case SplatVecI16x8: o << "i16x8.splat"; break;
+ case SplatVecI32x4: o << "i32x4.splat"; break;
+ case SplatVecI64x2: o << "i64x2.splat"; break;
+ case SplatVecF32x4: o << "f32x4.splat"; break;
+ case SplatVecF64x2: o << "f64x2.splat"; break;
+ case NotVec128: o << "v128.not"; break;
+ case NegVecI8x16: o << "i8x16.neg"; break;
+ case AnyTrueVecI8x16: o << "i8x16.any_true"; break;
+ case AllTrueVecI8x16: o << "i8x16.all_true"; break;
+ case NegVecI16x8: o << "i16x8.neg"; break;
+ case AnyTrueVecI16x8: o << "i16x8.any_true"; break;
+ case AllTrueVecI16x8: o << "i16x8.all_true"; break;
+ case NegVecI32x4: o << "i32x4.neg"; break;
+ case AnyTrueVecI32x4: o << "i32x4.any_true"; break;
+ case AllTrueVecI32x4: o << "i32x4.all_true"; break;
+ case NegVecI64x2: o << "i64x2.neg"; break;
+ case AnyTrueVecI64x2: o << "i64x2.any_true"; break;
+ case AllTrueVecI64x2: o << "i64x2.all_true"; break;
+ case AbsVecF32x4: o << "f32x4.abs"; break;
+ case NegVecF32x4: o << "f32x4.neg"; break;
+ case SqrtVecF32x4: o << "f32x4.sqrt"; break;
+ case AbsVecF64x2: o << "f64x2.abs"; break;
+ case NegVecF64x2: o << "f64x2.neg"; break;
+ case SqrtVecF64x2: o << "f64x2.sqrt"; break;
+ case TruncSatSVecF32x4ToVecI32x4: o << "i32x4.trunc_s/f32x4:sat"; break;
+ case TruncSatUVecF32x4ToVecI32x4: o << "i32x4.trunc_u/f32x4:sat"; break;
+ case TruncSatSVecF64x2ToVecI64x2: o << "i64x2.trunc_s/f64x2:sat"; break;
+ case TruncSatUVecF64x2ToVecI64x2: o << "i64x2.trunc_u/f64x2:sat"; break;
+ case ConvertSVecI32x4ToVecF32x4: o << "f32x4.convert_s/i32x4"; break;
+ case ConvertUVecI32x4ToVecF32x4: o << "f32x4.convert_u/i32x4"; break;
+ case ConvertSVecI64x2ToVecF64x2: o << "f64x2.convert_s/i64x2"; break;
+ case ConvertUVecI64x2ToVecF64x2: o << "f64x2.convert_u/i64x2"; break;
case InvalidUnary: WASM_UNREACHABLE();
}
}
@@ -386,6 +473,86 @@ struct PrintExpressionContents : public Visitor<PrintExpressionContents> {
case GtFloat64: o << "f64.gt"; break;
case GeFloat64: o << "f64.ge"; break;
+ case EqVecI8x16: o << "i8x16.eq"; break;
+ case NeVecI8x16: o << "i8x16.ne"; break;
+ case LtSVecI8x16: o << "i8x16.lt_s"; break;
+ case LtUVecI8x16: o << "i8x16.lt_u"; break;
+ case GtSVecI8x16: o << "i8x16.gt_s"; break;
+ case GtUVecI8x16: o << "i8x16.gt_u"; break;
+ case LeSVecI8x16: o << "i8x16.le_s"; break;
+ case LeUVecI8x16: o << "i8x16.le_u"; break;
+ case GeSVecI8x16: o << "i8x16.ge_s"; break;
+ case GeUVecI8x16: o << "i8x16.ge_u"; break;
+ case EqVecI16x8: o << "i16x8.eq"; break;
+ case NeVecI16x8: o << "i16x8.ne"; break;
+ case LtSVecI16x8: o << "i16x8.lt_s"; break;
+ case LtUVecI16x8: o << "i16x8.lt_u"; break;
+ case GtSVecI16x8: o << "i16x8.gt_s"; break;
+ case GtUVecI16x8: o << "i16x8.gt_u"; break;
+ case LeSVecI16x8: o << "i16x8.le_s"; break;
+ case LeUVecI16x8: o << "i16x8.le_u"; break;
+ case GeSVecI16x8: o << "i16x8.ge_s"; break;
+ case GeUVecI16x8: o << "i16x8.ge_u"; break;
+ case EqVecI32x4: o << "i32x4.eq"; break;
+ case NeVecI32x4: o << "i32x4.ne"; break;
+ case LtSVecI32x4: o << "i32x4.lt_s"; break;
+ case LtUVecI32x4: o << "i32x4.lt_u"; break;
+ case GtSVecI32x4: o << "i32x4.gt_s"; break;
+ case GtUVecI32x4: o << "i32x4.gt_u"; break;
+ case LeSVecI32x4: o << "i32x4.le_s"; break;
+ case LeUVecI32x4: o << "i32x4.le_u"; break;
+ case GeSVecI32x4: o << "i32x4.ge_s"; break;
+ case GeUVecI32x4: o << "i32x4.ge_u"; break;
+ case EqVecF32x4: o << "f32x4.eq"; break;
+ case NeVecF32x4: o << "f32x4.ne"; break;
+ case LtVecF32x4: o << "f32x4.lt"; break;
+ case GtVecF32x4: o << "f32x4.gt"; break;
+ case LeVecF32x4: o << "f32x4.le"; break;
+ case GeVecF32x4: o << "f32x4.ge"; break;
+ case EqVecF64x2: o << "f64x2.eq"; break;
+ case NeVecF64x2: o << "f64x2.ne"; break;
+ case LtVecF64x2: o << "f64x2.lt"; break;
+ case GtVecF64x2: o << "f64x2.gt"; break;
+ case LeVecF64x2: o << "f64x2.le"; break;
+ case GeVecF64x2: o << "f64x2.ge"; break;
+
+ case AndVec128: o << "v128.and"; break;
+ case OrVec128: o << "v128.or"; break;
+ case XorVec128: o << "v128.xor"; break;
+
+ case AddVecI8x16: o << "i8x16.add"; break;
+ case AddSatSVecI8x16: o << "i8x16.add_saturate_s"; break;
+ case AddSatUVecI8x16: o << "i8x16.add_saturate_u"; break;
+ case SubVecI8x16: o << "i8x16.sub"; break;
+ case SubSatSVecI8x16: o << "i8x16.sub_saturate_s"; break;
+ case SubSatUVecI8x16: o << "i8x16.sub_saturate_u"; break;
+ case MulVecI8x16: o << "i8x16.mul"; break;
+ case AddVecI16x8: o << "i16x8.add"; break;
+ case AddSatSVecI16x8: o << "i16x8.add_saturate_s"; break;
+ case AddSatUVecI16x8: o << "i16x8.add_saturate_u"; break;
+ case SubVecI16x8: o << "i16x8.sub"; break;
+ case SubSatSVecI16x8: o << "i16x8.sub_saturate_s"; break;
+ case SubSatUVecI16x8: o << "i16x8.sub_saturate_u"; break;
+ case MulVecI16x8: o << "i16x8.mul"; break;
+ case AddVecI32x4: o << "i32x4.add"; break;
+ case SubVecI32x4: o << "i32x4.sub"; break;
+ case MulVecI32x4: o << "i32x4.mul"; break;
+ case AddVecI64x2: o << "i64x2.add"; break;
+ case SubVecI64x2: o << "i64x2.sub"; break;
+
+ case AddVecF32x4: o << "f32x4.add"; break;
+ case SubVecF32x4: o << "f32x4.sub"; break;
+ case MulVecF32x4: o << "f32x4.mul"; break;
+ case DivVecF32x4: o << "f32x4.div"; break;
+ case MinVecF32x4: o << "f32x4.min"; break;
+ case MaxVecF32x4: o << "f32x4.max"; break;
+ case AddVecF64x2: o << "f64x2.add"; break;
+ case SubVecF64x2: o << "f64x2.sub"; break;
+ case MulVecF64x2: o << "f64x2.mul"; break;
+ case DivVecF64x2: o << "f64x2.div"; break;
+ case MinVecF64x2: o << "f64x2.min"; break;
+ case MaxVecF64x2: o << "f64x2.max"; break;
+
case InvalidBinary: WASM_UNREACHABLE();
}
restoreNormalColor(o);
@@ -724,6 +891,46 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
printFullLine(curr->wakeCount);
decIndent();
}
+ void visitSIMDExtract(SIMDExtract* curr) {
+ o << '(';
+ PrintExpressionContents(currFunction, o).visit(curr);
+ incIndent();
+ printFullLine(curr->vec);
+ decIndent();
+ }
+ void visitSIMDReplace(SIMDReplace* curr) {
+ o << '(';
+ PrintExpressionContents(currFunction, o).visit(curr);
+ incIndent();
+ printFullLine(curr->vec);
+ printFullLine(curr->value);
+ decIndent();
+ }
+ void visitSIMDShuffle(SIMDShuffle* curr) {
+ o << '(';
+ PrintExpressionContents(currFunction, o).visit(curr);
+ incIndent();
+ printFullLine(curr->left);
+ printFullLine(curr->right);
+ decIndent();
+ }
+ void visitSIMDBitselect(SIMDBitselect* curr) {
+ o << '(';
+ PrintExpressionContents(currFunction, o).visit(curr);
+ incIndent();
+ printFullLine(curr->left);
+ printFullLine(curr->right);
+ printFullLine(curr->cond);
+ decIndent();
+ }
+ void visitSIMDShift(SIMDShift* curr) {
+ o << '(';
+ PrintExpressionContents(currFunction, o).visit(curr);
+ incIndent();
+ printFullLine(curr->vec);
+ printFullLine(curr->shift);
+ decIndent();
+ }
void visitConst(Const* curr) {
o << '(';
PrintExpressionContents(currFunction, o).visit(curr);