| 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 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 888 Label l = *L; | 888 Label l = *L; |
| 889 PrintF("unbound label"); | 889 PrintF("unbound label"); |
| 890 while (l.is_linked()) { | 890 while (l.is_linked()) { |
| 891 PrintF("@ %d ", l.pos()); | 891 PrintF("@ %d ", l.pos()); |
| 892 Instr instr = instr_at(l.pos()); | 892 Instr instr = instr_at(l.pos()); |
| 893 if ((instr & ~kImm16Mask) == 0) { | 893 if ((instr & ~kImm16Mask) == 0) { |
| 894 PrintF("value\n"); | 894 PrintF("value\n"); |
| 895 } else { | 895 } else { |
| 896 PrintF("%d\n", instr); | 896 PrintF("%d\n", instr); |
| 897 } | 897 } |
| 898 next(&l, internal_reference_positions_.find(l.pos()) != | 898 next(&l, is_internal_reference(&l)); |
| 899 internal_reference_positions_.end()); | |
| 900 } | 899 } |
| 901 } else { | 900 } else { |
| 902 PrintF("label in inconsistent state (pos = %d)\n", L->pos_); | 901 PrintF("label in inconsistent state (pos = %d)\n", L->pos_); |
| 903 } | 902 } |
| 904 } | 903 } |
| 905 | 904 |
| 906 | 905 |
| 907 void Assembler::bind_to(Label* L, int pos) { | 906 void Assembler::bind_to(Label* L, int pos) { |
| 908 DCHECK(0 <= pos && pos <= pc_offset()); // Must have valid binding position. | 907 DCHECK(0 <= pos && pos <= pc_offset()); // Must have valid binding position. |
| 909 int32_t trampoline_pos = kInvalidSlotPos; | 908 int32_t trampoline_pos = kInvalidSlotPos; |
| 910 bool is_internal = false; | 909 bool is_internal = false; |
| 911 if (L->is_linked() && !trampoline_emitted_) { | 910 if (L->is_linked() && !trampoline_emitted_) { |
| 912 unbound_labels_count_--; | 911 unbound_labels_count_--; |
| 913 next_buffer_check_ += kTrampolineSlotsSize; | 912 if (!is_internal_reference(L)) { |
| 913 next_buffer_check_ += kTrampolineSlotsSize; |
| 914 } |
| 914 } | 915 } |
| 915 | 916 |
| 916 while (L->is_linked()) { | 917 while (L->is_linked()) { |
| 917 int32_t fixup_pos = L->pos(); | 918 int32_t fixup_pos = L->pos(); |
| 918 int32_t dist = pos - fixup_pos; | 919 int32_t dist = pos - fixup_pos; |
| 919 is_internal = internal_reference_positions_.find(fixup_pos) != | 920 is_internal = is_internal_reference(L); |
| 920 internal_reference_positions_.end(); | |
| 921 next(L, is_internal); // Call next before overwriting link with target at | 921 next(L, is_internal); // Call next before overwriting link with target at |
| 922 // fixup_pos. | 922 // fixup_pos. |
| 923 Instr instr = instr_at(fixup_pos); | 923 Instr instr = instr_at(fixup_pos); |
| 924 if (is_internal) { | 924 if (is_internal) { |
| 925 target_at_put(fixup_pos, pos, is_internal); | 925 target_at_put(fixup_pos, pos, is_internal); |
| 926 } else { | 926 } else { |
| 927 if (IsBranch(instr)) { | 927 if (IsBranch(instr)) { |
| 928 int branch_offset = BranchOffset(instr); | 928 int branch_offset = BranchOffset(instr); |
| 929 if (dist > branch_offset) { | 929 if (dist > branch_offset) { |
| 930 if (trampoline_pos == kInvalidSlotPos) { | 930 if (trampoline_pos == kInvalidSlotPos) { |
| 931 trampoline_pos = get_trampoline_entry(fixup_pos); | 931 trampoline_pos = get_trampoline_entry(fixup_pos); |
| 932 CHECK(trampoline_pos != kInvalidSlotPos); | 932 CHECK(trampoline_pos != kInvalidSlotPos); |
| 933 } | 933 } |
| 934 CHECK((trampoline_pos - fixup_pos) <= branch_offset); | 934 CHECK((trampoline_pos - fixup_pos) <= branch_offset); |
| 935 target_at_put(fixup_pos, trampoline_pos, false); | 935 target_at_put(fixup_pos, trampoline_pos, false); |
| 936 fixup_pos = trampoline_pos; | 936 fixup_pos = trampoline_pos; |
| 937 dist = pos - fixup_pos; | |
| 938 } | 937 } |
| 939 target_at_put(fixup_pos, pos, false); | 938 target_at_put(fixup_pos, pos, false); |
| 940 } else { | 939 } else { |
| 941 target_at_put(fixup_pos, pos, false); | 940 target_at_put(fixup_pos, pos, false); |
| 942 } | 941 } |
| 943 } | 942 } |
| 944 } | 943 } |
| 945 L->bind_to(pos); | 944 L->bind_to(pos); |
| 946 | 945 |
| 947 // Keep track of the last bound label so we don't eliminate any instructions | 946 // Keep track of the last bound label so we don't eliminate any instructions |
| (...skipping 2311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3259 | 3258 |
| 3260 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { | 3259 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { |
| 3261 Assembler::FlushICache(isolate, pc, 2 * sizeof(int32_t)); | 3260 Assembler::FlushICache(isolate, pc, 2 * sizeof(int32_t)); |
| 3262 } | 3261 } |
| 3263 } | 3262 } |
| 3264 | 3263 |
| 3265 } // namespace internal | 3264 } // namespace internal |
| 3266 } // namespace v8 | 3265 } // namespace v8 |
| 3267 | 3266 |
| 3268 #endif // V8_TARGET_ARCH_MIPS | 3267 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |