Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: src/ia32/assembler-ia32.cc

Issue 6928060: Merge Label and NearLabel (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: address comments Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ia32/assembler-ia32.h ('k') | src/ia32/assembler-ia32-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1507 matching lines...) Expand 10 before | Expand all | Expand 10 after
1518 } else { 1518 } else {
1519 if (disp.type() == Displacement::UNCONDITIONAL_JUMP) { 1519 if (disp.type() == Displacement::UNCONDITIONAL_JUMP) {
1520 ASSERT(byte_at(fixup_pos - 1) == 0xE9); // jmp expected 1520 ASSERT(byte_at(fixup_pos - 1) == 0xE9); // jmp expected
1521 } 1521 }
1522 // Relative address, relative to point after address. 1522 // Relative address, relative to point after address.
1523 int imm32 = pos - (fixup_pos + sizeof(int32_t)); 1523 int imm32 = pos - (fixup_pos + sizeof(int32_t));
1524 long_at_put(fixup_pos, imm32); 1524 long_at_put(fixup_pos, imm32);
1525 } 1525 }
1526 disp.next(L); 1526 disp.next(L);
1527 } 1527 }
1528 while (L->is_near_linked()) {
1529 int fixup_pos = L->near_link_pos();
1530 int offset_to_next =
1531 static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos)));
1532 ASSERT(offset_to_next <= 0);
1533 // Relative address, relative to point after address.
1534 int disp = pos - fixup_pos - sizeof(int8_t);
1535 ASSERT(0 <= disp && disp <= 127);
1536 set_byte_at(fixup_pos, disp);
1537 if (offset_to_next < 0) {
1538 L->link_to(fixup_pos + offset_to_next, Label::kNear);
1539 } else {
1540 L->UnuseNear();
1541 }
1542 }
1528 L->bind_to(pos); 1543 L->bind_to(pos);
1529 } 1544 }
1530 1545
1531 1546
1532 void Assembler::bind(Label* L) { 1547 void Assembler::bind(Label* L) {
1533 EnsureSpace ensure_space(this); 1548 EnsureSpace ensure_space(this);
1534 last_pc_ = NULL; 1549 last_pc_ = NULL;
1535 ASSERT(!L->is_bound()); // label can only be bound once 1550 ASSERT(!L->is_bound()); // label can only be bound once
1536 bind_to(L, pc_offset()); 1551 bind_to(L, pc_offset());
1537 } 1552 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1606 unsigned ast_id) { 1621 unsigned ast_id) {
1607 positions_recorder()->WriteRecordedPositions(); 1622 positions_recorder()->WriteRecordedPositions();
1608 EnsureSpace ensure_space(this); 1623 EnsureSpace ensure_space(this);
1609 last_pc_ = pc_; 1624 last_pc_ = pc_;
1610 ASSERT(RelocInfo::IsCodeTarget(rmode)); 1625 ASSERT(RelocInfo::IsCodeTarget(rmode));
1611 EMIT(0xE8); 1626 EMIT(0xE8);
1612 emit(reinterpret_cast<intptr_t>(code.location()), rmode, ast_id); 1627 emit(reinterpret_cast<intptr_t>(code.location()), rmode, ast_id);
1613 } 1628 }
1614 1629
1615 1630
1616 void Assembler::jmp(Label* L) { 1631 void Assembler::jmp(Label* L, Label::Distance distance) {
1617 EnsureSpace ensure_space(this); 1632 EnsureSpace ensure_space(this);
1618 last_pc_ = pc_; 1633 last_pc_ = pc_;
1619 if (L->is_bound()) { 1634 if (L->is_bound()) {
1620 const int short_size = 2; 1635 const int short_size = 2;
1621 const int long_size = 5; 1636 const int long_size = 5;
1622 int offs = L->pos() - pc_offset(); 1637 int offs = L->pos() - pc_offset();
1623 ASSERT(offs <= 0); 1638 ASSERT(offs <= 0);
1624 if (is_int8(offs - short_size)) { 1639 if (is_int8(offs - short_size)) {
1625 // 1110 1011 #8-bit disp. 1640 // 1110 1011 #8-bit disp.
1626 EMIT(0xEB); 1641 EMIT(0xEB);
1627 EMIT((offs - short_size) & 0xFF); 1642 EMIT((offs - short_size) & 0xFF);
1628 } else { 1643 } else {
1629 // 1110 1001 #32-bit disp. 1644 // 1110 1001 #32-bit disp.
1630 EMIT(0xE9); 1645 EMIT(0xE9);
1631 emit(offs - long_size); 1646 emit(offs - long_size);
1632 } 1647 }
1648 } else if (distance == Label::kNear) {
1649 EMIT(0xEB);
1650 emit_near_disp(L);
1633 } else { 1651 } else {
1634 // 1110 1001 #32-bit disp. 1652 // 1110 1001 #32-bit disp.
1635 EMIT(0xE9); 1653 EMIT(0xE9);
1636 emit_disp(L, Displacement::UNCONDITIONAL_JUMP); 1654 emit_disp(L, Displacement::UNCONDITIONAL_JUMP);
1637 } 1655 }
1638 } 1656 }
1639 1657
1640 1658
1641 void Assembler::jmp(byte* entry, RelocInfo::Mode rmode) { 1659 void Assembler::jmp(byte* entry, RelocInfo::Mode rmode) {
1642 EnsureSpace ensure_space(this); 1660 EnsureSpace ensure_space(this);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1676 EMIT(0xEB); 1694 EMIT(0xEB);
1677 EMIT((offs - short_size) & 0xFF); 1695 EMIT((offs - short_size) & 0xFF);
1678 } else { 1696 } else {
1679 EMIT(0xEB); 1697 EMIT(0xEB);
1680 EMIT(0x00); // The displacement will be resolved later. 1698 EMIT(0x00); // The displacement will be resolved later.
1681 L->link_to(pc_offset()); 1699 L->link_to(pc_offset());
1682 } 1700 }
1683 } 1701 }
1684 1702
1685 1703
1686 void Assembler::j(Condition cc, Label* L, Hint hint) { 1704 void Assembler::j(Condition cc, Label* L, Hint hint, Label::Distance distance) {
1687 EnsureSpace ensure_space(this); 1705 EnsureSpace ensure_space(this);
1688 last_pc_ = pc_; 1706 last_pc_ = pc_;
1689 ASSERT(0 <= cc && cc < 16); 1707 ASSERT(0 <= cc && cc < 16);
1690 if (FLAG_emit_branch_hints && hint != no_hint) EMIT(hint); 1708 if (FLAG_emit_branch_hints && hint != no_hint) EMIT(hint);
1691 if (L->is_bound()) { 1709 if (L->is_bound()) {
1692 const int short_size = 2; 1710 const int short_size = 2;
1693 const int long_size = 6; 1711 const int long_size = 6;
1694 int offs = L->pos() - pc_offset(); 1712 int offs = L->pos() - pc_offset();
1695 ASSERT(offs <= 0); 1713 ASSERT(offs <= 0);
1696 if (is_int8(offs - short_size)) { 1714 if (is_int8(offs - short_size)) {
1697 // 0111 tttn #8-bit disp 1715 // 0111 tttn #8-bit disp
1698 EMIT(0x70 | cc); 1716 EMIT(0x70 | cc);
1699 EMIT((offs - short_size) & 0xFF); 1717 EMIT((offs - short_size) & 0xFF);
1700 } else { 1718 } else {
1701 // 0000 1111 1000 tttn #32-bit disp 1719 // 0000 1111 1000 tttn #32-bit disp
1702 EMIT(0x0F); 1720 EMIT(0x0F);
1703 EMIT(0x80 | cc); 1721 EMIT(0x80 | cc);
1704 emit(offs - long_size); 1722 emit(offs - long_size);
1705 } 1723 }
1724 } else if (distance == Label::kNear) {
1725 EMIT(0x70 | cc);
1726 emit_near_disp(L);
1706 } else { 1727 } else {
1707 // 0000 1111 1000 tttn #32-bit disp 1728 // 0000 1111 1000 tttn #32-bit disp
1708 // Note: could eliminate cond. jumps to this jump if condition 1729 // Note: could eliminate cond. jumps to this jump if condition
1709 // is the same however, seems to be rather unlikely case. 1730 // is the same however, seems to be rather unlikely case.
1710 EMIT(0x0F); 1731 EMIT(0x0F);
1711 EMIT(0x80 | cc); 1732 EMIT(0x80 | cc);
1712 emit_disp(L, Displacement::OTHER); 1733 emit_disp(L, Displacement::OTHER);
1713 } 1734 }
1714 } 1735 }
1715 1736
(...skipping 1144 matching lines...) Expand 10 before | Expand all | Expand 10 after
2860 fprintf(coverage_log, "%s\n", file_line); 2881 fprintf(coverage_log, "%s\n", file_line);
2861 fflush(coverage_log); 2882 fflush(coverage_log);
2862 } 2883 }
2863 } 2884 }
2864 2885
2865 #endif 2886 #endif
2866 2887
2867 } } // namespace v8::internal 2888 } } // namespace v8::internal
2868 2889
2869 #endif // V8_TARGET_ARCH_IA32 2890 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/assembler-ia32.h ('k') | src/ia32/assembler-ia32-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698