1 //=- WebAssemblySubtarget.h - Define Subtarget for the WebAssembly -*- C++ -*-// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file declares the WebAssembly-specific subclass of 11 /// TargetSubtarget. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSUBTARGET_H 16 #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSUBTARGET_H 17 18 #include "MCTargetDesc/WebAssemblyMCTargetDesc.h" 19 #include "WebAssemblyFrameLowering.h" 20 #include "WebAssemblyISelLowering.h" 21 #include "WebAssemblyInstrInfo.h" 22 #include "WebAssemblySelectionDAGInfo.h" 23 #include "llvm/CodeGen/TargetSubtargetInfo.h" 24 #include <string> 25 26 #define GET_SUBTARGETINFO_HEADER 27 #include "WebAssemblyGenSubtargetInfo.inc" 28 29 namespace llvm { 30 31 // Defined in WebAssemblyGenSubtargetInfo.inc. 32 extern const SubtargetFeatureKV 33 WebAssemblyFeatureKV[WebAssembly::NumSubtargetFeatures]; 34 35 class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { 36 enum SIMDEnum { 37 NoSIMD, 38 SIMD128, 39 RelaxedSIMD, 40 } SIMDLevel = NoSIMD; 41 42 bool HasAtomics = false; 43 bool HasBulkMemory = false; 44 bool HasExceptionHandling = false; 45 bool HasExtendedConst = false; 46 bool HasHalfPrecision = false; 47 bool HasMultiMemory = false; 48 bool HasMultivalue = false; 49 bool HasMutableGlobals = false; 50 bool HasNontrappingFPToInt = false; 51 bool HasReferenceTypes = false; 52 bool HasSignExt = false; 53 bool HasTailCall = false; 54 55 /// What processor and OS we're targeting. 56 Triple TargetTriple; 57 58 WebAssemblyFrameLowering FrameLowering; 59 WebAssemblyInstrInfo InstrInfo; 60 WebAssemblySelectionDAGInfo TSInfo; 61 WebAssemblyTargetLowering TLInfo; 62 63 WebAssemblySubtarget &initializeSubtargetDependencies(StringRef CPU, 64 StringRef FS); 65 66 public: 67 /// This constructor initializes the data members to match that 68 /// of the specified triple. 69 WebAssemblySubtarget(const Triple &TT, const std::string &CPU, 70 const std::string &FS, const TargetMachine &TM); 71 getSelectionDAGInfo()72 const WebAssemblySelectionDAGInfo *getSelectionDAGInfo() const override { 73 return &TSInfo; 74 } getFrameLowering()75 const WebAssemblyFrameLowering *getFrameLowering() const override { 76 return &FrameLowering; 77 } getTargetLowering()78 const WebAssemblyTargetLowering *getTargetLowering() const override { 79 return &TLInfo; 80 } getInstrInfo()81 const WebAssemblyInstrInfo *getInstrInfo() const override { 82 return &InstrInfo; 83 } getRegisterInfo()84 const WebAssemblyRegisterInfo *getRegisterInfo() const override { 85 return &getInstrInfo()->getRegisterInfo(); 86 } getTargetTriple()87 const Triple &getTargetTriple() const { return TargetTriple; } 88 bool enableAtomicExpand() const override; enableIndirectBrExpand()89 bool enableIndirectBrExpand() const override { return true; } 90 bool enableMachineScheduler() const override; 91 bool useAA() const override; 92 93 // Predicates used by WebAssemblyInstrInfo.td. hasAddr64()94 bool hasAddr64() const { return TargetTriple.isArch64Bit(); } hasAtomics()95 bool hasAtomics() const { return HasAtomics; } hasBulkMemory()96 bool hasBulkMemory() const { return HasBulkMemory; } hasExceptionHandling()97 bool hasExceptionHandling() const { return HasExceptionHandling; } hasExtendedConst()98 bool hasExtendedConst() const { return HasExtendedConst; } hasHalfPrecision()99 bool hasHalfPrecision() const { return HasHalfPrecision; } hasMultiMemory()100 bool hasMultiMemory() const { return HasMultiMemory; } hasMultivalue()101 bool hasMultivalue() const { return HasMultivalue; } hasMutableGlobals()102 bool hasMutableGlobals() const { return HasMutableGlobals; } hasNontrappingFPToInt()103 bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } hasReferenceTypes()104 bool hasReferenceTypes() const { return HasReferenceTypes; } hasRelaxedSIMD()105 bool hasRelaxedSIMD() const { return SIMDLevel >= RelaxedSIMD; } hasSignExt()106 bool hasSignExt() const { return HasSignExt; } hasSIMD128()107 bool hasSIMD128() const { return SIMDLevel >= SIMD128; } hasTailCall()108 bool hasTailCall() const { return HasTailCall; } 109 110 /// Parses features string setting specified subtarget options. Definition of 111 /// function is auto generated by tblgen. 112 void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); 113 }; 114 115 } // end namespace llvm 116 117 #endif 118