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