On Wed, 8 Mar 2023 20:55:29 GMT, Vladimir Kozlov <k...@openjdk.org> wrote:

>> src/hotspot/share/opto/convertnode.cpp line 171:
>> 
>>> 169:   if (t == Type::TOP) return Type::TOP;
>>> 170:   if (t == Type::FLOAT) return TypeInt::SHORT;
>>> 171:   if (StubRoutines::f2hf() == nullptr) return bottom_type();
>> 
>> What's the purpose of this check? My understanding is ConvF2HF/ConvHF2F 
>> require intrinsification and on platforms where stubs are absent, 
>> intrinsification is disabled.
>
> This code is optimization: use stub to calculate constant value during 
> compilation instead of generating HW  instruction in compiled code.  It is 
> not required to have this stub for intensification to work - `ConvF2HFNode` 
> will be processed normally and will use intrinsics code (HW instruction) 
> defined in .ad file.
> These stubs are used only here, not in C1 and not in Interpreter. As 
> consequence these stubs implementation is optional and I implemented them 
> only on x64. That is why I have this check.
> I debated to not have them at all to not confuse people but they did improve 
> performance a little.

Thanks for the clarifications. Now it makes much more sense.

Still, the mix of `StubRoutines::f2hf()` and `SharedRuntime::f2hf()` looks a 
bit confusing.

What if you move the wrapper to `StubRoutines` class instead? (`JRT_LEAF` et al 
stuff looks redundant here. Also, even though there are other arithmetic 
operations declared on `StubRoutines`, they provide default implementations 
universally available across all platforms. `f2hf` case is different since it 
exposes a platform-specific stub and its availability is limited.)  

Or encapsulate the constant folding logic (along with the guard) into 
`SharedRuntime` and return `Type*` (instead of int/float scalar).

-------------

PR: https://git.openjdk.org/jdk/pull/12869

Reply via email to