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-----------------------------------*
|