1 //===- VarLenCodeEmitterGen.h - CEG for variable-length insts ---*- C++ -*-===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file declare the CodeEmitterGen component for variable-length 10 // instructions. See the .cpp file for more details. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_UTILS_TABLEGEN_VARLENCODEEMITTERGEN_H 15 #define LLVM_UTILS_TABLEGEN_VARLENCODEEMITTERGEN_H 16 17 #include "llvm/TableGen/Record.h" 18 19 namespace llvm { 20 21 struct EncodingSegment { 22 unsigned BitWidth; 23 const Init *Value; 24 StringRef CustomEncoder = ""; 25 StringRef CustomDecoder = ""; 26 }; 27 28 class VarLenInst { 29 const RecordVal *TheDef; 30 size_t NumBits; 31 32 // Set if any of the segment is not fixed value. 33 bool HasDynamicSegment; 34 35 SmallVector<EncodingSegment, 4> Segments; 36 37 void buildRec(const DagInit *DI); 38 39 public: 40 VarLenInst() : TheDef(nullptr), NumBits(0U), HasDynamicSegment(false) {} 41 42 explicit VarLenInst(const DagInit *DI, const RecordVal *TheDef); 43 44 /// Number of bits 45 size_t size() const { return NumBits; } 46 47 using const_iterator = decltype(Segments)::const_iterator; 48 49 const_iterator begin() const { return Segments.begin(); } 50 const_iterator end() const { return Segments.end(); } 51 size_t getNumSegments() const { return Segments.size(); } 52 53 bool isFixedValueOnly() const { return !HasDynamicSegment; } 54 }; 55 56 void emitVarLenCodeEmitter(RecordKeeper &R, raw_ostream &OS); 57 58 } // end namespace llvm 59 #endif 60