1 //===- VarLenCodeEmitterGen.h - CEG for variable-length insts ---*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file declare the CodeEmitterGen component for variable-length
10 // instructions. See the .cpp file for more details.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_UTILS_TABLEGEN_VARLENCODEEMITTERGEN_H
15 #define LLVM_UTILS_TABLEGEN_VARLENCODEEMITTERGEN_H
17 #include "llvm/TableGen/Record.h"
21 struct EncodingSegment
{
24 StringRef CustomEncoder
= "";
25 StringRef CustomDecoder
= "";
29 const RecordVal
*TheDef
;
32 // Set if any of the segment is not fixed value.
33 bool HasDynamicSegment
;
35 SmallVector
<EncodingSegment
, 4> Segments
;
37 void buildRec(const DagInit
*DI
);
40 VarLenInst() : TheDef(nullptr), NumBits(0U), HasDynamicSegment(false) {}
42 explicit VarLenInst(const DagInit
*DI
, const RecordVal
*TheDef
);
45 size_t size() const { return NumBits
; }
47 using const_iterator
= decltype(Segments
)::const_iterator
;
49 const_iterator
begin() const { return Segments
.begin(); }
50 const_iterator
end() const { return Segments
.end(); }
51 size_t getNumSegments() const { return Segments
.size(); }
53 bool isFixedValueOnly() const { return !HasDynamicSegment
; }
56 void emitVarLenCodeEmitter(RecordKeeper
&R
, raw_ostream
&OS
);
58 } // end namespace llvm