1*700637cbSDimitry Andric//===-- RISCVSchedGenericOOO.td - Generic OOO Processor ----*- tablegen -*-===// 2*700637cbSDimitry Andric// 3*700637cbSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*700637cbSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*700637cbSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*700637cbSDimitry Andric// 7*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 8*700637cbSDimitry Andric 9*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 10*700637cbSDimitry Andric// We assume that: 11*700637cbSDimitry Andric// * 6-issue out-of-order CPU with 192 ROB entries. 12*700637cbSDimitry Andric// * Units: 13*700637cbSDimitry Andric// * IXU (Integer ALU Unit): 4 units, only one can execute mul/div. 14*700637cbSDimitry Andric// * FXU (Floating-point Unit): 2 units. 15*700637cbSDimitry Andric// * LSU (Load/Store Unit): 2 units. 16*700637cbSDimitry Andric// * Latency: 17*700637cbSDimitry Andric// * Integer instructions: 1 cycle. 18*700637cbSDimitry Andric// * Multiplication instructions: 4 cycles. 19*700637cbSDimitry Andric// * Division instructions: 13-21 cycles. 20*700637cbSDimitry Andric// * Floating-point instructions: 2-6 cycles. 21*700637cbSDimitry Andric// * Floating-point fdiv/fsqrt instructions: 9-21 cycles. 22*700637cbSDimitry Andric// * Load/Store: 23*700637cbSDimitry Andric// * IXU: 4 cycles. 24*700637cbSDimitry Andric// * FXU: 4 cycles. 25*700637cbSDimitry Andric// * Integer/floating-point/vector div/rem/sqrt/... are non-pipelined. 26*700637cbSDimitry Andric// 27*700637cbSDimitry Andric// TODO: Add vector scheduling. 28*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 29*700637cbSDimitry Andric 30*700637cbSDimitry Andricdef GenericOOOModel : SchedMachineModel { 31*700637cbSDimitry Andric int IssueWidth = 6; 32*700637cbSDimitry Andric int MicroOpBufferSize = 192; 33*700637cbSDimitry Andric int LoadLatency = 4; 34*700637cbSDimitry Andric int MispredictPenalty = 8; 35*700637cbSDimitry Andric let CompleteModel = 0; 36*700637cbSDimitry Andric} 37*700637cbSDimitry Andric 38*700637cbSDimitry Andriclet SchedModel = GenericOOOModel in { 39*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 40*700637cbSDimitry Andric// Resource groups 41*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 42*700637cbSDimitry Andricdef GenericOOOBranch : ProcResource<1>; 43*700637cbSDimitry Andricdef GenericOOOMulDiv : ProcResource<1>; 44*700637cbSDimitry Andricdef GenericOOOInt : ProcResource<2>; 45*700637cbSDimitry Andricdef GenericOOOALU 46*700637cbSDimitry Andric : ProcResGroup<[GenericOOOBranch, GenericOOOMulDiv, GenericOOOInt]>; 47*700637cbSDimitry Andricdef GenericOOOLSU : ProcResource<2>; 48*700637cbSDimitry Andricdef GenericOOOFMulDiv : ProcResource<1>; 49*700637cbSDimitry Andricdef GenericOOOFloat : ProcResource<1>; 50*700637cbSDimitry Andricdef GenericOOOFPU : ProcResGroup<[GenericOOOFMulDiv, GenericOOOFloat]>; 51*700637cbSDimitry Andric 52*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 53*700637cbSDimitry Andric// Branches 54*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 55*700637cbSDimitry Andricdef : WriteRes<WriteJmp, [GenericOOOBranch]>; 56*700637cbSDimitry Andricdef : WriteRes<WriteJalr, [GenericOOOBranch]>; 57*700637cbSDimitry Andricdef : WriteRes<WriteJal, [GenericOOOBranch]>; 58*700637cbSDimitry Andric 59*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 60*700637cbSDimitry Andric// Integer arithmetic and logic 61*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 62*700637cbSDimitry Andricdef : WriteRes<WriteIALU, [GenericOOOALU]>; 63*700637cbSDimitry Andricdef : WriteRes<WriteIALU32, [GenericOOOALU]>; 64*700637cbSDimitry Andricdef : WriteRes<WriteShiftImm, [GenericOOOALU]>; 65*700637cbSDimitry Andricdef : WriteRes<WriteShiftImm32, [GenericOOOALU]>; 66*700637cbSDimitry Andricdef : WriteRes<WriteShiftReg, [GenericOOOALU]>; 67*700637cbSDimitry Andricdef : WriteRes<WriteShiftReg32, [GenericOOOALU]>; 68*700637cbSDimitry Andric 69*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 70*700637cbSDimitry Andric// Integer multiplication 71*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 72*700637cbSDimitry Andriclet Latency = 4 in { 73*700637cbSDimitry Andric def : WriteRes<WriteIMul, [GenericOOOMulDiv]>; 74*700637cbSDimitry Andric def : WriteRes<WriteIMul32, [GenericOOOMulDiv]>; 75*700637cbSDimitry Andric} 76*700637cbSDimitry Andric 77*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 78*700637cbSDimitry Andric// Integer division 79*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 80*700637cbSDimitry Andricdef : WriteRes<WriteIDiv32, [GenericOOOMulDiv]> { 81*700637cbSDimitry Andric let Latency = 13; 82*700637cbSDimitry Andric let ReleaseAtCycles = [13]; 83*700637cbSDimitry Andric} 84*700637cbSDimitry Andricdef : WriteRes<WriteIDiv, [GenericOOOMulDiv]> { 85*700637cbSDimitry Andric let Latency = 21; 86*700637cbSDimitry Andric let ReleaseAtCycles = [21]; 87*700637cbSDimitry Andric} 88*700637cbSDimitry Andricdef : WriteRes<WriteIRem32, [GenericOOOMulDiv]> { 89*700637cbSDimitry Andric let Latency = 13; 90*700637cbSDimitry Andric let ReleaseAtCycles = [13]; 91*700637cbSDimitry Andric} 92*700637cbSDimitry Andricdef : WriteRes<WriteIRem, [GenericOOOMulDiv]> { 93*700637cbSDimitry Andric let Latency = 21; 94*700637cbSDimitry Andric let ReleaseAtCycles = [21]; 95*700637cbSDimitry Andric} 96*700637cbSDimitry Andric 97*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 98*700637cbSDimitry Andric// Integer memory 99*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 100*700637cbSDimitry Andric// Load 101*700637cbSDimitry Andriclet Latency = 4 in { 102*700637cbSDimitry Andric def : WriteRes<WriteLDB, [GenericOOOLSU]>; 103*700637cbSDimitry Andric def : WriteRes<WriteLDH, [GenericOOOLSU]>; 104*700637cbSDimitry Andric def : WriteRes<WriteLDW, [GenericOOOLSU]>; 105*700637cbSDimitry Andric def : WriteRes<WriteLDD, [GenericOOOLSU]>; 106*700637cbSDimitry Andric} 107*700637cbSDimitry Andric 108*700637cbSDimitry Andric// Store 109*700637cbSDimitry Andricdef : WriteRes<WriteSTB, [GenericOOOLSU]>; 110*700637cbSDimitry Andricdef : WriteRes<WriteSTH, [GenericOOOLSU]>; 111*700637cbSDimitry Andricdef : WriteRes<WriteSTW, [GenericOOOLSU]>; 112*700637cbSDimitry Andricdef : WriteRes<WriteSTD, [GenericOOOLSU]>; 113*700637cbSDimitry Andric 114*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 115*700637cbSDimitry Andric// Atomic 116*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 117*700637cbSDimitry Andriclet Latency = 4 in { 118*700637cbSDimitry Andric def : WriteRes<WriteAtomicLDW, [GenericOOOLSU]>; 119*700637cbSDimitry Andric def : WriteRes<WriteAtomicLDD, [GenericOOOLSU]>; 120*700637cbSDimitry Andric} 121*700637cbSDimitry Andric 122*700637cbSDimitry Andriclet Latency = 5 in { 123*700637cbSDimitry Andric def : WriteRes<WriteAtomicW, [GenericOOOLSU]>; 124*700637cbSDimitry Andric def : WriteRes<WriteAtomicD, [GenericOOOLSU]>; 125*700637cbSDimitry Andric} 126*700637cbSDimitry Andric 127*700637cbSDimitry Andricdef : WriteRes<WriteAtomicSTW, [GenericOOOLSU]>; 128*700637cbSDimitry Andricdef : WriteRes<WriteAtomicSTD, [GenericOOOLSU]>; 129*700637cbSDimitry Andric 130*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 131*700637cbSDimitry Andric// Floating-point 132*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 133*700637cbSDimitry Andric// Floating-point load 134*700637cbSDimitry Andriclet Latency = 4 in { 135*700637cbSDimitry Andric def : WriteRes<WriteFLD32, [GenericOOOLSU]>; 136*700637cbSDimitry Andric def : WriteRes<WriteFLD64, [GenericOOOLSU]>; 137*700637cbSDimitry Andric} 138*700637cbSDimitry Andric 139*700637cbSDimitry Andric// Floating-point store 140*700637cbSDimitry Andricdef : WriteRes<WriteFST32, [GenericOOOLSU]>; 141*700637cbSDimitry Andricdef : WriteRes<WriteFST64, [GenericOOOLSU]>; 142*700637cbSDimitry Andric 143*700637cbSDimitry Andric// Arithmetic and logic 144*700637cbSDimitry Andriclet Latency = 2 in { 145*700637cbSDimitry Andric def : WriteRes<WriteFAdd32, [GenericOOOFPU]>; 146*700637cbSDimitry Andric def : WriteRes<WriteFAdd64, [GenericOOOFPU]>; 147*700637cbSDimitry Andric} 148*700637cbSDimitry Andric 149*700637cbSDimitry Andricdef : WriteRes<WriteFSGNJ32, [GenericOOOFPU]>; 150*700637cbSDimitry Andricdef : WriteRes<WriteFSGNJ64, [GenericOOOFPU]>; 151*700637cbSDimitry Andricdef : WriteRes<WriteFMinMax32, [GenericOOOFPU]>; 152*700637cbSDimitry Andricdef : WriteRes<WriteFMinMax64, [GenericOOOFPU]>; 153*700637cbSDimitry Andric 154*700637cbSDimitry Andric// Compare 155*700637cbSDimitry Andriclet Latency = 2 in { 156*700637cbSDimitry Andric def : WriteRes<WriteFCmp32, [GenericOOOFPU]>; 157*700637cbSDimitry Andric def : WriteRes<WriteFCmp64, [GenericOOOFPU]>; 158*700637cbSDimitry Andric} 159*700637cbSDimitry Andric 160*700637cbSDimitry Andric// Multiplication 161*700637cbSDimitry Andriclet Latency = 4 in { 162*700637cbSDimitry Andric def : WriteRes<WriteFMul32, [GenericOOOFMulDiv]>; 163*700637cbSDimitry Andric def : WriteRes<WriteFMul64, [GenericOOOFMulDiv]>; 164*700637cbSDimitry Andric} 165*700637cbSDimitry Andric 166*700637cbSDimitry Andric// FMA 167*700637cbSDimitry Andriclet Latency = 6 in { 168*700637cbSDimitry Andric def : WriteRes<WriteFMA32, [GenericOOOFMulDiv]>; 169*700637cbSDimitry Andric def : WriteRes<WriteFMA64, [GenericOOOFMulDiv]>; 170*700637cbSDimitry Andric} 171*700637cbSDimitry Andric 172*700637cbSDimitry Andric// Division 173*700637cbSDimitry Andriclet Latency = 13, ReleaseAtCycles = [13] in { 174*700637cbSDimitry Andric def : WriteRes<WriteFDiv32, [GenericOOOFMulDiv]>; 175*700637cbSDimitry Andric def : WriteRes<WriteFSqrt32, [GenericOOOFMulDiv]>; 176*700637cbSDimitry Andric} 177*700637cbSDimitry Andric 178*700637cbSDimitry Andriclet Latency = 17, ReleaseAtCycles = [17] in { 179*700637cbSDimitry Andric def : WriteRes<WriteFDiv64, [GenericOOOFMulDiv]>; 180*700637cbSDimitry Andric def : WriteRes<WriteFSqrt64, [GenericOOOFMulDiv]>; 181*700637cbSDimitry Andric} 182*700637cbSDimitry Andric 183*700637cbSDimitry Andric// Conversions 184*700637cbSDimitry Andriclet Latency = 2 in { 185*700637cbSDimitry Andric def : WriteRes<WriteFCvtI32ToF32, [GenericOOOFPU]>; 186*700637cbSDimitry Andric def : WriteRes<WriteFCvtI32ToF64, [GenericOOOFPU]>; 187*700637cbSDimitry Andric def : WriteRes<WriteFCvtI64ToF32, [GenericOOOFPU]>; 188*700637cbSDimitry Andric def : WriteRes<WriteFCvtI64ToF64, [GenericOOOFPU]>; 189*700637cbSDimitry Andric} 190*700637cbSDimitry Andric 191*700637cbSDimitry Andriclet Latency = 2 in { 192*700637cbSDimitry Andric def : WriteRes<WriteFCvtF32ToI32, [GenericOOOFPU]>; 193*700637cbSDimitry Andric def : WriteRes<WriteFCvtF32ToI64, [GenericOOOFPU]>; 194*700637cbSDimitry Andric} 195*700637cbSDimitry Andric 196*700637cbSDimitry Andriclet Latency = 2 in { 197*700637cbSDimitry Andric def : WriteRes<WriteFCvtF64ToI32, [GenericOOOFPU]>; 198*700637cbSDimitry Andric def : WriteRes<WriteFCvtF64ToI64, [GenericOOOFPU]>; 199*700637cbSDimitry Andric} 200*700637cbSDimitry Andric 201*700637cbSDimitry Andriclet Latency = 2 in { 202*700637cbSDimitry Andric def : WriteRes<WriteFCvtF64ToF32, [GenericOOOFPU]>; 203*700637cbSDimitry Andric def : WriteRes<WriteFCvtF32ToF64, [GenericOOOFPU]>; 204*700637cbSDimitry Andric} 205*700637cbSDimitry Andric 206*700637cbSDimitry Andriclet Latency = 2 in { 207*700637cbSDimitry Andric def : WriteRes<WriteFMovI32ToF32, [GenericOOOFPU]>; 208*700637cbSDimitry Andric def : WriteRes<WriteFMovI64ToF64, [GenericOOOFPU]>; 209*700637cbSDimitry Andric def : WriteRes<WriteFMovF32ToI32, [GenericOOOFPU]>; 210*700637cbSDimitry Andric def : WriteRes<WriteFMovF64ToI64, [GenericOOOFPU]>; 211*700637cbSDimitry Andric} 212*700637cbSDimitry Andric 213*700637cbSDimitry Andric// Classify 214*700637cbSDimitry Andricdef : WriteRes<WriteFClass32, [GenericOOOFPU]>; 215*700637cbSDimitry Andricdef : WriteRes<WriteFClass64, [GenericOOOFPU]>; 216*700637cbSDimitry Andric 217*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 218*700637cbSDimitry Andric// Zicsr extension 219*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 220*700637cbSDimitry Andricdef : WriteRes<WriteCSR, [GenericOOOALU]>; 221*700637cbSDimitry Andric 222*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 223*700637cbSDimitry Andric// Zabha extension 224*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 225*700637cbSDimitry Andriclet Latency = 5 in { 226*700637cbSDimitry Andric def : WriteRes<WriteAtomicB, [GenericOOOLSU]>; 227*700637cbSDimitry Andric def : WriteRes<WriteAtomicH, [GenericOOOLSU]>; 228*700637cbSDimitry Andric} 229*700637cbSDimitry Andric 230*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 231*700637cbSDimitry Andric// Zba extension 232*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 233*700637cbSDimitry Andricdef : WriteRes<WriteSHXADD, [GenericOOOALU]>; 234*700637cbSDimitry Andricdef : WriteRes<WriteSHXADD32, [GenericOOOALU]>; 235*700637cbSDimitry Andric 236*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 237*700637cbSDimitry Andric// Zbb extension 238*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 239*700637cbSDimitry Andricdef : WriteRes<WriteCLZ, [GenericOOOALU]>; 240*700637cbSDimitry Andricdef : WriteRes<WriteCTZ, [GenericOOOALU]>; 241*700637cbSDimitry Andricdef : WriteRes<WriteCPOP, [GenericOOOALU]>; 242*700637cbSDimitry Andricdef : WriteRes<WriteCLZ32, [GenericOOOALU]>; 243*700637cbSDimitry Andricdef : WriteRes<WriteCTZ32, [GenericOOOALU]>; 244*700637cbSDimitry Andricdef : WriteRes<WriteCPOP32, [GenericOOOALU]>; 245*700637cbSDimitry Andricdef : WriteRes<WriteRotateReg, [GenericOOOALU]>; 246*700637cbSDimitry Andricdef : WriteRes<WriteRotateImm, [GenericOOOALU]>; 247*700637cbSDimitry Andricdef : WriteRes<WriteRotateReg32, [GenericOOOALU]>; 248*700637cbSDimitry Andricdef : WriteRes<WriteRotateImm32, [GenericOOOALU]>; 249*700637cbSDimitry Andricdef : WriteRes<WriteREV8, [GenericOOOALU]>; 250*700637cbSDimitry Andricdef : WriteRes<WriteORCB, [GenericOOOALU]>; 251*700637cbSDimitry Andricdef : WriteRes<WriteIMinMax, [GenericOOOALU]>; 252*700637cbSDimitry Andric 253*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 254*700637cbSDimitry Andric// Zbc extension 255*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 256*700637cbSDimitry Andricdef : WriteRes<WriteCLMUL, [GenericOOOALU]>; 257*700637cbSDimitry Andric 258*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 259*700637cbSDimitry Andric// Zbs extension 260*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 261*700637cbSDimitry Andricdef : WriteRes<WriteSingleBit, [GenericOOOALU]>; 262*700637cbSDimitry Andricdef : WriteRes<WriteSingleBitImm, [GenericOOOALU]>; 263*700637cbSDimitry Andricdef : WriteRes<WriteBEXT, [GenericOOOALU]>; 264*700637cbSDimitry Andricdef : WriteRes<WriteBEXTI, [GenericOOOALU]>; 265*700637cbSDimitry Andric 266*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 267*700637cbSDimitry Andric// Zbkb extension 268*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 269*700637cbSDimitry Andricdef : WriteRes<WriteBREV8, [GenericOOOALU]>; 270*700637cbSDimitry Andricdef : WriteRes<WritePACK, [GenericOOOALU]>; 271*700637cbSDimitry Andricdef : WriteRes<WritePACK32, [GenericOOOALU]>; 272*700637cbSDimitry Andricdef : WriteRes<WriteZIP, [GenericOOOALU]>; 273*700637cbSDimitry Andric 274*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 275*700637cbSDimitry Andric// Zbkx extension 276*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 277*700637cbSDimitry Andricdef : WriteRes<WriteXPERM, [GenericOOOALU]>; 278*700637cbSDimitry Andric 279*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 280*700637cbSDimitry Andric// Zfa extension 281*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 282*700637cbSDimitry Andriclet Latency = 2 in { 283*700637cbSDimitry Andric def : WriteRes<WriteFRoundF16, [GenericOOOFPU]>; 284*700637cbSDimitry Andric def : WriteRes<WriteFRoundF32, [GenericOOOFPU]>; 285*700637cbSDimitry Andric def : WriteRes<WriteFRoundF64, [GenericOOOFPU]>; 286*700637cbSDimitry Andric} 287*700637cbSDimitry Andric 288*700637cbSDimitry Andriclet Latency = 2 in { 289*700637cbSDimitry Andric def : WriteRes<WriteFLI16, [GenericOOOFPU]>; 290*700637cbSDimitry Andric def : WriteRes<WriteFLI32, [GenericOOOFPU]>; 291*700637cbSDimitry Andric def : WriteRes<WriteFLI64, [GenericOOOFPU]>; 292*700637cbSDimitry Andric} 293*700637cbSDimitry Andric 294*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 295*700637cbSDimitry Andric// Zfh extension 296*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 297*700637cbSDimitry Andric// Zfhmin 298*700637cbSDimitry Andric// Load/Store 299*700637cbSDimitry Andriclet Latency = 4 in 300*700637cbSDimitry Andricdef : WriteRes<WriteFLD16, [GenericOOOLSU]>; 301*700637cbSDimitry Andricdef : WriteRes<WriteFST16, [GenericOOOLSU]>; 302*700637cbSDimitry Andric 303*700637cbSDimitry Andric// Conversions 304*700637cbSDimitry Andriclet Latency = 2 in { 305*700637cbSDimitry Andric def : WriteRes<WriteFCvtF16ToF64, [GenericOOOFPU]>; 306*700637cbSDimitry Andric def : WriteRes<WriteFCvtF64ToF16, [GenericOOOFPU]>; 307*700637cbSDimitry Andric def : WriteRes<WriteFCvtF32ToF16, [GenericOOOFPU]>; 308*700637cbSDimitry Andric def : WriteRes<WriteFCvtF16ToF32, [GenericOOOFPU]>; 309*700637cbSDimitry Andric} 310*700637cbSDimitry Andric 311*700637cbSDimitry Andriclet Latency = 2 in { 312*700637cbSDimitry Andric def : WriteRes<WriteFMovI16ToF16, [GenericOOOFPU]>; 313*700637cbSDimitry Andric def : WriteRes<WriteFMovF16ToI16, [GenericOOOFPU]>; 314*700637cbSDimitry Andric} 315*700637cbSDimitry Andric 316*700637cbSDimitry Andric// Other than Zfhmin 317*700637cbSDimitry Andriclet Latency = 2 in { 318*700637cbSDimitry Andric def : WriteRes<WriteFCvtI64ToF16, [GenericOOOFPU]>; 319*700637cbSDimitry Andric def : WriteRes<WriteFCvtI32ToF16, [GenericOOOFPU]>; 320*700637cbSDimitry Andric def : WriteRes<WriteFCvtF16ToI64, [GenericOOOFPU]>; 321*700637cbSDimitry Andric def : WriteRes<WriteFCvtF16ToI32, [GenericOOOFPU]>; 322*700637cbSDimitry Andric} 323*700637cbSDimitry Andric 324*700637cbSDimitry Andric// Arithmetic and logic 325*700637cbSDimitry Andriclet Latency = 2 in 326*700637cbSDimitry Andricdef : WriteRes<WriteFAdd16, [GenericOOOFPU]>; 327*700637cbSDimitry Andric 328*700637cbSDimitry Andricdef : WriteRes<WriteFSGNJ16, [GenericOOOFPU]>; 329*700637cbSDimitry Andricdef : WriteRes<WriteFMinMax16, [GenericOOOFPU]>; 330*700637cbSDimitry Andric 331*700637cbSDimitry Andric// Compare 332*700637cbSDimitry Andriclet Latency = 2 in 333*700637cbSDimitry Andricdef : WriteRes<WriteFCmp16, [GenericOOOFPU]>; 334*700637cbSDimitry Andric 335*700637cbSDimitry Andric// Multiplication 336*700637cbSDimitry Andriclet Latency = 4 in 337*700637cbSDimitry Andricdef : WriteRes<WriteFMul16, [GenericOOOFMulDiv]>; 338*700637cbSDimitry Andric 339*700637cbSDimitry Andric// FMA 340*700637cbSDimitry Andriclet Latency = 6 in 341*700637cbSDimitry Andricdef : WriteRes<WriteFMA16, [GenericOOOFMulDiv]>; 342*700637cbSDimitry Andric 343*700637cbSDimitry Andric// Division 344*700637cbSDimitry Andriclet Latency = 9, ReleaseAtCycles = [9] in { 345*700637cbSDimitry Andric def : WriteRes<WriteFDiv16, [GenericOOOFMulDiv]>; 346*700637cbSDimitry Andric def : WriteRes<WriteFSqrt16, [GenericOOOFMulDiv]>; 347*700637cbSDimitry Andric} 348*700637cbSDimitry Andric 349*700637cbSDimitry Andric// Classify 350*700637cbSDimitry Andricdef : WriteRes<WriteFClass16, [GenericOOOFPU]>; 351*700637cbSDimitry Andric 352*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 353*700637cbSDimitry Andric// Misc 354*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 355*700637cbSDimitry Andriclet Latency = 0 in 356*700637cbSDimitry Andricdef : WriteRes<WriteNop, [GenericOOOALU]>; 357*700637cbSDimitry Andric 358*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 359*700637cbSDimitry Andric// Bypass and advance 360*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 361*700637cbSDimitry Andricdef : ReadAdvance<ReadJmp, 0>; 362*700637cbSDimitry Andricdef : ReadAdvance<ReadJalr, 0>; 363*700637cbSDimitry Andricdef : ReadAdvance<ReadCSR, 0>; 364*700637cbSDimitry Andricdef : ReadAdvance<ReadStoreData, 0>; 365*700637cbSDimitry Andricdef : ReadAdvance<ReadMemBase, 0>; 366*700637cbSDimitry Andricdef : ReadAdvance<ReadIALU, 0>; 367*700637cbSDimitry Andricdef : ReadAdvance<ReadIALU32, 0>; 368*700637cbSDimitry Andricdef : ReadAdvance<ReadShiftImm, 0>; 369*700637cbSDimitry Andricdef : ReadAdvance<ReadShiftImm32, 0>; 370*700637cbSDimitry Andricdef : ReadAdvance<ReadShiftReg, 0>; 371*700637cbSDimitry Andricdef : ReadAdvance<ReadShiftReg32, 0>; 372*700637cbSDimitry Andricdef : ReadAdvance<ReadIDiv, 0>; 373*700637cbSDimitry Andricdef : ReadAdvance<ReadIDiv32, 0>; 374*700637cbSDimitry Andricdef : ReadAdvance<ReadIRem, 0>; 375*700637cbSDimitry Andricdef : ReadAdvance<ReadIRem32, 0>; 376*700637cbSDimitry Andricdef : ReadAdvance<ReadIMul, 0>; 377*700637cbSDimitry Andricdef : ReadAdvance<ReadIMul32, 0>; 378*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicWA, 0>; 379*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicWD, 0>; 380*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicDA, 0>; 381*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicDD, 0>; 382*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicLDW, 0>; 383*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicLDD, 0>; 384*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicSTW, 0>; 385*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicSTD, 0>; 386*700637cbSDimitry Andricdef : ReadAdvance<ReadFStoreData, 0>; 387*700637cbSDimitry Andricdef : ReadAdvance<ReadFMemBase, 0>; 388*700637cbSDimitry Andricdef : ReadAdvance<ReadFAdd32, 0>; 389*700637cbSDimitry Andricdef : ReadAdvance<ReadFAdd64, 0>; 390*700637cbSDimitry Andricdef : ReadAdvance<ReadFMul32, 0>; 391*700637cbSDimitry Andricdef : ReadAdvance<ReadFMA32, 0>; 392*700637cbSDimitry Andricdef : ReadAdvance<ReadFMA32Addend, 0>; 393*700637cbSDimitry Andricdef : ReadAdvance<ReadFMul64, 0>; 394*700637cbSDimitry Andricdef : ReadAdvance<ReadFMA64, 0>; 395*700637cbSDimitry Andricdef : ReadAdvance<ReadFMA64Addend, 0>; 396*700637cbSDimitry Andricdef : ReadAdvance<ReadFDiv32, 0>; 397*700637cbSDimitry Andricdef : ReadAdvance<ReadFDiv64, 0>; 398*700637cbSDimitry Andricdef : ReadAdvance<ReadFSqrt32, 0>; 399*700637cbSDimitry Andricdef : ReadAdvance<ReadFSqrt64, 0>; 400*700637cbSDimitry Andricdef : ReadAdvance<ReadFCmp32, 0>; 401*700637cbSDimitry Andricdef : ReadAdvance<ReadFCmp64, 0>; 402*700637cbSDimitry Andricdef : ReadAdvance<ReadFSGNJ32, 0>; 403*700637cbSDimitry Andricdef : ReadAdvance<ReadFSGNJ64, 0>; 404*700637cbSDimitry Andricdef : ReadAdvance<ReadFMinMax32, 0>; 405*700637cbSDimitry Andricdef : ReadAdvance<ReadFMinMax64, 0>; 406*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF32ToI32, 0>; 407*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF32ToI64, 0>; 408*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF64ToI32, 0>; 409*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF64ToI64, 0>; 410*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF32, 0>; 411*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF64, 0>; 412*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF32, 0>; 413*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF64, 0>; 414*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF32ToF64, 0>; 415*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF64ToF32, 0>; 416*700637cbSDimitry Andricdef : ReadAdvance<ReadFMovF32ToI32, 0>; 417*700637cbSDimitry Andricdef : ReadAdvance<ReadFMovI32ToF32, 0>; 418*700637cbSDimitry Andricdef : ReadAdvance<ReadFMovF64ToI64, 0>; 419*700637cbSDimitry Andricdef : ReadAdvance<ReadFMovI64ToF64, 0>; 420*700637cbSDimitry Andricdef : ReadAdvance<ReadFClass32, 0>; 421*700637cbSDimitry Andricdef : ReadAdvance<ReadFClass64, 0>; 422*700637cbSDimitry Andric 423*700637cbSDimitry Andric// Zabha 424*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicBA, 0>; 425*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicBD, 0>; 426*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicHA, 0>; 427*700637cbSDimitry Andricdef : ReadAdvance<ReadAtomicHD, 0>; 428*700637cbSDimitry Andric 429*700637cbSDimitry Andric// Zba extension 430*700637cbSDimitry Andricdef : ReadAdvance<ReadSHXADD, 0>; 431*700637cbSDimitry Andricdef : ReadAdvance<ReadSHXADD32, 0>; 432*700637cbSDimitry Andric 433*700637cbSDimitry Andric// Zbb extension 434*700637cbSDimitry Andricdef : ReadAdvance<ReadRotateImm, 0>; 435*700637cbSDimitry Andricdef : ReadAdvance<ReadRotateImm32, 0>; 436*700637cbSDimitry Andricdef : ReadAdvance<ReadRotateReg, 0>; 437*700637cbSDimitry Andricdef : ReadAdvance<ReadRotateReg32, 0>; 438*700637cbSDimitry Andricdef : ReadAdvance<ReadCLZ, 0>; 439*700637cbSDimitry Andricdef : ReadAdvance<ReadCLZ32, 0>; 440*700637cbSDimitry Andricdef : ReadAdvance<ReadCTZ, 0>; 441*700637cbSDimitry Andricdef : ReadAdvance<ReadCTZ32, 0>; 442*700637cbSDimitry Andricdef : ReadAdvance<ReadCPOP, 0>; 443*700637cbSDimitry Andricdef : ReadAdvance<ReadCPOP32, 0>; 444*700637cbSDimitry Andricdef : ReadAdvance<ReadREV8, 0>; 445*700637cbSDimitry Andricdef : ReadAdvance<ReadORCB, 0>; 446*700637cbSDimitry Andricdef : ReadAdvance<ReadIMinMax, 0>; 447*700637cbSDimitry Andric 448*700637cbSDimitry Andric// Zbc extension 449*700637cbSDimitry Andricdef : ReadAdvance<ReadCLMUL, 0>; 450*700637cbSDimitry Andric 451*700637cbSDimitry Andric// Zbs extension 452*700637cbSDimitry Andricdef : ReadAdvance<ReadSingleBit, 0>; 453*700637cbSDimitry Andricdef : ReadAdvance<ReadSingleBitImm, 0>; 454*700637cbSDimitry Andric 455*700637cbSDimitry Andric// Zbkb 456*700637cbSDimitry Andricdef : ReadAdvance<ReadBREV8, 0>; 457*700637cbSDimitry Andricdef : ReadAdvance<ReadPACK, 0>; 458*700637cbSDimitry Andricdef : ReadAdvance<ReadPACK32, 0>; 459*700637cbSDimitry Andricdef : ReadAdvance<ReadZIP, 0>; 460*700637cbSDimitry Andric 461*700637cbSDimitry Andric// Zbkx 462*700637cbSDimitry Andricdef : ReadAdvance<ReadXPERM, 0>; 463*700637cbSDimitry Andric 464*700637cbSDimitry Andric// Zfa extension 465*700637cbSDimitry Andricdef : ReadAdvance<ReadFRoundF32, 0>; 466*700637cbSDimitry Andricdef : ReadAdvance<ReadFRoundF64, 0>; 467*700637cbSDimitry Andricdef : ReadAdvance<ReadFRoundF16, 0>; 468*700637cbSDimitry Andric 469*700637cbSDimitry Andric// Zfh extension 470*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF16ToF64, 0>; 471*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF64ToF16, 0>; 472*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF32ToF16, 0>; 473*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF16ToF32, 0>; 474*700637cbSDimitry Andricdef : ReadAdvance<ReadFMovI16ToF16, 0>; 475*700637cbSDimitry Andricdef : ReadAdvance<ReadFMovF16ToI16, 0>; 476*700637cbSDimitry Andric 477*700637cbSDimitry Andricdef : ReadAdvance<ReadFAdd16, 0>; 478*700637cbSDimitry Andricdef : ReadAdvance<ReadFClass16, 0>; 479*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF16, 0>; 480*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF16, 0>; 481*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF16ToI64, 0>; 482*700637cbSDimitry Andricdef : ReadAdvance<ReadFCvtF16ToI32, 0>; 483*700637cbSDimitry Andricdef : ReadAdvance<ReadFDiv16, 0>; 484*700637cbSDimitry Andricdef : ReadAdvance<ReadFCmp16, 0>; 485*700637cbSDimitry Andricdef : ReadAdvance<ReadFMA16, 0>; 486*700637cbSDimitry Andricdef : ReadAdvance<ReadFMA16Addend, 0>; 487*700637cbSDimitry Andricdef : ReadAdvance<ReadFMinMax16, 0>; 488*700637cbSDimitry Andricdef : ReadAdvance<ReadFMul16, 0>; 489*700637cbSDimitry Andricdef : ReadAdvance<ReadFSGNJ16, 0>; 490*700637cbSDimitry Andricdef : ReadAdvance<ReadFSqrt16, 0>; 491*700637cbSDimitry Andric 492*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 493*700637cbSDimitry Andric// Unsupported extensions 494*700637cbSDimitry Andric//===----------------------------------------------------------------------===// 495*700637cbSDimitry Andricdefm : UnsupportedSchedQ; 496*700637cbSDimitry Andricdefm : UnsupportedSchedV; 497*700637cbSDimitry Andricdefm : UnsupportedSchedZfaWithQ; 498*700637cbSDimitry Andricdefm : UnsupportedSchedZvk; 499*700637cbSDimitry Andricdefm : UnsupportedSchedSFB; 500*700637cbSDimitry Andricdefm : UnsupportedSchedXsf; 501*700637cbSDimitry Andric} 502