From 00bc445d7515f3b7251261972887f5a1e3567ab9 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Sat, 27 Sep 2014 04:38:02 +0000 Subject: [PATCH] Fix TableGen -gen-disassembler output for bit fields with an offset. This fixes bit assignments like this Inst{7-0} = Foo{9-2} Patch by Steve King. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218560 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/TableGen/BitOffsetDecoder.td | 74 +++++++++++++++++++++++ utils/TableGen/FixedLenDecoderEmitter.cpp | 6 +- 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 test/TableGen/BitOffsetDecoder.td diff --git a/test/TableGen/BitOffsetDecoder.td b/test/TableGen/BitOffsetDecoder.td new file mode 100644 index 00000000000..1a95d94ee12 --- /dev/null +++ b/test/TableGen/BitOffsetDecoder.td @@ -0,0 +1,74 @@ +// 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 { + 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 offset + 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}; // offset 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}; // offset 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}; // offset by 4 + custom decode + let AsmString = "baz $factor"; + field bits<16> SoftFail = 0; + } + +def bum : Instruction { + let InOperandList = (ins i32imm:$factor); + field bits<16> Inst; + bits<32> factor; + let Inst{7-0} = 0xEE; + let Inst{15-8} = !srl(factor,5); + let AsmString = "bum $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 diff --git a/utils/TableGen/FixedLenDecoderEmitter.cpp b/utils/TableGen/FixedLenDecoderEmitter.cpp index 084bef2dc72..810bd11f60c 100644 --- a/utils/TableGen/FixedLenDecoderEmitter.cpp +++ b/utils/TableGen/FixedLenDecoderEmitter.cpp @@ -1051,7 +1051,11 @@ void FilterChooser::emitBinaryParser(raw_ostream &o, unsigned &Indentation, 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();