summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/Target/TargetAsmInfo.h10
-rw-r--r--llvm/lib/CodeGen/AsmPrinter.cpp6
-rw-r--r--llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp8
-rw-r--r--llvm/lib/Target/TargetAsmInfo.cpp1
-rw-r--r--llvm/lib/Target/X86/X86TargetAsmInfo.cpp7
-rw-r--r--llvm/lib/Target/X86/X86TargetAsmInfo.h2
-rw-r--r--llvm/test/Regression/CodeGen/PowerPC/2007-01-15-AsmDialect.ll26
7 files changed, 54 insertions, 6 deletions
diff --git a/llvm/include/llvm/Target/TargetAsmInfo.h b/llvm/include/llvm/Target/TargetAsmInfo.h
index c922d4c3d9b..6d80a7ebc86 100644
--- a/llvm/include/llvm/Target/TargetAsmInfo.h
+++ b/llvm/include/llvm/Target/TargetAsmInfo.h
@@ -89,7 +89,10 @@ namespace llvm {
/// emit before and after an inline assembly statement.
const char *InlineAsmStart; // Defaults to "#APP\n"
const char *InlineAsmEnd; // Defaults to "#NO_APP\n"
-
+
+ /// AssemblerDialect - Which dialect of an assembler variant to use.
+ unsigned AssemblerDialect; // Defaults to 0
+
//===--- Data Emission Directives -------------------------------------===//
/// ZeroDirective - this should be set to the directive used to get some
@@ -128,7 +131,7 @@ namespace llvm {
/// Otherwise, it emits ".align log2(N)", e.g. 3 to align to an 8 byte
/// boundary.
bool AlignmentIsInBytes; // Defaults to true
-
+
//===--- Section Switching Directives ---------------------------------===//
/// SwitchToSectionDirective - This is the directive used when we want to
@@ -343,6 +346,9 @@ namespace llvm {
const char *getInlineAsmEnd() const {
return InlineAsmEnd;
}
+ unsigned getAssemblerDialect() const {
+ return AssemblerDialect;
+ }
const char *getZeroDirective() const {
return ZeroDirective;
}
diff --git a/llvm/lib/CodeGen/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter.cpp
index 606c4b8ba52..caa9da0d2ff 100644
--- a/llvm/lib/CodeGen/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter.cpp
@@ -698,9 +698,9 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const {
O << TAI->getInlineAsmStart() << "\n\t";
- // The variant of the current asmprinter: FIXME: change.
- int AsmPrinterVariant = 0;
-
+ // The variant of the current asmprinter.
+ int AsmPrinterVariant = TAI->getAssemblerDialect();
+
int CurVariant = -1; // The number of the {.|.|.} region we are in.
const char *LastEmitted = AsmStr; // One past the last character emitted.
diff --git a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
index 6045cfa161d..7912f705738 100644
--- a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
@@ -16,6 +16,12 @@
#include "llvm/Function.h"
using namespace llvm;
+// ASM variant to use.
+enum {
+ PPC_OLD_MNEMONICS = 0,
+ PPC_NEW_MNEMONICS = 1
+};
+
PPCTargetAsmInfo::PPCTargetAsmInfo(const PPCTargetMachine &TM) {
bool isPPC64 = TM.getSubtargetImpl()->isPPC64();
@@ -26,6 +32,7 @@ PPCTargetAsmInfo::PPCTargetAsmInfo(const PPCTargetMachine &TM) {
LCOMMDirective = "\t.lcomm\t";
InlineAsmStart = "# InlineAsm Start";
InlineAsmEnd = "# InlineAsm End";
+ AssemblerDialect = PPC_OLD_MNEMONICS;
NeedsSet = true;
AddressSize = isPPC64 ? 8 : 4;
@@ -56,6 +63,7 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM)
UsedDirective = "\t.no_dead_strip\t";
WeakRefDirective = "\t.weak_reference\t";
HiddenDirective = "\t.private_extern\t";
+ AssemblerDialect = PPC_NEW_MNEMONICS;
}
LinuxTargetAsmInfo::LinuxTargetAsmInfo(const PPCTargetMachine &TM)
diff --git a/llvm/lib/Target/TargetAsmInfo.cpp b/llvm/lib/Target/TargetAsmInfo.cpp
index c2f3e034363..b1845007440 100644
--- a/llvm/lib/Target/TargetAsmInfo.cpp
+++ b/llvm/lib/Target/TargetAsmInfo.cpp
@@ -32,6 +32,7 @@ TargetAsmInfo::TargetAsmInfo() :
FunctionAddrSuffix(""),
InlineAsmStart("#APP"),
InlineAsmEnd("#NO_APP"),
+ AssemblerDialect(0),
ZeroDirective("\t.zero\t"),
ZeroDirectiveSuffix(0),
AsciiDirective("\t.ascii\t"),
diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp
index 5f156451818..021976eea76 100644
--- a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -21,6 +21,12 @@
#include "llvm/ADT/StringExtras.h"
using namespace llvm;
+// ASM variant to use.
+enum {
+ X86_ATT = 0,
+ X86_INTEL = 1
+};
+
static const char* x86_asm_table[] = {"{si}", "S",
"{di}", "D",
"{ax}", "a",
@@ -38,6 +44,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
// FIXME - Should be simplified.
AsmTransCBE = x86_asm_table;
+ AssemblerDialect = X86_ATT;
switch (Subtarget->TargetType) {
case X86Subtarget::isDarwin:
diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.h b/llvm/lib/Target/X86/X86TargetAsmInfo.h
index 0f698590ae7..cc509d18537 100644
--- a/llvm/lib/Target/X86/X86TargetAsmInfo.h
+++ b/llvm/lib/Target/X86/X86TargetAsmInfo.h
@@ -17,7 +17,7 @@
#include "llvm/Target/TargetAsmInfo.h"
namespace llvm {
-
+
// Forward declaration.
class X86TargetMachine;
diff --git a/llvm/test/Regression/CodeGen/PowerPC/2007-01-15-AsmDialect.ll b/llvm/test/Regression/CodeGen/PowerPC/2007-01-15-AsmDialect.ll
new file mode 100644
index 00000000000..916e1684896
--- /dev/null
+++ b/llvm/test/Regression/CodeGen/PowerPC/2007-01-15-AsmDialect.ll
@@ -0,0 +1,26 @@
+; RUN: llvm-as < %s | llc -march=ppc32 | grep cntlzw
+
+define i32 %foo() {
+entry:
+ %retval = alloca i32, align 4 ; <i32*> [#uses=2]
+ %tmp = alloca i32, align 4 ; <i32*> [#uses=2]
+ %ctz_x = alloca i32, align 4 ; <i32*> [#uses=3]
+ %ctz_c = alloca i32, align 4 ; <i32*> [#uses=2]
+ "alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
+ store i32 61440, i32* %ctz_x
+ %tmp = load i32* %ctz_x ; <i32> [#uses=1]
+ %tmp1 = sub i32 0, %tmp ; <i32> [#uses=1]
+ %tmp2 = load i32* %ctz_x ; <i32> [#uses=1]
+ %tmp3 = and i32 %tmp1, %tmp2 ; <i32> [#uses=1]
+ %tmp4 = call i32 asm "$(cntlz$|cntlzw$) $0,$1", "=r,r,~{dirflag},~{fpsr},~{flags}"( i32 %tmp3 ) ; <i32> [#uses=1]
+ store i32 %tmp4, i32* %ctz_c
+ %tmp5 = load i32* %ctz_c ; <i32> [#uses=1]
+ store i32 %tmp5, i32* %tmp
+ %tmp6 = load i32* %tmp ; <i32> [#uses=1]
+ store i32 %tmp6, i32* %retval
+ br label %return
+
+return: ; preds = %entry
+ %retval = load i32* %retval ; <i32> [#uses=1]
+ ret i32 %retval
+}
OpenPOWER on IntegriCloud