< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page




 534   switch (intrinsic_id()) {
 535   case vmIntrinsics::_hashCode:                 return inline_native_hashcode(intrinsic()->is_virtual(), !is_static);
 536   case vmIntrinsics::_identityHashCode:         return inline_native_hashcode(/*!virtual*/ false,         is_static);
 537   case vmIntrinsics::_getClass:                 return inline_native_getClass();
 538 
 539   case vmIntrinsics::_ceil:
 540   case vmIntrinsics::_floor:
 541   case vmIntrinsics::_rint:
 542   case vmIntrinsics::_dsin:
 543   case vmIntrinsics::_dcos:
 544   case vmIntrinsics::_dtan:
 545   case vmIntrinsics::_dabs:
 546   case vmIntrinsics::_fabs:
 547   case vmIntrinsics::_iabs:
 548   case vmIntrinsics::_labs:
 549   case vmIntrinsics::_datan2:
 550   case vmIntrinsics::_dsqrt:
 551   case vmIntrinsics::_dexp:
 552   case vmIntrinsics::_dlog:
 553   case vmIntrinsics::_dlog10:
 554   case vmIntrinsics::_dpow:                     return inline_math_native(intrinsic_id());


 555 
 556   case vmIntrinsics::_min:
 557   case vmIntrinsics::_max:                      return inline_min_max(intrinsic_id());
 558 
 559   case vmIntrinsics::_notify:
 560   case vmIntrinsics::_notifyAll:
 561     return inline_notify(intrinsic_id());
 562 
 563   case vmIntrinsics::_addExactI:                return inline_math_addExactI(false /* add */);
 564   case vmIntrinsics::_addExactL:                return inline_math_addExactL(false /* add */);
 565   case vmIntrinsics::_decrementExactI:          return inline_math_subtractExactI(true /* decrement */);
 566   case vmIntrinsics::_decrementExactL:          return inline_math_subtractExactL(true /* decrement */);
 567   case vmIntrinsics::_incrementExactI:          return inline_math_addExactI(true /* increment */);
 568   case vmIntrinsics::_incrementExactL:          return inline_math_addExactL(true /* increment */);
 569   case vmIntrinsics::_multiplyExactI:           return inline_math_multiplyExactI();
 570   case vmIntrinsics::_multiplyExactL:           return inline_math_multiplyExactL();
 571   case vmIntrinsics::_multiplyHigh:             return inline_math_multiplyHigh();
 572   case vmIntrinsics::_negateExactI:             return inline_math_negateExactI();
 573   case vmIntrinsics::_negateExactL:             return inline_math_negateExactL();
 574   case vmIntrinsics::_subtractExactI:           return inline_math_subtractExactI(false /* subtract */);


1798     Unimplemented();
1799 #endif // IA32
1800   }
1801   return n;
1802 }
1803 
1804 //------------------------------inline_math-----------------------------------
1805 // public static double Math.abs(double)
1806 // public static double Math.sqrt(double)
1807 // public static double Math.log(double)
1808 // public static double Math.log10(double)
1809 bool LibraryCallKit::inline_double_math(vmIntrinsics::ID id) {
1810   Node* arg = round_double_node(argument(0));
1811   Node* n = NULL;
1812   switch (id) {
1813   case vmIntrinsics::_dabs:   n = new AbsDNode(                arg);  break;
1814   case vmIntrinsics::_dsqrt:  n = new SqrtDNode(C, control(),  arg);  break;
1815   case vmIntrinsics::_ceil:   n = RoundDoubleModeNode::make(_gvn, arg, RoundDoubleModeNode::rmode_ceil); break;
1816   case vmIntrinsics::_floor:  n = RoundDoubleModeNode::make(_gvn, arg, RoundDoubleModeNode::rmode_floor); break;
1817   case vmIntrinsics::_rint:   n = RoundDoubleModeNode::make(_gvn, arg, RoundDoubleModeNode::rmode_rint); break;

1818   default:  fatal_unexpected_iid(id);  break;
1819   }
1820   set_result(_gvn.transform(n));
1821   return true;
1822 }
1823 
1824 //------------------------------inline_math-----------------------------------
1825 // public static float Math.abs(float)
1826 // public static int Math.abs(int)
1827 // public static long Math.abs(long)
1828 bool LibraryCallKit::inline_math(vmIntrinsics::ID id) {
1829   Node* arg = argument(0);
1830   Node* n = NULL;
1831   switch (id) {
1832   case vmIntrinsics::_fabs:   n = new AbsFNode(                arg);  break;
1833   case vmIntrinsics::_iabs:   n = new AbsINode(                arg);  break;
1834   case vmIntrinsics::_labs:   n = new AbsLNode(                arg);  break;

1835   default:  fatal_unexpected_iid(id);  break;
1836   }
1837   set_result(_gvn.transform(n));
1838   return true;
1839 }
1840 
1841 //------------------------------runtime_math-----------------------------
1842 bool LibraryCallKit::runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName) {
1843   assert(call_type == OptoRuntime::Math_DD_D_Type() || call_type == OptoRuntime::Math_D_D_Type(),
1844          "must be (DD)D or (D)D type");
1845 
1846   // Inputs
1847   Node* a = round_double_node(argument(0));
1848   Node* b = (call_type == OptoRuntime::Math_DD_D_Type()) ? round_double_node(argument(2)) : NULL;
1849 
1850   const TypePtr* no_memory_effects = NULL;
1851   Node* trig = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName,
1852                                  no_memory_effects,
1853                                  a, top(), b, b ? top() : NULL);
1854   Node* value = _gvn.transform(new ProjNode(trig, TypeFunc::Parms+0));


1898   case vmIntrinsics::_labs:   return Matcher::match_rule_supported(Op_AbsL)   ? inline_math(id) : false;
1899 
1900   case vmIntrinsics::_dexp:
1901     return StubRoutines::dexp() != NULL ?
1902       runtime_math(OptoRuntime::Math_D_D_Type(), StubRoutines::dexp(),  "dexp") :
1903       runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dexp),  "EXP");
1904   case vmIntrinsics::_dpow: {
1905     Node* exp = round_double_node(argument(2));
1906     const TypeD* d = _gvn.type(exp)->isa_double_constant();
1907     if (d != NULL && d->getd() == 2.0) {
1908       // Special case: pow(x, 2.0) => x * x
1909       Node* base = round_double_node(argument(0));
1910       set_result(_gvn.transform(new MulDNode(base, base)));
1911       return true;
1912     }
1913     return StubRoutines::dpow() != NULL ?
1914       runtime_math(OptoRuntime::Math_DD_D_Type(), StubRoutines::dpow(),  "dpow") :
1915       runtime_math(OptoRuntime::Math_DD_D_Type(), FN_PTR(SharedRuntime::dpow),  "POW");
1916   }
1917 #undef FN_PTR



1918 
1919    // These intrinsics are not yet correctly implemented
1920   case vmIntrinsics::_datan2:
1921     return false;
1922 
1923   default:
1924     fatal_unexpected_iid(id);
1925     return false;
1926   }
1927 }
1928 
1929 static bool is_simple_name(Node* n) {
1930   return (n->req() == 1         // constant
1931           || (n->is_Type() && n->as_Type()->type()->singleton())
1932           || n->is_Proj()       // parameter or return value
1933           || n->is_Phi()        // local of some sort
1934           );
1935 }
1936 
1937 //----------------------------inline_notify-----------------------------------*




 534   switch (intrinsic_id()) {
 535   case vmIntrinsics::_hashCode:                 return inline_native_hashcode(intrinsic()->is_virtual(), !is_static);
 536   case vmIntrinsics::_identityHashCode:         return inline_native_hashcode(/*!virtual*/ false,         is_static);
 537   case vmIntrinsics::_getClass:                 return inline_native_getClass();
 538 
 539   case vmIntrinsics::_ceil:
 540   case vmIntrinsics::_floor:
 541   case vmIntrinsics::_rint:
 542   case vmIntrinsics::_dsin:
 543   case vmIntrinsics::_dcos:
 544   case vmIntrinsics::_dtan:
 545   case vmIntrinsics::_dabs:
 546   case vmIntrinsics::_fabs:
 547   case vmIntrinsics::_iabs:
 548   case vmIntrinsics::_labs:
 549   case vmIntrinsics::_datan2:
 550   case vmIntrinsics::_dsqrt:
 551   case vmIntrinsics::_dexp:
 552   case vmIntrinsics::_dlog:
 553   case vmIntrinsics::_dlog10:
 554   case vmIntrinsics::_dpow:
 555   case vmIntrinsics::_dsignum:
 556   case vmIntrinsics::_fsignum:                  return inline_math_native(intrinsic_id());
 557 
 558   case vmIntrinsics::_min:
 559   case vmIntrinsics::_max:                      return inline_min_max(intrinsic_id());
 560 
 561   case vmIntrinsics::_notify:
 562   case vmIntrinsics::_notifyAll:
 563     return inline_notify(intrinsic_id());
 564 
 565   case vmIntrinsics::_addExactI:                return inline_math_addExactI(false /* add */);
 566   case vmIntrinsics::_addExactL:                return inline_math_addExactL(false /* add */);
 567   case vmIntrinsics::_decrementExactI:          return inline_math_subtractExactI(true /* decrement */);
 568   case vmIntrinsics::_decrementExactL:          return inline_math_subtractExactL(true /* decrement */);
 569   case vmIntrinsics::_incrementExactI:          return inline_math_addExactI(true /* increment */);
 570   case vmIntrinsics::_incrementExactL:          return inline_math_addExactL(true /* increment */);
 571   case vmIntrinsics::_multiplyExactI:           return inline_math_multiplyExactI();
 572   case vmIntrinsics::_multiplyExactL:           return inline_math_multiplyExactL();
 573   case vmIntrinsics::_multiplyHigh:             return inline_math_multiplyHigh();
 574   case vmIntrinsics::_negateExactI:             return inline_math_negateExactI();
 575   case vmIntrinsics::_negateExactL:             return inline_math_negateExactL();
 576   case vmIntrinsics::_subtractExactI:           return inline_math_subtractExactI(false /* subtract */);


1800     Unimplemented();
1801 #endif // IA32
1802   }
1803   return n;
1804 }
1805 
1806 //------------------------------inline_math-----------------------------------
1807 // public static double Math.abs(double)
1808 // public static double Math.sqrt(double)
1809 // public static double Math.log(double)
1810 // public static double Math.log10(double)
1811 bool LibraryCallKit::inline_double_math(vmIntrinsics::ID id) {
1812   Node* arg = round_double_node(argument(0));
1813   Node* n = NULL;
1814   switch (id) {
1815   case vmIntrinsics::_dabs:   n = new AbsDNode(                arg);  break;
1816   case vmIntrinsics::_dsqrt:  n = new SqrtDNode(C, control(),  arg);  break;
1817   case vmIntrinsics::_ceil:   n = RoundDoubleModeNode::make(_gvn, arg, RoundDoubleModeNode::rmode_ceil); break;
1818   case vmIntrinsics::_floor:  n = RoundDoubleModeNode::make(_gvn, arg, RoundDoubleModeNode::rmode_floor); break;
1819   case vmIntrinsics::_rint:   n = RoundDoubleModeNode::make(_gvn, arg, RoundDoubleModeNode::rmode_rint); break;
1820   case vmIntrinsics::_dsignum: n = new SignumDNode(arg); break;
1821   default:  fatal_unexpected_iid(id);  break;
1822   }
1823   set_result(_gvn.transform(n));
1824   return true;
1825 }
1826 
1827 //------------------------------inline_math-----------------------------------
1828 // public static float Math.abs(float)
1829 // public static int Math.abs(int)
1830 // public static long Math.abs(long)
1831 bool LibraryCallKit::inline_math(vmIntrinsics::ID id) {
1832   Node* arg = argument(0);
1833   Node* n = NULL;
1834   switch (id) {
1835   case vmIntrinsics::_fabs:   n = new AbsFNode(                arg);  break;
1836   case vmIntrinsics::_iabs:   n = new AbsINode(                arg);  break;
1837   case vmIntrinsics::_labs:   n = new AbsLNode(                arg);  break;
1838   case vmIntrinsics::_fsignum: n = new SignumFNode(arg); break;
1839   default:  fatal_unexpected_iid(id);  break;
1840   }
1841   set_result(_gvn.transform(n));
1842   return true;
1843 }
1844 
1845 //------------------------------runtime_math-----------------------------
1846 bool LibraryCallKit::runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName) {
1847   assert(call_type == OptoRuntime::Math_DD_D_Type() || call_type == OptoRuntime::Math_D_D_Type(),
1848          "must be (DD)D or (D)D type");
1849 
1850   // Inputs
1851   Node* a = round_double_node(argument(0));
1852   Node* b = (call_type == OptoRuntime::Math_DD_D_Type()) ? round_double_node(argument(2)) : NULL;
1853 
1854   const TypePtr* no_memory_effects = NULL;
1855   Node* trig = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName,
1856                                  no_memory_effects,
1857                                  a, top(), b, b ? top() : NULL);
1858   Node* value = _gvn.transform(new ProjNode(trig, TypeFunc::Parms+0));


1902   case vmIntrinsics::_labs:   return Matcher::match_rule_supported(Op_AbsL)   ? inline_math(id) : false;
1903 
1904   case vmIntrinsics::_dexp:
1905     return StubRoutines::dexp() != NULL ?
1906       runtime_math(OptoRuntime::Math_D_D_Type(), StubRoutines::dexp(),  "dexp") :
1907       runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dexp),  "EXP");
1908   case vmIntrinsics::_dpow: {
1909     Node* exp = round_double_node(argument(2));
1910     const TypeD* d = _gvn.type(exp)->isa_double_constant();
1911     if (d != NULL && d->getd() == 2.0) {
1912       // Special case: pow(x, 2.0) => x * x
1913       Node* base = round_double_node(argument(0));
1914       set_result(_gvn.transform(new MulDNode(base, base)));
1915       return true;
1916     }
1917     return StubRoutines::dpow() != NULL ?
1918       runtime_math(OptoRuntime::Math_DD_D_Type(), StubRoutines::dpow(),  "dpow") :
1919       runtime_math(OptoRuntime::Math_DD_D_Type(), FN_PTR(SharedRuntime::dpow),  "POW");
1920   }
1921 #undef FN_PTR
1922 
1923   case vmIntrinsics::_dsignum: return inline_double_math(id);
1924   case vmIntrinsics::_fsignum: return inline_math(id);
1925 
1926    // These intrinsics are not yet correctly implemented
1927   case vmIntrinsics::_datan2:
1928     return false;
1929 
1930   default:
1931     fatal_unexpected_iid(id);
1932     return false;
1933   }
1934 }
1935 
1936 static bool is_simple_name(Node* n) {
1937   return (n->req() == 1         // constant
1938           || (n->is_Type() && n->as_Type()->type()->singleton())
1939           || n->is_Proj()       // parameter or return value
1940           || n->is_Phi()        // local of some sort
1941           );
1942 }
1943 
1944 //----------------------------inline_notify-----------------------------------*


< prev index next >