XCoreTargetTransformInfo.cpp revision 261991
1249259Sdim//===-- XCoreTargetTransformInfo.cpp - XCore specific TTI pass ----------------===//
2249259Sdim//
3353358Sdim//                     The LLVM Compiler Infrastructure
4353358Sdim//
5353358Sdim// This file is distributed under the University of Illinois Open Source
6249259Sdim// License. See LICENSE.TXT for details.
7249259Sdim//
8249259Sdim//===----------------------------------------------------------------------===//
9249259Sdim/// \file
10249259Sdim/// This file implements a TargetTransformInfo analysis pass specific to the
11249259Sdim/// XCore target machine. It uses the target's detailed information to provide
12249259Sdim/// more precise answers to certain TTI queries, while letting the target
13249259Sdim/// independent and default TTI implementations handle the rest.
14249259Sdim///
15249259Sdim//===----------------------------------------------------------------------===//
16249259Sdim
17314564Sdim#define DEBUG_TYPE "xcoretti"
18314564Sdim#include "XCore.h"
19249259Sdim#include "llvm/Analysis/TargetTransformInfo.h"
20249259Sdim#include "llvm/Support/Debug.h"
21249259Sdim#include "llvm/Target/TargetLowering.h"
22314564Sdim#include "llvm/Target/CostTable.h"
23314564Sdimusing namespace llvm;
24314564Sdim
25249259Sdim// Declare the pass initialization routine locally as target-specific passes
26249259Sdim// don't havve a target-wide initialization entry point, and so we rely on the
27249259Sdim// pass constructor initialization.
28280031Sdimnamespace llvm {
29280031Sdimvoid initializeXCoreTTIPass(PassRegistry &);
30249259Sdim}
31249259Sdim
32314564Sdimnamespace {
33314564Sdim
34314564Sdimclass XCoreTTI : public ImmutablePass, public TargetTransformInfo {
35321369Sdimpublic:
36314564Sdim  XCoreTTI() : ImmutablePass(ID) {
37314564Sdim    llvm_unreachable("This pass cannot be directly constructed");
38314564Sdim  }
39280031Sdim
40249259Sdim  XCoreTTI(const XCoreTargetMachine *TM)
41249259Sdim      : ImmutablePass(ID) {
42249259Sdim    initializeXCoreTTIPass(*PassRegistry::getPassRegistry());
43249259Sdim  }
44249259Sdim
45249259Sdim  virtual void initializePass() {
46280031Sdim    pushTTIStack(this);
47280031Sdim  }
48249259Sdim
49249259Sdim  virtual void finalizePass() {
50249259Sdim    popTTIStack();
51249259Sdim  }
52249259Sdim
53249259Sdim  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
54249259Sdim    TargetTransformInfo::getAnalysisUsage(AU);
55249259Sdim  }
56321369Sdim
57321369Sdim  static char ID;
58321369Sdim
59249259Sdim  virtual void *getAdjustedAnalysisPointer(const void *ID) {
60249259Sdim    if (ID == &TargetTransformInfo::ID)
61249259Sdim      return (TargetTransformInfo*)this;
62249259Sdim    return this;
63327952Sdim  }
64327952Sdim
65327952Sdim  unsigned getNumberOfRegisters(bool Vector) const {
66249259Sdim    if (Vector) {
67249259Sdim       return 0;
68249259Sdim    }
69360784Sdim    return 12;
70249259Sdim  }
71249259Sdim};
72249259Sdim
73249259Sdim} // end anonymous namespace
74249259Sdim
75309124SdimINITIALIZE_AG_PASS(XCoreTTI, TargetTransformInfo, "xcoretti",
76249259Sdim                   "XCore Target Transform Info", true, true, false)
77314564Sdimchar XCoreTTI::ID = 0;
78249259Sdim
79249259Sdim
80249259SdimImmutablePass *
81249259Sdimllvm::createXCoreTargetTransformInfoPass(const XCoreTargetMachine *TM) {
82249259Sdim  return new XCoreTTI(TM);
83249259Sdim}
84249259Sdim