mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
[mips] Replace MipsABIEnum with a MipsABIInfo class.
Summary: No functional change yet, it's just an object replacement for an enum. It will allow us to gather ABI information in a single place so that we can start testing for properties of the ABI's instead of the ABI itself. For example we will eventually be able to use: ABI.MinStackAlignmentInBytes() instead of: (isABI_N32() || isABI_N64()) ? 16 : 8 which is clearer and more maintainable. Reviewers: matheusalmeida Reviewed By: matheusalmeida Differential Revision: http://reviews.llvm.org/D3341 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220568 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5ea04462dc
commit
2992ea0cb5
@ -69,13 +69,13 @@ def FeatureNaN2008 : SubtargetFeature<"nan2008", "IsNaN2008bit", "true",
|
|||||||
"IEEE 754-2008 NaN encoding.">;
|
"IEEE 754-2008 NaN encoding.">;
|
||||||
def FeatureSingleFloat : SubtargetFeature<"single-float", "IsSingleFloat",
|
def FeatureSingleFloat : SubtargetFeature<"single-float", "IsSingleFloat",
|
||||||
"true", "Only supports single precision float">;
|
"true", "Only supports single precision float">;
|
||||||
def FeatureO32 : SubtargetFeature<"o32", "MipsABI", "O32",
|
def FeatureO32 : SubtargetFeature<"o32", "ABI", "MipsABIInfo::O32()",
|
||||||
"Enable o32 ABI">;
|
"Enable o32 ABI">;
|
||||||
def FeatureN32 : SubtargetFeature<"n32", "MipsABI", "N32",
|
def FeatureN32 : SubtargetFeature<"n32", "ABI", "MipsABIInfo::N32()",
|
||||||
"Enable n32 ABI">;
|
"Enable n32 ABI">;
|
||||||
def FeatureN64 : SubtargetFeature<"n64", "MipsABI", "N64",
|
def FeatureN64 : SubtargetFeature<"n64", "ABI", "MipsABIInfo::N64()",
|
||||||
"Enable n64 ABI">;
|
"Enable n64 ABI">;
|
||||||
def FeatureEABI : SubtargetFeature<"eabi", "MipsABI", "EABI",
|
def FeatureEABI : SubtargetFeature<"eabi", "ABI", "MipsABIInfo::EABI()",
|
||||||
"Enable eabi ABI">;
|
"Enable eabi ABI">;
|
||||||
def FeatureNoOddSPReg : SubtargetFeature<"nooddspreg", "UseOddSPReg", "false",
|
def FeatureNoOddSPReg : SubtargetFeature<"nooddspreg", "UseOddSPReg", "false",
|
||||||
"Disable odd numbered single-precision "
|
"Disable odd numbered single-precision "
|
||||||
|
46
lib/Target/Mips/MipsABIInfo.h
Normal file
46
lib/Target/Mips/MipsABIInfo.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
//===---- MipsABIInfo.h - Information about MIPS ABI's --------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef MIPSABIINFO_H
|
||||||
|
#define MIPSABIINFO_H
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
class MipsABIInfo {
|
||||||
|
public:
|
||||||
|
enum class ABI { Unknown, O32, N32, N64, EABI };
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ABI ThisABI;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MipsABIInfo(ABI ThisABI) : ThisABI(ThisABI) {}
|
||||||
|
|
||||||
|
static MipsABIInfo Unknown() { return MipsABIInfo(ABI::Unknown); }
|
||||||
|
static MipsABIInfo O32() { return MipsABIInfo(ABI::O32); }
|
||||||
|
static MipsABIInfo N32() { return MipsABIInfo(ABI::N32); }
|
||||||
|
static MipsABIInfo N64() { return MipsABIInfo(ABI::N64); }
|
||||||
|
static MipsABIInfo EABI() { return MipsABIInfo(ABI::EABI); }
|
||||||
|
|
||||||
|
bool IsKnown() const { return ThisABI != ABI::Unknown; }
|
||||||
|
bool IsO32() const { return ThisABI == ABI::O32; }
|
||||||
|
bool IsN32() const { return ThisABI == ABI::N32; }
|
||||||
|
bool IsN64() const { return ThisABI == ABI::N64; }
|
||||||
|
bool IsEABI() const { return ThisABI == ABI::EABI; }
|
||||||
|
ABI GetEnumValue() const { return ThisABI; }
|
||||||
|
|
||||||
|
/// Ordering of ABI's
|
||||||
|
/// MipsGenSubtargetInfo.inc will use this to resolve conflicts when given
|
||||||
|
/// multiple ABI options.
|
||||||
|
bool operator<(const MipsABIInfo Other) const {
|
||||||
|
return ThisABI < Other.GetEnumValue();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -319,11 +319,11 @@ void MipsAsmPrinter::emitFrameDirective() {
|
|||||||
|
|
||||||
/// Emit Set directives.
|
/// Emit Set directives.
|
||||||
const char *MipsAsmPrinter::getCurrentABIString() const {
|
const char *MipsAsmPrinter::getCurrentABIString() const {
|
||||||
switch (Subtarget->getTargetABI()) {
|
switch (Subtarget->getABI().GetEnumValue()) {
|
||||||
case MipsSubtarget::O32: return "abi32";
|
case MipsABIInfo::ABI::O32: return "abi32";
|
||||||
case MipsSubtarget::N32: return "abiN32";
|
case MipsABIInfo::ABI::N32: return "abiN32";
|
||||||
case MipsSubtarget::N64: return "abi64";
|
case MipsABIInfo::ABI::N64: return "abi64";
|
||||||
case MipsSubtarget::EABI: return "eabi32"; // TODO: handle eabi64
|
case MipsABIInfo::ABI::EABI: return "eabi32"; // TODO: handle eabi64
|
||||||
default: llvm_unreachable("Unknown Mips ABI");
|
default: llvm_unreachable("Unknown Mips ABI");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -344,7 +344,6 @@ namespace {
|
|||||||
|
|
||||||
const TargetMachine &TM;
|
const TargetMachine &TM;
|
||||||
bool IsPIC;
|
bool IsPIC;
|
||||||
unsigned ABI;
|
|
||||||
const MipsSubtarget *STI;
|
const MipsSubtarget *STI;
|
||||||
const Mips16InstrInfo *TII;
|
const Mips16InstrInfo *TII;
|
||||||
MipsFunctionInfo *MFI;
|
MipsFunctionInfo *MFI;
|
||||||
@ -367,8 +366,7 @@ namespace {
|
|||||||
static char ID;
|
static char ID;
|
||||||
MipsConstantIslands(TargetMachine &tm)
|
MipsConstantIslands(TargetMachine &tm)
|
||||||
: MachineFunctionPass(ID), TM(tm),
|
: MachineFunctionPass(ID), TM(tm),
|
||||||
IsPIC(TM.getRelocationModel() == Reloc::PIC_),
|
IsPIC(TM.getRelocationModel() == Reloc::PIC_), STI(nullptr),
|
||||||
ABI(TM.getSubtarget<MipsSubtarget>().getTargetABI()), STI(nullptr),
|
|
||||||
MF(nullptr), MCP(nullptr), PrescannedForConstants(false) {}
|
MF(nullptr), MCP(nullptr), PrescannedForConstants(false) {}
|
||||||
|
|
||||||
const char *getPassName() const override {
|
const char *getPassName() const override {
|
||||||
|
@ -65,8 +65,8 @@ namespace {
|
|||||||
MipsLongBranch(TargetMachine &tm)
|
MipsLongBranch(TargetMachine &tm)
|
||||||
: MachineFunctionPass(ID), TM(tm),
|
: MachineFunctionPass(ID), TM(tm),
|
||||||
IsPIC(TM.getRelocationModel() == Reloc::PIC_),
|
IsPIC(TM.getRelocationModel() == Reloc::PIC_),
|
||||||
ABI(TM.getSubtarget<MipsSubtarget>().getTargetABI()),
|
ABI(TM.getSubtarget<MipsSubtarget>().getABI()),
|
||||||
LongBranchSeqSize(!IsPIC ? 2 : (ABI == MipsSubtarget::N64 ? 10 :
|
LongBranchSeqSize(!IsPIC ? 2 : (ABI.IsN64() ? 10 :
|
||||||
(!TM.getSubtarget<MipsSubtarget>().isTargetNaCl() ? 9 : 10))) {}
|
(!TM.getSubtarget<MipsSubtarget>().isTargetNaCl() ? 9 : 10))) {}
|
||||||
|
|
||||||
const char *getPassName() const override {
|
const char *getPassName() const override {
|
||||||
@ -87,7 +87,7 @@ namespace {
|
|||||||
MachineFunction *MF;
|
MachineFunction *MF;
|
||||||
SmallVector<MBBInfo, 16> MBBInfos;
|
SmallVector<MBBInfo, 16> MBBInfos;
|
||||||
bool IsPIC;
|
bool IsPIC;
|
||||||
unsigned ABI;
|
MipsABIInfo ABI;
|
||||||
unsigned LongBranchSeqSize;
|
unsigned LongBranchSeqSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -274,7 +274,7 @@ void MipsLongBranch::expandToLongBranch(MBBInfo &I) {
|
|||||||
const MipsSubtarget &Subtarget = TM.getSubtarget<MipsSubtarget>();
|
const MipsSubtarget &Subtarget = TM.getSubtarget<MipsSubtarget>();
|
||||||
unsigned BalOp = Subtarget.hasMips32r6() ? Mips::BAL : Mips::BAL_BR;
|
unsigned BalOp = Subtarget.hasMips32r6() ? Mips::BAL : Mips::BAL_BR;
|
||||||
|
|
||||||
if (ABI != MipsSubtarget::N64) {
|
if (!ABI.IsN64()) {
|
||||||
// $longbr:
|
// $longbr:
|
||||||
// addiu $sp, $sp, -8
|
// addiu $sp, $sp, -8
|
||||||
// sw $ra, 0($sp)
|
// sw $ra, 0($sp)
|
||||||
|
@ -106,7 +106,7 @@ MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
|
|||||||
const std::string &FS, bool little,
|
const std::string &FS, bool little,
|
||||||
const MipsTargetMachine *_TM)
|
const MipsTargetMachine *_TM)
|
||||||
: MipsGenSubtargetInfo(TT, CPU, FS), MipsArchVersion(Mips32),
|
: MipsGenSubtargetInfo(TT, CPU, FS), MipsArchVersion(Mips32),
|
||||||
MipsABI(UnknownABI), IsLittle(little), IsSingleFloat(false),
|
ABI(MipsABIInfo::Unknown()), IsLittle(little), IsSingleFloat(false),
|
||||||
IsFPXX(false), NoABICalls(false), IsFP64bit(false), UseOddSPReg(true),
|
IsFPXX(false), NoABICalls(false), IsFP64bit(false), UseOddSPReg(true),
|
||||||
IsNaN2008bit(false), IsGP64bit(false), HasVFPU(false), HasCnMips(false),
|
IsNaN2008bit(false), IsGP64bit(false), HasVFPU(false), HasCnMips(false),
|
||||||
IsLinux(true), HasMips3_32(false), HasMips3_32r2(false),
|
IsLinux(true), HasMips3_32(false), HasMips3_32r2(false),
|
||||||
@ -136,7 +136,7 @@ MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
|
|||||||
report_fatal_error("Code generation for MIPS-V is not implemented", false);
|
report_fatal_error("Code generation for MIPS-V is not implemented", false);
|
||||||
|
|
||||||
// Assert exactly one ABI was chosen.
|
// Assert exactly one ABI was chosen.
|
||||||
assert(MipsABI != UnknownABI);
|
assert(ABI.IsKnown());
|
||||||
assert((((getFeatureBits() & Mips::FeatureO32) != 0) +
|
assert((((getFeatureBits() & Mips::FeatureO32) != 0) +
|
||||||
((getFeatureBits() & Mips::FeatureEABI) != 0) +
|
((getFeatureBits() & Mips::FeatureEABI) != 0) +
|
||||||
((getFeatureBits() & Mips::FeatureN32) != 0) +
|
((getFeatureBits() & Mips::FeatureN32) != 0) +
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "llvm/MC/MCInstrItineraries.h"
|
#include "llvm/MC/MCInstrItineraries.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||||
|
#include "MipsABIInfo.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#define GET_SUBTARGETINFO_HEADER
|
#define GET_SUBTARGETINFO_HEADER
|
||||||
@ -35,13 +36,6 @@ class MipsTargetMachine;
|
|||||||
class MipsSubtarget : public MipsGenSubtargetInfo {
|
class MipsSubtarget : public MipsGenSubtargetInfo {
|
||||||
virtual void anchor();
|
virtual void anchor();
|
||||||
|
|
||||||
public:
|
|
||||||
// NOTE: O64 will not be supported.
|
|
||||||
enum MipsABIEnum {
|
|
||||||
UnknownABI, O32, N32, N64, EABI
|
|
||||||
};
|
|
||||||
|
|
||||||
protected:
|
|
||||||
enum MipsArchEnum {
|
enum MipsArchEnum {
|
||||||
Mips1, Mips2, Mips32, Mips32r2, Mips32r6, Mips3, Mips4, Mips5, Mips64,
|
Mips1, Mips2, Mips32, Mips32r2, Mips32r6, Mips3, Mips4, Mips5, Mips64,
|
||||||
Mips64r2, Mips64r6
|
Mips64r2, Mips64r6
|
||||||
@ -50,8 +44,8 @@ protected:
|
|||||||
// Mips architecture version
|
// Mips architecture version
|
||||||
MipsArchEnum MipsArchVersion;
|
MipsArchEnum MipsArchVersion;
|
||||||
|
|
||||||
// Mips supported ABIs
|
// Selected ABI
|
||||||
MipsABIEnum MipsABI;
|
MipsABIInfo ABI;
|
||||||
|
|
||||||
// IsLittle - The target is Little Endian
|
// IsLittle - The target is Little Endian
|
||||||
bool IsLittle;
|
bool IsLittle;
|
||||||
@ -158,12 +152,12 @@ public:
|
|||||||
CodeGenOpt::Level getOptLevelToEnablePostRAScheduler() const override;
|
CodeGenOpt::Level getOptLevelToEnablePostRAScheduler() const override;
|
||||||
|
|
||||||
/// Only O32 and EABI supported right now.
|
/// Only O32 and EABI supported right now.
|
||||||
bool isABI_EABI() const { return MipsABI == EABI; }
|
bool isABI_EABI() const { return ABI.IsEABI(); }
|
||||||
bool isABI_N64() const { return MipsABI == N64; }
|
bool isABI_N64() const { return ABI.IsN64(); }
|
||||||
bool isABI_N32() const { return MipsABI == N32; }
|
bool isABI_N32() const { return ABI.IsN32(); }
|
||||||
bool isABI_O32() const { return MipsABI == O32; }
|
bool isABI_O32() const { return ABI.IsO32(); }
|
||||||
bool isABI_FPXX() const { return isABI_O32() && IsFPXX; }
|
bool isABI_FPXX() const { return isABI_O32() && IsFPXX; }
|
||||||
unsigned getTargetABI() const { return MipsABI; }
|
const MipsABIInfo &getABI() const { return ABI; }
|
||||||
|
|
||||||
/// This constructor initializes the data members to match that
|
/// This constructor initializes the data members to match that
|
||||||
/// of the specified triple.
|
/// of the specified triple.
|
||||||
|
Loading…
Reference in New Issue
Block a user