1*0fca6ea1SDimitry Andric//==- RISCVSchedSiFiveP600.td - SiFiveP600 Scheduling Defs ---*- tablegen -*-=// 2*0fca6ea1SDimitry Andric// 3*0fca6ea1SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric// 7*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric 9*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 10*0fca6ea1SDimitry Andric 11*0fca6ea1SDimitry Andric/// c is true if mx has the worst case behavior compared to LMULs in MxList. 12*0fca6ea1SDimitry Andric/// On the SiFiveP600, the worst case LMUL is the Largest LMUL 13*0fca6ea1SDimitry Andric/// and the worst case sew is the smallest SEW for that LMUL. 14*0fca6ea1SDimitry Andricclass SiFiveP600IsWorstCaseMX<string mx, list<string> MxList> { 15*0fca6ea1SDimitry Andric string LLMUL = LargestLMUL<MxList>.r; 16*0fca6ea1SDimitry Andric bit c = !eq(mx, LLMUL); 17*0fca6ea1SDimitry Andric} 18*0fca6ea1SDimitry Andric 19*0fca6ea1SDimitry Andricclass SiFiveP600IsWorstCaseMXSEW<string mx, int sew, list<string> MxList, bit isF = 0> { 20*0fca6ea1SDimitry Andric string LLMUL = LargestLMUL<MxList>.r; 21*0fca6ea1SDimitry Andric int SSEW = SmallestSEW<mx, isF>.r; 22*0fca6ea1SDimitry Andric bit c = !and(!eq(mx, LLMUL), !eq(sew, SSEW)); 23*0fca6ea1SDimitry Andric} 24*0fca6ea1SDimitry Andric 25*0fca6ea1SDimitry Andric// 1 Micro-Op per cycle. 26*0fca6ea1SDimitry Andricclass SiFiveP600GetLMulCycles<string mx> { 27*0fca6ea1SDimitry Andric int c = !cond( 28*0fca6ea1SDimitry Andric !eq(mx, "M1") : 1, 29*0fca6ea1SDimitry Andric !eq(mx, "M2") : 2, 30*0fca6ea1SDimitry Andric !eq(mx, "M4") : 4, 31*0fca6ea1SDimitry Andric !eq(mx, "M8") : 8, 32*0fca6ea1SDimitry Andric !eq(mx, "MF2") : 1, 33*0fca6ea1SDimitry Andric !eq(mx, "MF4") : 1, 34*0fca6ea1SDimitry Andric !eq(mx, "MF8") : 1 35*0fca6ea1SDimitry Andric ); 36*0fca6ea1SDimitry Andric} 37*0fca6ea1SDimitry Andric 38*0fca6ea1SDimitry Andric// Latency for segmented loads and stores are calculated as vl * nf. 39*0fca6ea1SDimitry Andricclass SiFiveP600GetCyclesSegmented<string mx, int sew, int nf> { 40*0fca6ea1SDimitry Andric defvar VLEN = 128; 41*0fca6ea1SDimitry Andric defvar VLUpperBound = !cond( 42*0fca6ea1SDimitry Andric !eq(mx, "M1") : !div(VLEN, sew), 43*0fca6ea1SDimitry Andric !eq(mx, "M2") : !div(!mul(VLEN, 2), sew), 44*0fca6ea1SDimitry Andric !eq(mx, "M4") : !div(!mul(VLEN, 4), sew), 45*0fca6ea1SDimitry Andric !eq(mx, "M8") : !div(!mul(VLEN, 8), sew), 46*0fca6ea1SDimitry Andric !eq(mx, "MF2") : !div(!div(VLEN, 2), sew), 47*0fca6ea1SDimitry Andric !eq(mx, "MF4") : !div(!div(VLEN, 4), sew), 48*0fca6ea1SDimitry Andric !eq(mx, "MF8") : !div(!div(VLEN, 8), sew), 49*0fca6ea1SDimitry Andric ); 50*0fca6ea1SDimitry Andric int c = !mul(VLUpperBound, nf); 51*0fca6ea1SDimitry Andric} 52*0fca6ea1SDimitry Andric 53*0fca6ea1SDimitry Andric// SiFiveP600 machine model for scheduling and other instruction cost heuristics. 54*0fca6ea1SDimitry Andricdef SiFiveP600Model : SchedMachineModel { 55*0fca6ea1SDimitry Andric let IssueWidth = 4; // 4 micro-ops are dispatched per cycle. 56*0fca6ea1SDimitry Andric let MicroOpBufferSize = 160; // Max micro-ops that can be buffered. 57*0fca6ea1SDimitry Andric let LoadLatency = 4; // Cycles for loads to access the cache. 58*0fca6ea1SDimitry Andric let MispredictPenalty = 9; // Extra cycles for a mispredicted branch. 59*0fca6ea1SDimitry Andric let UnsupportedFeatures = [HasStdExtZbkb, HasStdExtZbkc, HasStdExtZbkx, 60*0fca6ea1SDimitry Andric HasStdExtZknd, HasStdExtZkne, HasStdExtZknh, 61*0fca6ea1SDimitry Andric HasStdExtZksed, HasStdExtZksh, HasStdExtZkr, 62*0fca6ea1SDimitry Andric HasVendorXSfvqmaccqoq]; 63*0fca6ea1SDimitry Andric let CompleteModel = false; 64*0fca6ea1SDimitry Andric} 65*0fca6ea1SDimitry Andric 66*0fca6ea1SDimitry Andriclet SchedModel = SiFiveP600Model in { 67*0fca6ea1SDimitry Andric 68*0fca6ea1SDimitry Andricdef SiFiveP600IEXQ0 : ProcResource<1>; 69*0fca6ea1SDimitry Andricdef SiFiveP600IEXQ1 : ProcResource<1>; 70*0fca6ea1SDimitry Andricdef SiFiveP600IEXQ2 : ProcResource<1>; 71*0fca6ea1SDimitry Andricdef SiFiveP600IEXQ3 : ProcResource<1>; 72*0fca6ea1SDimitry Andricdef SiFiveP600FEXQ0 : ProcResource<1>; 73*0fca6ea1SDimitry Andricdef SiFiveP600FEXQ1 : ProcResource<1>; 74*0fca6ea1SDimitry Andric 75*0fca6ea1SDimitry Andric// Two Load/Store ports that can issue either two loads, two stores, or one load 76*0fca6ea1SDimitry Andric// and one store (P550 has one load and one separate store pipe). 77*0fca6ea1SDimitry Andricdef SiFiveP600LDST : ProcResource<2>; 78*0fca6ea1SDimitry Andric 79*0fca6ea1SDimitry Andric// 4-wide pipeline with 4 ALU pipes. 80*0fca6ea1SDimitry Andricdef SiFiveP600IntArith : ProcResGroup<[SiFiveP600IEXQ0, SiFiveP600IEXQ1, SiFiveP600IEXQ2, SiFiveP600IEXQ3]>; 81*0fca6ea1SDimitry Andricdefvar SiFiveP600SYS = SiFiveP600IEXQ0; 82*0fca6ea1SDimitry Andricdefvar SiFiveP600CMOV = SiFiveP600IEXQ0; 83*0fca6ea1SDimitry Andricdefvar SiFiveP600MulI2F = SiFiveP600IEXQ1; 84*0fca6ea1SDimitry Andricdef SiFiveP600Branch : ProcResGroup<[SiFiveP600IEXQ2, SiFiveP600IEXQ3]>; 85*0fca6ea1SDimitry Andricdef SiFiveP600Div : ProcResource<1>; 86*0fca6ea1SDimitry Andric 87*0fca6ea1SDimitry Andricdef SiFiveP600FloatArith : ProcResGroup<[SiFiveP600FEXQ0, SiFiveP600FEXQ1]>; 88*0fca6ea1SDimitry Andricdefvar SiFiveP600F2I = SiFiveP600FEXQ0; 89*0fca6ea1SDimitry Andricdef SiFiveP600FloatDiv : ProcResource<1>; 90*0fca6ea1SDimitry Andric 91*0fca6ea1SDimitry Andric// Vector pipeline 92*0fca6ea1SDimitry Andric// VEXQ0 handle Mask, Simple Slide instructions, 93*0fca6ea1SDimitry Andric// VEXQ1 handle Complex Slide, Permutation, Reductions, Divide instructions. 94*0fca6ea1SDimitry Andric// Other vector instructions can be done in VEXQ0 and VEXQ1. 95*0fca6ea1SDimitry Andricdef SiFiveP600VEXQ0 : ProcResource<1>; 96*0fca6ea1SDimitry Andricdef SiFiveP600VEXQ1 : ProcResource<1>; 97*0fca6ea1SDimitry Andricdef SiFiveP600VectorArith : ProcResGroup<[SiFiveP600VEXQ0, SiFiveP600VEXQ1]>; 98*0fca6ea1SDimitry Andricdef SiFiveP600VLD : ProcResource<1>; 99*0fca6ea1SDimitry Andricdef SiFiveP600VST : ProcResource<1>; 100*0fca6ea1SDimitry Andricdef SiFiveP600VDiv : ProcResource<1>; 101*0fca6ea1SDimitry Andricdef SiFiveP600VFloatDiv : ProcResource<1>; 102*0fca6ea1SDimitry Andric 103*0fca6ea1SDimitry Andric// Integer arithmetic and logic 104*0fca6ea1SDimitry Andricdef : WriteRes<WriteIALU, [SiFiveP600IntArith]>; 105*0fca6ea1SDimitry Andricdef : WriteRes<WriteIALU32, [SiFiveP600IntArith]>; 106*0fca6ea1SDimitry Andricdef : WriteRes<WriteShiftImm, [SiFiveP600IntArith]>; 107*0fca6ea1SDimitry Andricdef : WriteRes<WriteShiftImm32, [SiFiveP600IntArith]>; 108*0fca6ea1SDimitry Andricdef : WriteRes<WriteShiftReg, [SiFiveP600IntArith]>; 109*0fca6ea1SDimitry Andricdef : WriteRes<WriteShiftReg32, [SiFiveP600IntArith]>; 110*0fca6ea1SDimitry Andric// Branching 111*0fca6ea1SDimitry Andricdef : WriteRes<WriteJmp, [SiFiveP600Branch]>; 112*0fca6ea1SDimitry Andricdef : WriteRes<WriteJal, [SiFiveP600Branch]>; 113*0fca6ea1SDimitry Andricdef : WriteRes<WriteJalr, [SiFiveP600Branch]>; 114*0fca6ea1SDimitry Andric 115*0fca6ea1SDimitry Andric// CMOV 116*0fca6ea1SDimitry Andricdef P600WriteCMOV : SchedWriteRes<[SiFiveP600Branch, SiFiveP600CMOV]> { 117*0fca6ea1SDimitry Andric let Latency = 2; 118*0fca6ea1SDimitry Andric let NumMicroOps = 2; 119*0fca6ea1SDimitry Andric} 120*0fca6ea1SDimitry Andricdef : InstRW<[P600WriteCMOV], (instrs PseudoCCMOVGPRNoX0)>; 121*0fca6ea1SDimitry Andric 122*0fca6ea1SDimitry Andriclet Latency = 3 in { 123*0fca6ea1SDimitry Andric// Integer multiplication 124*0fca6ea1SDimitry Andricdef : WriteRes<WriteIMul, [SiFiveP600MulI2F]>; 125*0fca6ea1SDimitry Andricdef : WriteRes<WriteIMul32, [SiFiveP600MulI2F]>; 126*0fca6ea1SDimitry Andric// cpop[w] look exactly like multiply. 127*0fca6ea1SDimitry Andricdef : WriteRes<WriteCPOP, [SiFiveP600MulI2F]>; 128*0fca6ea1SDimitry Andricdef : WriteRes<WriteCPOP32, [SiFiveP600MulI2F]>; 129*0fca6ea1SDimitry Andric} 130*0fca6ea1SDimitry Andric 131*0fca6ea1SDimitry Andric// Integer division 132*0fca6ea1SDimitry Andricdef : WriteRes<WriteIDiv, [SiFiveP600MulI2F, SiFiveP600Div]> { 133*0fca6ea1SDimitry Andric let Latency = 35; 134*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 34]; 135*0fca6ea1SDimitry Andric} 136*0fca6ea1SDimitry Andricdef : WriteRes<WriteIDiv32, [SiFiveP600MulI2F, SiFiveP600Div]> { 137*0fca6ea1SDimitry Andric let Latency = 20; 138*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 19]; 139*0fca6ea1SDimitry Andric} 140*0fca6ea1SDimitry Andric 141*0fca6ea1SDimitry Andric// Integer remainder 142*0fca6ea1SDimitry Andricdef : WriteRes<WriteIRem, [SiFiveP600MulI2F, SiFiveP600Div]> { 143*0fca6ea1SDimitry Andric let Latency = 35; 144*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 34]; 145*0fca6ea1SDimitry Andric} 146*0fca6ea1SDimitry Andricdef : WriteRes<WriteIRem32, [SiFiveP600MulI2F, SiFiveP600Div]> { 147*0fca6ea1SDimitry Andric let Latency = 20; 148*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 19]; 149*0fca6ea1SDimitry Andric} 150*0fca6ea1SDimitry Andric 151*0fca6ea1SDimitry Andric// Bitmanip 152*0fca6ea1SDimitry Andricdef : WriteRes<WriteRotateImm, [SiFiveP600IntArith]>; 153*0fca6ea1SDimitry Andricdef : WriteRes<WriteRotateImm32, [SiFiveP600IntArith]>; 154*0fca6ea1SDimitry Andricdef : WriteRes<WriteRotateReg, [SiFiveP600IntArith]>; 155*0fca6ea1SDimitry Andricdef : WriteRes<WriteRotateReg32, [SiFiveP600IntArith]>; 156*0fca6ea1SDimitry Andric 157*0fca6ea1SDimitry Andricdef : WriteRes<WriteCLZ, [SiFiveP600IntArith]>; 158*0fca6ea1SDimitry Andricdef : WriteRes<WriteCLZ32, [SiFiveP600IntArith]>; 159*0fca6ea1SDimitry Andricdef : WriteRes<WriteCTZ, [SiFiveP600IntArith]>; 160*0fca6ea1SDimitry Andricdef : WriteRes<WriteCTZ32, [SiFiveP600IntArith]>; 161*0fca6ea1SDimitry Andric 162*0fca6ea1SDimitry Andricdef : WriteRes<WriteORCB, [SiFiveP600IntArith]>; 163*0fca6ea1SDimitry Andricdef : WriteRes<WriteIMinMax, [SiFiveP600IntArith]>; 164*0fca6ea1SDimitry Andric 165*0fca6ea1SDimitry Andricdef : WriteRes<WriteREV8, [SiFiveP600IntArith]>; 166*0fca6ea1SDimitry Andric 167*0fca6ea1SDimitry Andricdef : WriteRes<WriteSHXADD, [SiFiveP600IntArith]>; 168*0fca6ea1SDimitry Andricdef : WriteRes<WriteSHXADD32, [SiFiveP600IntArith]>; 169*0fca6ea1SDimitry Andric 170*0fca6ea1SDimitry Andricdef : WriteRes<WriteSingleBit, [SiFiveP600IntArith]>; 171*0fca6ea1SDimitry Andricdef : WriteRes<WriteSingleBitImm, [SiFiveP600IntArith]>; 172*0fca6ea1SDimitry Andricdef : WriteRes<WriteBEXT, [SiFiveP600IntArith]>; 173*0fca6ea1SDimitry Andricdef : WriteRes<WriteBEXTI, [SiFiveP600IntArith]>; 174*0fca6ea1SDimitry Andric 175*0fca6ea1SDimitry Andric// Memory 176*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTB, [SiFiveP600LDST]>; 177*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTH, [SiFiveP600LDST]>; 178*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTW, [SiFiveP600LDST]>; 179*0fca6ea1SDimitry Andricdef : WriteRes<WriteSTD, [SiFiveP600LDST]>; 180*0fca6ea1SDimitry Andricdef : WriteRes<WriteFST16, [SiFiveP600LDST]>; 181*0fca6ea1SDimitry Andricdef : WriteRes<WriteFST32, [SiFiveP600LDST]>; 182*0fca6ea1SDimitry Andricdef : WriteRes<WriteFST64, [SiFiveP600LDST]>; 183*0fca6ea1SDimitry Andric 184*0fca6ea1SDimitry Andriclet Latency = 4 in { 185*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDB, [SiFiveP600LDST]>; 186*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDH, [SiFiveP600LDST]>; 187*0fca6ea1SDimitry Andric} 188*0fca6ea1SDimitry Andriclet Latency = 4 in { 189*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDW, [SiFiveP600LDST]>; 190*0fca6ea1SDimitry Andricdef : WriteRes<WriteLDD, [SiFiveP600LDST]>; 191*0fca6ea1SDimitry Andric} 192*0fca6ea1SDimitry Andric 193*0fca6ea1SDimitry Andriclet Latency = 5 in { 194*0fca6ea1SDimitry Andricdef : WriteRes<WriteFLD16, [SiFiveP600LDST]>; 195*0fca6ea1SDimitry Andricdef : WriteRes<WriteFLD32, [SiFiveP600LDST]>; 196*0fca6ea1SDimitry Andricdef : WriteRes<WriteFLD64, [SiFiveP600LDST]>; 197*0fca6ea1SDimitry Andric} 198*0fca6ea1SDimitry Andric 199*0fca6ea1SDimitry Andric// Atomic memory 200*0fca6ea1SDimitry Andriclet Latency = 3 in { 201*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicSTW, [SiFiveP600LDST]>; 202*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicSTD, [SiFiveP600LDST]>; 203*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicW, [SiFiveP600LDST]>; 204*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicD, [SiFiveP600LDST]>; 205*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicLDW, [SiFiveP600LDST]>; 206*0fca6ea1SDimitry Andricdef : WriteRes<WriteAtomicLDD, [SiFiveP600LDST]>; 207*0fca6ea1SDimitry Andric} 208*0fca6ea1SDimitry Andric 209*0fca6ea1SDimitry Andric// Floating point 210*0fca6ea1SDimitry Andriclet Latency = 2 in { 211*0fca6ea1SDimitry Andricdef : WriteRes<WriteFAdd16, [SiFiveP600FloatArith]>; 212*0fca6ea1SDimitry Andricdef : WriteRes<WriteFAdd32, [SiFiveP600FloatArith]>; 213*0fca6ea1SDimitry Andricdef : WriteRes<WriteFAdd64, [SiFiveP600FloatArith]>; 214*0fca6ea1SDimitry Andric} 215*0fca6ea1SDimitry Andriclet Latency = 3 in { 216*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMul16, [SiFiveP600FloatArith]>; 217*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMul32, [SiFiveP600FloatArith]>; 218*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMul64, [SiFiveP600FloatArith]>; 219*0fca6ea1SDimitry Andric} 220*0fca6ea1SDimitry Andriclet Latency = 4 in { 221*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMA16, [SiFiveP600FloatArith]>; 222*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMA32, [SiFiveP600FloatArith]>; 223*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMA64, [SiFiveP600FloatArith]>; 224*0fca6ea1SDimitry Andric} 225*0fca6ea1SDimitry Andric 226*0fca6ea1SDimitry Andriclet Latency = 2 in { 227*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSGNJ16, [SiFiveP600FloatArith]>; 228*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSGNJ32, [SiFiveP600FloatArith]>; 229*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSGNJ64, [SiFiveP600FloatArith]>; 230*0fca6ea1SDimitry Andric 231*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMinMax16, [SiFiveP600FloatArith]>; 232*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMinMax32, [SiFiveP600FloatArith]>; 233*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMinMax64, [SiFiveP600FloatArith]>; 234*0fca6ea1SDimitry Andric} 235*0fca6ea1SDimitry Andric 236*0fca6ea1SDimitry Andric// Half precision. 237*0fca6ea1SDimitry Andricdef : WriteRes<WriteFDiv16, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> { 238*0fca6ea1SDimitry Andric let Latency = 4; 239*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 4]; 240*0fca6ea1SDimitry Andric} 241*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSqrt16, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> { 242*0fca6ea1SDimitry Andric let Latency = 18; 243*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 17]; 244*0fca6ea1SDimitry Andric} 245*0fca6ea1SDimitry Andric 246*0fca6ea1SDimitry Andric// Single precision. 247*0fca6ea1SDimitry Andricdef : WriteRes<WriteFDiv32, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> { 248*0fca6ea1SDimitry Andric let Latency = 6; 249*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 6]; 250*0fca6ea1SDimitry Andric} 251*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSqrt32, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> { 252*0fca6ea1SDimitry Andric let Latency = 18; 253*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 17]; 254*0fca6ea1SDimitry Andric} 255*0fca6ea1SDimitry Andric 256*0fca6ea1SDimitry Andric// Double precision 257*0fca6ea1SDimitry Andricdef : WriteRes<WriteFDiv64, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> { 258*0fca6ea1SDimitry Andric let Latency = 11; 259*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 11]; 260*0fca6ea1SDimitry Andric} 261*0fca6ea1SDimitry Andricdef : WriteRes<WriteFSqrt64, [SiFiveP600FEXQ1, SiFiveP600FloatDiv]> { 262*0fca6ea1SDimitry Andric let Latency = 33; 263*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 32]; 264*0fca6ea1SDimitry Andric} 265*0fca6ea1SDimitry Andric 266*0fca6ea1SDimitry Andric// Conversions 267*0fca6ea1SDimitry Andriclet Latency = 2 in { 268*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI32ToF16, [SiFiveP600MulI2F]>; 269*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI32ToF32, [SiFiveP600MulI2F]>; 270*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI32ToF64, [SiFiveP600MulI2F]>; 271*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI64ToF16, [SiFiveP600MulI2F]>; 272*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI64ToF32, [SiFiveP600MulI2F]>; 273*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtI64ToF64, [SiFiveP600MulI2F]>; 274*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF16ToI32, [SiFiveP600F2I]>; 275*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF16ToI64, [SiFiveP600F2I]>; 276*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF16ToF32, [SiFiveP600FloatArith]>; 277*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF16ToF64, [SiFiveP600FloatArith]>; 278*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF32ToI32, [SiFiveP600F2I]>; 279*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF32ToI64, [SiFiveP600F2I]>; 280*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF32ToF16, [SiFiveP600FloatArith]>; 281*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF32ToF64, [SiFiveP600FloatArith]>; 282*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF64ToI32, [SiFiveP600F2I]>; 283*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF64ToI64, [SiFiveP600F2I]>; 284*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF64ToF16, [SiFiveP600FloatArith]>; 285*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCvtF64ToF32, [SiFiveP600FloatArith]>; 286*0fca6ea1SDimitry Andric 287*0fca6ea1SDimitry Andricdef : WriteRes<WriteFClass16, [SiFiveP600F2I]>; 288*0fca6ea1SDimitry Andricdef : WriteRes<WriteFClass32, [SiFiveP600F2I]>; 289*0fca6ea1SDimitry Andricdef : WriteRes<WriteFClass64, [SiFiveP600F2I]>; 290*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCmp16, [SiFiveP600F2I]>; 291*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCmp32, [SiFiveP600F2I]>; 292*0fca6ea1SDimitry Andricdef : WriteRes<WriteFCmp64, [SiFiveP600F2I]>; 293*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovI16ToF16, [SiFiveP600MulI2F]>; 294*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovF16ToI16, [SiFiveP600F2I]>; 295*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovI32ToF32, [SiFiveP600MulI2F]>; 296*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovF32ToI32, [SiFiveP600F2I]>; 297*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovI64ToF64, [SiFiveP600MulI2F]>; 298*0fca6ea1SDimitry Andricdef : WriteRes<WriteFMovF64ToI64, [SiFiveP600F2I]>; 299*0fca6ea1SDimitry Andric} 300*0fca6ea1SDimitry Andric 301*0fca6ea1SDimitry Andric// 6. Configuration-Setting Instructions 302*0fca6ea1SDimitry Andricdef : WriteRes<WriteVSETVLI, [SiFiveP600SYS]>; 303*0fca6ea1SDimitry Andricdef : WriteRes<WriteVSETIVLI, [SiFiveP600SYS]>; 304*0fca6ea1SDimitry Andricdef : WriteRes<WriteVSETVL, [SiFiveP600SYS]>; 305*0fca6ea1SDimitry Andric 306*0fca6ea1SDimitry Andric// 7. Vector Loads and Stores 307*0fca6ea1SDimitry Andric// FIXME: This unit is still being improved, currently 308*0fca6ea1SDimitry Andric// it is based on stage numbers. Estimates are optimistic, 309*0fca6ea1SDimitry Andric// latency may be longer. 310*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 311*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 312*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 313*0fca6ea1SDimitry Andric let Latency = 8, ReleaseAtCycles = [LMulLat] in { 314*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDE", [SiFiveP600VLD], mx, IsWorstCase>; 315*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDM", [SiFiveP600VLD], mx, IsWorstCase>; 316*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDFF", [SiFiveP600VLD], mx, IsWorstCase>; 317*0fca6ea1SDimitry Andric } 318*0fca6ea1SDimitry Andric let Latency = 12, ReleaseAtCycles = [LMulLat] in { 319*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDS8", [SiFiveP600VLD], mx, IsWorstCase>; 320*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDS16", [SiFiveP600VLD], mx, IsWorstCase>; 321*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDS32", [SiFiveP600VLD], mx, IsWorstCase>; 322*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDS64", [SiFiveP600VLD], mx, IsWorstCase>; 323*0fca6ea1SDimitry Andric } 324*0fca6ea1SDimitry Andric let Latency = 12, ReleaseAtCycles = [LMulLat] in { 325*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDUX8", [SiFiveP600VLD], mx, IsWorstCase>; 326*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDUX16", [SiFiveP600VLD], mx, IsWorstCase>; 327*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDUX32", [SiFiveP600VLD], mx, IsWorstCase>; 328*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDUX64", [SiFiveP600VLD], mx, IsWorstCase>; 329*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDOX8", [SiFiveP600VLD], mx, IsWorstCase>; 330*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDOX16", [SiFiveP600VLD], mx, IsWorstCase>; 331*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDOX32", [SiFiveP600VLD], mx, IsWorstCase>; 332*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLDOX64", [SiFiveP600VLD], mx, IsWorstCase>; 333*0fca6ea1SDimitry Andric } 334*0fca6ea1SDimitry Andric} 335*0fca6ea1SDimitry Andric 336*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 337*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 338*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 339*0fca6ea1SDimitry Andric let Latency = 8, ReleaseAtCycles = [LMulLat] in { 340*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTE", [SiFiveP600VST], mx, IsWorstCase>; 341*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTM", [SiFiveP600VST], mx, IsWorstCase>; 342*0fca6ea1SDimitry Andric } 343*0fca6ea1SDimitry Andric let Latency = 12, ReleaseAtCycles = [LMulLat] in { 344*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTS8", [SiFiveP600VST], mx, IsWorstCase>; 345*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTS16", [SiFiveP600VST], mx, IsWorstCase>; 346*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTS32", [SiFiveP600VST], mx, IsWorstCase>; 347*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTS64", [SiFiveP600VST], mx, IsWorstCase>; 348*0fca6ea1SDimitry Andric } 349*0fca6ea1SDimitry Andric let Latency = 12, ReleaseAtCycles = [LMulLat] in { 350*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTUX8", [SiFiveP600VST], mx, IsWorstCase>; 351*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTUX16", [SiFiveP600VST], mx, IsWorstCase>; 352*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTUX32", [SiFiveP600VST], mx, IsWorstCase>; 353*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTUX64", [SiFiveP600VST], mx, IsWorstCase>; 354*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTOX8", [SiFiveP600VST], mx, IsWorstCase>; 355*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTOX16", [SiFiveP600VST], mx, IsWorstCase>; 356*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTOX32", [SiFiveP600VST], mx, IsWorstCase>; 357*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSTOX64", [SiFiveP600VST], mx, IsWorstCase>; 358*0fca6ea1SDimitry Andric } 359*0fca6ea1SDimitry Andric} 360*0fca6ea1SDimitry Andric 361*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 362*0fca6ea1SDimitry Andric foreach nf=2-8 in { 363*0fca6ea1SDimitry Andric foreach eew = [8, 16, 32, 64] in { 364*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetCyclesSegmented<mx, eew, nf>.c; 365*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 366*0fca6ea1SDimitry Andric let Latency = !add(12, LMulLat), ReleaseAtCycles = [!add(12, LMulLat)] in { 367*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLSEG" # nf # "e" # eew, [SiFiveP600VLD], mx, IsWorstCase>; 368*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLSEGFF" # nf # "e" # eew, [SiFiveP600VLD], mx, IsWorstCase>; 369*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLSSEG" # nf # "e" # eew, [SiFiveP600VLD], mx, IsWorstCase>; 370*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLUXSEG" # nf # "e" # eew, [SiFiveP600VLD], mx, IsWorstCase>; 371*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVLOXSEG" # nf # "e" # eew, [SiFiveP600VLD], mx, IsWorstCase>; 372*0fca6ea1SDimitry Andric } 373*0fca6ea1SDimitry Andric let Latency = !add(1, LMulLat), ReleaseAtCycles = [!add(12, LMulLat)] in { 374*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSSEG" # nf # "e" # eew, [SiFiveP600VST], mx, IsWorstCase>; 375*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSSSEG" # nf # "e" # eew, [SiFiveP600VST], mx, IsWorstCase>; 376*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSUXSEG" # nf # "e" # eew, [SiFiveP600VST], mx, IsWorstCase>; 377*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSOXSEG" # nf # "e" # eew, [SiFiveP600VST], mx, IsWorstCase>; 378*0fca6ea1SDimitry Andric } 379*0fca6ea1SDimitry Andric } 380*0fca6ea1SDimitry Andric } 381*0fca6ea1SDimitry Andric} 382*0fca6ea1SDimitry Andric 383*0fca6ea1SDimitry Andric// Whole register move/load/store 384*0fca6ea1SDimitry Andricforeach LMul = [1, 2, 4, 8] in { 385*0fca6ea1SDimitry Andric let Latency = 8, ReleaseAtCycles = [LMul] in { 386*0fca6ea1SDimitry Andric def : WriteRes<!cast<SchedWrite>("WriteVLD" # LMul # "R"), [SiFiveP600VLD]>; 387*0fca6ea1SDimitry Andric def : WriteRes<!cast<SchedWrite>("WriteVST" # LMul # "R"), [SiFiveP600VST]>; 388*0fca6ea1SDimitry Andric } 389*0fca6ea1SDimitry Andric let Latency = LMul, ReleaseAtCycles = [LMul] in { 390*0fca6ea1SDimitry Andric def : WriteRes<!cast<SchedWrite>("WriteVMov" # LMul # "V"), [SiFiveP600VectorArith]>; 391*0fca6ea1SDimitry Andric } 392*0fca6ea1SDimitry Andric} 393*0fca6ea1SDimitry Andric 394*0fca6ea1SDimitry Andric// 11. Vector Integer Arithmetic Instructions 395*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 396*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 397*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 398*0fca6ea1SDimitry Andric let Latency = 1, ReleaseAtCycles = [LMulLat] in { 399*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIALUV", [SiFiveP600VectorArith], mx, IsWorstCase>; 400*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIALUX", [SiFiveP600VectorArith], mx, IsWorstCase>; 401*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIALUI", [SiFiveP600VectorArith], mx, IsWorstCase>; 402*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVExtV", [SiFiveP600VectorArith], mx, IsWorstCase>; 403*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVICALUV", [SiFiveP600VectorArith], mx, IsWorstCase>; 404*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVICALUX", [SiFiveP600VectorArith], mx, IsWorstCase>; 405*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVICALUI", [SiFiveP600VectorArith], mx, IsWorstCase>; 406*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVICmpV", [SiFiveP600VectorArith], mx, IsWorstCase>; 407*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVICmpX", [SiFiveP600VectorArith], mx, IsWorstCase>; 408*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVICmpI", [SiFiveP600VectorArith], mx, IsWorstCase>; 409*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMergeV", [SiFiveP600VectorArith], mx, IsWorstCase>; 410*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMergeX", [SiFiveP600VectorArith], mx, IsWorstCase>; 411*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMergeI", [SiFiveP600VectorArith], mx, IsWorstCase>; 412*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMovV", [SiFiveP600VectorArith], mx, IsWorstCase>; 413*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMovX", [SiFiveP600VectorArith], mx, IsWorstCase>; 414*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMovI", [SiFiveP600VectorArith], mx, IsWorstCase>; 415*0fca6ea1SDimitry Andric } 416*0fca6ea1SDimitry Andric let Latency = 6, ReleaseAtCycles = [LMulLat] in { 417*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVShiftV", [SiFiveP600VectorArith], mx, IsWorstCase>; 418*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVShiftX", [SiFiveP600VectorArith], mx, IsWorstCase>; 419*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVShiftI", [SiFiveP600VectorArith], mx, IsWorstCase>; 420*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMinMaxV", [SiFiveP600VectorArith], mx, IsWorstCase>; 421*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMinMaxX", [SiFiveP600VectorArith], mx, IsWorstCase>; 422*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMulV", [SiFiveP600VectorArith], mx, IsWorstCase>; 423*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMulX", [SiFiveP600VectorArith], mx, IsWorstCase>; 424*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMulAddV", [SiFiveP600VectorArith], mx, IsWorstCase>; 425*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIMulAddX", [SiFiveP600VectorArith], mx, IsWorstCase>; 426*0fca6ea1SDimitry Andric } 427*0fca6ea1SDimitry Andric} 428*0fca6ea1SDimitry Andric// Widening 429*0fca6ea1SDimitry Andricforeach mx = SchedMxListW in { 430*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 431*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxListW>.c; 432*0fca6ea1SDimitry Andric let Latency = 6, ReleaseAtCycles = [LMulLat] in { 433*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIWALUV", [SiFiveP600VectorArith], mx, IsWorstCase>; 434*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIWALUX", [SiFiveP600VectorArith], mx, IsWorstCase>; 435*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIWALUI", [SiFiveP600VectorArith], mx, IsWorstCase>; 436*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIWMulV", [SiFiveP600VectorArith], mx, IsWorstCase>; 437*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIWMulX", [SiFiveP600VectorArith], mx, IsWorstCase>; 438*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIWMulAddV", [SiFiveP600VectorArith], mx, IsWorstCase>; 439*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIWMulAddX", [SiFiveP600VectorArith], mx, IsWorstCase>; 440*0fca6ea1SDimitry Andric } 441*0fca6ea1SDimitry Andric} 442*0fca6ea1SDimitry Andric 443*0fca6ea1SDimitry Andric// Worst case needs 64 cycles if SEW is equal to 64. 444*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 445*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx>.val in { 446*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 447*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxList>.c; 448*0fca6ea1SDimitry Andric let Latency = 64, ReleaseAtCycles = [LMulLat, !mul(63, LMulLat)] in { 449*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVIDivV", [SiFiveP600VEXQ1, SiFiveP600VDiv], mx, sew, IsWorstCase>; 450*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVIDivX", [SiFiveP600VEXQ1, SiFiveP600VDiv], mx, sew, IsWorstCase>; 451*0fca6ea1SDimitry Andric } 452*0fca6ea1SDimitry Andric } 453*0fca6ea1SDimitry Andric} 454*0fca6ea1SDimitry Andric 455*0fca6ea1SDimitry Andric// Narrowing Shift and Clips 456*0fca6ea1SDimitry Andricforeach mx = SchedMxListW in { 457*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 458*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxListW>.c; 459*0fca6ea1SDimitry Andric let Latency = 2, ReleaseAtCycles = [LMulLat] in { 460*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVNShiftV", [SiFiveP600VectorArith], mx, IsWorstCase>; 461*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVNShiftX", [SiFiveP600VectorArith], mx, IsWorstCase>; 462*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVNShiftI", [SiFiveP600VectorArith], mx, IsWorstCase>; 463*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVNClipV", [SiFiveP600VectorArith], mx, IsWorstCase>; 464*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVNClipX", [SiFiveP600VectorArith], mx, IsWorstCase>; 465*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVNClipI", [SiFiveP600VectorArith], mx, IsWorstCase>; 466*0fca6ea1SDimitry Andric } 467*0fca6ea1SDimitry Andric} 468*0fca6ea1SDimitry Andric 469*0fca6ea1SDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions 470*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 471*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 472*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 473*0fca6ea1SDimitry Andric let Latency = 6, ReleaseAtCycles = [LMulLat] in { 474*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSALUV", [SiFiveP600VectorArith], mx, IsWorstCase>; 475*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSALUX", [SiFiveP600VectorArith], mx, IsWorstCase>; 476*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSALUI", [SiFiveP600VectorArith], mx, IsWorstCase>; 477*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVAALUV", [SiFiveP600VectorArith], mx, IsWorstCase>; 478*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVAALUX", [SiFiveP600VectorArith], mx, IsWorstCase>; 479*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSMulV", [SiFiveP600VectorArith], mx, IsWorstCase>; 480*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSMulX", [SiFiveP600VectorArith], mx, IsWorstCase>; 481*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSShiftV", [SiFiveP600VectorArith], mx, IsWorstCase>; 482*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSShiftX", [SiFiveP600VectorArith], mx, IsWorstCase>; 483*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSShiftI", [SiFiveP600VectorArith], mx, IsWorstCase>; 484*0fca6ea1SDimitry Andric } 485*0fca6ea1SDimitry Andric} 486*0fca6ea1SDimitry Andric 487*0fca6ea1SDimitry Andric// 13. Vector Floating-Point Instructions 488*0fca6ea1SDimitry Andricforeach mx = SchedMxListF in { 489*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, isF=1>.val in { 490*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 491*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListF, isF=1>.c; 492*0fca6ea1SDimitry Andric let Latency = 6, ReleaseAtCycles = [LMulLat] in { 493*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFALUV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 494*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFALUF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 495*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMulV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 496*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMulF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 497*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMulAddV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 498*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMulAddF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 499*0fca6ea1SDimitry Andric } 500*0fca6ea1SDimitry Andric let Latency = 2, ReleaseAtCycles = [LMulLat] in 501*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFRecpV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 502*0fca6ea1SDimitry Andric let Latency = 3, ReleaseAtCycles = [LMulLat] in 503*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFCvtIToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 504*0fca6ea1SDimitry Andric } 505*0fca6ea1SDimitry Andric} 506*0fca6ea1SDimitry Andricforeach mx = SchedMxListF in { 507*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, isF=1>.val in { 508*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 509*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxList, isF=1>.c; 510*0fca6ea1SDimitry Andric let Latency = 1, ReleaseAtCycles = [LMulLat] in { 511*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMinMaxV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 512*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMinMaxF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 513*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFSgnjV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 514*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFSgnjF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 515*0fca6ea1SDimitry Andric } 516*0fca6ea1SDimitry Andric } 517*0fca6ea1SDimitry Andric} 518*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 519*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 520*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 521*0fca6ea1SDimitry Andric let Latency = 3, ReleaseAtCycles = [LMulLat] in 522*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVFCvtFToIV", [SiFiveP600VectorArith], mx, IsWorstCase>; 523*0fca6ea1SDimitry Andric let Latency = 2, ReleaseAtCycles = [LMulLat] in { 524*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVFCmpV", [SiFiveP600VectorArith], mx, IsWorstCase>; 525*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVFCmpF", [SiFiveP600VectorArith], mx, IsWorstCase>; 526*0fca6ea1SDimitry Andric } 527*0fca6ea1SDimitry Andric let Latency = 1, ReleaseAtCycles = [LMulLat] in { 528*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVFClassV", [SiFiveP600VectorArith], mx, IsWorstCase>; 529*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVFMergeV", [SiFiveP600VectorArith], mx, IsWorstCase>; 530*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVFMovV", [SiFiveP600VectorArith], mx, IsWorstCase>; 531*0fca6ea1SDimitry Andric } 532*0fca6ea1SDimitry Andric} 533*0fca6ea1SDimitry Andric 534*0fca6ea1SDimitry Andric// Widening 535*0fca6ea1SDimitry Andricforeach mx = SchedMxListW in { 536*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, isF=0, isWidening=1>.val in { 537*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 538*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListW>.c; 539*0fca6ea1SDimitry Andric let Latency = 3, ReleaseAtCycles = [LMulLat] in 540*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtIToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 541*0fca6ea1SDimitry Andric } 542*0fca6ea1SDimitry Andric} 543*0fca6ea1SDimitry Andricforeach mx = SchedMxListFW in { 544*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 545*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxListFW>.c; 546*0fca6ea1SDimitry Andric let Latency = 6, ReleaseAtCycles = [LMulLat] in 547*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVFWCvtFToIV", [SiFiveP600VectorArith], mx, IsWorstCase>; 548*0fca6ea1SDimitry Andric} 549*0fca6ea1SDimitry Andricforeach mx = SchedMxListFW in { 550*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, isF=1, isWidening=1>.val in { 551*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 552*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListFW, isF=1>.c; 553*0fca6ea1SDimitry Andric let Latency = 6, ReleaseAtCycles = [LMulLat] in { 554*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWALUV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 555*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWALUF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 556*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 557*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 558*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulAddV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 559*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulAddF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 560*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtFToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 561*0fca6ea1SDimitry Andric } 562*0fca6ea1SDimitry Andric } 563*0fca6ea1SDimitry Andric} 564*0fca6ea1SDimitry Andric// Narrowing 565*0fca6ea1SDimitry Andricforeach mx = SchedMxListW in { 566*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 567*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxListW>.c; 568*0fca6ea1SDimitry Andric let Latency = 3, ReleaseAtCycles = [LMulLat] in { 569*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVFNCvtFToIV", [SiFiveP600VectorArith], mx, IsWorstCase>; 570*0fca6ea1SDimitry Andric } 571*0fca6ea1SDimitry Andric} 572*0fca6ea1SDimitry Andricforeach mx = SchedMxListFW in { 573*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, isF=1, isWidening=1>.val in { 574*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 575*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListFW, isF=1>.c; 576*0fca6ea1SDimitry Andric let Latency = 3, ReleaseAtCycles = [LMulLat] in { 577*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFNCvtIToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 578*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFNCvtFToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>; 579*0fca6ea1SDimitry Andric } 580*0fca6ea1SDimitry Andric } 581*0fca6ea1SDimitry Andric} 582*0fca6ea1SDimitry Andric 583*0fca6ea1SDimitry Andric// Worst case needs 76 cycles if SEW is equal to 64. 584*0fca6ea1SDimitry Andricforeach mx = SchedMxListF in { 585*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, 1>.val in { 586*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 587*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListF, 1>.c; 588*0fca6ea1SDimitry Andric let Latency = 76, ReleaseAtCycles = [LMulLat, !mul(76, LMulLat)] in { 589*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFDivV", [SiFiveP600VEXQ1, SiFiveP600VFloatDiv], mx, sew, IsWorstCase>; 590*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFDivF", [SiFiveP600VEXQ1, SiFiveP600VFloatDiv], mx, sew, IsWorstCase>; 591*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFSqrtV", [SiFiveP600VEXQ1, SiFiveP600VFloatDiv], mx, sew, IsWorstCase>; 592*0fca6ea1SDimitry Andric } 593*0fca6ea1SDimitry Andric } 594*0fca6ea1SDimitry Andric} 595*0fca6ea1SDimitry Andric 596*0fca6ea1SDimitry Andric// 14. Vector Reduction Operations 597*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 598*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx>.val in { 599*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 600*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxList>.c; 601*0fca6ea1SDimitry Andric let Latency = !add(2, !mul(2, LMulLat)), ReleaseAtCycles = [LMulLat] in { 602*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVIRedV_From", [SiFiveP600VEXQ1], 603*0fca6ea1SDimitry Andric mx, sew, IsWorstCase>; 604*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVIRedMinMaxV_From", [SiFiveP600VEXQ1], 605*0fca6ea1SDimitry Andric mx, sew, IsWorstCase>; 606*0fca6ea1SDimitry Andric } 607*0fca6ea1SDimitry Andric } 608*0fca6ea1SDimitry Andric} 609*0fca6ea1SDimitry Andric 610*0fca6ea1SDimitry Andricforeach mx = SchedMxListWRed in { 611*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, 0, 1>.val in { 612*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 613*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListWRed>.c; 614*0fca6ea1SDimitry Andric let Latency = !add(2, !mul(2, LMulLat)), ReleaseAtCycles = [LMulLat] in { 615*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVIWRedV_From", [SiFiveP600VEXQ1], 616*0fca6ea1SDimitry Andric mx, sew, IsWorstCase>; 617*0fca6ea1SDimitry Andric } 618*0fca6ea1SDimitry Andric } 619*0fca6ea1SDimitry Andric} 620*0fca6ea1SDimitry Andric 621*0fca6ea1SDimitry Andricforeach mx = SchedMxListF in { 622*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, 1>.val in { 623*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 624*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListF, 1>.c; 625*0fca6ea1SDimitry Andric let Latency = !add(6, !mul(6, LMulLat)), ReleaseAtCycles = [LMulLat] in { 626*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFRedV_From", [SiFiveP600VEXQ1], 627*0fca6ea1SDimitry Andric mx, sew, IsWorstCase>; 628*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFRedMinMaxV_From", 629*0fca6ea1SDimitry Andric [SiFiveP600VEXQ1], mx, sew, IsWorstCase>; 630*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFRedOV_From", [SiFiveP600VEXQ1], 631*0fca6ea1SDimitry Andric mx, sew, IsWorstCase>; 632*0fca6ea1SDimitry Andric } 633*0fca6ea1SDimitry Andric } 634*0fca6ea1SDimitry Andric} 635*0fca6ea1SDimitry Andric 636*0fca6ea1SDimitry Andricforeach mx = SchedMxListFWRed in { 637*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, 1, 1>.val in { 638*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 639*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListFWRed, 1>.c; 640*0fca6ea1SDimitry Andric let Latency = !add(6, !mul(6, LMulLat)), ReleaseAtCycles = [LMulLat] in { 641*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWRedV_From", [SiFiveP600VEXQ1], 642*0fca6ea1SDimitry Andric mx, sew, IsWorstCase>; 643*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWRedOV_From", [SiFiveP600VEXQ1], 644*0fca6ea1SDimitry Andric mx, sew, IsWorstCase>; 645*0fca6ea1SDimitry Andric } 646*0fca6ea1SDimitry Andric } 647*0fca6ea1SDimitry Andric} 648*0fca6ea1SDimitry Andric 649*0fca6ea1SDimitry Andric// 15. Vector Mask Instructions 650*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 651*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 652*0fca6ea1SDimitry Andric let Latency = 1, ReleaseAtCycles = [1] in { 653*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVMALUV", [SiFiveP600VEXQ0], mx, IsWorstCase>; 654*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVMPopV", [SiFiveP600VEXQ0], mx, IsWorstCase>; 655*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVMFFSV", [SiFiveP600VEXQ0], mx, IsWorstCase>; 656*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVMSFSV", [SiFiveP600VEXQ0], mx, IsWorstCase>; 657*0fca6ea1SDimitry Andric } 658*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 659*0fca6ea1SDimitry Andric let Latency = 1, ReleaseAtCycles = [LMulLat] in { 660*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIotaV", [SiFiveP600VEXQ0], mx, IsWorstCase>; 661*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIdxV", [SiFiveP600VEXQ0], mx, IsWorstCase>; 662*0fca6ea1SDimitry Andric } 663*0fca6ea1SDimitry Andric} 664*0fca6ea1SDimitry Andric 665*0fca6ea1SDimitry Andric// 16. Vector Permutation Instructions 666*0fca6ea1SDimitry Andric// Simple Slide 667*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 668*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 669*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 670*0fca6ea1SDimitry Andric let Latency = 2, ReleaseAtCycles = [LMulLat] in { 671*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSlideI", [SiFiveP600VEXQ0], mx, IsWorstCase>; 672*0fca6ea1SDimitry Andric } 673*0fca6ea1SDimitry Andric let Latency = 1, ReleaseAtCycles = [LMulLat] in { 674*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVISlide1X", [SiFiveP600VEXQ0], mx, IsWorstCase>; 675*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVFSlide1F", [SiFiveP600VEXQ0], mx, IsWorstCase>; 676*0fca6ea1SDimitry Andric } 677*0fca6ea1SDimitry Andric} 678*0fca6ea1SDimitry Andricforeach mx = ["MF8", "MF4", "MF2", "M1"] in { 679*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 680*0fca6ea1SDimitry Andric let Latency = 2, ReleaseAtCycles = [1] in { 681*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSlideUpX", [SiFiveP600VEXQ0], mx, IsWorstCase>; 682*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSlideDownX", [SiFiveP600VEXQ0], mx, IsWorstCase>; 683*0fca6ea1SDimitry Andric } 684*0fca6ea1SDimitry Andric} 685*0fca6ea1SDimitry Andric 686*0fca6ea1SDimitry Andric// Complex Slide 687*0fca6ea1SDimitry Andricforeach mx = ["M8", "M4", "M2"] in { 688*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 689*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 690*0fca6ea1SDimitry Andric let Latency = !add(4, LMulLat), ReleaseAtCycles = [LMulLat] in { 691*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSlideUpX", [SiFiveP600VEXQ1], mx, IsWorstCase>; 692*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSlideDownX", [SiFiveP600VEXQ1], mx, IsWorstCase>; 693*0fca6ea1SDimitry Andric } 694*0fca6ea1SDimitry Andric} 695*0fca6ea1SDimitry Andric 696*0fca6ea1SDimitry Andriclet Latency = 2, ReleaseAtCycles = [1] in { 697*0fca6ea1SDimitry Andric def : WriteRes<WriteVMovSX, [SiFiveP600VectorArith]>; 698*0fca6ea1SDimitry Andric def : WriteRes<WriteVMovXS, [SiFiveP600VectorArith]>; 699*0fca6ea1SDimitry Andric} 700*0fca6ea1SDimitry Andriclet Latency = 6, ReleaseAtCycles = [1] in { 701*0fca6ea1SDimitry Andric def : WriteRes<WriteVMovSF, [SiFiveP600VectorArith]>; 702*0fca6ea1SDimitry Andric def : WriteRes<WriteVMovFS, [SiFiveP600VectorArith]>; 703*0fca6ea1SDimitry Andric} 704*0fca6ea1SDimitry Andric 705*0fca6ea1SDimitry Andric// Simple Gather and Compress 706*0fca6ea1SDimitry Andricforeach mx = ["MF8", "MF4", "MF2", "M1"] in { 707*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 708*0fca6ea1SDimitry Andric let Latency = 3, ReleaseAtCycles = [1] in { 709*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVRGatherVX", [SiFiveP600VEXQ1], mx, IsWorstCase>; 710*0fca6ea1SDimitry Andric } 711*0fca6ea1SDimitry Andric} 712*0fca6ea1SDimitry Andric 713*0fca6ea1SDimitry Andricforeach mx = ["MF8", "MF4", "MF2", "M1"] in { 714*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx>.val in { 715*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 716*0fca6ea1SDimitry Andric let Latency = 3, ReleaseAtCycles = [1] in { 717*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVRGatherVV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>; 718*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVRGatherEI16VV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>; 719*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVCompressV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>; 720*0fca6ea1SDimitry Andric } 721*0fca6ea1SDimitry Andric } 722*0fca6ea1SDimitry Andric} 723*0fca6ea1SDimitry Andric 724*0fca6ea1SDimitry Andric// Complex Gather and Compress 725*0fca6ea1SDimitry Andricforeach mx = ["M2", "M4", "M8"] in { 726*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 727*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 728*0fca6ea1SDimitry Andric let Latency = 6, ReleaseAtCycles = [LMulLat] in { 729*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVRGatherVX", [SiFiveP600VEXQ1], mx, IsWorstCase>; 730*0fca6ea1SDimitry Andric } 731*0fca6ea1SDimitry Andric} 732*0fca6ea1SDimitry Andric 733*0fca6ea1SDimitry Andricforeach mx = ["M2", "M4", "M8"] in { 734*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx>.val in { 735*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 736*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxList>.c; 737*0fca6ea1SDimitry Andric let Latency = 6, ReleaseAtCycles = [LMulLat] in { 738*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVRGatherVV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>; 739*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVRGatherEI16VV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>; 740*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVCompressV", [SiFiveP600VEXQ1], mx, sew, IsWorstCase>; 741*0fca6ea1SDimitry Andric } 742*0fca6ea1SDimitry Andric } 743*0fca6ea1SDimitry Andric} 744*0fca6ea1SDimitry Andric 745*0fca6ea1SDimitry Andric// Simple Vrgather.vi 746*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 747*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 748*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 749*0fca6ea1SDimitry Andric let Latency = 3, ReleaseAtCycles = [LMulLat] in { 750*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVRGatherVI", [SiFiveP600VEXQ1], mx, IsWorstCase>; 751*0fca6ea1SDimitry Andric } 752*0fca6ea1SDimitry Andric} 753*0fca6ea1SDimitry Andric 754*0fca6ea1SDimitry Andric// Vector Crypto 755*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 756*0fca6ea1SDimitry Andric defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c; 757*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c; 758*0fca6ea1SDimitry Andric // Zvbb 759*0fca6ea1SDimitry Andric let Latency = 2, ReleaseAtCycles = [LMulLat] in { 760*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVBREVV", [SiFiveP600VectorArith], mx, IsWorstCase>; 761*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVCLZV", [SiFiveP600VectorArith], mx, IsWorstCase>; 762*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVCPOPV", [SiFiveP600VectorArith], mx, IsWorstCase>; 763*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVCTZV", [SiFiveP600VectorArith], mx, IsWorstCase>; 764*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVWSLLV", [SiFiveP600VectorArith], mx, IsWorstCase>; 765*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVWSLLX", [SiFiveP600VectorArith], mx, IsWorstCase>; 766*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVWSLLI", [SiFiveP600VectorArith], mx, IsWorstCase>; 767*0fca6ea1SDimitry Andric } 768*0fca6ea1SDimitry Andric // Zvbc 769*0fca6ea1SDimitry Andric let Latency = 2, ReleaseAtCycles = [LMulLat] in { 770*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVCLMULV", [SiFiveP600VectorArith], mx, IsWorstCase>; 771*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVCLMULX", [SiFiveP600VectorArith], mx, IsWorstCase>; 772*0fca6ea1SDimitry Andric } 773*0fca6ea1SDimitry Andric // Zvkb 774*0fca6ea1SDimitry Andric // VANDN uses WriteVIALU[V|X|I] 775*0fca6ea1SDimitry Andric let Latency = 2, ReleaseAtCycles = [LMulLat] in { 776*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVBREV8V", [SiFiveP600VectorArith], mx, IsWorstCase>; 777*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVREV8V", [SiFiveP600VectorArith], mx, IsWorstCase>; 778*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVRotV", [SiFiveP600VectorArith], mx, IsWorstCase>; 779*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVRotX", [SiFiveP600VectorArith], mx, IsWorstCase>; 780*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVRotI", [SiFiveP600VectorArith], mx, IsWorstCase>; 781*0fca6ea1SDimitry Andric } 782*0fca6ea1SDimitry Andric // Zvkg 783*0fca6ea1SDimitry Andric let Latency = 2, ReleaseAtCycles = [LMulLat] in { 784*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVGHSHV", [SiFiveP600VectorArith], mx, IsWorstCase>; 785*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVGMULV", [SiFiveP600VectorArith], mx, IsWorstCase>; 786*0fca6ea1SDimitry Andric } 787*0fca6ea1SDimitry Andric // ZvknhaOrZvknhb 788*0fca6ea1SDimitry Andric let Latency = 3, ReleaseAtCycles = [LMulLat] in { 789*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSHA2CHV", [SiFiveP600VectorArith], mx, IsWorstCase>; 790*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSHA2CLV", [SiFiveP600VectorArith], mx, IsWorstCase>; 791*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSHA2MSV", [SiFiveP600VectorArith], mx, IsWorstCase>; 792*0fca6ea1SDimitry Andric } 793*0fca6ea1SDimitry Andric // Zvkned 794*0fca6ea1SDimitry Andric let Latency = 2, ReleaseAtCycles = [LMulLat] in { 795*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVAESMVV", [SiFiveP600VectorArith], mx, IsWorstCase>; 796*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVAESKF1V", [SiFiveP600VectorArith], mx, IsWorstCase>; 797*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVAESKF2V", [SiFiveP600VectorArith], mx, IsWorstCase>; 798*0fca6ea1SDimitry Andric } 799*0fca6ea1SDimitry Andric let Latency = 1, ReleaseAtCycles = [LMulLat] in 800*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVAESZV", [SiFiveP600VectorArith], mx, IsWorstCase>; 801*0fca6ea1SDimitry Andric // Zvksed 802*0fca6ea1SDimitry Andric let Latency = 3, ReleaseAtCycles = [LMulLat] in { 803*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSM4KV", [SiFiveP600VEXQ0], mx, IsWorstCase>; 804*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSM4RV", [SiFiveP600VEXQ0], mx, IsWorstCase>; 805*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSM3CV", [SiFiveP600VEXQ0], mx, IsWorstCase>; 806*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSM3MEV", [SiFiveP600VEXQ0], mx, IsWorstCase>; 807*0fca6ea1SDimitry Andric } 808*0fca6ea1SDimitry Andric} 809*0fca6ea1SDimitry Andric 810*0fca6ea1SDimitry Andric// Others 811*0fca6ea1SDimitry Andricdef : WriteRes<WriteCSR, [SiFiveP600SYS]>; 812*0fca6ea1SDimitry Andricdef : WriteRes<WriteNop, []>; 813*0fca6ea1SDimitry Andricdef : WriteRes<WriteRdVLENB, [SiFiveP600SYS]>; 814*0fca6ea1SDimitry Andric 815*0fca6ea1SDimitry Andric// FIXME: This could be better modeled by looking at the regclasses of the operands. 816*0fca6ea1SDimitry Andricdef : InstRW<[WriteIALU, ReadIALU], (instrs COPY)>; 817*0fca6ea1SDimitry Andric 818*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 819*0fca6ea1SDimitry Andric// Bypass and advance 820*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadJmp, 0>; 821*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadJalr, 0>; 822*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCSR, 0>; 823*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadStoreData, 0>; 824*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadMemBase, 0>; 825*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIALU, 0>; 826*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIALU32, 0>; 827*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadShiftImm, 0>; 828*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadShiftImm32, 0>; 829*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadShiftReg, 0>; 830*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadShiftReg32, 0>; 831*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIDiv, 0>; 832*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIDiv32, 0>; 833*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIRem, 0>; 834*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIRem32, 0>; 835*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIMul, 0>; 836*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIMul32, 0>; 837*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicWA, 0>; 838*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicWD, 0>; 839*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicDA, 0>; 840*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicDD, 0>; 841*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicLDW, 0>; 842*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicLDD, 0>; 843*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicSTW, 0>; 844*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadAtomicSTD, 0>; 845*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFStoreData, 0>; 846*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMemBase, 0>; 847*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFAdd16, 0>; 848*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFAdd32, 0>; 849*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFAdd64, 0>; 850*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMul16, 0>; 851*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA16, 0>; 852*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA16Addend, 0>; 853*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMul32, 0>; 854*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA32, 0>; 855*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA32Addend, 0>; 856*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMul64, 0>; 857*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA64, 0>; 858*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMA64Addend, 0>; 859*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFDiv16, 0>; 860*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFDiv32, 0>; 861*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFDiv64, 0>; 862*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSqrt16, 0>; 863*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSqrt32, 0>; 864*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSqrt64, 0>; 865*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCmp16, 0>; 866*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCmp32, 0>; 867*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCmp64, 0>; 868*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSGNJ16, 0>; 869*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSGNJ32, 0>; 870*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFSGNJ64, 0>; 871*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMinMax16, 0>; 872*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMinMax32, 0>; 873*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMinMax64, 0>; 874*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToI32, 0>; 875*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToI64, 0>; 876*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToI32, 0>; 877*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToI64, 0>; 878*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToI32, 0>; 879*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToI64, 0>; 880*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF16, 0>; 881*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF32, 0>; 882*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF64, 0>; 883*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF16, 0>; 884*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF32, 0>; 885*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF64, 0>; 886*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToF64, 0>; 887*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToF32, 0>; 888*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToF32, 0>; 889*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToF16, 0>; 890*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToF64, 0>; 891*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToF16, 0>; 892*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovF16ToI16, 0>; 893*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovI16ToF16, 0>; 894*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovF32ToI32, 0>; 895*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovI32ToF32, 0>; 896*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovF64ToI64, 0>; 897*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFMovI64ToF64, 0>; 898*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFClass16, 0>; 899*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFClass32, 0>; 900*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadFClass64, 0>; 901*0fca6ea1SDimitry Andric 902*0fca6ea1SDimitry Andric// Bitmanip 903*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadRotateImm, 0>; 904*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadRotateImm32, 0>; 905*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadRotateReg, 0>; 906*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadRotateReg32, 0>; 907*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCLZ, 0>; 908*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCLZ32, 0>; 909*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCTZ, 0>; 910*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCTZ32, 0>; 911*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCPOP, 0>; 912*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadCPOP32, 0>; 913*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadORCB, 0>; 914*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIMinMax, 0>; 915*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadREV8, 0>; 916*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadSHXADD, 0>; 917*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadSHXADD32, 0>; 918*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadSingleBit, 0>; 919*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadSingleBitImm, 0>; 920*0fca6ea1SDimitry Andric 921*0fca6ea1SDimitry Andric// 6. Configuration-Setting Instructions 922*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVSETVLI, 0>; 923*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVSETVL, 0>; 924*0fca6ea1SDimitry Andric 925*0fca6ea1SDimitry Andric// 7. Vector Loads and Stores 926*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVLDX, 0>; 927*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVSTX, 0>; 928*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTEV", 0>; 929*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTM", 0>; 930*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVLDSX, 0>; 931*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVSTSX, 0>; 932*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS8V", 0>; 933*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS16V", 0>; 934*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS32V", 0>; 935*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS64V", 0>; 936*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVLDUXV", 0>; 937*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVLDOXV", 0>; 938*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX8", 0>; 939*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX16", 0>; 940*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX32", 0>; 941*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX64", 0>; 942*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUXV", 0>; 943*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX8V", 0>; 944*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX16V", 0>; 945*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX32V", 0>; 946*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX64V", 0>; 947*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX8", 0>; 948*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX16", 0>; 949*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX32", 0>; 950*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX64", 0>; 951*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOXV", 0>; 952*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX8V", 0>; 953*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX16V", 0>; 954*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX32V", 0>; 955*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX64V", 0>; 956*0fca6ea1SDimitry Andric// LMUL Aware 957*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVST1R, 0>; 958*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVST2R, 0>; 959*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVST4R, 0>; 960*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVST8R, 0>; 961*0fca6ea1SDimitry Andric 962*0fca6ea1SDimitry Andric// 12. Vector Integer Arithmetic Instructions 963*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIALUV", 0>; 964*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIALUX", 0>; 965*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWALUV", 0>; 966*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWALUX", 0>; 967*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVExtV", 0>; 968*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVICALUV", 0>; 969*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVICALUX", 0>; 970*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVShiftV", 0>; 971*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVShiftX", 0>; 972*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVNShiftV", 0>; 973*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVNShiftX", 0>; 974*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVICmpV", 0>; 975*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVICmpX", 0>; 976*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMinMaxV", 0>; 977*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMinMaxX", 0>; 978*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulV", 0>; 979*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulX", 0>; 980*0fca6ea1SDimitry Andricdefm : LMULSEWReadAdvance<"ReadVIDivV", 0>; 981*0fca6ea1SDimitry Andricdefm : LMULSEWReadAdvance<"ReadVIDivX", 0>; 982*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulV", 0>; 983*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulX", 0>; 984*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulAddV", 0>; 985*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulAddX", 0>; 986*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulAddV", 0>; 987*0fca6ea1SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulAddX", 0>; 988*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMergeV", 0>; 989*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMergeX", 0>; 990*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMovV", 0>; 991*0fca6ea1SDimitry Andricdefm : LMULReadAdvance<"ReadVIMovX", 0>; 992*0fca6ea1SDimitry Andric 993*0fca6ea1SDimitry Andric// 13. Vector Fixed-Point Arithmetic Instructions 994*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSALUV", 0>; 995*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSALUX", 0>; 996*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAALUV", 0>; 997*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAALUX", 0>; 998*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSMulV", 0>; 999*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSMulX", 0>; 1000*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSShiftV", 0>; 1001*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSShiftX", 0>; 1002*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNClipV", 0>; 1003*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNClipX", 0>; 1004*0fca6ea1SDimitry Andric 1005*0fca6ea1SDimitry Andric// 14. Vector Floating-Point Instructions 1006*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFALUV", 0>; 1007*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFALUF", 0>; 1008*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWALUV", 0>; 1009*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWALUF", 0>; 1010*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulV", 0>; 1011*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulF", 0>; 1012*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFDivV", 0>; 1013*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFDivF", 0>; 1014*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulV", 0>; 1015*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulF", 0>; 1016*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulAddV", 0>; 1017*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulAddF", 0>; 1018*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulAddV", 0>; 1019*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulAddF", 0>; 1020*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSqrtV", 0>; 1021*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVFRecpV", 0>; 1022*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCmpV", 0>; 1023*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCmpF", 0>; 1024*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMinMaxV", 0>; 1025*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMinMaxF", 0>; 1026*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSgnjV", 0>; 1027*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSgnjF", 0>; 1028*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFClassV", 0>; 1029*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMergeV", 0>; 1030*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMergeF", 0>; 1031*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMovF", 0>; 1032*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFCvtIToFV", 0>; 1033*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCvtFToIV", 0>; 1034*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceW<"ReadVFWCvtIToFV", 0>; 1035*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvanceFW<"ReadVFWCvtFToIV", 0>; 1036*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWCvtFToFV", 0>; 1037*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFNCvtIToFV", 0>; 1038*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVFNCvtFToIV", 0>; 1039*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFNCvtFToFV", 0>; 1040*0fca6ea1SDimitry Andric 1041*0fca6ea1SDimitry Andric// 15. Vector Reduction Operations 1042*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVIRedV, 0>; 1043*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVIRedV0, 0>; 1044*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVIWRedV, 0>; 1045*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVIWRedV0, 0>; 1046*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFRedV, 0>; 1047*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFRedV0, 0>; 1048*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFRedOV, 0>; 1049*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFRedOV0, 0>; 1050*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFWRedV, 0>; 1051*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFWRedV0, 0>; 1052*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFWRedOV, 0>; 1053*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVFWRedOV0, 0>; 1054*0fca6ea1SDimitry Andric 1055*0fca6ea1SDimitry Andric// 16. Vector Mask Instructions 1056*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMALUV", 0>; 1057*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMPopV", 0>; 1058*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMFFSV", 0>; 1059*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMSFSV", 0>; 1060*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVIotaV", 0>; 1061*0fca6ea1SDimitry Andric 1062*0fca6ea1SDimitry Andric// 17. Vector Permutation Instructions 1063*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovXS, 0>; 1064*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSX_V, 0>; 1065*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSX_X, 0>; 1066*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovFS, 0>; 1067*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSF_V, 0>; 1068*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSF_F, 0>; 1069*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVISlideV", 0>; 1070*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVISlideX", 0>; 1071*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFSlideV", 0>; 1072*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFSlideF", 0>; 1073*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherVV_data", 0>; 1074*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherVV_index", 0>; 1075*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherEI16VV_data", 0>; 1076*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherEI16VV_index", 0>; 1077*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVX_data", 0>; 1078*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVX_index", 0>; 1079*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVI_data", 0>; 1080*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVCompressV", 0>; 1081*0fca6ea1SDimitry Andric// LMUL Aware 1082*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMov1V, 0>; 1083*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMov2V, 0>; 1084*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMov4V, 0>; 1085*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMov8V, 0>; 1086*0fca6ea1SDimitry Andric 1087*0fca6ea1SDimitry Andric// Others 1088*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMask, 0>; 1089*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMergeOp_WorstCase, 0>; 1090*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 1091*0fca6ea1SDimitry Andric def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx), 0>; 1092*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx>.val in 1093*0fca6ea1SDimitry Andric def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx # "_E" # sew), 0>; 1094*0fca6ea1SDimitry Andric} 1095*0fca6ea1SDimitry Andric 1096*0fca6ea1SDimitry Andric// Vector Crypto Extensions 1097*0fca6ea1SDimitry Andric// Zvbb 1098*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVBREVV", 0>; 1099*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVCLZV", 0>; 1100*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVCPOPV", 0>; 1101*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVCTZV", 0>; 1102*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVWSLLV", 0>; 1103*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVWSLLX", 0>; 1104*0fca6ea1SDimitry Andric// Zvbc 1105*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVCLMULV", 0>; 1106*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVCLMULX", 0>; 1107*0fca6ea1SDimitry Andric// Zvkb 1108*0fca6ea1SDimitry Andric// VANDN uses ReadVIALU[V|X|I] 1109*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVBREV8V", 0>; 1110*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVREV8V", 0>; 1111*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRotV", 0>; 1112*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRotX", 0>; 1113*0fca6ea1SDimitry Andric// Zvkg 1114*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVGHSHV", 0>; 1115*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVGMULV", 0>; 1116*0fca6ea1SDimitry Andric// Zvknha or Zvknhb 1117*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSHA2CHV", 0>; 1118*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSHA2CLV", 0>; 1119*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSHA2MSV", 0>; 1120*0fca6ea1SDimitry Andric// Zvkned 1121*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAESMVV", 0>; 1122*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAESKF1V", 0>; 1123*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAESKF2V", 0>; 1124*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAESZV", 0>; 1125*0fca6ea1SDimitry Andric// Zvksed 1126*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSM4KV", 0>; 1127*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSM4RV", 0>; 1128*0fca6ea1SDimitry Andric// Zbksh 1129*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSM3CV", 0>; 1130*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSM3MEV", 0>; 1131*0fca6ea1SDimitry Andric 1132*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1133*0fca6ea1SDimitry Andric// Unsupported extensions 1134*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZabha; 1135*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZbc; 1136*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZbkb; 1137*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZbkx; 1138*0fca6ea1SDimitry Andricdefm : UnsupportedSchedSFB; 1139*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZfa; 1140*0fca6ea1SDimitry Andricdefm : UnsupportedSchedXsfvcp; 1141*0fca6ea1SDimitry Andric} 1142