1711 if ( type == T_OBJECT ) __ ld_ptr(as_Address(addr), O7); 1712 else __ ld(as_Address(addr), O7); 1713 __ cmp(O7, opr2->as_constant_ptr()->as_jint()); 1714 } else { 1715 ShouldNotReachHere(); 1716 } 1717 } 1718 1719 1720 void LIR_Assembler::comp_fl2i(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst, LIR_Op2* op){ 1721 if (code == lir_cmp_fd2i || code == lir_ucmp_fd2i) { 1722 bool is_unordered_less = (code == lir_ucmp_fd2i); 1723 if (left->is_single_fpu()) { 1724 __ float_cmp(true, is_unordered_less ? -1 : 1, left->as_float_reg(), right->as_float_reg(), dst->as_register()); 1725 } else if (left->is_double_fpu()) { 1726 __ float_cmp(false, is_unordered_less ? -1 : 1, left->as_double_reg(), right->as_double_reg(), dst->as_register()); 1727 } else { 1728 ShouldNotReachHere(); 1729 } 1730 } else if (code == lir_cmp_l2i) { 1731 __ lcmp(left->as_register_hi(), left->as_register_lo(), 1732 right->as_register_hi(), right->as_register_lo(), 1733 dst->as_register()); 1734 } else { 1735 ShouldNotReachHere(); 1736 } 1737 } 1738 1739 1740 void LIR_Assembler::cmove(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result) { 1741 1742 Assembler::Condition acond; 1743 switch (condition) { 1744 case lir_cond_equal: acond = Assembler::equal; break; 1745 case lir_cond_notEqual: acond = Assembler::notEqual; break; 1746 case lir_cond_less: acond = Assembler::less; break; 1747 case lir_cond_lessEqual: acond = Assembler::lessEqual; break; 1748 case lir_cond_greaterEqual: acond = Assembler::greaterEqual; break; 1749 case lir_cond_greater: acond = Assembler::greater; break; 1750 case lir_cond_aboveEqual: acond = Assembler::greaterEqualUnsigned; break; 1751 case lir_cond_belowEqual: acond = Assembler::lessEqualUnsigned; break; 1752 default: ShouldNotReachHere(); 1753 }; | 1711 if ( type == T_OBJECT ) __ ld_ptr(as_Address(addr), O7); 1712 else __ ld(as_Address(addr), O7); 1713 __ cmp(O7, opr2->as_constant_ptr()->as_jint()); 1714 } else { 1715 ShouldNotReachHere(); 1716 } 1717 } 1718 1719 1720 void LIR_Assembler::comp_fl2i(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst, LIR_Op2* op){ 1721 if (code == lir_cmp_fd2i || code == lir_ucmp_fd2i) { 1722 bool is_unordered_less = (code == lir_ucmp_fd2i); 1723 if (left->is_single_fpu()) { 1724 __ float_cmp(true, is_unordered_less ? -1 : 1, left->as_float_reg(), right->as_float_reg(), dst->as_register()); 1725 } else if (left->is_double_fpu()) { 1726 __ float_cmp(false, is_unordered_less ? -1 : 1, left->as_double_reg(), right->as_double_reg(), dst->as_register()); 1727 } else { 1728 ShouldNotReachHere(); 1729 } 1730 } else if (code == lir_cmp_l2i) { 1731 #ifdef _LP64 1732 __ lcmp(left->as_register_lo(), right->as_register_lo(), dst->as_register()); 1733 #else 1734 __ lcmp(left->as_register_hi(), left->as_register_lo(), 1735 right->as_register_hi(), right->as_register_lo(), 1736 dst->as_register()); 1737 #endif 1738 } else { 1739 ShouldNotReachHere(); 1740 } 1741 } 1742 1743 1744 void LIR_Assembler::cmove(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result) { 1745 1746 Assembler::Condition acond; 1747 switch (condition) { 1748 case lir_cond_equal: acond = Assembler::equal; break; 1749 case lir_cond_notEqual: acond = Assembler::notEqual; break; 1750 case lir_cond_less: acond = Assembler::less; break; 1751 case lir_cond_lessEqual: acond = Assembler::lessEqual; break; 1752 case lir_cond_greaterEqual: acond = Assembler::greaterEqual; break; 1753 case lir_cond_greater: acond = Assembler::greater; break; 1754 case lir_cond_aboveEqual: acond = Assembler::greaterEqualUnsigned; break; 1755 case lir_cond_belowEqual: acond = Assembler::lessEqualUnsigned; break; 1756 default: ShouldNotReachHere(); 1757 }; |