mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 19:44:41 +02:00
8190869: C2: missing strength reduction of Math.pow(x, 2.0D) to x*x
Reviewed-by: kvn
This commit is contained in:
parent
3541733024
commit
0c05e5a478
2 changed files with 25 additions and 3 deletions
|
@ -765,6 +765,11 @@ ALIGNED_(8) juint _log2_pow[] =
|
||||||
0xfefa39efUL, 0x3fe62e42UL, 0xfefa39efUL, 0xbfe62e42UL
|
0xfefa39efUL, 0x3fe62e42UL, 0xfefa39efUL, 0xbfe62e42UL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ALIGNED_(8) juint _DOUBLE2[] =
|
||||||
|
{
|
||||||
|
0x00000000UL, 0x40000000UL
|
||||||
|
};
|
||||||
|
|
||||||
//registers,
|
//registers,
|
||||||
// input: xmm0, xmm1
|
// input: xmm0, xmm1
|
||||||
// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
|
// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
|
||||||
|
@ -803,6 +808,7 @@ void MacroAssembler::fast_pow(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xm
|
||||||
address HIGHMASK_LOG_X = (address)_HIGHMASK_LOG_X;
|
address HIGHMASK_LOG_X = (address)_HIGHMASK_LOG_X;
|
||||||
address HALFMASK = (address)_HALFMASK;
|
address HALFMASK = (address)_HALFMASK;
|
||||||
address log2 = (address)_log2_pow;
|
address log2 = (address)_log2_pow;
|
||||||
|
address DOUBLE2 = (address)_DOUBLE2;
|
||||||
|
|
||||||
|
|
||||||
bind(start);
|
bind(start);
|
||||||
|
@ -810,6 +816,13 @@ void MacroAssembler::fast_pow(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xm
|
||||||
movsd(Address(rsp, 8), xmm0);
|
movsd(Address(rsp, 8), xmm0);
|
||||||
movsd(Address(rsp, 16), xmm1);
|
movsd(Address(rsp, 16), xmm1);
|
||||||
|
|
||||||
|
// Special case: pow(x, 2.0) => x * x
|
||||||
|
movdq(tmp1, xmm1);
|
||||||
|
cmp64(tmp1, ExternalAddress(DOUBLE2));
|
||||||
|
jccb(Assembler::notEqual, B1_2);
|
||||||
|
mulsd(xmm0, xmm0);
|
||||||
|
jmp(B1_5);
|
||||||
|
|
||||||
bind(B1_2);
|
bind(B1_2);
|
||||||
pextrw(eax, xmm0, 3);
|
pextrw(eax, xmm0, 3);
|
||||||
xorpd(xmm2, xmm2);
|
xorpd(xmm2, xmm2);
|
||||||
|
|
|
@ -1789,10 +1789,19 @@ bool LibraryCallKit::inline_math_native(vmIntrinsics::ID id) {
|
||||||
return StubRoutines::dexp() != NULL ?
|
return StubRoutines::dexp() != NULL ?
|
||||||
runtime_math(OptoRuntime::Math_D_D_Type(), StubRoutines::dexp(), "dexp") :
|
runtime_math(OptoRuntime::Math_D_D_Type(), StubRoutines::dexp(), "dexp") :
|
||||||
runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dexp), "EXP");
|
runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dexp), "EXP");
|
||||||
case vmIntrinsics::_dpow:
|
case vmIntrinsics::_dpow: {
|
||||||
return StubRoutines::dpow() != NULL ?
|
Node* exp = round_double_node(argument(2));
|
||||||
|
const TypeD* d = _gvn.type(exp)->isa_double_constant();
|
||||||
|
if (d != NULL && d->getd() == 2.0) {
|
||||||
|
// Special case: pow(x, 2.0) => x * x
|
||||||
|
Node* base = round_double_node(argument(0));
|
||||||
|
set_result(_gvn.transform(new MulDNode(base, base)));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return StubRoutines::dexp() != NULL ?
|
||||||
runtime_math(OptoRuntime::Math_DD_D_Type(), StubRoutines::dpow(), "dpow") :
|
runtime_math(OptoRuntime::Math_DD_D_Type(), StubRoutines::dpow(), "dpow") :
|
||||||
runtime_math(OptoRuntime::Math_DD_D_Type(), FN_PTR(SharedRuntime::dpow), "POW");
|
runtime_math(OptoRuntime::Math_DD_D_Type(), FN_PTR(SharedRuntime::dpow), "POW");
|
||||||
|
}
|
||||||
#undef FN_PTR
|
#undef FN_PTR
|
||||||
|
|
||||||
// These intrinsics are not yet correctly implemented
|
// These intrinsics are not yet correctly implemented
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue