diff options
Diffstat (limited to 'src')
-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()))))))); } }; |