forked from OSchip/llvm-project
[PowerPC] Only use some extend mne if assembler is modern enough
Legacy AIX assembly might not support all extended mnes, add one feature bit to control the generation in MC, and avoid generating them by default on AIX. Reviewed By: sfertile Differential Revision: https://reviews.llvm.org/D94458
This commit is contained in:
parent
e2d7d3cb0e
commit
0f588ac03e
|
@ -78,7 +78,17 @@ static MCRegisterInfo *createPPCMCRegisterInfo(const Triple &TT) {
|
|||
|
||||
static MCSubtargetInfo *createPPCMCSubtargetInfo(const Triple &TT,
|
||||
StringRef CPU, StringRef FS) {
|
||||
return createPPCMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
|
||||
// Set some default feature to MC layer.
|
||||
std::string FullFS = std::string(FS);
|
||||
|
||||
if (TT.isOSAIX()) {
|
||||
if (!FullFS.empty())
|
||||
FullFS = "+aix," + FullFS;
|
||||
else
|
||||
FullFS = "+aix";
|
||||
}
|
||||
|
||||
return createPPCMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FullFS);
|
||||
}
|
||||
|
||||
static MCAsmInfo *createPPCMCAsmInfo(const MCRegisterInfo &MRI,
|
||||
|
|
|
@ -57,6 +57,10 @@ def DirectivePwrFuture
|
|||
|
||||
def Feature64Bit : SubtargetFeature<"64bit","Has64BitSupport", "true",
|
||||
"Enable 64-bit instructions">;
|
||||
def AIXOS: SubtargetFeature<"aix", "IsAIX", "true", "AIX OS">;
|
||||
def FeatureModernAIXAs
|
||||
: SubtargetFeature<"modern-aix-as", "HasModernAIXAs", "true",
|
||||
"AIX system assembler is modern enough to support new mnes">;
|
||||
def FeatureHardFloat : SubtargetFeature<"hard-float", "HasHardFloat", "true",
|
||||
"Enable floating-point instructions">;
|
||||
def Feature64BitRegs : SubtargetFeature<"64bitregs","Use64BitRegs", "true",
|
||||
|
|
|
@ -987,8 +987,11 @@ def : InstAlias<"cntlzw. $rA, $rS", (CNTLZW8_rec g8rc:$rA, g8rc:$rS)>;
|
|||
def : InstAlias<"mtxer $Rx", (MTSPR8 1, g8rc:$Rx)>;
|
||||
def : InstAlias<"mfxer $Rx", (MFSPR8 g8rc:$Rx, 1)>;
|
||||
|
||||
def : InstAlias<"mtudscr $Rx", (MTSPR8 3, g8rc:$Rx)>;
|
||||
def : InstAlias<"mfudscr $Rx", (MFSPR8 g8rc:$Rx, 3)>;
|
||||
//Disable this alias on AIX for now because as does not support them.
|
||||
let Predicates = [ModernAs] in {
|
||||
def : InstAlias<"mtudscr $Rx", (MTSPR8 3, g8rc:$Rx)>;
|
||||
def : InstAlias<"mfudscr $Rx", (MFSPR8 g8rc:$Rx, 3)>;
|
||||
}
|
||||
|
||||
def : InstAlias<"mfrtcu $Rx", (MFSPR8 g8rc:$Rx, 4)>;
|
||||
def : InstAlias<"mfrtcl $Rx", (MFSPR8 g8rc:$Rx, 5)>;
|
||||
|
|
|
@ -1120,6 +1120,10 @@ def HasFPU : Predicate<"Subtarget->hasFPU()">;
|
|||
def PCRelativeMemops : Predicate<"Subtarget->hasPCRelativeMemops()">;
|
||||
def IsNotISA3_1 : Predicate<"!Subtarget->isISA3_1()">;
|
||||
|
||||
// AIX assembler may not be modern enough to support some extended mne.
|
||||
def ModernAs: Predicate<"!Subtarget->isAIXABI() || Subtarget->HasModernAIXAs">,
|
||||
AssemblerPredicate<(any_of (not AIXOS), FeatureModernAIXAs)>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// PowerPC Multiclass Definitions.
|
||||
|
||||
|
@ -4649,8 +4653,11 @@ def : InstAlias<"mtmsr $RS", (MTMSR gprc:$RS, 0)>;
|
|||
def : InstAlias<"mtxer $Rx", (MTSPR 1, gprc:$Rx)>;
|
||||
def : InstAlias<"mfxer $Rx", (MFSPR gprc:$Rx, 1)>;
|
||||
|
||||
//Disable this alias on AIX for now because as does not support them.
|
||||
let Predicates = [ModernAs] in {
|
||||
def : InstAlias<"mtudscr $Rx", (MTSPR 3, gprc:$Rx)>;
|
||||
def : InstAlias<"mfudscr $Rx", (MFSPR gprc:$Rx, 3)>;
|
||||
}
|
||||
|
||||
def : InstAlias<"mfrtcu $Rx", (MFSPR gprc:$Rx, 4)>;
|
||||
def : InstAlias<"mfrtcl $Rx", (MFSPR gprc:$Rx, 5)>;
|
||||
|
|
|
@ -133,6 +133,8 @@ void PPCSubtarget::initializeEnvironment() {
|
|||
UsePPCPostRASchedStrategy = false;
|
||||
PairedVectorMemops = false;
|
||||
PredictableSelectIsExpensive = false;
|
||||
HasModernAIXAs = false;
|
||||
IsAIX = false;
|
||||
|
||||
HasPOPCNTD = POPCNTD_Unavailable;
|
||||
}
|
||||
|
|
|
@ -153,6 +153,8 @@ protected:
|
|||
bool UsePPCPostRASchedStrategy;
|
||||
bool PairedVectorMemops;
|
||||
bool PredictableSelectIsExpensive;
|
||||
bool HasModernAIXAs;
|
||||
bool IsAIX;
|
||||
|
||||
POPCNTDKind HasPOPCNTD;
|
||||
|
||||
|
|
|
@ -190,6 +190,13 @@ static std::string computeFSAdditions(StringRef FS, CodeGenOpt::Level OL,
|
|||
FullFS = "+invariant-function-descriptors";
|
||||
}
|
||||
|
||||
if (TT.isOSAIX()) {
|
||||
if (!FullFS.empty())
|
||||
FullFS = "+aix," + FullFS;
|
||||
else
|
||||
FullFS = "+aix";
|
||||
}
|
||||
|
||||
return FullFS;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
# RUN: llvm-mc --disassemble %s -triple powerpc64-unknown-unknown -mcpu=pwr7 | FileCheck %s
|
||||
# RUN: llvm-mc --disassemble %s -triple powerpc64-unknown-unknown -mcpu=pwr7 | FileCheck %s --check-prefixes=CHECK,MODERN
|
||||
# RUN: llvm-mc --disassemble %s -triple powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s --check-prefixes=CHECK,MODERN
|
||||
# RUN: llvm-mc --disassemble %s -triple powerpc64-ibm-aix-xcoff -mcpu=pwr7 | FileCheck %s --check-prefixes=CHECK,OLD
|
||||
# RUN: llvm-mc --disassemble %s -triple powerpc64-ibm-aix-xcoff -mattr=+modern-aix-as -mcpu=pwr7 | FileCheck %s --check-prefixes=CHECK,MODERN
|
||||
|
||||
# FIXME: decode as beqlr 0
|
||||
# CHECK: bclr 12, 2
|
||||
|
@ -2212,10 +2215,12 @@
|
|||
# CHECK: mfxer 2
|
||||
0x7c 0x41 0x02 0xa6
|
||||
|
||||
# CHECK: mtudscr 2
|
||||
# MODERN: mtudscr 2
|
||||
# OLD: mtspr 3, 2
|
||||
0x7c 0x43 0x03 0xa6
|
||||
|
||||
# CHECK: mfudscr 2
|
||||
# MODERN: mfudscr 2
|
||||
# OLD: mfspr 2, 3
|
||||
0x7c 0x43 0x02 0xa6
|
||||
|
||||
# CHECK: mtlr 2
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
# RUN: llvm-mc -triple powerpc64-unknown-unknown -mattr=+modern-aix-as --show-encoding %s | FileCheck -check-prefix=CHECK-BE %s
|
||||
# RUN: llvm-mc -triple powerpc64le-unknown-unknown -mattr=+modern-aix-as --show-encoding %s | FileCheck -check-prefix=CHECK-LE %s
|
||||
# RUN: llvm-mc -triple powerpc64le-unknown-unknown -mattr=-modern-aix-as --show-encoding %s | FileCheck -check-prefix=CHECK-LE %s
|
||||
# RUN: not llvm-mc -triple powerpc64le-unknown-unknown -mattr=+aix --show-encoding %s 2>&1 | FileCheck -check-prefix=CHECK-OLD %s
|
||||
##TODO: Replace above with following when implement createXCOFFAsmParser
|
||||
# UN: llvm-mc -triple powerpc-aix-ibm-xcoff -mattr=+modern-aix-as --show-encoding %s 2>&1 | FileCheck -check-prefix=CHECK-BE %s
|
||||
# UN: not llvm-mc -triple powerpc-aix-ibm-xcoff --show-encoding %s 2>&1 | FileCheck -check-prefix=CHECK-OLD %s
|
||||
|
||||
# CHECK-BE: mtudscr 2 # encoding: [0x7c,0x43,0x03,0xa6]
|
||||
# CHECK-LE: mtudscr 2 # encoding: [0xa6,0x03,0x43,0x7c]
|
||||
# CHECK-OLD: instruction use requires an option to be enabled
|
||||
mtudscr 2
|
||||
# CHECK-BE: mfudscr 2 # encoding: [0x7c,0x43,0x02,0xa6]
|
||||
# CHECK-LE: mfudscr 2 # encoding: [0xa6,0x02,0x43,0x7c]
|
||||
mfudscr 2
|
||||
|
Loading…
Reference in New Issue