mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
[PowerPC] Add support for embedded devices with EFPU2
PowerPC cores like e200z759n3 [1] using an efpu2 only support single precision hardware floating point instructions. The single precision instructions efs* and evfs* are identical to the spe float instructions while efd* and evfd* instructions trigger a not implemented exception. This patch introduces a new command line option -mefpu2 which leads to single-hardware / double-software code generation. [1] Core reference: https://www.nxp.com/files-static/32bit/doc/ref_manual/e200z759CRM.pdf Differential revision: https://reviews.llvm.org/D92935
This commit is contained in:
parent
ffd34706f2
commit
dac23cf4a3
@ -72,6 +72,9 @@ def FeatureAltivec : SubtargetFeature<"altivec","HasAltivec", "true",
|
||||
def FeatureSPE : SubtargetFeature<"spe","HasSPE", "true",
|
||||
"Enable SPE instructions",
|
||||
[FeatureHardFloat]>;
|
||||
def FeatureEFPU2 : SubtargetFeature<"efpu2", "HasEFPU2", "true",
|
||||
"Enable Embedded Floating-Point APU 2 instructions",
|
||||
[FeatureSPE]>;
|
||||
def FeatureMFOCRF : SubtargetFeature<"mfocrf","HasMFOCRF", "true",
|
||||
"Enable the MFOCRF instruction">;
|
||||
def FeatureFSqrt : SubtargetFeature<"fsqrt","HasFSQRT", "true",
|
||||
|
@ -151,7 +151,9 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
|
||||
if (!useSoftFloat()) {
|
||||
if (hasSPE()) {
|
||||
addRegisterClass(MVT::f32, &PPC::GPRCRegClass);
|
||||
addRegisterClass(MVT::f64, &PPC::SPERCRegClass);
|
||||
// EFPU2 APU only supports f32
|
||||
if (!Subtarget.hasEFPU2())
|
||||
addRegisterClass(MVT::f64, &PPC::SPERCRegClass);
|
||||
} else {
|
||||
addRegisterClass(MVT::f32, &PPC::F4RCRegClass);
|
||||
addRegisterClass(MVT::f64, &PPC::F8RCRegClass);
|
||||
|
@ -77,6 +77,7 @@ void PPCSubtarget::initializeEnvironment() {
|
||||
HasHardFloat = false;
|
||||
HasAltivec = false;
|
||||
HasSPE = false;
|
||||
HasEFPU2 = false;
|
||||
HasFPU = false;
|
||||
HasVSX = false;
|
||||
NeedsTwoConstNR = false;
|
||||
|
@ -100,6 +100,7 @@ protected:
|
||||
bool HasAltivec;
|
||||
bool HasFPU;
|
||||
bool HasSPE;
|
||||
bool HasEFPU2;
|
||||
bool HasVSX;
|
||||
bool NeedsTwoConstNR;
|
||||
bool HasP8Vector;
|
||||
@ -257,6 +258,7 @@ public:
|
||||
bool hasFPCVT() const { return HasFPCVT; }
|
||||
bool hasAltivec() const { return HasAltivec; }
|
||||
bool hasSPE() const { return HasSPE; }
|
||||
bool hasEFPU2() const { return HasEFPU2; }
|
||||
bool hasFPU() const { return HasFPU; }
|
||||
bool hasVSX() const { return HasVSX; }
|
||||
bool needsTwoConstNR() const { return NeedsTwoConstNR; }
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user