Bug 4667 - objdump prints incorrect bytemodes for i386/x86_64 SIMD instructions in Intel syntax.
Summary: objdump prints incorrect bytemodes for i386/x86_64 SIMD instructions in Intel...
Status: RESOLVED FIXED
Alias: None
Product: binutils
Classification: Unclassified
Component: binutils (show other bugs)
Version: 2.18
: P2 normal
Target Milestone: ---
Assignee: unassigned
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-06-20 15:42 UTC by Takashi Hattori
Modified: 2007-06-23 15:02 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Takashi Hattori 2007-06-20 15:42:08 UTC
Disassembler for i386/x86_64 (i386-dis.c) in objdump prints incorrect bytemodes
in Intel syntax.
At least, 27 SIMD instructions seem incorrect.

% objdump -v
GNU objdump (GNU Binutils) 2.17.50.20070620
Copyright 2007 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License.  This program has absolutely no warranty.

% cat simd.s
.text
.byte  0xf2, 0x0f, 0xd0, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x66, 0x0f, 0x2f, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x0f, 0x2f, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0xf3, 0x0f, 0xe6, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0xf2, 0x0f, 0xe6, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x0f, 0x5a, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0xf3, 0x0f, 0x5b, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0xf2, 0x0f, 0x7c, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0xf3, 0x0f, 0x7f, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0xf3, 0x0f, 0x6f, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x66, 0x0f, 0x17, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x66, 0x0f, 0x16, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x0f, 0x17, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x0f, 0x16, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x66, 0x0f, 0x13, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x66, 0x0f, 0x12, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x0f, 0x13, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x0f, 0x12, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0xf3, 0x0f, 0x16, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0xf3, 0x0f, 0x12, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0xf3, 0x0f, 0x70, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x90, 0xf2, 0x0f, 0x70, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x90, 0x0f, 0x60, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x0f, 0x62, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x0f, 0x61, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x66, 0x0f, 0x2e, 0x0d, 0x78, 0x56, 0x34, 0x12
.byte  0x0f, 0x2e, 0x0d, 0x78, 0x56, 0x34, 0x12

% as -o simd.o simd.s
% objdump -d -M intel --section=LC_SEGMENT.__TEXT.__text simd.o

simd.o:     file format mach-o-le

Disassembly of section LC_SEGMENT.__TEXT.__text:

0000000000000000 <LC_SEGMENT.__TEXT.__text>:
   0:   f2 0f d0 0d 78 56 34    addsubps xmm1,QWORD PTR ds:0x12345678
   7:   12 
   8:   66 0f 2f 0d 78 56 34    comisd xmm1,XMMWORD PTR ds:0x12345678
   f:   12 
  10:   0f 2f 0d 78 56 34 12    comiss xmm1,XMMWORD PTR ds:0x12345678
  17:   f3 0f e6 0d 78 56 34    cvtdq2pd xmm1,DWORD PTR ds:0x12345678
  1e:   12 
  1f:   f2 0f e6 0d 78 56 34    cvtpd2dq xmm1,QWORD PTR ds:0x12345678
  26:   12 
  27:   0f 5a 0d 78 56 34 12    cvtps2pd xmm1,XMMWORD PTR ds:0x12345678
  2e:   f3 0f 5b 0d 78 56 34    cvttps2dq xmm1,DWORD PTR ds:0x12345678
  35:   12 
  36:   f2 0f 7c 0d 78 56 34    haddps xmm1,QWORD PTR ds:0x12345678
  3d:   12 
  3e:   f3 0f 7f 0d 78 56 34    movdqu DWORD PTR ds:0x12345678,xmm1
  45:   12 
  46:   f3 0f 6f 0d 78 56 34    movdqu xmm1,DWORD PTR ds:0x12345678
  4d:   12 
  4e:   66 0f 17 0d 78 56 34    movhpd XMMWORD PTR ds:0x12345678,xmm1
  55:   12 
  56:   66 0f 16 0d 78 56 34    movhpd xmm1,XMMWORD PTR ds:0x12345678
  5d:   12 
  5e:   0f 17 0d 78 56 34 12    movhps XMMWORD PTR ds:0x12345678,xmm1
  65:   0f 16 0d 78 56 34 12    movhps xmm1,XMMWORD PTR ds:0x12345678
  6c:   66 0f 13 0d 78 56 34    movlpd XMMWORD PTR ds:0x12345678,xmm1
  73:   12 
  74:   66 0f 12 0d 78 56 34    movlpd xmm1,XMMWORD PTR ds:0x12345678
  7b:   12 
  7c:   0f 13 0d 78 56 34 12    movlps XMMWORD PTR ds:0x12345678,xmm1
  83:   0f 12 0d 78 56 34 12    movlps xmm1,XMMWORD PTR ds:0x12345678
  8a:   f3 0f 16 0d 78 56 34    movshdup xmm1,DWORD PTR ds:0x12345678
  91:   12 
  92:   f3 0f 12 0d 78 56 34    movsldup xmm1,DWORD PTR ds:0x12345678
  99:   12 
  9a:   f3 0f 70 0d 78 56 34    pshufhw xmm1,DWORD PTR ds:0x12345678,0x90
  a1:   12 90 
  a3:   f2 0f 70 0d 78 56 34    pshuflw xmm1,QWORD PTR ds:0x12345678,0x90
  aa:   12 90 
  ac:   0f 60 0d 78 56 34 12    punpcklbw mm1,QWORD PTR ds:0x12345678
  b3:   0f 62 0d 78 56 34 12    punpckldq mm1,QWORD PTR ds:0x12345678
  ba:   0f 61 0d 78 56 34 12    punpcklwd mm1,QWORD PTR ds:0x12345678
  c1:   66 0f 2e 0d 78 56 34    ucomisd xmm1,XMMWORD PTR ds:0x12345678
  c8:   12 
  c9:   0f 2e 0d 78 56 34 12    ucomiss xmm1,XMMWORD PTR ds:0x12345678


Intel 64 and IA-32 Architectures Software Developer's Manual Volume 2A,
http://www.intel.com/products/processor/manuals/index.htm

It's written:

    ADDSUBPS - Packed Single-FP Add/Subtract
    Opcode         Instruction      64-Bit Mode   Compat/Leg Mode
    F2 0F D0 /r    ADDSUBPS xmm1,   Valid         Valid
                   xmm2/m128

The second operand is XMM register or 128-bit memory. Hence, the bytemode of
addsubps should be XMMWORD, not QWORD. As the same way, comisd should have
QWORD, not XMMWORD.
All of the instructions above are incorrect bytemodes.

The expected result should be:

0000000000000000 <LC_SEGMENT.__TEXT.__text>:
   0:   f2 0f d0 0d 78 56 34    addsubps xmm1,XMMWORD PTR ds:0x12345678
   7:   12 
   8:   66 0f 2f 0d 78 56 34    comisd xmm1,QWORD PTR ds:0x12345678
   f:   12 
  10:   0f 2f 0d 78 56 34 12    comiss xmm1,DWORD PTR ds:0x12345678
  17:   f3 0f e6 0d 78 56 34    cvtdq2pd xmm1,QWORD PTR ds:0x12345678
  1e:   12 
  1f:   f2 0f e6 0d 78 56 34    cvtpd2dq xmm1,XMMWORD PTR ds:0x12345678
  26:   12 
  27:   0f 5a 0d 78 56 34 12    cvtps2pd xmm1,QWORD PTR ds:0x12345678
  2e:   f3 0f 5b 0d 78 56 34    cvttps2dq xmm1,XMMWORD PTR ds:0x12345678
  35:   12 
  36:   f2 0f 7c 0d 78 56 34    haddps xmm1,XMMWORD PTR ds:0x12345678
  3d:   12 
  3e:   f3 0f 7f 0d 78 56 34    movdqu XMMWORD PTR ds:0x12345678,xmm1
  45:   12 
  46:   f3 0f 6f 0d 78 56 34    movdqu xmm1,XMMWORD PTR ds:0x12345678
  4d:   12 
  4e:   66 0f 17 0d 78 56 34    movhpd QWORD PTR ds:0x12345678,xmm1
  55:   12 
  56:   66 0f 16 0d 78 56 34    movhpd xmm1,QWORD PTR ds:0x12345678
  5d:   12 
  5e:   0f 17 0d 78 56 34 12    movhps QWORD PTR ds:0x12345678,xmm1
  65:   0f 16 0d 78 56 34 12    movhps xmm1,QWORD PTR ds:0x12345678
  6c:   66 0f 13 0d 78 56 34    movlpd QWORD PTR ds:0x12345678,xmm1
  73:   12 
  74:   66 0f 12 0d 78 56 34    movlpd xmm1,QWORD PTR ds:0x12345678
  7b:   12 
  7c:   0f 13 0d 78 56 34 12    movlps QWORD PTR ds:0x12345678,xmm1
  83:   0f 12 0d 78 56 34 12    movlps xmm1,QWORD PTR ds:0x12345678
  8a:   f3 0f 16 0d 78 56 34    movshdup xmm1,XMMWORD PTR ds:0x12345678
  91:   12 
  92:   f3 0f 12 0d 78 56 34    movsldup xmm1,XMMWORD PTR ds:0x12345678
  99:   12 
  9a:   f3 0f 70 0d 78 56 34    pshufhw xmm1,XMMWORD PTR ds:0x12345678,0x90
  a1:   12 90 
  a3:   f2 0f 70 0d 78 56 34    pshuflw xmm1,XMMWORD PTR ds:0x12345678,0x90
  aa:   12 90 
  ac:   0f 60 0d 78 56 34 12    punpcklbw mm1,DWORD PTR ds:0x12345678
  b3:   0f 62 0d 78 56 34 12    punpckldq mm1,DWORD PTR ds:0x12345678
  ba:   0f 61 0d 78 56 34 12    punpcklwd mm1,DWORD PTR ds:0x12345678
  c1:   66 0f 2e 0d 78 56 34    ucomisd xmm1,QWORD PTR ds:0x12345678
  c8:   12 
  c9:   0f 2e 0d 78 56 34 12    ucomiss xmm1,DWORD PTR ds:0x12345678
Comment 1 H.J. Lu 2007-06-23 04:34:44 UTC
Please try this patch:

http://sourceware.org/ml/binutils/2007-06/msg00213.html
Comment 2 Takashi Hattori 2007-06-23 11:27:39 UTC
(In reply to comment #1)
> Please try this patch:
> 
> http://sourceware.org/ml/binutils/2007-06/msg00213.html

I've applied your patch and tested.
All bytemodes are now correct.
Thanks!
Comment 3 H.J. Lu 2007-06-23 15:02:43 UTC
Fixed.