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