diff options
author | Chris Lattner <sabre@nondot.org> | 2005-01-07 07:44:22 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-01-07 07:44:22 +0000 |
commit | 75c2d0a351cecb222af1da8734a8c1a32f9177a3 (patch) | |
tree | 7485561ed206d6cb27117c7369e0ae4459405acc /include/llvm/Target | |
parent | b99468d718c4d1b8f20909a4c765e458585ef745 (diff) | |
download | external_llvm-75c2d0a351cecb222af1da8734a8c1a32f9177a3.zip external_llvm-75c2d0a351cecb222af1da8734a8c1a32f9177a3.tar.gz external_llvm-75c2d0a351cecb222af1da8734a8c1a32f9177a3.tar.bz2 |
First draft of a new Target interface
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19323 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Target')
-rw-r--r-- | include/llvm/Target/TargetLowering.h | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h new file mode 100644 index 0000000..9d7ccd8 --- /dev/null +++ b/include/llvm/Target/TargetLowering.h @@ -0,0 +1,175 @@ +//===-- llvm/Target/TargetLowering.h - Target Lowering Info -----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file describes how to lower LLVM code to machine code. This has two +// main components: +// +// 1. Which ValueTypes are natively supported by the target. +// 2. Which operations are supported for supported ValueTypes. +// +// In addition it has a few other components, like information about FP +// immediates. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TARGET_TARGETLOWERING_H +#define LLVM_TARGET_TARGETLOWERING_H + +#include "llvm/Type.h" +#include "llvm/CodeGen/ValueTypes.h" +#include <vector> + +namespace llvm { + class Function; + class TargetMachine; + class TargetData; + class TargetRegisterClass; + class SDNode; + class SDOperand; + class SelectionDAG; + +//===----------------------------------------------------------------------===// +/// TargetLowering - This class defines information used to lower LLVM code to +/// legal SelectionDAG operators that the target instruction selector can accept +/// natively. +/// +/// This class also defines callbacks that targets must implement to lower +/// target-specific constructs to SelectionDAG operators. +/// +class TargetLowering { + TargetMachine &TM; + const TargetData &TD; + + MVT::ValueType PointerTy; + bool IsLittleEndian; + + /// RegClassForVT - This indicates the default register class to use for + /// each ValueType the target supports natively. + TargetRegisterClass *RegClassForVT[MVT::LAST_VALUETYPE]; + unsigned char NumElementsForVT[MVT::LAST_VALUETYPE]; + + unsigned short UnsupportedOps[128]; + + std::vector<double> LegalFPImmediates; + + std::vector<std::pair<MVT::ValueType, + TargetRegisterClass*> > AvailableRegClasses; +public: + TargetLowering(TargetMachine &TM); + virtual ~TargetLowering() {} + + TargetMachine &getTargetMachine() const { return TM; } + const TargetData &getTargetData() const { return TD; } + + bool isLittleEndian() const { return IsLittleEndian; } + MVT::ValueType getPointerTy() const { return PointerTy; } + + TargetRegisterClass *getRegClassFor(MVT::ValueType VT) { + TargetRegisterClass *RC = RegClassForVT[VT]; + assert(RC && "This value type is not natively supported!"); + return RC; + } + + /// hasNativeSupportFor + bool hasNativeSupportFor(MVT::ValueType VT) { + return RegClassForVT[VT] != 0; + } + + typedef std::vector<double>::const_iterator legal_fpimm_iterator; + legal_fpimm_iterator legal_fpimm_begin() const { + return LegalFPImmediates.begin(); + } + legal_fpimm_iterator legal_fpimm_end() const { + return LegalFPImmediates.end(); + } + + bool isOperationSupported(unsigned Op, MVT::ValueType VT) { + return (UnsupportedOps[Op] & (1 << VT)) == 0; + } + + MVT::ValueType getValueType(const Type *Ty) { + switch (Ty->getTypeID()) { + default: assert(0 && "Unknown type!"); + case Type::VoidTyID: return MVT::isVoid; + case Type::BoolTyID: return MVT::i1; + case Type::UByteTyID: + case Type::SByteTyID: return MVT::i8; + case Type::ShortTyID: + case Type::UShortTyID: return MVT::i16; + case Type::IntTyID: + case Type::UIntTyID: return MVT::i32; + case Type::LongTyID: + case Type::ULongTyID: return MVT::i64; + case Type::FloatTyID: return MVT::f32; + case Type::DoubleTyID: return MVT::f64; + case Type::PointerTyID: return PointerTy; + } + } + + /// getNumElements - Return the number of registers that this ValueType will + /// eventually require. This is always one for all non-integer types, is + /// one for any types promoted to live in larger registers, but may be more + /// than one for types (like i64) that are split into pieces. + unsigned getNumElements(MVT::ValueType VT) const { + return NumElementsForVT[VT]; + } + + //===--------------------------------------------------------------------===// + // TargetLowering Configuration Methods - These methods should be invoked by + // the derived class constructor to configure this object for the target. + // + +protected: + + /// addRegisterClass - Add the specified register class as an available + /// regclass for the specified value type. This indicates the selector can + /// handle values of that class natively. + void addRegisterClass(MVT::ValueType VT, TargetRegisterClass *RC) { + AvailableRegClasses.push_back(std::make_pair(VT, RC)); + RegClassForVT[VT] = RC; + } + + /// computeRegisterProperties - Once all of the register classes are added, + /// this allows us to compute derived properties we expose. + void computeRegisterProperties(); + + + void setOperationUnsupported(unsigned Op, MVT::ValueType VT) { + assert(VT < 16 && "Too many value types!"); + UnsupportedOps[Op] |= 1 << VT; + } + + /// addLegalFPImmediate - Indicate that this target can instruction select + /// the specified FP immediate natively. + void addLegalFPImmediate(double Imm) { + LegalFPImmediates.push_back(Imm); + } + + +public: + + //===--------------------------------------------------------------------===// + // Lowering methods - These methods must be implemented by targets so that + // the SelectionDAGLowering code knows how to lower these. + // + + /// LowerArguments - This hook must be implemented to indicate how we should + /// lower the arguments for the specified function, into the specified DAG. + virtual std::vector<SDOperand> + LowerArguments(Function &F, SelectionDAG &DAG) = 0; + + /// LowerCallTo - This hook lowers an abstract call to a function into an + /// actual call. + typedef std::vector<std::pair<SDOperand, const Type*> > ArgListTy; + virtual SDNode *LowerCallTo(const Type *RetTy, SDOperand Callee, + ArgListTy &Args, SelectionDAG &DAG) = 0; +}; +} // end llvm namespace + +#endif |