3697 Register dst = dest->as_register_lo(); 3698 __ movptr(dst, lo); 3699 __ negptr(dst); 3700 #else 3701 Register hi = left->as_register_hi(); 3702 __ lneg(hi, lo); 3703 if (dest->as_register_lo() == hi) { 3704 assert(dest->as_register_hi() != lo, "destroying register"); 3705 move_regs(hi, dest->as_register_hi()); 3706 move_regs(lo, dest->as_register_lo()); 3707 } else { 3708 move_regs(lo, dest->as_register_lo()); 3709 move_regs(hi, dest->as_register_hi()); 3710 } 3711 #endif // _LP64 3712 3713 } else if (dest->is_single_xmm()) { 3714 if (left->as_xmm_float_reg() != dest->as_xmm_float_reg()) { 3715 __ movflt(dest->as_xmm_float_reg(), left->as_xmm_float_reg()); 3716 } 3717 if (UseAVX > 1) { 3718 __ vnegatess(dest->as_xmm_float_reg(), dest->as_xmm_float_reg(), 3719 ExternalAddress((address)float_signflip_pool)); 3720 } else { 3721 __ xorps(dest->as_xmm_float_reg(), 3722 ExternalAddress((address)float_signflip_pool)); 3723 } 3724 } else if (dest->is_double_xmm()) { 3725 if (left->as_xmm_double_reg() != dest->as_xmm_double_reg()) { 3726 __ movdbl(dest->as_xmm_double_reg(), left->as_xmm_double_reg()); 3727 } 3728 if (UseAVX > 1) { 3729 __ vnegatesd(dest->as_xmm_double_reg(), dest->as_xmm_double_reg(), 3730 ExternalAddress((address)double_signflip_pool)); 3731 } else { 3732 __ xorpd(dest->as_xmm_double_reg(), 3733 ExternalAddress((address)double_signflip_pool)); 3734 } 3735 } else if (left->is_single_fpu() || left->is_double_fpu()) { 3736 assert(left->fpu() == 0, "arg must be on TOS"); 3737 assert(dest->fpu() == 0, "dest must be TOS"); 3738 __ fchs(); 3739 3740 } else { 3741 ShouldNotReachHere(); 3742 } 3743 } 3744 3745 3746 void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest) { 3747 assert(addr->is_address() && dest->is_register(), "check"); 3748 Register reg; | 3697 Register dst = dest->as_register_lo(); 3698 __ movptr(dst, lo); 3699 __ negptr(dst); 3700 #else 3701 Register hi = left->as_register_hi(); 3702 __ lneg(hi, lo); 3703 if (dest->as_register_lo() == hi) { 3704 assert(dest->as_register_hi() != lo, "destroying register"); 3705 move_regs(hi, dest->as_register_hi()); 3706 move_regs(lo, dest->as_register_lo()); 3707 } else { 3708 move_regs(lo, dest->as_register_lo()); 3709 move_regs(hi, dest->as_register_hi()); 3710 } 3711 #endif // _LP64 3712 3713 } else if (dest->is_single_xmm()) { 3714 if (left->as_xmm_float_reg() != dest->as_xmm_float_reg()) { 3715 __ movflt(dest->as_xmm_float_reg(), left->as_xmm_float_reg()); 3716 } 3717 if (UseAVX > 0) { 3718 __ vnegatess(dest->as_xmm_float_reg(), dest->as_xmm_float_reg(), 3719 ExternalAddress((address)float_signflip_pool)); 3720 } else { 3721 __ xorps(dest->as_xmm_float_reg(), 3722 ExternalAddress((address)float_signflip_pool)); 3723 } 3724 } else if (dest->is_double_xmm()) { 3725 if (left->as_xmm_double_reg() != dest->as_xmm_double_reg()) { 3726 __ movdbl(dest->as_xmm_double_reg(), left->as_xmm_double_reg()); 3727 } 3728 if (UseAVX > 0) { 3729 __ vnegatesd(dest->as_xmm_double_reg(), dest->as_xmm_double_reg(), 3730 ExternalAddress((address)double_signflip_pool)); 3731 } else { 3732 __ xorpd(dest->as_xmm_double_reg(), 3733 ExternalAddress((address)double_signflip_pool)); 3734 } 3735 } else if (left->is_single_fpu() || left->is_double_fpu()) { 3736 assert(left->fpu() == 0, "arg must be on TOS"); 3737 assert(dest->fpu() == 0, "dest must be TOS"); 3738 __ fchs(); 3739 3740 } else { 3741 ShouldNotReachHere(); 3742 } 3743 } 3744 3745 3746 void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest) { 3747 assert(addr->is_address() && dest->is_register(), "check"); 3748 Register reg; |