[LLVMdev] Some bugs in x86 disasm (llvm-mc)

Craig Topper craig.topper at gmail.com
Thu Jan 16 07:30:21 PST 2014


Did we have IC_OPSIZE_ADSIZE defined but not used before this?


On Thu, Jan 16, 2014 at 7:20 AM, David Woodhouse <dwmw2 at infradead.org>wrote:

> On Wed, 2014-01-15 at 23:44 -0800, Craig Topper wrote:
> > I believe I have now fixed the 0x64 0xa1 0x00 0x00 0x00 0x00 bug in
> > r199364.
>
> Still fails to correctly disassemble 0x66 0x67 0xa1… (mea culpa).
>
> This should fix it. It applies on top of the patches I sent on Monday,
> but probably only because it adds the test cases for 16-bit too.
>
> I'll add it to my pile.
>
>
> From a98a9ab044454bdb93be25fa8dbcd72d217f5651 Mon Sep 17 00:00:00 2001
> From: David Woodhouse <David.Woodhouse at intel.com>
> Date: Thu, 16 Jan 2014 14:44:20 +0000
> Subject: [PATCH] [x86] Fix disassembly of MOV16ao16 et al.
>
> The addition of IC_OPSIZE_ADSIZE in r198759 wasn't quite complete. This
> should fix it, and adds test cases.
> ---
>  .../Disassembler/X86DisassemblerDecoderCommon.h    |  2 +-
>  test/MC/Disassembler/X86/moffs.txt                 | 86
> ++++++++++++++++++++++
>  utils/TableGen/X86DisassemblerTables.cpp           |  2 +
>  3 files changed, 89 insertions(+), 1 deletion(-)
>  create mode 100644 test/MC/Disassembler/X86/moffs.txt
>
> diff --git a/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h
> b/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h
> index 954a3d7..f7056bd 100644
> --- a/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h
> +++ b/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h
> @@ -92,7 +92,7 @@ enum attributeBits {
>                                          "operands change width")
>       \
>    ENUM_ENTRY(IC_ADSIZE,             3,  "requires an ADSIZE prefix, so "
>       \
>                                          "operands change width")
>       \
> -  ENUM_ENTRY(IC_OPSIZE_ADSIZE,      3,  "requires both OPSIZE and ADSIZE
> "     \
> +  ENUM_ENTRY(IC_OPSIZE_ADSIZE,      4,  "requires both OPSIZE and ADSIZE
> "     \
>                                          "prefixes")
>      \
>    ENUM_ENTRY(IC_XD,                 2,  "may say something about the
> opcode "  \
>                                          "but not the operands")
>      \
> diff --git a/test/MC/Disassembler/X86/moffs.txt
> b/test/MC/Disassembler/X86/moffs.txt
> new file mode 100644
> index 0000000..67d64e8
> --- /dev/null
> +++ b/test/MC/Disassembler/X86/moffs.txt
> @@ -0,0 +1,86 @@
> +# RUN: llvm-mc --hdis %s -triple=i686-linux-gnu-code16 | FileCheck
> --check-prefix=16 %s
> +# RUN: llvm-mc --hdis %s -triple=i686-linux-gnu | FileCheck
> --check-prefix=32 %s
> +# RUN: llvm-mc --hdis %s -triple=x86_64-linux-gnu | FileCheck
> --check-prefix=64 %s
> +
> +# 16: movb 0x5a5a, %al
> +# 32: movb 0x5a5a5a5a, %al
> +# 64: movabsb 0x5a5a5a5a5a5a5a5a, %al
> +0xa0 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movb 0x5a5a5a5a, %al
> +# 32: movb 0x5a5a, %al
> +# 64: movabsb 0x5a5a5a5a, %al
> +0x67 0xa0 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movw 0x5a5a, %ax
> +# 32: movl 0x5a5a5a5a, %eax
> +# 64: movabsl 0x5a5a5a5a5a5a5a5a, %eax
> +0xa1 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movw 0x5a5a5a5a, %ax
> +# 32: movl 0x5a5a, %eax
> +# 64: movabsl 0x5a5a5a5a, %eax
> +0x67 0xa1 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movl 0x5a5a, %eax
> +# 32: movw 0x5a5a5a5a, %ax
> +# 64: movabsw 0x5a5a5a5a5a5a5a5a, %ax
> +0x66 0xa1 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movl 0x5a5a5a5a, %eax
> +# 32: movw 0x5a5a, %ax
> +# 64: movabsw 0x5a5a5a5a, %ax
> +0x66 0x67 0xa1 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movl 0x5a5a5a5a, %eax
> +# 32: movw 0x5a5a, %ax
> +# 64: movabsw 0x5a5a5a5a, %ax
> +0x67 0x66 0xa1 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movl %es:0x5a5a5a5a, %eax
> +# 32: movw %es:0x5a5a, %ax
> +# 64: movabsw %es:0x5a5a5a5a, %ax
> +0x67 0x26 0x66 0xa1 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +
> +
> +# 16: movb %al, 0x5a5a
> +# 32: movb %al, 0x5a5a5a5a
> +# 64: movabsb %al, 0x5a5a5a5a5a5a5a5a
> +0xa2 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movb %al, 0x5a5a5a5a
> +# 32: movb %al, 0x5a5a
> +# 64: movabsb %al, 0x5a5a5a5a
> +0x67 0xa2 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movw %ax, 0x5a5a
> +# 32: movl %eax, 0x5a5a5a5a
> +# 64: movabsl %eax, 0x5a5a5a5a5a5a5a5a
> +0xa3 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movw %ax, %gs:0x5a5a5a5a
> +# 32: movl %eax, %gs:0x5a5a
> +# 64: movabsl %eax, %gs:0x5a5a5a5a
> +0x65 0x67 0xa3 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movl %eax, 0x5a5a
> +# 32: movw %ax, 0x5a5a5a5a
> +# 64: movabsw %ax, 0x5a5a5a5a5a5a5a5a
> +0x66 0xa3 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movl %eax, 0x5a5a5a5a
> +# 32: movw %ax, 0x5a5a
> +# 64: movabsw %ax, 0x5a5a5a5a
> +0x66 0x67 0xa3 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movl %eax, 0x5a5a5a5a
> +# 32: movw %ax, 0x5a5a
> +# 64: movabsw %ax, 0x5a5a5a5a
> +0x67 0x66 0xa3 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> +# 16: movl %eax, %es:0x5a5a5a5a
> +# 32: movw %ax, %es:0x5a5a
> +# 64: movabsw %ax, %es:0x5a5a5a5a
> +0x67 0x26 0x66 0xa3 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
> +
> diff --git a/utils/TableGen/X86DisassemblerTables.cpp
> b/utils/TableGen/X86DisassemblerTables.cpp
> index 0ccfac7..d513369 100644
> --- a/utils/TableGen/X86DisassemblerTables.cpp
> +++ b/utils/TableGen/X86DisassemblerTables.cpp
> @@ -713,6 +713,8 @@ void DisassemblerTables::emitContextTable(raw_ostream
> &o, unsigned &i) const {
>        o << "IC_XS";
>      else if (index & ATTR_XD)
>        o << "IC_XD";
> +    else if ((index & ATTR_OPSIZE) && (index & ATTR_ADSIZE))
> +      o << "IC_OPSIZE_ADSIZE";
>      else if (index & ATTR_OPSIZE)
>        o << "IC_OPSIZE";
>      else if (index & ATTR_ADSIZE)
> --
> 1.8.4.2
>
>
>
>
> --
> dwmw2
>



-- 
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140116/8f24fd9b/attachment.html>


More information about the llvm-dev mailing list