RFR: 8371955: Support AVX10 floating point comparison instructions [v3]
Sandhya Viswanathan
sviswanathan at openjdk.org
Fri Jan 9 00:36:53 UTC 2026
On Thu, 8 Jan 2026 19:20:06 GMT, Mohamed Issa <missa at openjdk.org> wrote:
>> Intel® AVX10 ISA [1] extensions added new floating point comparison instructions. They set the EFLAGS register so that relationships can be tested independently to avoid extra checks when one of the inputs is NaN.
>>
>> Most of the work is covered in the architecture definition (`x86.ad`) file. A new comparison operand was created to be used by new CMove and JMP definitions with the APX specific portions of the CMove section being updated to rely on the new instructions because both sets of instructions are always expected to be available on the same platform. New floating point comparison definitions were also added.
>>
>> This change uses the new AVX10.2 (UCOMXSS or UCOMXSD) instructions on supported platforms to avoid the extra handling required with existing (UCOMISS or UCOMISD) instructions. To make sure no new failures were introduced, tier1, tier2, and tier3 tests were run on builds with and without the changes. Additionally, the JTREG tests listed below were used to verify correctness with `-XX:-UseAPX` / `-XX:+UseAPX` options. The baseline build used is [OpenJDK v26-b26](https://github.com/openjdk/jdk/releases/tag/jdk-26%2B26).
>>
>> 1. `jtreg:test/hotspot/jtreg/compiler/c2/irTests/CMoveLConstants.java`
>> 2. `jtreg:test/hotspot/jtreg/compiler/c2/irTests/TestFPComparison.java`
>> 3. `jtreg:test/hotspot/jtreg/compiler/intrinsics/math/TestSignumIntrinsic.java`
>> 4. `jtreg:test/hotspot/jtreg/compiler/vectorization/TestSignumVector.java`
>>
>> Finally, the JMH micro-benchmark listed below was updated to separately exercise CMove and JMP code paths.
>>
>> 1. `micro:test/micro/org/openjdk/bench/java/lang/FPComparison.java`
>>
>> [1] https://www.intel.com/content/www/us/en/content-details/856721/intel-advanced-vector-extensions-10-2-intel-avx10-2-architecture-specification.html?wapkw=AVX10
>
> Mohamed Issa has updated the pull request incrementally with one additional commit since the last revision:
>
> Also update copyright year in IREncodingPrinter.java
src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp line 1056:
> 1054: }
> 1055: jcc(Assembler::equal, DONE_LABEL); // handle special case +0.0/-0.0, if argument is +0.0/-0.0, return argument
> 1056: jcc(Assembler::parity, DONE_LABEL); // handle special case NaN, if argument NaN, return NaN
It looks to me that these two could be replaced by one jcc.
For with AVX 10.2:
jcc if Sign flag is set to DONE_LABEL
For without AVX 10.2:
jcc if equal to DONE_LABEL
src/hotspot/cpu/x86/x86.ad line 1706:
> 1704: __ setcc(Assembler::above, dst);
> 1705: __ jcc(Assembler::aboveEqual, done);
> 1706: __ movl(dst, -1);
This seems to be applicable for both with/without AVX 10.2.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/28337#discussion_r2674351156
PR Review Comment: https://git.openjdk.org/jdk/pull/28337#discussion_r2674367618
More information about the core-libs-dev
mailing list