Index: test/cctest/test-assembler-arm.cc |
diff --git a/test/cctest/test-assembler-arm.cc b/test/cctest/test-assembler-arm.cc |
index ed9563d04b7022b532192b5d434d2a3b516f49f2..c7fdae8aec047e63a9dd26cf5f9fd8edaf01c9af 100644 |
--- a/test/cctest/test-assembler-arm.cc |
+++ b/test/cctest/test-assembler-arm.cc |
@@ -25,6 +25,8 @@ |
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+#include <iostream> // NOLINT(readability/streams) |
+ |
#include "src/v8.h" |
#include "test/cctest/cctest.h" |
@@ -1495,6 +1497,135 @@ TEST(18) { |
#undef TEST_SDIV |
+#define TEST_SMMUL(f, x, y) \ |
Benedikt Meurer
2014/10/13 18:25:48
Move all the new tests to test/unittests/arm/assem
Benedikt Meurer
2014/10/14 04:49:43
Maybe later...
|
+ do { \ |
+ int32_t actual; \ |
+ Object* dummy = CALL_GENERATED_CODE(f, &actual, x, y, 0, 0); \ |
+ CHECK_EQ(v8::base::bits::SignedMulHigh32(x, y), actual); \ |
+ USE(dummy); \ |
+ } while (0) |
+ |
+ |
+TEST(19) { |
+ // Test smmul. |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ HandleScope scope(isolate); |
+ |
+ Assembler assm(isolate, nullptr, 0); |
+ |
+ __ smmul(r1, r1, r2); |
+ __ str(r1, MemOperand(r0)); |
+ __ bx(lr); |
+ |
+ CodeDesc desc; |
+ assm.GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+#ifdef DEBUG |
+ code->Print(std::cout); |
+#endif |
+ F3 f = FUNCTION_CAST<F3>(code->entry()); |
+ TEST_SMMUL(f, kMinInt, kMinInt); |
+ TEST_SMMUL(f, kMinInt, -1); |
+ TEST_SMMUL(f, -1, kMinInt); |
+ TEST_SMMUL(f, kMinInt, kMaxInt); |
+ TEST_SMMUL(f, kMaxInt, kMinInt); |
+ TEST_SMMUL(f, 0, 1); |
+ TEST_SMMUL(f, 1, 0); |
+ TEST_SMMUL(f, 42, -1); |
+} |
+ |
+ |
+#undef TEST_SMMUL |
+ |
+ |
+#define TEST_SMMLA(f, x, y, z) \ |
+ do { \ |
+ int32_t actual; \ |
+ Object* dummy = CALL_GENERATED_CODE(f, &actual, x, y, z, 0); \ |
+ CHECK_EQ(v8::base::bits::SignedMulHighAndAdd32(x, y, z), actual); \ |
+ USE(dummy); \ |
+ } while (0) |
+ |
+ |
+TEST(20) { |
+ // Test smmla. |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ HandleScope scope(isolate); |
+ |
+ Assembler assm(isolate, nullptr, 0); |
+ |
+ __ smmla(r1, r1, r2, r3); |
+ __ str(r1, MemOperand(r0)); |
+ __ bx(lr); |
+ |
+ CodeDesc desc; |
+ assm.GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+#ifdef DEBUG |
+ code->Print(std::cout); |
+#endif |
+ F3 f = FUNCTION_CAST<F3>(code->entry()); |
+ TEST_SMMLA(f, kMinInt, kMinInt, 123456); |
+ TEST_SMMLA(f, kMinInt, -1, 0); |
+ TEST_SMMLA(f, -1, kMinInt, -1); |
+ TEST_SMMLA(f, kMinInt, kMaxInt, 1); |
+ TEST_SMMLA(f, kMaxInt, kMinInt, 0); |
+ TEST_SMMLA(f, 0, 1, kMinInt); |
+ TEST_SMMLA(f, 1, 0, kMaxInt - 1); |
+ TEST_SMMLA(f, 42, -1, 0); |
+} |
+ |
+ |
+#undef TEST_SMMLA |
+ |
+ |
+#define TEST_SMMLS(f, x, y, z) \ |
+ do { \ |
+ int32_t actual; \ |
+ Object* dummy = CALL_GENERATED_CODE(f, &actual, x, y, z, 0); \ |
+ CHECK_EQ(v8::base::bits::SignedMulHighAndSub32(x, y, z), actual); \ |
+ USE(dummy); \ |
+ } while (0) |
+ |
+ |
+TEST(21) { |
+ // Test smmls. |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ HandleScope scope(isolate); |
+ |
+ Assembler assm(isolate, nullptr, 0); |
+ |
+ __ smmls(r1, r1, r2, r3); |
+ __ str(r1, MemOperand(r0)); |
+ __ bx(lr); |
+ |
+ CodeDesc desc; |
+ assm.GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+#ifdef DEBUG |
+ code->Print(std::cout); |
+#endif |
+ F3 f = FUNCTION_CAST<F3>(code->entry()); |
+ TEST_SMMLS(f, kMinInt, kMinInt, 123456); |
+ TEST_SMMLS(f, kMinInt, -1, 0); |
+ TEST_SMMLS(f, -1, kMinInt, -1); |
+ TEST_SMMLS(f, kMinInt, kMaxInt, 1); |
+ TEST_SMMLS(f, kMaxInt, kMinInt, 0); |
+ TEST_SMMLS(f, 0, 1, kMinInt); |
+ TEST_SMMLS(f, 1, 0, kMaxInt - 1); |
+ TEST_SMMLS(f, 42, -1, 0); |
+} |
+ |
+ |
+#undef TEST_SMMLS |
+ |
+ |
TEST(code_relative_offset) { |
// Test extracting the offset of a label from the beginning of the code |
// in a register. |