Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8217371

Incorrect LP64 guard in x86.ad after JDK-8210764 (Update avx512 implementation)

    XMLWordPrintable

Details

    • b07
    • x86_64

    Backports

      Description

        x86.ad has checks like "ifndef LP64". Those do not work reliably. On x86_64, it is not defined for ADLC compilation, making the code always take the "not defined" branch. Note that the same file uses "ifdef _LP64" (note the underscore) at the same file.

        If you fix that with proper "ifndef _LP64":

        diff -r 2360f73c5514 src/hotspot/cpu/x86/x86.ad
        --- a/src/hotspot/cpu/x86/x86.ad Fri Jan 18 09:32:02 2019 +0100
        +++ b/src/hotspot/cpu/x86/x86.ad Fri Jan 18 10:02:35 2019 +0100
        @@ -1685,5 +1685,5 @@
             case Op_VecD:
             case Op_VecX:
        -#ifndef LP64
        +#ifndef _LP64
               __ movdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
         #else
        @@ -1697,5 +1697,5 @@
               break;
             case Op_VecY:
        -#ifndef LP64
        +#ifndef _LP64
               __ vmovdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
         #else
        @@ -1758,5 +1758,5 @@
                 break;
               case Op_VecX:
        -#ifndef LP64
        +#ifndef _LP64
                 __ movdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
         #else
        @@ -1770,5 +1770,5 @@
                 break;
               case Op_VecY:
        -#ifndef LP64
        +#ifndef _LP64
                 __ vmovdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
         #else
        @@ -1796,5 +1796,5 @@
                 break;
               case Op_VecX:
        -#ifndef LP64
        +#ifndef _LP64
                 __ movdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
         #else
        @@ -1808,5 +1808,5 @@
                 break;
               case Op_VecY:
        -#ifndef LP64
        +#ifndef _LP64
                 __ vmovdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
         #else

        ...then the build starts to fail on Linux x86_64 with:

        /home/shade/trunks/jdk-jdk/src/hotspot/cpu/x86/assembler_x86.hpp:2135:8: note: candidate expects 3 arguments, 4 provided
        /home/shade/trunks/jdk-jdk/src/hotspot/cpu/x86/assembler_x86.hpp:2136:8: note: candidate: void Assembler::vextracti32x4(Address, XMMRegister, uint8_t)
           void vextracti32x4(Address dst, XMMRegister src, uint8_t imm8);
                ^~~~~~~~~~~~~
        /home/shade/trunks/jdk-jdk/src/hotspot/cpu/x86/assembler_x86.hpp:2136:8: note: candidate expects 3 arguments, 4 provided
        /home/shade/trunks/jdk-jdk/src/hotspot/cpu/x86/x86.ad:1817:143: error: no matching function for call to 'MacroAssembler::vextracti64x4(Address, XMMRegister, XMMRegister, int)'
                   __ vextracti64x4(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]), as_XMMRegister(Matcher::_regEncode[reg]), 0x0);
                                                                                                                                                       ^

        There is no 4-argument vextracti64x4 to be seen, indeed.

        So, not only the LP64 is not taken, it does not even compile.

        Attachments

          Issue Links

            Activity

              People

                sviswanathan Sandhya Viswanathan
                shade Aleksey Shipilev
                Votes:
                0 Vote for this issue
                Watchers:
                5 Start watching this issue

                Dates

                  Created:
                  Updated:
                  Resolved: