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