[llvm-commits] CVS: llvm/lib/Target/X86/X86.h X86.td X86ISelDAGToDAG.cpp X86ISelLowering.cpp X86ISelLowering.h X86ISelPattern.cpp X86InstrInfo.td X86Subtarget.cpp X86Subtarget.h X86TargetMachine.cpp
Evan Cheng
evan.cheng at apple.com
Fri Jan 27 00:10:58 PST 2006
Changes in directory llvm/lib/Target/X86:
X86.h updated: 1.40 -> 1.41
X86.td updated: 1.18 -> 1.19
X86ISelDAGToDAG.cpp updated: 1.36 -> 1.37
X86ISelLowering.cpp updated: 1.58 -> 1.59
X86ISelLowering.h updated: 1.16 -> 1.17
X86ISelPattern.cpp updated: 1.201 -> 1.202
X86InstrInfo.td updated: 1.219 -> 1.220
X86Subtarget.cpp updated: 1.9 -> 1.10
X86Subtarget.h updated: 1.8 -> 1.9
X86TargetMachine.cpp updated: 1.98 -> 1.99
---
Log message:
x86 CPU detection and proper subtarget support
---
Diffs of the changes: (+135 -129)
X86.h | 6 --
X86.td | 50 ++++++++++++------------
X86ISelDAGToDAG.cpp | 2
X86ISelLowering.cpp | 7 ++-
X86ISelLowering.h | 8 +++
X86ISelPattern.cpp | 4 +
X86InstrInfo.td | 8 +--
X86Subtarget.cpp | 105 ++++++++++++++++++++++++++++++---------------------
X86Subtarget.h | 37 +++++++++++------
X86TargetMachine.cpp | 37 -----------------
10 files changed, 135 insertions(+), 129 deletions(-)
Index: llvm/lib/Target/X86/X86.h
diff -u llvm/lib/Target/X86/X86.h:1.40 llvm/lib/Target/X86/X86.h:1.41
--- llvm/lib/Target/X86/X86.h:1.40 Thu Jan 26 03:53:06 2006
+++ llvm/lib/Target/X86/X86.h Fri Jan 27 02:10:46 2006
@@ -25,12 +25,6 @@
class IntrinsicLowering;
class MachineCodeEmitter;
-enum X86VectorEnum {
- AutoDetect, NoSSE, SSE, SSE2, SSE3
-};
-
-extern X86VectorEnum X86Vector;
-extern bool X86ScalarSSE;
extern bool X86DAGIsel;
/// createX86ISelPattern - This pass converts an LLVM function into a
Index: llvm/lib/Target/X86/X86.td
diff -u llvm/lib/Target/X86/X86.td:1.18 llvm/lib/Target/X86/X86.td:1.19
--- llvm/lib/Target/X86/X86.td:1.18 Thu Jan 26 19:46:15 2006
+++ llvm/lib/Target/X86/X86.td Fri Jan 27 02:10:46 2006
@@ -20,19 +20,19 @@
// X86 Subtarget features.
//
-def Feature64Bit : SubtargetFeature<"64bit", "bool", "Is64Bit",
- "Enable 64-bit instructions">;
-def FeatureMMX : SubtargetFeature<"mmx", "bool", "HasMMX",
+def Feature64Bit : SubtargetFeature<"64bit", "Is64Bit", "true",
+ "Enabl e 64-bit instructions">;
+def FeatureMMX : SubtargetFeature<"mmx","X86SSELevel", "MMX",
"Enable MMX instructions">;
-def FeatureSSE : SubtargetFeature<"sse", "bool", "HasSSE",
+def FeatureSSE : SubtargetFeature<"sse", "X86SSELevel", "SSE",
"Enable SSE instructions">;
-def FeatureSSE2 : SubtargetFeature<"sse2", "bool", "HasSSE2",
+def FeatureSSE2 : SubtargetFeature<"sse2", "X86SSELevel", "SSE2",
"Enable SSE2 instructions">;
-def FeatureSSE3 : SubtargetFeature<"sse3", "bool", "HasSSE3",
+def FeatureSSE3 : SubtargetFeature<"sse3", "X86SSELevel", "SSE3",
"Enable SSE3 instructions">;
-def Feature3DNow : SubtargetFeature<"3dnow", "bool", "Has3DNow",
+def Feature3DNow : SubtargetFeature<"3dnow", "X863DNowLevel", "ThreeDNow",
"Enable 3DNow! instructions">;
-def Feature3DNowA : SubtargetFeature<"3dnowa", "bool", "Has3DNowA",
+def Feature3DNowA : SubtargetFeature<"3dnowa", "X863DNowLevel", "ThreeDNowA",
"Enable 3DNow! Athlon instructions">;
//===----------------------------------------------------------------------===//
@@ -45,21 +45,20 @@
def : Proc<"generic", []>;
def : Proc<"i386", []>;
def : Proc<"i486", []>;
-def : Proc<"i586", []>;
def : Proc<"pentium", []>;
def : Proc<"pentium-mmx", [FeatureMMX]>;
def : Proc<"i686", []>;
def : Proc<"pentiumpro", []>;
def : Proc<"pentium2", [FeatureMMX]>;
-def : Proc<"celeron", [FeatureMMX]>;
def : Proc<"pentium3", [FeatureMMX, FeatureSSE]>;
-def : Proc<"pentium3m", [FeatureMMX, FeatureSSE]>;
def : Proc<"pentium-m", [FeatureMMX, FeatureSSE, FeatureSSE2]>;
def : Proc<"pentium4", [FeatureMMX, FeatureSSE, FeatureSSE2]>;
-def : Proc<"pentium4m", [FeatureMMX, FeatureSSE, FeatureSSE2]>;
+def : Proc<"x86-64", [FeatureMMX, FeatureSSE, FeatureSSE2,
+ Feature64Bit]>;
+def : Proc<"yonah", [FeatureMMX, FeatureSSE, FeatureSSE2,
+ FeatureSSE3]>;
def : Proc<"prescott", [FeatureMMX, FeatureSSE, FeatureSSE2,
FeatureSSE3]>;
-def : Proc<"x86-64", [FeatureMMX, FeatureSSE, FeatureSSE2, Feature64Bit]>;
def : Proc<"nocona", [FeatureMMX, FeatureSSE, FeatureSSE2,
FeatureSSE3, Feature64Bit]>;
@@ -68,17 +67,20 @@
def : Proc<"k6-3", [FeatureMMX, Feature3DNow]>;
def : Proc<"athlon", [FeatureMMX, Feature3DNow, Feature3DNowA]>;
def : Proc<"athlon-tbird", [FeatureMMX, Feature3DNow, Feature3DNowA]>;
-def : Proc<"athlon-4", [FeatureMMX, FeatureSSE, Feature3DNow, Feature3DNowA]>;
-def : Proc<"athlon-xp", [FeatureMMX, FeatureSSE, Feature3DNow, Feature3DNowA]>;
-def : Proc<"athlon-mp", [FeatureMMX, FeatureSSE, Feature3DNow, Feature3DNowA]>;
-def : Proc<"k8", [FeatureMMX, FeatureSSE, FeatureSSE2, Feature3DNow,
- Feature3DNowA, Feature64Bit]>;
-def : Proc<"opteron", [FeatureMMX, FeatureSSE, FeatureSSE2, Feature3DNow,
- Feature3DNowA, Feature64Bit]>;
-def : Proc<"athlon64", [FeatureMMX, FeatureSSE, FeatureSSE2, Feature3DNow,
- Feature3DNowA, Feature64Bit]>;
-def : Proc<"athlon-fx", [FeatureMMX, FeatureSSE, FeatureSSE2, Feature3DNow,
- Feature3DNowA, Feature64Bit]>;
+def : Proc<"athlon-4", [FeatureMMX, FeatureSSE, Feature3DNow,
+ Feature3DNowA]>;
+def : Proc<"athlon-xp", [FeatureMMX, FeatureSSE, Feature3DNow,
+ Feature3DNowA]>;
+def : Proc<"athlon-mp", [FeatureMMX, FeatureSSE, Feature3DNow,
+ Feature3DNowA]>;
+def : Proc<"k8", [FeatureMMX, FeatureSSE, FeatureSSE2,
+ Feature3DNow, Feature3DNowA, Feature64Bit]>;
+def : Proc<"opteron", [FeatureMMX, FeatureSSE, FeatureSSE2,
+ Feature3DNow, Feature3DNowA, Feature64Bit]>;
+def : Proc<"athlon64", [FeatureMMX, FeatureSSE, FeatureSSE2,
+ Feature3DNow, Feature3DNowA, Feature64Bit]>;
+def : Proc<"athlon-fx", [FeatureMMX, FeatureSSE, FeatureSSE2,
+ Feature3DNow, Feature3DNowA, Feature64Bit]>;
def : Proc<"winchip-c6", [FeatureMMX]>;
def : Proc<"winchip2", [FeatureMMX, Feature3DNow]>;
Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.36 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.37
--- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.36 Sun Jan 22 17:37:17 2006
+++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Fri Jan 27 02:10:46 2006
@@ -161,7 +161,7 @@
// If we are emitting FP stack code, scan the basic block to determine if this
// block defines any FP values. If so, put an FP_REG_KILL instruction before
// the terminator of the block.
- if (X86Vector < SSE2) {
+ if (!Subtarget->hasSSE2()) {
// Note that FP stack instructions *are* used in SSE code when returning
// values, but these are not live out of the basic block, so we don't need
// an FP_REG_KILL in this case either.
Index: llvm/lib/Target/X86/X86ISelLowering.cpp
diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.58 llvm/lib/Target/X86/X86ISelLowering.cpp:1.59
--- llvm/lib/Target/X86/X86ISelLowering.cpp:1.58 Wed Jan 25 20:13:10 2006
+++ llvm/lib/Target/X86/X86ISelLowering.cpp Fri Jan 27 02:10:46 2006
@@ -33,6 +33,9 @@
X86TargetLowering::X86TargetLowering(TargetMachine &TM)
: TargetLowering(TM) {
+ Subtarget = &TM.getSubtarget<X86Subtarget>();
+ X86ScalarSSE = Subtarget->hasSSE2();
+
// Set up the TargetLowering object.
// X86 is weird, it always uses i8 for shift amounts and setcc results.
@@ -1657,8 +1660,8 @@
case ISD::SELECT: {
MVT::ValueType VT = Op.getValueType();
bool isFP = MVT::isFloatingPoint(VT);
- bool isFPStack = isFP && (X86Vector < SSE2);
- bool isFPSSE = isFP && (X86Vector >= SSE2);
+ bool isFPStack = isFP && !X86ScalarSSE;
+ bool isFPSSE = isFP && X86ScalarSSE;
bool addTest = false;
SDOperand Op0 = Op.getOperand(0);
SDOperand Cond, CC;
Index: llvm/lib/Target/X86/X86ISelLowering.h
diff -u llvm/lib/Target/X86/X86ISelLowering.h:1.16 llvm/lib/Target/X86/X86ISelLowering.h:1.17
--- llvm/lib/Target/X86/X86ISelLowering.h:1.16 Wed Jan 25 12:21:52 2006
+++ llvm/lib/Target/X86/X86ISelLowering.h Fri Jan 27 02:10:46 2006
@@ -15,6 +15,7 @@
#ifndef X86ISELLOWERING_H
#define X86ISELLOWERING_H
+#include "X86Subtarget.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/CodeGen/SelectionDAG.h"
@@ -227,6 +228,13 @@
std::pair<SDOperand, SDOperand>
LowerFastCCCallTo(SDOperand Chain, const Type *RetTy, bool isTailCall,
SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG);
+
+ /// Subtarget - Keep a pointer to the X86Subtarget around so that we can
+ /// make the right decision when generating code for different targets.
+ const X86Subtarget *Subtarget;
+
+ /// X86ScalarSSE - Select between SSE2 or x87 floating point ops.
+ bool X86ScalarSSE;
};
}
Index: llvm/lib/Target/X86/X86ISelPattern.cpp
diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.201 llvm/lib/Target/X86/X86ISelPattern.cpp:1.202
--- llvm/lib/Target/X86/X86ISelPattern.cpp:1.201 Wed Jan 25 02:00:36 2006
+++ llvm/lib/Target/X86/X86ISelPattern.cpp Fri Jan 27 02:10:46 2006
@@ -101,9 +101,13 @@
/// Subtarget - Keep a pointer to the X86Subtarget around so that we can
/// make the right decision when generating code for different targets.
const X86Subtarget *Subtarget;
+
+ /// X86ScalarSSE - Select between SSE2 or x87 floating point ops.
+ bool X86ScalarSSE;
public:
ISel(TargetMachine &TM) : SelectionDAGISel(X86Lowering), X86Lowering(TM) {
Subtarget = &TM.getSubtarget<X86Subtarget>();
+ X86ScalarSSE = Subtarget->hasSSE2();
}
virtual const char *getPassName() const {
Index: llvm/lib/Target/X86/X86InstrInfo.td
diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.219 llvm/lib/Target/X86/X86InstrInfo.td:1.220
--- llvm/lib/Target/X86/X86InstrInfo.td:1.219 Thu Jan 26 19:46:15 2006
+++ llvm/lib/Target/X86/X86InstrInfo.td Fri Jan 27 02:10:46 2006
@@ -189,10 +189,10 @@
//===----------------------------------------------------------------------===//
// X86 Instruction Predicate Definitions.
-def HasSSE1 : Predicate<"X86Vector >= SSE">;
-def HasSSE2 : Predicate<"X86Vector >= SSE2">;
-def HasSSE3 : Predicate<"X86Vector >= SSE3">;
-def FPStack : Predicate<"X86Vector < SSE2">;
+def HasSSE1 : Predicate<"Subtarget->hasSSE()">;
+def HasSSE2 : Predicate<"Subtarget->hasSSE2()">;
+def HasSSE3 : Predicate<"Subtarget->hasSSE3()">;
+def FPStack : Predicate<"!Subtarget->hasSSE2()">;
//===----------------------------------------------------------------------===//
// X86 specific pattern fragments.
Index: llvm/lib/Target/X86/X86Subtarget.cpp
diff -u llvm/lib/Target/X86/X86Subtarget.cpp:1.9 llvm/lib/Target/X86/X86Subtarget.cpp:1.10
--- llvm/lib/Target/X86/X86Subtarget.cpp:1.9 Thu Jan 26 03:53:06 2006
+++ llvm/lib/Target/X86/X86Subtarget.cpp Fri Jan 27 02:10:46 2006
@@ -16,57 +16,78 @@
#include "X86GenSubtarget.inc"
using namespace llvm;
-#if defined(__APPLE__)
-#include <mach/mach.h>
-#include <mach/mach_host.h>
-#include <mach/host_info.h>
-#include <mach/machine.h>
+static void GetCpuIDAndInfo(unsigned value, unsigned *EAX, unsigned *EBX,
+ unsigned *ECX, unsigned *EDX) {
+#if defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
+#if defined(__GNUC__)
+ asm ("pushl\t%%ebx\n\t"
+ "cpuid\n\t"
+ "popl\t%%ebx"
+ : "=a" (*EAX),
+#if !defined(__DYNAMIC__) // This works around a gcc -fPIC bug
+ "=b" (*EBX),
+#endif
+ "=c" (*ECX),
+ "=d" (*EDX)
+ : "a" (value));
+#endif
+#endif
+}
-/// GetCurrentX86CPU - Returns the current CPUs features.
static const char *GetCurrentX86CPU() {
- host_basic_info_data_t hostInfo;
- mach_msg_type_number_t infoCount;
-
- infoCount = HOST_BASIC_INFO_COUNT;
- host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo,
- &infoCount);
-
- if (hostInfo.cpu_type != CPU_TYPE_I386) return "generic";
-
- switch(hostInfo.cpu_subtype) {
- case CPU_SUBTYPE_386: return "i386";
- case CPU_SUBTYPE_486:
- case CPU_SUBTYPE_486SX: return "i486";
- case CPU_SUBTYPE_PENT: return "pentium";
- case CPU_SUBTYPE_PENTPRO: return "pentiumpro";
- case CPU_SUBTYPE_PENTII_M3: return "pentium2";
- case CPU_SUBTYPE_PENTII_M5: return "pentium2";
- case CPU_SUBTYPE_CELERON:
- case CPU_SUBTYPE_CELERON_MOBILE: return "celeron";
- case CPU_SUBTYPE_PENTIUM_3: return "pentium3";
- case CPU_SUBTYPE_PENTIUM_3_M: return "pentium3m";
- case CPU_SUBTYPE_PENTIUM_3_XEON: return "pentium3"; // FIXME: not sure.
- case CPU_SUBTYPE_PENTIUM_M: return "pentium-m";
- case CPU_SUBTYPE_PENTIUM_4: return "pentium4";
- case CPU_SUBTYPE_PENTIUM_4_M: return "pentium4m";
- // FIXME: prescott, yonah? Check CPU_THREADTYPE_INTEL_HTT?
- case CPU_SUBTYPE_XEON:
- case CPU_SUBTYPE_XEON_MP: return "nocona";
- default: ;
+ unsigned EAX = 0, DUMMY = 0, ECX = 0, EDX = 0;
+ GetCpuIDAndInfo(0x1, &EAX, &DUMMY, &ECX, &EDX);
+ unsigned Family = (EAX & (0xffffffff >> (32 - 4)) << 8) >> 8; // Bits 8 - 11
+ unsigned Model = (EAX & (0xffffffff >> (32 - 4)) << 4) >> 4; // Bits 4 - 7
+ GetCpuIDAndInfo(0x80000001, &EAX, &DUMMY, &ECX, &EDX);
+ bool Em64T = EDX & (1 << 29);
+
+ switch (Family) {
+ case 3:
+ return "i386";
+ case 4:
+ return "i486";
+ case 5:
+ switch (Model) {
+ case 4: return "pentium-mmx";
+ default: return "pentium";
+ }
+ break;
+ case 6:
+ switch (Model) {
+ case 1: return "pentiumpro";
+ case 3:
+ case 5:
+ case 6: return "pentium2";
+ case 7:
+ case 8:
+ case 10:
+ case 11: return "pentium3";
+ case 9:
+ case 13: return "pentium-m";
+ case 14: return "yonah";
+ default: return "i686";
+ }
+ case 15: {
+ switch (Model) {
+ case 3:
+ case 4:
+ return (Em64T) ? "nocona" : "prescott";
+ default:
+ return (Em64T) ? "x86-64" : "pentium4";
+ }
+ }
+
+ default:
+ return "generic";
}
-
- return "generic";
}
-#endif
X86Subtarget::X86Subtarget(const Module &M, const std::string &FS)
: stackAlignment(8), indirectExternAndWeakGlobals(false) {
// Determine default and user specified characteristics
- std::string CPU = "generic";
-#if defined(__APPLE__)
- CPU = GetCurrentX86CPU();
-#endif
+ std::string CPU = GetCurrentX86CPU();
// Parse features string.
ParseSubtargetFeatures(FS, CPU);
Index: llvm/lib/Target/X86/X86Subtarget.h
diff -u llvm/lib/Target/X86/X86Subtarget.h:1.8 llvm/lib/Target/X86/X86Subtarget.h:1.9
--- llvm/lib/Target/X86/X86Subtarget.h:1.8 Thu Jan 26 03:53:06 2006
+++ llvm/lib/Target/X86/X86Subtarget.h Fri Jan 27 02:10:46 2006
@@ -23,6 +23,23 @@
class X86Subtarget : public TargetSubtarget {
protected:
+ enum X86SSEEnum {
+ NoMMXSSE, MMX, SSE, SSE2, SSE3
+ };
+
+ enum X863DNowEnum {
+ NoThreeDNow, ThreeDNow, ThreeDNowA
+ };
+
+ /// X86SSELevel - MMX, SSE, SSE2, SSE3, or none supported.
+ X86SSEEnum X86SSELevel;
+
+ /// X863DNowLevel - 3DNow or 3DNow Athlon, or none supported.
+ X863DNowEnum X863DNowLevel;
+
+ /// Is64Bit - True if the processor supports Em64T.
+ bool Is64Bit;
+
/// stackAlignment - The minimum alignment known to hold of the stack frame on
/// entry to the function and which must be maintained by every function.
unsigned stackAlignment;
@@ -30,14 +47,6 @@
/// Used by instruction selector
bool indirectExternAndWeakGlobals;
- /// Arch. features used by isel.
- bool Is64Bit;
- bool HasMMX;
- bool HasSSE;
- bool HasSSE2;
- bool HasSSE3;
- bool Has3DNow;
- bool Has3DNowA;
public:
enum {
isELF, isCygwin, isDarwin, isWindows
@@ -66,12 +75,12 @@
bool is64Bit() const { return Is64Bit; }
- bool hasMMX() const { return HasMMX; }
- bool hasSSE() const { return HasSSE; }
- bool hasSSE2() const { return HasSSE2; }
- bool hasSSE3() const { return HasSSE3; }
- bool has3DNow() const { return Has3DNow; }
- bool has3DNowA() const { return Has3DNowA; }
+ bool hasMMX() const { return X86SSELevel >= MMX; }
+ bool hasSSE() const { return X86SSELevel >= SSE; }
+ bool hasSSE2() const { return X86SSELevel >= SSE2; }
+ bool hasSSE3() const { return X86SSELevel >= SSE3; }
+ bool has3DNow() const { return X863DNowLevel >= ThreeDNow; }
+ bool has3DNowA() const { return X863DNowLevel >= ThreeDNowA; }
};
} // End llvm namespace
Index: llvm/lib/Target/X86/X86TargetMachine.cpp
diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.98 llvm/lib/Target/X86/X86TargetMachine.cpp:1.99
--- llvm/lib/Target/X86/X86TargetMachine.cpp:1.98 Thu Jan 26 03:53:06 2006
+++ llvm/lib/Target/X86/X86TargetMachine.cpp Fri Jan 27 02:10:46 2006
@@ -26,8 +26,6 @@
#include <iostream>
using namespace llvm;
-X86VectorEnum llvm::X86Vector = AutoDetect;
-bool llvm::X86ScalarSSE = false;
bool llvm::X86DAGIsel = false;
/// X86TargetMachineModule - Note that this is used on hosts that cannot link
@@ -41,28 +39,11 @@
cl::opt<bool> DisableOutput("disable-x86-llc-output", cl::Hidden,
cl::desc("Disable the X86 asm printer, for use "
"when profiling the code generator."));
- cl::opt<bool, true> EnableSSEFP("enable-sse-scalar-fp",
- cl::desc("Perform FP math in SSE regs instead of the FP stack"),
- cl::location(X86ScalarSSE),
- cl::init(false));
-
cl::opt<bool, true> EnableX86DAGDAG("enable-x86-dag-isel", cl::Hidden,
cl::desc("Enable DAG-to-DAG isel for X86"),
cl::location(X86DAGIsel),
cl::init(false));
- // FIXME: This should eventually be handled with target triples and
- // subtarget support!
- cl::opt<X86VectorEnum, true>
- SSEArg(
- cl::desc("Enable SSE support in the X86 target:"),
- cl::values(
- clEnumValN(SSE, "sse", " Enable SSE support"),
- clEnumValN(SSE2, "sse2", " Enable SSE and SSE2 support"),
- clEnumValN(SSE3, "sse3", " Enable SSE, SSE2, and SSE3 support"),
- clEnumValEnd),
- cl::location(X86Vector), cl::init(AutoDetect));
-
// Register the target.
RegisterTarget<X86TargetMachine> X("x86", " IA-32 (Pentium and above)");
}
@@ -101,23 +82,7 @@
Subtarget(M, FS),
FrameInfo(TargetFrameInfo::StackGrowsDown,
Subtarget.getStackAlignment(), -4),
- JITInfo(*this) {
- if (X86Vector == AutoDetect) {
- X86Vector = NoSSE;
- if (Subtarget.hasSSE())
- X86Vector = SSE;
- if (Subtarget.hasSSE2())
- X86Vector = SSE2;
- if (Subtarget.hasSSE3())
- X86Vector = SSE3;
- }
-
- // Scalar SSE FP requires at least SSE2
- X86ScalarSSE &= X86Vector >= SSE2;
-
- // Ignore -enable-sse-scalar-fp if -enable-x86-dag-isel.
- X86ScalarSSE |= (X86DAGIsel && X86Vector >= SSE2);
-}
+ JITInfo(*this) {}
// addPassesToEmitFile - We currently use all of the same passes as the JIT
More information about the llvm-commits
mailing list