| //===- VarLenCodeEmitterGen.h - CEG for variable-length insts ---*- C++ -*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file declare the CodeEmitterGen component for variable-length | |
| // instructions. See the .cpp file for more details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_UTILS_TABLEGEN_COMMON_VARLENCODEEMITTERGEN_H | |
| #define LLVM_UTILS_TABLEGEN_COMMON_VARLENCODEEMITTERGEN_H | |
| #include "llvm/TableGen/Record.h" | |
| namespace llvm { | |
| struct EncodingSegment { | |
| unsigned BitWidth; | |
| const Init *Value; | |
| StringRef CustomEncoder = ""; | |
| StringRef CustomDecoder = ""; | |
| }; | |
| class VarLenInst { | |
| const RecordVal *TheDef; | |
| size_t NumBits; | |
| // Set if any of the segment is not fixed value. | |
| bool HasDynamicSegment; | |
| SmallVector<EncodingSegment, 4> Segments; | |
| void buildRec(const DagInit *DI); | |
| public: | |
| VarLenInst() : TheDef(nullptr), NumBits(0U), HasDynamicSegment(false) {} | |
| explicit VarLenInst(const DagInit *DI, const RecordVal *TheDef); | |
| /// Number of bits | |
| size_t size() const { return NumBits; } | |
| using const_iterator = decltype(Segments)::const_iterator; | |
| const_iterator begin() const { return Segments.begin(); } | |
| const_iterator end() const { return Segments.end(); } | |
| size_t getNumSegments() const { return Segments.size(); } | |
| bool isFixedValueOnly() const { return !HasDynamicSegment; } | |
| }; | |
| void emitVarLenCodeEmitter(const RecordKeeper &R, raw_ostream &OS); | |
| } // end namespace llvm | |
| #endif // LLVM_UTILS_TABLEGEN_COMMON_VARLENCODEEMITTERGEN_H |