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