<div class="gmail_quote">On Sat Sep 27 2014 at 6:52:24 AM Craig Topper <<a href="mailto:craig.topper@gmail.com">craig.topper@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ctopper<br>
Date: Fri Sep 26 23:38:02 2014<br>
New Revision: 218560<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=218560&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=218560&view=rev</a><br>
Log:<br>
Fix TableGen -gen-disassembler output for bit fields with an offset.<br>
<br>
This fixes bit assignments like this<br>
Inst{7-0} = Foo{9-2}<br>
<br>
Patch by Steve King.<br>
<br>
Added:<br>
    llvm/trunk/test/TableGen/<u></u>BitOffsetDecoder.td<br>
Modified:<br>
    llvm/trunk/utils/TableGen/<u></u>FixedLenDecoderEmitter.cpp<br>
<br>
Added: llvm/trunk/test/TableGen/<u></u>BitOffsetDecoder.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/BitOffsetDecoder.td?rev=218560&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/<u></u>TableGen/BitOffsetDecoder.td?<u></u>rev=218560&view=auto</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/test/TableGen/<u></u>BitOffsetDecoder.td (added)<br>
+++ llvm/trunk/test/TableGen/<u></u>BitOffsetDecoder.td Fri Sep 26 23:38:02 2014<br>
@@ -0,0 +1,74 @@<br>
+// RUN: llvm-tblgen -gen-disassembler -I %p/../../include %s | FileCheck %s<br></blockquote><div><br></div><div>Just wanted to check: do we have precedence for making tests rely on llvm source code from outside their test directory (I always had the impression we want to keep them pretty much self contained for various reasons).</div><div><br></div><div>Cheers,</div><div>/Manuel</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+include "llvm/Target/Target.td"<br>
+<br>
+def archInstrInfo : InstrInfo { }<br>
+<br>
+def arch : Target {<br>
+    let InstructionSet = archInstrInfo;<br>
+}<br>
+<br>
+def  Myi32  : Operand<i32> {<br>
+  let DecoderMethod = "DecodeMyi32";<br>
+}<br>
+<br>
+<br>
+let OutOperandList = (outs), Size = 2 in {<br>
+<br>
+def foo : Instruction {<br>
+    let InOperandList = (ins i32imm:$factor);<br>
+    field bits<16> Inst;<br>
+    bits<32> factor;<br>
+    let Inst{7-0} = 0xAA;<br>
+    let Inst{14-8} = factor{6-0}; // no offset<br>
+    let AsmString = "foo  $factor";<br>
+    field bits<16> SoftFail = 0;<br>
+    }<br>
+<br>
+def bar : Instruction {<br>
+    let InOperandList = (ins i32imm:$factor);<br>
+    field bits<16> Inst;<br>
+    bits<32> factor;<br>
+    let Inst{7-0} = 0xBB;<br>
+    let Inst{15-8} = factor{10-3}; // offset by 3<br>
+    let AsmString = "bar  $factor";<br>
+    field bits<16> SoftFail = 0;<br>
+    }<br>
+<br>
+def biz : Instruction {<br>
+    let InOperandList = (ins i32imm:$factor);<br>
+    field bits<16> Inst;<br>
+    bits<32> factor;<br>
+    let Inst{7-0} = 0xCC;<br>
+    let Inst{11-8,15-12} = factor{10-3}; // offset by 3, multipart<br>
+    let AsmString = "biz  $factor";<br>
+    field bits<16> SoftFail = 0;<br>
+    }<br>
+<br>
+def baz : Instruction {<br>
+    let InOperandList = (ins Myi32:$factor);<br>
+    field bits<16> Inst;<br>
+    bits<32> factor;<br>
+    let Inst{7-0} = 0xDD;<br>
+    let Inst{15-8} = factor{11-4}; // offset by 4 + custom decode<br>
+    let AsmString = "baz  $factor";<br>
+    field bits<16> SoftFail = 0;<br>
+    }<br>
+<br>
+def bum : Instruction {<br>
+    let InOperandList = (ins i32imm:$factor);<br>
+    field bits<16> Inst;<br>
+    bits<32> factor;<br>
+    let Inst{7-0} = 0xEE;<br>
+    let Inst{15-8} = !srl(factor,5);<br>
+    let AsmString = "bum  $factor";<br>
+    field bits<16> SoftFail = 0;<br>
+    }<br>
+}<br>
+<br>
+<br>
+// CHECK: tmp = fieldFromInstruction(insn, 8, 7);<br>
+// CHECK: tmp = fieldFromInstruction(insn, 8, 8) << 3;<br>
+// CHECK: tmp |= (fieldFromInstruction(insn, 8, 4) << 7);<br>
+// CHECK: tmp |= (fieldFromInstruction(insn, 12, 4) << 3);<br>
+// CHECK: tmp = fieldFromInstruction(insn, 8, 8) << 4;<br>
\ No newline at end of file<br>
<br>
Modified: llvm/trunk/utils/TableGen/<u></u>FixedLenDecoderEmitter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/FixedLenDecoderEmitter.cpp?rev=218560&r1=218559&r2=218560&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/utils/<u></u>TableGen/<u></u>FixedLenDecoderEmitter.cpp?<u></u>rev=218560&r1=218559&r2=<u></u>218560&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/utils/TableGen/<u></u>FixedLenDecoderEmitter.cpp (original)<br>
+++ llvm/trunk/utils/TableGen/<u></u>FixedLenDecoderEmitter.cpp Fri Sep 26 23:38:02 2014<br>
@@ -1051,7 +1051,11 @@ void FilterChooser::<u></u>emitBinaryParser(raw<br>
     OperandInfo::const_iterator OI = OpInfo.begin();<br>
     o.indent(Indentation) << "tmp = fieldFromInstruction"<br>
                           << "(insn, " << OI->Base << ", " << OI->Width<br>
-                          << ");\n";<br>
+                          << ")";<br>
+    if (OI->Offset)<br>
+      o << " << " << OI->Offset;<br>
+    o << ";\n";<br>
+<br>
   } else {<br>
     o.indent(Indentation) << "tmp = 0;\n";<br>
     for (OperandInfo::const_iterator OI = OpInfo.begin(), OE = OpInfo.end();<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
</blockquote></div>