RFR: 8271883: Math CopySign optimization for x86 [v2]
Jatin Bhateja
jbhateja at openjdk.java.net
Fri Aug 6 05:20:37 UTC 2021
On Wed, 4 Aug 2021 21:42:47 GMT, Marcus G K Williams <mgkwill at openjdk.org> wrote:
>> Intrinsic for Math.copySign is disabled on x86_64.
>>
>> We can improve on generated c2 instructions for float and double, and this change adds optimized intrinsics for float and double Math.copySign.
>>
>> ### **Math.copySign(double)**
>> _From:_
>> 0x00007f7d606e5dac: vmovq %xmm1,%r10
>> 0x00007f7d606e5db1: vmovq %xmm0,%r11
>> 0x00007f7d606e5db6: movabs $0x7fffffffffffffff,%r8
>> 0x00007f7d606e5dc0: and %r8,%r11
>> 0x00007f7d606e5dc3: movabs $0x8000000000000000,%r8
>> 0x00007f7d606e5dcd: and %r8,%r10
>> 0x00007f7d606e5dd0: or %r11,%r10
>> 0x00007f7d606e5dd3: vmovq %r10,%xmm0
>>
>> _To:_
>> 0x00007fc3c14c63ac: movabs $0x7fffffffffffffff,%r10
>> 0x00007fc3c14c63b6: vmovq %r10,%xmm2
>> 0x00007fc3c14c63bb: vpternlogq $0xe4,%xmm2,%xmm1,%xmm0
>>
>> ### **Math.copySign(float)**
>> _From:_
>> 0x00007ff8886e60ac: vmovd %xmm1,%r11d
>> 0x00007ff8886e60b1: vmovd %xmm0,%r10d
>> 0x00007ff8886e60b6: and $0x80000000,%r11d
>> 0x00007ff8886e60bd: and $0x7fffffff,%r10d
>> 0x00007ff8886e60c4: or %r10d,%r11d
>> 0x00007ff8886e60c7: vmovd %r11d,%xmm0
>> _To:_
>> 0x00007fc7d94c63ac: mov $0x7fffffff,%r10d
>> 0x00007fc7d94c63b2: vmovd %r10d,%xmm3
>> 0x00007fc7d94c63b7: vpternlogd $0xe4,%xmm3,%xmm1,%xmm0
>>
>> #### _**Performance of patch using updated test/micro/org/openjdk/bench/vm/compiler/Signum.java:**_
>> #### **BEFORE**
>> Signum._5_copySignFloatTest avgt 5 2.442 ? 0.024 ns/op
>> Signum._7_copySignDoubleTest avgt 5 2.400 ? 0.033 ns/op
>>
>> #### **PATCH**
>> Signum._5_copySignFloatTest avgt 5 2.029 ? 0.011 ns/op
>> Signum._7_copySignDoubleTest avgt 5 2.029 ? 0.024 ns/op
>>
>> #### **JTREG that covers this case:**
>> test/hotspot/jtreg/compiler/intrinsics/math/TestSignumIntrinsic.java
>>
>> Signed-off-by: Marcus G K Williams <marcus.williams at intel.com>
>
> Marcus G K Williams has updated the pull request incrementally with one additional commit since the last revision:
>
> Update x86.ad with #ifdef _LP64 for copySign
src/hotspot/cpu/x86/x86.ad line 5811:
> 5809: #ifdef _LP64
> 5810: instruct copySignF_reg(regF dst, regF src, regF tmp1, rRegL tmp2) %{
> 5811: predicate(UseAVX >= 3 && VM_Version::supports_avx512vl());
Please remove redundant predication check from all new patterns since they are already checked in match_rule_supported.
src/hotspot/cpu/x86/x86.ad line 5846:
> 5844: __ mov64($tmp2$$Register, 0x7FFFFFFFFFFFFFFF);
> 5845: __ vmovq($tmp1$$XMMRegister, $tmp2$$Register);
> 5846: __ vpternlogq($dst$$XMMRegister, 0xE4, $src$$XMMRegister, $tmp1$$XMMRegister, Assembler::AVX_128bit);
No harm in adding a comment describing logic expression encoded by E4.
-------------
PR: https://git.openjdk.java.net/jdk/pull/5005
More information about the hotspot-compiler-dev
mailing list