1251875Speter//===-- XCoreTargetTransformInfo.cpp - XCore specific TTI pass ----------------===//
2251875Speter//
3251875Speter//                     The LLVM Compiler Infrastructure
4251875Speter//
5251875Speter// This file is distributed under the University of Illinois Open Source
6251875Speter// License. See LICENSE.TXT for details.
7251875Speter//
8251875Speter//===----------------------------------------------------------------------===//
9251875Speter/// \file
10251875Speter/// This file implements a TargetTransformInfo analysis pass specific to the
11251875Speter/// XCore target machine. It uses the target's detailed information to provide
12251875Speter/// more precise answers to certain TTI queries, while letting the target
13251875Speter/// independent and default TTI implementations handle the rest.
14251875Speter///
15251875Speter//===----------------------------------------------------------------------===//
16251875Speter
17251875Speter#define DEBUG_TYPE "xcoretti"
18251875Speter#include "XCore.h"
19251875Speter#include "llvm/Analysis/TargetTransformInfo.h"
20251875Speter#include "llvm/Support/Debug.h"
21251875Speter#include "llvm/Target/TargetLowering.h"
22251875Speter#include "llvm/Target/CostTable.h"
23251875Speterusing namespace llvm;
24251875Speter
25251875Speter// Declare the pass initialization routine locally as target-specific passes
26251875Speter// don't havve a target-wide initialization entry point, and so we rely on the
27251875Speter// pass constructor initialization.
28251875Speternamespace llvm {
29251875Spetervoid initializeXCoreTTIPass(PassRegistry &);
30251875Speter}
31251875Speter
32251875Speternamespace {
33251875Speter
34251875Speterclass XCoreTTI : public ImmutablePass, public TargetTransformInfo {
35251875Speterpublic:
36251875Speter  XCoreTTI() : ImmutablePass(ID) {
37251875Speter    llvm_unreachable("This pass cannot be directly constructed");
38251875Speter  }
39251875Speter
40251875Speter  XCoreTTI(const XCoreTargetMachine *TM)
41251875Speter      : ImmutablePass(ID) {
42251875Speter    initializeXCoreTTIPass(*PassRegistry::getPassRegistry());
43251875Speter  }
44251875Speter
45251875Speter  virtual void initializePass() {
46251875Speter    pushTTIStack(this);
47251875Speter  }
48251875Speter
49251875Speter  virtual void finalizePass() {
50251875Speter    popTTIStack();
51251875Speter  }
52251875Speter
53251875Speter  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
54251875Speter    TargetTransformInfo::getAnalysisUsage(AU);
55251875Speter  }
56251875Speter
57251875Speter  static char ID;
58251875Speter
59251875Speter  virtual void *getAdjustedAnalysisPointer(const void *ID) {
60251875Speter    if (ID == &TargetTransformInfo::ID)
61251875Speter      return (TargetTransformInfo*)this;
62251875Speter    return this;
63251875Speter  }
64251875Speter
65251875Speter  unsigned getNumberOfRegisters(bool Vector) const {
66251875Speter    if (Vector) {
67251875Speter       return 0;
68251875Speter    }
69251875Speter    return 12;
70251875Speter  }
71251875Speter};
72251875Speter
73251875Speter} // end anonymous namespace
74251875Speter
75251875SpeterINITIALIZE_AG_PASS(XCoreTTI, TargetTransformInfo, "xcoretti",
76251875Speter                   "XCore Target Transform Info", true, true, false)
77251875Speterchar XCoreTTI::ID = 0;
78251875Speter
79251875Speter
80251875SpeterImmutablePass *
81251875Speterllvm::createXCoreTargetTransformInfoPass(const XCoreTargetMachine *TM) {
82251875Speter  return new XCoreTTI(TM);
83251875Speter}
84251875Speter