diff options
Diffstat (limited to 'llvm/lib')
6 files changed, 20 insertions, 6 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.td b/llvm/lib/Target/WebAssembly/WebAssembly.td index 99cf1f119a2..76b3ddbbfff 100644 --- a/llvm/lib/Target/WebAssembly/WebAssembly.td +++ b/llvm/lib/Target/WebAssembly/WebAssembly.td @@ -32,6 +32,11 @@ def FeatureNontrappingFPToInt : "HasNontrappingFPToInt", "true", "Enable non-trapping float-to-int conversion operators">; +def FeatureSignExt : + SubtargetFeature<"sign-ext", + "HasSignExt", "true", + "Enable sign extension operators">; + //===----------------------------------------------------------------------===// // Architectures. //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index 299009fa667..d0b3ad37119 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -117,8 +117,7 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering( // As a special case, these operators use the type to mean the type to // sign-extend from. setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand); - if (!Subtarget->hasAtomics()) { - // The Atomics feature includes signext intructions. + if (!Subtarget->hasSignExt()) { for (auto T : {MVT::i8, MVT::i16, MVT::i32}) setOperationAction(ISD::SIGN_EXTEND_INREG, T, Expand); } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrConv.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrConv.td index 426c2c80217..bf1282b5edf 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrConv.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrConv.td @@ -26,7 +26,7 @@ def I64_EXTEND_U_I32 : I<(outs I64:$dst), (ins I32:$src), [(set I64:$dst, (zext I32:$src))], "i64.extend_u/i32\t$dst, $src", 0xad>; -let Predicates = [HasAtomics] in { +let Predicates = [HasSignExt] in { def I32_EXTEND8_S_I32 : I<(outs I32:$dst), (ins I32:$src), [(set I32:$dst, (sext_inreg I32:$src, i8))], "i32.extend8_s\t$dst, $src", 0xc0>; @@ -42,7 +42,7 @@ def I64_EXTEND16_S_I64 : I<(outs I64:$dst), (ins I64:$src), def I64_EXTEND32_S_I64 : I<(outs I64:$dst), (ins I64:$src), [(set I64:$dst, (sext_inreg I64:$src, i32))], "i64.extend32_s\t$dst, $src", 0xc4>; -} // Predicates = [HasAtomics] +} // Predicates = [HasSignExt] } // defs = [ARGUMENTS] diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td index f8d311ac3b0..245d5abbf26 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td @@ -30,6 +30,14 @@ def NotHasNontrappingFPToInt : Predicate<"!Subtarget->hasNontrappingFPToInt()">, AssemblerPredicate<"!FeatureNontrappingFPToInt", "nontrapping-fptoint">; +def HasSignExt : + Predicate<"Subtarget->hasSignExt()">, + AssemblerPredicate<"FeatureSignExt", + "sign-ext">; +def NotHasSignExt : + Predicate<"!Subtarget->hasSignExt()">, + AssemblerPredicate<"!FeatureSignExt", + "sign-ext">; //===----------------------------------------------------------------------===// // WebAssembly-specific DAG Node Types. diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp index 9e122a5f157..78602a35e64 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp @@ -41,8 +41,8 @@ WebAssemblySubtarget::WebAssemblySubtarget(const Triple &TT, const std::string &FS, const TargetMachine &TM) : WebAssemblyGenSubtargetInfo(TT, CPU, FS), HasSIMD128(false), - HasAtomics(false), HasNontrappingFPToInt(false), CPUString(CPU), - TargetTriple(TT), FrameLowering(), + HasAtomics(false), HasNontrappingFPToInt(false), HasSignExt(false), + CPUString(CPU), TargetTriple(TT), FrameLowering(), InstrInfo(initializeSubtargetDependencies(FS)), TSInfo(), TLInfo(TM, *this) {} diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h index a6bf0b6d54f..c999f501a9c 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h @@ -32,6 +32,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool HasSIMD128; bool HasAtomics; bool HasNontrappingFPToInt; + bool HasSignExt; /// String name of used CPU. std::string CPUString; @@ -78,6 +79,7 @@ public: bool hasSIMD128() const { return HasSIMD128; } bool hasAtomics() const { return HasAtomics; } bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } + bool hasSignExt() const { return HasSignExt; } /// Parses features string setting specified subtarget options. Definition of /// function is auto generated by tblgen. |