diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -993,6 +993,7 @@ /// { static unsigned MatchRegisterName(StringRef Name); +static unsigned MatchRegisterAltName(StringRef Name); /// } @@ -1107,10 +1108,14 @@ } RegNo = MatchRegisterName(Tok.getString()); + if (RegNo == 0) + RegNo = MatchRegisterAltName(Tok.getString()); // If the match failed, try the register name as lowercase. if (RegNo == 0) RegNo = MatchRegisterName(Tok.getString().lower()); + if (RegNo == 0) + RegNo = MatchRegisterAltName(Tok.getString().lower()); // The "flags" and "mxcsr" registers cannot be referenced directly. // Treat it as an identifier instead. diff --git a/llvm/lib/Target/X86/X86.td b/llvm/lib/Target/X86/X86.td --- a/llvm/lib/Target/X86/X86.td +++ b/llvm/lib/Target/X86/X86.td @@ -1257,6 +1257,10 @@ // Assembly Parser //===----------------------------------------------------------------------===// +def X86AsmParser : AsmParser { + let ShouldEmitMatchRegisterAltName = 1; +} + def ATTAsmParserVariant : AsmParserVariant { int Variant = 0; @@ -1301,6 +1305,7 @@ def X86 : Target { // Information about the instructions... let InstructionSet = X86InstrInfo; + let AssemblyParsers = [X86AsmParser]; let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant]; let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter]; let AllowRegisterRenaming = 1; diff --git a/llvm/lib/Target/X86/X86RegisterInfo.td b/llvm/lib/Target/X86/X86RegisterInfo.td --- a/llvm/lib/Target/X86/X86RegisterInfo.td +++ b/llvm/lib/Target/X86/X86RegisterInfo.td @@ -12,7 +12,7 @@ // //===----------------------------------------------------------------------===// -class X86Reg Enc, list subregs = []> : Register { +class X86Reg Enc, list subregs = [], list alt = []> : Register { let Namespace = "X86"; let HWEncoding = Enc; let SubRegs = subregs; @@ -66,14 +66,14 @@ def DIL : X86Reg<"dil", 7>; def BPL : X86Reg<"bpl", 5>; def SPL : X86Reg<"spl", 4>; -def R8B : X86Reg<"r8b", 8>; -def R9B : X86Reg<"r9b", 9>; -def R10B : X86Reg<"r10b", 10>; -def R11B : X86Reg<"r11b", 11>; -def R12B : X86Reg<"r12b", 12>; -def R13B : X86Reg<"r13b", 13>; -def R14B : X86Reg<"r14b", 14>; -def R15B : X86Reg<"r15b", 15>; +def R8B : X86Reg<"r8b", 8, [], ["r8l"]>; +def R9B : X86Reg<"r9b", 9, [], ["r9l"]>; +def R10B : X86Reg<"r10b", 10, [], ["r10l"]>; +def R11B : X86Reg<"r11b", 11, [], ["r11l"]>; +def R12B : X86Reg<"r12b", 12, [], ["r12l"]>; +def R13B : X86Reg<"r13b", 13, [], ["r13l"]>; +def R14B : X86Reg<"r14b", 14, [], ["r14l"]>; +def R15B : X86Reg<"r15b", 15, [], ["r15l"]>; } let isArtificial = 1 in { diff --git a/llvm/test/MC/X86/x86_64-reg-alt.s b/llvm/test/MC/X86/x86_64-reg-alt.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/X86/x86_64-reg-alt.s @@ -0,0 +1,42 @@ +// RUN: llvm-mc -triple x86_64-unknown-unknown %s | FileCheck %s + + movb $0, %r8b +// CHECK: movb $0, %r8b + movb $0, %r8l +// CHECK: movb $0, %r8b + + movb $0, %r9b +// CHECK: movb $0, %r9b + movb $0, %r9l +// CHECK: movb $0, %r9b + + movb $0, %r10b +// CHECK: movb $0, %r10b + movb $0, %r10l +// CHECK: movb $0, %r10b + + movb $0, %r11b +// CHECK: movb $0, %r11b + movb $0, %r11l +// CHECK: movb $0, %r11b + + movb $0, %r12b +// CHECK: movb $0, %r12b + movb $0, %r12l +// CHECK: movb $0, %r12b + + movb $0, %r13b +// CHECK: movb $0, %r13b + movb $0, %r13l +// CHECK: movb $0, %r13b + + movb $0, %r14b +// CHECK: movb $0, %r14b + movb $0, %r14l +// CHECK: movb $0, %r14b + + movb $0, %r15b +// CHECK: movb $0, %r15b + movb $0, %r15l +// CHECK: movb $0, %r15b +