Chromium Code Reviews| Index: runtime/vm/simulator_dbc.cc |
| diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc |
| index 645343540935748f2f22a36ca0394da677758344..b2a0e62de4223e8845242dab18df0e4beeea42a9 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(BoxDouble, A_D); |
|
Vyacheslav Egorov (Google)
2016/07/14 16:26:24
I would call this bytecode WriteIntoDouble or some
zra
2016/07/14 21:12:10
Done.
|
| + 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(BoxDouble, 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. |
| @@ -2089,7 +2225,8 @@ RawObject* Simulator::Call(const Code& code, |
| { |
| 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 +2431,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 +2751,7 @@ RawObject* Simulator::Call(const Code& code, |
| return 0; |
| } |
| + |
| void Simulator::Longjmp(uword pc, |
| uword sp, |
| uword fp, |
| @@ -2565,5 +2789,4 @@ void Simulator::Longjmp(uword pc, |
| } // namespace dart |
| - |
| #endif // defined TARGET_ARCH_DBC |