| 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 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 static uint64_t cross_compile_; | 504 static uint64_t cross_compile_; |
| 505 | 505 |
| 506 friend class ExternalReference; | 506 friend class ExternalReference; |
| 507 friend class PlatformFeatureScope; | 507 friend class PlatformFeatureScope; |
| 508 DISALLOW_COPY_AND_ASSIGN(CpuFeatures); | 508 DISALLOW_COPY_AND_ASSIGN(CpuFeatures); |
| 509 }; | 509 }; |
| 510 | 510 |
| 511 | 511 |
| 512 #define ASSEMBLER_INSTRUCTION_LIST(V) \ | 512 #define ASSEMBLER_INSTRUCTION_LIST(V) \ |
| 513 V(add) \ | 513 V(add) \ |
| 514 V(and) \ |
| 514 V(cmp) \ | 515 V(cmp) \ |
| 515 V(dec) \ | 516 V(dec) \ |
| 516 V(idiv) \ | 517 V(idiv) \ |
| 517 V(imul) \ | 518 V(imul) \ |
| 518 V(inc) \ | 519 V(inc) \ |
| 519 V(lea) \ | 520 V(lea) \ |
| 520 V(mov) \ | 521 V(mov) \ |
| 521 V(movzxb) \ | 522 V(movzxb) \ |
| 522 V(movzxw) \ | 523 V(movzxw) \ |
| 523 V(neg) \ | 524 V(neg) \ |
| 525 V(not) \ |
| 526 V(or) \ |
| 524 V(repmovs) \ | 527 V(repmovs) \ |
| 525 V(sbb) \ | 528 V(sbb) \ |
| 526 V(sub) \ | 529 V(sub) \ |
| 527 V(test) \ | 530 V(test) \ |
| 528 V(xchg) | 531 V(xchg) \ |
| 532 V(xor) |
| 529 | 533 |
| 530 | 534 |
| 531 class Assembler : public AssemblerBase { | 535 class Assembler : public AssemblerBase { |
| 532 private: | 536 private: |
| 533 // We check before assembling an instruction that there is sufficient | 537 // We check before assembling an instruction that there is sufficient |
| 534 // space to write an instruction and its relocation information. | 538 // space to write an instruction and its relocation information. |
| 535 // The relocation writer's position must be kGap bytes above the end of | 539 // The relocation writer's position must be kGap bytes above the end of |
| 536 // the generated instructions. This leaves enough space for the | 540 // the generated instructions. This leaves enough space for the |
| 537 // longest possible x64 instruction, 15 bytes, and the longest possible | 541 // longest possible x64 instruction, 15 bytes, and the longest possible |
| 538 // relocation information encoding, RelocInfoWriter::kMaxLength == 16. | 542 // relocation information encoding, RelocInfoWriter::kMaxLength == 16. |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 // | 671 // |
| 668 // If we need versions of an assembly instruction that operate on different | 672 // If we need versions of an assembly instruction that operate on different |
| 669 // width arguments, we add a single-letter suffix specifying the width. | 673 // width arguments, we add a single-letter suffix specifying the width. |
| 670 // This is done for the following instructions: mov, cmp, inc, dec, | 674 // This is done for the following instructions: mov, cmp, inc, dec, |
| 671 // add, sub, and test. | 675 // add, sub, and test. |
| 672 // There are no versions of these instructions without the suffix. | 676 // There are no versions of these instructions without the suffix. |
| 673 // - Instructions on 8-bit (byte) operands/registers have a trailing 'b'. | 677 // - Instructions on 8-bit (byte) operands/registers have a trailing 'b'. |
| 674 // - Instructions on 16-bit (word) operands/registers have a trailing 'w'. | 678 // - Instructions on 16-bit (word) operands/registers have a trailing 'w'. |
| 675 // - Instructions on 32-bit (doubleword) operands/registers use 'l'. | 679 // - Instructions on 32-bit (doubleword) operands/registers use 'l'. |
| 676 // - Instructions on 64-bit (quadword) operands/registers use 'q'. | 680 // - Instructions on 64-bit (quadword) operands/registers use 'q'. |
| 677 // | 681 // - Instructions on operands/registers with pointer size use 'p'. |
| 678 // Some mnemonics, such as "and", are the same as C++ keywords. | |
| 679 // Naming conflicts with C++ keywords are resolved by adding a trailing '_'. | |
| 680 | 682 |
| 681 #define DECLARE_INSTRUCTION(instruction) \ | 683 #define DECLARE_INSTRUCTION(instruction) \ |
| 682 template<class P1> \ | 684 template<class P1> \ |
| 683 void instruction##p(P1 p1) { \ | 685 void instruction##p(P1 p1) { \ |
| 684 emit_##instruction(p1, kPointerSize); \ | 686 emit_##instruction(p1, kPointerSize); \ |
| 685 } \ | 687 } \ |
| 686 \ | 688 \ |
| 687 template<class P1> \ | 689 template<class P1> \ |
| 688 void instruction##l(P1 p1) { \ | 690 void instruction##l(P1 p1) { \ |
| 689 emit_##instruction(p1, kInt32Size); \ | 691 emit_##instruction(p1, kInt32Size); \ |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 832 } | 834 } |
| 833 | 835 |
| 834 void cmpw(Register dst, Register src) { | 836 void cmpw(Register dst, Register src) { |
| 835 arithmetic_op_16(0x3B, dst, src); | 837 arithmetic_op_16(0x3B, dst, src); |
| 836 } | 838 } |
| 837 | 839 |
| 838 void cmpw(const Operand& dst, Register src) { | 840 void cmpw(const Operand& dst, Register src) { |
| 839 arithmetic_op_16(0x39, src, dst); | 841 arithmetic_op_16(0x39, src, dst); |
| 840 } | 842 } |
| 841 | 843 |
| 842 void and_(Register dst, Register src) { | |
| 843 arithmetic_op(0x23, dst, src); | |
| 844 } | |
| 845 | |
| 846 void and_(Register dst, const Operand& src) { | |
| 847 arithmetic_op(0x23, dst, src); | |
| 848 } | |
| 849 | |
| 850 void and_(const Operand& dst, Register src) { | |
| 851 arithmetic_op(0x21, src, dst); | |
| 852 } | |
| 853 | |
| 854 void and_(Register dst, Immediate src) { | |
| 855 immediate_arithmetic_op(0x4, dst, src); | |
| 856 } | |
| 857 | |
| 858 void and_(const Operand& dst, Immediate src) { | |
| 859 immediate_arithmetic_op(0x4, dst, src); | |
| 860 } | |
| 861 | |
| 862 void andl(Register dst, Immediate src) { | |
| 863 immediate_arithmetic_op_32(0x4, dst, src); | |
| 864 } | |
| 865 | |
| 866 void andl(Register dst, Register src) { | |
| 867 arithmetic_op_32(0x23, dst, src); | |
| 868 } | |
| 869 | |
| 870 void andl(Register dst, const Operand& src) { | |
| 871 arithmetic_op_32(0x23, dst, src); | |
| 872 } | |
| 873 | |
| 874 void andb(Register dst, Immediate src) { | 844 void andb(Register dst, Immediate src) { |
| 875 immediate_arithmetic_op_8(0x4, dst, src); | 845 immediate_arithmetic_op_8(0x4, dst, src); |
| 876 } | 846 } |
| 877 | 847 |
| 878 void decb(Register dst); | 848 void decb(Register dst); |
| 879 void decb(const Operand& dst); | 849 void decb(const Operand& dst); |
| 880 | 850 |
| 881 // Sign-extends rax into rdx:rax. | 851 // Sign-extends rax into rdx:rax. |
| 882 void cqo(); | 852 void cqo(); |
| 883 // Sign-extends eax into edx:eax. | 853 // Sign-extends eax into edx:eax. |
| 884 void cdq(); | 854 void cdq(); |
| 885 | 855 |
| 886 // Multiply rax by src, put the result in rdx:rax. | 856 // Multiply rax by src, put the result in rdx:rax. |
| 887 void mul(Register src); | 857 void mul(Register src); |
| 888 | 858 |
| 889 void not_(Register dst); | |
| 890 void not_(const Operand& dst); | |
| 891 void notl(Register dst); | |
| 892 | |
| 893 void or_(Register dst, Register src) { | |
| 894 arithmetic_op(0x0B, dst, src); | |
| 895 } | |
| 896 | |
| 897 void orl(Register dst, Register src) { | |
| 898 arithmetic_op_32(0x0B, dst, src); | |
| 899 } | |
| 900 | |
| 901 void or_(Register dst, const Operand& src) { | |
| 902 arithmetic_op(0x0B, dst, src); | |
| 903 } | |
| 904 | |
| 905 void orl(Register dst, const Operand& src) { | |
| 906 arithmetic_op_32(0x0B, dst, src); | |
| 907 } | |
| 908 | |
| 909 void or_(const Operand& dst, Register src) { | |
| 910 arithmetic_op(0x09, src, dst); | |
| 911 } | |
| 912 | |
| 913 void orl(const Operand& dst, Register src) { | |
| 914 arithmetic_op_32(0x09, src, dst); | |
| 915 } | |
| 916 | |
| 917 void or_(Register dst, Immediate src) { | |
| 918 immediate_arithmetic_op(0x1, dst, src); | |
| 919 } | |
| 920 | |
| 921 void orl(Register dst, Immediate src) { | |
| 922 immediate_arithmetic_op_32(0x1, dst, src); | |
| 923 } | |
| 924 | |
| 925 void or_(const Operand& dst, Immediate src) { | |
| 926 immediate_arithmetic_op(0x1, dst, src); | |
| 927 } | |
| 928 | |
| 929 void orl(const Operand& dst, Immediate src) { | |
| 930 immediate_arithmetic_op_32(0x1, dst, src); | |
| 931 } | |
| 932 | |
| 933 void rcl(Register dst, Immediate imm8) { | 859 void rcl(Register dst, Immediate imm8) { |
| 934 shift(dst, imm8, 0x2); | 860 shift(dst, imm8, 0x2); |
| 935 } | 861 } |
| 936 | 862 |
| 937 void rol(Register dst, Immediate imm8) { | 863 void rol(Register dst, Immediate imm8) { |
| 938 shift(dst, imm8, 0x0); | 864 shift(dst, imm8, 0x0); |
| 939 } | 865 } |
| 940 | 866 |
| 941 void roll(Register dst, Immediate imm8) { | 867 void roll(Register dst, Immediate imm8) { |
| 942 shift_32(dst, imm8, 0x0); | 868 shift_32(dst, imm8, 0x0); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1023 | 949 |
| 1024 void subb(Register dst, Immediate src) { | 950 void subb(Register dst, Immediate src) { |
| 1025 immediate_arithmetic_op_8(0x5, dst, src); | 951 immediate_arithmetic_op_8(0x5, dst, src); |
| 1026 } | 952 } |
| 1027 | 953 |
| 1028 void testb(Register dst, Register src); | 954 void testb(Register dst, Register src); |
| 1029 void testb(Register reg, Immediate mask); | 955 void testb(Register reg, Immediate mask); |
| 1030 void testb(const Operand& op, Immediate mask); | 956 void testb(const Operand& op, Immediate mask); |
| 1031 void testb(const Operand& op, Register reg); | 957 void testb(const Operand& op, Register reg); |
| 1032 | 958 |
| 1033 void xor_(Register dst, Register src) { | |
| 1034 if (dst.code() == src.code()) { | |
| 1035 arithmetic_op_32(0x33, dst, src); | |
| 1036 } else { | |
| 1037 arithmetic_op(0x33, dst, src); | |
| 1038 } | |
| 1039 } | |
| 1040 | |
| 1041 void xorl(Register dst, Register src) { | |
| 1042 arithmetic_op_32(0x33, dst, src); | |
| 1043 } | |
| 1044 | |
| 1045 void xorl(Register dst, const Operand& src) { | |
| 1046 arithmetic_op_32(0x33, dst, src); | |
| 1047 } | |
| 1048 | |
| 1049 void xorl(Register dst, Immediate src) { | |
| 1050 immediate_arithmetic_op_32(0x6, dst, src); | |
| 1051 } | |
| 1052 | |
| 1053 void xorl(const Operand& dst, Register src) { | |
| 1054 arithmetic_op_32(0x31, src, dst); | |
| 1055 } | |
| 1056 | |
| 1057 void xorl(const Operand& dst, Immediate src) { | |
| 1058 immediate_arithmetic_op_32(0x6, dst, src); | |
| 1059 } | |
| 1060 | |
| 1061 void xor_(Register dst, const Operand& src) { | |
| 1062 arithmetic_op(0x33, dst, src); | |
| 1063 } | |
| 1064 | |
| 1065 void xor_(const Operand& dst, Register src) { | |
| 1066 arithmetic_op(0x31, src, dst); | |
| 1067 } | |
| 1068 | |
| 1069 void xor_(Register dst, Immediate src) { | |
| 1070 immediate_arithmetic_op(0x6, dst, src); | |
| 1071 } | |
| 1072 | |
| 1073 void xor_(const Operand& dst, Immediate src) { | |
| 1074 immediate_arithmetic_op(0x6, dst, src); | |
| 1075 } | |
| 1076 | |
| 1077 // Bit operations. | 959 // Bit operations. |
| 1078 void bt(const Operand& dst, Register src); | 960 void bt(const Operand& dst, Register src); |
| 1079 void bts(const Operand& dst, Register src); | 961 void bts(const Operand& dst, Register src); |
| 1080 void bsrl(Register dst, Register src); | 962 void bsrl(Register dst, Register src); |
| 1081 | 963 |
| 1082 // Miscellaneous | 964 // Miscellaneous |
| 1083 void clc(); | 965 void clc(); |
| 1084 void cld(); | 966 void cld(); |
| 1085 void cpuid(); | 967 void cpuid(); |
| 1086 void hlt(); | 968 void hlt(); |
| (...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1628 | 1510 |
| 1629 void emit_add(const Operand& dst, Immediate src, int size) { | 1511 void emit_add(const Operand& dst, Immediate src, int size) { |
| 1630 if (size == kInt64Size) { | 1512 if (size == kInt64Size) { |
| 1631 immediate_arithmetic_op(0x0, dst, src); | 1513 immediate_arithmetic_op(0x0, dst, src); |
| 1632 } else { | 1514 } else { |
| 1633 ASSERT(size == kInt32Size); | 1515 ASSERT(size == kInt32Size); |
| 1634 immediate_arithmetic_op_32(0x0, dst, src); | 1516 immediate_arithmetic_op_32(0x0, dst, src); |
| 1635 } | 1517 } |
| 1636 } | 1518 } |
| 1637 | 1519 |
| 1520 void emit_and(Register dst, Register src, int size) { |
| 1521 if (size == kInt64Size) { |
| 1522 arithmetic_op(0x23, dst, src); |
| 1523 } else { |
| 1524 ASSERT(size == kInt32Size); |
| 1525 arithmetic_op_32(0x23, dst, src); |
| 1526 } |
| 1527 } |
| 1528 |
| 1529 void emit_and(Register dst, const Operand& src, int size) { |
| 1530 if (size == kInt64Size) { |
| 1531 arithmetic_op(0x23, dst, src); |
| 1532 } else { |
| 1533 ASSERT(size == kInt32Size); |
| 1534 arithmetic_op_32(0x23, dst, src); |
| 1535 } |
| 1536 } |
| 1537 |
| 1538 void emit_and(const Operand& dst, Register src, int size) { |
| 1539 if (size == kInt64Size) { |
| 1540 arithmetic_op(0x21, src, dst); |
| 1541 } else { |
| 1542 ASSERT(size == kInt32Size); |
| 1543 arithmetic_op_32(0x21, src, dst); |
| 1544 } |
| 1545 } |
| 1546 |
| 1547 void emit_and(Register dst, Immediate src, int size) { |
| 1548 if (size == kInt64Size) { |
| 1549 immediate_arithmetic_op(0x4, dst, src); |
| 1550 } else { |
| 1551 ASSERT(size == kInt32Size); |
| 1552 immediate_arithmetic_op_32(0x4, dst, src); |
| 1553 } |
| 1554 } |
| 1555 |
| 1556 void emit_and(const Operand& dst, Immediate src, int size) { |
| 1557 if (size == kInt64Size) { |
| 1558 immediate_arithmetic_op(0x4, dst, src); |
| 1559 } else { |
| 1560 ASSERT(size == kInt32Size); |
| 1561 immediate_arithmetic_op_32(0x4, dst, src); |
| 1562 } |
| 1563 } |
| 1564 |
| 1638 void emit_cmp(Register dst, Register src, int size) { | 1565 void emit_cmp(Register dst, Register src, int size) { |
| 1639 if (size == kInt64Size) { | 1566 if (size == kInt64Size) { |
| 1640 arithmetic_op(0x3B, dst, src); | 1567 arithmetic_op(0x3B, dst, src); |
| 1641 } else { | 1568 } else { |
| 1642 ASSERT(size == kInt32Size); | 1569 ASSERT(size == kInt32Size); |
| 1643 arithmetic_op_32(0x3B, dst, src); | 1570 arithmetic_op_32(0x3B, dst, src); |
| 1644 } | 1571 } |
| 1645 } | 1572 } |
| 1646 | 1573 |
| 1647 void emit_cmp(Register dst, const Operand& src, int size) { | 1574 void emit_cmp(Register dst, const Operand& src, int size) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1706 void emit_mov(Register dst, Immediate value, int size); | 1633 void emit_mov(Register dst, Immediate value, int size); |
| 1707 void emit_mov(const Operand& dst, Immediate value, int size); | 1634 void emit_mov(const Operand& dst, Immediate value, int size); |
| 1708 | 1635 |
| 1709 void emit_movzxb(Register dst, const Operand& src, int size); | 1636 void emit_movzxb(Register dst, const Operand& src, int size); |
| 1710 void emit_movzxw(Register dst, const Operand& src, int size); | 1637 void emit_movzxw(Register dst, const Operand& src, int size); |
| 1711 void emit_movzxw(Register dst, Register src, int size); | 1638 void emit_movzxw(Register dst, Register src, int size); |
| 1712 | 1639 |
| 1713 void emit_neg(Register dst, int size); | 1640 void emit_neg(Register dst, int size); |
| 1714 void emit_neg(const Operand& dst, int size); | 1641 void emit_neg(const Operand& dst, int size); |
| 1715 | 1642 |
| 1643 void emit_not(Register dst, int size); |
| 1644 void emit_not(const Operand& dst, int size); |
| 1645 |
| 1646 void emit_or(Register dst, Register src, int size) { |
| 1647 if (size == kInt64Size) { |
| 1648 arithmetic_op(0x0B, dst, src); |
| 1649 } else { |
| 1650 arithmetic_op_32(0x0B, dst, src); |
| 1651 } |
| 1652 } |
| 1653 |
| 1654 void emit_or(Register dst, const Operand& src, int size) { |
| 1655 if (size == kInt64Size) { |
| 1656 arithmetic_op(0x0B, dst, src); |
| 1657 } else { |
| 1658 arithmetic_op_32(0x0B, dst, src); |
| 1659 } |
| 1660 } |
| 1661 |
| 1662 void emit_or(const Operand& dst, Register src, int size) { |
| 1663 if (size == kInt64Size) { |
| 1664 arithmetic_op(0x9, src, dst); |
| 1665 } else { |
| 1666 arithmetic_op_32(0x9, src, dst); |
| 1667 } |
| 1668 } |
| 1669 |
| 1670 void emit_or(Register dst, Immediate src, int size) { |
| 1671 if (size == kInt64Size) { |
| 1672 immediate_arithmetic_op(0x1, dst, src); |
| 1673 } else { |
| 1674 immediate_arithmetic_op_32(0x1, dst, src); |
| 1675 } |
| 1676 } |
| 1677 |
| 1678 void emit_or(const Operand& dst, Immediate src, int size) { |
| 1679 if (size == kInt64Size) { |
| 1680 immediate_arithmetic_op(0x1, dst, src); |
| 1681 } else { |
| 1682 immediate_arithmetic_op_32(0x1, dst, src); |
| 1683 } |
| 1684 } |
| 1685 |
| 1716 void emit_repmovs(int size); | 1686 void emit_repmovs(int size); |
| 1717 | 1687 |
| 1718 void emit_sbb(Register dst, Register src, int size) { | 1688 void emit_sbb(Register dst, Register src, int size) { |
| 1719 if (size == kInt64Size) { | 1689 if (size == kInt64Size) { |
| 1720 arithmetic_op(0x1b, dst, src); | 1690 arithmetic_op(0x1b, dst, src); |
| 1721 } else { | 1691 } else { |
| 1722 ASSERT(size == kInt32Size); | 1692 ASSERT(size == kInt32Size); |
| 1723 arithmetic_op_32(0x1b, dst, src); | 1693 arithmetic_op_32(0x1b, dst, src); |
| 1724 } | 1694 } |
| 1725 } | 1695 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1770 } | 1740 } |
| 1771 | 1741 |
| 1772 void emit_test(Register dst, Register src, int size); | 1742 void emit_test(Register dst, Register src, int size); |
| 1773 void emit_test(Register reg, Immediate mask, int size); | 1743 void emit_test(Register reg, Immediate mask, int size); |
| 1774 void emit_test(const Operand& op, Register reg, int size); | 1744 void emit_test(const Operand& op, Register reg, int size); |
| 1775 void emit_test(const Operand& op, Immediate mask, int size); | 1745 void emit_test(const Operand& op, Immediate mask, int size); |
| 1776 | 1746 |
| 1777 // Exchange two registers | 1747 // Exchange two registers |
| 1778 void emit_xchg(Register dst, Register src, int size); | 1748 void emit_xchg(Register dst, Register src, int size); |
| 1779 | 1749 |
| 1750 void emit_xor(Register dst, Register src, int size) { |
| 1751 if (size == kInt64Size) { |
| 1752 if (dst.code() == src.code()) { |
| 1753 arithmetic_op_32(0x33, dst, src); |
| 1754 } else { |
| 1755 arithmetic_op(0x33, dst, src); |
| 1756 } |
| 1757 } else { |
| 1758 ASSERT(size == kInt32Size); |
| 1759 arithmetic_op_32(0x33, dst, src); |
| 1760 } |
| 1761 } |
| 1762 |
| 1763 void emit_xor(Register dst, const Operand& src, int size) { |
| 1764 if (size == kInt64Size) { |
| 1765 arithmetic_op(0x33, dst, src); |
| 1766 } else { |
| 1767 ASSERT(size == kInt32Size); |
| 1768 arithmetic_op_32(0x33, dst, src); |
| 1769 } |
| 1770 } |
| 1771 |
| 1772 void emit_xor(Register dst, Immediate src, int size) { |
| 1773 if (size == kInt64Size) { |
| 1774 immediate_arithmetic_op(0x6, dst, src); |
| 1775 } else { |
| 1776 ASSERT(size == kInt32Size); |
| 1777 immediate_arithmetic_op_32(0x6, dst, src); |
| 1778 } |
| 1779 } |
| 1780 |
| 1781 void emit_xor(const Operand& dst, Immediate src, int size) { |
| 1782 if (size == kInt64Size) { |
| 1783 immediate_arithmetic_op(0x6, dst, src); |
| 1784 } else { |
| 1785 ASSERT(size == kInt32Size); |
| 1786 immediate_arithmetic_op_32(0x6, dst, src); |
| 1787 } |
| 1788 } |
| 1789 |
| 1790 void emit_xor(const Operand& dst, Register src, int size) { |
| 1791 if (size == kInt64Size) { |
| 1792 arithmetic_op(0x31, src, dst); |
| 1793 } else { |
| 1794 ASSERT(size == kInt32Size); |
| 1795 arithmetic_op_32(0x31, src, dst); |
| 1796 } |
| 1797 } |
| 1798 |
| 1780 friend class CodePatcher; | 1799 friend class CodePatcher; |
| 1781 friend class EnsureSpace; | 1800 friend class EnsureSpace; |
| 1782 friend class RegExpMacroAssemblerX64; | 1801 friend class RegExpMacroAssemblerX64; |
| 1783 | 1802 |
| 1784 // code generation | 1803 // code generation |
| 1785 RelocInfoWriter reloc_info_writer; | 1804 RelocInfoWriter reloc_info_writer; |
| 1786 | 1805 |
| 1787 List< Handle<Code> > code_targets_; | 1806 List< Handle<Code> > code_targets_; |
| 1788 | 1807 |
| 1789 PositionsRecorder positions_recorder_; | 1808 PositionsRecorder positions_recorder_; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1814 private: | 1833 private: |
| 1815 Assembler* assembler_; | 1834 Assembler* assembler_; |
| 1816 #ifdef DEBUG | 1835 #ifdef DEBUG |
| 1817 int space_before_; | 1836 int space_before_; |
| 1818 #endif | 1837 #endif |
| 1819 }; | 1838 }; |
| 1820 | 1839 |
| 1821 } } // namespace v8::internal | 1840 } } // namespace v8::internal |
| 1822 | 1841 |
| 1823 #endif // V8_X64_ASSEMBLER_X64_H_ | 1842 #endif // V8_X64_ASSEMBLER_X64_H_ |
| OLD | NEW |