| Index: runtime/vm/simulator_dbc.cc
|
| diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
|
| index 645343540935748f2f22a36ca0394da677758344..4102e8f1c71ec4182193bbafa51e30ba6e9e47df 100644
|
| --- a/runtime/vm/simulator_dbc.cc
|
| +++ b/runtime/vm/simulator_dbc.cc
|
| @@ -1694,6 +1694,142 @@ RawObject* Simulator::Call(const Code& code,
|
| DISPATCH();
|
| }
|
|
|
| +#if defined(ARCH_IS_64_BIT)
|
| + {
|
| + BYTECODE(WriteIntoDouble, A_D);
|
| + const double value = bit_cast<double, RawObject*>(FP[rD]);
|
| + RawDouble* box = RAW_CAST(Double, *SP--);
|
| + box->ptr()->value_ = value;
|
| + FP[rA] = box;
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(UnboxDouble, A_D);
|
| + const RawDouble* box = RAW_CAST(Double, FP[rD]);
|
| + FP[rA] = bit_cast<RawObject*, double>(box->ptr()->value_);
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(CheckedUnboxDouble, A_D);
|
| + const intptr_t box_cid = SimulatorHelpers::GetClassId(FP[rD]);
|
| + if (box_cid == kSmiCid) {
|
| + const intptr_t value = reinterpret_cast<intptr_t>(FP[rD]) >> kSmiTagSize;
|
| + const double result = static_cast<double>(value);
|
| + FP[rA] = bit_cast<RawObject*, double>(result);
|
| + pc++;
|
| + } else if (box_cid == kDoubleCid) {
|
| + const RawDouble* box = RAW_CAST(Double, FP[rD]);
|
| + FP[rA] = bit_cast<RawObject*, double>(box->ptr()->value_);
|
| + pc++;
|
| + }
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(SmiToDouble, A_D);
|
| + const intptr_t value = reinterpret_cast<intptr_t>(FP[rD]) >> kSmiTagSize;
|
| + const double result = static_cast<double>(value);
|
| + FP[rA] = bit_cast<RawObject*, double>(result);
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(DAdd, A_B_C);
|
| + const double lhs = bit_cast<double, RawObject*>(FP[rB]);
|
| + const double rhs = bit_cast<double, RawObject*>(FP[rC]);
|
| + FP[rA] = bit_cast<RawObject*, double>(lhs + rhs);
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(DSub, A_B_C);
|
| + const double lhs = bit_cast<double, RawObject*>(FP[rB]);
|
| + const double rhs = bit_cast<double, RawObject*>(FP[rC]);
|
| + FP[rA] = bit_cast<RawObject*, double>(lhs - rhs);
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(DMul, A_B_C);
|
| + const double lhs = bit_cast<double, RawObject*>(FP[rB]);
|
| + const double rhs = bit_cast<double, RawObject*>(FP[rC]);
|
| + FP[rA] = bit_cast<RawObject*, double>(lhs * rhs);
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(DDiv, A_B_C);
|
| + const double lhs = bit_cast<double, RawObject*>(FP[rB]);
|
| + const double rhs = bit_cast<double, RawObject*>(FP[rC]);
|
| + const double result = lhs / rhs;
|
| + FP[rA] = bit_cast<RawObject*, double>(result);
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(DNeg, A_D);
|
| + const double value = bit_cast<double, RawObject*>(FP[rD]);
|
| + FP[rA] = bit_cast<RawObject*, double>(-value);
|
| + DISPATCH();
|
| + }
|
| +#else // defined(ARCH_IS_64_BIT)
|
| + {
|
| + BYTECODE(WriteIntoDouble, A_D);
|
| + UNIMPLEMENTED();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(UnboxDouble, A_D);
|
| + UNIMPLEMENTED();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(CheckedUnboxDouble, A_D);
|
| + UNIMPLEMENTED();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(SmiToDouble, A_D);
|
| + UNIMPLEMENTED();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(DAdd, A_B_C);
|
| + UNIMPLEMENTED();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(DSub, A_B_C);
|
| + UNIMPLEMENTED();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(DMul, A_B_C);
|
| + UNIMPLEMENTED();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(DDiv, A_B_C);
|
| + UNIMPLEMENTED();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(DNeg, A_D);
|
| + UNIMPLEMENTED();
|
| + DISPATCH();
|
| + }
|
| +#endif // defined(ARCH_IS_64_BIT)
|
| +
|
| // Return and return like instructions (Instrinsic).
|
| {
|
| RawObject* result; // result to return to the caller.
|
| @@ -2088,8 +2224,20 @@ RawObject* Simulator::Call(const Code& code,
|
| }
|
|
|
| {
|
| + BYTECODE(CheckEitherNonSmi, A_D);
|
| + const intptr_t obj1 = reinterpret_cast<intptr_t>(FP[rA]);
|
| + const intptr_t obj2 = reinterpret_cast<intptr_t>(FP[rD]);
|
| + const intptr_t tag = (obj1 | obj2) & kSmiTagMask;
|
| + if (tag != kSmiTag) {
|
| + pc++;
|
| + }
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| BYTECODE(CheckClassId, A_D);
|
| - const intptr_t actual_cid = SimulatorHelpers::GetClassId(FP[rA]);
|
| + const intptr_t actual_cid =
|
| + reinterpret_cast<intptr_t>(FP[rA]) >> kSmiTagSize;
|
| const intptr_t desired_cid = rD;
|
| pc += (actual_cid == desired_cid) ? 1 : 0;
|
| DISPATCH();
|
| @@ -2294,6 +2442,92 @@ RawObject* Simulator::Call(const Code& code,
|
| DISPATCH();
|
| }
|
|
|
| +#if defined(ARCH_IS_64_BIT)
|
| + {
|
| + BYTECODE(IfDEq, A_D);
|
| + const double lhs = bit_cast<double, RawObject*>(FP[rA]);
|
| + const double rhs = bit_cast<double, RawObject*>(FP[rD]);
|
| + pc += (lhs == rhs) ? 0 : 1;
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(IfDNe, A_D);
|
| + const double lhs = bit_cast<double, RawObject*>(FP[rA]);
|
| + const double rhs = bit_cast<double, RawObject*>(FP[rD]);
|
| + pc += (lhs != rhs) ? 0 : 1;
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(IfDLe, A_D);
|
| + const double lhs = bit_cast<double, RawObject*>(FP[rA]);
|
| + const double rhs = bit_cast<double, RawObject*>(FP[rD]);
|
| + pc += (lhs <= rhs) ? 0 : 1;
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(IfDLt, A_D);
|
| + const double lhs = bit_cast<double, RawObject*>(FP[rA]);
|
| + const double rhs = bit_cast<double, RawObject*>(FP[rD]);
|
| + pc += (lhs < rhs) ? 0 : 1;
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(IfDGe, A_D);
|
| + const double lhs = bit_cast<double, RawObject*>(FP[rA]);
|
| + const double rhs = bit_cast<double, RawObject*>(FP[rD]);
|
| + pc += (lhs >= rhs) ? 0 : 1;
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(IfDGt, A_D);
|
| + const double lhs = bit_cast<double, RawObject*>(FP[rA]);
|
| + const double rhs = bit_cast<double, RawObject*>(FP[rD]);
|
| + pc += (lhs > rhs) ? 0 : 1;
|
| + DISPATCH();
|
| + }
|
| +#else // defined(ARCH_IS_64_BIT)
|
| + {
|
| + BYTECODE(IfDEq, A_D);
|
| + UNREACHABLE();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(IfDNe, A_D);
|
| + UNREACHABLE();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(IfDLe, A_D);
|
| + UNREACHABLE();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(IfDLt, A_D);
|
| + UNREACHABLE();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(IfDGe, A_D);
|
| + UNREACHABLE();
|
| + DISPATCH();
|
| + }
|
| +
|
| + {
|
| + BYTECODE(IfDGt, A_D);
|
| + UNREACHABLE();
|
| + DISPATCH();
|
| + }
|
| +#endif // defined(ARCH_IS_64_BIT)
|
| +
|
| {
|
| BYTECODE(IfEqStrictNum, A_D);
|
| RawObject* lhs = FP[rA];
|
| @@ -2528,6 +2762,7 @@ RawObject* Simulator::Call(const Code& code,
|
| return 0;
|
| }
|
|
|
| +
|
| void Simulator::Longjmp(uword pc,
|
| uword sp,
|
| uword fp,
|
| @@ -2565,5 +2800,4 @@ void Simulator::Longjmp(uword pc,
|
|
|
| } // namespace dart
|
|
|
| -
|
| #endif // defined TARGET_ARCH_DBC
|
|
|