diff options
author | Max Graey <maxgraey@gmail.com> | 2021-08-03 15:49:29 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-03 05:49:29 -0700 |
commit | 718eb2e3e6d3555af1e077e4115a46e968e4fef4 (patch) | |
tree | 251340170f3824d7e35c522a361465fabd3fbc34 | |
parent | f1136a48518378eb3454f5da4f05c686755b5819 (diff) | |
download | binaryen-718eb2e3e6d3555af1e077e4115a46e968e4fef4.tar.gz binaryen-718eb2e3e6d3555af1e077e4115a46e968e4fef4.tar.bz2 binaryen-718eb2e3e6d3555af1e077e4115a46e968e4fef4.zip |
[OptimizeForJS] Refactor rewritePopcntEqualOne (#4050)
-rw-r--r-- | src/passes/OptimizeForJS.cpp | 34 |
1 files changed, 8 insertions, 26 deletions
diff --git a/src/passes/OptimizeForJS.cpp b/src/passes/OptimizeForJS.cpp index 976a16f94..b5ba84d90 100644 --- a/src/passes/OptimizeForJS.cpp +++ b/src/passes/OptimizeForJS.cpp @@ -44,30 +44,11 @@ struct OptimizeForJSPass : public WalkerPass<PostWalker<OptimizeForJSPass>> { void rewritePopcntEqualOne(Expression* expr) { // popcnt(x) == 1 ==> !!x & !(x & (x - 1)) - BinaryOp andOp, subOp; - UnaryOp eqzOp; - Literal litOne; - Type type = expr->type; - - switch (type.getBasic()) { - case Type::i32: - eqzOp = EqZInt32; - andOp = AndInt32; - subOp = SubInt32; - litOne = Literal::makeOne(Type::i32); - break; - - case Type::i64: - eqzOp = EqZInt64; - andOp = AndInt64; - subOp = SubInt64; - litOne = Literal::makeOne(Type::i64); - break; + using namespace Abstract; - default: - return; - } + Type type = expr->type; + UnaryOp eqzOp = getUnary(type, EqZ); Localizer temp(expr, getFunction(), getModule()); Builder builder(*getModule()); @@ -79,11 +60,12 @@ struct OptimizeForJSPass : public WalkerPass<PostWalker<OptimizeForJSPass>> { builder.makeUnary( eqzOp, builder.makeBinary( - andOp, + getBinary(type, And), builder.makeLocalGet(temp.index, type), - builder.makeBinary(subOp, - builder.makeLocalGet(temp.index, type), - builder.makeConst(litOne)))))); + builder.makeBinary( + getBinary(type, Sub), + builder.makeLocalGet(temp.index, type), + builder.makeConst(Literal::makeOne(type.getBasic()))))))); } }; |