SparcSubtarget.h revision 2b9355f2d9888d6a011353610b9ca24818de59a2
165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//===-- SparcSubtarget.h - Define Subtarget for the SPARC -------*- C++ -*-===//
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//                     The LLVM Compiler Infrastructure
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// This file is distributed under the University of Illinois Open Source
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// License. See LICENSE.TXT for details.
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//===----------------------------------------------------------------------===//
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// This file declares the SPARC specific subclass of TargetSubtargetInfo.
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//===----------------------------------------------------------------------===//
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#ifndef SPARC_SUBTARGET_H
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define SPARC_SUBTARGET_H
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "llvm/Target/TargetSubtargetInfo.h"
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <string>
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define GET_SUBTARGETINFO_HEADER
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "SparcGenSubtargetInfo.inc"
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace llvm {
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass StringRef;
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass SparcSubtarget : public SparcGenSubtargetInfo {
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  virtual void anchor();
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  bool IsV9;
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  bool V8DeprecatedInsts;
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  bool IsVIS;
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  bool Is64Bit;
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic:
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  SparcSubtarget(const std::string &TT, const std::string &CPU,
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                 const std::string &FS, bool is64bit);
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  bool isV9() const { return IsV9; }
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  bool isVIS() const { return IsVIS; }
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  bool useDeprecatedV8Instructions() const { return V8DeprecatedInsts; }
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  /// ParseSubtargetFeatures - Parses features string setting specified
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  /// subtarget options.  Definition of function is auto generated by tblgen.
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  bool is64Bit() const { return Is64Bit; }
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  std::string getDataLayout() const {
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    const char *p;
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    if (is64Bit()) {
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      p = "E-p:64:64:64-i64:64:64-f64:64:64-f128:128:128-n32:64";
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    } else {
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      p = "E-p:32:32:32-i64:64:64-f64:64:64-f128:64:64-n32";
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return std::string(p);
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  /// The 64-bit ABI uses biased stack and frame pointers, so the stack frame
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  /// of the current function is the area from [%sp+BIAS] to [%fp+BIAS].
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  int64_t getStackPointerBias() const {
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return is64Bit() ? 2047 : 0;
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn};
62
63} // end namespace llvm
64
65#endif
66