x86 disassembler rejecting valid code


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!