1e8d8bef9SDimitry Andric//==- RISCVSchedSiFive7.td - SiFive7 Scheduling Definitions --*- tablegen -*-=// 2e8d8bef9SDimitry Andric// 3e8d8bef9SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e8d8bef9SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5e8d8bef9SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e8d8bef9SDimitry Andric// 7e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===// 8e8d8bef9SDimitry Andric 9e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===// 10e8d8bef9SDimitry Andric 1106c3fb27SDimitry Andric/// c is true if mx has the worst case behavior compared to LMULs in MxList. 1206c3fb27SDimitry Andric/// On the SiFive7, the worst case LMUL is the Largest LMUL 1306c3fb27SDimitry Andric/// and the worst case sew is the smallest SEW for that LMUL. 1406c3fb27SDimitry Andricclass SiFive7IsWorstCaseMX<string mx, list<string> MxList> { 1506c3fb27SDimitry Andric defvar LLMUL = LargestLMUL<MxList>.r; 1606c3fb27SDimitry Andric bit c = !eq(mx, LLMUL); 1706c3fb27SDimitry Andric} 1806c3fb27SDimitry Andric 1906c3fb27SDimitry Andric/// c is true if mx and sew have the worst case behavior compared to LMULs in 2006c3fb27SDimitry Andric/// MxList. On the SiFive7, the worst case LMUL is the Largest LMUL 2106c3fb27SDimitry Andric/// and the worst case sew is the smallest SEW for that LMUL. 2206c3fb27SDimitry Andricclass SiFive7IsWorstCaseMXSEW<string mx, int sew, list<string> MxList, 2306c3fb27SDimitry Andric bit isF = 0> { 2406c3fb27SDimitry Andric defvar LLMUL = LargestLMUL<MxList>.r; 2506c3fb27SDimitry Andric defvar SSEW = SmallestSEW<mx, isF>.r; 2606c3fb27SDimitry Andric bit c = !and(!eq(mx, LLMUL), !eq(sew, SSEW)); 2706c3fb27SDimitry Andric} 2806c3fb27SDimitry Andric 2906c3fb27SDimitry Andric/// Number of DLEN parts = (LMUL * VLEN) / DLEN. 3006c3fb27SDimitry Andric/// Since DLEN = VLEN / 2, Num DLEN parts = 2 * LMUL. 3106c3fb27SDimitry Andricclass SiFive7GetCyclesDefault<string mx> { 3206c3fb27SDimitry Andric int c = !cond( 3306c3fb27SDimitry Andric !eq(mx, "M1") : 2, 3406c3fb27SDimitry Andric !eq(mx, "M2") : 4, 3506c3fb27SDimitry Andric !eq(mx, "M4") : 8, 3606c3fb27SDimitry Andric !eq(mx, "M8") : 16, 3706c3fb27SDimitry Andric !eq(mx, "MF2") : 1, 3806c3fb27SDimitry Andric !eq(mx, "MF4") : 1, 3906c3fb27SDimitry Andric !eq(mx, "MF8") : 1 4006c3fb27SDimitry Andric ); 4106c3fb27SDimitry Andric} 4206c3fb27SDimitry Andric 4306c3fb27SDimitry Andricclass SiFive7GetCyclesNarrowing<string mx> { 4406c3fb27SDimitry Andric int c = !cond( 4506c3fb27SDimitry Andric !eq(mx, "M1") : 4, 4606c3fb27SDimitry Andric !eq(mx, "M2") : 8, 4706c3fb27SDimitry Andric !eq(mx, "M4") : 16, 4806c3fb27SDimitry Andric !eq(mx, "MF2") : 2, 4906c3fb27SDimitry Andric !eq(mx, "MF4") : 1, 5006c3fb27SDimitry Andric !eq(mx, "MF8") : 1 5106c3fb27SDimitry Andric ); 5206c3fb27SDimitry Andric} 5306c3fb27SDimitry Andric 5406c3fb27SDimitry Andricclass SiFive7GetCyclesVMask<string mx> { 5506c3fb27SDimitry Andric int c = !cond( 5606c3fb27SDimitry Andric !eq(mx, "M1") : 1, 5706c3fb27SDimitry Andric !eq(mx, "M2") : 1, 5806c3fb27SDimitry Andric !eq(mx, "M4") : 1, 5906c3fb27SDimitry Andric !eq(mx, "M8") : 2, 6006c3fb27SDimitry Andric !eq(mx, "MF2") : 1, 6106c3fb27SDimitry Andric !eq(mx, "MF4") : 1, 6206c3fb27SDimitry Andric !eq(mx, "MF8") : 1 6306c3fb27SDimitry Andric ); 6406c3fb27SDimitry Andric} 6506c3fb27SDimitry Andric 6606c3fb27SDimitry Andric/// VLDM and VSTM can't read/write more than 2 DLENs of data. 6706c3fb27SDimitry Andric/// 2 DLENs when LMUL=8. 1 DLEN for all other DLENs 6806c3fb27SDimitry Andricclass SiFive7GetMaskLoadStoreCycles<string mx> { 6906c3fb27SDimitry Andric int c = !cond( 7006c3fb27SDimitry Andric !eq(mx, "M8") : 2, 7106c3fb27SDimitry Andric true : 1 7206c3fb27SDimitry Andric ); 7306c3fb27SDimitry Andric} 7406c3fb27SDimitry Andric 7506c3fb27SDimitry Andric// Cycles for nf=2 segmented loads and stores are calculated using the 7606c3fb27SDimitry Andric// formula (2 * VLEN * LMUL) / DLEN = 4 * LMUL 7706c3fb27SDimitry Andricclass SiFive7GetCyclesSegmentedSeg2<string mx> { 7806c3fb27SDimitry Andric int c = !cond( 7906c3fb27SDimitry Andric !eq(mx, "M1") : 4, 8006c3fb27SDimitry Andric !eq(mx, "M2") : 8, 8106c3fb27SDimitry Andric !eq(mx, "M4") : 16, 8206c3fb27SDimitry Andric !eq(mx, "M8") : 32, 8306c3fb27SDimitry Andric !eq(mx, "MF2") : 2, 8406c3fb27SDimitry Andric !eq(mx, "MF4") : 1, 8506c3fb27SDimitry Andric !eq(mx, "MF8") : 1 8606c3fb27SDimitry Andric ); 8706c3fb27SDimitry Andric} 8806c3fb27SDimitry Andric 8906c3fb27SDimitry Andric// Cycles for segmented loads and stores are calculated using the 9006c3fb27SDimitry Andric// formula vl * ceil((SEW * nf) / DLEN), where SEW * nf is the segment size. 9106c3fb27SDimitry Andricclass SiFive7GetCyclesSegmented<string mx, int sew, int nf> { 9206c3fb27SDimitry Andric defvar VLEN = 512; 9306c3fb27SDimitry Andric defvar DLEN = 256; 9406c3fb27SDimitry Andric // (VLEN * LMUL) / SEW 9506c3fb27SDimitry Andric defvar VLUpperBound = !cond( 9606c3fb27SDimitry Andric !eq(mx, "M1") : !div(VLEN, sew), 9706c3fb27SDimitry Andric !eq(mx, "M2") : !div(!mul(VLEN, 2), sew), 9806c3fb27SDimitry Andric !eq(mx, "M4") : !div(!mul(VLEN, 4), sew), 9906c3fb27SDimitry Andric !eq(mx, "M8") : !div(!mul(VLEN, 8), sew), 10006c3fb27SDimitry Andric !eq(mx, "MF2") : !div(!div(VLEN, 2), sew), 10106c3fb27SDimitry Andric !eq(mx, "MF4") : !div(!div(VLEN, 4), sew), 10206c3fb27SDimitry Andric !eq(mx, "MF8") : !div(!div(VLEN, 8), sew), 10306c3fb27SDimitry Andric ); 10406c3fb27SDimitry Andric // We can calculate ceil(a/b) using (a + b - 1) / b. 10506c3fb27SDimitry Andric defvar a = !mul(sew, nf); 10606c3fb27SDimitry Andric defvar b = DLEN; 10706c3fb27SDimitry Andric int c = !mul(VLUpperBound, !div(!sub(!add(a, b), 1), b)); 10806c3fb27SDimitry Andric} 10906c3fb27SDimitry Andric 11006c3fb27SDimitry Andricclass SiFive7GetCyclesOnePerElement<string mx, int sew> { 11106c3fb27SDimitry Andric // FIXME: On SiFive7, VLEN is 512. Although a user can request the compiler 11206c3fb27SDimitry Andric // to use a different VLEN, this model will not make scheduling decisions 11306c3fb27SDimitry Andric // based on the user specified VLEN. 11406c3fb27SDimitry Andric // c = ceil(VLEN / SEW) * LMUL 11506c3fb27SDimitry Andric // Note: c >= 1 since the smallest VLEN is 512 / 8 = 8, and the 11606c3fb27SDimitry Andric // largest division performed on VLEN is in MF8 case with division 11706c3fb27SDimitry Andric // by 8. Therefore, there is no need to ceil the result. 11806c3fb27SDimitry Andric int VLEN = !div(512, sew); 11906c3fb27SDimitry Andric int c = !cond( 12006c3fb27SDimitry Andric !eq(mx, "M1") : VLEN, 12106c3fb27SDimitry Andric !eq(mx, "M2") : !mul(VLEN, 2), 12206c3fb27SDimitry Andric !eq(mx, "M4") : !mul(VLEN, 4), 12306c3fb27SDimitry Andric !eq(mx, "M8") : !mul(VLEN, 8), 12406c3fb27SDimitry Andric !eq(mx, "MF2") : !div(VLEN, 2), 12506c3fb27SDimitry Andric !eq(mx, "MF4") : !div(VLEN, 4), 12606c3fb27SDimitry Andric !eq(mx, "MF8") : !div(VLEN, 8) 12706c3fb27SDimitry Andric ); 12806c3fb27SDimitry Andric} 12906c3fb27SDimitry Andric 13006c3fb27SDimitry Andricclass SiFive7GetDivOrSqrtFactor<int sew> { 13106c3fb27SDimitry Andric int c = !cond( 13206c3fb27SDimitry Andric // TODO: Add SchedSEWSetFP upstream and remove the SEW=8 case. 13306c3fb27SDimitry Andric !eq(sew, 8) : 15, 13406c3fb27SDimitry Andric !eq(sew, 16) : 15, 13506c3fb27SDimitry Andric !eq(sew, 32) : 28, 13606c3fb27SDimitry Andric !eq(sew, 64) : 57 13706c3fb27SDimitry Andric ); 13806c3fb27SDimitry Andric} 13906c3fb27SDimitry Andric 14006c3fb27SDimitry Andric/// Cycles for reductions take approximately VL*SEW/DLEN + 5(4 + log(DLEN/SEW)) 14106c3fb27SDimitry Andric/// cycles. 14206c3fb27SDimitry Andricclass SiFive7GetReductionCycles<string mx, int sew> { 14306c3fb27SDimitry Andric // VLUpperBound*SEW/DLEN is equivalent to 2*LMUL since 14406c3fb27SDimitry Andric // VLUpperBound=(VLEN*LMUL)/SEW. 14506c3fb27SDimitry Andric defvar VLEN = 512; 14606c3fb27SDimitry Andric defvar DLEN = !div(VLEN, 2); 14706c3fb27SDimitry Andric defvar TwoTimesLMUL = !cond( 14806c3fb27SDimitry Andric !eq(mx, "M1") : 2, 14906c3fb27SDimitry Andric !eq(mx, "M2") : 4, 15006c3fb27SDimitry Andric !eq(mx, "M4") : 8, 15106c3fb27SDimitry Andric !eq(mx, "M8") : 16, 15206c3fb27SDimitry Andric !eq(mx, "MF2") : 1, 15306c3fb27SDimitry Andric !eq(mx, "MF4") : 1, 15406c3fb27SDimitry Andric !eq(mx, "MF8") : 1 15506c3fb27SDimitry Andric ); 15606c3fb27SDimitry Andric int c = !add( 1575f757f3fSDimitry Andric TwoTimesLMUL, 15806c3fb27SDimitry Andric !mul(5, !add(4, !logtwo(!div(DLEN, sew)))) 15906c3fb27SDimitry Andric ); 16006c3fb27SDimitry Andric} 16106c3fb27SDimitry Andric 1625f757f3fSDimitry Andric/// Cycles for ordered reductions take approximatley 6*VL cycles 16306c3fb27SDimitry Andricclass SiFive7GetOrderedReductionCycles<string mx, int sew> { 16406c3fb27SDimitry Andric defvar VLEN = 512; 16506c3fb27SDimitry Andric // (VLEN * LMUL) / SEW 16606c3fb27SDimitry Andric defvar VLUpperBound = !cond( 16706c3fb27SDimitry Andric !eq(mx, "M1") : !div(VLEN, sew), 16806c3fb27SDimitry Andric !eq(mx, "M2") : !div(!mul(VLEN, 2), sew), 16906c3fb27SDimitry Andric !eq(mx, "M4") : !div(!mul(VLEN, 4), sew), 17006c3fb27SDimitry Andric !eq(mx, "M8") : !div(!mul(VLEN, 8), sew), 17106c3fb27SDimitry Andric !eq(mx, "MF2") : !div(!div(VLEN, 2), sew), 17206c3fb27SDimitry Andric !eq(mx, "MF4") : !div(!div(VLEN, 4), sew), 17306c3fb27SDimitry Andric !eq(mx, "MF8") : !div(!div(VLEN, 8), sew), 17406c3fb27SDimitry Andric ); 1755f757f3fSDimitry Andric int c = !mul(6, VLUpperBound); 17606c3fb27SDimitry Andric} 17706c3fb27SDimitry Andric 17806c3fb27SDimitry Andricclass SiFive7AnyToGPRBypass<SchedRead read, int cycles = 2> 17906c3fb27SDimitry Andric : ReadAdvance<read, cycles, [WriteIALU, WriteIALU32, 18006c3fb27SDimitry Andric WriteShiftImm, WriteShiftImm32, 18106c3fb27SDimitry Andric WriteShiftReg, WriteShiftReg32, 18206c3fb27SDimitry Andric WriteSHXADD, WriteSHXADD32, 18306c3fb27SDimitry Andric WriteRotateImm, WriteRotateImm32, 18406c3fb27SDimitry Andric WriteRotateReg, WriteRotateReg32, 1855f757f3fSDimitry Andric WriteSingleBit, WriteSingleBitImm, 1865f757f3fSDimitry Andric WriteBEXT, WriteBEXTI, 18706c3fb27SDimitry Andric WriteCLZ, WriteCLZ32, WriteCTZ, WriteCTZ32, 18806c3fb27SDimitry Andric WriteCPOP, WriteCPOP32, 189*0fca6ea1SDimitry Andric WriteREV8, WriteORCB, WriteIMinMax, WriteSFB, 19006c3fb27SDimitry Andric WriteIMul, WriteIMul32, 19106c3fb27SDimitry Andric WriteIDiv, WriteIDiv32, 192*0fca6ea1SDimitry Andric WriteIRem, WriteIRem32, 19306c3fb27SDimitry Andric WriteLDB, WriteLDH, WriteLDW, WriteLDD]>; 19406c3fb27SDimitry Andric 195e8d8bef9SDimitry Andric// SiFive7 machine model for scheduling and other instruction cost heuristics. 196e8d8bef9SDimitry Andricdef SiFive7Model : SchedMachineModel { 197e8d8bef9SDimitry Andric let MicroOpBufferSize = 0; // Explicitly set to zero since SiFive7 is in-order. 198e8d8bef9SDimitry Andric let IssueWidth = 2; // 2 micro-ops are dispatched per cycle. 199e8d8bef9SDimitry Andric let LoadLatency = 3; 200e8d8bef9SDimitry Andric let MispredictPenalty = 3; 201e8d8bef9SDimitry Andric let CompleteModel = 0; 202cb14a3feSDimitry Andric let EnableIntervals = true; 20304eeddc0SDimitry Andric let UnsupportedFeatures = [HasStdExtZbkb, HasStdExtZbkc, HasStdExtZbkx, 20406c3fb27SDimitry Andric HasStdExtZcmt, HasStdExtZknd, HasStdExtZkne, 20506c3fb27SDimitry Andric HasStdExtZknh, HasStdExtZksed, HasStdExtZksh, 20606c3fb27SDimitry Andric HasStdExtZkr]; 207e8d8bef9SDimitry Andric} 208e8d8bef9SDimitry Andric 20906c3fb27SDimitry Andric// The SiFive7 microarchitecture has three pipelines: A, B, V. 210e8d8bef9SDimitry Andric// Pipe A can handle memory, integer alu and vector operations. 211e8d8bef9SDimitry Andric// Pipe B can handle integer alu, control flow, integer multiply and divide, 212e8d8bef9SDimitry Andric// and floating point computation. 2135f757f3fSDimitry Andric// The V pipeline is modeled by the VCQ, VA, VL, and VS resources. 214e8d8bef9SDimitry Andriclet SchedModel = SiFive7Model in { 215e8d8bef9SDimitry Andriclet BufferSize = 0 in { 216e8d8bef9SDimitry Andricdef SiFive7PipeA : ProcResource<1>; 217e8d8bef9SDimitry Andricdef SiFive7PipeB : ProcResource<1>; 2185f757f3fSDimitry Andricdef SiFive7IDiv : ProcResource<1>; // Int Division 2195f757f3fSDimitry Andricdef SiFive7FDiv : ProcResource<1>; // FP Division/Sqrt 2205f757f3fSDimitry Andricdef SiFive7VA : ProcResource<1>; // Arithmetic sequencer 2215f757f3fSDimitry Andricdef SiFive7VL : ProcResource<1>; // Load sequencer 2225f757f3fSDimitry Andricdef SiFive7VS : ProcResource<1>; // Store sequencer 2235f757f3fSDimitry Andric// The VCQ accepts instructions from the the A Pipe and holds them until the 2245f757f3fSDimitry Andric// vector unit is ready to dequeue them. The unit dequeues up to one instruction 2255f757f3fSDimitry Andric// per cycle, in order, as soon as the sequencer for that type of instruction is 2265f757f3fSDimitry Andric// avaliable. This resource is meant to be used for 1 cycle by all vector 2275f757f3fSDimitry Andric// instructions, to model that only one vector instruction may be dequed at a 2285f757f3fSDimitry Andric// time. The actual dequeueing into the sequencer is modeled by the VA, VL, and 2295f757f3fSDimitry Andric// VS sequencer resources below. Each of them will only accept a single 2305f757f3fSDimitry Andric// instruction at a time and remain busy for the number of cycles associated 2315f757f3fSDimitry Andric// with that instruction. 2325f757f3fSDimitry Andricdef SiFive7VCQ : ProcResource<1>; // Vector Command Queue 233e8d8bef9SDimitry Andric} 234e8d8bef9SDimitry Andric 235e8d8bef9SDimitry Andricdef SiFive7PipeAB : ProcResGroup<[SiFive7PipeA, SiFive7PipeB]>; 236e8d8bef9SDimitry Andric 237e8d8bef9SDimitry Andric// Branching 23806c3fb27SDimitry Andriclet Latency = 3 in { 239e8d8bef9SDimitry Andricdef : WriteRes<WriteJmp, [SiFive7PipeB]>; 240e8d8bef9SDimitry Andricdef : WriteRes<WriteJal, [SiFive7PipeB]>; 241e8d8bef9SDimitry Andricdef : WriteRes<WriteJalr, [SiFive7PipeB]>; 24206c3fb27SDimitry Andric} 243e8d8bef9SDimitry Andric 244bdd1243dSDimitry Andric//Short forward branch 245bdd1243dSDimitry Andricdef : WriteRes<WriteSFB, [SiFive7PipeA, SiFive7PipeB]> { 246bdd1243dSDimitry Andric let Latency = 3; 247bdd1243dSDimitry Andric let NumMicroOps = 2; 248bdd1243dSDimitry Andric} 249bdd1243dSDimitry Andric 250e8d8bef9SDimitry Andric// Integer arithmetic and logic 251e8d8bef9SDimitry Andriclet Latency = 3 in { 252e8d8bef9SDimitry Andricdef : WriteRes<WriteIALU, [SiFive7PipeAB]>; 253e8d8bef9SDimitry Andricdef : WriteRes<WriteIALU32, [SiFive7PipeAB]>; 254fe6060f1SDimitry Andricdef : WriteRes<WriteShiftImm, [SiFive7PipeAB]>; 255fe6060f1SDimitry Andricdef : WriteRes<WriteShiftImm32, [SiFive7PipeAB]>; 256fe6060f1SDimitry Andricdef : WriteRes<WriteShiftReg, [SiFive7PipeAB]>; 257fe6060f1SDimitry Andricdef : WriteRes<WriteShiftReg32, [SiFive7PipeAB]>; 258e8d8bef9SDimitry Andric} 259e8d8bef9SDimitry Andric 260e8d8bef9SDimitry Andric// Integer multiplication 261e8d8bef9SDimitry Andriclet Latency = 3 in { 262e8d8bef9SDimitry Andricdef : WriteRes<WriteIMul, [SiFive7PipeB]>; 263e8d8bef9SDimitry Andricdef : WriteRes<WriteIMul32, [SiFive7PipeB]>; 264e8d8bef9SDimitry Andric} 265e8d8bef9SDimitry Andric 266e8d8bef9SDimitry Andric// Integer division 267e8d8bef9SDimitry Andricdef : WriteRes<WriteIDiv, [SiFive7PipeB, SiFive7IDiv]> { 26806c3fb27SDimitry Andric let Latency = 66; 2695f757f3fSDimitry Andric let ReleaseAtCycles = [1, 65]; 270e8d8bef9SDimitry Andric} 271e8d8bef9SDimitry Andricdef : WriteRes<WriteIDiv32, [SiFive7PipeB, SiFive7IDiv]> { 27206c3fb27SDimitry Andric let Latency = 34; 2735f757f3fSDimitry Andric let ReleaseAtCycles = [1, 33]; 27406c3fb27SDimitry Andric} 27506c3fb27SDimitry Andric 276*0fca6ea1SDimitry Andric// Integer remainder 277*0fca6ea1SDimitry Andricdef : WriteRes<WriteIRem, [SiFive7PipeB, SiFive7IDiv]> { 278*0fca6ea1SDimitry Andric let Latency = 66; 279*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 65]; 280*0fca6ea1SDimitry Andric} 281*0fca6ea1SDimitry Andricdef : WriteRes<WriteIRem32, [SiFive7PipeB, SiFive7IDiv]> { 282*0fca6ea1SDimitry Andric let Latency = 34; 283*0fca6ea1SDimitry Andric let ReleaseAtCycles = [1, 33]; 284*0fca6ea1SDimitry Andric} 285*0fca6ea1SDimitry Andric 28606c3fb27SDimitry Andric// Bitmanip 28706c3fb27SDimitry Andriclet Latency = 3 in { 28806c3fb27SDimitry Andric// Rotates are in the late-B ALU. 28906c3fb27SDimitry Andricdef : WriteRes<WriteRotateImm, [SiFive7PipeB]>; 29006c3fb27SDimitry Andricdef : WriteRes<WriteRotateImm32, [SiFive7PipeB]>; 29106c3fb27SDimitry Andricdef : WriteRes<WriteRotateReg, [SiFive7PipeB]>; 29206c3fb27SDimitry Andricdef : WriteRes<WriteRotateReg32, [SiFive7PipeB]>; 29306c3fb27SDimitry Andric 29406c3fb27SDimitry Andric// clz[w]/ctz[w] are in the late-B ALU. 29506c3fb27SDimitry Andricdef : WriteRes<WriteCLZ, [SiFive7PipeB]>; 29606c3fb27SDimitry Andricdef : WriteRes<WriteCLZ32, [SiFive7PipeB]>; 29706c3fb27SDimitry Andricdef : WriteRes<WriteCTZ, [SiFive7PipeB]>; 29806c3fb27SDimitry Andricdef : WriteRes<WriteCTZ32, [SiFive7PipeB]>; 29906c3fb27SDimitry Andric 30006c3fb27SDimitry Andric// cpop[w] look exactly like multiply. 30106c3fb27SDimitry Andricdef : WriteRes<WriteCPOP, [SiFive7PipeB]>; 30206c3fb27SDimitry Andricdef : WriteRes<WriteCPOP32, [SiFive7PipeB]>; 30306c3fb27SDimitry Andric 30406c3fb27SDimitry Andric// orc.b is in the late-B ALU. 30506c3fb27SDimitry Andricdef : WriteRes<WriteORCB, [SiFive7PipeB]>; 30606c3fb27SDimitry Andric 307*0fca6ea1SDimitry Andric// min/max are in the late-B ALU 308*0fca6ea1SDimitry Andricdef : WriteRes<WriteIMinMax, [SiFive7PipeB]>; 309*0fca6ea1SDimitry Andric 31006c3fb27SDimitry Andric// rev8 is in the late-A and late-B ALUs. 31106c3fb27SDimitry Andricdef : WriteRes<WriteREV8, [SiFive7PipeAB]>; 31206c3fb27SDimitry Andric 31306c3fb27SDimitry Andric// shNadd[.uw] is on the early-B and late-B ALUs. 31406c3fb27SDimitry Andricdef : WriteRes<WriteSHXADD, [SiFive7PipeB]>; 31506c3fb27SDimitry Andricdef : WriteRes<WriteSHXADD32, [SiFive7PipeB]>; 316e8d8bef9SDimitry Andric} 317e8d8bef9SDimitry Andric 3185f757f3fSDimitry Andric// Single-bit instructions 3195f757f3fSDimitry Andric// BEXT[I] instruction is available on all ALUs and the other instructions 3205f757f3fSDimitry Andric// are only available on the SiFive7B pipe. 3215f757f3fSDimitry Andriclet Latency = 3 in { 3225f757f3fSDimitry Andricdef : WriteRes<WriteSingleBit, [SiFive7PipeB]>; 3235f757f3fSDimitry Andricdef : WriteRes<WriteSingleBitImm, [SiFive7PipeB]>; 3245f757f3fSDimitry Andricdef : WriteRes<WriteBEXT, [SiFive7PipeAB]>; 3255f757f3fSDimitry Andricdef : WriteRes<WriteBEXTI, [SiFive7PipeAB]>; 3265f757f3fSDimitry Andric} 3275f757f3fSDimitry Andric 328e8d8bef9SDimitry Andric// Memory 329e8d8bef9SDimitry Andricdef : WriteRes<WriteSTB, [SiFive7PipeA]>; 330e8d8bef9SDimitry Andricdef : WriteRes<WriteSTH, [SiFive7PipeA]>; 331e8d8bef9SDimitry Andricdef : WriteRes<WriteSTW, [SiFive7PipeA]>; 332e8d8bef9SDimitry Andricdef : WriteRes<WriteSTD, [SiFive7PipeA]>; 33306c3fb27SDimitry Andricdef : WriteRes<WriteFST16, [SiFive7PipeA]>; 334e8d8bef9SDimitry Andricdef : WriteRes<WriteFST32, [SiFive7PipeA]>; 335e8d8bef9SDimitry Andricdef : WriteRes<WriteFST64, [SiFive7PipeA]>; 336e8d8bef9SDimitry Andric 337e8d8bef9SDimitry Andriclet Latency = 3 in { 338e8d8bef9SDimitry Andricdef : WriteRes<WriteLDB, [SiFive7PipeA]>; 339e8d8bef9SDimitry Andricdef : WriteRes<WriteLDH, [SiFive7PipeA]>; 340e8d8bef9SDimitry Andricdef : WriteRes<WriteLDW, [SiFive7PipeA]>; 341e8d8bef9SDimitry Andricdef : WriteRes<WriteLDD, [SiFive7PipeA]>; 342e8d8bef9SDimitry Andric} 343e8d8bef9SDimitry Andric 344e8d8bef9SDimitry Andriclet Latency = 2 in { 34506c3fb27SDimitry Andricdef : WriteRes<WriteFLD16, [SiFive7PipeA]>; 346e8d8bef9SDimitry Andricdef : WriteRes<WriteFLD32, [SiFive7PipeA]>; 347e8d8bef9SDimitry Andricdef : WriteRes<WriteFLD64, [SiFive7PipeA]>; 348e8d8bef9SDimitry Andric} 349e8d8bef9SDimitry Andric 350e8d8bef9SDimitry Andric// Atomic memory 351e8d8bef9SDimitry Andricdef : WriteRes<WriteAtomicSTW, [SiFive7PipeA]>; 352e8d8bef9SDimitry Andricdef : WriteRes<WriteAtomicSTD, [SiFive7PipeA]>; 353e8d8bef9SDimitry Andric 354e8d8bef9SDimitry Andriclet Latency = 3 in { 355e8d8bef9SDimitry Andricdef : WriteRes<WriteAtomicW, [SiFive7PipeA]>; 356e8d8bef9SDimitry Andricdef : WriteRes<WriteAtomicD, [SiFive7PipeA]>; 357e8d8bef9SDimitry Andricdef : WriteRes<WriteAtomicLDW, [SiFive7PipeA]>; 358e8d8bef9SDimitry Andricdef : WriteRes<WriteAtomicLDD, [SiFive7PipeA]>; 359e8d8bef9SDimitry Andric} 360e8d8bef9SDimitry Andric 36106c3fb27SDimitry Andric// Half precision. 36206c3fb27SDimitry Andriclet Latency = 5 in { 36306c3fb27SDimitry Andricdef : WriteRes<WriteFAdd16, [SiFive7PipeB]>; 36406c3fb27SDimitry Andricdef : WriteRes<WriteFMul16, [SiFive7PipeB]>; 36506c3fb27SDimitry Andricdef : WriteRes<WriteFMA16, [SiFive7PipeB]>; 36606c3fb27SDimitry Andric} 36706c3fb27SDimitry Andriclet Latency = 3 in { 36806c3fb27SDimitry Andricdef : WriteRes<WriteFSGNJ16, [SiFive7PipeB]>; 36906c3fb27SDimitry Andricdef : WriteRes<WriteFMinMax16, [SiFive7PipeB]>; 37006c3fb27SDimitry Andric} 37106c3fb27SDimitry Andric 3725f757f3fSDimitry Andriclet Latency = 14, ReleaseAtCycles = [1, 13] in { 37306c3fb27SDimitry Andricdef : WriteRes<WriteFDiv16, [SiFive7PipeB, SiFive7FDiv]>; 37406c3fb27SDimitry Andricdef : WriteRes<WriteFSqrt16, [SiFive7PipeB, SiFive7FDiv]>; 37506c3fb27SDimitry Andric} 37606c3fb27SDimitry Andric 377e8d8bef9SDimitry Andric// Single precision. 378e8d8bef9SDimitry Andriclet Latency = 5 in { 379bdd1243dSDimitry Andricdef : WriteRes<WriteFAdd32, [SiFive7PipeB]>; 380e8d8bef9SDimitry Andricdef : WriteRes<WriteFMul32, [SiFive7PipeB]>; 381fe6060f1SDimitry Andricdef : WriteRes<WriteFMA32, [SiFive7PipeB]>; 382e8d8bef9SDimitry Andric} 383e8d8bef9SDimitry Andriclet Latency = 3 in { 384e8d8bef9SDimitry Andricdef : WriteRes<WriteFSGNJ32, [SiFive7PipeB]>; 385e8d8bef9SDimitry Andricdef : WriteRes<WriteFMinMax32, [SiFive7PipeB]>; 386e8d8bef9SDimitry Andric} 387e8d8bef9SDimitry Andric 388e8d8bef9SDimitry Andricdef : WriteRes<WriteFDiv32, [SiFive7PipeB, SiFive7FDiv]> { let Latency = 27; 3895f757f3fSDimitry Andric let ReleaseAtCycles = [1, 26]; } 390e8d8bef9SDimitry Andricdef : WriteRes<WriteFSqrt32, [SiFive7PipeB, SiFive7FDiv]> { let Latency = 27; 3915f757f3fSDimitry Andric let ReleaseAtCycles = [1, 26]; } 392e8d8bef9SDimitry Andric 393e8d8bef9SDimitry Andric// Double precision 394e8d8bef9SDimitry Andriclet Latency = 7 in { 395bdd1243dSDimitry Andricdef : WriteRes<WriteFAdd64, [SiFive7PipeB]>; 396e8d8bef9SDimitry Andricdef : WriteRes<WriteFMul64, [SiFive7PipeB]>; 397fe6060f1SDimitry Andricdef : WriteRes<WriteFMA64, [SiFive7PipeB]>; 398e8d8bef9SDimitry Andric} 399e8d8bef9SDimitry Andriclet Latency = 3 in { 400e8d8bef9SDimitry Andricdef : WriteRes<WriteFSGNJ64, [SiFive7PipeB]>; 401e8d8bef9SDimitry Andricdef : WriteRes<WriteFMinMax64, [SiFive7PipeB]>; 402e8d8bef9SDimitry Andric} 403e8d8bef9SDimitry Andric 404e8d8bef9SDimitry Andricdef : WriteRes<WriteFDiv64, [SiFive7PipeB, SiFive7FDiv]> { let Latency = 56; 4055f757f3fSDimitry Andric let ReleaseAtCycles = [1, 55]; } 406e8d8bef9SDimitry Andricdef : WriteRes<WriteFSqrt64, [SiFive7PipeB, SiFive7FDiv]> { let Latency = 56; 4075f757f3fSDimitry Andric let ReleaseAtCycles = [1, 55]; } 408e8d8bef9SDimitry Andric 409e8d8bef9SDimitry Andric// Conversions 410e8d8bef9SDimitry Andriclet Latency = 3 in { 41106c3fb27SDimitry Andricdef : WriteRes<WriteFCvtI32ToF16, [SiFive7PipeB]>; 412e8d8bef9SDimitry Andricdef : WriteRes<WriteFCvtI32ToF32, [SiFive7PipeB]>; 413e8d8bef9SDimitry Andricdef : WriteRes<WriteFCvtI32ToF64, [SiFive7PipeB]>; 41406c3fb27SDimitry Andricdef : WriteRes<WriteFCvtI64ToF16, [SiFive7PipeB]>; 415e8d8bef9SDimitry Andricdef : WriteRes<WriteFCvtI64ToF32, [SiFive7PipeB]>; 416e8d8bef9SDimitry Andricdef : WriteRes<WriteFCvtI64ToF64, [SiFive7PipeB]>; 41706c3fb27SDimitry Andricdef : WriteRes<WriteFCvtF16ToI32, [SiFive7PipeB]>; 41806c3fb27SDimitry Andricdef : WriteRes<WriteFCvtF16ToI64, [SiFive7PipeB]>; 41906c3fb27SDimitry Andricdef : WriteRes<WriteFCvtF16ToF32, [SiFive7PipeB]>; 42006c3fb27SDimitry Andricdef : WriteRes<WriteFCvtF16ToF64, [SiFive7PipeB]>; 421e8d8bef9SDimitry Andricdef : WriteRes<WriteFCvtF32ToI32, [SiFive7PipeB]>; 422e8d8bef9SDimitry Andricdef : WriteRes<WriteFCvtF32ToI64, [SiFive7PipeB]>; 42306c3fb27SDimitry Andricdef : WriteRes<WriteFCvtF32ToF16, [SiFive7PipeB]>; 424e8d8bef9SDimitry Andricdef : WriteRes<WriteFCvtF32ToF64, [SiFive7PipeB]>; 425e8d8bef9SDimitry Andricdef : WriteRes<WriteFCvtF64ToI32, [SiFive7PipeB]>; 426e8d8bef9SDimitry Andricdef : WriteRes<WriteFCvtF64ToI64, [SiFive7PipeB]>; 42706c3fb27SDimitry Andricdef : WriteRes<WriteFCvtF64ToF16, [SiFive7PipeB]>; 428e8d8bef9SDimitry Andricdef : WriteRes<WriteFCvtF64ToF32, [SiFive7PipeB]>; 429e8d8bef9SDimitry Andric 43006c3fb27SDimitry Andricdef : WriteRes<WriteFClass16, [SiFive7PipeB]>; 431e8d8bef9SDimitry Andricdef : WriteRes<WriteFClass32, [SiFive7PipeB]>; 432e8d8bef9SDimitry Andricdef : WriteRes<WriteFClass64, [SiFive7PipeB]>; 43306c3fb27SDimitry Andricdef : WriteRes<WriteFCmp16, [SiFive7PipeB]>; 434e8d8bef9SDimitry Andricdef : WriteRes<WriteFCmp32, [SiFive7PipeB]>; 435e8d8bef9SDimitry Andricdef : WriteRes<WriteFCmp64, [SiFive7PipeB]>; 43606c3fb27SDimitry Andricdef : WriteRes<WriteFMovI16ToF16, [SiFive7PipeB]>; 43706c3fb27SDimitry Andricdef : WriteRes<WriteFMovF16ToI16, [SiFive7PipeB]>; 438e8d8bef9SDimitry Andricdef : WriteRes<WriteFMovI32ToF32, [SiFive7PipeB]>; 439e8d8bef9SDimitry Andricdef : WriteRes<WriteFMovF32ToI32, [SiFive7PipeB]>; 440e8d8bef9SDimitry Andricdef : WriteRes<WriteFMovI64ToF64, [SiFive7PipeB]>; 441e8d8bef9SDimitry Andricdef : WriteRes<WriteFMovF64ToI64, [SiFive7PipeB]>; 442e8d8bef9SDimitry Andric} 443e8d8bef9SDimitry Andric 44406c3fb27SDimitry Andric// 6. Configuration-Setting Instructions 44506c3fb27SDimitry Andriclet Latency = 3 in { 44606c3fb27SDimitry Andricdef : WriteRes<WriteVSETVLI, [SiFive7PipeA]>; 44706c3fb27SDimitry Andricdef : WriteRes<WriteVSETIVLI, [SiFive7PipeA]>; 44806c3fb27SDimitry Andricdef : WriteRes<WriteVSETVL, [SiFive7PipeA]>; 44906c3fb27SDimitry Andric} 45006c3fb27SDimitry Andric 45106c3fb27SDimitry Andric// 7. Vector Loads and Stores 45206c3fb27SDimitry Andric// Unit-stride loads and stores can operate at the full bandwidth of the memory 45306c3fb27SDimitry Andric// pipe. The memory pipe is DLEN bits wide on x280. 45406c3fb27SDimitry Andricforeach mx = SchedMxList in { 45506c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 45606c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 4575f757f3fSDimitry Andric let Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 4585f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDE", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 4595f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDFF", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 46006c3fb27SDimitry Andric } 4615f757f3fSDimitry Andric let Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in 4625f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTE", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 46306c3fb27SDimitry Andric} 46406c3fb27SDimitry Andric 46506c3fb27SDimitry Andricforeach mx = SchedMxList in { 46606c3fb27SDimitry Andric defvar Cycles = SiFive7GetMaskLoadStoreCycles<mx>.c; 46706c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 4685f757f3fSDimitry Andric let Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in 4695f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDM", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 4705f757f3fSDimitry Andric let Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in 4715f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTM", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 47206c3fb27SDimitry Andric} 47306c3fb27SDimitry Andric 47406c3fb27SDimitry Andric// Strided loads and stores operate at one element per cycle and should be 47506c3fb27SDimitry Andric// scheduled accordingly. Indexed loads and stores operate at one element per 47606c3fb27SDimitry Andric// cycle, and they stall the machine until all addresses have been generated, 47706c3fb27SDimitry Andric// so they cannot be scheduled. Indexed and strided loads and stores have LMUL 47806c3fb27SDimitry Andric// specific suffixes, but since SEW is already encoded in the name of the 47906c3fb27SDimitry Andric// resource, we do not need to use LMULSEWXXX constructors. However, we do 48006c3fb27SDimitry Andric// use the SEW from the name to determine the number of Cycles. 4815f757f3fSDimitry Andric 4825f757f3fSDimitry Andric// This predicate is true when the rs2 operand of vlse or vsse is x0, false 4835f757f3fSDimitry Andric// otherwise. 4845f757f3fSDimitry Andricdef VLDSX0Pred : MCSchedPredicate<CheckRegOperand<3, X0>>; 4855f757f3fSDimitry Andric 48606c3fb27SDimitry Andricforeach mx = SchedMxList in { 4875f757f3fSDimitry Andric defvar VLDSX0Cycles = SiFive7GetCyclesDefault<mx>.c; 48806c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesOnePerElement<mx, 8>.c; 48906c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 4905f757f3fSDimitry Andric defm SiFive7 : LMULWriteResMXVariant<"WriteVLDS8", VLDSX0Pred, [SiFive7VCQ, SiFive7VL], 4915f757f3fSDimitry Andric 4, [0, 1], [1, !add(1, VLDSX0Cycles)], !add(3, Cycles), 4925f757f3fSDimitry Andric [0, 1], [1, !add(1, Cycles)], mx, IsWorstCase>; 4935f757f3fSDimitry Andric let Latency = !add(3, Cycles), AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 4945f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDUX8", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 4955f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDOX8", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 49606c3fb27SDimitry Andric } 4975f757f3fSDimitry Andric let Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 4985f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTS8", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 4995f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTUX8", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 5005f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTOX8", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 50106c3fb27SDimitry Andric } 50206c3fb27SDimitry Andric} 5035f757f3fSDimitry Andric// TODO: The MxLists need to be filtered by EEW. We only need to support 5045f757f3fSDimitry Andric// LMUL >= SEW_min/ELEN. Here, the smallest EEW prevents us from having MF8 5055f757f3fSDimitry Andric// since LMUL >= 16/64. 5065f757f3fSDimitry Andricforeach mx = ["MF4", "MF2", "M1", "M2", "M4", "M8"] in { 5075f757f3fSDimitry Andric defvar VLDSX0Cycles = SiFive7GetCyclesDefault<mx>.c; 50806c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesOnePerElement<mx, 16>.c; 50906c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 5105f757f3fSDimitry Andric defm SiFive7 : LMULWriteResMXVariant<"WriteVLDS16", VLDSX0Pred, [SiFive7VCQ, SiFive7VL], 5115f757f3fSDimitry Andric 4, [0, 1], [1, !add(1, VLDSX0Cycles)], !add(3, Cycles), 5125f757f3fSDimitry Andric [0, 1], [1, !add(1, Cycles)], mx, IsWorstCase>; 5135f757f3fSDimitry Andric let Latency = !add(3, Cycles), AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 5145f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDUX16", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 5155f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDOX16", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 51606c3fb27SDimitry Andric } 5175f757f3fSDimitry Andric let Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 5185f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTS16", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 5195f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTUX16", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 5205f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTOX16", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 52106c3fb27SDimitry Andric } 52206c3fb27SDimitry Andric} 5235f757f3fSDimitry Andricforeach mx = ["MF2", "M1", "M2", "M4", "M8"] in { 5245f757f3fSDimitry Andric defvar VLDSX0Cycles = SiFive7GetCyclesDefault<mx>.c; 52506c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesOnePerElement<mx, 32>.c; 52606c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 5275f757f3fSDimitry Andric defm SiFive7 : LMULWriteResMXVariant<"WriteVLDS32", VLDSX0Pred, [SiFive7VCQ, SiFive7VL], 5285f757f3fSDimitry Andric 4, [0, 1], [1, !add(1, VLDSX0Cycles)], !add(3, Cycles), 5295f757f3fSDimitry Andric [0, 1], [1, !add(1, Cycles)], mx, IsWorstCase>; 5305f757f3fSDimitry Andric let Latency = !add(3, Cycles), AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 5315f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDUX32", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 5325f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDOX32", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 53306c3fb27SDimitry Andric } 5345f757f3fSDimitry Andric let Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 5355f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTS32", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 5365f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTUX32", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 5375f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTOX32", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 53806c3fb27SDimitry Andric } 53906c3fb27SDimitry Andric} 5405f757f3fSDimitry Andricforeach mx = ["M1", "M2", "M4", "M8"] in { 5415f757f3fSDimitry Andric defvar VLDSX0Cycles = SiFive7GetCyclesDefault<mx>.c; 54206c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesOnePerElement<mx, 64>.c; 54306c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 5445f757f3fSDimitry Andric defm SiFive7 : LMULWriteResMXVariant<"WriteVLDS64", VLDSX0Pred, [SiFive7VCQ, SiFive7VL], 5455f757f3fSDimitry Andric 4, [0, 1], [1, !add(1, VLDSX0Cycles)], !add(3, Cycles), 5465f757f3fSDimitry Andric [0, 1], [1, !add(1, Cycles)], mx, IsWorstCase>; 5475f757f3fSDimitry Andric let Latency = !add(3, Cycles), AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 5485f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDUX64", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 5495f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLDOX64", [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 55006c3fb27SDimitry Andric } 5515f757f3fSDimitry Andric let Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 5525f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTS64", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 5535f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTUX64", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 5545f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSTOX64", [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 55506c3fb27SDimitry Andric } 55606c3fb27SDimitry Andric} 55706c3fb27SDimitry Andric 55806c3fb27SDimitry Andric// VLD*R is LMUL aware 5595f757f3fSDimitry Andriclet Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 2)] in 5605f757f3fSDimitry Andric def : WriteRes<WriteVLD1R, [SiFive7VCQ, SiFive7VL]>; 5615f757f3fSDimitry Andriclet Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 4)] in 5625f757f3fSDimitry Andric def : WriteRes<WriteVLD2R, [SiFive7VCQ, SiFive7VL]>; 5635f757f3fSDimitry Andriclet Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 8)] in 5645f757f3fSDimitry Andric def : WriteRes<WriteVLD4R, [SiFive7VCQ, SiFive7VL]>; 5655f757f3fSDimitry Andriclet Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 16)] in 5665f757f3fSDimitry Andric def : WriteRes<WriteVLD8R, [SiFive7VCQ, SiFive7VL]>; 56706c3fb27SDimitry Andric// VST*R is LMUL aware 5685f757f3fSDimitry Andriclet Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 2)] in 5695f757f3fSDimitry Andric def : WriteRes<WriteVST1R, [SiFive7VCQ, SiFive7VS]>; 5705f757f3fSDimitry Andriclet Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 4)] in 5715f757f3fSDimitry Andric def : WriteRes<WriteVST2R, [SiFive7VCQ, SiFive7VS]>; 5725f757f3fSDimitry Andriclet Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 8)] in 5735f757f3fSDimitry Andric def : WriteRes<WriteVST4R, [SiFive7VCQ, SiFive7VS]>; 5745f757f3fSDimitry Andriclet Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 16)] in 5755f757f3fSDimitry Andric def : WriteRes<WriteVST8R, [SiFive7VCQ, SiFive7VS]>; 57606c3fb27SDimitry Andric 57706c3fb27SDimitry Andric// Segmented Loads and Stores 57806c3fb27SDimitry Andric// Unit-stride segmented loads and stores are effectively converted into strided 57906c3fb27SDimitry Andric// segment loads and stores. Strided segment loads and stores operate at up to 58006c3fb27SDimitry Andric// one segment per cycle if the segment fits within one aligned memory beat. 58106c3fb27SDimitry Andric// Indexed segment loads and stores operate at the same rate as strided ones, 58206c3fb27SDimitry Andric// but they stall the machine until all addresses have been generated. 58306c3fb27SDimitry Andricforeach mx = SchedMxList in { 58406c3fb27SDimitry Andric foreach eew = [8, 16, 32, 64] in { 58506c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesSegmentedSeg2<mx>.c; 58606c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 58706c3fb27SDimitry Andric // Does not chain so set latency high 5885f757f3fSDimitry Andric let Latency = !add(3, Cycles), AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 5895f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLSEG2e" # eew, [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 5905f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLSEGFF2e" # eew, [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 59106c3fb27SDimitry Andric } 5925f757f3fSDimitry Andric let Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in 5935f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSSEG2e" # eew, [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 59406c3fb27SDimitry Andric foreach nf=3-8 in { 59506c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesSegmented<mx, eew, nf>.c; 59606c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 59706c3fb27SDimitry Andric // Does not chain so set latency high 5985f757f3fSDimitry Andric let Latency = !add(3, Cycles), AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 5995f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLSEG" # nf # "e" # eew, [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 6005f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLSEGFF" # nf # "e" # eew, [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 60106c3fb27SDimitry Andric } 6025f757f3fSDimitry Andric let Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in 6035f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSSEG" # nf # "e" # eew, [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 60406c3fb27SDimitry Andric } 60506c3fb27SDimitry Andric } 60606c3fb27SDimitry Andric} 60706c3fb27SDimitry Andricforeach mx = SchedMxList in { 60806c3fb27SDimitry Andric foreach nf=2-8 in { 60906c3fb27SDimitry Andric foreach eew = [8, 16, 32, 64] in { 61006c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesSegmented<mx, eew, nf>.c; 61106c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 61206c3fb27SDimitry Andric // Does not chain so set latency high 6135f757f3fSDimitry Andric let Latency = !add(3, Cycles), AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 6145f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLSSEG" # nf # "e" # eew, [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 6155f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLUXSEG" # nf # "e" # eew, [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 6165f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVLOXSEG" # nf # "e" # eew, [SiFive7VCQ, SiFive7VL], mx, IsWorstCase>; 61706c3fb27SDimitry Andric } 6185f757f3fSDimitry Andric let Latency = 1, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 6195f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSSSEG" # nf # "e" # eew, [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 6205f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSUXSEG" # nf # "e" # eew, [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 6215f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSOXSEG" # nf # "e" # eew, [SiFive7VCQ, SiFive7VS], mx, IsWorstCase>; 62206c3fb27SDimitry Andric } 62306c3fb27SDimitry Andric } 62406c3fb27SDimitry Andric } 62506c3fb27SDimitry Andric} 62606c3fb27SDimitry Andric 62706c3fb27SDimitry Andric// 11. Vector Integer Arithmetic Instructions 62806c3fb27SDimitry Andricforeach mx = SchedMxList in { 62906c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 63006c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 6315f757f3fSDimitry Andric let Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 6325f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIALUV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6335f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIALUX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6345f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIALUI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6355f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVICALUV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6365f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVICALUX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6375f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVICALUI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6385f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVShiftV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6395f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVShiftX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6405f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVShiftI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6415f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMinMaxV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6425f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMinMaxX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6435f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMulV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6445f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMulX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6455f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMulAddV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6465f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMulAddX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6475f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMergeV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6485f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMergeX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6495f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMergeI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6505f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMovV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6515f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMovX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6525f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIMovI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 65306c3fb27SDimitry Andric } 65406c3fb27SDimitry Andric // Mask results can't chain. 6555f757f3fSDimitry Andric let Latency = !add(Cycles, 3), AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 6565f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVICmpV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6575f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVICmpX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6585f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVICmpI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 65906c3fb27SDimitry Andric } 66006c3fb27SDimitry Andric} 66106c3fb27SDimitry Andricforeach mx = SchedMxList in { 66206c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 66306c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 6645f757f3fSDimitry Andric let Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 6655f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVExtV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 66606c3fb27SDimitry Andric } 66706c3fb27SDimitry Andric} 66806c3fb27SDimitry Andricforeach mx = SchedMxList in { 66906c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx>.val in { 67006c3fb27SDimitry Andric defvar Cycles = !mul(SiFive7GetDivOrSqrtFactor<sew>.c, 67106c3fb27SDimitry Andric !div(SiFive7GetCyclesOnePerElement<mx, sew>.c, 4)); 67206c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxList>.c; 6735f757f3fSDimitry Andric let Latency = Cycles, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 6745f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVIDivV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 6755f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVIDivX", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 67606c3fb27SDimitry Andric } 67706c3fb27SDimitry Andric } 67806c3fb27SDimitry Andric} 67906c3fb27SDimitry Andric 68006c3fb27SDimitry Andric// Widening 68106c3fb27SDimitry Andricforeach mx = SchedMxListW in { 68206c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 68306c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxListW>.c; 6845f757f3fSDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 6855f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIWALUV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6865f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIWALUX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6875f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIWALUI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6885f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIWMulV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6895f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIWMulX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6905f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIWMulAddV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 6915f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVIWMulAddX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 69206c3fb27SDimitry Andric } 69306c3fb27SDimitry Andric} 69406c3fb27SDimitry Andric// Narrowing 69506c3fb27SDimitry Andricforeach mx = SchedMxListW in { 69606c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesNarrowing<mx>.c; 69706c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxListW>.c; 6985f757f3fSDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 6995f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVNShiftV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7005f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVNShiftX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7015f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVNShiftI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 70206c3fb27SDimitry Andric } 70306c3fb27SDimitry Andric} 70406c3fb27SDimitry Andric 70506c3fb27SDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions 70606c3fb27SDimitry Andricforeach mx = SchedMxList in { 70706c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 70806c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 7095f757f3fSDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 7105f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSALUV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7115f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSALUX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7125f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSALUI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7135f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVAALUV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7145f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVAALUX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7155f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSMulV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7165f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSMulX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7175f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSShiftV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7185f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSShiftX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7195f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVSShiftI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 72006c3fb27SDimitry Andric } 72106c3fb27SDimitry Andric} 72206c3fb27SDimitry Andric// Narrowing 72306c3fb27SDimitry Andricforeach mx = SchedMxListW in { 72406c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesNarrowing<mx>.c; 72506c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxListW>.c; 7265f757f3fSDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 7275f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVNClipV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7285f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVNClipX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7295f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVNClipI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 73006c3fb27SDimitry Andric } 73106c3fb27SDimitry Andric} 73206c3fb27SDimitry Andric 73306c3fb27SDimitry Andric// 13. Vector Floating-Point Instructions 734*0fca6ea1SDimitry Andricforeach mx = SchedMxListF in { 735*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, isF=1>.val in { 736*0fca6ea1SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 737*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxListF, isF=1>.c; 738*0fca6ea1SDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 739*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFALUV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 740*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFALUF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 741*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMulV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 742*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMulF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 743*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMulAddV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 744*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMulAddF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 745*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFRecpV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 746*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFCvtIToFV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 747*0fca6ea1SDimitry Andric } 748*0fca6ea1SDimitry Andric let Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 749*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMinMaxV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 750*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFMinMaxF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 751*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFSgnjV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 752*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFSgnjF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 753*0fca6ea1SDimitry Andric } 754*0fca6ea1SDimitry Andric } 755*0fca6ea1SDimitry Andric} 75606c3fb27SDimitry Andricforeach mx = SchedMxList in { 75706c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 75806c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 7595f757f3fSDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 7605f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVFCvtFToIV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 76106c3fb27SDimitry Andric } 7625f757f3fSDimitry Andric let Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 7635f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVFClassV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7645f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVFMergeV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7655f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVFMovV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 76606c3fb27SDimitry Andric } 76706c3fb27SDimitry Andric // Mask results can't chain. 7685f757f3fSDimitry Andric let Latency = !add(Cycles, 3), AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 7695f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVFCmpV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 7705f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVFCmpF", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 77106c3fb27SDimitry Andric } 77206c3fb27SDimitry Andric} 77306c3fb27SDimitry Andricforeach mx = SchedMxListF in { 77406c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx, isF=1>.val in { 77506c3fb27SDimitry Andric defvar Cycles = !mul(SiFive7GetDivOrSqrtFactor<sew>.c, 77606c3fb27SDimitry Andric !div(SiFive7GetCyclesOnePerElement<mx, sew>.c, 4)); 77706c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxListF, 1>.c; 7785f757f3fSDimitry Andric let Latency = Cycles, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 7795f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFSqrtV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 7805f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFDivV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 7815f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFDivF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 78206c3fb27SDimitry Andric } 78306c3fb27SDimitry Andric } 78406c3fb27SDimitry Andric} 78506c3fb27SDimitry Andric 78606c3fb27SDimitry Andric// Widening 78706c3fb27SDimitry Andricforeach mx = SchedMxListW in { 788*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, isF=0, isWidening=1>.val in { 78906c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 790*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxListW>.c; 791*0fca6ea1SDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in 792*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtIToFV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 79306c3fb27SDimitry Andric } 79406c3fb27SDimitry Andric} 79506c3fb27SDimitry Andricforeach mx = SchedMxListFW in { 796*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, isF=1, isWidening=1>.val in { 797*0fca6ea1SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 798*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxListFW, isF=1>.c; 799*0fca6ea1SDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 800*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWALUV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 801*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWALUF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 802*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 803*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 804*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulAddV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 805*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulAddF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 806*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtFToFV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 807*0fca6ea1SDimitry Andric } 808*0fca6ea1SDimitry Andric } 80906c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 81006c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxListFW>.c; 811*0fca6ea1SDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in 8125f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVFWCvtFToIV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 81306c3fb27SDimitry Andric} 81406c3fb27SDimitry Andric// Narrowing 81506c3fb27SDimitry Andricforeach mx = SchedMxListW in { 81606c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesNarrowing<mx>.c; 81706c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxListW>.c; 8185f757f3fSDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 8195f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVFNCvtFToIV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 82006c3fb27SDimitry Andric } 82106c3fb27SDimitry Andric} 82206c3fb27SDimitry Andricforeach mx = SchedMxListFW in { 823*0fca6ea1SDimitry Andric foreach sew = SchedSEWSet<mx, isF=1, isWidening=1>.val in { 82406c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesNarrowing<mx>.c; 825*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxListFW, isF=1>.c; 8265f757f3fSDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 827*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFNCvtIToFV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 828*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFNCvtFToFV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 829*0fca6ea1SDimitry Andric } 83006c3fb27SDimitry Andric } 83106c3fb27SDimitry Andric} 83206c3fb27SDimitry Andric 83306c3fb27SDimitry Andric// 14. Vector Reduction Operations 83406c3fb27SDimitry Andricforeach mx = SchedMxList in { 83506c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx>.val in { 83606c3fb27SDimitry Andric defvar Cycles = SiFive7GetReductionCycles<mx, sew>.c; 83706c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxList>.c; 8385f757f3fSDimitry Andric let Latency = Cycles, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 8395f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVIRedV_From", [SiFive7VCQ, SiFive7VA], 84006c3fb27SDimitry Andric mx, sew, IsWorstCase>; 8415f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVIRedMinMaxV_From", [SiFive7VCQ, SiFive7VA], 84206c3fb27SDimitry Andric mx, sew, IsWorstCase>; 84306c3fb27SDimitry Andric } 84406c3fb27SDimitry Andric } 8455f757f3fSDimitry Andric} 84606c3fb27SDimitry Andric 84706c3fb27SDimitry Andricforeach mx = SchedMxListWRed in { 84806c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx, 0, 1>.val in { 84906c3fb27SDimitry Andric defvar Cycles = SiFive7GetReductionCycles<mx, sew>.c; 85006c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxListWRed>.c; 8515f757f3fSDimitry Andric let Latency = Cycles, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in 8525f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVIWRedV_From", [SiFive7VCQ, SiFive7VA], 85306c3fb27SDimitry Andric mx, sew, IsWorstCase>; 85406c3fb27SDimitry Andric } 85506c3fb27SDimitry Andric} 85606c3fb27SDimitry Andric 85706c3fb27SDimitry Andricforeach mx = SchedMxListF in { 85806c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx, 1>.val in { 85906c3fb27SDimitry Andric defvar RedCycles = SiFive7GetReductionCycles<mx, sew>.c; 86006c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxListF, 1>.c; 8615f757f3fSDimitry Andric let Latency = RedCycles, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, RedCycles)] in { 8625f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFRedV_From", [SiFive7VCQ, SiFive7VA], 86306c3fb27SDimitry Andric mx, sew, IsWorstCase>; 8645f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFRedMinMaxV_From", [SiFive7VCQ, SiFive7VA], 86506c3fb27SDimitry Andric mx, sew, IsWorstCase>; 86606c3fb27SDimitry Andric } 86706c3fb27SDimitry Andric defvar OrdRedCycles = SiFive7GetOrderedReductionCycles<mx, sew>.c; 8685f757f3fSDimitry Andric let Latency = OrdRedCycles, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, OrdRedCycles)] in 8695f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFRedOV_From", [SiFive7VCQ, SiFive7VA], 87006c3fb27SDimitry Andric mx, sew, IsWorstCase>; 87106c3fb27SDimitry Andric } 87206c3fb27SDimitry Andric} 87306c3fb27SDimitry Andric 87406c3fb27SDimitry Andricforeach mx = SchedMxListFWRed in { 87506c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx, 1, 1>.val in { 87606c3fb27SDimitry Andric defvar RedCycles = SiFive7GetReductionCycles<mx, sew>.c; 87706c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxListFWRed, 1>.c; 8785f757f3fSDimitry Andric let Latency = RedCycles, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, RedCycles)] in 8795f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWRedV_From", [SiFive7VCQ, SiFive7VA], 88006c3fb27SDimitry Andric mx, sew, IsWorstCase>; 88106c3fb27SDimitry Andric defvar OrdRedCycles = SiFive7GetOrderedReductionCycles<mx, sew>.c; 8825f757f3fSDimitry Andric let Latency = OrdRedCycles, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, OrdRedCycles)] in 8835f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVFWRedOV_From", [SiFive7VCQ, SiFive7VA], 88406c3fb27SDimitry Andric mx, sew, IsWorstCase>; 88506c3fb27SDimitry Andric } 88606c3fb27SDimitry Andric} 88706c3fb27SDimitry Andric 88806c3fb27SDimitry Andric// 15. Vector Mask Instructions 88906c3fb27SDimitry Andricforeach mx = SchedMxList in { 89006c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesVMask<mx>.c; 89106c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 8925f757f3fSDimitry Andric let Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 8935f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVMALUV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 8945f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVMPopV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 8955f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVMFFSV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 8965f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVMSFSV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 89706c3fb27SDimitry Andric } 89806c3fb27SDimitry Andric} 89906c3fb27SDimitry Andricforeach mx = SchedMxList in { 90006c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 90106c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 9025f757f3fSDimitry Andric let Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 903*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIotaV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 904*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVIdxV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 90506c3fb27SDimitry Andric } 90606c3fb27SDimitry Andric} 90706c3fb27SDimitry Andric 90806c3fb27SDimitry Andric// 16. Vector Permutation Instructions 9095f757f3fSDimitry Andriclet Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 1)] in { 910*0fca6ea1SDimitry Andric def : WriteRes<WriteVMovSX, [SiFive7VCQ, SiFive7VA]>; 911*0fca6ea1SDimitry Andric def : WriteRes<WriteVMovXS, [SiFive7VCQ, SiFive7VA]>; 912*0fca6ea1SDimitry Andric def : WriteRes<WriteVMovSF, [SiFive7VCQ, SiFive7VA]>; 913*0fca6ea1SDimitry Andric def : WriteRes<WriteVMovFS, [SiFive7VCQ, SiFive7VA]>; 91406c3fb27SDimitry Andric} 91506c3fb27SDimitry Andricforeach mx = SchedMxList in { 91606c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 91706c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 9185f757f3fSDimitry Andric let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 9195f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVRGatherVX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 9205f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVRGatherVI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 92106c3fb27SDimitry Andric } 92206c3fb27SDimitry Andric} 92306c3fb27SDimitry Andric 92406c3fb27SDimitry Andricforeach mx = SchedMxList in { 92506c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx>.val in { 92606c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesOnePerElement<mx, sew>.c; 92706c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxList>.c; 9285f757f3fSDimitry Andric let Latency = !add(Cycles, 3), AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 9295f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVRGatherVV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 930*0fca6ea1SDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVRGatherEI16VV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 9315f757f3fSDimitry Andric defm "" : LMULSEWWriteResMXSEW<"WriteVCompressV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>; 93206c3fb27SDimitry Andric } 93306c3fb27SDimitry Andric } 93406c3fb27SDimitry Andric} 93506c3fb27SDimitry Andric 93606c3fb27SDimitry Andricforeach mx = SchedMxList in { 93706c3fb27SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 93806c3fb27SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 9395f757f3fSDimitry Andric let Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in { 940*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSlideUpX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 941*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSlideDownX", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 942*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVSlideI", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 9435f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVISlide1X", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 9445f757f3fSDimitry Andric defm "" : LMULWriteResMX<"WriteVFSlide1F", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 94506c3fb27SDimitry Andric } 94606c3fb27SDimitry Andric} 94706c3fb27SDimitry Andric 94806c3fb27SDimitry Andric// VMov*V is LMUL Aware 9495f757f3fSDimitry Andriclet Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 2)] in 9505f757f3fSDimitry Andric def : WriteRes<WriteVMov1V, [SiFive7VCQ, SiFive7VA]>; 9515f757f3fSDimitry Andriclet Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 4)] in 9525f757f3fSDimitry Andric def : WriteRes<WriteVMov2V, [SiFive7VCQ, SiFive7VA]>; 9535f757f3fSDimitry Andriclet Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 8)] in 9545f757f3fSDimitry Andric def : WriteRes<WriteVMov4V, [SiFive7VCQ, SiFive7VA]>; 9555f757f3fSDimitry Andriclet Latency = 4, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, 16)] in 9565f757f3fSDimitry Andric def : WriteRes<WriteVMov8V, [SiFive7VCQ, SiFive7VA]>; 95706c3fb27SDimitry Andric 958e8d8bef9SDimitry Andric// Others 959e8d8bef9SDimitry Andricdef : WriteRes<WriteCSR, [SiFive7PipeB]>; 960e8d8bef9SDimitry Andricdef : WriteRes<WriteNop, []>; 96106c3fb27SDimitry Andriclet Latency = 3 in 96206c3fb27SDimitry Andric def : WriteRes<WriteRdVLENB, [SiFive7PipeB]>; 963e8d8bef9SDimitry Andric 964e8d8bef9SDimitry Andricdef : InstRW<[WriteIALU], (instrs COPY)>; 965e8d8bef9SDimitry Andric 966*0fca6ea1SDimitry Andric// VCIX 967*0fca6ea1SDimitry Andric// 968*0fca6ea1SDimitry Andric// In principle we don't know the latency of any VCIX instructions. But instead 969*0fca6ea1SDimitry Andric// of taking the default of 1, which can lead to issues [1], we assume that they 970*0fca6ea1SDimitry Andric// have a fairly high latency. 971*0fca6ea1SDimitry Andric// 972*0fca6ea1SDimitry Andric// [1] https://github.com/llvm/llvm-project/issues/83391 973*0fca6ea1SDimitry Andricforeach mx = SchedMxList in { 974*0fca6ea1SDimitry Andric defvar Cycles = SiFive7GetCyclesDefault<mx>.c; 975*0fca6ea1SDimitry Andric defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxList>.c; 976*0fca6ea1SDimitry Andric let Latency = !mul(Cycles, 10), 977*0fca6ea1SDimitry Andric AcquireAtCycles = [0, 1], 978*0fca6ea1SDimitry Andric ReleaseAtCycles = [1, !add(1, Cycles)] in { 979*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_I", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 980*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_X", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 981*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_IV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 982*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_VV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 983*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_XV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 984*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_IVV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 985*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_IVW", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 986*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_VVV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 987*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_VVW", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 988*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_XVV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 989*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_XVW", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 990*0fca6ea1SDimitry Andric foreach f = ["FPR16", "FPR32", "FPR64"] in { 991*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_" # f # "V", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 992*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_" # f # "VV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 993*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_V_" # f # "VW", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 994*0fca6ea1SDimitry Andric } 995*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_I", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 996*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_X", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 997*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_IV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 998*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_VV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 999*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_XV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 1000*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_IVV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 1001*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_IVW", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 1002*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_VVV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 1003*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_VVW", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 1004*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_XVV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 1005*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_XVW", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 1006*0fca6ea1SDimitry Andric foreach f = ["FPR16", "FPR32", "FPR64"] in { 1007*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_" # f # "V", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 1008*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_" # f # "VV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 1009*0fca6ea1SDimitry Andric defm "" : LMULWriteResMX<"WriteVC_" # f # "VW", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>; 1010*0fca6ea1SDimitry Andric } 1011*0fca6ea1SDimitry Andric } 1012*0fca6ea1SDimitry Andric} 1013*0fca6ea1SDimitry Andric 1014e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===// 101506c3fb27SDimitry Andric 1016e8d8bef9SDimitry Andric// Bypass and advance 101706c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadJmp>; 101806c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadJalr>; 1019e8d8bef9SDimitry Andricdef : ReadAdvance<ReadCSR, 0>; 1020*0fca6ea1SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadStoreData>; 1021e8d8bef9SDimitry Andricdef : ReadAdvance<ReadMemBase, 0>; 102206c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadIALU>; 102306c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadIALU32>; 102406c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadShiftImm>; 102506c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadShiftImm32>; 102606c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadShiftReg>; 102706c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadShiftReg32>; 1028e8d8bef9SDimitry Andricdef : ReadAdvance<ReadIDiv, 0>; 1029e8d8bef9SDimitry Andricdef : ReadAdvance<ReadIDiv32, 0>; 1030*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIRem, 0>; 1031*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIRem32, 0>; 1032e8d8bef9SDimitry Andricdef : ReadAdvance<ReadIMul, 0>; 1033e8d8bef9SDimitry Andricdef : ReadAdvance<ReadIMul32, 0>; 1034e8d8bef9SDimitry Andricdef : ReadAdvance<ReadAtomicWA, 0>; 1035e8d8bef9SDimitry Andricdef : ReadAdvance<ReadAtomicWD, 0>; 1036e8d8bef9SDimitry Andricdef : ReadAdvance<ReadAtomicDA, 0>; 1037e8d8bef9SDimitry Andricdef : ReadAdvance<ReadAtomicDD, 0>; 1038e8d8bef9SDimitry Andricdef : ReadAdvance<ReadAtomicLDW, 0>; 1039e8d8bef9SDimitry Andricdef : ReadAdvance<ReadAtomicLDD, 0>; 1040e8d8bef9SDimitry Andricdef : ReadAdvance<ReadAtomicSTW, 0>; 1041e8d8bef9SDimitry Andricdef : ReadAdvance<ReadAtomicSTD, 0>; 1042bdd1243dSDimitry Andricdef : ReadAdvance<ReadFStoreData, 0>; 1043e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFMemBase, 0>; 104406c3fb27SDimitry Andricdef : ReadAdvance<ReadFAdd16, 0>; 1045bdd1243dSDimitry Andricdef : ReadAdvance<ReadFAdd32, 0>; 1046bdd1243dSDimitry Andricdef : ReadAdvance<ReadFAdd64, 0>; 104706c3fb27SDimitry Andricdef : ReadAdvance<ReadFMul16, 0>; 104806c3fb27SDimitry Andricdef : ReadAdvance<ReadFMA16, 0>; 10495f757f3fSDimitry Andricdef : ReadAdvance<ReadFMA16Addend, 0>; 1050e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFMul32, 0>; 1051e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFMul64, 0>; 1052bdd1243dSDimitry Andricdef : ReadAdvance<ReadFMA32, 0>; 10535f757f3fSDimitry Andricdef : ReadAdvance<ReadFMA32Addend, 0>; 1054fe6060f1SDimitry Andricdef : ReadAdvance<ReadFMA64, 0>; 10555f757f3fSDimitry Andricdef : ReadAdvance<ReadFMA64Addend, 0>; 105606c3fb27SDimitry Andricdef : ReadAdvance<ReadFDiv16, 0>; 1057e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFDiv32, 0>; 1058e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFDiv64, 0>; 105906c3fb27SDimitry Andricdef : ReadAdvance<ReadFSqrt16, 0>; 1060e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFSqrt32, 0>; 1061e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFSqrt64, 0>; 106206c3fb27SDimitry Andricdef : ReadAdvance<ReadFCmp16, 0>; 1063e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCmp32, 0>; 1064e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCmp64, 0>; 106506c3fb27SDimitry Andricdef : ReadAdvance<ReadFSGNJ16, 0>; 1066e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFSGNJ32, 0>; 1067e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFSGNJ64, 0>; 106806c3fb27SDimitry Andricdef : ReadAdvance<ReadFMinMax16, 0>; 1069e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFMinMax32, 0>; 1070e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFMinMax64, 0>; 107106c3fb27SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToI32, 0>; 107206c3fb27SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToI64, 0>; 1073e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToI32, 0>; 1074e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToI64, 0>; 1075e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToI32, 0>; 1076e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToI64, 0>; 107706c3fb27SDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF16, 0>; 1078e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF32, 0>; 1079e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCvtI32ToF64, 0>; 108006c3fb27SDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF16, 0>; 1081e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF32, 0>; 1082e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCvtI64ToF64, 0>; 1083e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToF64, 0>; 1084e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToF32, 0>; 108506c3fb27SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToF32, 0>; 108606c3fb27SDimitry Andricdef : ReadAdvance<ReadFCvtF32ToF16, 0>; 108706c3fb27SDimitry Andricdef : ReadAdvance<ReadFCvtF16ToF64, 0>; 108806c3fb27SDimitry Andricdef : ReadAdvance<ReadFCvtF64ToF16, 0>; 108906c3fb27SDimitry Andricdef : ReadAdvance<ReadFMovF16ToI16, 0>; 109006c3fb27SDimitry Andricdef : ReadAdvance<ReadFMovI16ToF16, 0>; 1091e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFMovF32ToI32, 0>; 1092e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFMovI32ToF32, 0>; 1093e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFMovF64ToI64, 0>; 1094e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFMovI64ToF64, 0>; 109506c3fb27SDimitry Andricdef : ReadAdvance<ReadFClass16, 0>; 1096e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFClass32, 0>; 1097e8d8bef9SDimitry Andricdef : ReadAdvance<ReadFClass64, 0>; 1098fe6060f1SDimitry Andric 109906c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadSFBJmp, 0>; 110006c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadSFBALU, 0>; 110106c3fb27SDimitry Andric 110206c3fb27SDimitry Andric// Bitmanip 110306c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadRotateImm>; 110406c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadRotateImm32>; 110506c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadRotateReg>; 110606c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadRotateReg32>; 110706c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadCLZ>; 110806c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadCLZ32>; 110906c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadCTZ>; 111006c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadCTZ32>; 111106c3fb27SDimitry Andricdef : ReadAdvance<ReadCPOP, 0>; 111206c3fb27SDimitry Andricdef : ReadAdvance<ReadCPOP32, 0>; 111306c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadORCB>; 1114*0fca6ea1SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadIMinMax>; 111506c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadREV8>; 111606c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadSHXADD>; 111706c3fb27SDimitry Andricdef : SiFive7AnyToGPRBypass<ReadSHXADD32>; 11185f757f3fSDimitry Andric// Single-bit instructions 11195f757f3fSDimitry Andricdef : SiFive7AnyToGPRBypass<ReadSingleBit>; 11205f757f3fSDimitry Andricdef : SiFive7AnyToGPRBypass<ReadSingleBitImm>; 112106c3fb27SDimitry Andric 112206c3fb27SDimitry Andric// 6. Configuration-Setting Instructions 112306c3fb27SDimitry Andricdef : ReadAdvance<ReadVSETVLI, 2>; 112406c3fb27SDimitry Andricdef : ReadAdvance<ReadVSETVL, 2>; 112506c3fb27SDimitry Andric 112606c3fb27SDimitry Andric// 7. Vector Loads and Stores 112706c3fb27SDimitry Andricdef : ReadAdvance<ReadVLDX, 0>; 112806c3fb27SDimitry Andricdef : ReadAdvance<ReadVSTX, 0>; 112906c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTEV", 0>; 113006c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTM", 0>; 113106c3fb27SDimitry Andricdef : ReadAdvance<ReadVLDSX, 0>; 113206c3fb27SDimitry Andricdef : ReadAdvance<ReadVSTSX, 0>; 113306c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS8V", 0>; 113406c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS16V", 0>; 113506c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS32V", 0>; 113606c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS64V", 0>; 113706c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVLDUXV", 0>; 113806c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVLDOXV", 0>; 113906c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX8", 0>; 114006c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX16", 0>; 114106c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX32", 0>; 114206c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX64", 0>; 114306c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUXV", 0>; 114406c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX8V", 0>; 114506c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX16V", 0>; 114606c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX32V", 0>; 114706c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX64V", 0>; 114806c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX8", 0>; 114906c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX16", 0>; 115006c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX32", 0>; 115106c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX64", 0>; 115206c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOXV", 0>; 115306c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX8V", 0>; 115406c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX16V", 0>; 115506c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX32V", 0>; 115606c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX64V", 0>; 115706c3fb27SDimitry Andric// LMUL Aware 115806c3fb27SDimitry Andricdef : ReadAdvance<ReadVST1R, 0>; 115906c3fb27SDimitry Andricdef : ReadAdvance<ReadVST2R, 0>; 116006c3fb27SDimitry Andricdef : ReadAdvance<ReadVST4R, 0>; 116106c3fb27SDimitry Andricdef : ReadAdvance<ReadVST8R, 0>; 116206c3fb27SDimitry Andric 116306c3fb27SDimitry Andric// 12. Vector Integer Arithmetic Instructions 116406c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIALUV", 0>; 116506c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIALUX", 0>; 116606c3fb27SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWALUV", 0>; 116706c3fb27SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWALUX", 0>; 116806c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVExtV", 0>; 116906c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVICALUV", 0>; 117006c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVICALUX", 0>; 117106c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVShiftV", 0>; 117206c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVShiftX", 0>; 117306c3fb27SDimitry Andricdefm : LMULReadAdvanceW<"ReadVNShiftV", 0>; 117406c3fb27SDimitry Andricdefm : LMULReadAdvanceW<"ReadVNShiftX", 0>; 117506c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVICmpV", 0>; 117606c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVICmpX", 0>; 117706c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIMinMaxV", 0>; 117806c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIMinMaxX", 0>; 117906c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulV", 0>; 118006c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulX", 0>; 118106c3fb27SDimitry Andricdefm : LMULSEWReadAdvance<"ReadVIDivV", 0>; 118206c3fb27SDimitry Andricdefm : LMULSEWReadAdvance<"ReadVIDivX", 0>; 118306c3fb27SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulV", 0>; 118406c3fb27SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulX", 0>; 118506c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulAddV", 0>; 118606c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIMulAddX", 0>; 118706c3fb27SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulAddV", 0>; 118806c3fb27SDimitry Andricdefm : LMULReadAdvanceW<"ReadVIWMulAddX", 0>; 118906c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIMergeV", 0>; 119006c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIMergeX", 0>; 119106c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIMovV", 0>; 119206c3fb27SDimitry Andricdefm : LMULReadAdvance<"ReadVIMovX", 0>; 119306c3fb27SDimitry Andric 119406c3fb27SDimitry Andric// 13. Vector Fixed-Point Arithmetic Instructions 119506c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSALUV", 0>; 119606c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSALUX", 0>; 119706c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAALUV", 0>; 119806c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVAALUX", 0>; 119906c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSMulV", 0>; 120006c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSMulX", 0>; 120106c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSShiftV", 0>; 120206c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVSShiftX", 0>; 120306c3fb27SDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNClipV", 0>; 120406c3fb27SDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNClipX", 0>; 120506c3fb27SDimitry Andric 120606c3fb27SDimitry Andric// 14. Vector Floating-Point Instructions 1207*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFALUV", 0>; 1208*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFALUF", 0>; 1209*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWALUV", 0>; 1210*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWALUF", 0>; 1211*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulV", 0>; 1212*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulF", 0>; 121306c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFDivV", 0>; 121406c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFDivF", 0>; 1215*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulV", 0>; 1216*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulF", 0>; 1217*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulAddV", 0>; 1218*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulAddF", 0>; 1219*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulAddV", 0>; 1220*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulAddF", 0>; 122106c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSqrtV", 0>; 1222*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFRecpV", 0>; 1223*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMinMaxV", 0>; 1224*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMinMaxF", 0>; 1225*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSgnjV", 0>; 1226*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSgnjF", 0>; 122706c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCmpV", 0>; 122806c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCmpF", 0>; 122906c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFClassV", 0>; 123006c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMergeV", 0>; 123106c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMergeF", 0>; 123206c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMovF", 0>; 1233*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFCvtIToFV", 0>; 123406c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCvtFToIV", 0>; 1235*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceW<"ReadVFWCvtIToFV", 0>; 123606c3fb27SDimitry Andricdefm "" : LMULReadAdvanceFW<"ReadVFWCvtFToIV", 0>; 1237*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWCvtFToFV", 0>; 1238*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFNCvtIToFV", 0>; 123906c3fb27SDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVFNCvtFToIV", 0>; 1240*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFNCvtFToFV", 0>; 124106c3fb27SDimitry Andric 124206c3fb27SDimitry Andric// 15. Vector Reduction Operations 124306c3fb27SDimitry Andricdef : ReadAdvance<ReadVIRedV, 0>; 124406c3fb27SDimitry Andricdef : ReadAdvance<ReadVIRedV0, 0>; 124506c3fb27SDimitry Andricdef : ReadAdvance<ReadVIWRedV, 0>; 124606c3fb27SDimitry Andricdef : ReadAdvance<ReadVIWRedV0, 0>; 124706c3fb27SDimitry Andricdef : ReadAdvance<ReadVFRedV, 0>; 124806c3fb27SDimitry Andricdef : ReadAdvance<ReadVFRedV0, 0>; 124906c3fb27SDimitry Andricdef : ReadAdvance<ReadVFRedOV, 0>; 125006c3fb27SDimitry Andricdef : ReadAdvance<ReadVFRedOV0, 0>; 125106c3fb27SDimitry Andricdef : ReadAdvance<ReadVFWRedV, 0>; 125206c3fb27SDimitry Andricdef : ReadAdvance<ReadVFWRedV0, 0>; 125306c3fb27SDimitry Andricdef : ReadAdvance<ReadVFWRedOV, 0>; 125406c3fb27SDimitry Andricdef : ReadAdvance<ReadVFWRedOV0, 0>; 125506c3fb27SDimitry Andric 125606c3fb27SDimitry Andric// 16. Vector Mask Instructions 125706c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMALUV", 0>; 125806c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMPopV", 0>; 125906c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMFFSV", 0>; 126006c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVMSFSV", 0>; 1261*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVIotaV", 0>; 126206c3fb27SDimitry Andric 126306c3fb27SDimitry Andric// 17. Vector Permutation Instructions 1264*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovXS, 0>; 1265*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSX_V, 0>; 1266*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSX_X, 0>; 1267*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovFS, 0>; 1268*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSF_V, 0>; 1269*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSF_F, 0>; 127006c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVISlideV", 0>; 127106c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVISlideX", 0>; 127206c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFSlideV", 0>; 127306c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFSlideF", 0>; 127406c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherVV_data", 0>; 127506c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherVV_index", 0>; 1276*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherEI16VV_data", 0>; 1277*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherEI16VV_index", 0>; 127806c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVX_data", 0>; 127906c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVX_index", 0>; 128006c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVI_data", 0>; 128106c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVCompressV", 0>; 128206c3fb27SDimitry Andric// LMUL Aware 128306c3fb27SDimitry Andricdef : ReadAdvance<ReadVMov1V, 0>; 128406c3fb27SDimitry Andricdef : ReadAdvance<ReadVMov2V, 0>; 128506c3fb27SDimitry Andricdef : ReadAdvance<ReadVMov4V, 0>; 128606c3fb27SDimitry Andricdef : ReadAdvance<ReadVMov8V, 0>; 128706c3fb27SDimitry Andric 128806c3fb27SDimitry Andric// Others 128906c3fb27SDimitry Andricdef : ReadAdvance<ReadVMask, 0>; 12905f757f3fSDimitry Andricdef : ReadAdvance<ReadVMergeOp_WorstCase, 0>; 12915f757f3fSDimitry Andricforeach mx = SchedMxList in { 12925f757f3fSDimitry Andric def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx), 0>; 12935f757f3fSDimitry Andric foreach sew = SchedSEWSet<mx>.val in 12945f757f3fSDimitry Andric def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx # "_E" # sew), 0>; 12955f757f3fSDimitry Andric} 1296bdd1243dSDimitry Andric 12976e75b2fbSDimitry Andric//===----------------------------------------------------------------------===// 12986e75b2fbSDimitry Andric// Unsupported extensions 1299*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZabha; 130004eeddc0SDimitry Andricdefm : UnsupportedSchedZbc; 1301bdd1243dSDimitry Andricdefm : UnsupportedSchedZbkb; 1302bdd1243dSDimitry Andricdefm : UnsupportedSchedZbkx; 130306c3fb27SDimitry Andricdefm : UnsupportedSchedZfa; 1304*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZvk; 1305e8d8bef9SDimitry Andric} 1306