xref: /freebsd/contrib/llvm-project/llvm/tools/llvm-mca/Views/InstructionInfoView.h (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
10b57cec5SDimitry Andric //===--------------------- InstructionInfoView.h ----------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric /// \file
90b57cec5SDimitry Andric ///
100b57cec5SDimitry Andric /// This file implements the instruction info view.
110b57cec5SDimitry Andric ///
120b57cec5SDimitry Andric /// The goal fo the instruction info view is to print the latency and reciprocal
130b57cec5SDimitry Andric /// throughput information for every instruction in the input sequence.
140b57cec5SDimitry Andric /// This section also reports extra information related to the number of micro
150b57cec5SDimitry Andric /// opcodes, and opcode properties (i.e. 'MayLoad', 'MayStore', 'HasSideEffects)
160b57cec5SDimitry Andric ///
170b57cec5SDimitry Andric /// Example:
180b57cec5SDimitry Andric ///
190b57cec5SDimitry Andric /// Instruction Info:
200b57cec5SDimitry Andric /// [1]: #uOps
210b57cec5SDimitry Andric /// [2]: Latency
220b57cec5SDimitry Andric /// [3]: RThroughput
230b57cec5SDimitry Andric /// [4]: MayLoad
240b57cec5SDimitry Andric /// [5]: MayStore
250b57cec5SDimitry Andric /// [6]: HasSideEffects
260b57cec5SDimitry Andric ///
270b57cec5SDimitry Andric /// [1]    [2]    [3]    [4]    [5]    [6]	Instructions:
280b57cec5SDimitry Andric ///  1      2     1.00                    	vmulps	%xmm0, %xmm1, %xmm2
290b57cec5SDimitry Andric ///  1      3     1.00                    	vhaddps	%xmm2, %xmm2, %xmm3
300b57cec5SDimitry Andric ///  1      3     1.00                    	vhaddps	%xmm3, %xmm3, %xmm4
310b57cec5SDimitry Andric //
320b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric #ifndef LLVM_TOOLS_LLVM_MCA_INSTRUCTIONINFOVIEW_H
350b57cec5SDimitry Andric #define LLVM_TOOLS_LLVM_MCA_INSTRUCTIONINFOVIEW_H
360b57cec5SDimitry Andric 
37*e8d8bef9SDimitry Andric #include "Views/InstructionView.h"
380b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h"
39*e8d8bef9SDimitry Andric #include "llvm/ADT/SmallVector.h"
400b57cec5SDimitry Andric #include "llvm/MC/MCInst.h"
410b57cec5SDimitry Andric #include "llvm/MC/MCInstPrinter.h"
420b57cec5SDimitry Andric #include "llvm/MC/MCInstrInfo.h"
430b57cec5SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h"
448bcb0991SDimitry Andric #include "llvm/MCA/CodeEmitter.h"
450b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric #define DEBUG_TYPE "llvm-mca"
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric namespace llvm {
500b57cec5SDimitry Andric namespace mca {
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric /// A view that prints out generic instruction information.
53*e8d8bef9SDimitry Andric class InstructionInfoView : public InstructionView {
540b57cec5SDimitry Andric   const llvm::MCInstrInfo &MCII;
558bcb0991SDimitry Andric   CodeEmitter &CE;
568bcb0991SDimitry Andric   bool PrintEncodings;
57*e8d8bef9SDimitry Andric 
58*e8d8bef9SDimitry Andric   struct InstructionInfoViewData {
59*e8d8bef9SDimitry Andric     unsigned NumMicroOpcodes = 0;
60*e8d8bef9SDimitry Andric     unsigned Latency = 0;
61*e8d8bef9SDimitry Andric     Optional<double> RThroughput = 0.0;
62*e8d8bef9SDimitry Andric     bool mayLoad = false;
63*e8d8bef9SDimitry Andric     bool mayStore = false;
64*e8d8bef9SDimitry Andric     bool hasUnmodeledSideEffects = false;
65*e8d8bef9SDimitry Andric   };
66*e8d8bef9SDimitry Andric   using IIVDVec = SmallVector<InstructionInfoViewData, 16>;
67*e8d8bef9SDimitry Andric 
68*e8d8bef9SDimitry Andric   /// Place the data into the array of InstructionInfoViewData IIVD.
69*e8d8bef9SDimitry Andric   void collectData(MutableArrayRef<InstructionInfoViewData> IIVD) const;
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric public:
728bcb0991SDimitry Andric   InstructionInfoView(const llvm::MCSubtargetInfo &ST,
738bcb0991SDimitry Andric                       const llvm::MCInstrInfo &II, CodeEmitter &C,
748bcb0991SDimitry Andric                       bool ShouldPrintEncodings, llvm::ArrayRef<llvm::MCInst> S,
758bcb0991SDimitry Andric                       llvm::MCInstPrinter &IP)
76*e8d8bef9SDimitry Andric       : InstructionView(ST, IP, S), MCII(II), CE(C),
77*e8d8bef9SDimitry Andric         PrintEncodings(ShouldPrintEncodings) {}
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric   void printView(llvm::raw_ostream &OS) const override;
80*e8d8bef9SDimitry Andric   StringRef getNameAsString() const override { return "InstructionInfoView"; }
81*e8d8bef9SDimitry Andric   json::Value toJSON() const override;
82*e8d8bef9SDimitry Andric   json::Object toJSON(const InstructionInfoViewData &IIVD) const;
830b57cec5SDimitry Andric };
840b57cec5SDimitry Andric } // namespace mca
850b57cec5SDimitry Andric } // namespace llvm
860b57cec5SDimitry Andric 
870b57cec5SDimitry Andric #endif
88