Index: test/cctest/test-assembler-mips.cc |
diff --git a/test/cctest/test-assembler-mips.cc b/test/cctest/test-assembler-mips.cc |
index e73b40e96b88782da35ff8840d97a4b82691808a..c7944b5f88828e7a9184417a5d5356c29a526ca8 100644 |
--- a/test/cctest/test-assembler-mips.cc |
+++ b/test/cctest/test-assembler-mips.cc |
@@ -5386,4 +5386,141 @@ TEST(Trampoline) { |
CHECK_EQ(res, 0); |
} |
balazs.kilvady
2016/09/05 12:54:01
I think you should create common TestCases but dif
Ilija.Pavlovic1
2016/09/07 08:44:29
The test will be broken in two tests: for r2 will
|
+TEST(madd_s_msub_s_maddf_s_msubf_s) { |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ HandleScope scope(isolate); |
+ MacroAssembler assm(isolate, NULL, 0, v8::internal::CodeObjectRequired::kYes); |
+ |
+ struct TestCase { |
+ float fr, fs, ft, fd_add, fd_sub; |
+ }; |
+ |
+ float x = sqrtf(2.0); |
+ float y = sqrtf(3.0); |
+ float z = sqrtf(5.0); |
+ TestCase test_cases[] = { |
+ {x, y, z, 0.0, 0.0}, {x, y, -z, 0.0, 0.0}, {x, -y, z, 0.0, 0.0}, |
+ {x, -y, -z, 0.0, 0.0}, {-x, y, z, 0.0, 0.0}, {-x, y, -z, 0.0, 0.0}, |
+ {-x, -y, z, 0.0, 0.0}, {-x, -y, -z, 0.0, 0.0}, |
+ }; |
+ |
+ __ lwc1(f4, MemOperand(a0, offsetof(TestCase, fr))); |
+ __ lwc1(f6, MemOperand(a0, offsetof(TestCase, fs))); |
+ __ lwc1(f8, MemOperand(a0, offsetof(TestCase, ft))); |
+ __ lwc1(f16, MemOperand(a0, offsetof(TestCase, fr))); |
+ |
+ if (IsMipsArchVariant(kMips32r2)) { |
+ __ madd_s(f10, f4, f6, f8); |
+ __ swc1(f10, MemOperand(a0, offsetof(TestCase, fd_add))); |
+ __ msub_s(f16, f4, f6, f8); |
+ __ swc1(f16, MemOperand(a0, offsetof(TestCase, fd_sub))); |
+ } |
+ |
+ if (IsMipsArchVariant(kMips32r6)) { |
+ __ maddf_s(f4, f6, f8); |
+ __ swc1(f4, MemOperand(a0, offsetof(TestCase, fd_add))); |
+ __ msubf_s(f16, f6, f8); |
+ __ swc1(f16, MemOperand(a0, offsetof(TestCase, fd_sub))); |
+ } |
+ |
+ __ jr(ra); |
+ __ nop(); |
+ |
+ CodeDesc desc; |
+ assm.GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+ F3 f = FUNCTION_CAST<F3>(code->entry()); |
+ |
+ const size_t kTableLength = sizeof(test_cases) / sizeof(TestCase); |
+ TestCase tc; |
+ for (size_t i = 0; i < kTableLength; i++) { |
+ tc.fr = test_cases[i].fr; |
+ tc.fs = test_cases[i].fs; |
+ tc.ft = test_cases[i].ft; |
+ |
+ (CALL_GENERATED_CODE(isolate, f, &tc, 0, 0, 0, 0)); |
+ |
+ float res_add = tc.fr + (tc.fs * tc.ft); |
+ float res_sub; |
+ if (IsMipsArchVariant(kMips32r2)) { |
+ res_sub = (tc.fs * tc.ft) - tc.fr; |
+ } else if (IsMipsArchVariant(kMips32r6)) { |
+ res_sub = tc.fr - (tc.fs * tc.ft); |
+ } |
+ |
+ CHECK_EQ(tc.fd_add, res_add); |
+ CHECK_EQ(tc.fd_sub, res_sub); |
+ } |
+} |
+ |
+TEST(madd_d_msub_d_maddf_d_msubf_d) { |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ HandleScope scope(isolate); |
+ MacroAssembler assm(isolate, NULL, 0, v8::internal::CodeObjectRequired::kYes); |
+ |
+ struct TestCase { |
+ double fr, fs, ft, fd_add, fd_sub; |
+ }; |
+ |
+ double x = sqrt(2.0); |
+ double y = sqrt(3.0); |
+ double z = sqrt(5.0); |
+ TestCase test_cases[] = {{x, y, z, 0.0, 0.0}, {x, y, -z, 0.0, 0.0}, |
+ {x, -y, z, 0.0, 0.0}, {x, -y, -z, 0.0, 0.0}, |
+ {-x, y, z, 0.0, 0.0}, {-x, y, -z, 0.0, 0.0}, |
+ {-x, -y, z, 0.0, 0.0}, {-x, -y, -z, 0.0, 0.0}}; |
+ |
+ __ ldc1(f4, MemOperand(a0, offsetof(TestCase, fr))); |
+ __ ldc1(f6, MemOperand(a0, offsetof(TestCase, fs))); |
+ __ ldc1(f8, MemOperand(a0, offsetof(TestCase, ft))); |
+ __ ldc1(f16, MemOperand(a0, offsetof(TestCase, fr))); |
+ |
+ if (IsMipsArchVariant(kMips32r2)) { |
+ __ madd_d(f10, f4, f6, f8); |
+ __ sdc1(f10, MemOperand(a0, offsetof(TestCase, fd_add))); |
+ __ msub_d(f16, f4, f6, f8); |
+ __ sdc1(f16, MemOperand(a0, offsetof(TestCase, fd_sub))); |
+ } |
+ |
+ if (IsMipsArchVariant(kMips32r6)) { |
+ __ maddf_d(f4, f6, f8); |
+ __ sdc1(f4, MemOperand(a0, offsetof(TestCase, fd_add))); |
+ __ msubf_d(f16, f6, f8); |
+ __ sdc1(f16, MemOperand(a0, offsetof(TestCase, fd_sub))); |
+ } |
+ |
+ __ jr(ra); |
+ __ nop(); |
+ |
+ CodeDesc desc; |
+ assm.GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+ F3 f = FUNCTION_CAST<F3>(code->entry()); |
+ |
+ const size_t kTableLength = sizeof(test_cases) / sizeof(TestCase); |
+ TestCase tc; |
+ for (size_t i = 0; i < kTableLength; i++) { |
+ tc.fr = test_cases[i].fr; |
+ tc.fs = test_cases[i].fs; |
+ tc.ft = test_cases[i].ft; |
+ |
+ (CALL_GENERATED_CODE(isolate, f, &tc, 0, 0, 0, 0)); |
+ |
+ double res_add = tc.fr + (tc.fs * tc.ft); |
+ double res_sub; |
+ if (IsMipsArchVariant(kMips32r2)) { |
+ res_sub = (tc.fs * tc.ft) - tc.fr; |
+ } else if (IsMipsArchVariant(kMips32r6)) { |
+ res_sub = tc.fr - (tc.fs * tc.ft); |
+ } |
+ |
+ CHECK_EQ(tc.fd_add, res_add); |
+ CHECK_EQ(tc.fd_sub, res_sub); |
+ } |
+} |
+ |
#undef __ |