r188799 - Refactor the x86 feature handling.

Craig Topper craig.topper at gmail.com
Tue Aug 20 18:38:29 PDT 2013


Shouldn't setXOPLevel be passed FMA4 instead of SSE4A here? I think this
causes AVX disable to disable SSE4A.

  case AVX:
    Features["fma"] = Features["avx"] = false;
    setXOPLevel(Features, SSE4A, false);


On Tue, Aug 20, 2013 at 6:44 AM, Rafael Espindola <
rafael.espindola at gmail.com> wrote:

> Author: rafael
> Date: Tue Aug 20 08:44:29 2013
> New Revision: 188799
>
> URL: http://llvm.org/viewvc/llvm-project?rev=188799&view=rev
> Log:
> Refactor the x86 feature handling.
>
> This removes the very long chains of
> Feature["avx"] = Feature["sse42"] = ... = true;
>
> Modified:
>     cfe/trunk/lib/Basic/Targets.cpp
>
> Modified: cfe/trunk/lib/Basic/Targets.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=188799&r1=188798&r2=188799&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Basic/Targets.cpp (original)
> +++ cfe/trunk/lib/Basic/Targets.cpp Tue Aug 20 08:44:29 2013
> @@ -1575,6 +1575,12 @@ class X86TargetInfo : public TargetInfo
>    enum MMX3DNowEnum {
>      NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
>    } MMX3DNowLevel;
> +  enum XOPEnum {
> +    NoXOP,
> +    SSE4A,
> +    FMA4,
> +    XOP
> +  } XOPLevel;
>
>    bool HasAES;
>    bool HasPCLMUL;
> @@ -1586,10 +1592,7 @@ class X86TargetInfo : public TargetInfo
>    bool HasRTM;
>    bool HasPRFCHW;
>    bool HasRDSEED;
> -  bool HasSSE4a;
> -  bool HasFMA4;
>    bool HasFMA;
> -  bool HasXOP;
>    bool HasF16C;
>
>    /// \brief Enumeration of all of the X86 CPUs supported by Clang.
> @@ -1740,10 +1743,10 @@ class X86TargetInfo : public TargetInfo
>  public:
>    X86TargetInfo(const llvm::Triple &Triple)
>        : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
> -        HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false),
> -        HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasRTM(false),
> -        HasPRFCHW(false), HasRDSEED(false), HasSSE4a(false),
> HasFMA4(false),
> -        HasFMA(false), HasXOP(false), HasF16C(false), CPU(CK_Generic) {
> +        XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
> +        HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
> +        HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasFMA(false),
> +        HasF16C(false), CPU(CK_Generic) {
>      BigEndian = false;
>      LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
>    }
> @@ -1779,6 +1782,12 @@ public:
>    }
>    virtual void getTargetDefines(const LangOptions &Opts,
>                                  MacroBuilder &Builder) const;
> +  void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
> +                   bool Enabled) const;
> +  void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
> +                   bool Enabled) const;
> +  void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
> +                   bool Enabled) const;
>    virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
>                                   StringRef Name,
>                                   bool Enabled) const;
> @@ -2120,165 +2129,171 @@ void X86TargetInfo::getDefaultFeatures(l
>    }
>  }
>
> +void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
> +                                X86SSEEnum Level, bool Enabled) const {
> +  if (Enabled) {
> +    switch (Level) {
> +    case AVX512:
> +      Features["avx-512"] = true;
> +    case AVX2:
> +      Features["avx2"] = true;
> +    case AVX:
> +      Features["avx"] = true;
> +    case SSE42:
> +      Features["popcnt"] = Features["sse42"] = true;
> +    case SSE41:
> +      Features["sse41"] = true;
> +    case SSSE3:
> +      Features["ssse3"] = true;
> +    case SSE3:
> +      Features["sse3"] = true;
> +    case SSE2:
> +      Features["sse2"] = true;
> +    case SSE1:
> +      setMMXLevel(Features, MMX, Enabled);
> +      Features["sse"] = true;
> +    case NoSSE:
> +      break;
> +    }
> +    return;
> +  }
> +
> +  switch (Level) {
> +  case NoSSE:
> +  case SSE1:
> +    Features["sse"] = false;
> +  case SSE2:
> +    Features["sse2"] = false;
> +  case SSE3:
> +    Features["sse3"] = false;
> +    setXOPLevel(Features, NoXOP, false);
> +  case SSSE3:
> +    Features["ssse3"] = false;
> +  case SSE41:
> +    Features["sse41"] = false;
> +  case SSE42:
> +    Features["popcnt"] = Features["sse42"] = false;
> +  case AVX:
> +    Features["fma"] = Features["avx"] = false;
> +    setXOPLevel(Features, SSE4A, false);
> +  case AVX2:
> +    Features["avx2"] = false;
> +  case AVX512:
> +    Features["avx-512"] = false;
> +  }
> +}
> +
> +void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
> +                                MMX3DNowEnum Level, bool Enabled) const {
> +  if (Enabled) {
> +    switch (Level) {
> +    case AMD3DNowAthlon:
> +      Features["3dnowa"] = true;
> +    case AMD3DNow:
> +      Features["3dnow"] = true;
> +    case MMX:
> +      Features["mmx"] = true;
> +    case NoMMX3DNow:
> +      break;
> +    }
> +    return;
> +  }
> +
> +  switch (Level) {
> +  case NoMMX3DNow:
> +  case MMX:
> +    Features["mmx"] = false;
> +  case AMD3DNow:
> +    Features["3dnow"] = false;
> +  case AMD3DNowAthlon:
> +    Features["3dnowa"] = false;
> +  }
> +}
> +
> +void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum
> Level,
> +                                bool Enabled) const {
> +  if (Enabled) {
> +    switch (Level) {
> +    case XOP:
> +      Features["xop"] = true;
> +    case FMA4:
> +      Features["fma4"] = true;
> +      setSSELevel(Features, AVX, true);
> +    case SSE4A:
> +      Features["sse4a"] = true;
> +      setSSELevel(Features, SSE3, true);
> +    case NoXOP:
> +      break;
> +    }
> +    return;
> +  }
> +
> +  switch (Level) {
> +  case NoXOP:
> +  case SSE4A:
> +    Features["sse4a"] = false;
> +  case FMA4:
> +    Features["fma4"] = false;
> +  case XOP:
> +    Features["xop"] = false;
> +  }
> +}
> +
>  bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
>                                        StringRef Name,
>                                        bool Enabled) const {
>    // FIXME: This *really* should not be here.  We need some way of
> translating
>    // options into llvm subtarget features.
> -  if (!Features.count(Name) &&
> -      (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" &&
> -       Name != "rdrnd"))
> +  if (Name == "sse4" || Name == "sse4.2")
> +    Name = "sse42";
> +  if (Name == "sse4.1")
> +    Name = "sse41";
> +  if (Name == "rdrnd")
> +    Name = "rdrand";
> +  if (!Features.count(Name))
>      return false;
>
> -  // FIXME: this should probably use a switch with fall through.
> +  Features[Name] = Enabled;
>
> -  if (Enabled) {
> -    if (Name == "mmx")
> -      Features["mmx"] = true;
> -    else if (Name == "sse")
> -      Features["mmx"] = Features["sse"] = true;
> -    else if (Name == "sse2")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] = true;
> -    else if (Name == "sse3")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        true;
> -    else if (Name == "ssse3")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        Features["ssse3"] = true;
> -    else if (Name == "sse4" || Name == "sse4.2")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
> -        Features["popcnt"] = true;
> -    else if (Name == "sse4.1")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        Features["ssse3"] = Features["sse41"] = true;
> -    else if (Name == "3dnow")
> -      Features["mmx"] = Features["3dnow"] = true;
> -    else if (Name == "3dnowa")
> -      Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
> -    else if (Name == "aes")
> -      Features["sse"] = Features["sse2"] = Features["aes"] = true;
> -    else if (Name == "pclmul")
> -      Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
> -    else if (Name == "avx")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
> -        Features["popcnt"] = Features["avx"] = true;
> -    else if (Name == "avx2")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
> -        Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
> -    else if (Name == "avx-512")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
> -        Features["popcnt"] = Features["avx"] = Features["avx2"] =
> -        Features["avx-512"] = true;
> -    else if (Name == "fma")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
> -        Features["popcnt"] = Features["avx"] = Features["fma"] = true;
> -    else if (Name == "fma4")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
> -        Features["popcnt"] = Features["avx"] = Features["sse4a"] =
> -        Features["fma4"] = true;
> -    else if (Name == "xop")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
> -        Features["popcnt"] = Features["avx"] = Features["sse4a"] =
> -        Features["fma4"] = Features["xop"] = true;
> -    else if (Name == "sse4a")
> -      Features["mmx"] = Features["sse"] = Features["sse2"] =
> Features["sse3"] =
> -        Features["sse4a"] = true;
> -    else if (Name == "lzcnt")
> -      Features["lzcnt"] = true;
> -    else if (Name == "rdrnd")
> -      Features["rdrand"] = true;
> -    else if (Name == "bmi")
> -      Features["bmi"] = true;
> -    else if (Name == "bmi2")
> -      Features["bmi2"] = true;
> -    else if (Name == "popcnt")
> -      Features["popcnt"] = true;
> -    else if (Name == "f16c")
> -      Features["f16c"] = true;
> -    else if (Name == "rtm")
> -      Features["rtm"] = true;
> -    else if (Name == "prfchw")
> -      Features["prfchw"] = true;
> -    else if (Name == "rdseed")
> -      Features["rdseed"] = true;
> -  } else {
> -    if (Name == "mmx")
> -      Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
> -    else if (Name == "sse")
> -      Features["sse"] = Features["sse2"] = Features["sse3"] =
> -        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
> -        Features["sse4a"] = Features["avx"] = Features["avx2"] =
> -        Features["avx-512"] = Features["fma"] = Features["fma4"] =
> -        Features["aes"] = Features["pclmul"] = Features["xop"] = false;
> -    else if (Name == "sse2")
> -      Features["sse2"] = Features["sse3"] = Features["ssse3"] =
> -        Features["sse41"] = Features["sse42"] = Features["sse4a"] =
> -        Features["avx"] = Features["avx2"] = Features["avx-512"] =
> -        Features["fma"] = Features["fma4"] = Features["aes"] =
> -        Features["pclmul"] = Features["xop"] = false;
> -    else if (Name == "sse3")
> -      Features["sse3"] = Features["ssse3"] = Features["sse41"] =
> -        Features["sse42"] = Features["sse4a"] = Features["avx"] =
> -        Features["avx2"] = Features["avx-512"] = Features["fma"] =
> -        Features["fma4"] = Features["xop"] = false;
> -    else if (Name == "ssse3")
> -      Features["ssse3"] = Features["sse41"] = Features["sse42"] =
> -        Features["avx"] = Features["avx2"] = Features["avx-512"] =
> -        Features["fma"] = false;
> -    else if (Name == "sse4" || Name == "sse4.1")
> -      Features["sse41"] = Features["sse42"] = Features["avx"] =
> -        Features["avx2"] = Features["avx-512"] = Features["fma"] = false;
> -    else if (Name == "sse4.2")
> -      Features["sse42"] = Features["avx"] = Features["avx2"] =
> -        Features["avx-512"] = Features["fma"] = false;
> -    else if (Name == "3dnow")
> -      Features["3dnow"] = Features["3dnowa"] = false;
> -    else if (Name == "3dnowa")
> -      Features["3dnowa"] = false;
> -    else if (Name == "aes")
> -      Features["aes"] = false;
> -    else if (Name == "pclmul")
> -      Features["pclmul"] = false;
> -    else if (Name == "avx")
> -      Features["avx"] = Features["avx2"] = Features["avx-512"] =
> -        Features["fma"] = Features["fma4"] = Features["xop"] = false;
> -    else if (Name == "avx2")
> -      Features["avx2"] = Features["avx-512"] = false;
> -    else if (Name == "avx-512")
> -      Features["avx-512"] = false;
> -    else if (Name == "fma")
> -      Features["fma"] = false;
> -    else if (Name == "sse4a")
> -      Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
> -    else if (Name == "lzcnt")
> -      Features["lzcnt"] = false;
> -    else if (Name == "rdrnd")
> -      Features["rdrand"] = false;
> -    else if (Name == "bmi")
> -      Features["bmi"] = false;
> -    else if (Name == "bmi2")
> -      Features["bmi2"] = false;
> -    else if (Name == "popcnt")
> -      Features["popcnt"] = false;
> -    else if (Name == "fma4")
> -      Features["fma4"] = Features["xop"] = false;
> -    else if (Name == "xop")
> -      Features["xop"] = false;
> -    else if (Name == "f16c")
> -      Features["f16c"] = false;
> -    else if (Name == "rtm")
> -      Features["rtm"] = false;
> -    else if (Name == "prfchw")
> -      Features["prfchw"] = false;
> -    else if (Name == "rdseed")
> -      Features["rdseed"] = false;
> +  if (Name == "mmx")
> +    setMMXLevel(Features, MMX, Enabled);
> +  else if (Name == "sse")
> +    setSSELevel(Features, SSE1, Enabled);
> +  else if (Name == "sse2")
> +    setSSELevel(Features, SSE2, Enabled);
> +  else if (Name == "sse3")
> +    setSSELevel(Features, SSE3, Enabled);
> +  else if (Name == "ssse3")
> +    setSSELevel(Features, SSSE3, Enabled);
> +  else if (Name == "sse42")
> +    setSSELevel(Features, SSE42, Enabled);
> +  else if (Name == "sse41")
> +    setSSELevel(Features, SSE41, Enabled);
> +  else if (Name == "3dnow")
> +    setMMXLevel(Features, AMD3DNow, Enabled);
> +  else if (Name == "3dnowa")
> +    setMMXLevel(Features, AMD3DNowAthlon, Enabled);
> +  else if (Name == "aes") {
> +    if (Enabled)
> +      setSSELevel(Features, SSE2, Enabled);
> +  } else if (Name == "pclmul") {
> +    if (Enabled)
> +      setSSELevel(Features, SSE2, Enabled);
> +  } else if (Name == "avx")
> +    setSSELevel(Features, AVX, Enabled);
> +  else if (Name == "avx2")
> +    setSSELevel(Features, AVX2, Enabled);
> +  else if (Name == "avx-512")
> +    setSSELevel(Features, AVX512, Enabled);
> +  else if (Name == "fma") {
> +    if (Enabled)
> +      setSSELevel(Features, AVX, Enabled);
> +  } else if (Name == "fma4") {
> +    setXOPLevel(Features, FMA4, Enabled);
> +  } else if (Name == "xop") {
> +    setXOPLevel(Features, XOP, Enabled);
> +  } else if (Name == "sse4a") {
> +    setXOPLevel(Features, SSE4A, Enabled);
>    }
>
>    return true;
> @@ -2345,26 +2360,11 @@ void X86TargetInfo::HandleTargetFeatures
>        continue;
>      }
>
> -    if (Feature == "sse4a") {
> -      HasSSE4a = true;
> -      continue;
> -    }
> -
> -    if (Feature == "fma4") {
> -      HasFMA4 = true;
> -      continue;
> -    }
> -
>      if (Feature == "fma") {
>        HasFMA = true;
>        continue;
>      }
>
> -    if (Feature == "xop") {
> -      HasXOP = true;
> -      continue;
> -    }
> -
>      if (Feature == "f16c") {
>        HasF16C = true;
>        continue;
> @@ -2390,8 +2390,14 @@ void X86TargetInfo::HandleTargetFeatures
>          .Case("3dnow", AMD3DNow)
>          .Case("mmx", MMX)
>          .Default(NoMMX3DNow);
> -
>      MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
> +
> +    XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
> +        .Case("xop", XOP)
> +        .Case("fma4", FMA4)
> +        .Case("sse4a", SSE4A)
> +        .Default(NoXOP);
> +    XOPLevel = std::max(XOPLevel, XLevel);
>    }
>
>    // Don't tell the backend if we're turning off mmx; it will end up
> disabling
> @@ -2582,18 +2588,20 @@ void X86TargetInfo::getTargetDefines(con
>    if (HasRDSEED)
>      Builder.defineMacro("__RDSEED__");
>
> -  if (HasSSE4a)
> -    Builder.defineMacro("__SSE4A__");
> -
> -  if (HasFMA4)
> +  switch (XOPLevel) {
> +  case XOP:
> +    Builder.defineMacro("__XOP__");
> +  case FMA4:
>      Builder.defineMacro("__FMA4__");
> +  case SSE4A:
> +    Builder.defineMacro("__SSE4A__");
> +  case NoXOP:
> +    break;
> +  }
>
>    if (HasFMA)
>      Builder.defineMacro("__FMA__");
>
> -  if (HasXOP)
> -    Builder.defineMacro("__XOP__");
> -
>    if (HasF16C)
>      Builder.defineMacro("__F16C__");
>
> @@ -2673,7 +2681,7 @@ bool X86TargetInfo::hasFeature(StringRef
>        .Case("bmi", HasBMI)
>        .Case("bmi2", HasBMI2)
>        .Case("fma", HasFMA)
> -      .Case("fma4", HasFMA4)
> +      .Case("fma4", XOPLevel >= FMA4)
>        .Case("lzcnt", HasLZCNT)
>        .Case("rdrnd", HasRDRND)
>        .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
> @@ -2690,11 +2698,11 @@ bool X86TargetInfo::hasFeature(StringRef
>        .Case("ssse3", SSELevel >= SSSE3)
>        .Case("sse41", SSELevel >= SSE41)
>        .Case("sse42", SSELevel >= SSE42)
> -      .Case("sse4a", HasSSE4a)
> +      .Case("sse4a", XOPLevel >= SSE4A)
>        .Case("x86", true)
>        .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
>        .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
> -      .Case("xop", HasXOP)
> +      .Case("xop", XOPLevel >= XOP)
>        .Case("f16c", HasF16C)
>        .Default(false);
>  }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



-- 
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130820/923651c1/attachment.html>


More information about the cfe-commits mailing list