RFR: 8289552: Make intrinsic conversions between bit representations of half precision values and floats [v8]
Jatin Bhateja
jbhateja at openjdk.org
Wed Sep 21 17:53:36 UTC 2022
On Fri, 2 Sep 2022 00:52:49 GMT, Smita Kamath <svkamath at openjdk.org> wrote:
>> 8289552: Make intrinsic conversions between bit representations of half precision values and floats
>
> Smita Kamath has updated the pull request incrementally with one additional commit since the last revision:
>
> Addressed review comments
Hi Smita, Adding some review comments.
Best Regards
src/hotspot/cpu/x86/assembler_x86.cpp line 1925:
> 1923:
> 1924: void Assembler::vcvtps2ph(XMMRegister dst, XMMRegister src, int imm8, int vector_len) {
> 1925: assert(VM_Version::supports_evex() || VM_Version::supports_f16c(), "");
Since you are accepting vector_len so adding a AVX512VL check will be more appropriate here.
src/hotspot/cpu/x86/assembler_x86.cpp line 1932:
> 1930:
> 1931: void Assembler::evcvtps2ph(Address dst, KRegister mask, XMMRegister src, int imm8, int vector_len) {
> 1932: assert(VM_Version::supports_evex(), "");
Same as above.
src/hotspot/cpu/x86/assembler_x86.cpp line 1946:
> 1944:
> 1945: void Assembler::vcvtph2ps(XMMRegister dst, XMMRegister src, int vector_len) {
> 1946: assert(VM_Version::supports_evex() || VM_Version::supports_f16c(), "");
same as above.
src/hotspot/cpu/x86/assembler_x86.cpp line 1949:
> 1947: InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */false, /* no_mask_reg */ true, /* uses_vl */ true);
> 1948: int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
> 1949: emit_int16((unsigned char)0x13, (0xC0 | encode));
Please rebase this patch, recently emit_int16 have starting accepting the unsigned char argument.
src/hotspot/cpu/x86/x86.ad line 1686:
> 1684: case Op_ConvHF2F:
> 1685: if (!VM_Version::supports_f16c() && !(VM_Version::supports_evex() &&
> 1686: VM_Version::supports_avx512vl())) {
Redundant evex check can be removed.
src/hotspot/cpu/x86/x86_64.ad line 11309:
> 11307: %}
> 11308:
> 11309: instruct convF2HF_reg_reg(rRegI dst, regF src, regF tmp) %{
You can move these patterns to common .ad file it will also handle 32 bit target.
src/hotspot/cpu/x86/x86_64.ad line 11329:
> 11327: ins_encode %{
> 11328: __ movl($rtmp$$Register, 0x1);
> 11329: __ kmovdl($ktmp$$KRegister, $rtmp$$Register);
kmovdl needs AVX512BW, so there should a check for it in the predicate.
src/hotspot/share/opto/convertnode.cpp line 166:
> 164: //=============================================================================
> 165: //------------------------------Value------------------------------------------
> 166: const Type* ConvF2HFNode::Value(PhaseGVN* phase) const {
IR framework based test will compliment newly introduced IR nodes.
src/hotspot/share/opto/convertnode.hpp line 107:
> 105: class ConvF2HFNode : public Node {
> 106: public:
> 107: ConvF2HFNode( Node *in1 ) : Node(0,in1) {}
Additional space b/w , and in1
src/hotspot/share/opto/convertnode.hpp line 146:
> 144: class ConvHF2FNode : public Node {
> 145: public:
> 146: ConvHF2FNode( Node *in1 ) : Node(0,in1) {}
Space b/w , and in1
src/hotspot/share/runtime/sharedRuntime.cpp line 452:
> 450: // Reference implementation at src/java.base/share/classes/java/lang/Float.java:floatToFloat16
> 451: JRT_LEAF(jshort, SharedRuntime::f2hf(jfloat x))
> 452: jint doppel = SharedRuntime::f2i(x);
Newly added constant value computation runtime routines can be validated by a gtest.
-------------
PR: https://git.openjdk.org/jdk/pull/9781
More information about the hotspot-dev
mailing list