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
1994214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_TARGET_DESC
20ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#define GET_SUBTARGETINFO_CTOR
21385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "SparcGenSubtargetInfo.inc"
2294214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
230d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattnerusing namespace llvm;
240d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner
252d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid SparcSubtarget::anchor() { }
262d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
27276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan ChengSparcSubtarget::SparcSubtarget(const std::string &TT, const std::string &CPU,
28276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng                               const std::string &FS,  bool is64Bit) :
290ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  SparcGenSubtargetInfo(TT, CPU, FS),
3087c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  IsV9(false),
3187c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  V8DeprecatedInsts(false),
3287c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  IsVIS(false),
3387c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  Is64Bit(is64Bit) {
341e06bcbd633175d75d13aaa5695ca0633ba86068Venkatraman Govindaraju
350d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner  // Determine default and user specified characteristics
36276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  std::string CPUName = CPU;
37276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  if (CPUName.empty()) {
38276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng    if (is64Bit)
39276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng      CPUName = "v9";
40276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng    else
41276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng      CPUName = "v8";
4287c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  }
43276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  IsV9 = CPUName == "v9";
440d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner
450d170a7969e7e36ad00afe596f2937f0c74d2b49Chris Lattner  // Parse features string.
460ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  ParseSubtargetFeatures(CPUName, FS);
47d74ea2bbd8bb630331f35ead42d385249bd42af8Chris Lattner}
4872ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju
4972ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju
5072ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindarajuint SparcSubtarget::getAdjustedFrameSize(int frameSize) const {
5172ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju
5272ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  if (is64Bit()) {
5372ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // All 64-bit stack frames must be 16-byte aligned, and must reserve space
5472ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // for spilling the 16 window registers at %sp+BIAS..%sp+BIAS+128.
5572ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    frameSize += 128;
5672ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // Frames with calls must also reserve space for 6 outgoing arguments
5772ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // whether they are used or not. LowerCall_64 takes care of that.
5872ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    assert(frameSize % 16 == 0 && "Stack size not 16-byte aligned");
5972ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  } else {
6072ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // Emit the correct save instruction based on the number of bytes in
6172ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // the frame. Minimum stack frame size according to V8 ABI is:
6272ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    //   16 words for register window spill
6372ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    //    1 word for address of returned aggregate-value
6472ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // +  6 words for passing parameters on the stack
6572ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // ----------
6672ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    //   23 words * 4 bytes per word = 92 bytes
6772ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    frameSize += 92;
6872ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju
6972ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // Round up to next doubleword boundary -- a double-word boundary
7072ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    // is required by the ABI.
7172ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    frameSize = RoundUpToAlignment(frameSize, 8);
7272ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  }
7372ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  return frameSize;
7472ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju}
75