diff --git a/llvm/lib/Target/X86/X86.td b/llvm/lib/Target/X86/X86.td --- a/llvm/lib/Target/X86/X86.td +++ b/llvm/lib/Target/X86/X86.td @@ -372,6 +372,12 @@ "ermsb", "HasERMSB", "true", "REP MOVS/STOS are fast">; +// Icelake and newer processors have Fast Short REP MOV. +def FeatureFSRM + : SubtargetFeature< + "fsrm", "HasFSRM", "true", + "REP MOVSB of short lengths is faster">; + // Bulldozer and newer processors can merge CMP/TEST (but not other // instructions) with conditional branches. def FeatureBranchFusion @@ -713,7 +719,8 @@ FeatureVPOPCNTDQ, FeatureGFNI, FeatureCLWB, - FeatureRDPID]; + FeatureRDPID, + FeatureFSRM]; list ICLTuning = CNLTuning; list ICLFeatures = !listconcat(CNLFeatures, ICLAdditionalFeatures); diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -1016,6 +1016,7 @@ def HasFastLZCNT : Predicate<"Subtarget->hasFastLZCNT()">; def HasFastSHLDRotate : Predicate<"Subtarget->hasFastSHLDRotate()">; def HasERMSB : Predicate<"Subtarget->hasERMSB()">; +def HasFSRM : Predicate<"Subtarget->hasFSRM()">; def HasMFence : Predicate<"Subtarget->hasMFence()">; def UseIndirectThunkCalls : Predicate<"Subtarget->useIndirectThunkCalls()">; def NotUseIndirectThunkCalls : Predicate<"!Subtarget->useIndirectThunkCalls()">; diff --git a/llvm/lib/Target/X86/X86Subtarget.h b/llvm/lib/Target/X86/X86Subtarget.h --- a/llvm/lib/Target/X86/X86Subtarget.h +++ b/llvm/lib/Target/X86/X86Subtarget.h @@ -302,6 +302,9 @@ /// True if the processor has enhanced REP MOVSB/STOSB. bool HasERMSB = false; + /// True if the processor has fast short REP MOV. + bool HasFSRM = false; + /// True if the short functions should be padded to prevent /// a stall when returning too early. bool PadShortFunctions = false; @@ -694,6 +697,7 @@ bool hasMacroFusion() const { return HasMacroFusion; } bool hasBranchFusion() const { return HasBranchFusion; } bool hasERMSB() const { return HasERMSB; } + bool hasFSRM() const { return HasFSRM; } bool hasSlowDivide32() const { return HasSlowDivide32; } bool hasSlowDivide64() const { return HasSlowDivide64; } bool padShortFunctions() const { return PadShortFunctions; }