JDK 19 |
---|
19 b05Fixed |
Blocks :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
In copy_bytes_forward and copy_bytes_backward that are used in arraycopy stubs, we have code like: if (UseAVX >= 2) { // clean upper bits of YMM registers __ vpxor(xmm0, xmm0); __ vpxor(xmm1, xmm1); } This code was added by JDK-8011102 (with vzeroupper), and then changed by JDK-8078113 (changed to vpxor). It raised some questions during early JDK-8279621 review. I believe these were added to resolve false dependencies from larger 256-bit registers with subsequent 128-bit-using instructions. Note: this is still insufficient on Intel x86 implementations to recover from "dirty" AVX state; only vzeroupper/vzeroall would solve that, but that issue might not even affect our assembler code that AFAICS uses VEX-encoded versions when AVX > 0 (see Assembler::simd_prefix_and_encode). Every arraycopy stub has vzeroupper at the end, anyhow. For x86_64 version, this zeroing seems redundant, as there are no XMM-using instructions after we leave the copy_bytes_{forward,backward} and go to stub epilog, where we meet vzeroupper. For x86_32 version, this zeroing seems odd. x86_32 qword copying still uses XMM registers, as 32-bit platform has no other good way to copy 8 bytes at a time. There, using VEX.256 vpxor clears all bits, which is fine right now, but JDK-8279621 changes would probably need to clear upper 128-bits in AVX=1 mode. Also, it is only enabled for AVX==2, ignoring AVX-512. Draft PR: https://github.com/openjdk/jdk/pull/7016
|