Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Unified Diff: test/cctest/test-assembler-mips.cc

Issue 2313623002: MIPS: Implement MADD.S, MSUB, MADDF and MSUBF. (Closed)
Patch Set: Redesign implementation of the test. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..00f51977c70de498d40fe2a2a040b3bcf805a20f 100644
--- a/test/cctest/test-assembler-mips.cc
+++ b/test/cctest/test-assembler-mips.cc
@@ -5386,4 +5386,125 @@ TEST(Trampoline) {
CHECK_EQ(res, 0);
}
+template <class T>
+struct TestCaseMaddMsub {
+ T fr, fs, ft, fd_add, fd_sub;
+};
+
+template <typename T, typename F>
+void helper_madd_msub_maddf_msubf(F func) {
+ CcTest::InitializeVM();
+ Isolate* isolate = CcTest::i_isolate();
+ HandleScope scope(isolate);
+ MacroAssembler assm(isolate, NULL, 0, v8::internal::CodeObjectRequired::kYes);
+
+ T x = std::sqrt(static_cast<T>(2.0));
+ T y = std::sqrt(static_cast<T>(3.0));
+ T z = std::sqrt(static_cast<T>(5.0));
+ T x2 = 11.11, y2 = 22.22, z2 = 33.33;
+ TestCaseMaddMsub<T> 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},
+ {-3.14, 0.2345, -123.000056, 0.0, 0.0},
+ {7.3, -23.257, -357.1357, 0.0, 0.0},
+ {x2, y2, z2, 0.0, 0.0},
+ {x2, y2, -z2, 0.0, 0.0},
+ {x2, -y2, z2, 0.0, 0.0},
+ {x2, -y2, -z2, 0.0, 0.0},
+ {-x2, y2, z2, 0.0, 0.0},
+ {-x2, y2, -z2, 0.0, 0.0},
+ {-x2, -y2, z2, 0.0, 0.0},
+ {-x2, -y2, -z2, 0.0, 0.0},
+ };
+
+ if (std::is_same<T, float>::value) {
ivica.bogosavljevic 2016/09/13 07:44:20 Could you use if (sizeof(T) == 4) else if (sizeof(
balazs.kilvady 2016/09/13 10:20:32 Why would that be better? T can be float or double
Ilija.Pavlovic1 2016/09/13 12:57:57 These kind of checkings will remain in the code.
balazs.kilvady 2016/09/14 09:12:01 You could add else { UNREACHABLE(); } if you don't
+ __ lwc1(f4, MemOperand(a0, offsetof(TestCaseMaddMsub<T>, fr)));
+ __ lwc1(f6, MemOperand(a0, offsetof(TestCaseMaddMsub<T>, fs)));
+ __ lwc1(f8, MemOperand(a0, offsetof(TestCaseMaddMsub<T>, ft)));
+ __ lwc1(f16, MemOperand(a0, offsetof(TestCaseMaddMsub<T>, fr)));
+ } else if (std::is_same<T, double>::value) {
+ __ ldc1(f4, MemOperand(a0, offsetof(TestCaseMaddMsub<T>, fr)));
+ __ ldc1(f6, MemOperand(a0, offsetof(TestCaseMaddMsub<T>, fs)));
+ __ ldc1(f8, MemOperand(a0, offsetof(TestCaseMaddMsub<T>, ft)));
+ __ ldc1(f16, MemOperand(a0, offsetof(TestCaseMaddMsub<T>, fr)));
+ }
+
+ func(assm);
+
+ __ 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(TestCaseMaddMsub<T>);
+ TestCaseMaddMsub<T> 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));
+
+ T res_add = tc.fr + (tc.fs * tc.ft);
+ T res_sub;
+ if (IsMipsArchVariant(kMips32r2))
ivica.bogosavljevic 2016/09/13 07:44:20 You need to add braces {} here
balazs.kilvady 2016/09/13 10:20:32 I agree. And bellow and for all the multi line `if
Ilija.Pavlovic1 2016/09/13 12:57:57 Done.
+ 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_msub_s) {
+ if (!IsMipsArchVariant(kMips32r2)) return;
+ helper_madd_msub_maddf_msubf<float>([](MacroAssembler& assm) {
+ __ madd_s(f10, f4, f6, f8);
+ __ swc1(f10, MemOperand(a0, offsetof(TestCaseMaddMsub<float>, fd_add)));
+ __ msub_s(f16, f4, f6, f8);
+ __ swc1(f16, MemOperand(a0, offsetof(TestCaseMaddMsub<float>, fd_sub)));
+ });
+}
+
+TEST(madd_msub_d) {
+ if (!IsMipsArchVariant(kMips32r2)) return;
+ helper_madd_msub_maddf_msubf<double>([](MacroAssembler& assm) {
+ __ madd_d(f10, f4, f6, f8);
+ __ sdc1(f10, MemOperand(a0, offsetof(TestCaseMaddMsub<double>, fd_add)));
+ __ msub_d(f16, f4, f6, f8);
+ __ sdc1(f16, MemOperand(a0, offsetof(TestCaseMaddMsub<double>, fd_sub)));
+ });
+}
+
+TEST(maddf_msubf_s) {
+ if (!IsMipsArchVariant(kMips32r6)) return;
+ helper_madd_msub_maddf_msubf<float>([](MacroAssembler& assm) {
+ __ maddf_s(f4, f6, f8);
+ __ swc1(f4, MemOperand(a0, offsetof(TestCaseMaddMsub<float>, fd_add)));
+ __ msubf_s(f16, f6, f8);
+ __ swc1(f16, MemOperand(a0, offsetof(TestCaseMaddMsub<float>, fd_sub)));
+ });
+}
+
+TEST(maddf_msubf_d) {
+ if (!IsMipsArchVariant(kMips32r6)) return;
+ helper_madd_msub_maddf_msubf<double>([](MacroAssembler& assm) {
+ __ maddf_d(f4, f6, f8);
+ __ sdc1(f4, MemOperand(a0, offsetof(TestCaseMaddMsub<double>, fd_add)));
+ __ msubf_d(f16, f6, f8);
+ __ sdc1(f16, MemOperand(a0, offsetof(TestCaseMaddMsub<double>, fd_sub)));
+ });
+}
+
#undef __

Powered by Google App Engine
This is Rietveld 408576698