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/GlobalISel/CallLowering.h"
24#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
25#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
26#include "llvm/CodeGen/RegisterBankInfo.h"
27#include "llvm/CodeGen/TargetSubtargetInfo.h"
28#include <string>
29
30#define GET_SUBTARGETINFO_HEADER
31#include "WebAssemblyGenSubtargetInfo.inc"
32
33namespace llvm {
34
35// Defined in WebAssemblyGenSubtargetInfo.inc.
36extern const SubtargetFeatureKV
37 WebAssemblyFeatureKV[WebAssembly::NumSubtargetFeatures];
38
39class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo {
40 enum SIMDEnum {
41 NoSIMD,
42 SIMD128,
43 RelaxedSIMD,
44 } SIMDLevel = NoSIMD;
45
46 bool HasAtomics = false;
47 bool HasBulkMemory = false;
48 bool HasBulkMemoryOpt = false;
49 bool HasCallIndirectOverlong = false;
50 bool HasCompactImports = false;
51 bool HasExceptionHandling = false;
52 bool HasExtendedConst = false;
53 bool HasFP16 = false;
54 bool HasGC = false;
55 bool HasMultiMemory = false;
56 bool HasMultivalue = false;
57 bool HasMutableGlobals = false;
58 bool HasNontrappingFPToInt = false;
59 bool HasReferenceTypes = false;
60 bool HasSignExt = false;
61 bool HasTailCall = false;
62 bool HasWideArithmetic = false;
63
64 /// What processor and OS we're targeting.
65 Triple TargetTriple;
66
67 WebAssemblyFrameLowering FrameLowering;
68 WebAssemblyInstrInfo InstrInfo;
69 WebAssemblySelectionDAGInfo TSInfo;
70 WebAssemblyTargetLowering TLInfo;
71
72 std::unique_ptr<CallLowering> CallLoweringInfo;
73 std::unique_ptr<InstructionSelector> InstSelector;
74 std::unique_ptr<LegalizerInfo> Legalizer;
75 std::unique_ptr<RegisterBankInfo> RegBankInfo;
76
77 WebAssemblySubtarget &initializeSubtargetDependencies(StringRef CPU,
78 StringRef FS);
79
80public:
81 /// This constructor initializes the data members to match that
82 /// of the specified triple.
83 WebAssemblySubtarget(const Triple &TT, const std::string &CPU,
84 const std::string &FS, const TargetMachine &TM);
85
86 const WebAssemblySelectionDAGInfo *getSelectionDAGInfo() const override {
87 return &TSInfo;
88 }
89 const WebAssemblyFrameLowering *getFrameLowering() const override {
90 return &FrameLowering;
91 }
92 const WebAssemblyTargetLowering *getTargetLowering() const override {
93 return &TLInfo;
94 }
95 const WebAssemblyInstrInfo *getInstrInfo() const override {
96 return &InstrInfo;
97 }
98 const WebAssemblyRegisterInfo *getRegisterInfo() const override {
99 return &getInstrInfo()->getRegisterInfo();
100 }
101 const Triple &getTargetTriple() const { return TargetTriple; }
102 bool enableAtomicExpand() const override;
103 bool enableIndirectBrExpand() const override { return true; }
104 bool enableMachineScheduler() const override;
105 bool useAA() const override;
106
107 // Predicates used by WebAssemblyInstrInfo.td.
108 bool hasAddr64() const { return TargetTriple.isArch64Bit(); }
109 bool hasAtomics() const { return HasAtomics; }
110 bool hasBulkMemory() const { return HasBulkMemory; }
111 bool hasBulkMemoryOpt() const { return HasBulkMemoryOpt; }
112 bool hasCallIndirectOverlong() const { return HasCallIndirectOverlong; }
113 bool hasCompactImports() const { return HasCompactImports; }
114 bool hasExceptionHandling() const { return HasExceptionHandling; }
115 bool hasExtendedConst() const { return HasExtendedConst; }
116 bool hasFP16() const { return HasFP16; }
117 bool hasMultiMemory() const { return HasMultiMemory; }
118 bool hasMultivalue() const { return HasMultivalue; }
119 bool hasMutableGlobals() const { return HasMutableGlobals; }
120 bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; }
121 bool hasReferenceTypes() const { return HasReferenceTypes; }
122 bool hasGC() const { return HasGC; }
123 bool hasRelaxedSIMD() const { return SIMDLevel >= RelaxedSIMD; }
124 bool hasSignExt() const { return HasSignExt; }
125 bool hasSIMD128() const { return SIMDLevel >= SIMD128; }
126 bool hasTailCall() const { return HasTailCall; }
127 bool hasWideArithmetic() const { return HasWideArithmetic; }
128
129 /// Parses features string setting specified subtarget options. Definition of
130 /// function is auto generated by tblgen.
131 void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
132
133 const CallLowering *getCallLowering() const override;
134 InstructionSelector *getInstructionSelector() const override;
135 const LegalizerInfo *getLegalizerInfo() const override;
136 const RegisterBankInfo *getRegBankInfo() const override;
137};
138
139} // end namespace llvm
140
141#endif
142