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

Side by Side Diff: runtime/vm/assembler_mips.cc

Issue 14284020: Adds support for debugger API on MIPS. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | runtime/vm/code_descriptors_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_MIPS) 6 #if defined(TARGET_ARCH_MIPS)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/runtime_entry.h" 9 #include "vm/runtime_entry.h"
10 #include "vm/simulator.h" 10 #include "vm/simulator.h"
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 addu(result, result, TMP1); 324 addu(result, result, TMP1);
325 lw(result, Address(result)); 325 lw(result, Address(result));
326 } 326 }
327 327
328 328
329 void Assembler::EnterStubFrame(bool uses_pp) { 329 void Assembler::EnterStubFrame(bool uses_pp) {
330 if (uses_pp) { 330 if (uses_pp) {
331 addiu(SP, SP, Immediate(-4 * kWordSize)); 331 addiu(SP, SP, Immediate(-4 * kWordSize));
332 sw(ZR, Address(SP, 3 * kWordSize)); // PC marker is 0 in stubs. 332 sw(ZR, Address(SP, 3 * kWordSize)); // PC marker is 0 in stubs.
333 sw(RA, Address(SP, 2 * kWordSize)); 333 sw(RA, Address(SP, 2 * kWordSize));
334 sw(PP, Address(SP, 1 * kWordSize)); 334 sw(FP, Address(SP, 1 * kWordSize));
335 sw(FP, Address(SP, 0 * kWordSize)); 335 sw(PP, Address(SP, 0 * kWordSize));
336 mov(FP, SP); 336 addiu(FP, SP, Immediate(1 * kWordSize));
337 // Setup pool pointer for this stub. 337 // Setup pool pointer for this stub.
338 Label next; 338 Label next;
339 bal(&next); 339 bal(&next);
340 delay_slot()->mov(T0, RA); 340 delay_slot()->mov(T0, RA);
341 341
342 const intptr_t object_pool_pc_dist = 342 const intptr_t object_pool_pc_dist =
343 Instructions::HeaderSize() - Instructions::object_pool_offset() + 343 Instructions::HeaderSize() - Instructions::object_pool_offset() +
344 CodeSize(); 344 CodeSize();
345 345
346 Bind(&next); 346 Bind(&next);
347 lw(PP, Address(T0, -object_pool_pc_dist)); 347 lw(PP, Address(T0, -object_pool_pc_dist));
348 } else { 348 } else {
349 addiu(SP, SP, Immediate(-3 * kWordSize)); 349 addiu(SP, SP, Immediate(-3 * kWordSize));
350 sw(ZR, Address(SP, 2 * kWordSize)); // PC marker is 0 in stubs. 350 sw(ZR, Address(SP, 2 * kWordSize)); // PC marker is 0 in stubs.
351 sw(RA, Address(SP, 1 * kWordSize)); 351 sw(RA, Address(SP, 1 * kWordSize));
352 sw(FP, Address(SP, 0 * kWordSize)); 352 sw(FP, Address(SP, 0 * kWordSize));
353 mov(FP, SP); 353 mov(FP, SP);
354 } 354 }
355 } 355 }
356 356
357 357
358 void Assembler::LeaveStubFrame(bool uses_pp) { 358 void Assembler::LeaveStubFrame(bool uses_pp) {
359 mov(SP, FP);
360 if (uses_pp) { 359 if (uses_pp) {
360 addiu(SP, FP, Immediate(-1 * kWordSize));
361 lw(RA, Address(SP, 2 * kWordSize)); 361 lw(RA, Address(SP, 2 * kWordSize));
362 lw(PP, Address(SP, 1 * kWordSize)); 362 lw(FP, Address(SP, 1 * kWordSize));
363 lw(FP, Address(SP, 0 * kWordSize)); 363 lw(PP, Address(SP, 0 * kWordSize));
364 addiu(SP, SP, Immediate(4 * kWordSize)); 364 addiu(SP, SP, Immediate(4 * kWordSize));
365 } else { 365 } else {
366 mov(SP, FP);
366 lw(RA, Address(SP, 1 * kWordSize)); 367 lw(RA, Address(SP, 1 * kWordSize));
367 lw(FP, Address(SP, 0 * kWordSize)); 368 lw(FP, Address(SP, 0 * kWordSize));
368 addiu(SP, SP, Immediate(3 * kWordSize)); 369 addiu(SP, SP, Immediate(3 * kWordSize));
369 } 370 }
370 } 371 }
371 372
372 373
373 void Assembler::CallRuntime(const RuntimeEntry& entry) { 374 void Assembler::CallRuntime(const RuntimeEntry& entry) {
374 entry.Call(this); 375 entry.Call(this);
375 } 376 }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 } 443 }
443 } 444 }
444 445
445 446
446 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) { 447 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) {
447 const intptr_t kPushedRegistersSize = 448 const intptr_t kPushedRegistersSize =
448 kDartVolatileCpuRegCount * kWordSize + 449 kDartVolatileCpuRegCount * kWordSize +
449 2 * kWordSize + // FP and RA. 450 2 * kWordSize + // FP and RA.
450 kDartVolatileFpuRegCount * kWordSize; 451 kDartVolatileFpuRegCount * kWordSize;
451 452
453 TraceSimMsg("EnterCallRuntimeFrame");
454
452 if (prologue_offset_ == -1) { 455 if (prologue_offset_ == -1) {
453 prologue_offset_ = CodeSize(); 456 prologue_offset_ = CodeSize();
454 } 457 }
455 458
456 // Save volatile CPU and FPU registers on the stack: 459 // Save volatile CPU and FPU registers on the stack:
457 // ------------- 460 // -------------
458 // FPU Registers 461 // FPU Registers
459 // CPU Registers 462 // CPU Registers
460 // RA 463 // RA
461 // FP 464 // FP
(...skipping 22 matching lines...) Expand all
484 ReserveAlignedFrameSpace(frame_space); 487 ReserveAlignedFrameSpace(frame_space);
485 } 488 }
486 489
487 490
488 void Assembler::LeaveCallRuntimeFrame() { 491 void Assembler::LeaveCallRuntimeFrame() {
489 const intptr_t kPushedRegistersSize = 492 const intptr_t kPushedRegistersSize =
490 kDartVolatileCpuRegCount * kWordSize + 493 kDartVolatileCpuRegCount * kWordSize +
491 2 * kWordSize + // FP and RA. 494 2 * kWordSize + // FP and RA.
492 kDartVolatileFpuRegCount * kWordSize; 495 kDartVolatileFpuRegCount * kWordSize;
493 496
497 TraceSimMsg("LeaveCallRuntimeFrame");
498
494 // SP might have been modified to reserve space for arguments 499 // SP might have been modified to reserve space for arguments
495 // and ensure proper alignment of the stack frame. 500 // and ensure proper alignment of the stack frame.
496 // We need to restore it before restoring registers. 501 // We need to restore it before restoring registers.
497 mov(SP, FP); 502 mov(SP, FP);
498 503
499 // Restore volatile CPU and FPU registers from the stack. 504 // Restore volatile CPU and FPU registers from the stack.
500 lw(FP, Address(SP, 0 * kWordSize)); 505 lw(FP, Address(SP, 0 * kWordSize));
501 lw(RA, Address(SP, 1 * kWordSize)); 506 lw(RA, Address(SP, 1 * kWordSize));
502 for (int i = kDartFirstVolatileCpuReg; i <= kDartLastVolatileCpuReg; i++) { 507 for (int i = kDartFirstVolatileCpuReg; i <= kDartLastVolatileCpuReg; i++) {
503 // + 2 because FP goes in slot 0. 508 // + 2 because FP goes in slot 0.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 Emit(reinterpret_cast<int32_t>(message)); 558 Emit(reinterpret_cast<int32_t>(message));
554 Bind(&msg); 559 Bind(&msg);
555 break_(Instr::kMsgMessageCode); 560 break_(Instr::kMsgMessageCode);
556 } 561 }
557 } 562 }
558 563
559 } // namespace dart 564 } // namespace dart
560 565
561 #endif // defined TARGET_ARCH_MIPS 566 #endif // defined TARGET_ARCH_MIPS
562 567
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/code_descriptors_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698