[llvm] r274152 - Permit memory operands in ins/outs instructions
Nirav Dave via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 29 12:54:27 PDT 2016
Author: niravd
Date: Wed Jun 29 14:54:27 2016
New Revision: 274152
URL: http://llvm.org/viewvc/llvm-project?rev=274152&view=rev
Log:
Permit memory operands in ins/outs instructions
[x86] (PR15455) While (ins|outs)[bwld] instructions do not take %dx as a
memory operand, various unofficial references do and objdump
disassembles to this format. Extend special treatment of
similar (in|out)[bwld] operations.
Reviewers: craig.topper, rnk, ab
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D18837
Modified:
llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
llvm/trunk/test/MC/X86/x86-32.s
llvm/trunk/test/MC/X86/x86-64.s
Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=274152&r1=274151&r2=274152&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Wed Jun 29 14:54:27 2016
@@ -2364,10 +2364,11 @@ bool X86AsmParser::ParseInstruction(Pars
static_cast<X86Operand &>(*Operands[0]).setTokenValue(Repl);
}
- // This is a terrible hack to handle "out[bwl]? %al, (%dx)" ->
+ // This is a terrible hack to handle "out[s]?[bwl]? %al, (%dx)" ->
// "outb %al, %dx". Out doesn't take a memory form, but this is a widely
// documented form in various unofficial manuals, so a lot of code uses it.
- if ((Name == "outb" || Name == "outw" || Name == "outl" || Name == "out") &&
+ if ((Name == "outb" || Name == "outsb" || Name == "outw" || Name == "outsw" ||
+ Name == "outl" || Name == "outsl" || Name == "out" || Name == "outs") &&
Operands.size() == 3) {
X86Operand &Op = (X86Operand &)*Operands.back();
if (Op.isMem() && Op.Mem.SegReg == 0 &&
@@ -2378,8 +2379,9 @@ bool X86AsmParser::ParseInstruction(Pars
Operands.back() = X86Operand::CreateReg(Op.Mem.BaseReg, Loc, Loc);
}
}
- // Same hack for "in[bwl]? (%dx), %al" -> "inb %dx, %al".
- if ((Name == "inb" || Name == "inw" || Name == "inl" || Name == "in") &&
+ // Same hack for "in[s]?[bwl]? (%dx), %al" -> "inb %dx, %al".
+ if ((Name == "inb" || Name == "insb" || Name == "inw" || Name == "insw" ||
+ Name == "inl" || Name == "insl" || Name == "in" || Name == "ins") &&
Operands.size() == 3) {
X86Operand &Op = (X86Operand &)*Operands[1];
if (Op.isMem() && Op.Mem.SegReg == 0 &&
Modified: llvm/trunk/test/MC/X86/x86-32.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/x86-32.s?rev=274152&r1=274151&r2=274152&view=diff
==============================================================================
--- llvm/trunk/test/MC/X86/x86-32.s (original)
+++ llvm/trunk/test/MC/X86/x86-32.s Wed Jun 29 14:54:27 2016
@@ -593,6 +593,55 @@ popfl
setnaeb %bl // CHECK: setb %bl
+// PR8114
+
+out %al, (%dx)
+// CHECK: outb %al, %dx
+outb %al, (%dx)
+// CHECK: outb %al, %dx
+out %ax, (%dx)
+// CHECK: outw %ax, %dx
+outw %ax, (%dx)
+// CHECK: outw %ax, %dx
+out %eax, (%dx)
+// CHECK: outl %eax, %dx
+outl %eax, (%dx)
+// CHECK: outl %eax, %dx
+
+
+in (%dx), %al
+// CHECK: inb %dx, %al
+inb (%dx), %al
+// CHECK: inb %dx, %al
+in (%dx), %ax
+// CHECK: inw %dx, %ax
+inw (%dx), %ax
+// CHECK: inw %dx, %ax
+in (%dx), %eax
+// CHECK: inl %dx, %eax
+inl (%dx), %eax
+// CHECK: inl %dx, %eax
+
+//PR15455
+
+outs (%esi), (%dx)
+// CHECK: outsw (%esi), %dx
+outsb (%esi), (%dx)
+// CHECK: outsb (%esi), %dx
+outsw (%esi), (%dx)
+// CHECK: outsw (%esi), %dx
+outsl (%esi), (%dx)
+// CHECK: outsl (%esi), %dx
+
+ins (%dx), %es:(%edi)
+// CHECK: insw %dx, %es:(%edi)
+insb (%dx), %es:(%edi)
+// CHECK: insb %dx, %es:(%edi)
+insw (%dx), %es:(%edi)
+// CHECK: insw %dx, %es:(%edi)
+insl (%dx), %es:(%edi)
+// CHECK: insl %dx, %es:(%edi)
+
// CHECK: lcalll $31438, $31438
// CHECK: lcalll $31438, $31438
// CHECK: ljmpl $31438, $31438
Modified: llvm/trunk/test/MC/X86/x86-64.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/x86-64.s?rev=274152&r1=274151&r2=274152&view=diff
==============================================================================
--- llvm/trunk/test/MC/X86/x86-64.s (original)
+++ llvm/trunk/test/MC/X86/x86-64.s Wed Jun 29 14:54:27 2016
@@ -281,6 +281,27 @@ inw (%dx), %ax
in (%dx), %eax
inl (%dx), %eax
+//PR15455
+
+// permitted invalid memory forms
+outs (%rsi), (%dx)
+// CHECK: outsw (%rsi), %dx
+outsb (%rsi), (%dx)
+// CHECK: outsb (%rsi), %dx
+outsw (%rsi), (%dx)
+// CHECK: outsw (%rsi), %dx
+outsl (%rsi), (%dx)
+// CHECK: outsl (%rsi), %dx
+
+ins (%dx), %es:(%rdi)
+// CHECK: insw %dx, %es:(%rdi)
+insb (%dx), %es:(%rdi)
+// CHECK: insb %dx, %es:(%rdi)
+insw (%dx), %es:(%rdi)
+// CHECK: insw %dx, %es:(%rdi)
+insl (%dx), %es:(%rdi)
+// CHECK: insl %dx, %es:(%rdi)
+
// rdar://8431422
// CHECK: fxch %st(1)
More information about the llvm-commits
mailing list