| 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 | 5 // modification, are permitted provided that the following conditions |
| 6 // are met: | 6 // are 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 1322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1333 if (imm16 == 0) { | 1333 if (imm16 == 0) { |
| 1334 EMIT(0xC3); | 1334 EMIT(0xC3); |
| 1335 } else { | 1335 } else { |
| 1336 EMIT(0xC2); | 1336 EMIT(0xC2); |
| 1337 EMIT(imm16 & 0xFF); | 1337 EMIT(imm16 & 0xFF); |
| 1338 EMIT((imm16 >> 8) & 0xFF); | 1338 EMIT((imm16 >> 8) & 0xFF); |
| 1339 } | 1339 } |
| 1340 } | 1340 } |
| 1341 | 1341 |
| 1342 | 1342 |
| 1343 void Assembler::ud2() { |
| 1344 EnsureSpace ensure_space(this); |
| 1345 EMIT(0x0F); |
| 1346 EMIT(0x0B); |
| 1347 } |
| 1348 |
| 1349 |
| 1343 // Labels refer to positions in the (to be) generated code. | 1350 // Labels refer to positions in the (to be) generated code. |
| 1344 // There are bound, linked, and unused labels. | 1351 // There are bound, linked, and unused labels. |
| 1345 // | 1352 // |
| 1346 // Bound labels refer to known positions in the already | 1353 // Bound labels refer to known positions in the already |
| 1347 // generated code. pos() is the position the label refers to. | 1354 // generated code. pos() is the position the label refers to. |
| 1348 // | 1355 // |
| 1349 // Linked labels refer to unknown positions in the code | 1356 // Linked labels refer to unknown positions in the code |
| 1350 // to be generated; pos() is the position of the 32bit | 1357 // to be generated; pos() is the position of the 32bit |
| 1351 // Displacement of the last instruction using the label. | 1358 // Displacement of the last instruction using the label. |
| 1352 | 1359 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1371 } | 1378 } |
| 1372 } | 1379 } |
| 1373 | 1380 |
| 1374 | 1381 |
| 1375 void Assembler::bind_to(Label* L, int pos) { | 1382 void Assembler::bind_to(Label* L, int pos) { |
| 1376 EnsureSpace ensure_space(this); | 1383 EnsureSpace ensure_space(this); |
| 1377 DCHECK(0 <= pos && pos <= pc_offset()); // must have a valid binding position | 1384 DCHECK(0 <= pos && pos <= pc_offset()); // must have a valid binding position |
| 1378 while (L->is_linked()) { | 1385 while (L->is_linked()) { |
| 1379 Displacement disp = disp_at(L); | 1386 Displacement disp = disp_at(L); |
| 1380 int fixup_pos = L->pos(); | 1387 int fixup_pos = L->pos(); |
| 1381 if (disp.type() == Displacement::CODE_RELATIVE) { | 1388 if (disp.type() == Displacement::CODE_ABSOLUTE) { |
| 1389 long_at_put(fixup_pos, reinterpret_cast<int>(buffer_ + pos)); |
| 1390 internal_reference_positions_.push_back(fixup_pos); |
| 1391 } else if (disp.type() == Displacement::CODE_RELATIVE) { |
| 1382 // Relative to Code* heap object pointer. | 1392 // Relative to Code* heap object pointer. |
| 1383 long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag); | 1393 long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag); |
| 1384 } else { | 1394 } else { |
| 1385 if (disp.type() == Displacement::UNCONDITIONAL_JUMP) { | 1395 if (disp.type() == Displacement::UNCONDITIONAL_JUMP) { |
| 1386 DCHECK(byte_at(fixup_pos - 1) == 0xE9); // jmp expected | 1396 DCHECK(byte_at(fixup_pos - 1) == 0xE9); // jmp expected |
| 1387 } | 1397 } |
| 1388 // Relative address, relative to point after address. | 1398 // Relative address, relative to point after address. |
| 1389 int imm32 = pos - (fixup_pos + sizeof(int32_t)); | 1399 int imm32 = pos - (fixup_pos + sizeof(int32_t)); |
| 1390 long_at_put(fixup_pos, imm32); | 1400 long_at_put(fixup_pos, imm32); |
| 1391 } | 1401 } |
| (...skipping 1291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2683 desc.reloc_size); | 2693 desc.reloc_size); |
| 2684 | 2694 |
| 2685 // Switch buffers. | 2695 // Switch buffers. |
| 2686 DeleteArray(buffer_); | 2696 DeleteArray(buffer_); |
| 2687 buffer_ = desc.buffer; | 2697 buffer_ = desc.buffer; |
| 2688 buffer_size_ = desc.buffer_size; | 2698 buffer_size_ = desc.buffer_size; |
| 2689 pc_ += pc_delta; | 2699 pc_ += pc_delta; |
| 2690 reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, | 2700 reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, |
| 2691 reloc_info_writer.last_pc() + pc_delta); | 2701 reloc_info_writer.last_pc() + pc_delta); |
| 2692 | 2702 |
| 2693 // Relocate runtime entries. | 2703 // Relocate internal references. |
| 2694 for (RelocIterator it(desc); !it.done(); it.next()) { | 2704 for (auto pos : internal_reference_positions_) { |
| 2695 RelocInfo::Mode rmode = it.rinfo()->rmode(); | 2705 int32_t* p = reinterpret_cast<int32_t*>(buffer_ + pos); |
| 2696 if (rmode == RelocInfo::INTERNAL_REFERENCE) { | 2706 *p += pc_delta; |
| 2697 int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc()); | |
| 2698 if (*p != 0) { // 0 means uninitialized. | |
| 2699 *p += pc_delta; | |
| 2700 } | |
| 2701 } | |
| 2702 } | 2707 } |
| 2703 | 2708 |
| 2704 DCHECK(!buffer_overflow()); | 2709 DCHECK(!buffer_overflow()); |
| 2705 } | 2710 } |
| 2706 | 2711 |
| 2707 | 2712 |
| 2708 void Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) { | 2713 void Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) { |
| 2709 DCHECK(is_uint8(op1) && is_uint8(op2)); // wrong opcode | 2714 DCHECK(is_uint8(op1) && is_uint8(op2)); // wrong opcode |
| 2710 DCHECK(is_uint8(imm8)); | 2715 DCHECK(is_uint8(imm8)); |
| 2711 DCHECK((op1 & 0x01) == 0); // should be 8bit operation | 2716 DCHECK((op1 & 0x01) == 0); // should be 8bit operation |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2741 pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3); | 2746 pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3); |
| 2742 | 2747 |
| 2743 // Emit the rest of the encoded operand. | 2748 // Emit the rest of the encoded operand. |
| 2744 for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i]; | 2749 for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i]; |
| 2745 pc_ += length; | 2750 pc_ += length; |
| 2746 | 2751 |
| 2747 // Emit relocation information if necessary. | 2752 // Emit relocation information if necessary. |
| 2748 if (length >= sizeof(int32_t) && !RelocInfo::IsNone(adr.rmode_)) { | 2753 if (length >= sizeof(int32_t) && !RelocInfo::IsNone(adr.rmode_)) { |
| 2749 pc_ -= sizeof(int32_t); // pc_ must be *at* disp32 | 2754 pc_ -= sizeof(int32_t); // pc_ must be *at* disp32 |
| 2750 RecordRelocInfo(adr.rmode_); | 2755 RecordRelocInfo(adr.rmode_); |
| 2751 pc_ += sizeof(int32_t); | 2756 if (adr.rmode_ == RelocInfo::INTERNAL_REFERENCE) { // Fixup for labels |
| 2757 emit_label(*reinterpret_cast<Label**>(pc_)); |
| 2758 } else { |
| 2759 pc_ += sizeof(int32_t); |
| 2760 } |
| 2752 } | 2761 } |
| 2753 } | 2762 } |
| 2754 | 2763 |
| 2764 |
| 2765 void Assembler::emit_label(Label* label) { |
| 2766 if (label->is_bound()) { |
| 2767 internal_reference_positions_.push_back(pc_offset()); |
| 2768 emit(reinterpret_cast<uint32_t>(buffer_ + label->pos())); |
| 2769 } else { |
| 2770 emit_disp(label, Displacement::CODE_ABSOLUTE); |
| 2771 } |
| 2772 } |
| 2773 |
| 2755 | 2774 |
| 2756 void Assembler::emit_farith(int b1, int b2, int i) { | 2775 void Assembler::emit_farith(int b1, int b2, int i) { |
| 2757 DCHECK(is_uint8(b1) && is_uint8(b2)); // wrong opcode | 2776 DCHECK(is_uint8(b1) && is_uint8(b2)); // wrong opcode |
| 2758 DCHECK(0 <= i && i < 8); // illegal stack offset | 2777 DCHECK(0 <= i && i < 8); // illegal stack offset |
| 2759 EMIT(b1); | 2778 EMIT(b1); |
| 2760 EMIT(b2 + i); | 2779 EMIT(b2 + i); |
| 2761 } | 2780 } |
| 2762 | 2781 |
| 2763 | 2782 |
| 2764 void Assembler::db(uint8_t data) { | 2783 void Assembler::db(uint8_t data) { |
| 2765 EnsureSpace ensure_space(this); | 2784 EnsureSpace ensure_space(this); |
| 2766 EMIT(data); | 2785 EMIT(data); |
| 2767 } | 2786 } |
| 2768 | 2787 |
| 2769 | 2788 |
| 2770 void Assembler::dd(uint32_t data) { | 2789 void Assembler::dd(uint32_t data) { |
| 2771 EnsureSpace ensure_space(this); | 2790 EnsureSpace ensure_space(this); |
| 2772 emit(data); | 2791 emit(data); |
| 2773 } | 2792 } |
| 2774 | 2793 |
| 2775 | 2794 |
| 2795 void Assembler::dd(Label* label) { |
| 2796 EnsureSpace ensure_space(this); |
| 2797 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE); |
| 2798 emit_label(label); |
| 2799 } |
| 2800 |
| 2801 |
| 2776 void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { | 2802 void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { |
| 2777 DCHECK(!RelocInfo::IsNone(rmode)); | 2803 DCHECK(!RelocInfo::IsNone(rmode)); |
| 2778 // Don't record external references unless the heap will be serialized. | 2804 // Don't record external references unless the heap will be serialized. |
| 2779 if (rmode == RelocInfo::EXTERNAL_REFERENCE && | 2805 if (rmode == RelocInfo::EXTERNAL_REFERENCE && |
| 2780 !serializer_enabled() && !emit_debug_code()) { | 2806 !serializer_enabled() && !emit_debug_code()) { |
| 2781 return; | 2807 return; |
| 2782 } | 2808 } |
| 2783 RelocInfo rinfo(pc_, rmode, data, NULL); | 2809 RelocInfo rinfo(pc_, rmode, data, NULL); |
| 2784 reloc_info_writer.Write(&rinfo); | 2810 reloc_info_writer.Write(&rinfo); |
| 2785 } | 2811 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2820 fprintf(coverage_log, "%s\n", file_line); | 2846 fprintf(coverage_log, "%s\n", file_line); |
| 2821 fflush(coverage_log); | 2847 fflush(coverage_log); |
| 2822 } | 2848 } |
| 2823 } | 2849 } |
| 2824 | 2850 |
| 2825 #endif | 2851 #endif |
| 2826 | 2852 |
| 2827 } } // namespace v8::internal | 2853 } } // namespace v8::internal |
| 2828 | 2854 |
| 2829 #endif // V8_TARGET_ARCH_IA32 | 2855 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |