src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp

Print this page
rev 3227 : 7133857: exp() and pow() should use the x87 ISA on x86
Summary: use x87 instructions to implement exp() and pow() in interpreter/c1/c2.
Reviewed-by:


 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));