[PATCH] Fix TableGen -gen-disassembler output for certain bit field definitions.

Tom Stellard tom at stellard.net
Fri Sep 26 06:44:45 PDT 2014


On Fri, Sep 26, 2014 at 03:07:16AM +0000, Steve King wrote:
> TableGen -gen-disassembler extracts incorrect operand values for certain bit fields with an offset.  The result is that disassembly silently fails with incorrect operand values.  Bit assignments like:
> Inst{7-0} = Foo{9-2}
> are vulnerable to this problem.
> 

Tablegen has !shl and !srl operators, I think it would be good to add test
cases using those too.

-Tom

> http://reviews.llvm.org/D5498
> 
> Files:
>   test/TableGen/BitShiftDecoder.td
>   utils/TableGen/FixedLenDecoderEmitter.cpp

> Index: test/TableGen/BitShiftDecoder.td
> ===================================================================
> --- /dev/null
> +++ test/TableGen/BitShiftDecoder.td
> @@ -0,0 +1,64 @@
> +// RUN: llvm-tblgen -gen-disassembler -I %p/../../include %s | FileCheck %s
> +
> +include "llvm/Target/Target.td"
> +
> +def archInstrInfo : InstrInfo { }
> +
> +def arch : Target {
> +    let InstructionSet = archInstrInfo;
> +}
> +
> +def  Myi32  : Operand<i32> {
> +  let DecoderMethod = "DecodeMyi32";
> +}
> +
> +
> +let OutOperandList = (outs), Size = 2 in {
> +
> +def foo : Instruction {
> +    let InOperandList = (ins i32imm:$factor);
> +    field bits<16> Inst;
> +    bits<32> factor;
> +    let Inst{7-0} = 0xAA;
> +    let Inst{14-8} = factor{6-0}; // no shift
> +    let AsmString = "foo  $factor";
> +    field bits<16> SoftFail = 0;
> +    }
> +
> +def bar : Instruction {
> +    let InOperandList = (ins i32imm:$factor);
> +    field bits<16> Inst;
> +    bits<32> factor;
> +    let Inst{7-0} = 0xBB;
> +    let Inst{15-8} = factor{10-3}; // shift by 3
> +    let AsmString = "bar  $factor";
> +    field bits<16> SoftFail = 0;
> +    }
> +
> +def biz : Instruction {
> +    let InOperandList = (ins i32imm:$factor);
> +    field bits<16> Inst;
> +    bits<32> factor;
> +    let Inst{7-0} = 0xCC;
> +    let Inst{11-8,15-12} = factor{10-3}; // shift by 3, multipart
> +    let AsmString = "biz  $factor";
> +    field bits<16> SoftFail = 0;
> +    }
> +
> +def baz : Instruction {
> +    let InOperandList = (ins Myi32:$factor);
> +    field bits<16> Inst;
> +    bits<32> factor;
> +    let Inst{7-0} = 0xDD;
> +    let Inst{15-8} = factor{11-4}; // shift by 4 + custom decode
> +    let AsmString = "baz  $factor";
> +    field bits<16> SoftFail = 0;
> +    }
> +}
> +
> +
> +// CHECK: tmp = fieldFromInstruction(insn, 8, 7);
> +// CHECK: tmp = fieldFromInstruction(insn, 8, 8) << 3;
> +// CHECK: tmp |= (fieldFromInstruction(insn, 8, 4) << 7);
> +// CHECK: tmp |= (fieldFromInstruction(insn, 12, 4) << 3);
> +// CHECK: tmp = fieldFromInstruction(insn, 8, 8) << 4;
> \ No newline at end of file
> Index: utils/TableGen/FixedLenDecoderEmitter.cpp
> ===================================================================
> --- utils/TableGen/FixedLenDecoderEmitter.cpp
> +++ utils/TableGen/FixedLenDecoderEmitter.cpp
> @@ -1051,7 +1051,11 @@
>      OperandInfo::const_iterator OI = OpInfo.begin();
>      o.indent(Indentation) << "tmp = fieldFromInstruction"
>                            << "(insn, " << OI->Base << ", " << OI->Width
> -                          << ");\n";
> +                          << ")";
> +    if (OI->Offset)
> +      o << " << " << OI->Offset;
> +    o << ";\n";
> +
>    } else {
>      o.indent(Indentation) << "tmp = 0;\n";
>      for (OperandInfo::const_iterator OI = OpInfo.begin(), OE = OpInfo.end();

> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list