| Index: runtime/vm/assembler_dbc_test.cc
|
| diff --git a/runtime/vm/assembler_dbc_test.cc b/runtime/vm/assembler_dbc_test.cc
|
| index d852cb54ce532a75e99cf79fc71d113d25f88795..4f68a7b5476e258cb43d8e337f18110960ed4526 100644
|
| --- a/runtime/vm/assembler_dbc_test.cc
|
| +++ b/runtime/vm/assembler_dbc_test.cc
|
| @@ -28,6 +28,8 @@ static RawObject* ExecuteTest(const Code& code) {
|
| (Bool::RawCast(ExecuteTest(code)) == Bool::True().raw())
|
| #define EXECUTE_TEST_CODE_OBJECT(code) \
|
| Object::Handle(ExecuteTest(code))
|
| +#define EXECUTE_TEST_CODE_DOUBLE(code) \
|
| + bit_cast<double, RawObject*>(ExecuteTest(code))
|
|
|
| #define __ assembler->
|
|
|
| @@ -1773,9 +1775,10 @@ ASSEMBLER_TEST_RUN(CheckSmiFail, test) {
|
| // If the object at FP[rA]'s class id matches hthe class id in PP[D], then
|
| // skip the following instruction.
|
| ASSEMBLER_TEST_GENERATE(CheckClassIdSmiPass, assembler) {
|
| - __ Frame(1);
|
| + __ Frame(2);
|
| __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| - __ CheckClassId(0, kSmiCid);
|
| + __ LoadClassId(1, 0);
|
| + __ CheckClassId(1, kSmiCid);
|
| __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| __ Return(0);
|
| }
|
| @@ -1787,9 +1790,10 @@ ASSEMBLER_TEST_RUN(CheckClassIdSmiPass, test) {
|
|
|
|
|
| ASSEMBLER_TEST_GENERATE(CheckClassIdNonSmiPass, assembler) {
|
| - __ Frame(1);
|
| + __ Frame(2);
|
| __ LoadConstant(0, Bool::True());
|
| - __ CheckClassId(0, kBoolCid);
|
| + __ LoadClassId(1, 0);
|
| + __ CheckClassId(1, kBoolCid);
|
| __ LoadConstant(0, Bool::False());
|
| __ Return(0);
|
| }
|
| @@ -1801,9 +1805,10 @@ ASSEMBLER_TEST_RUN(CheckClassIdNonSmiPass, test) {
|
|
|
|
|
| ASSEMBLER_TEST_GENERATE(CheckClassIdFail, assembler) {
|
| - __ Frame(1);
|
| + __ Frame(2);
|
| __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| - __ CheckClassId(0, kBoolCid);
|
| + __ LoadClassId(1, 0);
|
| + __ CheckClassId(1, kBoolCid);
|
| __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| __ Return(0);
|
| }
|
| @@ -1879,9 +1884,10 @@ ASSEMBLER_TEST_RUN(IfNeNullNotNull, test) {
|
|
|
| // - If<Cond> rA, rD
|
| //
|
| -// Cond is Le, Lt, Ge, Gt, or unsigned variants ULe, ULt, UGe, UGt.
|
| +// Cond is Le, Lt, Ge, Gt, unsigned variants ULe, ULt, UGe, UGt, and
|
| +// unboxed double variants DEq, DNe, DLe, DLt, DGe, DGt.
|
| // Skips the next instruction unless FP[rA] <Cond> FP[rD]. Assumes that
|
| -// FP[rA] and FP[rD] are Smis.
|
| +// FP[rA] and FP[rD] are Smis or unboxed doubles as inidcated by <Cond>.
|
| ASSEMBLER_TEST_GENERATE(IfLeTrue, assembler) {
|
| __ Frame(3);
|
| __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| @@ -2010,6 +2016,338 @@ ASSEMBLER_TEST_RUN(IfGtFalse, test) {
|
| }
|
|
|
|
|
| +#if defined(ARCH_IS_64_BIT)
|
| +ASSEMBLER_TEST_GENERATE(IfDNeTrue, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDNe(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDNeTrue, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDNeFalse, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDNe(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDNeFalse, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDNeNan, assembler) {
|
| + const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(not_a_number, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDNe(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDNeNan, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDEqTrue, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDEq(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDEqTrue, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDEqFalse, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDEq(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDEqFalse, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDEqNan, assembler) {
|
| + const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(not_a_number, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDEq(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDEqNan, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDLeTrue, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDLe(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDLeTrue, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDLeFalse, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDLe(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDLeFalse, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDLeNan, assembler) {
|
| + const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDLe(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDLeNan, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDLtTrue, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDLt(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDLtTrue, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDLtFalse, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDLt(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDLtFalse, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDLtNan, assembler) {
|
| + const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDLt(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDLtNan, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDGeTrue, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDGe(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDGeTrue, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDGeFalse, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDGe(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDGeFalse, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDGeNan, assembler) {
|
| + const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDGe(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDGeNan, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDGtTrue, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDGt(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDGtTrue, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDGtFalse, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDGt(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDGtFalse, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(IfDGtNan, assembler) {
|
| + const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
|
| + __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 1);
|
| + __ UnboxDouble(2, 2);
|
| + __ IfDGt(1, 2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| + __ Return(0);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(IfDGtNan, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +#endif // defined(ARCH_IS_64_BIT)
|
| +
|
| +
|
| ASSEMBLER_TEST_GENERATE(IfULeTrue, assembler) {
|
| __ Frame(3);
|
| __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
|
| @@ -2153,6 +2491,155 @@ ASSEMBLER_TEST_RUN(IfUGtFalse, test) {
|
| EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| }
|
|
|
| +
|
| +#if defined(ARCH_IS_64_BIT)
|
| +// - UnboxDouble rA, rD
|
| +//
|
| +// Unbox the double in FP[rD] into FP[rA]. Assumes FP[rD] is a double.
|
| +//
|
| +// - CheckedUnboxDouble rA, rD
|
| +//
|
| +// Unboxes FP[rD] into FP[rA] and skips the following instruction unless
|
| +// FP[rD] is not a double or a Smi. When FP[rD] is a Smi, converts it to a
|
| +// double.
|
| +ASSEMBLER_TEST_GENERATE(Unbox, assembler) {
|
| + __ Frame(2);
|
| + __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld)));
|
| + __ UnboxDouble(1, 0);
|
| + __ Return(1);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Unbox, test) {
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(CheckedUnboxDouble, assembler) {
|
| + __ Frame(2);
|
| + __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld)));
|
| + __ CheckedUnboxDouble(1, 0);
|
| + __ LoadConstant(1, Smi::Handle(Smi::New(0)));
|
| + __ Return(1);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(CheckedUnboxDouble, test) {
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(CheckedUnboxSmi, assembler) {
|
| + __ Frame(2);
|
| + __ LoadConstant(0, Smi::Handle(Smi::New(42)));
|
| + __ CheckedUnboxDouble(1, 0);
|
| + __ LoadConstant(1, Smi::Handle(Smi::New(0)));
|
| + __ Return(1);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(CheckedUnboxSmi, test) {
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(CheckedUnboxFail, assembler) {
|
| + __ Frame(2);
|
| + __ LoadConstant(0, Bool::True());
|
| + __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
|
| + __ CheckedUnboxDouble(1, 0);
|
| + __ LoadConstant(1, Smi::Handle(Smi::New(42)));
|
| + __ Return(1);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(CheckedUnboxFail, test) {
|
| + EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
|
| +}
|
| +
|
| +
|
| +// - DAdd, DSub, DMul, DDiv rA, rB, rC
|
| +//
|
| +// Arithmetic operaions on unboxed doubles. FP[rA] <- FP[rB] op FP[rC].
|
| +ASSEMBLER_TEST_GENERATE(DAdd, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Double::Handle(Double::New(41.0, Heap::kOld)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(1.0, Heap::kOld)));
|
| + __ UnboxDouble(0, 0);
|
| + __ UnboxDouble(1, 1);
|
| + __ DAdd(2, 1, 0);
|
| + __ Return(2);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(DAdd, test) {
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(DSub, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Double::Handle(Double::New(1.0, Heap::kOld)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(43.0, Heap::kOld)));
|
| + __ UnboxDouble(0, 0);
|
| + __ UnboxDouble(1, 1);
|
| + __ DSub(2, 1, 0);
|
| + __ Return(2);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(DSub, test) {
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(DMul, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Double::Handle(Double::New(6.0, Heap::kOld)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(7.0, Heap::kOld)));
|
| + __ UnboxDouble(0, 0);
|
| + __ UnboxDouble(1, 1);
|
| + __ DMul(2, 1, 0);
|
| + __ Return(2);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(DMul, test) {
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(DDiv, assembler) {
|
| + __ Frame(3);
|
| + __ LoadConstant(0, Double::Handle(Double::New(2.0, Heap::kOld)));
|
| + __ LoadConstant(1, Double::Handle(Double::New(84.0, Heap::kOld)));
|
| + __ UnboxDouble(0, 0);
|
| + __ UnboxDouble(1, 1);
|
| + __ DDiv(2, 1, 0);
|
| + __ Return(2);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(DDiv, test) {
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(DNeg, assembler) {
|
| + __ Frame(2);
|
| + __ LoadConstant(0, Double::Handle(Double::New(-42.0, Heap::kOld)));
|
| + __ UnboxDouble(0, 0);
|
| + __ DNeg(1, 0);
|
| + __ Return(1);
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(DNeg, test) {
|
| + EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
|
| +}
|
| +
|
| +#endif // defined(ARCH_IS_64_BIT)
|
| +
|
| } // namespace dart
|
|
|
| #endif // defined(TARGET_ARCH_DBC)
|
|
|