xref: /aosp_15_r20/external/llvm/lib/Target/AArch64/AArch64Schedule.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//==-- AArch64Schedule.td - AArch64 Scheduling Definitions -*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker// Define TII for use in SchedVariant Predicates.
11*9880d681SAndroid Build Coastguard Worker// const MachineInstr *MI and const TargetSchedModel *SchedModel
12*9880d681SAndroid Build Coastguard Worker// are defined by default.
13*9880d681SAndroid Build Coastguard Workerdef : PredicateProlog<[{
14*9880d681SAndroid Build Coastguard Worker  const AArch64InstrInfo *TII =
15*9880d681SAndroid Build Coastguard Worker    static_cast<const AArch64InstrInfo*>(SchedModel->getInstrInfo());
16*9880d681SAndroid Build Coastguard Worker  (void)TII;
17*9880d681SAndroid Build Coastguard Worker}]>;
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker// AArch64 Scheduler Definitions
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdef WriteImm       : SchedWrite; // MOVN, MOVZ
22*9880d681SAndroid Build Coastguard Worker// TODO: Provide variants for MOV32/64imm Pseudos that dynamically
23*9880d681SAndroid Build Coastguard Worker// select the correct sequence of WriteImms.
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdef WriteI         : SchedWrite; // ALU
26*9880d681SAndroid Build Coastguard Workerdef WriteISReg     : SchedWrite; // ALU of Shifted-Reg
27*9880d681SAndroid Build Coastguard Workerdef WriteIEReg     : SchedWrite; // ALU of Extended-Reg
28*9880d681SAndroid Build Coastguard Workerdef ReadI          : SchedRead;  // ALU
29*9880d681SAndroid Build Coastguard Workerdef ReadISReg      : SchedRead;  // ALU of Shifted-Reg
30*9880d681SAndroid Build Coastguard Workerdef ReadIEReg      : SchedRead;  // ALU of Extended-Reg
31*9880d681SAndroid Build Coastguard Workerdef WriteExtr      : SchedWrite; // EXTR shifts a reg pair
32*9880d681SAndroid Build Coastguard Workerdef ReadExtrHi     : SchedRead;  // Read the high reg of the EXTR pair
33*9880d681SAndroid Build Coastguard Workerdef WriteIS        : SchedWrite; // Shift/Scale
34*9880d681SAndroid Build Coastguard Workerdef WriteID32      : SchedWrite; // 32-bit Divide
35*9880d681SAndroid Build Coastguard Workerdef WriteID64      : SchedWrite; // 64-bit Divide
36*9880d681SAndroid Build Coastguard Workerdef ReadID         : SchedRead;  // 32/64-bit Divide
37*9880d681SAndroid Build Coastguard Workerdef WriteIM32      : SchedWrite; // 32-bit Multiply
38*9880d681SAndroid Build Coastguard Workerdef WriteIM64      : SchedWrite; // 64-bit Multiply
39*9880d681SAndroid Build Coastguard Workerdef ReadIM         : SchedRead;  // 32/64-bit Multiply
40*9880d681SAndroid Build Coastguard Workerdef ReadIMA        : SchedRead;  // 32/64-bit Multiply Accumulate
41*9880d681SAndroid Build Coastguard Workerdef WriteBr        : SchedWrite; // Branch
42*9880d681SAndroid Build Coastguard Workerdef WriteBrReg     : SchedWrite; // Indirect Branch
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdef WriteLD        : SchedWrite; // Load from base addr plus immediate offset
45*9880d681SAndroid Build Coastguard Workerdef WriteST        : SchedWrite; // Store to base addr plus immediate offset
46*9880d681SAndroid Build Coastguard Workerdef WriteSTP       : SchedWrite; // Store a register pair.
47*9880d681SAndroid Build Coastguard Workerdef WriteAdr       : SchedWrite; // Address pre/post increment.
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdef WriteLDIdx : SchedWrite; // Load from a register index (maybe scaled).
50*9880d681SAndroid Build Coastguard Workerdef WriteSTIdx : SchedWrite; // Store to a register index (maybe scaled).
51*9880d681SAndroid Build Coastguard Workerdef ReadAdrBase : SchedRead; // Read the base resister of a reg-offset LD/ST.
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker// Predicate for determining when a shiftable register is shifted.
54*9880d681SAndroid Build Coastguard Workerdef RegShiftedPred : SchedPredicate<[{TII->hasShiftedReg(*MI)}]>;
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker// Predicate for determining when a extendedable register is extended.
57*9880d681SAndroid Build Coastguard Workerdef RegExtendedPred : SchedPredicate<[{TII->hasExtendedReg(*MI)}]>;
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker// ScaledIdxPred is true if a WriteLDIdx operand will be
60*9880d681SAndroid Build Coastguard Worker// scaled. Subtargets can use this to dynamically select resources and
61*9880d681SAndroid Build Coastguard Worker// latency for WriteLDIdx and ReadAdrBase.
62*9880d681SAndroid Build Coastguard Workerdef ScaledIdxPred : SchedPredicate<[{TII->isScaledAddr(*MI)}]>;
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker// Serialized two-level address load.
65*9880d681SAndroid Build Coastguard Worker// EXAMPLE: LOADGot
66*9880d681SAndroid Build Coastguard Workerdef WriteLDAdr : WriteSequence<[WriteAdr, WriteLD]>;
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker// Serialized two-level address lookup.
69*9880d681SAndroid Build Coastguard Worker// EXAMPLE: MOVaddr...
70*9880d681SAndroid Build Coastguard Workerdef WriteAdrAdr : WriteSequence<[WriteAdr, WriteAdr]>;
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker// The second register of a load-pair.
73*9880d681SAndroid Build Coastguard Worker// LDP,LDPSW,LDNP,LDXP,LDAXP
74*9880d681SAndroid Build Coastguard Workerdef WriteLDHi : SchedWrite;
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker// Store-exclusive is a store followed by a dependent load.
77*9880d681SAndroid Build Coastguard Workerdef WriteSTX : WriteSequence<[WriteST, WriteLD]>;
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdef WriteSys     : SchedWrite; // Long, variable latency system ops.
80*9880d681SAndroid Build Coastguard Workerdef WriteBarrier : SchedWrite; // Memory barrier.
81*9880d681SAndroid Build Coastguard Workerdef WriteHint    : SchedWrite; // Hint instruction.
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdef WriteF       : SchedWrite; // General floating-point ops.
84*9880d681SAndroid Build Coastguard Workerdef WriteFCmp    : SchedWrite; // Floating-point compare.
85*9880d681SAndroid Build Coastguard Workerdef WriteFCvt    : SchedWrite; // Float conversion.
86*9880d681SAndroid Build Coastguard Workerdef WriteFCopy   : SchedWrite; // Float-int register copy.
87*9880d681SAndroid Build Coastguard Workerdef WriteFImm    : SchedWrite; // Floating-point immediate.
88*9880d681SAndroid Build Coastguard Workerdef WriteFMul    : SchedWrite; // Floating-point multiply.
89*9880d681SAndroid Build Coastguard Workerdef WriteFDiv    : SchedWrite; // Floating-point division.
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdef WriteV   : SchedWrite; // Vector ops.
92*9880d681SAndroid Build Coastguard Workerdef WriteVLD : SchedWrite; // Vector loads.
93*9880d681SAndroid Build Coastguard Workerdef WriteVST : SchedWrite; // Vector stores.
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdef WriteAtomic : SchedWrite; // Atomic memory operations (CAS, Swap, LDOP)
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker// Read the unwritten lanes of the VLD's destination registers.
98*9880d681SAndroid Build Coastguard Workerdef ReadVLD : SchedRead;
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker// Sequential vector load and shuffle.
101*9880d681SAndroid Build Coastguard Workerdef WriteVLDShuffle     : WriteSequence<[WriteVLD, WriteV]>;
102*9880d681SAndroid Build Coastguard Workerdef WriteVLDPairShuffle : WriteSequence<[WriteVLD, WriteV, WriteV]>;
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker// Store a shuffled vector.
105*9880d681SAndroid Build Coastguard Workerdef WriteVSTShuffle : WriteSequence<[WriteV, WriteVST]>;
106*9880d681SAndroid Build Coastguard Workerdef WriteVSTPairShuffle : WriteSequence<[WriteV, WriteV, WriteVST]>;
107