[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