//===- llvm/MC/MCInstrItineraries.h - Scheduling ----------------*- 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 describes the structures used for instruction // itineraries, stages, and operand reads/writes. This is used by // schedulers to determine instruction stages and latencies. // //===----------------------------------------------------------------------===// #ifndef LLVM_MC_MCINSTRITINERARIES_H #define LLVM_MC_MCINSTRITINERARIES_H #include "llvm/MC/MCSchedule.h" #include <algorithm> #include <optional> namespace llvm { //===----------------------------------------------------------------------===// /// These values represent a non-pipelined step in /// the execution of an instruction. Cycles represents the number of /// discrete time slots needed to complete the stage. Units represent /// the choice of functional units that can be used to complete the /// stage. Eg. IntUnit1, IntUnit2. NextCycles indicates how many /// cycles should elapse from the start of this stage to the start of /// the next stage in the itinerary. A value of -1 indicates that the /// next stage should start immediately after the current one. /// For example: /// /// { 1, x, -1 } /// indicates that the stage occupies FU x for 1 cycle and that /// the next stage starts immediately after this one. /// /// { 2, x|y, 1 } /// indicates that the stage occupies either FU x or FU y for 2 /// consecutive cycles and that the next stage starts one cycle /// after this stage starts. That is, the stage requirements /// overlap in time. /// /// { 1, x, 0 } /// indicates that the stage occupies FU x for 1 cycle and that /// the next stage starts in this same cycle. This can be used to /// indicate that the instruction requires multiple stages at the /// same time. /// /// FU reservation can be of two different kinds: /// - FUs which instruction actually requires /// - FUs which instruction just reserves. Reserved unit is not available for /// execution of other instruction. However, several instructions can reserve /// the same unit several times. /// Such two types of units reservation is used to model instruction domain /// change stalls, FUs using the same resource (e.g. same register file), etc. struct InstrStage { … }; //===----------------------------------------------------------------------===// /// An itinerary represents the scheduling information for an instruction. /// This includes a set of stages occupied by the instruction and the pipeline /// cycle in which operands are read and written. /// struct InstrItinerary { … }; //===----------------------------------------------------------------------===// /// Itinerary data supplied by a subtarget to be used by a target. /// class InstrItineraryData { … }; } // end namespace llvm #endif // LLVM_MC_MCINSTRITINERARIES_H