< prev index next >

src/cpu/x86/vm/c1_LIRAssembler_x86.cpp

Print this page




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;


< prev index next >