Index: test/cctest/compiler/test-machine-operator-reducer.cc |
diff --git a/test/cctest/compiler/test-machine-operator-reducer.cc b/test/cctest/compiler/test-machine-operator-reducer.cc |
index ec14cd2467fc757d72791a1646662c79dcf609bb..b538fb7ff5fa00bd70e1b7580bb3fc655953b28a 100644 |
--- a/test/cctest/compiler/test-machine-operator-reducer.cc |
+++ b/test/cctest/compiler/test-machine-operator-reducer.cc |
@@ -52,11 +52,13 @@ double ValueOfOperator<double>(const Operator* op) { |
class ReducerTester : public HandleAndZoneScope { |
public: |
- explicit ReducerTester(int num_parameters = 0) |
+ explicit ReducerTester( |
+ int num_parameters = 0, |
+ MachineOperatorBuilder::Flags flags = MachineOperatorBuilder::kNoFlags) |
: isolate(main_isolate()), |
binop(NULL), |
unop(NULL), |
- machine(main_zone()), |
+ machine(main_zone(), kMachPtr, flags), |
common(main_zone()), |
graph(main_zone()), |
javascript(main_zone()), |
@@ -358,7 +360,36 @@ TEST(ReduceWord32Sar) { |
} |
-TEST(ReduceWord32Equal) { |
+static void CheckJsShift(ReducerTester* R) { |
+ DCHECK(R->machine.Word32ShiftIsSafe()); |
+ |
+ Node* x = R->Parameter(0); |
+ Node* y = R->Parameter(1); |
+ Node* thirty_one = R->Constant<int32_t>(0x1f); |
+ Node* y_and_thirty_one = |
+ R->graph.NewNode(R->machine.Word32And(), y, thirty_one); |
+ |
+ // If the underlying machine shift instructions 'and' their right operand |
+ // with 0x1f then: x << (y & 0x1f) => x << y |
+ R->CheckFoldBinop(x, y, x, y_and_thirty_one); |
+} |
+ |
+ |
+TEST(ReduceJsShifts) { |
+ ReducerTester R(0, MachineOperatorBuilder::kWord32ShiftIsSafe); |
+ |
+ R.binop = R.machine.Word32Shl(); |
+ CheckJsShift(&R); |
+ |
+ R.binop = R.machine.Word32Shr(); |
+ CheckJsShift(&R); |
+ |
+ R.binop = R.machine.Word32Sar(); |
+ CheckJsShift(&R); |
+} |
+ |
+ |
+TEST(Word32Equal) { |
ReducerTester R; |
R.binop = R.machine.Word32Equal(); |