| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 25 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 26 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | 26 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| 27 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | 27 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| 28 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 28 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 29 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 30 | 30 |
| 31 // The original source code covered by the above license above has been | 31 // The original source code covered by the above license above has been |
| 32 // modified significantly by Google Inc. | 32 // modified significantly by Google Inc. |
| 33 // Copyright 2012 the V8 project authors. All rights reserved. | 33 // Copyright 2012 the V8 project authors. All rights reserved. |
| 34 | 34 |
| 35 | |
| 36 #include "src/v8.h" | 35 #include "src/v8.h" |
| 37 | 36 |
| 38 #if V8_TARGET_ARCH_MIPS64 | 37 #if V8_TARGET_ARCH_MIPS64 |
| 39 | 38 |
| 40 #include "src/base/cpu.h" | 39 #include "src/base/cpu.h" |
| 41 #include "src/mips64/assembler-mips64-inl.h" | 40 #include "src/mips64/assembler-mips64-inl.h" |
| 42 #include "src/serialize.h" | 41 #include "src/serialize.h" |
| 43 | 42 |
| 44 namespace v8 { | 43 namespace v8 { |
| 45 namespace internal { | 44 namespace internal { |
| (...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 DCHECK(IsAddImmediate(instr)); | 627 DCHECK(IsAddImmediate(instr)); |
| 629 return ((instr & ~kImm16Mask) | (offset & kImm16Mask)); | 628 return ((instr & ~kImm16Mask) | (offset & kImm16Mask)); |
| 630 } | 629 } |
| 631 | 630 |
| 632 | 631 |
| 633 bool Assembler::IsAndImmediate(Instr instr) { | 632 bool Assembler::IsAndImmediate(Instr instr) { |
| 634 return GetOpcodeField(instr) == ANDI; | 633 return GetOpcodeField(instr) == ANDI; |
| 635 } | 634 } |
| 636 | 635 |
| 637 | 636 |
| 638 int64_t Assembler::target_at(int64_t pos, bool is_internal) { | 637 int Assembler::target_at(int pos, bool is_internal) { |
| 639 if (is_internal) { | 638 if (is_internal) { |
| 640 int64_t* p = reinterpret_cast<int64_t*>(buffer_ + pos); | 639 int64_t* p = reinterpret_cast<int64_t*>(buffer_ + pos); |
| 641 int64_t address = *p; | 640 int64_t address = *p; |
| 642 if (address == kEndOfJumpChain) { | 641 if (address == kEndOfJumpChain) { |
| 643 return kEndOfChain; | 642 return kEndOfChain; |
| 644 } else { | 643 } else { |
| 645 int64_t instr_address = reinterpret_cast<int64_t>(p); | 644 int64_t instr_address = reinterpret_cast<int64_t>(p); |
| 646 int64_t delta = instr_address - address; | 645 DCHECK(instr_address - address < INT_MAX); |
| 646 int delta = static_cast<int>(instr_address - address); |
| 647 DCHECK(pos > delta); | 647 DCHECK(pos > delta); |
| 648 return pos - delta; | 648 return pos - delta; |
| 649 } | 649 } |
| 650 } | 650 } |
| 651 Instr instr = instr_at(pos); | 651 Instr instr = instr_at(pos); |
| 652 if ((instr & ~kImm16Mask) == 0) { | 652 if ((instr & ~kImm16Mask) == 0) { |
| 653 // Emitted label constant, not part of a branch. | 653 // Emitted label constant, not part of a branch. |
| 654 if (instr == 0) { | 654 if (instr == 0) { |
| 655 return kEndOfChain; | 655 return kEndOfChain; |
| 656 } else { | 656 } else { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 682 imm |= static_cast<int64_t>(instr_ori & kImm16Mask) << 32; | 682 imm |= static_cast<int64_t>(instr_ori & kImm16Mask) << 32; |
| 683 imm |= static_cast<int64_t>(instr_ori2 & kImm16Mask) << 16; | 683 imm |= static_cast<int64_t>(instr_ori2 & kImm16Mask) << 16; |
| 684 // Sign extend address; | 684 // Sign extend address; |
| 685 imm >>= 16; | 685 imm >>= 16; |
| 686 | 686 |
| 687 if (imm == kEndOfJumpChain) { | 687 if (imm == kEndOfJumpChain) { |
| 688 // EndOfChain sentinel is returned directly, not relative to pc or pos. | 688 // EndOfChain sentinel is returned directly, not relative to pc or pos. |
| 689 return kEndOfChain; | 689 return kEndOfChain; |
| 690 } else { | 690 } else { |
| 691 uint64_t instr_address = reinterpret_cast<int64_t>(buffer_ + pos); | 691 uint64_t instr_address = reinterpret_cast<int64_t>(buffer_ + pos); |
| 692 int64_t delta = instr_address - imm; | 692 DCHECK(instr_address - imm < INT_MAX); |
| 693 int delta = static_cast<int>(instr_address - imm); |
| 693 DCHECK(pos > delta); | 694 DCHECK(pos > delta); |
| 694 return pos - delta; | 695 return pos - delta; |
| 695 } | 696 } |
| 696 } else { | 697 } else { |
| 697 int32_t imm28 = (instr & static_cast<int32_t>(kImm26Mask)) << 2; | 698 int32_t imm28 = (instr & static_cast<int32_t>(kImm26Mask)) << 2; |
| 698 if (imm28 == kEndOfJumpChain) { | 699 if (imm28 == kEndOfJumpChain) { |
| 699 // EndOfChain sentinel is returned directly, not relative to pc or pos. | 700 // EndOfChain sentinel is returned directly, not relative to pc or pos. |
| 700 return kEndOfChain; | 701 return kEndOfChain; |
| 701 } else { | 702 } else { |
| 702 uint64_t instr_address = reinterpret_cast<int64_t>(buffer_ + pos); | 703 uint64_t instr_address = reinterpret_cast<int64_t>(buffer_ + pos); |
| 703 instr_address &= kImm28Mask; | 704 instr_address &= kImm28Mask; |
| 704 int64_t delta = instr_address - imm28; | 705 int delta = static_cast<int>(instr_address - imm28); |
| 705 DCHECK(pos > delta); | 706 DCHECK(pos > delta); |
| 706 return pos - delta; | 707 return pos - delta; |
| 707 } | 708 } |
| 708 } | 709 } |
| 709 } | 710 } |
| 710 | 711 |
| 711 | 712 |
| 712 void Assembler::target_at_put(int64_t pos, int64_t target_pos, | 713 void Assembler::target_at_put(int pos, int target_pos, bool is_internal) { |
| 713 bool is_internal) { | |
| 714 if (is_internal) { | 714 if (is_internal) { |
| 715 uint64_t imm = reinterpret_cast<uint64_t>(buffer_) + target_pos; | 715 uint64_t imm = reinterpret_cast<uint64_t>(buffer_) + target_pos; |
| 716 *reinterpret_cast<uint64_t*>(buffer_ + pos) = imm; | 716 *reinterpret_cast<uint64_t*>(buffer_ + pos) = imm; |
| 717 return; | 717 return; |
| 718 } | 718 } |
| 719 Instr instr = instr_at(pos); | 719 Instr instr = instr_at(pos); |
| 720 if ((instr & ~kImm16Mask) == 0) { | 720 if ((instr & ~kImm16Mask) == 0) { |
| 721 DCHECK(target_pos == kEndOfChain || target_pos >= 0); | 721 DCHECK(target_pos == kEndOfChain || target_pos >= 0); |
| 722 // Emitted label constant, not part of a branch. | 722 // Emitted label constant, not part of a branch. |
| 723 // Make label relative to Code* of generated Code object. | 723 // Make label relative to Code* of generated Code object. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 789 internal_reference_positions_.end()); | 789 internal_reference_positions_.end()); |
| 790 } | 790 } |
| 791 } else { | 791 } else { |
| 792 PrintF("label in inconsistent state (pos = %d)\n", L->pos_); | 792 PrintF("label in inconsistent state (pos = %d)\n", L->pos_); |
| 793 } | 793 } |
| 794 } | 794 } |
| 795 | 795 |
| 796 | 796 |
| 797 void Assembler::bind_to(Label* L, int pos) { | 797 void Assembler::bind_to(Label* L, int pos) { |
| 798 DCHECK(0 <= pos && pos <= pc_offset()); // Must have valid binding position. | 798 DCHECK(0 <= pos && pos <= pc_offset()); // Must have valid binding position. |
| 799 int32_t trampoline_pos = kInvalidSlotPos; | 799 int trampoline_pos = kInvalidSlotPos; |
| 800 bool is_internal = false; | 800 bool is_internal = false; |
| 801 if (L->is_linked() && !trampoline_emitted_) { | 801 if (L->is_linked() && !trampoline_emitted_) { |
| 802 unbound_labels_count_--; | 802 unbound_labels_count_--; |
| 803 next_buffer_check_ += kTrampolineSlotsSize; | 803 next_buffer_check_ += kTrampolineSlotsSize; |
| 804 } | 804 } |
| 805 | 805 |
| 806 while (L->is_linked()) { | 806 while (L->is_linked()) { |
| 807 int32_t fixup_pos = L->pos(); | 807 int fixup_pos = L->pos(); |
| 808 int32_t dist = pos - fixup_pos; | 808 int dist = pos - fixup_pos; |
| 809 is_internal = internal_reference_positions_.find(fixup_pos) != | 809 is_internal = internal_reference_positions_.find(fixup_pos) != |
| 810 internal_reference_positions_.end(); | 810 internal_reference_positions_.end(); |
| 811 next(L, is_internal); // Call next before overwriting link with target at | 811 next(L, is_internal); // Call next before overwriting link with target at |
| 812 // fixup_pos. | 812 // fixup_pos. |
| 813 Instr instr = instr_at(fixup_pos); | 813 Instr instr = instr_at(fixup_pos); |
| 814 if (is_internal) { | 814 if (is_internal) { |
| 815 target_at_put(fixup_pos, pos, is_internal); | 815 target_at_put(fixup_pos, pos, is_internal); |
| 816 } else if (IsBranch(instr)) { | 816 } else if (IsBranch(instr)) { |
| 817 if (dist > kMaxBranchOffset) { | 817 if (dist > kMaxBranchOffset) { |
| 818 if (trampoline_pos == kInvalidSlotPos) { | 818 if (trampoline_pos == kInvalidSlotPos) { |
| (...skipping 2142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2961 void Assembler::PopulateConstantPool(ConstantPoolArray* constant_pool) { | 2961 void Assembler::PopulateConstantPool(ConstantPoolArray* constant_pool) { |
| 2962 // No out-of-line constant pool support. | 2962 // No out-of-line constant pool support. |
| 2963 DCHECK(!FLAG_enable_ool_constant_pool); | 2963 DCHECK(!FLAG_enable_ool_constant_pool); |
| 2964 return; | 2964 return; |
| 2965 } | 2965 } |
| 2966 | 2966 |
| 2967 | 2967 |
| 2968 } } // namespace v8::internal | 2968 } } // namespace v8::internal |
| 2969 | 2969 |
| 2970 #endif // V8_TARGET_ARCH_MIPS64 | 2970 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |