810 // sin and cos need two free fpu stack slots, so register two temporary operands 811 LIR_Opr tmp1 = FrameMap::caller_save_fpu_reg_at(0); 812 LIR_Opr tmp2 = FrameMap::caller_save_fpu_reg_at(1); 813 814 if (use_fpu) { 815 LIR_Opr tmp = FrameMap::fpu0_double_opr; 816 __ move(calc_input, tmp); 817 818 calc_input = tmp; 819 calc_result = tmp; 820 tmp1 = FrameMap::caller_save_fpu_reg_at(1); 821 tmp2 = FrameMap::caller_save_fpu_reg_at(2); 822 } 823 824 switch(x->id()) { 825 case vmIntrinsics::_dabs: __ abs (calc_input, calc_result, LIR_OprFact::illegalOpr); break; 826 case vmIntrinsics::_dsqrt: __ sqrt (calc_input, calc_result, LIR_OprFact::illegalOpr); break; 827 case vmIntrinsics::_dsin: __ sin (calc_input, calc_result, tmp1, tmp2); break; 828 case vmIntrinsics::_dcos: __ cos (calc_input, calc_result, tmp1, tmp2); break; 829 case vmIntrinsics::_dtan: __ tan (calc_input, calc_result, tmp1, tmp2); break; 830 case vmIntrinsics::_dlog: __ log (calc_input, calc_result, LIR_OprFact::illegalOpr); break; 831 case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, LIR_OprFact::illegalOpr); break; 832 default: ShouldNotReachHere(); 833 } 834 835 if (use_fpu) { 836 __ move(calc_result, x->operand()); 837 } 838 } 839 840 841 void LIRGenerator::do_ArrayCopy(Intrinsic* x) { 842 assert(x->number_of_arguments() == 5, "wrong type"); 843 LIRItem src(x->argument_at(0), this); 844 LIRItem src_pos(x->argument_at(1), this); 845 LIRItem dst(x->argument_at(2), this); 846 LIRItem dst_pos(x->argument_at(3), this); 847 LIRItem length(x->argument_at(4), this); 848 849 // operands for arraycopy must use fixed registers, otherwise 850 // LinearScan will fail allocation (because arraycopy always needs a 851 // call) | 810 // sin and cos need two free fpu stack slots, so register two temporary operands 811 LIR_Opr tmp1 = FrameMap::caller_save_fpu_reg_at(0); 812 LIR_Opr tmp2 = FrameMap::caller_save_fpu_reg_at(1); 813 814 if (use_fpu) { 815 LIR_Opr tmp = FrameMap::fpu0_double_opr; 816 __ move(calc_input, tmp); 817 818 calc_input = tmp; 819 calc_result = tmp; 820 tmp1 = FrameMap::caller_save_fpu_reg_at(1); 821 tmp2 = FrameMap::caller_save_fpu_reg_at(2); 822 } 823 824 switch(x->id()) { 825 case vmIntrinsics::_dabs: __ abs (calc_input, calc_result, LIR_OprFact::illegalOpr); break; 826 case vmIntrinsics::_dsqrt: __ sqrt (calc_input, calc_result, LIR_OprFact::illegalOpr); break; 827 case vmIntrinsics::_dsin: __ sin (calc_input, calc_result, tmp1, tmp2); break; 828 case vmIntrinsics::_dcos: __ cos (calc_input, calc_result, tmp1, tmp2); break; 829 case vmIntrinsics::_dtan: __ tan (calc_input, calc_result, tmp1, tmp2); break; 830 case vmIntrinsics::_dlog: __ log (calc_input, calc_result, tmp1); break; 831 case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, tmp1); break; 832 default: ShouldNotReachHere(); 833 } 834 835 if (use_fpu) { 836 __ move(calc_result, x->operand()); 837 } 838 } 839 840 841 void LIRGenerator::do_ArrayCopy(Intrinsic* x) { 842 assert(x->number_of_arguments() == 5, "wrong type"); 843 LIRItem src(x->argument_at(0), this); 844 LIRItem src_pos(x->argument_at(1), this); 845 LIRItem dst(x->argument_at(2), this); 846 LIRItem dst_pos(x->argument_at(3), this); 847 LIRItem length(x->argument_at(4), this); 848 849 // operands for arraycopy must use fixed registers, otherwise 850 // LinearScan will fail allocation (because arraycopy always needs a 851 // call) |