61 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file declare the CodeEmitterGen component for variable-length10// instructions. See the .cpp file for more details.11//12//===----------------------------------------------------------------------===//13 14#ifndef LLVM_UTILS_TABLEGEN_COMMON_VARLENCODEEMITTERGEN_H15#define LLVM_UTILS_TABLEGEN_COMMON_VARLENCODEEMITTERGEN_H16 17#include "llvm/TableGen/Record.h"18 19namespace llvm {20 21struct EncodingSegment {22 unsigned BitWidth;23 const Init *Value;24 StringRef CustomEncoder = "";25 StringRef CustomDecoder = "";26};27 28class 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 39public:40 VarLenInst() : TheDef(nullptr), NumBits(0U), HasDynamicSegment(false) {}41 42 explicit VarLenInst(const DagInit *DI, const RecordVal *TheDef);43 44 /// Number of bits45 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 56void emitVarLenCodeEmitter(const RecordKeeper &R, raw_ostream &OS);57 58} // end namespace llvm59 60#endif // LLVM_UTILS_TABLEGEN_COMMON_VARLENCODEEMITTERGEN_H61