1 //==- WebAssemblyTargetTransformInfo.h - WebAssembly-specific TTI -*- C++ -*-=//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief This file a TargetTransformInfo::Concept conforming object specific
12 /// to the WebAssembly target machine.
14 /// It uses the target's detailed information to provide more precise answers to
15 /// certain TTI queries, while letting the target independent and default TTI
16 /// implementations handle the rest.
18 //===----------------------------------------------------------------------===//
20 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETTRANSFORMINFO_H
21 #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETTRANSFORMINFO_H
23 #include "WebAssemblyTargetMachine.h"
24 #include "llvm/CodeGen/BasicTTIImpl.h"
29 class WebAssemblyTTIImpl final : public BasicTTIImplBase<WebAssemblyTTIImpl> {
30 typedef BasicTTIImplBase<WebAssemblyTTIImpl> BaseT;
31 typedef TargetTransformInfo TTI;
34 const WebAssemblyTargetMachine *TM;
35 const WebAssemblySubtarget *ST;
36 const WebAssemblyTargetLowering *TLI;
38 const WebAssemblySubtarget *getST() const { return ST; }
39 const WebAssemblyTargetLowering *getTLI() const { return TLI; }
42 WebAssemblyTTIImpl(const WebAssemblyTargetMachine *TM, Function &F)
43 : BaseT(TM), TM(TM), ST(TM->getSubtargetImpl(F)),
44 TLI(ST->getTargetLowering()) {}
46 // Provide value semantics. MSVC requires that we spell all of these out.
47 WebAssemblyTTIImpl(const WebAssemblyTTIImpl &Arg)
48 : BaseT(static_cast<const BaseT &>(Arg)), TM(Arg.TM), ST(Arg.ST),
50 WebAssemblyTTIImpl(WebAssemblyTTIImpl &&Arg)
51 : BaseT(std::move(static_cast<BaseT &>(Arg))), TM(std::move(Arg.TM)),
52 ST(std::move(Arg.ST)), TLI(std::move(Arg.TLI)) {}
53 WebAssemblyTTIImpl &operator=(const WebAssemblyTTIImpl &RHS) {
54 BaseT::operator=(static_cast<const BaseT &>(RHS));
60 WebAssemblyTTIImpl &operator=(WebAssemblyTTIImpl &&RHS) {
61 BaseT::operator=(std::move(static_cast<BaseT &>(RHS)));
62 TM = std::move(RHS.TM);
63 ST = std::move(RHS.ST);
64 TLI = std::move(RHS.TLI);
68 /// \name Scalar TTI Implementations
71 // TODO: Implement more Scalar TTI for WebAssembly
73 TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth);
77 /// \name Vector TTI Implementations
80 // TODO: Implement Vector TTI for WebAssembly
85 } // end namespace llvm