Mercurial > hg > truffle
comparison src/cpu/x86/vm/c1_LIRAssembler_x86.cpp @ 647:bd441136a5ce
Merge
author | kvn |
---|---|
date | Thu, 19 Mar 2009 09:13:24 -0700 |
parents | 7bb995fbd3c0 c517646eef23 |
children | c96bf21b756f |
comparison
equal
deleted
inserted
replaced
640:ba50942c8138 | 647:bd441136a5ce |
---|---|
1596 __ movptr(k_RInfo, Address(array, oopDesc::klass_offset_in_bytes())); | 1596 __ movptr(k_RInfo, Address(array, oopDesc::klass_offset_in_bytes())); |
1597 __ movptr(klass_RInfo, Address(value, oopDesc::klass_offset_in_bytes())); | 1597 __ movptr(klass_RInfo, Address(value, oopDesc::klass_offset_in_bytes())); |
1598 | 1598 |
1599 // get instance klass | 1599 // get instance klass |
1600 __ movptr(k_RInfo, Address(k_RInfo, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc))); | 1600 __ movptr(k_RInfo, Address(k_RInfo, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc))); |
1601 // get super_check_offset | 1601 // perform the fast part of the checking logic |
1602 __ movl(Rtmp1, Address(k_RInfo, sizeof(oopDesc) + Klass::super_check_offset_offset_in_bytes())); | 1602 __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, &done, stub->entry(), NULL); |
1603 // See if we get an immediate positive hit | 1603 // call out-of-line instance of __ check_klass_subtype_slow_path(...): |
1604 __ cmpptr(k_RInfo, Address(klass_RInfo, Rtmp1, Address::times_1)); | |
1605 __ jcc(Assembler::equal, done); | |
1606 // check for immediate negative hit | |
1607 __ cmpl(Rtmp1, sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes()); | |
1608 __ jcc(Assembler::notEqual, *stub->entry()); | |
1609 // check for self | |
1610 __ cmpptr(klass_RInfo, k_RInfo); | |
1611 __ jcc(Assembler::equal, done); | |
1612 | |
1613 __ push(klass_RInfo); | 1604 __ push(klass_RInfo); |
1614 __ push(k_RInfo); | 1605 __ push(k_RInfo); |
1615 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); | 1606 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); |
1616 __ pop(klass_RInfo); | 1607 __ pop(klass_RInfo); |
1617 __ pop(k_RInfo); | 1608 __ pop(k_RInfo); |
1733 __ cmpl(klass_RInfo, 0); | 1724 __ cmpl(klass_RInfo, 0); |
1734 __ jcc(Assembler::equal, *stub->entry()); | 1725 __ jcc(Assembler::equal, *stub->entry()); |
1735 } | 1726 } |
1736 __ bind(done); | 1727 __ bind(done); |
1737 } else { | 1728 } else { |
1738 __ movl(Rtmp1, Address(k_RInfo, sizeof(oopDesc) + Klass::super_check_offset_offset_in_bytes())); | 1729 // perform the fast part of the checking logic |
1739 // See if we get an immediate positive hit | 1730 __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, &done, stub->entry(), NULL); |
1740 __ cmpptr(k_RInfo, Address(klass_RInfo, Rtmp1, Address::times_1)); | 1731 // call out-of-line instance of __ check_klass_subtype_slow_path(...): |
1741 __ jcc(Assembler::equal, done); | |
1742 // check for immediate negative hit | |
1743 __ cmpl(Rtmp1, sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes()); | |
1744 __ jcc(Assembler::notEqual, *stub->entry()); | |
1745 // check for self | |
1746 __ cmpptr(klass_RInfo, k_RInfo); | |
1747 __ jcc(Assembler::equal, done); | |
1748 | |
1749 __ push(klass_RInfo); | 1732 __ push(klass_RInfo); |
1750 __ push(k_RInfo); | 1733 __ push(k_RInfo); |
1751 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); | 1734 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); |
1752 __ pop(klass_RInfo); | 1735 __ pop(klass_RInfo); |
1753 __ pop(k_RInfo); | 1736 __ pop(k_RInfo); |
1819 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); | 1802 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); |
1820 __ pop(klass_RInfo); | 1803 __ pop(klass_RInfo); |
1821 __ pop(dst); | 1804 __ pop(dst); |
1822 __ jmp(done); | 1805 __ jmp(done); |
1823 } | 1806 } |
1824 } else { | 1807 } |
1825 #else | 1808 else // next block is unconditional if LP64: |
1826 { // YUCK | |
1827 #endif // LP64 | 1809 #endif // LP64 |
1810 { | |
1828 assert(dst != klass_RInfo && dst != k_RInfo, "need 3 registers"); | 1811 assert(dst != klass_RInfo && dst != k_RInfo, "need 3 registers"); |
1829 | 1812 |
1830 __ movl(dst, Address(k_RInfo, sizeof(oopDesc) + Klass::super_check_offset_offset_in_bytes())); | 1813 // perform the fast part of the checking logic |
1831 // See if we get an immediate positive hit | 1814 __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, dst, &one, &zero, NULL); |
1832 __ cmpptr(k_RInfo, Address(klass_RInfo, dst, Address::times_1)); | 1815 // call out-of-line instance of __ check_klass_subtype_slow_path(...): |
1833 __ jcc(Assembler::equal, one); | |
1834 // check for immediate negative hit | |
1835 __ cmpl(dst, sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes()); | |
1836 __ jcc(Assembler::notEqual, zero); | |
1837 // check for self | |
1838 __ cmpptr(klass_RInfo, k_RInfo); | |
1839 __ jcc(Assembler::equal, one); | |
1840 | |
1841 __ push(klass_RInfo); | 1816 __ push(klass_RInfo); |
1842 __ push(k_RInfo); | 1817 __ push(k_RInfo); |
1843 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); | 1818 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); |
1844 __ pop(klass_RInfo); | 1819 __ pop(klass_RInfo); |
1845 __ pop(dst); | 1820 __ pop(dst); |