mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-29 13:32:33 +00:00
Support changing the subtarget features in ARM.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175315 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
789cb5df9c
commit
4788d14b48
@ -14,7 +14,9 @@
|
|||||||
#include "ARMSubtarget.h"
|
#include "ARMSubtarget.h"
|
||||||
#include "ARMBaseInstrInfo.h"
|
#include "ARMBaseInstrInfo.h"
|
||||||
#include "ARMBaseRegisterInfo.h"
|
#include "ARMBaseRegisterInfo.h"
|
||||||
|
#include "llvm/IR/Attributes.h"
|
||||||
#include "llvm/IR/GlobalValue.h"
|
#include "llvm/IR/GlobalValue.h"
|
||||||
|
#include "llvm/IR/Function.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Target/TargetInstrInfo.h"
|
#include "llvm/Target/TargetInstrInfo.h"
|
||||||
|
|
||||||
@ -85,17 +87,35 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU,
|
|||||||
, CPUString(CPU)
|
, CPUString(CPU)
|
||||||
, TargetTriple(TT)
|
, TargetTriple(TT)
|
||||||
, TargetABI(ARM_ABI_APCS) {
|
, TargetABI(ARM_ABI_APCS) {
|
||||||
// Determine default and user specified characteristics
|
resetSubtargetFeatures(CPU, FS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ARMSubtarget::resetSubtargetFeatures(const MachineFunction *MF) {
|
||||||
|
AttributeSet FnAttrs = MF->getFunction()->getAttributes();
|
||||||
|
Attribute CPUAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex,
|
||||||
|
"target-cpu");
|
||||||
|
Attribute FSAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex,
|
||||||
|
"target-features");
|
||||||
|
std::string CPU =
|
||||||
|
!CPUAttr.hasAttribute(Attribute::None) ?CPUAttr.getValueAsString() : "";
|
||||||
|
std::string FS =
|
||||||
|
!FSAttr.hasAttribute(Attribute::None) ? FSAttr.getValueAsString() : "";
|
||||||
|
if (!FS.empty())
|
||||||
|
resetSubtargetFeatures(CPU, FS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ARMSubtarget::resetSubtargetFeatures(StringRef CPU, StringRef FS) {
|
||||||
if (CPUString.empty())
|
if (CPUString.empty())
|
||||||
CPUString = "generic";
|
CPUString = "generic";
|
||||||
|
|
||||||
// Insert the architecture feature derived from the target triple into the
|
// Insert the architecture feature derived from the target triple into the
|
||||||
// feature string. This is important for setting features that are implied
|
// feature string. This is important for setting features that are implied
|
||||||
// based on the architecture version.
|
// based on the architecture version.
|
||||||
std::string ArchFS = ARM_MC::ParseARMTriple(TT, CPUString);
|
std::string ArchFS = ARM_MC::ParseARMTriple(TargetTriple.getTriple(),
|
||||||
|
CPUString);
|
||||||
if (!FS.empty()) {
|
if (!FS.empty()) {
|
||||||
if (!ArchFS.empty())
|
if (!ArchFS.empty())
|
||||||
ArchFS = ArchFS + "," + FS;
|
ArchFS = ArchFS + "," + FS.str();
|
||||||
else
|
else
|
||||||
ArchFS = FS;
|
ArchFS = FS;
|
||||||
}
|
}
|
||||||
@ -112,7 +132,8 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU,
|
|||||||
// Initialize scheduling itinerary for the specified CPU.
|
// Initialize scheduling itinerary for the specified CPU.
|
||||||
InstrItins = getInstrItineraryForCPU(CPUString);
|
InstrItins = getInstrItineraryForCPU(CPUString);
|
||||||
|
|
||||||
if ((TT.find("eabi") != std::string::npos) || (isTargetIOS() && isMClass()))
|
if ((TargetTriple.getTriple().find("eabi") != std::string::npos) ||
|
||||||
|
(isTargetIOS() && isMClass()))
|
||||||
// FIXME: We might want to separate AAPCS and EABI. Some systems, e.g.
|
// FIXME: We might want to separate AAPCS and EABI. Some systems, e.g.
|
||||||
// Darwin-EABI conforms to AACPS but not the rest of EABI.
|
// Darwin-EABI conforms to AACPS but not the rest of EABI.
|
||||||
TargetABI = ARM_ABI_AAPCS;
|
TargetABI = ARM_ABI_AAPCS;
|
||||||
|
@ -202,6 +202,10 @@ protected:
|
|||||||
/// subtarget options. Definition of function is auto generated by tblgen.
|
/// subtarget options. Definition of function is auto generated by tblgen.
|
||||||
void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
|
void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
|
||||||
|
|
||||||
|
/// \brief Reset the features for the X86 target.
|
||||||
|
virtual void resetSubtargetFeatures(const MachineFunction *MF);
|
||||||
|
void resetSubtargetFeatures(StringRef CPU, StringRef FS);
|
||||||
|
|
||||||
void computeIssueWidth();
|
void computeIssueWidth();
|
||||||
|
|
||||||
bool hasV4TOps() const { return HasV4TOps; }
|
bool hasV4TOps() const { return HasV4TOps; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user