OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 base = lazy_deoptimization_entry_code_; | 281 base = lazy_deoptimization_entry_code_; |
282 } | 282 } |
283 if (base == NULL || | 283 if (base == NULL || |
284 addr < base->GetStartAddress() || | 284 addr < base->GetStartAddress() || |
285 addr >= base->GetStartAddress() + | 285 addr >= base->GetStartAddress() + |
286 (kNumberOfEntries * table_entry_size_)) { | 286 (kNumberOfEntries * table_entry_size_)) { |
287 return kNotDeoptimizationEntry; | 287 return kNotDeoptimizationEntry; |
288 } | 288 } |
289 ASSERT_EQ(0, | 289 ASSERT_EQ(0, |
290 static_cast<int>(addr - base->GetStartAddress()) % table_entry_size_); | 290 static_cast<int>(addr - base->GetStartAddress()) % table_entry_size_); |
291 return (addr - base->GetStartAddress()) / table_entry_size_; | 291 return static_cast<int>(addr - base->GetStartAddress()) / table_entry_size_; |
292 } | 292 } |
293 | 293 |
294 | 294 |
295 void Deoptimizer::Setup() { | 295 void Deoptimizer::Setup() { |
296 // Do nothing yet. | 296 // Do nothing yet. |
297 } | 297 } |
298 | 298 |
299 | 299 |
300 void Deoptimizer::TearDown() { | 300 void Deoptimizer::TearDown() { |
301 if (eager_deoptimization_entry_code_ != NULL) { | 301 if (eager_deoptimization_entry_code_ != NULL) { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 } | 398 } |
399 | 399 |
400 // Print some helpful diagnostic information. | 400 // Print some helpful diagnostic information. |
401 if (FLAG_trace_deopt) { | 401 if (FLAG_trace_deopt) { |
402 double ms = static_cast<double>(OS::Ticks() - start) / 1000; | 402 double ms = static_cast<double>(OS::Ticks() - start) / 1000; |
403 int index = output_count_ - 1; // Index of the topmost frame. | 403 int index = output_count_ - 1; // Index of the topmost frame. |
404 JSFunction* function = output_[index]->GetFunction(); | 404 JSFunction* function = output_[index]->GetFunction(); |
405 PrintF("[deoptimizing: end 0x%08" V8PRIxPTR " ", | 405 PrintF("[deoptimizing: end 0x%08" V8PRIxPTR " ", |
406 reinterpret_cast<intptr_t>(function)); | 406 reinterpret_cast<intptr_t>(function)); |
407 function->PrintName(); | 407 function->PrintName(); |
408 PrintF(" => node=%u, pc=0x%08x, state=%s, took %0.3f ms]\n", | 408 PrintF(" => node=%u, pc=0x%08" V8PRIxPTR ", state=%s, took %0.3f ms]\n", |
409 node_id, | 409 node_id, |
410 output_[index]->GetPc(), | 410 output_[index]->GetPc(), |
411 FullCodeGenerator::State2String( | 411 FullCodeGenerator::State2String( |
412 static_cast<FullCodeGenerator::State>( | 412 static_cast<FullCodeGenerator::State>( |
413 output_[index]->GetState()->value())), | 413 output_[index]->GetState()->value())), |
414 ms); | 414 ms); |
415 } | 415 } |
416 } | 416 } |
417 | 417 |
418 | 418 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 | 468 |
469 switch (opcode) { | 469 switch (opcode) { |
470 case Translation::BEGIN: | 470 case Translation::BEGIN: |
471 case Translation::FRAME: | 471 case Translation::FRAME: |
472 case Translation::DUPLICATE: | 472 case Translation::DUPLICATE: |
473 UNREACHABLE(); | 473 UNREACHABLE(); |
474 return; | 474 return; |
475 | 475 |
476 case Translation::REGISTER: { | 476 case Translation::REGISTER: { |
477 int input_reg = iterator->Next(); | 477 int input_reg = iterator->Next(); |
478 uint32_t input_value = input_->GetRegister(input_reg); | 478 intptr_t input_value = input_->GetRegister(input_reg); |
479 if (FLAG_trace_deopt) { | 479 if (FLAG_trace_deopt) { |
480 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; %s\n", | 480 PrintF( |
481 output_[frame_index]->GetTop() + output_offset, | 481 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s\n", |
482 output_offset, | 482 output_[frame_index]->GetTop() + output_offset, |
483 input_value, | 483 output_offset, |
484 converter.NameOfCPURegister(input_reg)); | 484 input_value, |
| 485 converter.NameOfCPURegister(input_reg)); |
485 } | 486 } |
486 output_[frame_index]->SetFrameSlot(output_offset, input_value); | 487 output_[frame_index]->SetFrameSlot(output_offset, input_value); |
487 return; | 488 return; |
488 } | 489 } |
489 | 490 |
490 case Translation::INT32_REGISTER: { | 491 case Translation::INT32_REGISTER: { |
491 int input_reg = iterator->Next(); | 492 int input_reg = iterator->Next(); |
492 uint32_t value = input_->GetRegister(input_reg); | 493 intptr_t value = input_->GetRegister(input_reg); |
493 bool is_smi = Smi::IsValid(value); | 494 bool is_smi = Smi::IsValid(value); |
494 unsigned output_index = output_offset / kPointerSize; | 495 unsigned output_index = output_offset / kPointerSize; |
495 if (FLAG_trace_deopt) { | 496 if (FLAG_trace_deopt) { |
496 PrintF(" 0x%08x: [top + %d] <- %d ; %s (%s)\n", | 497 PrintF( |
497 output_[frame_index]->GetTop() + output_offset, | 498 " 0x%08" V8PRIxPTR ": [top + %d] <- %" V8PRIdPTR " ; %s (%s)\n", |
498 output_offset, | 499 output_[frame_index]->GetTop() + output_offset, |
499 value, | 500 output_offset, |
500 converter.NameOfCPURegister(input_reg), | 501 value, |
501 is_smi ? "smi" : "heap number"); | 502 converter.NameOfCPURegister(input_reg), |
| 503 is_smi ? "smi" : "heap number"); |
502 } | 504 } |
503 if (is_smi) { | 505 if (is_smi) { |
504 intptr_t tagged_value = | 506 intptr_t tagged_value = |
505 reinterpret_cast<intptr_t>(Smi::FromInt(value)); | 507 reinterpret_cast<intptr_t>(Smi::FromInt(static_cast<int>(value))); |
506 output_[frame_index]->SetFrameSlot(output_offset, tagged_value); | 508 output_[frame_index]->SetFrameSlot(output_offset, tagged_value); |
507 } else { | 509 } else { |
508 // We save the untagged value on the side and store a GC-safe | 510 // We save the untagged value on the side and store a GC-safe |
509 // temporary placeholder in the frame. | 511 // temporary placeholder in the frame. |
510 AddInteger32Value(frame_index, output_index, value); | 512 AddInteger32Value(frame_index, |
| 513 output_index, |
| 514 static_cast<int32_t>(value)); |
511 output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); | 515 output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); |
512 } | 516 } |
513 return; | 517 return; |
514 } | 518 } |
515 | 519 |
516 case Translation::DOUBLE_REGISTER: { | 520 case Translation::DOUBLE_REGISTER: { |
517 int input_reg = iterator->Next(); | 521 int input_reg = iterator->Next(); |
518 double value = input_->GetDoubleRegister(input_reg); | 522 double value = input_->GetDoubleRegister(input_reg); |
519 unsigned output_index = output_offset / kPointerSize; | 523 unsigned output_index = output_offset / kPointerSize; |
520 if (FLAG_trace_deopt) { | 524 if (FLAG_trace_deopt) { |
521 PrintF(" 0x%08x: [top + %d] <- %e ; %s\n", | 525 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- %e ; %s\n", |
522 output_[frame_index]->GetTop() + output_offset, | 526 output_[frame_index]->GetTop() + output_offset, |
523 output_offset, | 527 output_offset, |
524 value, | 528 value, |
525 DoubleRegister::AllocationIndexToString(input_reg)); | 529 DoubleRegister::AllocationIndexToString(input_reg)); |
526 } | 530 } |
527 // We save the untagged value on the side and store a GC-safe | 531 // We save the untagged value on the side and store a GC-safe |
528 // temporary placeholder in the frame. | 532 // temporary placeholder in the frame. |
529 AddDoubleValue(frame_index, output_index, value); | 533 AddDoubleValue(frame_index, output_index, value); |
530 output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); | 534 output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); |
531 return; | 535 return; |
532 } | 536 } |
533 | 537 |
534 case Translation::STACK_SLOT: { | 538 case Translation::STACK_SLOT: { |
535 int input_slot_index = iterator->Next(); | 539 int input_slot_index = iterator->Next(); |
536 unsigned input_offset = | 540 unsigned input_offset = |
537 input_->GetOffsetFromSlotIndex(this, input_slot_index); | 541 input_->GetOffsetFromSlotIndex(this, input_slot_index); |
538 uint32_t input_value = input_->GetFrameSlot(input_offset); | 542 intptr_t input_value = input_->GetFrameSlot(input_offset); |
539 if (FLAG_trace_deopt) { | 543 if (FLAG_trace_deopt) { |
540 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; [esp + %d]\n", | 544 PrintF(" 0x%08" V8PRIxPTR ": ", |
541 output_[frame_index]->GetTop() + output_offset, | 545 output_[frame_index]->GetTop() + output_offset); |
| 546 PrintF("[top + %d] <- 0x%08" V8PRIxPTR " ; [esp + %d]\n", |
542 output_offset, | 547 output_offset, |
543 input_value, | 548 input_value, |
544 input_offset); | 549 input_offset); |
545 } | 550 } |
546 output_[frame_index]->SetFrameSlot(output_offset, input_value); | 551 output_[frame_index]->SetFrameSlot(output_offset, input_value); |
547 return; | 552 return; |
548 } | 553 } |
549 | 554 |
550 case Translation::INT32_STACK_SLOT: { | 555 case Translation::INT32_STACK_SLOT: { |
551 int input_slot_index = iterator->Next(); | 556 int input_slot_index = iterator->Next(); |
552 unsigned input_offset = | 557 unsigned input_offset = |
553 input_->GetOffsetFromSlotIndex(this, input_slot_index); | 558 input_->GetOffsetFromSlotIndex(this, input_slot_index); |
554 int32_t value = input_->GetFrameSlot(input_offset); | 559 intptr_t value = input_->GetFrameSlot(input_offset); |
555 bool is_smi = Smi::IsValid(value); | 560 bool is_smi = Smi::IsValid(value); |
556 unsigned output_index = output_offset / kPointerSize; | 561 unsigned output_index = output_offset / kPointerSize; |
557 if (FLAG_trace_deopt) { | 562 if (FLAG_trace_deopt) { |
558 PrintF(" 0x%08x: [top + %d] <- %d ; [esp + %d] (%s)\n", | 563 PrintF(" 0x%08" V8PRIxPTR ": ", |
559 output_[frame_index]->GetTop() + output_offset, | 564 output_[frame_index]->GetTop() + output_offset); |
| 565 PrintF("[top + %d] <- %" V8PRIdPTR " ; [esp + %d] (%s)\n", |
560 output_offset, | 566 output_offset, |
561 value, | 567 value, |
562 input_offset, | 568 input_offset, |
563 is_smi ? "smi" : "heap number"); | 569 is_smi ? "smi" : "heap number"); |
564 } | 570 } |
565 if (is_smi) { | 571 if (is_smi) { |
566 intptr_t tagged_value = | 572 intptr_t tagged_value = |
567 reinterpret_cast<intptr_t>(Smi::FromInt(value)); | 573 reinterpret_cast<intptr_t>(Smi::FromInt(static_cast<int>(value))); |
568 output_[frame_index]->SetFrameSlot(output_offset, tagged_value); | 574 output_[frame_index]->SetFrameSlot(output_offset, tagged_value); |
569 } else { | 575 } else { |
570 // We save the untagged value on the side and store a GC-safe | 576 // We save the untagged value on the side and store a GC-safe |
571 // temporary placeholder in the frame. | 577 // temporary placeholder in the frame. |
572 AddInteger32Value(frame_index, output_index, value); | 578 AddInteger32Value(frame_index, |
| 579 output_index, |
| 580 static_cast<int32_t>(value)); |
573 output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); | 581 output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); |
574 } | 582 } |
575 return; | 583 return; |
576 } | 584 } |
577 | 585 |
578 case Translation::DOUBLE_STACK_SLOT: { | 586 case Translation::DOUBLE_STACK_SLOT: { |
579 int input_slot_index = iterator->Next(); | 587 int input_slot_index = iterator->Next(); |
580 unsigned input_offset = | 588 unsigned input_offset = |
581 input_->GetOffsetFromSlotIndex(this, input_slot_index); | 589 input_->GetOffsetFromSlotIndex(this, input_slot_index); |
582 double value = input_->GetDoubleFrameSlot(input_offset); | 590 double value = input_->GetDoubleFrameSlot(input_offset); |
583 unsigned output_index = output_offset / kPointerSize; | 591 unsigned output_index = output_offset / kPointerSize; |
584 if (FLAG_trace_deopt) { | 592 if (FLAG_trace_deopt) { |
585 PrintF(" 0x%08x: [top + %d] <- %e ; [esp + %d]\n", | 593 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- %e ; [esp + %d]\n", |
586 output_[frame_index]->GetTop() + output_offset, | 594 output_[frame_index]->GetTop() + output_offset, |
587 output_offset, | 595 output_offset, |
588 value, | 596 value, |
589 input_offset); | 597 input_offset); |
590 } | 598 } |
591 // We save the untagged value on the side and store a GC-safe | 599 // We save the untagged value on the side and store a GC-safe |
592 // temporary placeholder in the frame. | 600 // temporary placeholder in the frame. |
593 AddDoubleValue(frame_index, output_index, value); | 601 AddDoubleValue(frame_index, output_index, value); |
594 output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); | 602 output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); |
595 return; | 603 return; |
596 } | 604 } |
597 | 605 |
598 case Translation::LITERAL: { | 606 case Translation::LITERAL: { |
599 Object* literal = ComputeLiteral(iterator->Next()); | 607 Object* literal = ComputeLiteral(iterator->Next()); |
600 if (FLAG_trace_deopt) { | 608 if (FLAG_trace_deopt) { |
601 PrintF(" 0x%08x: [top + %d] <- ", | 609 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ", |
602 output_[frame_index]->GetTop() + output_offset, | 610 output_[frame_index]->GetTop() + output_offset, |
603 output_offset); | 611 output_offset); |
604 literal->ShortPrint(); | 612 literal->ShortPrint(); |
605 PrintF(" ; literal\n"); | 613 PrintF(" ; literal\n"); |
606 } | 614 } |
607 intptr_t value = reinterpret_cast<intptr_t>(literal); | 615 intptr_t value = reinterpret_cast<intptr_t>(literal); |
608 output_[frame_index]->SetFrameSlot(output_offset, value); | 616 output_[frame_index]->SetFrameSlot(output_offset, value); |
609 return; | 617 return; |
610 } | 618 } |
611 | 619 |
612 case Translation::ARGUMENTS_OBJECT: { | 620 case Translation::ARGUMENTS_OBJECT: { |
613 // Use the hole value as a sentinel and fill in the arguments object | 621 // Use the hole value as a sentinel and fill in the arguments object |
614 // after the deoptimized frame is built. | 622 // after the deoptimized frame is built. |
615 ASSERT(frame_index == 0); // Only supported for first frame. | 623 ASSERT(frame_index == 0); // Only supported for first frame. |
616 if (FLAG_trace_deopt) { | 624 if (FLAG_trace_deopt) { |
617 PrintF(" 0x%08x: [top + %d] <- ", | 625 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ", |
618 output_[frame_index]->GetTop() + output_offset, | 626 output_[frame_index]->GetTop() + output_offset, |
619 output_offset); | 627 output_offset); |
620 Heap::the_hole_value()->ShortPrint(); | 628 Heap::the_hole_value()->ShortPrint(); |
621 PrintF(" ; arguments object\n"); | 629 PrintF(" ; arguments object\n"); |
622 } | 630 } |
623 intptr_t value = reinterpret_cast<intptr_t>(Heap::the_hole_value()); | 631 intptr_t value = reinterpret_cast<intptr_t>(Heap::the_hole_value()); |
624 output_[frame_index]->SetFrameSlot(output_offset, value); | 632 output_[frame_index]->SetFrameSlot(output_offset, value); |
625 return; | 633 return; |
626 } | 634 } |
627 } | 635 } |
628 } | 636 } |
629 | 637 |
630 | 638 |
631 bool Deoptimizer::DoOsrTranslateCommand(TranslationIterator* iterator, | 639 bool Deoptimizer::DoOsrTranslateCommand(TranslationIterator* iterator, |
632 int* input_offset) { | 640 int* input_offset) { |
633 disasm::NameConverter converter; | 641 disasm::NameConverter converter; |
634 FrameDescription* output = output_[0]; | 642 FrameDescription* output = output_[0]; |
635 | 643 |
636 // The input values are all part of the unoptimized frame so they | 644 // The input values are all part of the unoptimized frame so they |
637 // are all tagged pointers. | 645 // are all tagged pointers. |
638 uint32_t input_value = input_->GetFrameSlot(*input_offset); | 646 uintptr_t input_value = input_->GetFrameSlot(*input_offset); |
639 Object* input_object = reinterpret_cast<Object*>(input_value); | 647 Object* input_object = reinterpret_cast<Object*>(input_value); |
640 | 648 |
641 Translation::Opcode opcode = | 649 Translation::Opcode opcode = |
642 static_cast<Translation::Opcode>(iterator->Next()); | 650 static_cast<Translation::Opcode>(iterator->Next()); |
643 bool duplicate = (opcode == Translation::DUPLICATE); | 651 bool duplicate = (opcode == Translation::DUPLICATE); |
644 if (duplicate) { | 652 if (duplicate) { |
645 opcode = static_cast<Translation::Opcode>(iterator->Next()); | 653 opcode = static_cast<Translation::Opcode>(iterator->Next()); |
646 } | 654 } |
647 | 655 |
648 switch (opcode) { | 656 switch (opcode) { |
649 case Translation::BEGIN: | 657 case Translation::BEGIN: |
650 case Translation::FRAME: | 658 case Translation::FRAME: |
651 case Translation::DUPLICATE: | 659 case Translation::DUPLICATE: |
652 UNREACHABLE(); // Malformed input. | 660 UNREACHABLE(); // Malformed input. |
653 return false; | 661 return false; |
654 | 662 |
655 case Translation::REGISTER: { | 663 case Translation::REGISTER: { |
656 int output_reg = iterator->Next(); | 664 int output_reg = iterator->Next(); |
657 if (FLAG_trace_osr) { | 665 if (FLAG_trace_osr) { |
658 PrintF(" %s <- 0x%08x ; [esp + %d]\n", | 666 PrintF(" %s <- 0x%08" V8PRIxPTR " ; [esp + %d]\n", |
659 converter.NameOfCPURegister(output_reg), | 667 converter.NameOfCPURegister(output_reg), |
660 input_value, | 668 input_value, |
661 *input_offset); | 669 *input_offset); |
662 } | 670 } |
663 output->SetRegister(output_reg, input_value); | 671 output->SetRegister(output_reg, input_value); |
664 break; | 672 break; |
665 } | 673 } |
666 | 674 |
667 case Translation::INT32_REGISTER: { | 675 case Translation::INT32_REGISTER: { |
668 // Abort OSR if we don't have a number. | 676 // Abort OSR if we don't have a number. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 } | 713 } |
706 output->SetDoubleRegister(output_reg, double_value); | 714 output->SetDoubleRegister(output_reg, double_value); |
707 break; | 715 break; |
708 } | 716 } |
709 | 717 |
710 case Translation::STACK_SLOT: { | 718 case Translation::STACK_SLOT: { |
711 int output_index = iterator->Next(); | 719 int output_index = iterator->Next(); |
712 unsigned output_offset = | 720 unsigned output_offset = |
713 output->GetOffsetFromSlotIndex(this, output_index); | 721 output->GetOffsetFromSlotIndex(this, output_index); |
714 if (FLAG_trace_osr) { | 722 if (FLAG_trace_osr) { |
715 PrintF(" [esp + %d] <- 0x%08x ; [esp + %d]\n", | 723 PrintF(" [esp + %d] <- 0x%08" V8PRIxPTR " ; [esp + %d]\n", |
716 output_offset, | 724 output_offset, |
717 input_value, | 725 input_value, |
718 *input_offset); | 726 *input_offset); |
719 } | 727 } |
720 output->SetFrameSlot(output_offset, input_value); | 728 output->SetFrameSlot(output_offset, input_value); |
721 break; | 729 break; |
722 } | 730 } |
723 | 731 |
724 case Translation::INT32_STACK_SLOT: { | 732 case Translation::INT32_STACK_SLOT: { |
725 // Abort OSR if we don't have a number. | 733 // Abort OSR if we don't have a number. |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 SetFrameSlot(o, kZapUint32); | 955 SetFrameSlot(o, kZapUint32); |
948 } | 956 } |
949 } | 957 } |
950 | 958 |
951 | 959 |
952 unsigned FrameDescription::GetOffsetFromSlotIndex(Deoptimizer* deoptimizer, | 960 unsigned FrameDescription::GetOffsetFromSlotIndex(Deoptimizer* deoptimizer, |
953 int slot_index) { | 961 int slot_index) { |
954 if (slot_index >= 0) { | 962 if (slot_index >= 0) { |
955 // Local or spill slots. Skip the fixed part of the frame | 963 // Local or spill slots. Skip the fixed part of the frame |
956 // including all arguments. | 964 // including all arguments. |
957 unsigned base = | 965 unsigned base = static_cast<unsigned>( |
958 GetFrameSize() - deoptimizer->ComputeFixedSize(GetFunction()); | 966 GetFrameSize() - deoptimizer->ComputeFixedSize(GetFunction())); |
959 return base - ((slot_index + 1) * kPointerSize); | 967 return base - ((slot_index + 1) * kPointerSize); |
960 } else { | 968 } else { |
961 // Incoming parameter. | 969 // Incoming parameter. |
962 unsigned base = GetFrameSize() - | 970 unsigned base = static_cast<unsigned>(GetFrameSize() - |
963 deoptimizer->ComputeIncomingArgumentSize(GetFunction()); | 971 deoptimizer->ComputeIncomingArgumentSize(GetFunction())); |
964 return base - ((slot_index + 1) * kPointerSize); | 972 return base - ((slot_index + 1) * kPointerSize); |
965 } | 973 } |
966 } | 974 } |
967 | 975 |
968 | 976 |
969 void TranslationBuffer::Add(int32_t value) { | 977 void TranslationBuffer::Add(int32_t value) { |
970 // Encode the sign bit in the least significant bit. | 978 // Encode the sign bit in the least significant bit. |
971 bool is_negative = (value < 0); | 979 bool is_negative = (value < 0); |
972 uint32_t bits = ((is_negative ? -value : value) << 1) | | 980 uint32_t bits = ((is_negative ? -value : value) << 1) | |
973 static_cast<int32_t>(is_negative); | 981 static_cast<int32_t>(is_negative); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1130 Deoptimizer::HandleWeakDeoptimizedCode); | 1138 Deoptimizer::HandleWeakDeoptimizedCode); |
1131 } | 1139 } |
1132 | 1140 |
1133 | 1141 |
1134 DeoptimizingCodeListNode::~DeoptimizingCodeListNode() { | 1142 DeoptimizingCodeListNode::~DeoptimizingCodeListNode() { |
1135 GlobalHandles::Destroy(reinterpret_cast<Object**>(code_.location())); | 1143 GlobalHandles::Destroy(reinterpret_cast<Object**>(code_.location())); |
1136 } | 1144 } |
1137 | 1145 |
1138 | 1146 |
1139 } } // namespace v8::internal | 1147 } } // namespace v8::internal |
OLD | NEW |