Index: llvm/trunk/lib/Target/WebAssembly/WebAssembly.td =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssembly.td +++ llvm/trunk/lib/Target/WebAssembly/WebAssembly.td @@ -22,8 +22,8 @@ // WebAssembly Subtarget features. //===----------------------------------------------------------------------===// -def FeatureSIMD : SubtargetFeature<"simd", "HasSIMD", "true", - "Enable SIMD">; +def FeatureSIMD128 : SubtargetFeature<"simd128", "HasSIMD128", "false", + "Enable 128-bit SIMD">; //===----------------------------------------------------------------------===// // Architectures. @@ -47,7 +47,11 @@ // WebAssembly Processors supported. //===----------------------------------------------------------------------===// -def : ProcessorModel<"generic", NoSchedModel, [FeatureSIMD]>; +// Minimal Viable Product. +def : ProcessorModel<"mvp", NoSchedModel, []>; + +// Latest and greatest experimental version of WebAssembly. Bugs included! +def : ProcessorModel<"bleeding-edge", NoSchedModel, [FeatureSIMD128]>; //===----------------------------------------------------------------------===// // Target Declaration Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp @@ -32,7 +32,7 @@ #include "llvm/Support/Debug.h" using namespace llvm; -#define DEBUG_TYPE "frame-info" +#define DEBUG_TYPE "wasm-frame-info" // TODO: Implement a red zone? Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrAtomics.td =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrAtomics.td +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrAtomics.td @@ -11,6 +11,8 @@ // //===----------------------------------------------------------------------===// +// TODO: Implement atomic instructions. + //===----------------------------------------------------------------------===// // Atomic fences //===----------------------------------------------------------------------===// Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td @@ -15,6 +15,11 @@ // WebAssembly Instruction Predicate Definitions. //===----------------------------------------------------------------------===// +def HasAddr32 : Predicate<"!Subtarget->hasAddr64()">; +def HasAddr64 : Predicate<"Subtarget->hasAddr64()">; +def HasSIMD128 : Predicate<"Subtarget->hasSIMD128()">, + AssemblerPredicate<"FeatureSIMD128", "simd128">; + //===----------------------------------------------------------------------===// // WebAssembly-specific DAG Node Types. //===----------------------------------------------------------------------===// Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td @@ -12,4 +12,4 @@ //===----------------------------------------------------------------------===// // TODO: Implement SIMD instructions. -// Note: use Requires<[HasSIMD]>. +// Note: use Requires<[HasSIMD128]>. Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h @@ -29,7 +29,7 @@ namespace llvm { class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { - bool HasSIMD; + bool HasSIMD128; /// String name of used CPU. std::string CPUString; @@ -66,7 +66,8 @@ bool useAA() const override { return true; } // Predicates used by WebAssemblyInstrInfo.td. - bool hasSIMD() const { return HasSIMD; } + bool hasAddr64() const { return TargetTriple.isArch64Bit(); } + bool hasSIMD128() const { return HasSIMD128; } /// Parses features string setting specified subtarget options. Definition of /// function is auto generated by tblgen. Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.cpp @@ -19,7 +19,7 @@ #include "llvm/Support/TargetRegistry.h" using namespace llvm; -#define DEBUG_TYPE "subtarget" +#define DEBUG_TYPE "wasm-subtarget" #define GET_SUBTARGETINFO_CTOR #define GET_SUBTARGETINFO_TARGET_DESC @@ -40,8 +40,8 @@ const std::string &CPU, const std::string &FS, const TargetMachine &TM) - : WebAssemblyGenSubtargetInfo(TT, CPU, FS), HasSIMD(true), CPUString(CPU), - TargetTriple(TT), FrameLowering(), + : WebAssemblyGenSubtargetInfo(TT, CPU, FS), HasSIMD128(false), + CPUString(CPU), TargetTriple(TT), FrameLowering(), InstrInfo(initializeSubtargetDependencies(FS)), TSInfo(TM.getDataLayout()), TLInfo(TM, *this) {} Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -24,6 +24,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/Transforms/Scalar.h" using namespace llvm; #define DEBUG_TYPE "wasm" @@ -139,9 +140,14 @@ //===----------------------------------------------------------------------===// void WebAssemblyPassConfig::addIRPasses() { - // Expand some atomic operations. WebAssemblyTargetLowering has hooks which - // control specifically what gets lowered. - addPass(createAtomicExpandPass(&getTM())); + // FIXME: the default for this option is currently POSIX, whereas + // WebAssembly's MVP should default to Single. + if (TM->Options.ThreadModel == ThreadModel::Single) + addPass(createLowerAtomicPass()); + else + // Expand some atomic operations. WebAssemblyTargetLowering has hooks which + // control specifically what gets lowered. + addPass(createAtomicExpandPass(TM)); TargetPassConfig::addIRPasses(); }