Mercurial > hg > truffle
comparison src/share/vm/opto/library_call.cpp @ 6084:6759698e3140
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: kvn, never, twisti
author | roland |
---|---|
date | Tue, 15 May 2012 10:10:23 +0200 |
parents | 8f972594effc |
children | 8b0a4867acf0 |
comparison
equal
deleted
inserted
replaced
6057:8f972594effc | 6084:6759698e3140 |
---|---|
1555 | 1555 |
1556 // If this inlining ever returned NaN in the past, we do not intrinsify it | 1556 // If this inlining ever returned NaN in the past, we do not intrinsify it |
1557 // every again. NaN results requires StrictMath.exp handling. | 1557 // every again. NaN results requires StrictMath.exp handling. |
1558 if (too_many_traps(Deoptimization::Reason_intrinsic)) return false; | 1558 if (too_many_traps(Deoptimization::Reason_intrinsic)) return false; |
1559 | 1559 |
1560 // Do not intrinsify on older platforms which lack cmove. | |
1561 if (ConditionalMoveLimit == 0) return false; | |
1562 | |
1563 _sp += arg_size(); // restore stack pointer | 1560 _sp += arg_size(); // restore stack pointer |
1564 Node *x = pop_math_arg(); | 1561 Node *x = pop_math_arg(); |
1565 Node *result = _gvn.transform(new (C, 2) ExpDNode(0,x)); | 1562 Node *result = _gvn.transform(new (C, 2) ExpDNode(0,x)); |
1566 | 1563 |
1567 //------------------- | 1564 //------------------- |
1800 | 1797 |
1801 // These intrinsics are supported on all hardware | 1798 // These intrinsics are supported on all hardware |
1802 case vmIntrinsics::_dsqrt: return Matcher::has_match_rule(Op_SqrtD) ? inline_sqrt(id) : false; | 1799 case vmIntrinsics::_dsqrt: return Matcher::has_match_rule(Op_SqrtD) ? inline_sqrt(id) : false; |
1803 case vmIntrinsics::_dabs: return Matcher::has_match_rule(Op_AbsD) ? inline_abs(id) : false; | 1800 case vmIntrinsics::_dabs: return Matcher::has_match_rule(Op_AbsD) ? inline_abs(id) : false; |
1804 | 1801 |
1805 // These intrinsics don't work on X86. The ad implementation doesn't | |
1806 // handle NaN's properly. Instead of returning infinity, the ad | |
1807 // implementation returns a NaN on overflow. See bug: 6304089 | |
1808 // Once the ad implementations are fixed, change the code below | |
1809 // to match the intrinsics above | |
1810 | |
1811 case vmIntrinsics::_dexp: return | 1802 case vmIntrinsics::_dexp: return |
1803 Matcher::has_match_rule(Op_ExpD) ? inline_exp(id) : | |
1812 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); | 1804 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); |
1813 case vmIntrinsics::_dpow: return | 1805 case vmIntrinsics::_dpow: return |
1806 Matcher::has_match_rule(Op_PowD) ? inline_pow(id) : | |
1814 runtime_math(OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); | 1807 runtime_math(OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); |
1815 | 1808 |
1816 // These intrinsics are not yet correctly implemented | 1809 // These intrinsics are not yet correctly implemented |
1817 case vmIntrinsics::_datan2: | 1810 case vmIntrinsics::_datan2: |
1818 return false; | 1811 return false; |