diff options
Diffstat (limited to 'src/wasm-s-parser.h')
-rw-r--r-- | src/wasm-s-parser.h | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index 0ffbfe989..42c1ce88e 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -527,18 +527,21 @@ public: enum { maxNameSize = 15 }; char op[maxNameSize + 1] = {'\0'}; strncpy(op, dot + 1, maxNameSize); + #define BINARY_INT_OR_FLOAT(op) (type == i32 ? BinaryOp::op##Int32 : (type == i64 ? BinaryOp::op##Int64 : (type == f32 ? BinaryOp::op##Float32 : BinaryOp::op##Float64))) + #define BINARY_INT(op) (type == i32 ? BinaryOp::op##Int32 : BinaryOp::op##Int64) + #define BINARY_FLOAT(op) (type == f32 ? BinaryOp::op##Float32 : BinaryOp::op##Float64) switch (op[0]) { case 'a': { if (op[1] == 'b') return makeUnary(s, type == f32 ? UnaryOp::AbsFloat32 : UnaryOp::AbsFloat64, type); - if (op[1] == 'd') return makeBinary(s, BinaryOp::Add, type); - if (op[1] == 'n') return makeBinary(s, BinaryOp::And, type); + if (op[1] == 'd') return makeBinary(s, BINARY_INT_OR_FLOAT(Add), type); + if (op[1] == 'n') return makeBinary(s, BINARY_INT(And), type); abort_on(op); } case 'c': { if (op[1] == 'e') return makeUnary(s, type == f32 ? UnaryOp::CeilFloat32 : UnaryOp::CeilFloat64, type); if (op[1] == 'l') return makeUnary(s, type == i32 ? UnaryOp::ClzInt32 : UnaryOp::ClzInt64, type); if (op[1] == 'o') { - if (op[2] == 'p') return makeBinary(s, BinaryOp::CopySign, type); + if (op[2] == 'p') return makeBinary(s, BINARY_FLOAT(CopySign), type); if (op[2] == 'n') { if (op[3] == 'v') { if (op[8] == 's') return makeUnary(s, op[11] == '3' ? (type == f32 ? UnaryOp::ConvertSInt32ToFloat32 : UnaryOp::ConvertSInt32ToFloat64) : (type == f32 ? UnaryOp::ConvertSInt64ToFloat32 : UnaryOp::ConvertSInt64ToFloat64), type); @@ -552,15 +555,15 @@ public: } case 'd': { if (op[1] == 'i') { - if (op[3] == '_') return makeBinary(s, op[4] == 'u' ? BinaryOp::DivU : BinaryOp::DivS, type); - if (op[3] == 0) return makeBinary(s, BinaryOp::Div, type); + if (op[3] == '_') return makeBinary(s, op[4] == 'u' ? BINARY_INT(DivU) : BINARY_INT(DivS), type); + if (op[3] == 0) return makeBinary(s, BINARY_FLOAT(Div), type); } if (op[1] == 'e') return makeUnary(s, UnaryOp::DemoteFloat64, type); abort_on(op); } case 'e': { if (op[1] == 'q') { - if (op[2] == 0) return makeBinary(s, BinaryOp::Eq, type); + if (op[2] == 0) return makeBinary(s, BINARY_INT_OR_FLOAT(Eq), type); if (op[2] == 'z') return makeUnary(s, type == i32 ? UnaryOp::EqZInt32 : UnaryOp::EqZInt64, type); } if (op[1] == 'x') return makeUnary(s, op[7] == 'u' ? UnaryOp::ExtendUInt32 : UnaryOp::ExtendSInt32, type); @@ -572,43 +575,43 @@ public: } case 'g': { if (op[1] == 't') { - if (op[2] == '_') return makeBinary(s, op[3] == 'u' ? BinaryOp::GtU : BinaryOp::GtS, type); - if (op[2] == 0) return makeBinary(s, BinaryOp::Gt, type); + if (op[2] == '_') return makeBinary(s, op[3] == 'u' ? BINARY_INT(GtU) : BINARY_INT(GtS), type); + if (op[2] == 0) return makeBinary(s, BINARY_FLOAT(Gt), type); } if (op[1] == 'e') { - if (op[2] == '_') return makeBinary(s, op[3] == 'u' ? BinaryOp::GeU : BinaryOp::GeS, type); - if (op[2] == 0) return makeBinary(s, BinaryOp::Ge, type); + if (op[2] == '_') return makeBinary(s, op[3] == 'u' ? BINARY_INT(GeU) : BINARY_INT(GeS), type); + if (op[2] == 0) return makeBinary(s, BINARY_FLOAT(Ge), type); } abort_on(op); } case 'l': { if (op[1] == 't') { - if (op[2] == '_') return makeBinary(s, op[3] == 'u' ? BinaryOp::LtU : BinaryOp::LtS, type); - if (op[2] == 0) return makeBinary(s, BinaryOp::Lt, type); + if (op[2] == '_') return makeBinary(s, op[3] == 'u' ? BINARY_INT(LtU) : BINARY_INT(LtS), type); + if (op[2] == 0) return makeBinary(s, BINARY_FLOAT(Lt), type); } if (op[1] == 'e') { - if (op[2] == '_') return makeBinary(s, op[3] == 'u' ? BinaryOp::LeU : BinaryOp::LeS, type); - if (op[2] == 0) return makeBinary(s, BinaryOp::Le, type); + if (op[2] == '_') return makeBinary(s, op[3] == 'u' ? BINARY_INT(LeU) : BINARY_INT(LeS), type); + if (op[2] == 0) return makeBinary(s, BINARY_FLOAT(Le), type); } if (op[1] == 'o') return makeLoad(s, type); abort_on(op); } case 'm': { - if (op[1] == 'i') return makeBinary(s, BinaryOp::Min, type); - if (op[1] == 'a') return makeBinary(s, BinaryOp::Max, type); - if (op[1] == 'u') return makeBinary(s, BinaryOp::Mul, type); + if (op[1] == 'i') return makeBinary(s, BINARY_FLOAT(Min), type); + if (op[1] == 'a') return makeBinary(s, BINARY_FLOAT(Max), type); + if (op[1] == 'u') return makeBinary(s, BINARY_INT_OR_FLOAT(Mul), type); abort_on(op); } case 'n': { if (op[1] == 'e') { - if (op[2] == 0) return makeBinary(s, BinaryOp::Ne, type); + if (op[2] == 0) return makeBinary(s, BINARY_INT_OR_FLOAT(Ne), type); if (op[2] == 'a') return makeUnary(s, type == f32 ? UnaryOp::NearestFloat32 : UnaryOp::NearestFloat64, type); if (op[2] == 'g') return makeUnary(s, type == f32 ? UnaryOp::NegFloat32 : UnaryOp::NegFloat64, type); } abort_on(op); } case 'o': { - if (op[1] == 'r') return makeBinary(s, BinaryOp::Or, type); + if (op[1] == 'r') return makeBinary(s, BINARY_INT(Or), type); abort_on(op); } case 'p': { @@ -618,20 +621,20 @@ public: } case 'r': { if (op[1] == 'e') { - if (op[2] == 'm') return makeBinary(s, op[4] == 'u' ? BinaryOp::RemU : BinaryOp::RemS, type); + if (op[2] == 'm') return makeBinary(s, op[4] == 'u' ? BINARY_INT(RemU) : BINARY_INT(RemS), type); if (op[2] == 'i') return makeUnary(s, isWasmTypeFloat(type) ? (type == f32 ? UnaryOp::ReinterpretInt32 : UnaryOp::ReinterpretInt64) : (type == i32 ? UnaryOp::ReinterpretFloat32 : UnaryOp::ReinterpretFloat64), type); } if (op[1] == 'o' && op[2] == 't') { - return makeBinary(s, op[3] == 'l' ? BinaryOp::RotL : BinaryOp::RotR, type); + return makeBinary(s, op[3] == 'l' ? BINARY_INT(RotL) : BINARY_INT(RotR), type); } abort_on(op); } case 's': { if (op[1] == 'h') { - if (op[2] == 'l') return makeBinary(s, BinaryOp::Shl, type); - return makeBinary(s, op[4] == 'u' ? BinaryOp::ShrU : BinaryOp::ShrS, type); + if (op[2] == 'l') return makeBinary(s, BINARY_INT(Shl), type); + return makeBinary(s, op[4] == 'u' ? BINARY_INT(ShrU) : BINARY_INT(ShrS), type); } - if (op[1] == 'u') return makeBinary(s, BinaryOp::Sub, type); + if (op[1] == 'u') return makeBinary(s, BINARY_INT_OR_FLOAT(Sub), type); if (op[1] == 'q') return makeUnary(s, type == f32 ? UnaryOp::SqrtFloat32 : UnaryOp::SqrtFloat64, type); if (op[1] == 't') return makeStore(s, type); abort_on(op); @@ -649,7 +652,7 @@ public: abort_on(op); } case 'x': { - if (op[1] == 'o') return makeBinary(s, BinaryOp::Xor, type); + if (op[1] == 'o') return makeBinary(s, BINARY_INT(Xor), type); abort_on(op); } default: abort_on(op); |