[llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h

Chris Lattner lattner at cs.uiuc.edu
Thu Jan 6 23:44:37 PST 2005



Changes in directory llvm/include/llvm/Target:

TargetLowering.h added (r1.1)
---
Log message:

First draft of a new Target interface


---
Diffs of the changes:  (+175 -0)

Index: llvm/include/llvm/Target/TargetLowering.h
diff -c /dev/null llvm/include/llvm/Target/TargetLowering.h:1.1
*** /dev/null	Fri Jan  7 01:44:32 2005
--- llvm/include/llvm/Target/TargetLowering.h	Fri Jan  7 01:44:22 2005
***************
*** 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






More information about the llvm-commits mailing list