x86 disassembler rejecting valid code

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

x86 disassembler rejecting valid code

Richard Smith-33
Hi,

The x86 (32-bit) disassembler can't disassemble any of the following:

  0x2b 0xc9
  0x8a 0xc8
  0xdd 0x04 0x24

These are:

  subl %ecx, %ecx
  movb %al, %cl
  fldl (%esp)

I've attached patches to bug#8873 which fix all these issues, but I'm not
confident that I've fixed them the right way.


The first two problems are caused by the instructions setting
'isCodeGenOnly = 1', which causes tblgen to miss them from the
disassembler's tables. The code says:

  // The disassembler should know about this, but not the asmparser.
  let isCodeGenOnly = 1;

However, that's not the effect which isCodeGenOnly has. Is the comment
wrong, or is tblgen wrong? The patch I attached to bug#8873 "fixes" this
by removing the 'isCodeGenOnly = 1' from these instructions. All tests
still pass.


The fldl can't be disassembled because tblgen contains a hack which marks
all instructions whose name contains the string "64" as being
X86_64-specific. fldl's instruction is named LD_F64, so can't be
disassembled in 32-bit mode, even though it's a valid 32-bit instruction.

I think the right fix for this is to make the instructions specify whether
they're available on x86, or just on x86_64, and use that knowledge in
tblgen rather than guessing from the instruction's name. The patch I
attached to bug#8873 works around this by adding a superclass check to
tblgen to see if the instruction is one of the exceptions to this
"64"-in-name rule, but that's a horrible hack...


If someone can point me in the right direction, I'm happy to put together
patches to fix these issues in a more correct manner!

Thanks,
Richard


_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev