106c3fb27SDimitry Andric//===- RISCVScheduleV.td - RISC-V Scheduling Definitions V -*- tablegen -*-===// 26e75b2fbSDimitry Andric// 36e75b2fbSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 46e75b2fbSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 56e75b2fbSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 66e75b2fbSDimitry Andric// 76e75b2fbSDimitry Andric//===----------------------------------------------------------------------===// 86e75b2fbSDimitry Andric 96e75b2fbSDimitry Andric//===----------------------------------------------------------------------===// 106e75b2fbSDimitry Andric/// Define scheduler resources associated with def operands. 116e75b2fbSDimitry Andric 1206c3fb27SDimitry Andricdefvar SchedMxList = ["MF8", "MF4", "MF2", "M1", "M2", "M4", "M8"]; 13bdd1243dSDimitry Andric// Used for widening and narrowing instructions as it doesn't contain M8. 1406c3fb27SDimitry Andricdefvar SchedMxListW = !listremove(SchedMxList, ["M8"]); 1506c3fb27SDimitry Andric// Used for widening reductions, which does contain M8. 1606c3fb27SDimitry Andricdefvar SchedMxListWRed = SchedMxList; 1706c3fb27SDimitry Andricdefvar SchedMxListFW = !listremove(SchedMxList, ["M8", "MF8"]); 1806c3fb27SDimitry Andric// Used for floating-point as it doesn't contain MF8. 1906c3fb27SDimitry Andricdefvar SchedMxListF = !listremove(SchedMxList, ["MF8"]); 2006c3fb27SDimitry Andric// Used for widening floating-point Reduction as it doesn't contain MF8. 2106c3fb27SDimitry Andricdefvar SchedMxListFWRed = SchedMxListF; 22bdd1243dSDimitry Andric 2306c3fb27SDimitry Andricclass SchedSEWSet<string mx, bit isF = 0, bit isWidening = 0> { 2406c3fb27SDimitry Andric assert !or(!not(isF), !ne(mx, "MF8")), "LMUL shouldn't be MF8 for floating-point"; 2506c3fb27SDimitry Andric defvar t = !cond(!eq(mx, "M1"): [8, 16, 32, 64], 2606c3fb27SDimitry Andric !eq(mx, "M2"): [8, 16, 32, 64], 2706c3fb27SDimitry Andric !eq(mx, "M4"): [8, 16, 32, 64], 2806c3fb27SDimitry Andric !eq(mx, "M8"): [8, 16, 32, 64], 2906c3fb27SDimitry Andric !eq(mx, "MF2"): [8, 16, 32], 3006c3fb27SDimitry Andric !eq(mx, "MF4"): [8, 16], 3106c3fb27SDimitry Andric !eq(mx, "MF8"): [8]); 3206c3fb27SDimitry Andric // For floating-point instructions, SEW won't be 8. 3306c3fb27SDimitry Andric defvar remove8 = !if(isF, !listremove(t, [8]), t); 3406c3fb27SDimitry Andric // For widening instructions, SEW will not be 64. 3506c3fb27SDimitry Andric defvar remove64 = !if(isWidening, !listremove(remove8, [64]), remove8); 3606c3fb27SDimitry Andric list<int> val = remove64; 3706c3fb27SDimitry Andric} 3806c3fb27SDimitry Andric 3906c3fb27SDimitry Andric// Helper function to get the largest LMUL from MxList 4006c3fb27SDimitry Andric// Precondition: MxList is sorted in ascending LMUL order. 4106c3fb27SDimitry Andricclass LargestLMUL<list<string> MxList> { 4206c3fb27SDimitry Andric // MX list is sorted from smallest to largest 4306c3fb27SDimitry Andric string r = !foldl(!head(MxList), MxList, last, curr, curr); 4406c3fb27SDimitry Andric} 4506c3fb27SDimitry Andric// Helper function to get the smallest SEW that can be used with LMUL mx 4606c3fb27SDimitry Andric// Precondition: MxList is sorted in ascending LMUL order and SchedSEWSet<mx> 4706c3fb27SDimitry Andricclass SmallestSEW<string mx, bit isF = 0> { 4806c3fb27SDimitry Andric int r = !head(SchedSEWSet<mx, isF>.val); 4906c3fb27SDimitry Andric} 5006c3fb27SDimitry Andric 5106c3fb27SDimitry Andric// Creates WriteRes for (name, mx, resources) tuple 5206c3fb27SDimitry Andricmulticlass LMULWriteResMX<string name, list<ProcResourceKind> resources, 5306c3fb27SDimitry Andric string mx, bit IsWorstCase> { 5406c3fb27SDimitry Andric def : WriteRes<!cast<SchedWrite>(name # "_" # mx), resources>; 5506c3fb27SDimitry Andric if IsWorstCase then 5606c3fb27SDimitry Andric def : WriteRes<!cast<SchedWrite>(name # "_WorstCase"), resources>; 5706c3fb27SDimitry Andric} 5806c3fb27SDimitry Andricmulticlass LMULSEWWriteResMXSEW<string name, list<ProcResourceKind> resources, 5906c3fb27SDimitry Andric string mx, int sew, bit IsWorstCase> { 6006c3fb27SDimitry Andric def : WriteRes<!cast<SchedWrite>(name # "_" # mx # "_E" # sew), resources>; 6106c3fb27SDimitry Andric if IsWorstCase then 6206c3fb27SDimitry Andric def : WriteRes<!cast<SchedWrite>(name # "_WorstCase"), resources>; 6306c3fb27SDimitry Andric} 6406c3fb27SDimitry Andric 655f757f3fSDimitry Andric// Define a SchedAlias for the SchedWrite associated with (name, mx) whose 665f757f3fSDimitry Andric// behavior is aliased to a Variant. The Variant has Latency predLad and 675f757f3fSDimitry Andric// ReleaseAtCycles predCycles if the SchedPredicate Pred is true, otherwise has 685f757f3fSDimitry Andric// Latency noPredLat and ReleaseAtCycles noPredCycles. The WorstCase SchedWrite 695f757f3fSDimitry Andric// is created similiarly if IsWorstCase is true. 705f757f3fSDimitry Andricmulticlass LMULWriteResMXVariant<string name, SchedPredicateBase Pred, 715f757f3fSDimitry Andric list<ProcResourceKind> resources, 725f757f3fSDimitry Andric int predLat, list<int> predAcquireCycles, 735f757f3fSDimitry Andric list<int> predReleaseCycles, int noPredLat, 745f757f3fSDimitry Andric list<int> noPredAcquireCycles, 755f757f3fSDimitry Andric list<int> noPredReleaseCycles, 765f757f3fSDimitry Andric string mx, bit IsWorstCase> { 775f757f3fSDimitry Andric defvar nameMX = name # "_" # mx; 785f757f3fSDimitry Andric 795f757f3fSDimitry Andric // Define the different behaviors 805f757f3fSDimitry Andric def nameMX # "_Pred" : SchedWriteRes<resources>{ 815f757f3fSDimitry Andric let Latency = predLat; 825f757f3fSDimitry Andric let AcquireAtCycles = predAcquireCycles; 835f757f3fSDimitry Andric let ReleaseAtCycles = predReleaseCycles; 845f757f3fSDimitry Andric } 855f757f3fSDimitry Andric def nameMX # "_NoPred" : SchedWriteRes<resources> { 865f757f3fSDimitry Andric let Latency = noPredLat; 875f757f3fSDimitry Andric let AcquireAtCycles = noPredAcquireCycles; 885f757f3fSDimitry Andric let ReleaseAtCycles = noPredReleaseCycles; 895f757f3fSDimitry Andric } 905f757f3fSDimitry Andric 91*0fca6ea1SDimitry Andric // Define SchedVars 92*0fca6ea1SDimitry Andric def nameMX # PredSchedVar 93*0fca6ea1SDimitry Andric : SchedVar<Pred, [!cast<SchedWriteRes>(NAME # nameMX # "_Pred")]>; 94*0fca6ea1SDimitry Andric def nameMX # NoPredSchedVar 95*0fca6ea1SDimitry Andric : SchedVar<NoSchedPred, [!cast<SchedWriteRes>(NAME # nameMX #"_NoPred")]>; 96*0fca6ea1SDimitry Andric // Allow multiclass to refer to SchedVars -- need to have NAME prefix. 97*0fca6ea1SDimitry Andric defvar PredSchedVar = !cast<SchedVar>(NAME # nameMX # PredSchedVar); 98*0fca6ea1SDimitry Andric defvar NoPredSchedVar = !cast<SchedVar>(NAME # nameMX # NoPredSchedVar); 99*0fca6ea1SDimitry Andric 1005f757f3fSDimitry Andric // Tie behavior to predicate 101*0fca6ea1SDimitry Andric def NAME # nameMX # "_Variant" 102*0fca6ea1SDimitry Andric : SchedWriteVariant<[PredSchedVar, NoPredSchedVar]>; 1035f757f3fSDimitry Andric def : SchedAlias< 1045f757f3fSDimitry Andric !cast<SchedReadWrite>(nameMX), 1055f757f3fSDimitry Andric !cast<SchedReadWrite>(NAME # nameMX # "_Variant")>; 1065f757f3fSDimitry Andric 1075f757f3fSDimitry Andric if IsWorstCase then { 108*0fca6ea1SDimitry Andric def NAME # name # "_WorstCase_Variant" 109*0fca6ea1SDimitry Andric : SchedWriteVariant<[PredSchedVar, NoPredSchedVar]>; 1105f757f3fSDimitry Andric def : SchedAlias< 1115f757f3fSDimitry Andric !cast<SchedReadWrite>(name # "_WorstCase"), 1125f757f3fSDimitry Andric !cast<SchedReadWrite>(NAME # name # "_WorstCase_Variant")>; 1135f757f3fSDimitry Andric } 1145f757f3fSDimitry Andric} 1155f757f3fSDimitry Andric 11606c3fb27SDimitry Andric// Define multiclasses to define SchedWrite, SchedRead, WriteRes, and 11706c3fb27SDimitry Andric// ReadAdvance for each (name, LMUL) pair and for each LMUL in each of the 11806c3fb27SDimitry Andric// SchedMxList variants above. Each multiclass is responsible for defining 11906c3fb27SDimitry Andric// a record that represents the WorseCase behavior for name. 12006c3fb27SDimitry Andricmulticlass LMULSchedWritesImpl<string name, list<string> MxList> { 12106c3fb27SDimitry Andric def name # "_WorstCase" : SchedWrite; 12206c3fb27SDimitry Andric foreach mx = MxList in { 123bdd1243dSDimitry Andric def name # "_" # mx : SchedWrite; 124bdd1243dSDimitry Andric } 125bdd1243dSDimitry Andric} 12606c3fb27SDimitry Andricmulticlass LMULSchedReadsImpl<string name, list<string> MxList> { 12706c3fb27SDimitry Andric def name # "_WorstCase" : SchedRead; 12806c3fb27SDimitry Andric foreach mx = MxList in { 129bdd1243dSDimitry Andric def name # "_" # mx : SchedRead; 130bdd1243dSDimitry Andric } 131bdd1243dSDimitry Andric} 13206c3fb27SDimitry Andricmulticlass LMULWriteResImpl<string name, list<ProcResourceKind> resources> { 13306c3fb27SDimitry Andric if !exists<SchedWrite>(name # "_WorstCase") then 13406c3fb27SDimitry Andric def : WriteRes<!cast<SchedWrite>(name # "_WorstCase"), resources>; 135bdd1243dSDimitry Andric foreach mx = SchedMxList in { 13606c3fb27SDimitry Andric if !exists<SchedWrite>(name # "_" # mx) then 137bdd1243dSDimitry Andric def : WriteRes<!cast<SchedWrite>(name # "_" # mx), resources>; 138bdd1243dSDimitry Andric } 139bdd1243dSDimitry Andric} 14006c3fb27SDimitry Andricmulticlass LMULReadAdvanceImpl<string name, int val, 14106c3fb27SDimitry Andric list<SchedWrite> writes = []> { 14206c3fb27SDimitry Andric if !exists<SchedRead>(name # "_WorstCase") then 14306c3fb27SDimitry Andric def : ReadAdvance<!cast<SchedRead>(name # "_WorstCase"), val, writes>; 144bdd1243dSDimitry Andric foreach mx = SchedMxList in { 14506c3fb27SDimitry Andric if !exists<SchedRead>(name # "_" # mx) then 146bdd1243dSDimitry Andric def : ReadAdvance<!cast<SchedRead>(name # "_" # mx), val, writes>; 147bdd1243dSDimitry Andric } 148bdd1243dSDimitry Andric} 149bdd1243dSDimitry Andric 15006c3fb27SDimitry Andric// Define multiclasses to define SchedWrite, SchedRead, WriteRes, and 15106c3fb27SDimitry Andric// ReadAdvance for each (name, LMUL, SEW) tuple for each LMUL in each of the 15206c3fb27SDimitry Andric// SchedMxList variants above. Each multiclass is responsible for defining 15306c3fb27SDimitry Andric// a record that represents the WorseCase behavior for name. 15406c3fb27SDimitry Andricmulticlass LMULSEWSchedWritesImpl<string name, list<string> MxList, bit isF = 0, 15506c3fb27SDimitry Andric bit isWidening = 0> { 15606c3fb27SDimitry Andric def name # "_WorstCase" : SchedWrite; 15706c3fb27SDimitry Andric foreach mx = MxList in { 15806c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx, isF, isWidening>.val in 15906c3fb27SDimitry Andric def name # "_" # mx # "_E" # sew : SchedWrite; 160bdd1243dSDimitry Andric } 161bdd1243dSDimitry Andric} 16206c3fb27SDimitry Andricmulticlass LMULSEWSchedReadsImpl<string name, list<string> MxList, bit isF = 0, 16306c3fb27SDimitry Andric bit isWidening = 0> { 16406c3fb27SDimitry Andric def name # "_WorstCase" : SchedRead; 16506c3fb27SDimitry Andric foreach mx = MxList in { 16606c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx, isF, isWidening>.val in 16706c3fb27SDimitry Andric def name # "_" # mx # "_E" # sew : SchedRead; 16806c3fb27SDimitry Andric } 16906c3fb27SDimitry Andric} 17006c3fb27SDimitry Andricmulticlass LMULSEWWriteResImpl<string name, list<ProcResourceKind> resources, 17106c3fb27SDimitry Andric list<string> MxList, bit isF = 0, 17206c3fb27SDimitry Andric bit isWidening = 0> { 17306c3fb27SDimitry Andric if !exists<SchedWrite>(name # "_WorstCase") then 17406c3fb27SDimitry Andric def : WriteRes<!cast<SchedWrite>(name # "_WorstCase"), resources>; 17506c3fb27SDimitry Andric foreach mx = MxList in { 17606c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx, isF, isWidening>.val in 17706c3fb27SDimitry Andric if !exists<SchedWrite>(name # "_" # mx # "_E" # sew) then 17806c3fb27SDimitry Andric def : WriteRes<!cast<SchedWrite>(name # "_" # mx # "_E" # sew), resources>; 17906c3fb27SDimitry Andric } 18006c3fb27SDimitry Andric} 18106c3fb27SDimitry Andricmulticlass LMULSEWReadAdvanceImpl<string name, int val, list<SchedWrite> writes = [], 18206c3fb27SDimitry Andric list<string> MxList, bit isF = 0, 18306c3fb27SDimitry Andric bit isWidening = 0> { 18406c3fb27SDimitry Andric if !exists<SchedRead>(name # "_WorstCase") then 18506c3fb27SDimitry Andric def : ReadAdvance<!cast<SchedRead>(name # "_WorstCase"), val, writes>; 18606c3fb27SDimitry Andric foreach mx = MxList in { 18706c3fb27SDimitry Andric foreach sew = SchedSEWSet<mx, isF, isWidening>.val in 18806c3fb27SDimitry Andric if !exists<SchedRead>(name # "_" # mx # "_E" # sew) then 18906c3fb27SDimitry Andric def : ReadAdvance<!cast<SchedRead>(name # "_" # mx # "_E" # sew), val, writes>; 19006c3fb27SDimitry Andric } 19106c3fb27SDimitry Andric} 19206c3fb27SDimitry Andric// Define classes to define list containing all SchedWrites for each (name, LMUL) 19306c3fb27SDimitry Andric// pair for each LMUL in each of the SchedMxList variants above and name in 19406c3fb27SDimitry Andric// argument `names`. These classes can be used to construct a list of existing 19506c3fb27SDimitry Andric// definitions of writes corresponding to each (name, LMUL) pair, that are needed 19606c3fb27SDimitry Andric// by the ReadAdvance. For example: 19706c3fb27SDimitry Andric// ``` 19806c3fb27SDimitry Andric// defm "" : LMULReadAdvance<"ReadVIALUX", 1, 199*0fca6ea1SDimitry Andric// LMULSchedWriteList<["WriteVMovSX"]>.value>; 20006c3fb27SDimitry Andric// ``` 20106c3fb27SDimitry Andricclass LMULSchedWriteListImpl<list<string> names, list<string> MxList> { 20206c3fb27SDimitry Andric list<SchedWrite> value = !foldl([]<SchedWrite>, 20306c3fb27SDimitry Andric !foreach(name, names, 20406c3fb27SDimitry Andric !foreach(mx, MxList, !cast<SchedWrite>(name # "_" # mx))), 20506c3fb27SDimitry Andric all, writes, !listconcat(all, writes)); 20606c3fb27SDimitry Andric} 207bdd1243dSDimitry Andric 20806c3fb27SDimitry Andricmulticlass LMULSchedWrites<string name> : LMULSchedWritesImpl<name, SchedMxList>; 20906c3fb27SDimitry Andricmulticlass LMULSchedReads<string name> : LMULSchedReadsImpl<name, SchedMxList>; 21006c3fb27SDimitry Andricmulticlass LMULWriteRes<string name, list<ProcResourceKind> resources> 21106c3fb27SDimitry Andric : LMULWriteResImpl<name, resources>; 21206c3fb27SDimitry Andricmulticlass LMULReadAdvance<string name, int val, list<SchedWrite> writes = []> 21306c3fb27SDimitry Andric : LMULReadAdvanceImpl<name, val, writes>; 21406c3fb27SDimitry Andricclass LMULSchedWriteList<list<string> names> : LMULSchedWriteListImpl<names, SchedMxList>; 21506c3fb27SDimitry Andric 21606c3fb27SDimitry Andricmulticlass LMULSEWSchedWrites<string name> : LMULSEWSchedWritesImpl<name, SchedMxList>; 21706c3fb27SDimitry Andricmulticlass LMULSEWSchedReads<string name> : LMULSEWSchedReadsImpl<name, SchedMxList>; 21806c3fb27SDimitry Andricmulticlass LMULSEWWriteRes<string name, list<ProcResourceKind> resources> 21906c3fb27SDimitry Andric : LMULSEWWriteResImpl<name, resources, SchedMxList>; 22006c3fb27SDimitry Andricmulticlass LMULSEWReadAdvance<string name, int val, list<SchedWrite> writes = []> 22106c3fb27SDimitry Andric : LMULSEWReadAdvanceImpl<name, val, writes, SchedMxList>; 22206c3fb27SDimitry Andric 22306c3fb27SDimitry Andricmulticlass LMULSEWSchedWritesWRed<string name> 22406c3fb27SDimitry Andric : LMULSEWSchedWritesImpl<name, SchedMxListWRed, isWidening=1>; 22506c3fb27SDimitry Andricmulticlass LMULSEWWriteResWRed<string name, list<ProcResourceKind> resources> 22606c3fb27SDimitry Andric : LMULSEWWriteResImpl<name, resources, SchedMxListWRed, isWidening=1>; 22706c3fb27SDimitry Andric 22806c3fb27SDimitry Andricmulticlass LMULSEWSchedWritesFWRed<string name> 22906c3fb27SDimitry Andric : LMULSEWSchedWritesImpl<name, SchedMxListFWRed, isF=1, isWidening=1>; 23006c3fb27SDimitry Andricmulticlass LMULSEWWriteResFWRed<string name, list<ProcResourceKind> resources> 23106c3fb27SDimitry Andric : LMULSEWWriteResImpl<name, resources, SchedMxListFWRed, isF=1, isWidening=1>; 23206c3fb27SDimitry Andric 23306c3fb27SDimitry Andricmulticlass LMULSEWSchedWritesF<string name> : LMULSEWSchedWritesImpl<name, SchedMxListF, isF=1>; 23406c3fb27SDimitry Andricmulticlass LMULSEWSchedReadsF<string name> : LMULSEWSchedReadsImpl<name, SchedMxListF, isF=1>; 23506c3fb27SDimitry Andricmulticlass LMULSEWWriteResF<string name, list<ProcResourceKind> resources> 23606c3fb27SDimitry Andric : LMULSEWWriteResImpl<name, resources, SchedMxListF, isF=1>; 23706c3fb27SDimitry Andricmulticlass LMULSEWReadAdvanceF<string name, int val, list<SchedWrite> writes = []> 23806c3fb27SDimitry Andric : LMULSEWReadAdvanceImpl<name, val, writes, SchedMxListF, isF=1>; 23906c3fb27SDimitry Andric 24006c3fb27SDimitry Andricmulticlass LMULSchedWritesW<string name> : LMULSchedWritesImpl<name, SchedMxListW>; 24106c3fb27SDimitry Andricmulticlass LMULSchedReadsW<string name> : LMULSchedReadsImpl<name, SchedMxListW>; 24206c3fb27SDimitry Andricmulticlass LMULWriteResW<string name, list<ProcResourceKind> resources> 24306c3fb27SDimitry Andric : LMULWriteResImpl<name, resources>; 24406c3fb27SDimitry Andricmulticlass LMULReadAdvanceW<string name, int val, list<SchedWrite> writes = []> 24506c3fb27SDimitry Andric : LMULReadAdvanceImpl<name, val, writes>; 24606c3fb27SDimitry Andricclass LMULSchedWriteListW<list<string> names> : LMULSchedWriteListImpl<names, SchedMxListW>; 24706c3fb27SDimitry Andric 24806c3fb27SDimitry Andricmulticlass LMULSchedWritesFW<string name> : LMULSchedWritesImpl<name, SchedMxListFW>; 24906c3fb27SDimitry Andricmulticlass LMULSchedReadsFW<string name> : LMULSchedReadsImpl<name, SchedMxListFW>; 25006c3fb27SDimitry Andricmulticlass LMULWriteResFW<string name, list<ProcResourceKind> resources> 25106c3fb27SDimitry Andric : LMULWriteResImpl<name, resources>; 25206c3fb27SDimitry Andricmulticlass LMULReadAdvanceFW<string name, int val, list<SchedWrite> writes = []> 25306c3fb27SDimitry Andric : LMULReadAdvanceImpl<name, val, writes>; 25406c3fb27SDimitry Andricclass LMULSchedWriteListFW<list<string> names> : LMULSchedWriteListImpl<names, SchedMxListFW>; 255bdd1243dSDimitry Andric 256*0fca6ea1SDimitry Andricmulticlass LMULSEWSchedWritesW<string name> 257*0fca6ea1SDimitry Andric : LMULSEWSchedWritesImpl<name, SchedMxListW, isF = 0, isWidening = 1>; 258*0fca6ea1SDimitry Andricmulticlass LMULSEWSchedReadsW<string name> 259*0fca6ea1SDimitry Andric : LMULSEWSchedReadsImpl<name, SchedMxListW, isF = 0, isWidening = 1>; 260*0fca6ea1SDimitry Andricmulticlass LMULSEWWriteResW<string name, list<ProcResourceKind> resources> 261*0fca6ea1SDimitry Andric : LMULSEWWriteResImpl<name, resources, SchedMxListW, isF = 0, 262*0fca6ea1SDimitry Andric isWidening = 1>; 263*0fca6ea1SDimitry Andricmulticlass 264*0fca6ea1SDimitry Andric LMULSEWReadAdvanceW<string name, int val, list<SchedWrite> writes = []> 265*0fca6ea1SDimitry Andric : LMULSEWReadAdvanceImpl<name, val, writes, SchedMxListW, isF = 0, 266*0fca6ea1SDimitry Andric isWidening = 1>; 267*0fca6ea1SDimitry Andric 268*0fca6ea1SDimitry Andricmulticlass LMULSEWSchedWritesFW<string name> 269*0fca6ea1SDimitry Andric : LMULSEWSchedWritesImpl<name, SchedMxListFW, isF = 1, isWidening = 1>; 270*0fca6ea1SDimitry Andricmulticlass LMULSEWSchedReadsFW<string name> 271*0fca6ea1SDimitry Andric : LMULSEWSchedReadsImpl<name, SchedMxListFW, isF = 1, isWidening = 1>; 272*0fca6ea1SDimitry Andricmulticlass LMULSEWWriteResFW<string name, list<ProcResourceKind> resources> 273*0fca6ea1SDimitry Andric : LMULSEWWriteResImpl<name, resources, SchedMxListFW, isF = 1, 274*0fca6ea1SDimitry Andric isWidening = 1>; 275*0fca6ea1SDimitry Andricmulticlass 276*0fca6ea1SDimitry Andric LMULSEWReadAdvanceFW<string name, int val, list<SchedWrite> writes = []> 277*0fca6ea1SDimitry Andric : LMULSEWReadAdvanceImpl<name, val, writes, SchedMxListFW, isF = 1, 278*0fca6ea1SDimitry Andric isWidening = 1>; 279*0fca6ea1SDimitry Andric 280bdd1243dSDimitry Andric// 3.6 Vector Byte Length vlenb 281bdd1243dSDimitry Andricdef WriteRdVLENB : SchedWrite; 282bdd1243dSDimitry Andric 283bdd1243dSDimitry Andric// 6. Configuration-Setting Instructions 284bdd1243dSDimitry Andricdef WriteVSETVLI : SchedWrite; 285bdd1243dSDimitry Andricdef WriteVSETIVLI : SchedWrite; 286bdd1243dSDimitry Andricdef WriteVSETVL : SchedWrite; 287bdd1243dSDimitry Andric 2886e75b2fbSDimitry Andric// 7. Vector Loads and Stores 2896e75b2fbSDimitry Andric// 7.4. Vector Unit-Stride Instructions 290bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDE">; 291bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTE">; 2926e75b2fbSDimitry Andric// 7.4.1. Vector Unit-Strided Mask 293bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDM">; 294bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTM">; 2956e75b2fbSDimitry Andric// 7.5. Vector Strided Instructions 296bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDS8">; 297bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDS16">; 298bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDS32">; 299bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDS64">; 300bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTS8">; 301bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTS16">; 302bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTS32">; 303bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTS64">; 3046e75b2fbSDimitry Andric// 7.6. Vector Indexed Instructions 305bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDUX8">; 306bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDUX16">; 307bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDUX32">; 308bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDUX64">; 309bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDOX8">; 310bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDOX16">; 311bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDOX32">; 312bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDOX64">; 313bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTUX8">; 314bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTUX16">; 315bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTUX32">; 316bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTUX64">; 317bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTOX8">; 318bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTOX16">; 319bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTOX32">; 320bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSTOX64">; 3216e75b2fbSDimitry Andric// 7.7. Vector Unit-stride Fault-Only-First Loads 322bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVLDFF">; 323753f127fSDimitry Andric// 7.8. Vector Segment Instructions 324753f127fSDimitry Andricforeach nf=2-8 in { 325753f127fSDimitry Andric foreach eew = [8, 16, 32, 64] in { 326bdd1243dSDimitry Andric defm "" : LMULSchedWrites<"WriteVLSEG" # nf # e # eew>; 327bdd1243dSDimitry Andric defm "" : LMULSchedWrites<"WriteVSSEG" # nf # e # eew>; 328bdd1243dSDimitry Andric defm "" : LMULSchedWrites<"WriteVLSEGFF" # nf # e # eew>; 329bdd1243dSDimitry Andric defm "" : LMULSchedWrites<"WriteVLSSEG" # nf # e # eew>; 330bdd1243dSDimitry Andric defm "" : LMULSchedWrites<"WriteVSSSEG" # nf # e # eew>; 331bdd1243dSDimitry Andric defm "" : LMULSchedWrites<"WriteVLUXSEG" # nf # e # eew>; 332bdd1243dSDimitry Andric defm "" : LMULSchedWrites<"WriteVLOXSEG" # nf # e # eew>; 333bdd1243dSDimitry Andric defm "" : LMULSchedWrites<"WriteVSUXSEG" # nf # e # eew>; 334bdd1243dSDimitry Andric defm "" : LMULSchedWrites<"WriteVSOXSEG" # nf # e # eew>; 335753f127fSDimitry Andric } 336753f127fSDimitry Andric} 3376e75b2fbSDimitry Andric// 7.9. Vector Whole Register Instructions 338bdd1243dSDimitry Andricdef WriteVLD1R : SchedWrite; 339bdd1243dSDimitry Andricdef WriteVLD2R : SchedWrite; 340bdd1243dSDimitry Andricdef WriteVLD4R : SchedWrite; 341bdd1243dSDimitry Andricdef WriteVLD8R : SchedWrite; 3426e75b2fbSDimitry Andricdef WriteVST1R : SchedWrite; 3436e75b2fbSDimitry Andricdef WriteVST2R : SchedWrite; 3446e75b2fbSDimitry Andricdef WriteVST4R : SchedWrite; 3456e75b2fbSDimitry Andricdef WriteVST8R : SchedWrite; 3466e75b2fbSDimitry Andric 3476e75b2fbSDimitry Andric// 11. Vector Integer Arithmetic Instructions 3486e75b2fbSDimitry Andric// 11.1. Vector Single-Width Integer Add and Subtract 3496e75b2fbSDimitry Andric// 11.5. Vector Bitwise Logical Instructions 350bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIALUV">; 351bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIALUX">; 352bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIALUI">; 3536e75b2fbSDimitry Andric// 11.2. Vector Widening Integer Add/Subtract 354bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWALUV">; 355bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWALUX">; 356bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWALUI">; 3576e75b2fbSDimitry Andric// 11.3. Vector Integer Extension 358bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVExtV">; 3596e75b2fbSDimitry Andric// 11.4. Vector Integer Arithmetic with Carry or Borrow Instructions 360bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICALUV">; 361bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICALUX">; 362bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICALUI">; 3636e75b2fbSDimitry Andric// 11.6. Vector Single-Width Bit Shift Instructions 364bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVShiftV">; 365bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVShiftX">; 366bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVShiftI">; 3676e75b2fbSDimitry Andric// 11.7. Vector Narrowing Integer Right Shift Instructions 368bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNShiftV">; 369bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNShiftX">; 370bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNShiftI">; 3716e75b2fbSDimitry Andric// 11.8. Vector Integer Comparison Instructions 372bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICmpV">; 373bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICmpX">; 374bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVICmpI">; 37506c3fb27SDimitry Andric// 11.9. Vector Integer Min/Max Instructions 37606c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMinMaxV">; 37706c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMinMaxX">; 3786e75b2fbSDimitry Andric// 11.10. Vector Single-Width Integer Multiply Instructions 379bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMulV">; 380bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMulX">; 3816e75b2fbSDimitry Andric// 11.11. Vector Integer Divide Instructions 38206c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVIDivV">; 38306c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVIDivX">; 3846e75b2fbSDimitry Andric// 11.12. Vector Widening Integer Multiply Instructions 385bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWMulV">; 386bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWMulX">; 3876e75b2fbSDimitry Andric// 11.13. Vector Single-Width Integer Multiply-Add Instructions 388bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMulAddV">; 389bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMulAddX">; 3906e75b2fbSDimitry Andric// 11.14. Vector Widening Integer Multiply-Add Instructions 391bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWMulAddV">; 392bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVIWMulAddX">; 3936e75b2fbSDimitry Andric// 11.15. Vector Integer Merge Instructions 394bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMergeV">; 395bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMergeX">; 396bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMergeI">; 3976e75b2fbSDimitry Andric// 11.16. Vector Integer Move Instructions 398bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMovV">; 399bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMovX">; 400bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVIMovI">; 4016e75b2fbSDimitry Andric 4026e75b2fbSDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions 4036e75b2fbSDimitry Andric// 12.1. Vector Single-Width Saturating Add and Subtract 404bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSALUV">; 405bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSALUX">; 406bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSALUI">; 4076e75b2fbSDimitry Andric// 12.2. Vector Single-Width Averaging Add and Subtract 408bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVAALUV">; 409bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVAALUX">; 4106e75b2fbSDimitry Andric// 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation 411bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSMulV">; 412bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSMulX">; 4136e75b2fbSDimitry Andric// 12.4. Vector Single-Width Scaling Shift Instructions 414bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSShiftV">; 415bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSShiftX">; 416bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVSShiftI">; 4176e75b2fbSDimitry Andric// 12.5. Vector Narrowing Fixed-Point Clip Instructions 418bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNClipV">; 419bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNClipX">; 420bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVNClipI">; 4216e75b2fbSDimitry Andric 4226e75b2fbSDimitry Andric// 13. Vector Floating-Point Instructions 4236e75b2fbSDimitry Andric// 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions 424*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFALUV">; 425*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFALUF">; 4266e75b2fbSDimitry Andric// 13.3. Vector Widening Floating-Point Add/Subtract Instructions 427*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWALUV">; 428*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWALUF">; 4296e75b2fbSDimitry Andric// 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions 430*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMulV">; 431*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMulF">; 43206c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFDivV">; 43306c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFDivF">; 4346e75b2fbSDimitry Andric// 13.5. Vector Widening Floating-Point Multiply 435*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWMulV">; 436*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWMulF">; 4376e75b2fbSDimitry Andric// 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions 438*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMulAddV">; 439*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMulAddF">; 4406e75b2fbSDimitry Andric// 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions 441*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWMulAddV">; 442*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWMulAddF">; 4436e75b2fbSDimitry Andric// 13.8. Vector Floating-Point Square-Root Instruction 44406c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFSqrtV">; 4456e75b2fbSDimitry Andric// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction 4466e75b2fbSDimitry Andric// 13.10. Vector Floating-Point Reciprocal Estimate Instruction 447*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFRecpV">; 4486e75b2fbSDimitry Andric// 13.11. Vector Floating-Point MIN/MAX Instructions 449*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMinMaxV">; 450*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFMinMaxF">; 4516e75b2fbSDimitry Andric// 13.12. Vector Floating-Point Sign-Injection Instructions 452*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFSgnjV">; 453*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFSgnjF">; 45406c3fb27SDimitry Andric// 13.13. Vector Floating-Point Compare Instructions 45506c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVFCmpV">; 45606c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVFCmpF">; 4576e75b2fbSDimitry Andric// 13.14. Vector Floating-Point Classify Instruction 458bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVFClassV">; 4596e75b2fbSDimitry Andric// 13.15. Vector Floating-Point Merge Instruction 460bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVFMergeV">; 4616e75b2fbSDimitry Andric// 13.16. Vector Floating-Point Move Instruction 462bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVFMovV">; 4636e75b2fbSDimitry Andric// 13.17. Single-Width Floating-Point/Integer Type-Convert Instructions 464*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFCvtIToFV">; 465bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVFCvtFToIV">; 4666e75b2fbSDimitry Andric// 13.18. Widening Floating-Point/Integer Type-Convert Instructions 467*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesW<"WriteVFWCvtIToFV">; 468bdd1243dSDimitry Andricdefm "" : LMULSchedWritesFW<"WriteVFWCvtFToIV">; 469*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFWCvtFToFV">; 4706e75b2fbSDimitry Andric// 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions 471*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFNCvtIToFV">; 472bdd1243dSDimitry Andricdefm "" : LMULSchedWritesW<"WriteVFNCvtFToIV">; 473*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWritesFW<"WriteVFNCvtFToFV">; 4746e75b2fbSDimitry Andric 4756e75b2fbSDimitry Andric// 14. Vector Reduction Operations 47606c3fb27SDimitry Andric// The latency of reduction is determined by the size of the read resource. 47706c3fb27SDimitry Andric// The LMUL range of read resource(VS2) for reduction operantion is between 47806c3fb27SDimitry Andric// MF8 and M8. Use the _From suffix to indicate the number of the 47906c3fb27SDimitry Andric// LMUL from VS2. 4806e75b2fbSDimitry Andric// 14.1. Vector Single-Width Integer Reduction Instructions 48106c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVIRedV_From">; 48206c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVIRedMinMaxV_From">; 4836e75b2fbSDimitry Andric// 14.2. Vector Widening Integer Reduction Instructions 48406c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesWRed<"WriteVIWRedV_From">; 4856e75b2fbSDimitry Andric// 14.3. Vector Single-Width Floating-Point Reduction Instructions 48606c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFRedV_From">; 48706c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFRedOV_From">; 48806c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesF<"WriteVFRedMinMaxV_From">; 4896e75b2fbSDimitry Andric// 14.4. Vector Widening Floating-Point Reduction Instructions 49006c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesFWRed<"WriteVFWRedV_From">; 49106c3fb27SDimitry Andricdefm "" : LMULSEWSchedWritesFWRed<"WriteVFWRedOV_From">; 4926e75b2fbSDimitry Andric 4936e75b2fbSDimitry Andric// 15. Vector Mask Instructions 4946e75b2fbSDimitry Andric// 15.1. Vector Mask-Register Logical Instructions 495bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVMALUV">; 4966e75b2fbSDimitry Andric// 15.2. Vector Mask Population Count 497bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVMPopV">; 4986e75b2fbSDimitry Andric// 15.3. Vector Find-First-Set Mask Bit 499bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVMFFSV">; 5006e75b2fbSDimitry Andric// 15.4. Vector Set-Before-First Mask Bit 5016e75b2fbSDimitry Andric// 15.5. Vector Set-Including-First Mask Bit 5026e75b2fbSDimitry Andric// 15.6. Vector Set-only-First Mask Bit 503bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVMSFSV">; 5046e75b2fbSDimitry Andric// 15.8. Vector Iota Instruction 505*0fca6ea1SDimitry Andricdefm "" : LMULSchedWrites<"WriteVIotaV">; 5066e75b2fbSDimitry Andric// 15.9. Vector Element Index Instruction 507*0fca6ea1SDimitry Andricdefm "" : LMULSchedWrites<"WriteVIdxV">; 5086e75b2fbSDimitry Andric 5096e75b2fbSDimitry Andric// 16. Vector Permutation Instructions 5106e75b2fbSDimitry Andric// 16.1. Integer Scalar Move Instructions 511*0fca6ea1SDimitry Andricdef WriteVMovSX : SchedWrite; 512*0fca6ea1SDimitry Andricdef WriteVMovXS : SchedWrite; 5136e75b2fbSDimitry Andric// 16.2. Floating-Point Scalar Move Instructions 514*0fca6ea1SDimitry Andricdef WriteVMovSF : SchedWrite; 515*0fca6ea1SDimitry Andricdef WriteVMovFS : SchedWrite; 5166e75b2fbSDimitry Andric// 16.3. Vector Slide Instructions 517*0fca6ea1SDimitry Andricdefm "" : LMULSchedWrites<"WriteVSlideUpX">; 518*0fca6ea1SDimitry Andricdefm "" : LMULSchedWrites<"WriteVSlideDownX">; 519*0fca6ea1SDimitry Andricdefm "" : LMULSchedWrites<"WriteVSlideI">; 520bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVISlide1X">; 521bdd1243dSDimitry Andricdefm "" : LMULSchedWrites<"WriteVFSlide1F">; 5226e75b2fbSDimitry Andric// 16.4. Vector Register Gather Instructions 52306c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVRGatherVV">; 524*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVRGatherEI16VV">; 52506c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVRGatherVX">; 52606c3fb27SDimitry Andricdefm "" : LMULSchedWrites<"WriteVRGatherVI">; 5276e75b2fbSDimitry Andric// 16.5. Vector Compress Instruction 52806c3fb27SDimitry Andricdefm "" : LMULSEWSchedWrites<"WriteVCompressV">; 5296e75b2fbSDimitry Andric// 16.6. Whole Vector Register Move 530bdd1243dSDimitry Andric// These are already LMUL aware 5316e75b2fbSDimitry Andricdef WriteVMov1V : SchedWrite; 5326e75b2fbSDimitry Andricdef WriteVMov2V : SchedWrite; 5336e75b2fbSDimitry Andricdef WriteVMov4V : SchedWrite; 5346e75b2fbSDimitry Andricdef WriteVMov8V : SchedWrite; 5356e75b2fbSDimitry Andric 5366e75b2fbSDimitry Andric//===----------------------------------------------------------------------===// 5376e75b2fbSDimitry Andric/// Define scheduler resources associated with use operands. 5386e75b2fbSDimitry Andric 539bdd1243dSDimitry Andric// 6. Configuration-Setting Instructions 540bdd1243dSDimitry Andricdef ReadVSETVLI : SchedRead; 541bdd1243dSDimitry Andricdef ReadVSETVL : SchedRead; 542bdd1243dSDimitry Andric 5436e75b2fbSDimitry Andric// 7. Vector Loads and Stores 54406c3fb27SDimitry Andricdef ReadVLDX : SchedRead; 54506c3fb27SDimitry Andricdef ReadVSTX : SchedRead; 5466e75b2fbSDimitry Andric// 7.4. Vector Unit-Stride Instructions 547bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTEV">; 5486e75b2fbSDimitry Andric// 7.4.1. Vector Unit-Strided Mask 549bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTM">; 5506e75b2fbSDimitry Andric// 7.5. Vector Strided Instructions 55106c3fb27SDimitry Andricdef ReadVLDSX : SchedRead; 55206c3fb27SDimitry Andricdef ReadVSTSX : SchedRead; 553bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTS8V">; 554bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTS16V">; 555bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTS32V">; 556bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTS64V">; 5576e75b2fbSDimitry Andric// 7.6. Vector Indexed Instructions 558bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVLDUXV">; 559bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVLDOXV">; 560bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX8">; 561bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX16">; 562bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX32">; 563bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX64">; 564bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUXV">; 565bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX8V">; 566bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX16V">; 567bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX32V">; 568bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTUX64V">; 569bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX8">; 570bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX16">; 571bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX32">; 572bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX64">; 573bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOXV">; 574bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX8V">; 575bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX16V">; 576bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX32V">; 577bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSTOX64V">; 5786e75b2fbSDimitry Andric// 7.9. Vector Whole Register Instructions 579bdd1243dSDimitry Andric// These are already LMUL aware 5806e75b2fbSDimitry Andricdef ReadVST1R : SchedRead; 5816e75b2fbSDimitry Andricdef ReadVST2R : SchedRead; 5826e75b2fbSDimitry Andricdef ReadVST4R : SchedRead; 5836e75b2fbSDimitry Andricdef ReadVST8R : SchedRead; 5846e75b2fbSDimitry Andric 5856e75b2fbSDimitry Andric// 11. Vector Integer Arithmetic Instructions 5866e75b2fbSDimitry Andric// 11.1. Vector Single-Width Integer Add and Subtract 5876e75b2fbSDimitry Andric// 11.5. Vector Bitwise Logical Instructions 588bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIALUV">; 589bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIALUX">; 5906e75b2fbSDimitry Andric// 11.2. Vector Widening Integer Add/Subtract 591bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWALUV">; 592bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWALUX">; 5936e75b2fbSDimitry Andric// 11.3. Vector Integer Extension 594bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVExtV">; 5956e75b2fbSDimitry Andric// 11.4. Vector Integer Arithmetic with Carry or Borrow Instructions 596bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVICALUV">; 597bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVICALUX">; 5986e75b2fbSDimitry Andric// 11.6. Vector Single-Width Bit Shift Instructions 599bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVShiftV">; 600bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVShiftX">; 6016e75b2fbSDimitry Andric// 11.7. Vector Narrowing Integer Right Shift Instructions 602bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVNShiftV">; 603bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVNShiftX">; 6046e75b2fbSDimitry Andric// 11.8. Vector Integer Comparison Instructions 605bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVICmpV">; 606bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVICmpX">; 60706c3fb27SDimitry Andric// 11.9. Vector Integer Min/Max Instructions 60806c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVIMinMaxV">; 60906c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVIMinMaxX">; 6106e75b2fbSDimitry Andric// 11.10. Vector Single-Width Integer Multiply Instructions 611bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMulV">; 612bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMulX">; 6136e75b2fbSDimitry Andric// 11.11. Vector Integer Divide Instructions 61406c3fb27SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVIDivV">; 61506c3fb27SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVIDivX">; 6166e75b2fbSDimitry Andric// 11.12. Vector Widening Integer Multiply Instructions 617bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWMulV">; 618bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWMulX">; 6196e75b2fbSDimitry Andric// 11.13. Vector Single-Width Integer Multiply-Add Instructions 620bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMulAddV">; 621bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMulAddX">; 6226e75b2fbSDimitry Andric// 11.14. Vector Widening Integer Multiply-Add Instructions 623bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWMulAddV">; 624bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVIWMulAddX">; 6256e75b2fbSDimitry Andric// 11.15. Vector Integer Merge Instructions 626bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMergeV">; 627bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMergeX">; 6286e75b2fbSDimitry Andric// 11.16. Vector Integer Move Instructions 629bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMovV">; 630bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVIMovX">; 6316e75b2fbSDimitry Andric 6326e75b2fbSDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions 6336e75b2fbSDimitry Andric// 12.1. Vector Single-Width Saturating Add and Subtract 634bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSALUV">; 635bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSALUX">; 6366e75b2fbSDimitry Andric// 12.2. Vector Single-Width Averaging Add and Subtract 637bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVAALUV">; 638bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVAALUX">; 6396e75b2fbSDimitry Andric// 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation 640bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSMulV">; 641bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSMulX">; 6426e75b2fbSDimitry Andric// 12.4. Vector Single-Width Scaling Shift Instructions 643bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSShiftV">; 644bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVSShiftX">; 6456e75b2fbSDimitry Andric// 12.5. Vector Narrowing Fixed-Point Clip Instructions 646bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVNClipV">; 647bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVNClipX">; 6486e75b2fbSDimitry Andric 6496e75b2fbSDimitry Andric// 13. Vector Floating-Point Instructions 6506e75b2fbSDimitry Andric// 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions 651*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFALUV">; 652*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFALUF">; 6536e75b2fbSDimitry Andric// 13.3. Vector Widening Floating-Point Add/Subtract Instructions 654*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWALUV">; 655*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWALUF">; 6566e75b2fbSDimitry Andric// 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions 657*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMulV">; 658*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMulF">; 65906c3fb27SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFDivV">; 66006c3fb27SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFDivF">; 6616e75b2fbSDimitry Andric// 13.5. Vector Widening Floating-Point Multiply 662*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWMulV">; 663*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWMulF">; 6646e75b2fbSDimitry Andric// 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions 665*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMulAddV">; 666*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMulAddF">; 6676e75b2fbSDimitry Andric// 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions 668*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWMulAddV">; 669*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWMulAddF">; 6706e75b2fbSDimitry Andric// 13.8. Vector Floating-Point Square-Root Instruction 67106c3fb27SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFSqrtV">; 6726e75b2fbSDimitry Andric// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction 6736e75b2fbSDimitry Andric// 13.10. Vector Floating-Point Reciprocal Estimate Instruction 674*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFRecpV">; 6756e75b2fbSDimitry Andric// 13.11. Vector Floating-Point MIN/MAX Instructions 676*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMinMaxV">; 677*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFMinMaxF">; 6786e75b2fbSDimitry Andric// 13.12. Vector Floating-Point Sign-Injection Instructions 679*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFSgnjV">; 680*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFSgnjF">; 68106c3fb27SDimitry Andric// 13.13. Vector Floating-Point Compare Instructions 68206c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVFCmpV">; 68306c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVFCmpF">; 6846e75b2fbSDimitry Andric// 13.14. Vector Floating-Point Classify Instruction 685bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFClassV">; 6866e75b2fbSDimitry Andric// 13.15. Vector Floating-Point Merge Instruction 687bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFMergeV">; 688bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFMergeF">; 6896e75b2fbSDimitry Andric// 13.16. Vector Floating-Point Move Instruction 690bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFMovF">; 6916e75b2fbSDimitry Andric// 13.17. Single-Width Floating-Point/Integer Type-Convert Instructions 692*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsF<"ReadVFCvtIToFV">; 693bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFCvtFToIV">; 6946e75b2fbSDimitry Andric// 13.18. Widening Floating-Point/Integer Type-Convert Instructions 695*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsW<"ReadVFWCvtIToFV">; 696bdd1243dSDimitry Andricdefm "" : LMULSchedReadsFW<"ReadVFWCvtFToIV">; 697*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFWCvtFToFV">; 6986e75b2fbSDimitry Andric// 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions 699*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFNCvtIToFV">; 700bdd1243dSDimitry Andricdefm "" : LMULSchedReadsW<"ReadVFNCvtFToIV">; 701*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReadsFW<"ReadVFNCvtFToFV">; 7026e75b2fbSDimitry Andric 7036e75b2fbSDimitry Andric// 14. Vector Reduction Operations 7046e75b2fbSDimitry Andric// 14.1. Vector Single-Width Integer Reduction Instructions 7056e75b2fbSDimitry Andricdef ReadVIRedV : SchedRead; 7066e75b2fbSDimitry Andricdef ReadVIRedV0 : SchedRead; 7076e75b2fbSDimitry Andric// 14.2. Vector Widening Integer Reduction Instructions 7086e75b2fbSDimitry Andricdef ReadVIWRedV : SchedRead; 7096e75b2fbSDimitry Andricdef ReadVIWRedV0 : SchedRead; 7106e75b2fbSDimitry Andric// 14.3. Vector Single-Width Floating-Point Reduction Instructions 7116e75b2fbSDimitry Andricdef ReadVFRedV : SchedRead; 7126e75b2fbSDimitry Andricdef ReadVFRedV0 : SchedRead; 7136e75b2fbSDimitry Andricdef ReadVFRedOV : SchedRead; 7146e75b2fbSDimitry Andricdef ReadVFRedOV0 : SchedRead; 71506c3fb27SDimitry Andricdef ReadVFRedMinMaxV : SchedRead; 7166e75b2fbSDimitry Andric// 14.4. Vector Widening Floating-Point Reduction Instructions 7176e75b2fbSDimitry Andricdef ReadVFWRedV : SchedRead; 7186e75b2fbSDimitry Andricdef ReadVFWRedV0 : SchedRead; 7196e75b2fbSDimitry Andricdef ReadVFWRedOV : SchedRead; 7206e75b2fbSDimitry Andricdef ReadVFWRedOV0 : SchedRead; 7216e75b2fbSDimitry Andric 7226e75b2fbSDimitry Andric// 15. Vector Mask Instructions 7236e75b2fbSDimitry Andric// 15.1. Vector Mask-Register Logical Instructions 724bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVMALUV">; 7256e75b2fbSDimitry Andric// 15.2. Vector Mask Population Count 726bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVMPopV">; 7276e75b2fbSDimitry Andric// 15.3. Vector Find-First-Set Mask Bit 728bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVMFFSV">; 7296e75b2fbSDimitry Andric// 15.4. Vector Set-Before-First Mask Bit 7306e75b2fbSDimitry Andric// 15.5. Vector Set-Including-First Mask Bit 7316e75b2fbSDimitry Andric// 15.6. Vector Set-only-First Mask Bit 732bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVMSFSV">; 7336e75b2fbSDimitry Andric// 15.8. Vector Iota Instruction 734*0fca6ea1SDimitry Andricdefm "" : LMULSchedReads<"ReadVIotaV">; 7356e75b2fbSDimitry Andric 7366e75b2fbSDimitry Andric// 16. Vector Permutation Instructions 7376e75b2fbSDimitry Andric// 16.1. Integer Scalar Move Instructions 738*0fca6ea1SDimitry Andricdef ReadVMovXS : SchedRead; 739*0fca6ea1SDimitry Andricdef ReadVMovSX_V : SchedRead; 740*0fca6ea1SDimitry Andricdef ReadVMovSX_X : SchedRead; 7416e75b2fbSDimitry Andric// 16.2. Floating-Point Scalar Move Instructions 742*0fca6ea1SDimitry Andricdef ReadVMovFS : SchedRead; 743*0fca6ea1SDimitry Andricdef ReadVMovSF_V : SchedRead; 744*0fca6ea1SDimitry Andricdef ReadVMovSF_F : SchedRead; 7456e75b2fbSDimitry Andric// 16.3. Vector Slide Instructions 746bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVISlideV">; 747bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVISlideX">; 748bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFSlideV">; 749bdd1243dSDimitry Andricdefm "" : LMULSchedReads<"ReadVFSlideF">; 7506e75b2fbSDimitry Andric// 16.4. Vector Register Gather Instructions 75106c3fb27SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVRGatherVV_data">; 75206c3fb27SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVRGatherVV_index">; 753*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVRGatherEI16VV_data">; 754*0fca6ea1SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVRGatherEI16VV_index">; 75506c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVRGatherVX_data">; 75606c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVRGatherVX_index">; 75706c3fb27SDimitry Andricdefm "" : LMULSchedReads<"ReadVRGatherVI_data">; 7586e75b2fbSDimitry Andric// 16.5. Vector Compress Instruction 75906c3fb27SDimitry Andricdefm "" : LMULSEWSchedReads<"ReadVCompressV">; 7606e75b2fbSDimitry Andric// 16.6. Whole Vector Register Move 761bdd1243dSDimitry Andric// These are already LMUL aware 7626e75b2fbSDimitry Andricdef ReadVMov1V : SchedRead; 7636e75b2fbSDimitry Andricdef ReadVMov2V : SchedRead; 7646e75b2fbSDimitry Andricdef ReadVMov4V : SchedRead; 7656e75b2fbSDimitry Andricdef ReadVMov8V : SchedRead; 7666e75b2fbSDimitry Andric 7676e75b2fbSDimitry Andric// Others 7686e75b2fbSDimitry Andricdef ReadVMask : SchedRead; 7695f757f3fSDimitry Andricdef ReadVMergeOp_WorstCase : SchedRead; 7705f757f3fSDimitry Andricforeach mx = SchedMxList in { 7715f757f3fSDimitry Andric def ReadVMergeOp_ # mx : SchedRead; 7725f757f3fSDimitry Andric foreach sew = SchedSEWSet<mx>.val in 7735f757f3fSDimitry Andric def ReadVMergeOp_ # mx # "_E" # sew : SchedRead; 7745f757f3fSDimitry Andric} 7756e75b2fbSDimitry Andric 7766e75b2fbSDimitry Andric//===----------------------------------------------------------------------===// 7776e75b2fbSDimitry Andric/// Define default scheduler resources for V. 7786e75b2fbSDimitry Andric 7796e75b2fbSDimitry Andricmulticlass UnsupportedSchedV { 7806e75b2fbSDimitry Andriclet Unsupported = true in { 7816e75b2fbSDimitry Andric 782bdd1243dSDimitry Andric// 3.6 Vector Byte Length vlenb 783bdd1243dSDimitry Andricdef : WriteRes<WriteRdVLENB, []>; 784bdd1243dSDimitry Andric 785bdd1243dSDimitry Andric// 6. Configuration-Setting Instructions 786bdd1243dSDimitry Andricdef : WriteRes<WriteVSETVLI, []>; 787bdd1243dSDimitry Andricdef : WriteRes<WriteVSETIVLI, []>; 788bdd1243dSDimitry Andricdef : WriteRes<WriteVSETVL, []>; 789bdd1243dSDimitry Andric 7906e75b2fbSDimitry Andric// 7. Vector Loads and Stores 791bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDE", []>; 792bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTE", []>; 793bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDM", []>; 794bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTM", []>; 795bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDS8", []>; 796bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDS16", []>; 797bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDS32", []>; 798bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDS64", []>; 799bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTS8", []>; 800bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTS16", []>; 801bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTS32", []>; 802bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTS64", []>; 803bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDUX8", []>; 804bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDUX16", []>; 805bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDUX32", []>; 806bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDUX64", []>; 807bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDOX8", []>; 808bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDOX16", []>; 809bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDOX32", []>; 810bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDOX64", []>; 811bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTUX8", []>; 812bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTUX16", []>; 813bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTUX32", []>; 814bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTUX64", []>; 815bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTOX8", []>; 816bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTOX16", []>; 817bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTOX32", []>; 818bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSTOX64", []>; 819bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVLDFF", []>; 820bdd1243dSDimitry Andric// These are already LMUL aware 821bdd1243dSDimitry Andricdef : WriteRes<WriteVLD1R, []>; 822bdd1243dSDimitry Andricdef : WriteRes<WriteVLD2R, []>; 823bdd1243dSDimitry Andricdef : WriteRes<WriteVLD4R, []>; 824bdd1243dSDimitry Andricdef : WriteRes<WriteVLD8R, []>; 8256e75b2fbSDimitry Andricdef : WriteRes<WriteVST1R, []>; 8266e75b2fbSDimitry Andricdef : WriteRes<WriteVST2R, []>; 8276e75b2fbSDimitry Andricdef : WriteRes<WriteVST4R, []>; 8286e75b2fbSDimitry Andricdef : WriteRes<WriteVST8R, []>; 829753f127fSDimitry Andric// Vector Segment Loads and Stores 830753f127fSDimitry Andricforeach nf=2-8 in { 831753f127fSDimitry Andric foreach eew = [8, 16, 32, 64] in { 832bdd1243dSDimitry Andric defm "" : LMULWriteRes <"WriteVLSEG" # nf # "e" # eew, []>; 833bdd1243dSDimitry Andric defm "" : LMULWriteRes <"WriteVLSEGFF" # nf # "e" # eew, []>; 834bdd1243dSDimitry Andric defm "" : LMULWriteRes <"WriteVSSEG" # nf # "e" # eew, []>; 835bdd1243dSDimitry Andric defm "" : LMULWriteRes <"WriteVLSSEG" # nf # "e" # eew, []>; 836bdd1243dSDimitry Andric defm "" : LMULWriteRes <"WriteVSSSEG" # nf # "e" # eew, []>; 837bdd1243dSDimitry Andric defm "" : LMULWriteRes <"WriteVLUXSEG" # nf # "e" # eew, []>; 838bdd1243dSDimitry Andric defm "" : LMULWriteRes <"WriteVLOXSEG" # nf # "e" # eew, []>; 839bdd1243dSDimitry Andric defm "" : LMULWriteRes <"WriteVSUXSEG" # nf # "e" # eew, []>; 840bdd1243dSDimitry Andric defm "" : LMULWriteRes <"WriteVSOXSEG" # nf # "e" # eew, []>; 841753f127fSDimitry Andric } 842753f127fSDimitry Andric} 8436e75b2fbSDimitry Andric 844bdd1243dSDimitry Andric// 11. Vector Integer Arithmetic Instructions 845bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIALUV", []>; 846bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIALUX", []>; 847bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIALUI", []>; 848bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWALUV", []>; 849bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWALUX", []>; 850bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWALUI", []>; 851bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVExtV", []>; 852bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICALUV", []>; 853bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICALUX", []>; 854bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICALUI", []>; 855bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVShiftV", []>; 856bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVShiftX", []>; 857bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVShiftI", []>; 858bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNShiftV", []>; 859bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNShiftX", []>; 860bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNShiftI", []>; 861bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICmpV", []>; 862bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICmpX", []>; 863bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVICmpI", []>; 86406c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVIMinMaxV", []>; 86506c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVIMinMaxX", []>; 866bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMulV", []>; 867bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMulX", []>; 86806c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVIDivV", []>; 86906c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVIDivX", []>; 870bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWMulV", []>; 871bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWMulX", []>; 872bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMulAddV", []>; 873bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMulAddX", []>; 874bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWMulAddV", []>; 875bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVIWMulAddX", []>; 876bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMergeV", []>; 877bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMergeX", []>; 878bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMergeI", []>; 879bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMovV", []>; 880bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMovX", []>; 881bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVIMovI", []>; 8826e75b2fbSDimitry Andric 883bdd1243dSDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions 884bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSALUV", []>; 885bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSALUX", []>; 886bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSALUI", []>; 887bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVAALUV", []>; 888bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVAALUX", []>; 889bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSMulV", []>; 890bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSMulX", []>; 891bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSShiftV", []>; 892bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSShiftX", []>; 893bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVSShiftI", []>; 894bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNClipV", []>; 895bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNClipX", []>; 896bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVNClipI", []>; 8976e75b2fbSDimitry Andric 898bdd1243dSDimitry Andric// 13. Vector Floating-Point Instructions 899*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFALUV", []>; 900*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFALUF", []>; 901*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWALUV", []>; 902*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWALUF", []>; 903*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMulV", []>; 904*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMulF", []>; 90506c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFDivV", []>; 90606c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFDivF", []>; 907*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWMulV", []>; 908*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWMulF", []>; 909*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMulAddV", []>; 910*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMulAddF", []>; 911*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWMulAddV", []>; 912*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWMulAddF", []>; 91306c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFSqrtV", []>; 914*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFRecpV", []>; 915*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMinMaxV", []>; 916*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFMinMaxF", []>; 917*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFSgnjV", []>; 918*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFSgnjF", []>; 91906c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVFCmpV", []>; 92006c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVFCmpF", []>; 921bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVFClassV", []>; 922bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVFMergeV", []>; 923bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVFMovV", []>; 924*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFCvtIToFV", []>; 925bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVFCvtFToIV", []>; 926*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResW<"WriteVFWCvtIToFV", []>; 927bdd1243dSDimitry Andricdefm "" : LMULWriteResFW<"WriteVFWCvtFToIV", []>; 928*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFWCvtFToFV", []>; 929*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFNCvtIToFV", []>; 930bdd1243dSDimitry Andricdefm "" : LMULWriteResW<"WriteVFNCvtFToIV", []>; 931*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteResFW<"WriteVFNCvtFToFV", []>; 9326e75b2fbSDimitry Andric 933bdd1243dSDimitry Andric// 14. Vector Reduction Operations 93406c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVIRedV_From", []>; 93506c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVIRedMinMaxV_From", []>; 93606c3fb27SDimitry Andricdefm "" : LMULSEWWriteResWRed<"WriteVIWRedV_From", []>; 93706c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFRedV_From", []>; 93806c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFRedOV_From", []>; 93906c3fb27SDimitry Andricdefm "" : LMULSEWWriteResF<"WriteVFRedMinMaxV_From", []>; 94006c3fb27SDimitry Andricdefm "" : LMULSEWWriteResFWRed<"WriteVFWRedV_From", []>; 94106c3fb27SDimitry Andricdefm "" : LMULSEWWriteResFWRed<"WriteVFWRedOV_From", []>; 9426e75b2fbSDimitry Andric 943bdd1243dSDimitry Andric// 15. Vector Mask Instructions 944bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVMALUV", []>; 945bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVMPopV", []>; 946bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVMFFSV", []>; 947bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVMSFSV", []>; 948*0fca6ea1SDimitry Andricdefm "" : LMULWriteRes<"WriteVIotaV", []>; 949*0fca6ea1SDimitry Andricdefm "" : LMULWriteRes<"WriteVIdxV", []>; 9506e75b2fbSDimitry Andric 951bdd1243dSDimitry Andric// 16. Vector Permutation Instructions 952*0fca6ea1SDimitry Andricdef : WriteRes<WriteVMovSX, []>; 953*0fca6ea1SDimitry Andricdef : WriteRes<WriteVMovXS, []>; 954*0fca6ea1SDimitry Andricdef : WriteRes<WriteVMovSF, []>; 955*0fca6ea1SDimitry Andricdef : WriteRes<WriteVMovFS, []>; 956*0fca6ea1SDimitry Andricdefm "" : LMULWriteRes<"WriteVSlideUpX", []>; 957*0fca6ea1SDimitry Andricdefm "" : LMULWriteRes<"WriteVSlideDownX", []>; 958*0fca6ea1SDimitry Andricdefm "" : LMULWriteRes<"WriteVSlideI", []>; 959bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVISlide1X", []>; 960bdd1243dSDimitry Andricdefm "" : LMULWriteRes<"WriteVFSlide1F", []>; 96106c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVRGatherVV", []>; 962*0fca6ea1SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVRGatherEI16VV", []>; 96306c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVRGatherVX", []>; 96406c3fb27SDimitry Andricdefm "" : LMULWriteRes<"WriteVRGatherVI", []>; 96506c3fb27SDimitry Andricdefm "" : LMULSEWWriteRes<"WriteVCompressV", []>; 966bdd1243dSDimitry Andric// These are already LMUL aware 9676e75b2fbSDimitry Andricdef : WriteRes<WriteVMov1V, []>; 9686e75b2fbSDimitry Andricdef : WriteRes<WriteVMov2V, []>; 9696e75b2fbSDimitry Andricdef : WriteRes<WriteVMov4V, []>; 9706e75b2fbSDimitry Andricdef : WriteRes<WriteVMov8V, []>; 9716e75b2fbSDimitry Andric 972bdd1243dSDimitry Andric// 6. Configuration-Setting Instructions 973bdd1243dSDimitry Andricdef : ReadAdvance<ReadVSETVLI, 0>; 974bdd1243dSDimitry Andricdef : ReadAdvance<ReadVSETVL, 0>; 975bdd1243dSDimitry Andric 9766e75b2fbSDimitry Andric// 7. Vector Loads and Stores 97706c3fb27SDimitry Andricdef : ReadAdvance<ReadVLDX, 0>; 97806c3fb27SDimitry Andricdef : ReadAdvance<ReadVSTX, 0>; 979bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTEV", 0>; 980bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTM", 0>; 98106c3fb27SDimitry Andricdef : ReadAdvance<ReadVLDSX, 0>; 98206c3fb27SDimitry Andricdef : ReadAdvance<ReadVSTSX, 0>; 983bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS8V", 0>; 984bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS16V", 0>; 985bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS32V", 0>; 986bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTS64V", 0>; 987bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVLDUXV", 0>; 988bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVLDOXV", 0>; 989bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUXV", 0>; 990bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX8", 0>; 991bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX16", 0>; 992bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX32", 0>; 993bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX64", 0>; 994bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX8V", 0>; 995bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX16V", 0>; 996bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX32V", 0>; 997bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTUX64V", 0>; 998bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX8", 0>; 999bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX16", 0>; 1000bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX32", 0>; 1001bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX64", 0>; 1002bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOXV", 0>; 1003bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX8V", 0>; 1004bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX16V", 0>; 1005bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX32V", 0>; 1006bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSTOX64V", 0>; 1007bdd1243dSDimitry Andric// These are already LMUL aware 10086e75b2fbSDimitry Andricdef : ReadAdvance<ReadVST1R, 0>; 10096e75b2fbSDimitry Andricdef : ReadAdvance<ReadVST2R, 0>; 10106e75b2fbSDimitry Andricdef : ReadAdvance<ReadVST4R, 0>; 10116e75b2fbSDimitry Andricdef : ReadAdvance<ReadVST8R, 0>; 10126e75b2fbSDimitry Andric 1013bdd1243dSDimitry Andric// 11. Vector Integer Arithmetic Instructions 1014bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIALUV", 0>; 1015bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIALUX", 0>; 1016bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWALUV", 0>; 1017bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWALUX", 0>; 1018bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVExtV", 0>; 1019bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVICALUV", 0>; 1020bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVICALUX", 0>; 1021bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVShiftV", 0>; 1022bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVShiftX", 0>; 1023bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNShiftV", 0>; 1024bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNShiftX", 0>; 1025bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVICmpV", 0>; 1026bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVICmpX", 0>; 102706c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMinMaxV", 0>; 102806c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMinMaxX", 0>; 1029bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMulV", 0>; 1030bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMulX", 0>; 103106c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVIDivV", 0>; 103206c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVIDivX", 0>; 1033bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWMulV", 0>; 1034bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWMulX", 0>; 1035bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMulAddV", 0>; 1036bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMulAddX", 0>; 1037bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWMulAddV", 0>; 1038bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVIWMulAddX", 0>; 1039bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMergeV", 0>; 1040bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMergeX", 0>; 1041bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMovV", 0>; 1042bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVIMovX", 0>; 10436e75b2fbSDimitry Andric 1044bdd1243dSDimitry Andric// 12. Vector Fixed-Point Arithmetic Instructions 1045bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSALUV", 0>; 1046bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSALUX", 0>; 1047bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVAALUV", 0>; 1048bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVAALUX", 0>; 1049bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSMulV", 0>; 1050bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSMulX", 0>; 1051bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSShiftV", 0>; 1052bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVSShiftX", 0>; 1053bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNClipV", 0>; 1054bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVNClipX", 0>; 10556e75b2fbSDimitry Andric 1056bdd1243dSDimitry Andric// 13. Vector Floating-Point Instructions 1057*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFALUV", 0>; 1058*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFALUF", 0>; 1059*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWALUV", 0>; 1060*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWALUF", 0>; 1061*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulV", 0>; 1062*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulF", 0>; 106306c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFDivV", 0>; 106406c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFDivF", 0>; 1065*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulV", 0>; 1066*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulF", 0>; 1067*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulAddV", 0>; 1068*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMulAddF", 0>; 1069*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulAddV", 0>; 1070*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWMulAddF", 0>; 107106c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSqrtV", 0>; 1072*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFRecpV", 0>; 1073*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMinMaxV", 0>; 1074*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFMinMaxF", 0>; 1075*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSgnjV", 0>; 1076*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFSgnjF", 0>; 107706c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCmpV", 0>; 107806c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCmpF", 0>; 1079bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFClassV", 0>; 1080bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMergeV", 0>; 1081bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMergeF", 0>; 1082bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFMovF", 0>; 1083*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceF<"ReadVFCvtIToFV", 0>; 1084bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFCvtFToIV", 0>; 1085*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceW<"ReadVFWCvtIToFV", 0>; 1086bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceFW<"ReadVFWCvtFToIV", 0>; 1087*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFWCvtFToFV", 0>; 1088*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFNCvtIToFV", 0>; 1089bdd1243dSDimitry Andricdefm "" : LMULReadAdvanceW<"ReadVFNCvtFToIV", 0>; 1090*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvanceFW<"ReadVFNCvtFToFV", 0>; 10916e75b2fbSDimitry Andric 1092bdd1243dSDimitry Andric// 14. Vector Reduction Operations 10936e75b2fbSDimitry Andricdef : ReadAdvance<ReadVIRedV, 0>; 10946e75b2fbSDimitry Andricdef : ReadAdvance<ReadVIRedV0, 0>; 10956e75b2fbSDimitry Andricdef : ReadAdvance<ReadVIWRedV, 0>; 10966e75b2fbSDimitry Andricdef : ReadAdvance<ReadVIWRedV0, 0>; 10976e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFRedV, 0>; 10986e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFRedV0, 0>; 10996e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFRedOV, 0>; 11006e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFRedOV0, 0>; 110106c3fb27SDimitry Andricdef : ReadAdvance<ReadVFRedMinMaxV, 0>; 11026e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFWRedV, 0>; 11036e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFWRedV0, 0>; 11046e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFWRedOV, 0>; 11056e75b2fbSDimitry Andricdef : ReadAdvance<ReadVFWRedOV0, 0>; 11066e75b2fbSDimitry Andric 1107bdd1243dSDimitry Andric// 15. Vector Mask Instructions 1108bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVMALUV", 0>; 1109bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVMPopV", 0>; 1110bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVMFFSV", 0>; 1111bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVMSFSV", 0>; 1112*0fca6ea1SDimitry Andricdefm "" : LMULReadAdvance<"ReadVIotaV", 0>; 11136e75b2fbSDimitry Andric 1114bdd1243dSDimitry Andric// 16. Vector Permutation Instructions 1115*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovXS, 0>; 1116*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSX_V, 0>; 1117*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSX_X, 0>; 1118*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovFS, 0>; 1119*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSF_V, 0>; 1120*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadVMovSF_F, 0>; 1121bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVISlideV", 0>; 1122bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVISlideX", 0>; 1123bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFSlideV", 0>; 1124bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVFSlideF", 0>; 112506c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherVV_data", 0>; 112606c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherVV_index", 0>; 1127*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherEI16VV_data", 0>; 1128*0fca6ea1SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVRGatherEI16VV_index", 0>; 112906c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVX_data", 0>; 113006c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVX_index", 0>; 113106c3fb27SDimitry Andricdefm "" : LMULReadAdvance<"ReadVRGatherVI_data", 0>; 1132bdd1243dSDimitry Andricdefm "" : LMULReadAdvance<"ReadVGatherV", 0>; 113306c3fb27SDimitry Andricdefm "" : LMULSEWReadAdvance<"ReadVCompressV", 0>; 1134bdd1243dSDimitry Andric// These are already LMUL aware 11356e75b2fbSDimitry Andricdef : ReadAdvance<ReadVMov1V, 0>; 11366e75b2fbSDimitry Andricdef : ReadAdvance<ReadVMov2V, 0>; 11376e75b2fbSDimitry Andricdef : ReadAdvance<ReadVMov4V, 0>; 11386e75b2fbSDimitry Andricdef : ReadAdvance<ReadVMov8V, 0>; 11396e75b2fbSDimitry Andric 11406e75b2fbSDimitry Andric// Others 11416e75b2fbSDimitry Andricdef : ReadAdvance<ReadVMask, 0>; 11425f757f3fSDimitry Andricdef : ReadAdvance<ReadVMergeOp_WorstCase, 0>; 11435f757f3fSDimitry Andricforeach mx = SchedMxList in { 11445f757f3fSDimitry Andric def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx), 0>; 11455f757f3fSDimitry Andric foreach sew = SchedSEWSet<mx>.val in 11465f757f3fSDimitry Andric def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx # "_E" # sew), 0>; 11475f757f3fSDimitry Andric} 11486e75b2fbSDimitry Andric 11496e75b2fbSDimitry Andric} // Unsupported 11506e75b2fbSDimitry Andric} // UnsupportedSchedV 1151