xref: /freebsd/contrib/llvm-project/llvm/lib/Target/ARM/ARMScheduleM4.td (revision 5b27928474e6a4103d65b347544705c40c9618fd)
10b57cec5SDimitry Andric//==- ARMScheduleM4.td - Cortex-M4 Scheduling Definitions -*- tablegen -*-====//
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//
90b57cec5SDimitry Andric// This file defines the SchedRead/Write data for the ARM Cortex-M4 processor.
100b57cec5SDimitry Andric//
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andricdef CortexM4Model : SchedMachineModel {
140b57cec5SDimitry Andric  let IssueWidth        = 1; // Only IT can be dual-issued, so assume single-issue
150b57cec5SDimitry Andric  let MicroOpBufferSize = 0; // In-order
160b57cec5SDimitry Andric  let LoadLatency       = 2; // Latency when not pipelined, not pc-relative
170b57cec5SDimitry Andric  let MispredictPenalty = 2; // Best case branch taken cost
180b57cec5SDimitry Andric  let PostRAScheduler   = 1;
190b57cec5SDimitry Andric
200b57cec5SDimitry Andric  let CompleteModel = 0;
21*8bcb0991SDimitry Andric  let UnsupportedFeatures = [IsARM, HasNEON, HasDotProd, HasZCZ, HasMVEInt,
22*8bcb0991SDimitry Andric          IsNotMClass, HasDPVFP, HasFPARMv8, HasFullFP16, Has8MSecExt, HasV8,
23*8bcb0991SDimitry Andric          HasV8_3a, HasTrustZone, HasDFB, IsWindows];
240b57cec5SDimitry Andric}
250b57cec5SDimitry Andric
260b57cec5SDimitry Andric
270b57cec5SDimitry Andric// We model the entire cpu as a single pipeline with a BufferSize = 0 since
280b57cec5SDimitry Andric// Cortex-M4 is in-order.
290b57cec5SDimitry Andric
300b57cec5SDimitry Andricdef M4Unit : ProcResource<1> { let BufferSize = 0; }
310b57cec5SDimitry Andric
320b57cec5SDimitry Andric
330b57cec5SDimitry Andriclet SchedModel = CortexM4Model in {
340b57cec5SDimitry Andric
350b57cec5SDimitry Andric// Some definitions of latencies we apply to different instructions
360b57cec5SDimitry Andric
370b57cec5SDimitry Andricclass M4UnitL1<SchedWrite write> : WriteRes<write, [M4Unit]> { let Latency = 1; }
380b57cec5SDimitry Andricclass M4UnitL2<SchedWrite write> : WriteRes<write, [M4Unit]> { let Latency = 2; }
390b57cec5SDimitry Andricclass M4UnitL3<SchedWrite write> : WriteRes<write, [M4Unit]> { let Latency = 3; }
400b57cec5SDimitry Andricclass M4UnitL14<SchedWrite write> : WriteRes<write, [M4Unit]> { let Latency = 14; }
410b57cec5SDimitry Andricdef M4UnitL1_wr : SchedWriteRes<[M4Unit]> { let Latency = 1; }
420b57cec5SDimitry Andricdef M4UnitL2_wr : SchedWriteRes<[M4Unit]> { let Latency = 2; }
430b57cec5SDimitry Andricclass M4UnitL1I<dag instr> : InstRW<[M4UnitL1_wr], instr>;
440b57cec5SDimitry Andricclass M4UnitL2I<dag instr> : InstRW<[M4UnitL2_wr], instr>;
450b57cec5SDimitry Andric
460b57cec5SDimitry Andric
470b57cec5SDimitry Andric// Loads, MAC's and DIV all get a higher latency of 2
480b57cec5SDimitry Andricdef : M4UnitL2<WriteLd>;
490b57cec5SDimitry Andricdef : M4UnitL2<WriteMAC32>;
500b57cec5SDimitry Andricdef : M4UnitL2<WriteMAC64Hi>;
510b57cec5SDimitry Andricdef : M4UnitL2<WriteMAC64Lo>;
520b57cec5SDimitry Andricdef : M4UnitL2<WriteMAC16>;
530b57cec5SDimitry Andricdef : M4UnitL2<WriteDIV>;
540b57cec5SDimitry Andric
550b57cec5SDimitry Andricdef : M4UnitL2I<(instregex "(t|t2)LDM")>;
56*8bcb0991SDimitry Andricdef : M4UnitL2I<(instregex "(t|t2)LDR")>;
570b57cec5SDimitry Andric
580b57cec5SDimitry Andric
590b57cec5SDimitry Andric// Stores we use a latency of 1 as they have no outputs
600b57cec5SDimitry Andric
610b57cec5SDimitry Andricdef : M4UnitL1<WriteST>;
620b57cec5SDimitry Andricdef : M4UnitL1I<(instregex "(t|t2)STM")>;
630b57cec5SDimitry Andric
640b57cec5SDimitry Andric
650b57cec5SDimitry Andric// Everything else has a Latency of 1
660b57cec5SDimitry Andric
670b57cec5SDimitry Andricdef : M4UnitL1<WriteALU>;
680b57cec5SDimitry Andricdef : M4UnitL1<WriteALUsi>;
690b57cec5SDimitry Andricdef : M4UnitL1<WriteALUsr>;
700b57cec5SDimitry Andricdef : M4UnitL1<WriteALUSsr>;
710b57cec5SDimitry Andricdef : M4UnitL1<WriteBr>;
720b57cec5SDimitry Andricdef : M4UnitL1<WriteBrL>;
730b57cec5SDimitry Andricdef : M4UnitL1<WriteBrTbl>;
740b57cec5SDimitry Andricdef : M4UnitL1<WriteCMPsi>;
750b57cec5SDimitry Andricdef : M4UnitL1<WriteCMPsr>;
760b57cec5SDimitry Andricdef : M4UnitL1<WriteCMP>;
770b57cec5SDimitry Andricdef : M4UnitL1<WriteMUL32>;
780b57cec5SDimitry Andricdef : M4UnitL1<WriteMUL64Hi>;
790b57cec5SDimitry Andricdef : M4UnitL1<WriteMUL64Lo>;
800b57cec5SDimitry Andricdef : M4UnitL1<WriteMUL16>;
810b57cec5SDimitry Andricdef : M4UnitL1<WriteNoop>;
820b57cec5SDimitry Andricdef : M4UnitL1<WritePreLd>;
830b57cec5SDimitry Andricdef : M4UnitL1I<(instregex "(t|t2)MOV")>;
840b57cec5SDimitry Andricdef : M4UnitL1I<(instrs COPY)>;
85*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "t2IT", "t2MSR", "t2MRS")>;
86*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "t2CLREX")>;
87*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "t2SEL", "t2USAD8", "t2SML[AS]",
88*8bcb0991SDimitry Andric    "t2(S|Q|SH|U|UQ|UH|QD)(ADD|ASX|SAX|SUB)", "t2USADA8", "(t|t2)REV")>;
89*8bcb0991SDimitry Andric
90*8bcb0991SDimitry Andric// These instructions are not of much interest to scheduling as they will not
91*8bcb0991SDimitry Andric// be generated or it is not very useful to schedule them. They are here to make
92*8bcb0991SDimitry Andric// the model more complete.
93*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "t2CDP", "t2LDC", "t2MCR", "t2MRC", "t2MRRC", "t2STC")>;
94*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "tCPS", "t2ISB", "t2DSB", "t2DMB", "t2?HINT$")>;
95*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "t2?UDF$", "tBKPT", "t2DBG")>;
96*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "t?2?Int_eh_sjlj_", "tADDframe", "t?ADJCALL")>;
97*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "CMP_SWAP", "JUMPTABLE", "MEMCPY")>;
98*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "VSETLNi32", "VGETLNi32")>;
990b57cec5SDimitry Andric
1000b57cec5SDimitry Andricdef : ReadAdvance<ReadALU, 0>;
1010b57cec5SDimitry Andricdef : ReadAdvance<ReadALUsr, 0>;
1020b57cec5SDimitry Andricdef : ReadAdvance<ReadMUL, 0>;
1030b57cec5SDimitry Andricdef : ReadAdvance<ReadMAC, 0>;
1040b57cec5SDimitry Andric
1050b57cec5SDimitry Andric// Most FP instructions are single-cycle latency, except MAC's, Div's and Sqrt's.
1060b57cec5SDimitry Andric// Loads still take 2 cycles.
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andricdef : M4UnitL1<WriteFPCVT>;
1090b57cec5SDimitry Andricdef : M4UnitL1<WriteFPMOV>;
1100b57cec5SDimitry Andricdef : M4UnitL1<WriteFPALU32>;
1110b57cec5SDimitry Andricdef : M4UnitL1<WriteFPALU64>;
1120b57cec5SDimitry Andricdef : M4UnitL1<WriteFPMUL32>;
1130b57cec5SDimitry Andricdef : M4UnitL1<WriteFPMUL64>;
1140b57cec5SDimitry Andricdef : M4UnitL2I<(instregex "VLD")>;
1150b57cec5SDimitry Andricdef : M4UnitL1I<(instregex "VST")>;
1160b57cec5SDimitry Andricdef : M4UnitL3<WriteFPMAC32>;
1170b57cec5SDimitry Andricdef : M4UnitL3<WriteFPMAC64>;
1180b57cec5SDimitry Andricdef : M4UnitL14<WriteFPDIV32>;
1190b57cec5SDimitry Andricdef : M4UnitL14<WriteFPDIV64>;
1200b57cec5SDimitry Andricdef : M4UnitL14<WriteFPSQRT32>;
1210b57cec5SDimitry Andricdef : M4UnitL14<WriteFPSQRT64>;
1220b57cec5SDimitry Andricdef : M4UnitL1<WriteVLD1>;
1230b57cec5SDimitry Andricdef : M4UnitL1<WriteVLD2>;
1240b57cec5SDimitry Andricdef : M4UnitL1<WriteVLD3>;
1250b57cec5SDimitry Andricdef : M4UnitL1<WriteVLD4>;
1260b57cec5SDimitry Andricdef : M4UnitL1<WriteVST1>;
1270b57cec5SDimitry Andricdef : M4UnitL1<WriteVST2>;
1280b57cec5SDimitry Andricdef : M4UnitL1<WriteVST3>;
1290b57cec5SDimitry Andricdef : M4UnitL1<WriteVST4>;
130*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "VMOVS", "FCONSTS", "VCMP", "VNEG", "VABS")>;
131*8bcb0991SDimitry Andricdef : M4UnitL2I<(instregex "VMOVD")>;
132*8bcb0991SDimitry Andricdef : M4UnitL1I<(instregex "VMRS", "VMSR", "FMSTAT")>;
1330b57cec5SDimitry Andric
1340b57cec5SDimitry Andricdef : ReadAdvance<ReadFPMUL, 0>;
1350b57cec5SDimitry Andricdef : ReadAdvance<ReadFPMAC, 0>;
1360b57cec5SDimitry Andric
1370b57cec5SDimitry Andric}
138