OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. |
6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
7 | 7 |
8 #include "vm/constants_mips.h" | 8 #include "vm/constants_mips.h" |
9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
10 #include "vm/instructions.h" | 10 #include "vm/instructions.h" |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 object_pool_.RawValueAt(native_function_pool_index_)); | 210 object_pool_.RawValueAt(native_function_pool_index_)); |
211 } | 211 } |
212 | 212 |
213 | 213 |
214 void NativeCallPattern::set_native_function(NativeFunction func) const { | 214 void NativeCallPattern::set_native_function(NativeFunction func) const { |
215 object_pool_.SetRawValueAt(native_function_pool_index_, | 215 object_pool_.SetRawValueAt(native_function_pool_index_, |
216 reinterpret_cast<uword>(func)); | 216 reinterpret_cast<uword>(func)); |
217 } | 217 } |
218 | 218 |
219 | 219 |
| 220 void CallPattern::InsertDeoptCallAt(uword pc, uword target_address) { |
| 221 Instr* lui = Instr::At(pc + (0 * Instr::kInstrSize)); |
| 222 Instr* ori = Instr::At(pc + (1 * Instr::kInstrSize)); |
| 223 Instr* jr = Instr::At(pc + (2 * Instr::kInstrSize)); |
| 224 Instr* nop = Instr::At(pc + (3 * Instr::kInstrSize)); |
| 225 uint16_t target_lo = target_address & 0xffff; |
| 226 uint16_t target_hi = target_address >> 16; |
| 227 |
| 228 lui->SetImmInstrBits(LUI, ZR, T9, target_hi); |
| 229 ori->SetImmInstrBits(ORI, T9, T9, target_lo); |
| 230 jr->SetSpecialInstrBits(JALR, T9, ZR, RA); |
| 231 nop->SetInstructionBits(Instr::kNopInstruction); |
| 232 |
| 233 ASSERT(kDeoptCallLengthInBytes == 4 * Instr::kInstrSize); |
| 234 CPU::FlushICache(pc, kDeoptCallLengthInBytes); |
| 235 } |
| 236 |
| 237 |
220 SwitchableCallPattern::SwitchableCallPattern(uword pc, const Code& code) | 238 SwitchableCallPattern::SwitchableCallPattern(uword pc, const Code& code) |
221 : object_pool_(ObjectPool::Handle(code.GetObjectPool())), | 239 : object_pool_(ObjectPool::Handle(code.GetObjectPool())), |
222 data_pool_index_(-1), | 240 data_pool_index_(-1), |
223 target_pool_index_(-1) { | 241 target_pool_index_(-1) { |
224 ASSERT(code.ContainsInstructionAt(pc)); | 242 ASSERT(code.ContainsInstructionAt(pc)); |
225 // Last instruction: jalr t9. | 243 // Last instruction: jalr t9. |
226 ASSERT(*(reinterpret_cast<uword*>(pc) - 1) == 0); // Delay slot. | 244 ASSERT(*(reinterpret_cast<uword*>(pc) - 1) == 0); // Delay slot. |
227 ASSERT(*(reinterpret_cast<uword*>(pc) - 2) == 0x0320f809); | 245 ASSERT(*(reinterpret_cast<uword*>(pc) - 2) == 0x0320f809); |
228 | 246 |
229 Register reg; | 247 Register reg; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 bool ReturnPattern::IsValid() const { | 288 bool ReturnPattern::IsValid() const { |
271 Instr* jr = Instr::At(pc_); | 289 Instr* jr = Instr::At(pc_); |
272 return (jr->OpcodeField() == SPECIAL) && | 290 return (jr->OpcodeField() == SPECIAL) && |
273 (jr->FunctionField() == JR) && | 291 (jr->FunctionField() == JR) && |
274 (jr->RsField() == RA); | 292 (jr->RsField() == RA); |
275 } | 293 } |
276 | 294 |
277 } // namespace dart | 295 } // namespace dart |
278 | 296 |
279 #endif // defined TARGET_ARCH_MIPS | 297 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |