< prev index next >

src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp

Print this page




3748     Register dst = dest->as_register_lo();
3749     __ movptr(dst, lo);
3750     __ negptr(dst);
3751 #else
3752     Register hi = left->as_register_hi();
3753     __ lneg(hi, lo);
3754     if (dest->as_register_lo() == hi) {
3755       assert(dest->as_register_hi() != lo, "destroying register");
3756       move_regs(hi, dest->as_register_hi());
3757       move_regs(lo, dest->as_register_lo());
3758     } else {
3759       move_regs(lo, dest->as_register_lo());
3760       move_regs(hi, dest->as_register_hi());
3761     }
3762 #endif // _LP64
3763 
3764   } else if (dest->is_single_xmm()) {
3765     if (left->as_xmm_float_reg() != dest->as_xmm_float_reg()) {
3766       __ movflt(dest->as_xmm_float_reg(), left->as_xmm_float_reg());
3767     }
3768     if (UseAVX > 0) {
3769       __ vnegatess(dest->as_xmm_float_reg(), dest->as_xmm_float_reg(),
3770                    ExternalAddress((address)float_signflip_pool));
3771     } else {
3772       __ xorps(dest->as_xmm_float_reg(),
3773                ExternalAddress((address)float_signflip_pool));
3774     }
3775   } else if (dest->is_double_xmm()) {
3776     if (left->as_xmm_double_reg() != dest->as_xmm_double_reg()) {
3777       __ movdbl(dest->as_xmm_double_reg(), left->as_xmm_double_reg());
3778     }
3779     if (UseAVX > 0) {
3780       __ vnegatesd(dest->as_xmm_double_reg(), dest->as_xmm_double_reg(),
3781                    ExternalAddress((address)double_signflip_pool));
3782     } else {
3783       __ xorpd(dest->as_xmm_double_reg(),
3784                ExternalAddress((address)double_signflip_pool));
3785     }
3786   } else if (left->is_single_fpu() || left->is_double_fpu()) {
3787     assert(left->fpu() == 0, "arg must be on TOS");
3788     assert(dest->fpu() == 0, "dest must be TOS");
3789     __ fchs();
3790 
3791   } else {
3792     ShouldNotReachHere();
3793   }
3794 }
3795 
3796 
3797 void LIR_Assembler::leal(LIR_Opr src, LIR_Opr dest, LIR_PatchCode patch_code, CodeEmitInfo* info) {
3798   assert(src->is_address(), "must be an address");
3799   assert(dest->is_register(), "must be a register");
3800 
3801   PatchingStub* patch = NULL;
3802   if (patch_code != lir_patch_none) {
3803     patch = new PatchingStub(_masm, PatchingStub::access_field_id);
3804   }
3805 




3748     Register dst = dest->as_register_lo();
3749     __ movptr(dst, lo);
3750     __ negptr(dst);
3751 #else
3752     Register hi = left->as_register_hi();
3753     __ lneg(hi, lo);
3754     if (dest->as_register_lo() == hi) {
3755       assert(dest->as_register_hi() != lo, "destroying register");
3756       move_regs(hi, dest->as_register_hi());
3757       move_regs(lo, dest->as_register_lo());
3758     } else {
3759       move_regs(lo, dest->as_register_lo());
3760       move_regs(hi, dest->as_register_hi());
3761     }
3762 #endif // _LP64
3763 
3764   } else if (dest->is_single_xmm()) {
3765     if (left->as_xmm_float_reg() != dest->as_xmm_float_reg()) {
3766       __ movflt(dest->as_xmm_float_reg(), left->as_xmm_float_reg());
3767     }




3768     __ xorps(dest->as_xmm_float_reg(),
3769              ExternalAddress((address)float_signflip_pool));

3770   } else if (dest->is_double_xmm()) {
3771     if (left->as_xmm_double_reg() != dest->as_xmm_double_reg()) {
3772       __ movdbl(dest->as_xmm_double_reg(), left->as_xmm_double_reg());
3773     }




3774     __ xorpd(dest->as_xmm_double_reg(),
3775              ExternalAddress((address)double_signflip_pool));

3776   } else if (left->is_single_fpu() || left->is_double_fpu()) {
3777     assert(left->fpu() == 0, "arg must be on TOS");
3778     assert(dest->fpu() == 0, "dest must be TOS");
3779     __ fchs();
3780 
3781   } else {
3782     ShouldNotReachHere();
3783   }
3784 }
3785 
3786 
3787 void LIR_Assembler::leal(LIR_Opr src, LIR_Opr dest, LIR_PatchCode patch_code, CodeEmitInfo* info) {
3788   assert(src->is_address(), "must be an address");
3789   assert(dest->is_register(), "must be a register");
3790 
3791   PatchingStub* patch = NULL;
3792   if (patch_code != lir_patch_none) {
3793     patch = new PatchingStub(_masm, PatchingStub::access_field_id);
3794   }
3795 


< prev index next >