[llvm] 1a1448e - [X86] Merge X86MCInstLowering's maxLongNopLength into emitNop and remove check for FeatureNOPL.

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 27 09:23:28 PDT 2020


Craig,

In moving the code, you dropped the comment that was there explicitly to 
describe one of the subtleties in the code.  Can I ask that you move 
over the comment?  Personally, I preferred the outline function style 
even with your change, but that's minor. The loss of the explanation is 
more important.

Philip

On 7/25/20 10:52 PM, Craig Topper via llvm-commits wrote:
> Author: Craig Topper
> Date: 2020-07-25T22:11:47-07:00
> New Revision: 1a1448e6568d9b11f198e510fa9c4cb6b1f4216a
>
> URL: https://github.com/llvm/llvm-project/commit/1a1448e6568d9b11f198e510fa9c4cb6b1f4216a
> DIFF: https://github.com/llvm/llvm-project/commit/1a1448e6568d9b11f198e510fa9c4cb6b1f4216a.diff
>
> LOG: [X86] Merge X86MCInstLowering's maxLongNopLength into emitNop and remove check for FeatureNOPL.
>
> The switch in emitNop uses 64-bit registers for nops exceeding
> 2 bytes. This isn't valid outside 64-bit mode. We could fix this
> easily enough, but there are no users that ask for more than 2
> bytes outside 64-bit mode.
>
> Inlining the method to make the coupling between the two methods
> more explicit.
>
> Added:
>      
>
> Modified:
>      llvm/lib/Target/X86/X86MCInstLower.cpp
>
> Removed:
>      
>
>
> ################################################################################
> diff  --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp
> index b4db72e15060..8f3e32727371 100644
> --- a/llvm/lib/Target/X86/X86MCInstLower.cpp
> +++ b/llvm/lib/Target/X86/X86MCInstLower.cpp
> @@ -1079,29 +1079,27 @@ void X86AsmPrinter::LowerTlsAddr(X86MCInstLower &MCInstLowering,
>     }
>   }
>   
> -/// Return the longest nop which can be efficiently decoded for the given
> -/// target cpu.  15-bytes is the longest single NOP instruction, but some
> -/// platforms can't decode the longest forms efficiently.
> -static unsigned maxLongNopLength(const X86Subtarget *Subtarget) {
> -  if (Subtarget->getFeatureBits()[X86::FeatureFast7ByteNOP])
> -    return 7;
> -  if (Subtarget->getFeatureBits()[X86::FeatureFast15ByteNOP])
> -    return 15;
> -  if (Subtarget->getFeatureBits()[X86::FeatureFast11ByteNOP])
> -    return 11;
> -  if (Subtarget->getFeatureBits()[X86::FeatureNOPL] || Subtarget->is64Bit())
> -    return 10;
> -  if (Subtarget->is32Bit())
> -    return 2;
> -  return 1;
> -}
> -
>   /// Emit the largest nop instruction smaller than or equal to \p NumBytes
>   /// bytes.  Return the size of nop emitted.
>   static unsigned emitNop(MCStreamer &OS, unsigned NumBytes,
>                           const X86Subtarget *Subtarget) {
> +  unsigned MaxNopLength = 1;
> +  if (Subtarget->is64Bit()) {
> +    // FIXME: We can use NOOPL on 32-bit targets with FeatureNOPL, but the
> +    // IndexReg/BaseReg below need to be updated.
> +    if (Subtarget->hasFeature(X86::FeatureFast7ByteNOP))
> +      MaxNopLength = 7;
> +    else if (Subtarget->hasFeature(X86::FeatureFast15ByteNOP))
> +      MaxNopLength = 15;
> +    else if (Subtarget->hasFeature(X86::FeatureFast11ByteNOP))
> +      MaxNopLength = 11;
> +    else
> +      MaxNopLength = 10;
> +  } if (Subtarget->is32Bit())
> +    MaxNopLength = 2;
> +
>     // Cap a single nop emission at the profitable value for the target
> -  NumBytes = std::min(NumBytes, maxLongNopLength(Subtarget));
> +  NumBytes = std::min(NumBytes, MaxNopLength);
>   
>     unsigned NopSize;
>     unsigned Opc, BaseReg, ScaleVal, IndexReg, Displacement, SegmentReg;
>
>
>          
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list