1f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//==- WebAssemblyTargetTransformInfo.h - WebAssembly-specific TTI -*- C++ -*-=//
2f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
3f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
5f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// License. See LICENSE.TXT for details.
7f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
8f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
9f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///
10f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// \file
11f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// \brief This file a TargetTransformInfo::Concept conforming object specific
12f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// to the WebAssembly target machine.
13f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///
14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// It uses the target's detailed information to provide more precise answers to
15f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// certain TTI queries, while letting the target independent and default TTI
16f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// implementations handle the rest.
17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///
18f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
19f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
20f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETTRANSFORMINFO_H
21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETTRANSFORMINFO_H
22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "WebAssemblyTargetMachine.h"
24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/CodeGen/BasicTTIImpl.h"
25f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include <algorithm>
26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarnamespace llvm {
28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass WebAssemblyTTIImpl final : public BasicTTIImplBase<WebAssemblyTTIImpl> {
30f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef BasicTTIImplBase<WebAssemblyTTIImpl> BaseT;
31f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef TargetTransformInfo TTI;
32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  friend BaseT;
33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
34f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const WebAssemblySubtarget *ST;
35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const WebAssemblyTargetLowering *TLI;
36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const WebAssemblySubtarget *getST() const { return ST; }
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const WebAssemblyTargetLowering *getTLI() const { return TLI; }
39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
40f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic:
41f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  WebAssemblyTTIImpl(const WebAssemblyTargetMachine *TM, const Function &F)
42f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      : BaseT(TM, F.getParent()->getDataLayout()), ST(TM->getSubtargetImpl(F)),
43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        TLI(ST->getTargetLowering()) {}
44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Provide value semantics. MSVC requires that we spell all of these out.
46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  WebAssemblyTTIImpl(const WebAssemblyTTIImpl &Arg)
47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      : BaseT(static_cast<const BaseT &>(Arg)), ST(Arg.ST), TLI(Arg.TLI) {}
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  WebAssemblyTTIImpl(WebAssemblyTTIImpl &&Arg)
49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      : BaseT(std::move(static_cast<BaseT &>(Arg))), ST(std::move(Arg.ST)),
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        TLI(std::move(Arg.TLI)) {}
51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// \name Scalar TTI Implementations
53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// @{
54f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // TODO: Implement more Scalar TTI for WebAssembly
56f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
57f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const;
58f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
59f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// @}
60f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// \name Vector TTI Implementations
62f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// @{
63f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned getNumberOfRegisters(bool Vector);
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned getRegisterBitWidth(bool Vector);
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned getArithmeticInstrCost(
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      unsigned Opcode, Type *Ty,
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None);
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index);
73f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// @}
75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
77f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} // end namespace llvm
78f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
79f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#endif
80