diff --git a/llvm/lib/Target/PowerPC/PPC.td b/llvm/lib/Target/PowerPC/PPC.td --- a/llvm/lib/Target/PowerPC/PPC.td +++ b/llvm/lib/Target/PowerPC/PPC.td @@ -57,6 +57,8 @@ def Feature64Bit : SubtargetFeature<"64bit","Has64BitSupport", "true", "Enable 64-bit instructions">; +def FeatureModernAs : SubtargetFeature<"modern-as","HasModernAs", "true", + "Has new Assembler" >; def FeatureHardFloat : SubtargetFeature<"hard-float", "HasHardFloat", "true", "Enable floating-point instructions">; def Feature64BitRegs : SubtargetFeature<"64bitregs","Use64BitRegs", "true", diff --git a/llvm/lib/Target/PowerPC/PPCInstr64Bit.td b/llvm/lib/Target/PowerPC/PPCInstr64Bit.td --- a/llvm/lib/Target/PowerPC/PPCInstr64Bit.td +++ b/llvm/lib/Target/PowerPC/PPCInstr64Bit.td @@ -987,8 +987,11 @@ 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 for now because as on AIX 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)>; diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.td b/llvm/lib/Target/PowerPC/PPCInstrInfo.td --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.td +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.td @@ -1119,6 +1119,7 @@ def HasFPU : Predicate<"Subtarget->hasFPU()">; def PCRelativeMemops : Predicate<"Subtarget->hasPCRelativeMemops()">; def IsNotISA3_1 : Predicate<"!Subtarget->isISA3_1()">; +def ModernAs: Predicate<"Subtarget->HasModernAs">, AssemblerPredicate<(all_of FeatureModernAs)>; //===----------------------------------------------------------------------===// // PowerPC Multiclass Definitions. @@ -4649,8 +4650,10 @@ def : InstAlias<"mtxer $Rx", (MTSPR 1, gprc:$Rx)>; def : InstAlias<"mfxer $Rx", (MFSPR gprc:$Rx, 1)>; +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)>; diff --git a/llvm/lib/Target/PowerPC/PPCSubtarget.h b/llvm/lib/Target/PowerPC/PPCSubtarget.h --- a/llvm/lib/Target/PowerPC/PPCSubtarget.h +++ b/llvm/lib/Target/PowerPC/PPCSubtarget.h @@ -153,6 +153,7 @@ bool UsePPCPostRASchedStrategy; bool PairedVectorMemops; bool PredictableSelectIsExpensive; + bool HasModernAs; POPCNTDKind HasPOPCNTD; diff --git a/llvm/lib/Target/PowerPC/PPCSubtarget.cpp b/llvm/lib/Target/PowerPC/PPCSubtarget.cpp --- a/llvm/lib/Target/PowerPC/PPCSubtarget.cpp +++ b/llvm/lib/Target/PowerPC/PPCSubtarget.cpp @@ -133,6 +133,7 @@ UsePPCPostRASchedStrategy = false; PairedVectorMemops = false; PredictableSelectIsExpensive = false; + HasModernAs = false; HasPOPCNTD = POPCNTD_Unavailable; } diff --git a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp --- a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -190,6 +190,13 @@ FullFS = "+invariant-function-descriptors"; } + if (!TT.isOSAIX()) { + if (!FullFS.empty()) + FullFS = "+modern-as," + FullFS; + else + FullFS = "+modern-as"; + } + return FullFS; } diff --git a/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ext.txt b/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ext.txt --- a/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ext.txt +++ b/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ext.txt @@ -1,4 +1,5 @@ # RUN: llvm-mc --disassemble %s -triple powerpc64-unknown-unknown -mcpu=pwr7 | FileCheck %s +# RUN: llvm-mc --disassemble %s -triple powerpc64-unknown-unknown -mattr=+modern-as -mcpu=pwr7 | FileCheck %s --check-prefix=MODERN # FIXME: decode as beqlr 0 # CHECK: bclr 12, 2 @@ -2212,10 +2213,12 @@ # CHECK: mfxer 2 0x7c 0x41 0x02 0xa6 -# CHECK: mtudscr 2 +# MODERN: mtudscr 2 +# CHECK: mtspr 3, 2 0x7c 0x43 0x03 0xa6 -# CHECK: mfudscr 2 +# MODERN: mfudscr 2 +# CHECK: mfspr 2, 3 0x7c 0x43 0x02 0xa6 # CHECK: mtlr 2 diff --git a/llvm/test/MC/PowerPC/modern-as.s b/llvm/test/MC/PowerPC/modern-as.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/PowerPC/modern-as.s @@ -0,0 +1,10 @@ +# RUN: llvm-mc -triple powerpc64-unknown-unknown -mattr=+modern-as --show-encoding %s | FileCheck -check-prefix=CHECK-BE %s +# RUN: llvm-mc -triple powerpc64le-unknown-unknown -mattr=+modern-as --show-encoding %s | FileCheck -check-prefix=CHECK-LE %s + +# CHECK-BE: mtudscr 2 # encoding: [0x7c,0x43,0x03,0xa6] +# CHECK-LE: mtudscr 2 # encoding: [0xa6,0x03,0x43,0x7c] + mtudscr 2 +# CHECK-BE: mfudscr 2 # encoding: [0x7c,0x43,0x02,0xa6] +# CHECK-LE: mfudscr 2 # encoding: [0xa6,0x02,0x43,0x7c] + mfudscr 2 + diff --git a/llvm/test/MC/PowerPC/ppc64-encoding-ext.s b/llvm/test/MC/PowerPC/ppc64-encoding-ext.s --- a/llvm/test/MC/PowerPC/ppc64-encoding-ext.s +++ b/llvm/test/MC/PowerPC/ppc64-encoding-ext.s @@ -3419,12 +3419,6 @@ # CHECK-BE: mfxer 2 # encoding: [0x7c,0x41,0x02,0xa6] # CHECK-LE: mfxer 2 # encoding: [0xa6,0x02,0x41,0x7c] mfxer 2 -# CHECK-BE: mtudscr 2 # encoding: [0x7c,0x43,0x03,0xa6] -# CHECK-LE: mtudscr 2 # encoding: [0xa6,0x03,0x43,0x7c] - mtudscr 2 -# CHECK-BE: mfudscr 2 # encoding: [0x7c,0x43,0x02,0xa6] -# CHECK-LE: mfudscr 2 # encoding: [0xa6,0x02,0x43,0x7c] - mfudscr 2 # CHECK-BE: mfrtcu 2 # encoding: [0x7c,0x44,0x02,0xa6] # CHECK-LE: mfrtcu 2 # encoding: [0xa6,0x02,0x44,0x7c] mfrtcu 2