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 |