diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 864da4e1157f7..5b79b066d384a 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4895,34 +4895,34 @@ def mharden_sls_EQ : Joined<["-"], "mharden-sls=">, Group, " blr(ARM/AArch64), comdat(ARM/AArch64), nocomdat(ARM/AArch64)," " return(X86), indirect-jmp(X86)">; -def msimd128 : Flag<["-"], "msimd128">, Group; -def mno_simd128 : Flag<["-"], "mno-simd128">, Group; -def mrelaxed_simd : Flag<["-"], "mrelaxed-simd">, Group; -def mno_relaxed_simd : Flag<["-"], "mno-relaxed-simd">, Group; -def mhalf_precision : Flag<["-"], "mhalf-precision">, Group; -def mno_half_precision : Flag<["-"], "mno-half-precision">, Group; -def mnontrapping_fptoint : Flag<["-"], "mnontrapping-fptoint">, Group; -def mno_nontrapping_fptoint : Flag<["-"], "mno-nontrapping-fptoint">, Group; -def msign_ext : Flag<["-"], "msign-ext">, Group; -def mno_sign_ext : Flag<["-"], "mno-sign-ext">, Group; -def mexception_handing : Flag<["-"], "mexception-handling">, Group; -def mno_exception_handing : Flag<["-"], "mno-exception-handling">, Group; def matomics : Flag<["-"], "matomics">, Group; def mno_atomics : Flag<["-"], "mno-atomics">, Group; def mbulk_memory : Flag<["-"], "mbulk-memory">, Group; def mno_bulk_memory : Flag<["-"], "mno-bulk-memory">, Group; -def mmutable_globals : Flag<["-"], "mmutable-globals">, Group; -def mno_mutable_globals : Flag<["-"], "mno-mutable-globals">, Group; -def mmultivalue : Flag<["-"], "mmultivalue">, Group; -def mno_multivalue : Flag<["-"], "mno-multivalue">, Group; -def mtail_call : Flag<["-"], "mtail-call">, Group; -def mno_tail_call : Flag<["-"], "mno-tail-call">, Group; -def mreference_types : Flag<["-"], "mreference-types">, Group; -def mno_reference_types : Flag<["-"], "mno-reference-types">, Group; +def mexception_handing : Flag<["-"], "mexception-handling">, Group; +def mno_exception_handing : Flag<["-"], "mno-exception-handling">, Group; def mextended_const : Flag<["-"], "mextended-const">, Group; def mno_extended_const : Flag<["-"], "mno-extended-const">, Group; +def mhalf_precision : Flag<["-"], "mhalf-precision">, Group; +def mno_half_precision : Flag<["-"], "mno-half-precision">, Group; def mmultimemory : Flag<["-"], "mmultimemory">, Group; def mno_multimemory : Flag<["-"], "mno-multimemory">, Group; +def mmultivalue : Flag<["-"], "mmultivalue">, Group; +def mno_multivalue : Flag<["-"], "mno-multivalue">, Group; +def mmutable_globals : Flag<["-"], "mmutable-globals">, Group; +def mno_mutable_globals : Flag<["-"], "mno-mutable-globals">, Group; +def mnontrapping_fptoint : Flag<["-"], "mnontrapping-fptoint">, Group; +def mno_nontrapping_fptoint : Flag<["-"], "mno-nontrapping-fptoint">, Group; +def mreference_types : Flag<["-"], "mreference-types">, Group; +def mno_reference_types : Flag<["-"], "mno-reference-types">, Group; +def mrelaxed_simd : Flag<["-"], "mrelaxed-simd">, Group; +def mno_relaxed_simd : Flag<["-"], "mno-relaxed-simd">, Group; +def msign_ext : Flag<["-"], "msign-ext">, Group; +def mno_sign_ext : Flag<["-"], "mno-sign-ext">, Group; +def msimd128 : Flag<["-"], "msimd128">, Group; +def mno_simd128 : Flag<["-"], "mno-simd128">, Group; +def mtail_call : Flag<["-"], "mtail-call">, Group; +def mno_tail_call : Flag<["-"], "mno-tail-call">, Group; def mexec_model_EQ : Joined<["-"], "mexec-model=">, Group, Values<"command,reactor">, HelpText<"Execution model (WebAssembly only)">, diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index 1f0418b21c1f8..b9c1f3c0f0e60 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -45,20 +45,20 @@ bool WebAssemblyTargetInfo::setABI(const std::string &Name) { bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const { return llvm::StringSwitch(Feature) - .Case("simd128", SIMDLevel >= SIMD128) - .Case("relaxed-simd", SIMDLevel >= RelaxedSIMD) + .Case("atomics", HasAtomics) + .Case("bulk-memory", HasBulkMemory) + .Case("exception-handling", HasExceptionHandling) + .Case("extended-const", HasExtendedConst) .Case("half-precision", HasHalfPrecision) + .Case("multimemory", HasMultiMemory) + .Case("multivalue", HasMultivalue) + .Case("mutable-globals", HasMutableGlobals) .Case("nontrapping-fptoint", HasNontrappingFPToInt) + .Case("reference-types", HasReferenceTypes) + .Case("relaxed-simd", SIMDLevel >= RelaxedSIMD) .Case("sign-ext", HasSignExt) - .Case("exception-handling", HasExceptionHandling) - .Case("bulk-memory", HasBulkMemory) - .Case("atomics", HasAtomics) - .Case("mutable-globals", HasMutableGlobals) - .Case("multivalue", HasMultivalue) + .Case("simd128", SIMDLevel >= SIMD128) .Case("tail-call", HasTailCall) - .Case("reference-types", HasReferenceTypes) - .Case("extended-const", HasExtendedConst) - .Case("multimemory", HasMultiMemory) .Default(false); } @@ -74,34 +74,34 @@ void WebAssemblyTargetInfo::fillValidCPUList( void WebAssemblyTargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { defineCPUMacros(Builder, "wasm", /*Tuning=*/false); - if (SIMDLevel >= SIMD128) - Builder.defineMacro("__wasm_simd128__"); - if (SIMDLevel >= RelaxedSIMD) - Builder.defineMacro("__wasm_relaxed_simd__"); - if (HasNontrappingFPToInt) - Builder.defineMacro("__wasm_nontrapping_fptoint__"); - if (HasSignExt) - Builder.defineMacro("__wasm_sign_ext__"); - if (HasExceptionHandling) - Builder.defineMacro("__wasm_exception_handling__"); - if (HasBulkMemory) - Builder.defineMacro("__wasm_bulk_memory__"); if (HasAtomics) Builder.defineMacro("__wasm_atomics__"); - if (HasMutableGlobals) - Builder.defineMacro("__wasm_mutable_globals__"); - if (HasMultivalue) - Builder.defineMacro("__wasm_multivalue__"); - if (HasTailCall) - Builder.defineMacro("__wasm_tail_call__"); - if (HasReferenceTypes) - Builder.defineMacro("__wasm_reference_types__"); + if (HasBulkMemory) + Builder.defineMacro("__wasm_bulk_memory__"); + if (HasExceptionHandling) + Builder.defineMacro("__wasm_exception_handling__"); if (HasExtendedConst) Builder.defineMacro("__wasm_extended_const__"); if (HasMultiMemory) Builder.defineMacro("__wasm_multimemory__"); if (HasHalfPrecision) Builder.defineMacro("__wasm_half_precision__"); + if (HasMultivalue) + Builder.defineMacro("__wasm_multivalue__"); + if (HasMutableGlobals) + Builder.defineMacro("__wasm_mutable_globals__"); + if (HasNontrappingFPToInt) + Builder.defineMacro("__wasm_nontrapping_fptoint__"); + if (HasReferenceTypes) + Builder.defineMacro("__wasm_reference_types__"); + if (SIMDLevel >= RelaxedSIMD) + Builder.defineMacro("__wasm_relaxed_simd__"); + if (HasSignExt) + Builder.defineMacro("__wasm_sign_ext__"); + if (SIMDLevel >= SIMD128) + Builder.defineMacro("__wasm_simd128__"); + if (HasTailCall) + Builder.defineMacro("__wasm_tail_call__"); Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); @@ -160,10 +160,10 @@ bool WebAssemblyTargetInfo::initFeatureMap( addGenericFeatures(); Features["atomics"] = true; Features["bulk-memory"] = true; + Features["half-precision"] = true; Features["multimemory"] = true; Features["nontrapping-fptoint"] = true; Features["tail-call"] = true; - Features["half-precision"] = true; setSIMDLevel(Features, SIMD128, true); }; if (CPU == "generic") { @@ -178,36 +178,20 @@ bool WebAssemblyTargetInfo::initFeatureMap( bool WebAssemblyTargetInfo::handleTargetFeatures( std::vector &Features, DiagnosticsEngine &Diags) { for (const auto &Feature : Features) { - if (Feature == "+simd128") { - SIMDLevel = std::max(SIMDLevel, SIMD128); - continue; - } - if (Feature == "-simd128") { - SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1)); - continue; - } - if (Feature == "+relaxed-simd") { - SIMDLevel = std::max(SIMDLevel, RelaxedSIMD); - continue; - } - if (Feature == "-relaxed-simd") { - SIMDLevel = std::min(SIMDLevel, SIMDEnum(RelaxedSIMD - 1)); - continue; - } - if (Feature == "+nontrapping-fptoint") { - HasNontrappingFPToInt = true; + if (Feature == "+atomics") { + HasAtomics = true; continue; } - if (Feature == "-nontrapping-fptoint") { - HasNontrappingFPToInt = false; + if (Feature == "-atomics") { + HasAtomics = false; continue; } - if (Feature == "+sign-ext") { - HasSignExt = true; + if (Feature == "+bulk-memory") { + HasBulkMemory = true; continue; } - if (Feature == "-sign-ext") { - HasSignExt = false; + if (Feature == "-bulk-memory") { + HasBulkMemory = false; continue; } if (Feature == "+exception-handling") { @@ -218,12 +202,12 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( HasExceptionHandling = false; continue; } - if (Feature == "+bulk-memory") { - HasBulkMemory = true; + if (Feature == "+extended-const") { + HasExtendedConst = true; continue; } - if (Feature == "-bulk-memory") { - HasBulkMemory = false; + if (Feature == "-extended-const") { + HasExtendedConst = false; continue; } if (Feature == "+half-precision") { @@ -235,20 +219,12 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( HasHalfPrecision = false; continue; } - if (Feature == "+atomics") { - HasAtomics = true; - continue; - } - if (Feature == "-atomics") { - HasAtomics = false; - continue; - } - if (Feature == "+mutable-globals") { - HasMutableGlobals = true; + if (Feature == "+multimemory") { + HasMultiMemory = true; continue; } - if (Feature == "-mutable-globals") { - HasMutableGlobals = false; + if (Feature == "-multimemory") { + HasMultiMemory = false; continue; } if (Feature == "+multivalue") { @@ -259,12 +235,20 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( HasMultivalue = false; continue; } - if (Feature == "+tail-call") { - HasTailCall = true; + if (Feature == "+mutable-globals") { + HasMutableGlobals = true; continue; } - if (Feature == "-tail-call") { - HasTailCall = false; + if (Feature == "-mutable-globals") { + HasMutableGlobals = false; + continue; + } + if (Feature == "+nontrapping-fptoint") { + HasNontrappingFPToInt = true; + continue; + } + if (Feature == "-nontrapping-fptoint") { + HasNontrappingFPToInt = false; continue; } if (Feature == "+reference-types") { @@ -275,20 +259,36 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( HasReferenceTypes = false; continue; } - if (Feature == "+extended-const") { - HasExtendedConst = true; + if (Feature == "+relaxed-simd") { + SIMDLevel = std::max(SIMDLevel, RelaxedSIMD); continue; } - if (Feature == "-extended-const") { - HasExtendedConst = false; + if (Feature == "-relaxed-simd") { + SIMDLevel = std::min(SIMDLevel, SIMDEnum(RelaxedSIMD - 1)); continue; } - if (Feature == "+multimemory") { - HasMultiMemory = true; + if (Feature == "+sign-ext") { + HasSignExt = true; continue; } - if (Feature == "-multimemory") { - HasMultiMemory = false; + if (Feature == "-sign-ext") { + HasSignExt = false; + continue; + } + if (Feature == "+simd128") { + SIMDLevel = std::max(SIMDLevel, SIMD128); + continue; + } + if (Feature == "-simd128") { + SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1)); + continue; + } + if (Feature == "+tail-call") { + HasTailCall = true; + continue; + } + if (Feature == "-tail-call") { + HasTailCall = false; continue; } diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h index e4c18879182ed..4db97867df607 100644 --- a/clang/lib/Basic/Targets/WebAssembly.h +++ b/clang/lib/Basic/Targets/WebAssembly.h @@ -53,18 +53,18 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo { RelaxedSIMD, } SIMDLevel = NoSIMD; - bool HasNontrappingFPToInt = false; - bool HasSignExt = false; - bool HasExceptionHandling = false; - bool HasBulkMemory = false; bool HasAtomics = false; - bool HasMutableGlobals = false; - bool HasMultivalue = false; - bool HasTailCall = false; - bool HasReferenceTypes = false; + bool HasBulkMemory = false; + bool HasExceptionHandling = false; bool HasExtendedConst = false; - bool HasMultiMemory = false; bool HasHalfPrecision = false; + bool HasMultiMemory = false; + bool HasMultivalue = false; + bool HasMutableGlobals = false; + bool HasNontrappingFPToInt = false; + bool HasReferenceTypes = false; + bool HasSignExt = false; + bool HasTailCall = false; std::string ABI; diff --git a/clang/test/Driver/wasm-features.c b/clang/test/Driver/wasm-features.c index 1f7fb21349826..b77cb5ea9b495 100644 --- a/clang/test/Driver/wasm-features.c +++ b/clang/test/Driver/wasm-features.c @@ -11,35 +11,35 @@ // GENERIC: "-target-cpu" "generic" // BLEEDING-EDGE: "-target-cpu" "bleeding-edge" +// RUN: %clang --target=wasm32-unknown-unknown -### %s -matomics 2>&1 | FileCheck %s -check-prefix=ATOMICS +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-atomics 2>&1 | FileCheck %s -check-prefix=NO-ATOMICS + +// ATOMICS: "-target-feature" "+atomics" +// NO-ATOMICS: "-target-feature" "-atomics" + // RUN: %clang --target=wasm32-unknown-unknown -### %s -mbulk-memory 2>&1 | FileCheck %s -check-prefix=BULK-MEMORY // RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-bulk-memory 2>&1 | FileCheck %s -check-prefix=NO-BULK-MEMORY // BULK-MEMORY: "-target-feature" "+bulk-memory" // NO-BULK-MEMORY: "-target-feature" "-bulk-memory" -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mmutable-globals 2>&1 | FileCheck %s -check-prefix=MUTABLE-GLOBALS -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-mutable-globals 2>&1 | FileCheck %s -check-prefix=NO-MUTABLE-GLOBALS - -// MUTABLE-GLOBALS: "-target-feature" "+mutable-globals" -// NO-MUTABLE-GLOBALS: "-target-feature" "-mutable-globals" - -// RUN: %clang --target=wasm32-unknown-unknown -### %s -msign-ext 2>&1 | FileCheck %s -check-prefix=SIGN-EXT -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-sign-ext 2>&1 | FileCheck %s -check-prefix=NO-SIGN-EXT +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mexception-handling 2>&1 | FileCheck %s -check-prefix=EXCEPTION-HANDLING +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-exception-handling 2>&1 | FileCheck %s -check-prefix=NO-EXCEPTION-HANDLING -// SIGN-EXT: "-target-feature" "+sign-ext" -// NO-SIGN-EXT: "-target-feature" "-sign-ext" +// EXCEPTION-HANDLING: "-target-feature" "+exception-handling" +// NO-EXCEPTION-HANDLING: "-target-feature" "-exception-handling" -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mnontrapping-fptoint 2>&1 | FileCheck %s -check-prefix=NONTRAPPING-FPTOINT -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-nontrapping-fptoint 2>&1 | FileCheck %s -check-prefix=NO-NONTRAPPING-FPTOINT +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mextended-const 2>&1 | FileCheck %s -check-prefix=EXTENDED-CONST +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-extended-const 2>&1 | FileCheck %s -check-prefix=NO-EXTENDED-CONST -// NONTRAPPING-FPTOINT: "-target-feature" "+nontrapping-fptoint" -// NO-NONTRAPPING-FPTOINT: "-target-feature" "-nontrapping-fptoint" +// EXTENDED-CONST: "-target-feature" "+extended-const" +// NO-EXTENDED-CONST: "-target-feature" "-extended-const" -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mmultivalue 2>&1 | FileCheck %s -check-prefix=MULTIVALUE -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-multivalue 2>&1 | FileCheck %s -check-prefix=NO-MULTIVALUE +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mhalf-precision 2>&1 | FileCheck %s -check-prefix=HALF-PRECISION +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-half-precision 2>&1 | FileCheck %s -check-prefix=NO-HALF-PRECISION -// MULTIVALUE: "-target-feature" "+multivalue" -// NO-MULTIVALUE: "-target-feature" "-multivalue" +// HALF-PRECISION: "-target-feature" "+half-precision" +// NO-HALF-PRECISION: "-target-feature" "-half-precision" // RUN: %clang --target=wasm32-unknown-unknown -### %s -mmultimemory 2>&1 | FileCheck %s -check-prefix=MULTIMEMORY // RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-multimemory 2>&1 | FileCheck %s -check-prefix=NO-MULTIMEMORY @@ -47,17 +47,23 @@ // MULTIMEMORY: "-target-feature" "+multimemory" // NO-MULTIMEMORY: "-target-feature" "-multimemory" -// RUN: %clang --target=wasm32-unknown-unknown -### %s -matomics 2>&1 | FileCheck %s -check-prefix=ATOMICS -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-atomics 2>&1 | FileCheck %s -check-prefix=NO-ATOMICS +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mmultivalue 2>&1 | FileCheck %s -check-prefix=MULTIVALUE +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-multivalue 2>&1 | FileCheck %s -check-prefix=NO-MULTIVALUE -// ATOMICS: "-target-feature" "+atomics" -// NO-ATOMICS: "-target-feature" "-atomics" +// MULTIVALUE: "-target-feature" "+multivalue" +// NO-MULTIVALUE: "-target-feature" "-multivalue" -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mtail-call 2>&1 | FileCheck %s -check-prefix=TAIL-CALL -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-tail-call 2>&1 | FileCheck %s -check-prefix=NO-TAIL-CALL +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mmutable-globals 2>&1 | FileCheck %s -check-prefix=MUTABLE-GLOBALS +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-mutable-globals 2>&1 | FileCheck %s -check-prefix=NO-MUTABLE-GLOBALS -// TAIL-CALL: "-target-feature" "+tail-call" -// NO-TAIL-CALL: "-target-feature" "-tail-call" +// MUTABLE-GLOBALS: "-target-feature" "+mutable-globals" +// NO-MUTABLE-GLOBALS: "-target-feature" "-mutable-globals" + +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mnontrapping-fptoint 2>&1 | FileCheck %s -check-prefix=NONTRAPPING-FPTOINT +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-nontrapping-fptoint 2>&1 | FileCheck %s -check-prefix=NO-NONTRAPPING-FPTOINT + +// NONTRAPPING-FPTOINT: "-target-feature" "+nontrapping-fptoint" +// NO-NONTRAPPING-FPTOINT: "-target-feature" "-nontrapping-fptoint" // RUN: %clang --target=wasm32-unknown-unknown -### %s -mreference-types 2>&1 | FileCheck %s -check-prefix=REFERENCE-TYPES // RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-reference-types 2>&1 | FileCheck %s -check-prefix=NO-REFERENCE-TYPES @@ -65,32 +71,26 @@ // REFERENCE-TYPES: "-target-feature" "+reference-types" // NO-REFERENCE-TYPES: "-target-feature" "-reference-types" -// RUN: %clang --target=wasm32-unknown-unknown -### %s -msimd128 2>&1 | FileCheck %s -check-prefix=SIMD128 -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-simd128 2>&1 | FileCheck %s -check-prefix=NO-SIMD128 - -// SIMD128: "-target-feature" "+simd128" -// NO-SIMD128: "-target-feature" "-simd128" - // RUN: %clang --target=wasm32-unknown-unknown -### %s -mrelaxed-simd 2>&1 | FileCheck %s -check-prefix=RELAXED-SIMD // RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-relaxed-simd 2>&1 | FileCheck %s -check-prefix=NO-RELAXED-SIMD // RELAXED-SIMD: "-target-feature" "+relaxed-simd" // NO-RELAXED-SIMD: "-target-feature" "-relaxed-simd" -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mhalf-precision 2>&1 | FileCheck %s -check-prefix=HALF-PRECISION -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-half-precision 2>&1 | FileCheck %s -check-prefix=NO-HALF-PRECISION +// RUN: %clang --target=wasm32-unknown-unknown -### %s -msign-ext 2>&1 | FileCheck %s -check-prefix=SIGN-EXT +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-sign-ext 2>&1 | FileCheck %s -check-prefix=NO-SIGN-EXT -// HALF-PRECISION: "-target-feature" "+half-precision" -// NO-HALF-PRECISION: "-target-feature" "-half-precision" +// SIGN-EXT: "-target-feature" "+sign-ext" +// NO-SIGN-EXT: "-target-feature" "-sign-ext" -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mexception-handling 2>&1 | FileCheck %s -check-prefix=EXCEPTION-HANDLING -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-exception-handling 2>&1 | FileCheck %s -check-prefix=NO-EXCEPTION-HANDLING +// RUN: %clang --target=wasm32-unknown-unknown -### %s -msimd128 2>&1 | FileCheck %s -check-prefix=SIMD128 +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-simd128 2>&1 | FileCheck %s -check-prefix=NO-SIMD128 -// EXCEPTION-HANDLING: "-target-feature" "+exception-handling" -// NO-EXCEPTION-HANDLING: "-target-feature" "-exception-handling" +// SIMD128: "-target-feature" "+simd128" +// NO-SIMD128: "-target-feature" "-simd128" -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mextended-const 2>&1 | FileCheck %s -check-prefix=EXTENDED-CONST -// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-extended-const 2>&1 | FileCheck %s -check-prefix=NO-EXTENDED-CONST +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mtail-call 2>&1 | FileCheck %s -check-prefix=TAIL-CALL +// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-tail-call 2>&1 | FileCheck %s -check-prefix=NO-TAIL-CALL -// EXTENDED-CONST: "-target-feature" "+extended-const" -// NO-EXTENDED-CONST: "-target-feature" "-extended-const" +// TAIL-CALL: "-target-feature" "+tail-call" +// NO-TAIL-CALL: "-target-feature" "-tail-call" diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.td b/llvm/lib/Target/WebAssembly/WebAssembly.td index f00974531209d..0dd674426e9e8 100644 --- a/llvm/lib/Target/WebAssembly/WebAssembly.td +++ b/llvm/lib/Target/WebAssembly/WebAssembly.td @@ -22,40 +22,28 @@ include "llvm/Target/Target.td" // WebAssembly Subtarget features. //===----------------------------------------------------------------------===// -def FeatureSIMD128 : SubtargetFeature<"simd128", "SIMDLevel", "SIMD128", - "Enable 128-bit SIMD">; - -def FeatureRelaxedSIMD : SubtargetFeature<"relaxed-simd", "SIMDLevel", "RelaxedSIMD", - "Enable relaxed-simd instructions">; - -def FeatureHalfPrecision : SubtargetFeature<"half-precision", "HasHalfPrecision", "true", - "Enable half precision instructions">; - def FeatureAtomics : SubtargetFeature<"atomics", "HasAtomics", "true", "Enable Atomics">; -def FeatureNontrappingFPToInt : - SubtargetFeature<"nontrapping-fptoint", - "HasNontrappingFPToInt", "true", - "Enable non-trapping float-to-int conversion operators">; - -def FeatureSignExt : - SubtargetFeature<"sign-ext", - "HasSignExt", "true", - "Enable sign extension operators">; - -def FeatureTailCall : - SubtargetFeature<"tail-call", - "HasTailCall", "true", - "Enable tail call instructions">; +def FeatureBulkMemory : + SubtargetFeature<"bulk-memory", "HasBulkMemory", "true", + "Enable bulk memory operations">; def FeatureExceptionHandling : SubtargetFeature<"exception-handling", "HasExceptionHandling", "true", "Enable Wasm exception handling">; -def FeatureBulkMemory : - SubtargetFeature<"bulk-memory", "HasBulkMemory", "true", - "Enable bulk memory operations">; +def FeatureExtendedConst : + SubtargetFeature<"extended-const", "HasExtendedConst", "true", + "Enable extended const expressions">; + +def FeatureHalfPrecision : + SubtargetFeature<"half-precision", "HasHalfPrecision", "true", + "Enable half precision instructions">; + +def FeatureMultiMemory : + SubtargetFeature<"multimemory", "HasMultiMemory", "true", + "Enable multiple memories">; def FeatureMultivalue : SubtargetFeature<"multivalue", @@ -66,17 +54,29 @@ def FeatureMutableGlobals : SubtargetFeature<"mutable-globals", "HasMutableGlobals", "true", "Enable mutable globals">; +def FeatureNontrappingFPToInt : + SubtargetFeature<"nontrapping-fptoint", + "HasNontrappingFPToInt", "true", + "Enable non-trapping float-to-int conversion operators">; + def FeatureReferenceTypes : SubtargetFeature<"reference-types", "HasReferenceTypes", "true", "Enable reference types">; -def FeatureExtendedConst : - SubtargetFeature<"extended-const", "HasExtendedConst", "true", - "Enable extended const expressions">; +def FeatureRelaxedSIMD : + SubtargetFeature<"relaxed-simd", "SIMDLevel", "RelaxedSIMD", + "Enable relaxed-simd instructions">; -def FeatureMultiMemory : - SubtargetFeature<"multimemory", "HasMultiMemory", "true", - "Enable multiple memories">; +def FeatureSignExt : + SubtargetFeature<"sign-ext", "HasSignExt", "true", + "Enable sign extension operators">; + +def FeatureSIMD128 : SubtargetFeature<"simd128", "SIMDLevel", "SIMD128", + "Enable 128-bit SIMD">; + +def FeatureTailCall : + SubtargetFeature<"tail-call", "HasTailCall", "true", + "Enable tail call instructions">; //===----------------------------------------------------------------------===// // Architectures. diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td index fb2ca532d2523..c1a5a45395e87 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td @@ -22,66 +22,68 @@ def HasAddr32 : Predicate<"!Subtarget->hasAddr64()">; def HasAddr64 : Predicate<"Subtarget->hasAddr64()">; -def HasSIMD128 : - Predicate<"Subtarget->hasSIMD128()">, - AssemblerPredicate<(all_of FeatureSIMD128), "simd128">; +def HasAtomics : + Predicate<"Subtarget->hasAtomics()">, + AssemblerPredicate<(all_of FeatureAtomics), "atomics">; -def HasRelaxedSIMD : - Predicate<"Subtarget->hasRelaxedSIMD()">, - AssemblerPredicate<(all_of FeatureRelaxedSIMD), "relaxed-simd">; +def HasBulkMemory : + Predicate<"Subtarget->hasBulkMemory()">, + AssemblerPredicate<(all_of FeatureBulkMemory), "bulk-memory">; + +def HasExceptionHandling : + Predicate<"Subtarget->hasExceptionHandling()">, + AssemblerPredicate<(all_of FeatureExceptionHandling), "exception-handling">; + +def HasExtendedConst : + Predicate<"Subtarget->hasExtendedConst()">, + AssemblerPredicate<(all_of FeatureExtendedConst), "extended-const">; def HasHalfPrecision : Predicate<"Subtarget->hasHalfPrecision()">, AssemblerPredicate<(all_of FeatureHalfPrecision), "half-precision">; -def HasAtomics : - Predicate<"Subtarget->hasAtomics()">, - AssemblerPredicate<(all_of FeatureAtomics), "atomics">; +def HasMultiMemory : + Predicate<"Subtarget->hasMultiMemory()">, + AssemblerPredicate<(all_of FeatureMultiMemory), "multimemory">; def HasMultivalue : Predicate<"Subtarget->hasMultivalue()">, AssemblerPredicate<(all_of FeatureMultivalue), "multivalue">; +def HasMutableGlobals: + Predicate<"Subtarget->hasMutableGlobals()">, + AssemblerPredicate<(all_of FeatureMutableGlobals), "mutable-globals">; + def HasNontrappingFPToInt : Predicate<"Subtarget->hasNontrappingFPToInt()">, - AssemblerPredicate<(all_of FeatureNontrappingFPToInt), "nontrapping-fptoint">; + AssemblerPredicate<(all_of FeatureNontrappingFPToInt), + "nontrapping-fptoint">; def NotHasNontrappingFPToInt : Predicate<"!Subtarget->hasNontrappingFPToInt()">, - AssemblerPredicate<(all_of (not FeatureNontrappingFPToInt)), "nontrapping-fptoint">; + AssemblerPredicate<(all_of (not FeatureNontrappingFPToInt)), + "nontrapping-fptoint">; + +def HasReferenceTypes : + Predicate<"Subtarget->hasReferenceTypes()">, + AssemblerPredicate<(all_of FeatureReferenceTypes), "reference-types">; + +def HasRelaxedSIMD : + Predicate<"Subtarget->hasRelaxedSIMD()">, + AssemblerPredicate<(all_of FeatureRelaxedSIMD), "relaxed-simd">; def HasSignExt : Predicate<"Subtarget->hasSignExt()">, AssemblerPredicate<(all_of FeatureSignExt), "sign-ext">; +def HasSIMD128 : + Predicate<"Subtarget->hasSIMD128()">, + AssemblerPredicate<(all_of FeatureSIMD128), "simd128">; + def HasTailCall : Predicate<"Subtarget->hasTailCall()">, AssemblerPredicate<(all_of FeatureTailCall), "tail-call">; -def HasExceptionHandling : - Predicate<"Subtarget->hasExceptionHandling()">, - AssemblerPredicate<(all_of FeatureExceptionHandling), "exception-handling">; - -def HasBulkMemory : - Predicate<"Subtarget->hasBulkMemory()">, - AssemblerPredicate<(all_of FeatureBulkMemory), "bulk-memory">; - -def HasReferenceTypes : - Predicate<"Subtarget->hasReferenceTypes()">, - AssemblerPredicate<(all_of FeatureReferenceTypes), "reference-types">; - -def HasExtendedConst : - Predicate<"Subtarget->hasExtendedConst()">, - AssemblerPredicate<(all_of FeatureExtendedConst), "extended-const">; - -def HasMultiMemory : - Predicate<"Subtarget->hasMultiMemory()">, - AssemblerPredicate<(all_of FeatureMultiMemory), "multimemory">; - -def HasMutableGlobals: - Predicate<"Subtarget->hasMutableGlobals()">, - AssemblerPredicate<(all_of FeatureMutableGlobals), "mutable-globals">; - //===----------------------------------------------------------------------===// // WebAssembly-specific DAG Node Types. //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h index cb4589961867e..540da4b51ccaa 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h @@ -40,17 +40,17 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { } SIMDLevel = NoSIMD; bool HasAtomics = false; - bool HasNontrappingFPToInt = false; - bool HasSignExt = false; - bool HasExceptionHandling = false; bool HasBulkMemory = false; + bool HasExceptionHandling = false; + bool HasExtendedConst = false; + bool HasHalfPrecision = false; + bool HasMultiMemory = false; bool HasMultivalue = false; bool HasMutableGlobals = false; - bool HasTailCall = false; + bool HasNontrappingFPToInt = false; bool HasReferenceTypes = false; - bool HasExtendedConst = false; - bool HasMultiMemory = false; - bool HasHalfPrecision = false; + bool HasSignExt = false; + bool HasTailCall = false; /// What processor and OS we're targeting. Triple TargetTriple; @@ -92,20 +92,20 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { // Predicates used by WebAssemblyInstrInfo.td. bool hasAddr64() const { return TargetTriple.isArch64Bit(); } - bool hasSIMD128() const { return SIMDLevel >= SIMD128; } - bool hasRelaxedSIMD() const { return SIMDLevel >= RelaxedSIMD; } - bool hasHalfPrecision() const { return HasHalfPrecision; } bool hasAtomics() const { return HasAtomics; } - bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } - bool hasSignExt() const { return HasSignExt; } - bool hasExceptionHandling() const { return HasExceptionHandling; } bool hasBulkMemory() const { return HasBulkMemory; } + bool hasExceptionHandling() const { return HasExceptionHandling; } + bool hasExtendedConst() const { return HasExtendedConst; } + bool hasHalfPrecision() const { return HasHalfPrecision; } + bool hasMultiMemory() const { return HasMultiMemory; } bool hasMultivalue() const { return HasMultivalue; } bool hasMutableGlobals() const { return HasMutableGlobals; } - bool hasTailCall() const { return HasTailCall; } + bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } bool hasReferenceTypes() const { return HasReferenceTypes; } - bool hasMultiMemory() const { return HasMultiMemory; } - bool hasExtendedConst() const { return HasExtendedConst; } + bool hasRelaxedSIMD() const { return SIMDLevel >= RelaxedSIMD; } + bool hasSignExt() const { return HasSignExt; } + bool hasSIMD128() const { return SIMDLevel >= SIMD128; } + bool hasTailCall() const { return HasTailCall; } /// Parses features string setting specified subtarget options. Definition of /// function is auto generated by tblgen.