721 LIRItem value(x->argument_at(0), this);
722 value.load_item();
723 LIR_Opr dst = rlock_result(x);
724
725 switch (x->id()) {
726 case vmIntrinsics::_dsqrt: {
727 __ sqrt(value.result(), dst, LIR_OprFact::illegalOpr);
728 break;
729 }
730 case vmIntrinsics::_dabs: {
731 __ abs(value.result(), dst, LIR_OprFact::illegalOpr);
732 break;
733 }
734 }
735 break;
736 }
737 case vmIntrinsics::_dlog10: // fall through
738 case vmIntrinsics::_dlog: // fall through
739 case vmIntrinsics::_dsin: // fall through
740 case vmIntrinsics::_dtan: // fall through
741 case vmIntrinsics::_dcos: {
742 assert(x->number_of_arguments() == 1, "wrong type");
743
744 address runtime_entry = NULL;
745 switch (x->id()) {
746 case vmIntrinsics::_dsin:
747 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin);
748 break;
749 case vmIntrinsics::_dcos:
750 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos);
751 break;
752 case vmIntrinsics::_dtan:
753 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan);
754 break;
755 case vmIntrinsics::_dlog:
756 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog);
757 break;
758 case vmIntrinsics::_dlog10:
759 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10);
760 break;
761 default:
762 ShouldNotReachHere();
763 }
764
765 LIR_Opr result = call_runtime(x->argument_at(0), runtime_entry, x->type(), NULL);
766 set_result(x, result);
767 }
768 }
769 }
770
771
772 void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
773 assert(x->number_of_arguments() == 5, "wrong type");
774
775 // Make all state_for calls early since they can emit code
776 CodeEmitInfo* info = state_for(x, x->state());
777
778 // Note: spill caller save before setting the item
779 LIRItem src (x->argument_at(0), this);
780 LIRItem src_pos (x->argument_at(1), this);
781 LIRItem dst (x->argument_at(2), this);
782 LIRItem dst_pos (x->argument_at(3), this);
783 LIRItem length (x->argument_at(4), this);
784 // load all values in callee_save_registers, as this makes the
785 // parameter passing to the fast case simpler
786 src.load_item_force (rlock_callee_saved(T_OBJECT));
|
721 LIRItem value(x->argument_at(0), this);
722 value.load_item();
723 LIR_Opr dst = rlock_result(x);
724
725 switch (x->id()) {
726 case vmIntrinsics::_dsqrt: {
727 __ sqrt(value.result(), dst, LIR_OprFact::illegalOpr);
728 break;
729 }
730 case vmIntrinsics::_dabs: {
731 __ abs(value.result(), dst, LIR_OprFact::illegalOpr);
732 break;
733 }
734 }
735 break;
736 }
737 case vmIntrinsics::_dlog10: // fall through
738 case vmIntrinsics::_dlog: // fall through
739 case vmIntrinsics::_dsin: // fall through
740 case vmIntrinsics::_dtan: // fall through
741 case vmIntrinsics::_dcos: // fall through
742 case vmIntrinsics::_dexp: {
743 assert(x->number_of_arguments() == 1, "wrong type");
744
745 address runtime_entry = NULL;
746 switch (x->id()) {
747 case vmIntrinsics::_dsin:
748 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin);
749 break;
750 case vmIntrinsics::_dcos:
751 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos);
752 break;
753 case vmIntrinsics::_dtan:
754 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan);
755 break;
756 case vmIntrinsics::_dlog:
757 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog);
758 break;
759 case vmIntrinsics::_dlog10:
760 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10);
761 break;
762 case vmIntrinsics::_dexp:
763 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dexp);
764 break;
765 default:
766 ShouldNotReachHere();
767 }
768
769 LIR_Opr result = call_runtime(x->argument_at(0), runtime_entry, x->type(), NULL);
770 set_result(x, result);
771 break;
772 }
773 case vmIntrinsics::_dpow: {
774 assert(x->number_of_arguments() == 2, "wrong type");
775 address runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dpow);
776 LIR_Opr result = call_runtime(x->argument_at(0), x->argument_at(1), runtime_entry, x->type(), NULL);
777 set_result(x, result);
778 break;
779 }
780 }
781 }
782
783
784 void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
785 assert(x->number_of_arguments() == 5, "wrong type");
786
787 // Make all state_for calls early since they can emit code
788 CodeEmitInfo* info = state_for(x, x->state());
789
790 // Note: spill caller save before setting the item
791 LIRItem src (x->argument_at(0), this);
792 LIRItem src_pos (x->argument_at(1), this);
793 LIRItem dst (x->argument_at(2), this);
794 LIRItem dst_pos (x->argument_at(3), this);
795 LIRItem length (x->argument_at(4), this);
796 // load all values in callee_save_registers, as this makes the
797 // parameter passing to the fast case simpler
798 src.load_item_force (rlock_callee_saved(T_OBJECT));
|