<div dir="ltr">Shouldn't setXOPLevel be passed FMA4 instead of SSE4A here? I think this causes AVX disable to disable SSE4A.<div><br></div><div><div>  case AVX:</div><div>    Features["fma"] = Features["avx"] = false;</div>
<div>    setXOPLevel(Features, SSE4A, false);</div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Aug 20, 2013 at 6:44 AM, Rafael Espindola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Tue Aug 20 08:44:29 2013<br>
New Revision: 188799<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=188799&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=188799&view=rev</a><br>
Log:<br>
Refactor the x86 feature handling.<br>
<br>
This removes the very long chains of<br>
Feature["avx"] = Feature["sse42"] = ... = true;<br>
<br>
Modified:<br>
    cfe/trunk/lib/Basic/Targets.cpp<br>
<br>
Modified: cfe/trunk/lib/Basic/Targets.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=188799&r1=188798&r2=188799&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=188799&r1=188798&r2=188799&view=diff</a><br>

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