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 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
852 Label l = *L; | 852 Label l = *L; |
853 PrintF("unbound label"); | 853 PrintF("unbound label"); |
854 while (l.is_linked()) { | 854 while (l.is_linked()) { |
855 PrintF("@ %d ", l.pos()); | 855 PrintF("@ %d ", l.pos()); |
856 Instr instr = instr_at(l.pos()); | 856 Instr instr = instr_at(l.pos()); |
857 if ((instr & ~kImm16Mask) == 0) { | 857 if ((instr & ~kImm16Mask) == 0) { |
858 PrintF("value\n"); | 858 PrintF("value\n"); |
859 } else { | 859 } else { |
860 PrintF("%d\n", instr); | 860 PrintF("%d\n", instr); |
861 } | 861 } |
862 next(&l, internal_reference_positions_.find(l.pos()) != | 862 next(&l, is_internal_reference(&l)); |
863 internal_reference_positions_.end()); | |
864 } | 863 } |
865 } else { | 864 } else { |
866 PrintF("label in inconsistent state (pos = %d)\n", L->pos_); | 865 PrintF("label in inconsistent state (pos = %d)\n", L->pos_); |
867 } | 866 } |
868 } | 867 } |
869 | 868 |
870 | 869 |
871 void Assembler::bind_to(Label* L, int pos) { | 870 void Assembler::bind_to(Label* L, int pos) { |
872 DCHECK(0 <= pos && pos <= pc_offset()); // Must have valid binding position. | 871 DCHECK(0 <= pos && pos <= pc_offset()); // Must have valid binding position. |
873 int trampoline_pos = kInvalidSlotPos; | 872 int trampoline_pos = kInvalidSlotPos; |
874 bool is_internal = false; | 873 bool is_internal = false; |
875 if (L->is_linked() && !trampoline_emitted_) { | 874 if (L->is_linked() && !trampoline_emitted_) { |
876 unbound_labels_count_--; | 875 unbound_labels_count_--; |
877 next_buffer_check_ += kTrampolineSlotsSize; | 876 if (!is_internal_reference(L)) { |
| 877 next_buffer_check_ += kTrampolineSlotsSize; |
| 878 } |
878 } | 879 } |
879 | 880 |
880 while (L->is_linked()) { | 881 while (L->is_linked()) { |
881 int fixup_pos = L->pos(); | 882 int fixup_pos = L->pos(); |
882 int dist = pos - fixup_pos; | 883 int dist = pos - fixup_pos; |
883 is_internal = internal_reference_positions_.find(fixup_pos) != | 884 is_internal = is_internal_reference(L); |
884 internal_reference_positions_.end(); | |
885 next(L, is_internal); // Call next before overwriting link with target at | 885 next(L, is_internal); // Call next before overwriting link with target at |
886 // fixup_pos. | 886 // fixup_pos. |
887 Instr instr = instr_at(fixup_pos); | 887 Instr instr = instr_at(fixup_pos); |
888 if (is_internal) { | 888 if (is_internal) { |
889 target_at_put(fixup_pos, pos, is_internal); | 889 target_at_put(fixup_pos, pos, is_internal); |
890 } else { | 890 } else { |
891 if (IsBranch(instr)) { | 891 if (IsBranch(instr)) { |
892 int branch_offset = BranchOffset(instr); | 892 int branch_offset = BranchOffset(instr); |
893 if (dist > branch_offset) { | 893 if (dist > branch_offset) { |
894 if (trampoline_pos == kInvalidSlotPos) { | 894 if (trampoline_pos == kInvalidSlotPos) { |
895 trampoline_pos = get_trampoline_entry(fixup_pos); | 895 trampoline_pos = get_trampoline_entry(fixup_pos); |
896 CHECK(trampoline_pos != kInvalidSlotPos); | 896 CHECK(trampoline_pos != kInvalidSlotPos); |
897 } | 897 } |
898 CHECK((trampoline_pos - fixup_pos) <= branch_offset); | 898 CHECK((trampoline_pos - fixup_pos) <= branch_offset); |
899 target_at_put(fixup_pos, trampoline_pos, false); | 899 target_at_put(fixup_pos, trampoline_pos, false); |
900 fixup_pos = trampoline_pos; | 900 fixup_pos = trampoline_pos; |
901 dist = pos - fixup_pos; | |
902 } | 901 } |
903 target_at_put(fixup_pos, pos, false); | 902 target_at_put(fixup_pos, pos, false); |
904 } else { | 903 } else { |
905 DCHECK(IsJ(instr) || IsJal(instr) || IsLui(instr) || | 904 DCHECK(IsJ(instr) || IsJal(instr) || IsLui(instr) || |
906 IsEmittedConstant(instr)); | 905 IsEmittedConstant(instr)); |
907 target_at_put(fixup_pos, pos, false); | 906 target_at_put(fixup_pos, pos, false); |
908 } | 907 } |
909 } | 908 } |
910 } | 909 } |
911 L->bind_to(pos); | 910 L->bind_to(pos); |
(...skipping 2593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3505 | 3504 |
3506 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { | 3505 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { |
3507 Assembler::FlushICache(isolate, pc, 4 * Assembler::kInstrSize); | 3506 Assembler::FlushICache(isolate, pc, 4 * Assembler::kInstrSize); |
3508 } | 3507 } |
3509 } | 3508 } |
3510 | 3509 |
3511 } // namespace internal | 3510 } // namespace internal |
3512 } // namespace v8 | 3511 } // namespace v8 |
3513 | 3512 |
3514 #endif // V8_TARGET_ARCH_MIPS64 | 3513 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |