RFR: 8318227: RISC-V: C2 ConvHF2F
Hamlin Li
mli at openjdk.org
Fri Nov 24 17:53:05 UTC 2023
On Fri, 24 Nov 2023 17:42:22 GMT, Hamlin Li <mli at openjdk.org> wrote:
>> src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp line 1691:
>>
>>> 1689: fmv_h_x(dst, src);
>>> 1690: fcvt_s_h(dst, dst);
>>> 1691: j(done);
>>
>> Since `Nan`s are exceptional inputs, it would be beneficial to move the handling below to an out-of-line stub.
>
> Thanks for the suggestion, it make sense.
>
> Just I'm not sure if there is a straight way to implement it currently. Following is what I've done, but blocked, please help to share your opinion.
>
> To jump to stub code to process NaN case, the stub code need to use specific register for `src` and `dst`, as `dst` is a FloatRegister, so need a way to specify a float register when matching `ConvHF2F` in ad file. I tried to add a `fRegF_F10` to enable specify a float register, but it does not work well. Some error occurs for fastdebug version:
>
>
> ----------System.out:(47/2030)----------
> Start ...
> o558 SubF === _ o515 o559 [[ o557 ]]
>
> --N: o558 SubF === _ o515 o559 [[ o557 ]]
>
> --N: o515 MoveI2F === _ o681 [[ o470 o484 o620 o620 o618 o579 o558 o530 o434 4 10 10 ]]
> FREGF 0 FREGF
> FREGF_F10 0 FREGF_F10
>
> --N: o559 ConvHF2F === _ o560 [[ o558 ]] #float
> FREGF_F10 100 convHF2F_reg_reg
>
> --N: o560 RShiftI === _ o561 o209 [[ o559 o434 4 ]]
> IREGI 0 IREGI
> IREGINOSP 0 IREGINOSP
> IREGI_R10 0 IREGI_R10
> IREGI_R11 0 IREGI_R11
> IREGI_R12 0 IREGI_R12
> IREGI_R13 0 IREGI_R13
> IREGI_R14 0 IREGI_R14
> IREGIORL2I 0 IREGI
> IREGIORL 0 IREGI
> IREGILNP 0 IREGI
> IREGILNPNOSP 0 IREGINOSP
>
> #
> # A fatal error has been detected by the Java Runtime Environment:
> #
> # Internal Error (/home/hamlin/workspace/repos/github/jdk/src/hotspot/share/opto/matcher.cpp:1727), pid=2212108, tid=2212156
> # assert(false) failed: bad AD file
The workaround I can use is to mv the result back to `dst` when comes back from stub code, like below:
bind(nan_case);
// input: x11
// output: x10
RuntimeAddress stub = RuntimeAddress(StubRoutines::riscv::float16_to_float_process_nan());
assert(stub.target() != nullptr, "float16_to_float_process_nan stub has not been generated");
address call = trampoline_call(stub);
fmv_w_x(dst, x10);
But, this seems to me a bit more complicated.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/16802#discussion_r1404565645
More information about the hotspot-dev
mailing list