RFR: 8375536: PPC64: Implement special MachNodes for floating point CMove [v2]
Richard Reingruber
rrich at openjdk.org
Wed Jan 28 09:48:23 UTC 2026
On Wed, 21 Jan 2026 13:11:52 GMT, David Briemann <dbriemann at openjdk.org> wrote:
>> Adds the following mach nodes:
>> match(Set dst (CMoveF (Binary cop (CmpF op1 op2)) (Binary src1 src2)));
>> match(Set dst (CMoveD (Binary cop (CmpD op1 op2)) (Binary src1 src2)));
>> match(Set dst (CMoveF (Binary cop (CmpD op1 op2)) (Binary src1 src2)));
>> match(Set dst (CMoveD (Binary cop (CmpF op1 op2)) (Binary src1 src2)));
>
> David Briemann has updated the pull request incrementally with one additional commit since the last revision:
>
> address review comments
src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp line 684:
> 682: xscmpeqdp(tmp, op1, op2);
> 683: xxsel(dst, first, second, tmp);
> 684: break;
This looks incorrect to me.
Also when I compare it with the disassembly of the C version[1]:
double cmovf_eq(double op1, double op2, double src1, double src2) {
return op1 == op2 ? src1 : src2;
}
cmovf_eq(double, double, double, double):
xscmpeqdp 1,2,1
xxsel 1,4,3,1
blr
`cc` would be 0xA for `==` (looking at `operand cmpOp`[2]), right?
0xA is 0b1010. `exchange` would be 0 but I think `src1` and `src2` need to be exchanged.
Assume `op1` and `op2` are indeed equal in `op1 == op2 ? src1 : src2`. `tmp.dword[0]` will be set to 0xFFFF_FFFF_FFFF_FFFF by the `xscmpeqdp`.
`xxsel` evaluates `(src1 & ~tmp) | (src2 & tmp)` so for the correct result `src1` and `src2` need to be swapped as also seen in the disassembly above.
[1] [disassembly of the C version](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGEgOykrgAyeAyYAHI%2BAEaYxCAArKQADqgKhE4MHt6%2BASlpGQKh4VEssfFJdpgOmUIETMQE2T5%2BXIFVNQJ1DQTFkTFxibb1jc25bcM9faXliQCUtqhexMjsHOYAzGHI3lgA1CYbbgoE%2BIIAdAiH2CYaAIKb27uYB0cn%2BKiX17cP9%2BhL0Xoe2QLFQADcqAB9TAARwg/y8gJeqGSXFIewRSL2KLM6MxQIUKzRGIBBJWZjmB38Vnuezpe2ImAIywY2NRrwAIocOWyzK8AGJ7QnILh7EBC8mHGkPfxc%2B4/fEvEHgqHheGk5GovEa3naxFkkV6rHCilU6X0hlMlls0VgMDc3kCiUisXOsxSn4mWWev465UQyHATDq/Wa4mK3Uk0PO8M6k2Ur3m%2BmM5nEVko0XfDY8nFO4Wi8Umj3y73y33R/1Q2gEENYjNGoE4hsvfPNt0J6k/C0p60Z15uR2HQX511FjbSr0cjgLWicBK8PwcLSkVCcNzWaxCpYrF6bHikAiaacLADWIA2CXOAA4AJwANhvGivd7MN/8t4SgVnHEkC6PK84XgFBADQDyPBY4FgJA0BYZI6DichKBguD6HiZJkmQO9JHoYACGILwGBPPg6AIOJgIgaJ/2iMIGgAT04fdqOYYhaIAeWibRqkPbheBgthBFYhhaHopdeCwaIvGANwxFoYCeNILAWEMYBxFEhS8EZGowUwOTl0wVRqi8UiGN4MJSO/ZdaDwaJiDojwsH/PC8BYEzSG04hojSTAOUwJSjCsoxwL4AxgAUAA1PBMAA
d1Y5JGFc/hBBEMR2CkGRBEUFR1DU3Q0QMQLTEsax9Gs4DIAWFFHAEOSAFpWI2PYapYZBki8blUiiuIuGXcE4mIPAsDKiAFg6Kq/AgVwxlaIIGHQaYBniNFUnSMapr0ZbCgYeaykGNFRtqEYmk8Fo9H2rpDu22Y9sOtbrqmMJ%2Bh2xaRu3VYJBnOc/zU1cOD2Dq4iwoFgGQZA9jwgiTz2CBcEIEgDjMDYuDmXhuK0OZT3PDRzn8B9/ASK8NA2O8r38fw8s4X9SEXHrANsECwNEiCYEQEAlgIVqCEQiBkPg4gIlYNZVGfGqsL2YHQYgcHCORoJ8CIfr0D0RLhFEcQ0uVzK1H/XLSCi2zkhMj6OHnKn/x%2B1ijI57EqD%2B1BOuIQGXnFsH8MIqGPFg3n4cRmXUePUgzw2DZziD0Ow/D/QKa%2BmmOCA%2Bm/fRyOODMaPeB%2BlHwIWdz0mcSQgA)
[2] [`operand cmpOp`](https://github.com/openjdk/jdk/blob/4ae4ffd5a3114aa2a3832818ee30dc38d9aa2b72/src/hotspot/cpu/ppc/ppc.ad#L4870)
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/29281#discussion_r2735766494
More information about the hotspot-compiler-dev
mailing list