Index: test/cctest/compiler/test-run-machops.cc |
diff --git a/test/cctest/compiler/test-run-machops.cc b/test/cctest/compiler/test-run-machops.cc |
index a8031a257079eb8c10c14ba3c54b9c5ff5d65c7c..1b74c04737739233c182868deeec2b2dddaedfb8 100644 |
--- a/test/cctest/compiler/test-run-machops.cc |
+++ b/test/cctest/compiler/test-run-machops.cc |
@@ -28,6 +28,39 @@ TEST(RunInt32Add) { |
CHECK_EQ(1, m.Call()); |
} |
+static int RunInt32AddShift(bool is_left, int32_t add_left, int32_t add_right, |
+ int32_t shift_left, int32_t shit_right) { |
+ RawMachineAssemblerTester<int32_t> m; |
+ Node* shift = |
+ m.Word32Shl(m.Int32Constant(shift_left), m.Int32Constant(shit_right)); |
+ Node* add = m.Int32Add(m.Int32Constant(add_left), m.Int32Constant(add_right)); |
+ Node* lsa = is_left ? m.Int32Add(shift, add) : m.Int32Add(add, shift); |
+ m.Return(lsa); |
+ return m.Call(); |
+} |
+ |
+TEST(RunInt32AddShift) { |
+ struct Test_case { |
+ int32_t add_left, add_right, shift_left, shit_right, expected; |
+ }; |
+ |
+ Test_case tc[] = { |
+ {20, 22, 4, 2, 58}, |
+ {20, 22, 4, 1, 50}, |
+ {20, 22, 1, 6, 106}, |
+ {INT_MAX - 2, 1, 1, 1, INT_MIN}, // INT_MAX - 2 + 1 + (1 << 1), overflow. |
+ }; |
+ const size_t tc_size = sizeof(tc) / sizeof(Test_case); |
+ |
+ for (size_t i = 0; i < tc_size; ++i) { |
+ CHECK_EQ(tc[i].expected, |
+ RunInt32AddShift(false, tc[i].add_left, tc[i].add_right, |
+ tc[i].shift_left, tc[i].shit_right)); |
+ CHECK_EQ(tc[i].expected, |
+ RunInt32AddShift(true, tc[i].add_left, tc[i].add_right, |
+ tc[i].shift_left, tc[i].shit_right)); |
+ } |
+} |
TEST(RunWord32ReverseBits) { |
BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); |
@@ -636,6 +669,38 @@ TEST(RunInt64SubWithOverflowInBranchP) { |
} |
} |
+static int64_t RunInt64AddShift(bool is_left, int64_t add_left, |
+ int64_t add_right, int64_t shift_left, |
+ int64_t shit_right) { |
+ RawMachineAssemblerTester<int64_t> m; |
+ Node* shift = m.Word64Shl(m.Int64Constant(4), m.Int64Constant(2)); |
+ Node* add = m.Int64Add(m.Int64Constant(20), m.Int64Constant(22)); |
+ Node* dlsa = is_left ? m.Int64Add(shift, add) : m.Int64Add(add, shift); |
+ m.Return(dlsa); |
+ return m.Call(); |
+} |
+ |
+TEST(RunInt64AddShift) { |
+ struct Test_case { |
+ int64_t add_left, add_right, shift_left, shit_right, expected; |
+ }; |
+ |
+ Test_case tc[] = { |
+ {20, 22, 4, 2, 58}, |
+ {20, 22, 4, 1, 50}, |
+ {20, 22, 1, 6, 106}, |
+ {INT64_MAX - 2, 1, 1, 1, |
+ INT64_MIN}, // INT64_MAX - 2 + 1 + (1 << 1), overflow. |
+ }; |
+ const size_t tc_size = sizeof(tc) / sizeof(Test_case); |
+ |
+ for (size_t i = 0; i < tc_size; ++i) { |
+ CHECK_EQ(58, RunInt64AddShift(false, tc[i].add_left, tc[i].add_right, |
+ tc[i].shift_left, tc[i].shit_right)); |
+ CHECK_EQ(58, RunInt64AddShift(true, tc[i].add_left, tc[i].add_right, |
+ tc[i].shift_left, tc[i].shit_right)); |
+ } |
+} |
// TODO(titzer): add tests that run 64-bit integer operations. |
#endif // V8_TARGET_ARCH_64_BIT |