1//===- HexagonMCShuffler.h --------------------------------------*- 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 declares the shuffling of insns inside a bundle according to the 10// packet formation rules of the Hexagon ISA. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCSHUFFLER_H 15#define LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCSHUFFLER_H 16 17#include "MCTargetDesc/HexagonMCInstrInfo.h" 18#include "MCTargetDesc/HexagonShuffler.h" 19#include "llvm/ADT/SmallVector.h" 20 21namespace llvm { 22 23class MCContext; 24class MCInst; 25class MCInstrInfo; 26class MCSubtargetInfo; 27 28// Insn bundle shuffler. 29class HexagonMCShuffler : public HexagonShuffler { 30public: 31 HexagonMCShuffler(MCContext &Context, bool Fatal, MCInstrInfo const &MCII, 32 MCSubtargetInfo const &STI, MCInst &MCB) 33 : HexagonShuffler(Context, Fatal, MCII, STI) { 34 init(MCB); 35 } 36 37 HexagonMCShuffler(MCContext &Context, bool Fatal, MCInstrInfo const &MCII, 38 MCSubtargetInfo const &STI, MCInst &MCB, 39 MCInst const &AddMI, bool InsertAtFront) 40 : HexagonShuffler(Context, Fatal, MCII, STI) { 41 init(MCB, AddMI, InsertAtFront); 42 } 43 44 // Copy reordered bundle to another. 45 void copyTo(MCInst &MCB); 46 47 // Reorder and copy result to another. 48 bool reshuffleTo(MCInst &MCB); 49 50private: 51 void init(MCInst &MCB); 52 void init(MCInst &MCB, MCInst const &AddMI, bool InsertAtFront); 53}; 54 55// Invocation of the shuffler. 56bool HexagonMCShuffle(MCContext &Context, bool Fatal, MCInstrInfo const &MCII, 57 MCSubtargetInfo const &STI, MCInst &MCB); 58bool HexagonMCShuffle(MCContext &Context, MCInstrInfo const &MCII, 59 MCSubtargetInfo const &STI, MCInst &MCB, 60 MCInst const &AddMI, int fixupCount); 61bool HexagonMCShuffle(MCContext &Context, MCInstrInfo const &MCII, 62 MCSubtargetInfo const &STI, MCInst &MCB, 63 SmallVector<DuplexCandidate, 8> possibleDuplexes); 64 65} // end namespace llvm 66 67#endif // LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCSHUFFLER_H 68