mirror of
https://github.com/opnsense/src.git
synced 2026-05-19 16:35:42 -04:00
3.4 on Sparc64 (commit descriptions left out for brevity): r196755 r198028 r198029 r198030 r198145 r198149 r198157 r198565 r199186 r199187 r198280 r198281 r198286 r198480 r198484 r198533 r198567 r198580 r198591 r198592 r198658 r198681 r198738 r198739 r198740 r198893 r198909 r198910 r199014 r199024 r199028 r199031 r199033 r199061 r199775 r199781 r199786 r199940 r199974 r199975 r199977 r200103 r200104 r200112 r200130 r200131 r200141 r200282 r200368 r200373 r200376 r200509 r200617 r200960 r200961 r200962 r200963 r200965 Submitted by: rdivacky
75 lines
2.4 KiB
C++
75 lines
2.4 KiB
C++
//===-- SparcSubtarget.cpp - SPARC Subtarget Information ------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the SPARC specific subclass of TargetSubtargetInfo.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "SparcSubtarget.h"
|
|
#include "Sparc.h"
|
|
#include "llvm/Support/MathExtras.h"
|
|
#include "llvm/Support/TargetRegistry.h"
|
|
|
|
#define GET_SUBTARGETINFO_TARGET_DESC
|
|
#define GET_SUBTARGETINFO_CTOR
|
|
#include "SparcGenSubtargetInfo.inc"
|
|
|
|
using namespace llvm;
|
|
|
|
void SparcSubtarget::anchor() { }
|
|
|
|
SparcSubtarget::SparcSubtarget(const std::string &TT, const std::string &CPU,
|
|
const std::string &FS, bool is64Bit) :
|
|
SparcGenSubtargetInfo(TT, CPU, FS),
|
|
IsV9(false),
|
|
V8DeprecatedInsts(false),
|
|
IsVIS(false),
|
|
Is64Bit(is64Bit),
|
|
HasHardQuad(false),
|
|
UsePopc(false) {
|
|
|
|
// Determine default and user specified characteristics
|
|
std::string CPUName = CPU;
|
|
if (CPUName.empty())
|
|
CPUName = (is64Bit) ? "v9" : "v8";
|
|
|
|
// Parse features string.
|
|
ParseSubtargetFeatures(CPUName, FS);
|
|
|
|
// Popc is a v9-only instruction.
|
|
if (!IsV9)
|
|
UsePopc = false;
|
|
}
|
|
|
|
|
|
int SparcSubtarget::getAdjustedFrameSize(int frameSize) const {
|
|
|
|
if (is64Bit()) {
|
|
// All 64-bit stack frames must be 16-byte aligned, and must reserve space
|
|
// for spilling the 16 window registers at %sp+BIAS..%sp+BIAS+128.
|
|
frameSize += 128;
|
|
// Frames with calls must also reserve space for 6 outgoing arguments
|
|
// whether they are used or not. LowerCall_64 takes care of that.
|
|
assert(frameSize % 16 == 0 && "Stack size not 16-byte aligned");
|
|
} else {
|
|
// Emit the correct save instruction based on the number of bytes in
|
|
// the frame. Minimum stack frame size according to V8 ABI is:
|
|
// 16 words for register window spill
|
|
// 1 word for address of returned aggregate-value
|
|
// + 6 words for passing parameters on the stack
|
|
// ----------
|
|
// 23 words * 4 bytes per word = 92 bytes
|
|
frameSize += 92;
|
|
|
|
// Round up to next doubleword boundary -- a double-word boundary
|
|
// is required by the ABI.
|
|
frameSize = RoundUpToAlignment(frameSize, 8);
|
|
}
|
|
return frameSize;
|
|
}
|