131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- SparcSubtarget.cpp - SPARC Subtarget Information ------------------===//
20d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner//
30d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner//                     The LLVM Compiler Infrastructure
40d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
70d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner//
80d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner//===----------------------------------------------------------------------===//
90d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner//
105b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng// This file implements the SPARC specific subclass of TargetSubtargetInfo.
110d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner//
120d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner//===----------------------------------------------------------------------===//
130d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner
147c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "SparcSubtarget.h"
15ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng#include "Sparc.h"
1672ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju#include "llvm/Support/MathExtras.h"
173e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
1894214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace llvm;
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "sparc-subtarget"
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2394214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_TARGET_DESC
24ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#define GET_SUBTARGETINFO_CTOR
25385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "SparcGenSubtargetInfo.inc"
2694214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
272d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid SparcSubtarget::anchor() { }
282d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic std::string computeDataLayout(const SparcSubtarget &ST) {
30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Sparc is big endian.
31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::string Ret = "E-m:e";
32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Some ABIs have 32bit pointers.
34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!ST.is64Bit())
35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-p:32:32";
36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
37cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Alignments for 64 bit integers.
38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Ret += "-i64:64";
39cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
40cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // On SparcV9 128 floats are aligned to 128 bits, on others only to 64.
41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // On SparcV9 registers can hold 64 or 32 bits, on others only 32.
42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (ST.is64Bit())
43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-n32:64";
44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  else
45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-f128:64-n32";
46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (ST.is64Bit())
48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-S128";
49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  else
50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-S64";
51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return Ret;
53cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSparcSubtarget &SparcSubtarget::initializeSubtargetDependencies(StringRef CPU,
56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                                                StringRef FS) {
57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  IsV9 = false;
58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  V8DeprecatedInsts = false;
59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  IsVIS = false;
60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  HasHardQuad = false;
61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  UsePopc = false;
621e06bcbd633175d75d13aaa5695ca0633ba86068Venkatraman Govindaraju
630d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner  // Determine default and user specified characteristics
64276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  std::string CPUName = CPU;
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (CPUName.empty())
66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    CPUName = (Is64Bit) ? "v9" : "v8";
670d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner
680d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner  // Parse features string.
690ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  ParseSubtargetFeatures(CPUName, FS);
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Popc is a v9-only instruction.
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!IsV9)
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    UsePopc = false;
74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return *this;
76d74ea2bbd8bb630331f35ead42d385249bd42af8Chris Lattner}
7772ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju
78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSparcSubtarget::SparcSubtarget(const std::string &TT, const std::string &CPU,
79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                               const std::string &FS, TargetMachine &TM,
80cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                               bool is64Bit)
81cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    : SparcGenSubtargetInfo(TT, CPU, FS), Is64Bit(is64Bit),
82cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      DL(computeDataLayout(initializeSubtargetDependencies(CPU, FS))),
83cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      InstrInfo(*this), TLInfo(TM), TSInfo(DL), FrameLowering(*this) {}
8472ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju
8572ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindarajuint SparcSubtarget::getAdjustedFrameSize(int frameSize) const {
8672ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju
8772ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  if (is64Bit()) {
8872ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // All 64-bit stack frames must be 16-byte aligned, and must reserve space
8972ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // for spilling the 16 window registers at %sp+BIAS..%sp+BIAS+128.
9072ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    frameSize += 128;
9172ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // Frames with calls must also reserve space for 6 outgoing arguments
9272ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // whether they are used or not. LowerCall_64 takes care of that.
9372ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    assert(frameSize % 16 == 0 && "Stack size not 16-byte aligned");
9472ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  } else {
9572ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // Emit the correct save instruction based on the number of bytes in
9672ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // the frame. Minimum stack frame size according to V8 ABI is:
9772ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    //   16 words for register window spill
9872ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    //    1 word for address of returned aggregate-value
9972ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // +  6 words for passing parameters on the stack
10072ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // ----------
10172ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    //   23 words * 4 bytes per word = 92 bytes
10272ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    frameSize += 92;
10372ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju
10472ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // Round up to next doubleword boundary -- a double-word boundary
10572ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // is required by the ABI.
10672ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    frameSize = RoundUpToAlignment(frameSize, 8);
10772ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  }
10872ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  return frameSize;
10972ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju}
110