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