================
@@ -108,935 +108,1006 @@ def TTAscalonXModel : SchedMachineModel {
                              HasStdExtZcmt, HasStdExtZknd, HasStdExtZkne,
                              HasStdExtZknh, HasStdExtZksed, HasStdExtZksh,
                              HasStdExtZkr];
-}
-
-let SchedModel = TTAscalonXModel in {
 
-//===----------------------------------------------------------------------===//
-// Define each kind of processor resource and number available.
-
-let BufferSize = 16 in {
-  def AscalonLS : ProcResource<3>;
-  def AscalonFXA : ProcResource<1>; // ALU, FP/VEC -> INT, MUL, DIV, CSR
-  def AscalonFXB : ProcResource<1>; // ALU, INT -> FP/VEC
-  def AscalonFXC : ProcResource<2>; // ALU, BR
-  def AscalonFXD : ProcResource<2>; // ALU
-  def AscalonFX : ProcResGroup<[AscalonFXA, AscalonFXB, AscalonFXC, 
AscalonFXD]>;
-  // FP
-  def AscalonFPA : ProcResource<1>; // Pipe A also handles FP/VEC -> INT
-  def AscalonFPB : ProcResource<1>;
-  def AscalonFP : ProcResGroup<[AscalonFPA, AscalonFPB]>;
-  // Vector
-  def AscalonVA : ProcResource<1>;
-  def AscalonVB : ProcResource<1>;
-  def AscalonV : ProcResGroup<[AscalonVA, AscalonVB]>;
+  string Name;
+  bit HasReducedFP64VectorThroughput;
 }
 
+def TTAscalonXModel : TTAscalonSchedMachineModel {
+  // TODO: This should technically be AscalonX.
+  let Name = "Ascalon";
+  let HasReducedFP64VectorThroughput = false;
+}
 
-//===----------------------------------------------------------------------===//
+def TTAscalonXGModel : TTAscalonSchedMachineModel {
+  let Name = "AscalonXG";
+  let HasReducedFP64VectorThroughput = true;
+}
 
-// Branching
-def : WriteRes<WriteJmp, [AscalonFXC]>;
-def : WriteRes<WriteJal, [AscalonFXC]>;
-def : WriteRes<WriteJalr, [AscalonFXC]>;
-
-// Integer arithmetic and logic
-def : WriteRes<WriteIALU32, [AscalonFX]>;
-def : WriteRes<WriteIALU, [AscalonFX]>;
-def : WriteRes<WriteShiftImm32, [AscalonFX]>;
-def : WriteRes<WriteShiftImm, [AscalonFX]>;
-def : WriteRes<WriteShiftReg32, [AscalonFX]>;
-def : WriteRes<WriteShiftReg, [AscalonFX]>;
-
-// Integer multiplication
-let Latency = 3 in {
-def : WriteRes<WriteIMul, [AscalonFXA]>;
-def : WriteRes<WriteIMul32, [AscalonFXA]>;
+/// Latency and occupancy of the extra FP64 vector unit on Ascalon XG for
+/// vector instructions producing FP64 results.
+class AscalonXGFP64Vec<int Cycles> {
+  int Latency = !add(Cycles, 8);
+  int ReleaseAtCycles = !mul(Cycles, 4);
 }
 
-// Integer division
-// Worst case latency is used.
+multiclass TTAscalonSchedResources<bit ReducedFP64Vec> {
+  
//===--------------------------------------------------------------------===//
+  // Define each kind of processor resource and number available.
+  let BufferSize = 16 in {
+    def LS : ProcResource<3>;
+    def FXA : ProcResource<1>; // ALU, FP/VEC -> INT, MUL, DIV, CSR
+    def FXB : ProcResource<1>; // ALU, INT -> FP/VEC
+    def FXC : ProcResource<2>; // ALU, BR
+    def FXD : ProcResource<2>; // ALU
+    def FX : ProcResGroup<[!cast<ProcResource>(NAME # "FXA"),
+                           !cast<ProcResource>(NAME # "FXB"),
+                           !cast<ProcResource>(NAME # "FXC"),
+                           !cast<ProcResource>(NAME # "FXD")]>;
+    // FP
+    def FPA : ProcResource<1>; // Pipe A also handles FP/VEC -> INT
+    def FPB : ProcResource<1>;
+    def FP : ProcResGroup<[!cast<ProcResource>(NAME # "FPA"),
+                           !cast<ProcResource>(NAME # "FPB")]>;
+    // Vector
+    def VA : ProcResource<1>;
+    def VB : ProcResource<1>;
+    def V : ProcResGroup<[!cast<ProcResource>(NAME # "VA"),
+                          !cast<ProcResource>(NAME # "VB")]>;
+    // Extra unit that models the reduced throughput of vector instructions
+    // producing FP64 results.
+    if ReducedFP64Vec then
+      def FP64V : ProcResource<2>;
+  }
 
-let Latency = 7, ReleaseAtCycles = [7] in {
-  def : WriteRes<WriteIDiv32, [AscalonFXA]>;
-  def : WriteRes<WriteIDiv, [AscalonFXA]>;
-  def : WriteRes<WriteIRem32, [AscalonFXA]>;
-  def : WriteRes<WriteIRem, [AscalonFXA]>;
-}
+  defvar AscalonLS = !cast<ProcResource>(NAME # "LS");
+  defvar AscalonFXA = !cast<ProcResource>(NAME # "FXA");
+  defvar AscalonFXB = !cast<ProcResource>(NAME # "FXB");
+  defvar AscalonFXC = !cast<ProcResource>(NAME # "FXC");
+  defvar AscalonFXD = !cast<ProcResource>(NAME # "FXD");
+  defvar AscalonFX = !cast<ProcResGroup>(NAME # "FX");
+  defvar AscalonFPA = !cast<ProcResource>(NAME # "FPA");
+  defvar AscalonFPB = !cast<ProcResource>(NAME # "FPB");
+  defvar AscalonFP = !cast<ProcResGroup>(NAME # "FP");
+  defvar AscalonVA = !cast<ProcResource>(NAME # "VA");
+  defvar AscalonVB = !cast<ProcResource>(NAME # "VB");
+  defvar AscalonV = !cast<ProcResGroup>(NAME # "V");
+
+  // Only used when ReducedFP64Vec is set; fall back to the vector pipes
+  // otherwise so that the defvar is always well-formed.
+  defvar AscalonFP64V = !if(ReducedFP64Vec,
+                            !cast<ProcResource>(NAME # "FP64V"), AscalonV);
+
+  
//===--------------------------------------------------------------------===//
+  // Branching
+  def : WriteRes<WriteJmp, [AscalonFXC]>;
+  def : WriteRes<WriteJal, [AscalonFXC]>;
+  def : WriteRes<WriteJalr, [AscalonFXC]>;
+
+  // Integer arithmetic and logic
+  def : WriteRes<WriteIALU32, [AscalonFX]>;
+  def : WriteRes<WriteIALU, [AscalonFX]>;
+  def : WriteRes<WriteShiftImm32, [AscalonFX]>;
+  def : WriteRes<WriteShiftImm, [AscalonFX]>;
+  def : WriteRes<WriteShiftReg32, [AscalonFX]>;
+  def : WriteRes<WriteShiftReg, [AscalonFX]>;
+
+  // Integer multiplication
+  let Latency = 3 in {
+  def : WriteRes<WriteIMul, [AscalonFXA]>;
+  def : WriteRes<WriteIMul32, [AscalonFXA]>;
+  }
 
-// Bitmanip
-def : WriteRes<WriteRotateImm, [AscalonFX]>;
-def : WriteRes<WriteRotateImm32, [AscalonFX]>;
-def : WriteRes<WriteRotateReg, [AscalonFX]>;
-def : WriteRes<WriteRotateReg32, [AscalonFX]>;
-
-def : WriteRes<WriteCLZ, [AscalonFX]>;
-def : WriteRes<WriteCLZ32, [AscalonFX]>;
-def : WriteRes<WriteCTZ, [AscalonFX]>;
-def : WriteRes<WriteCTZ32, [AscalonFX]>;
-
-def : WriteRes<WriteCPOP, [AscalonFX]>;
-def : WriteRes<WriteCPOP32, [AscalonFX]>;
-
-def : WriteRes<WriteORCB, [AscalonFX]>;
-
-def : WriteRes<WriteIMinMax, [AscalonFX]>;
-
-def : WriteRes<WriteREV8, [AscalonFX]>;
-
-def : WriteRes<WriteSHXADD, [AscalonFX]>;
-def : WriteRes<WriteSHXADD32, [AscalonFX]>;
-
-// Single-bit instructions
-def : WriteRes<WriteSingleBit, [AscalonFX]>;
-def : WriteRes<WriteSingleBitImm, [AscalonFX]>;
-def : WriteRes<WriteBEXT, [AscalonFX]>;
-def : WriteRes<WriteBEXTI, [AscalonFX]>;
-
-// Memory
-def : WriteRes<WriteSTB, [AscalonLS]>;
-def : WriteRes<WriteSTH, [AscalonLS]>;
-def : WriteRes<WriteSTW, [AscalonLS]>;
-def : WriteRes<WriteSTD, [AscalonLS]>;
-def : WriteRes<WriteFST16, [AscalonLS]>;
-def : WriteRes<WriteFST32, [AscalonLS]>;
-def : WriteRes<WriteFST64, [AscalonLS]>;
-
-let Latency = 4 in {
-def : WriteRes<WriteLDB, [AscalonLS]>;
-def : WriteRes<WriteLDH, [AscalonLS]>;
-def : WriteRes<WriteLDW, [AscalonLS]>;
-def : WriteRes<WriteLDD, [AscalonLS]>;
-def : WriteRes<WriteFLD16, [AscalonLS]>;
-def : WriteRes<WriteFLD32, [AscalonLS]>;
-def : WriteRes<WriteFLD64, [AscalonLS]>;
-}
+  // Integer division
+  // Worst case latency is used.
 
-// Atomic memory
-def : WriteRes<WriteAtomicSTW, [AscalonLS]>;
-def : WriteRes<WriteAtomicSTD, [AscalonLS]>;
+  let Latency = 7, ReleaseAtCycles = [7] in {
+    def : WriteRes<WriteIDiv32, [AscalonFXA]>;
+    def : WriteRes<WriteIDiv, [AscalonFXA]>;
+    def : WriteRes<WriteIRem32, [AscalonFXA]>;
+    def : WriteRes<WriteIRem, [AscalonFXA]>;
+  }
 
-let Latency = 4 in {
-def : WriteRes<WriteAtomicW, [AscalonLS]>;
-def : WriteRes<WriteAtomicD, [AscalonLS]>;
-def : WriteRes<WriteAtomicLDW, [AscalonLS]>;
-def : WriteRes<WriteAtomicLDD, [AscalonLS]>;
-}
+  // Bitmanip
+  def : WriteRes<WriteRotateImm, [AscalonFX]>;
+  def : WriteRes<WriteRotateImm32, [AscalonFX]>;
+  def : WriteRes<WriteRotateReg, [AscalonFX]>;
+  def : WriteRes<WriteRotateReg32, [AscalonFX]>;
+
+  def : WriteRes<WriteCLZ, [AscalonFX]>;
+  def : WriteRes<WriteCLZ32, [AscalonFX]>;
+  def : WriteRes<WriteCTZ, [AscalonFX]>;
+  def : WriteRes<WriteCTZ32, [AscalonFX]>;
+
+  def : WriteRes<WriteCPOP, [AscalonFX]>;
+  def : WriteRes<WriteCPOP32, [AscalonFX]>;
+
+  def : WriteRes<WriteORCB, [AscalonFX]>;
+
+  def : WriteRes<WriteIMinMax, [AscalonFX]>;
+
+  def : WriteRes<WriteREV8, [AscalonFX]>;
+
+  def : WriteRes<WriteSHXADD, [AscalonFX]>;
+  def : WriteRes<WriteSHXADD32, [AscalonFX]>;
+
+  // Single-bit instructions
+  def : WriteRes<WriteSingleBit, [AscalonFX]>;
+  def : WriteRes<WriteSingleBitImm, [AscalonFX]>;
+  def : WriteRes<WriteBEXT, [AscalonFX]>;
+  def : WriteRes<WriteBEXTI, [AscalonFX]>;
+
+  // Memory
+  def : WriteRes<WriteSTB, [AscalonLS]>;
+  def : WriteRes<WriteSTH, [AscalonLS]>;
+  def : WriteRes<WriteSTW, [AscalonLS]>;
+  def : WriteRes<WriteSTD, [AscalonLS]>;
+  def : WriteRes<WriteFST16, [AscalonLS]>;
+  def : WriteRes<WriteFST32, [AscalonLS]>;
+  def : WriteRes<WriteFST64, [AscalonLS]>;
+
+  let Latency = 4 in {
+  def : WriteRes<WriteLDB, [AscalonLS]>;
+  def : WriteRes<WriteLDH, [AscalonLS]>;
+  def : WriteRes<WriteLDW, [AscalonLS]>;
+  def : WriteRes<WriteLDD, [AscalonLS]>;
+  def : WriteRes<WriteFLD16, [AscalonLS]>;
+  def : WriteRes<WriteFLD32, [AscalonLS]>;
+  def : WriteRes<WriteFLD64, [AscalonLS]>;
+  }
 
-// Half precision.
-let Latency = 3 in {
-def : WriteRes<WriteFAdd16, [AscalonFP]>;
-def : WriteRes<WriteFMul16, [AscalonFP]>;
-def : WriteRes<WriteFMA16, [AscalonFP]>;
-def : WriteRes<WriteFSGNJ16, [AscalonFP]>;
-def : WriteRes<WriteFMinMax16, [AscalonFP]>;
-}
+  // Atomic memory
+  def : WriteRes<WriteAtomicSTW, [AscalonLS]>;
+  def : WriteRes<WriteAtomicSTD, [AscalonLS]>;
 
-let Latency = 7, ReleaseAtCycles = [7] in {
-def :  WriteRes<WriteFDiv16, [AscalonFP]>;
-def :  WriteRes<WriteFSqrt16, [AscalonFP]>;
-}
+  let Latency = 4 in {
+  def : WriteRes<WriteAtomicW, [AscalonLS]>;
+  def : WriteRes<WriteAtomicD, [AscalonLS]>;
+  def : WriteRes<WriteAtomicLDW, [AscalonLS]>;
+  def : WriteRes<WriteAtomicLDD, [AscalonLS]>;
+  }
 
-// Single precision.
-let Latency = 3 in {
-def : WriteRes<WriteFAdd32, [AscalonFP]>;
-def : WriteRes<WriteFMul32, [AscalonFP]>;
-def : WriteRes<WriteFMA32, [AscalonFP]>;
-def : WriteRes<WriteFSGNJ32, [AscalonFP]>;
-def : WriteRes<WriteFMinMax32, [AscalonFP]>;
-}
+  // Half precision.
+  let Latency = 3 in {
+  def : WriteRes<WriteFAdd16, [AscalonFP]>;
+  def : WriteRes<WriteFMul16, [AscalonFP]>;
+  def : WriteRes<WriteFMA16, [AscalonFP]>;
+  def : WriteRes<WriteFSGNJ16, [AscalonFP]>;
+  def : WriteRes<WriteFMinMax16, [AscalonFP]>;
+  }
 
-let Latency = 7, ReleaseAtCycles = [7] in {
-def :  WriteRes<WriteFDiv32, [AscalonFP]>;
-def :  WriteRes<WriteFSqrt32, [AscalonFP]>;
-}
+  let Latency = 7, ReleaseAtCycles = [7] in {
+  def :  WriteRes<WriteFDiv16, [AscalonFP]>;
+  def :  WriteRes<WriteFSqrt16, [AscalonFP]>;
+  }
 
-// Double precision
-let Latency = 3 in {
-def : WriteRes<WriteFAdd64, [AscalonFP]>;
-def : WriteRes<WriteFMul64, [AscalonFP]>;
-def : WriteRes<WriteFMA64, [AscalonFP]>;
-def : WriteRes<WriteFSGNJ64, [AscalonFP]>;
-def : WriteRes<WriteFMinMax64, [AscalonFP]>;
-}
+  // Single precision.
+  let Latency = 3 in {
+  def : WriteRes<WriteFAdd32, [AscalonFP]>;
+  def : WriteRes<WriteFMul32, [AscalonFP]>;
+  def : WriteRes<WriteFMA32, [AscalonFP]>;
+  def : WriteRes<WriteFSGNJ32, [AscalonFP]>;
+  def : WriteRes<WriteFMinMax32, [AscalonFP]>;
+  }
 
-let Latency = 12, ReleaseAtCycles = [12] in {
-def :  WriteRes<WriteFDiv64, [AscalonFP]>;
-def :  WriteRes<WriteFSqrt64, [AscalonFP]>;
-}
+  let Latency = 7, ReleaseAtCycles = [7] in {
+  def :  WriteRes<WriteFDiv32, [AscalonFP]>;
+  def :  WriteRes<WriteFSqrt32, [AscalonFP]>;
+  }
 
-// Conversions
-def : WriteRes<WriteFCvtI32ToF16, [AscalonFXB]>;
-def : WriteRes<WriteFCvtI32ToF32, [AscalonFXB]>;
-def : WriteRes<WriteFCvtI32ToF64, [AscalonFXB]>;
-def : WriteRes<WriteFCvtI64ToF16, [AscalonFXB]>;
-def : WriteRes<WriteFCvtI64ToF32, [AscalonFXB]>;
-def : WriteRes<WriteFCvtI64ToF64, [AscalonFXB]>;
-def : WriteRes<WriteFCvtF16ToI32, [AscalonFXA]>;
-def : WriteRes<WriteFCvtF16ToI64, [AscalonFXA]>;
-def : WriteRes<WriteFCvtF16ToF32, [AscalonFP]>;
-def : WriteRes<WriteFCvtF16ToF64, [AscalonFP]>;
-def : WriteRes<WriteFCvtF32ToI32, [AscalonFXA]>;
-def : WriteRes<WriteFCvtF32ToI64, [AscalonFXA]>;
-def : WriteRes<WriteFCvtF32ToF16, [AscalonFP]>;
-def : WriteRes<WriteFCvtF32ToF64, [AscalonFP]>;
-def : WriteRes<WriteFCvtF64ToI32, [AscalonFXA]>;
-def : WriteRes<WriteFCvtF64ToI64, [AscalonFXA]>;
-def : WriteRes<WriteFCvtF64ToF16, [AscalonFP]>;
-def : WriteRes<WriteFCvtF64ToF32, [AscalonFP]>;
-
-def : WriteRes<WriteFClass16, [AscalonFP]>;
-def : WriteRes<WriteFClass32, [AscalonFP]>;
-def : WriteRes<WriteFClass64, [AscalonFP]>;
-def : WriteRes<WriteFCmp16, [AscalonFP]>;
-def : WriteRes<WriteFCmp32, [AscalonFP]>;
-def : WriteRes<WriteFCmp64, [AscalonFP]>;
-
-def : WriteRes<WriteFMovI16ToF16, [AscalonFXB]>;
-def : WriteRes<WriteFMovF16ToI16, [AscalonFXA]>;
-def : WriteRes<WriteFMovI32ToF32, [AscalonFXB]>;
-def : WriteRes<WriteFMovF32ToI32, [AscalonFXA]>;
-def : WriteRes<WriteFMovI64ToF64, [AscalonFXB]>;
-def : WriteRes<WriteFMovF64ToI64, [AscalonFXA]>;
-
-// Others
-def : WriteRes<WriteCSR, [AscalonFXA]>;
-def : WriteRes<WriteNop, [AscalonFX]>;
-
-def : InstRW<[WriteIALU], (instrs COPY)>;
+  // Double precision
+  let Latency = 3 in {
+  def : WriteRes<WriteFAdd64, [AscalonFP]>;
+  def : WriteRes<WriteFMul64, [AscalonFP]>;
+  def : WriteRes<WriteFMA64, [AscalonFP]>;
+  def : WriteRes<WriteFSGNJ64, [AscalonFP]>;
+  def : WriteRes<WriteFMinMax64, [AscalonFP]>;
+  }
 
-//===----------------------------------------------------------------------===//
-// Bypass and advance
-def : ReadAdvance<ReadJmp, 0>;
-def : ReadAdvance<ReadJalr, 0>;
-def : ReadAdvance<ReadCSR, 0>;
-def : ReadAdvance<ReadStoreData, 0>;
-def : ReadAdvance<ReadMemBase, 0>;
-def : ReadAdvance<ReadIALU, 0>;
-def : ReadAdvance<ReadIALU32, 0>;
-def : ReadAdvance<ReadShiftImm, 0>;
-def : ReadAdvance<ReadShiftImm32, 0>;
-def : ReadAdvance<ReadShiftReg, 0>;
-def : ReadAdvance<ReadShiftReg32, 0>;
-def : ReadAdvance<ReadIDiv, 0>;
-def : ReadAdvance<ReadIDiv32, 0>;
-def : ReadAdvance<ReadIRem, 0>;
-def : ReadAdvance<ReadIRem32, 0>;
-def : ReadAdvance<ReadIMul, 0>;
-def : ReadAdvance<ReadIMul32, 0>;
-def : ReadAdvance<ReadAtomicWA, 0>;
-def : ReadAdvance<ReadAtomicWD, 0>;
-def : ReadAdvance<ReadAtomicDA, 0>;
-def : ReadAdvance<ReadAtomicDD, 0>;
-def : ReadAdvance<ReadAtomicLDW, 0>;
-def : ReadAdvance<ReadAtomicLDD, 0>;
-def : ReadAdvance<ReadAtomicSTW, 0>;
-def : ReadAdvance<ReadAtomicSTD, 0>;
-def : ReadAdvance<ReadFStoreData, 0>;
-def : ReadAdvance<ReadFMemBase, 0>;
-def : ReadAdvance<ReadFAdd16, 0>;
-def : ReadAdvance<ReadFAdd32, 0>;
-def : ReadAdvance<ReadFAdd64, 0>;
-def : ReadAdvance<ReadFMul16, 0>;
-def : ReadAdvance<ReadFMA16, 0>;
-def : ReadAdvance<ReadFMA16Addend, 0>;
-def : ReadAdvance<ReadFMul32, 0>;
-def : ReadAdvance<ReadFMul64, 0>;
-def : ReadAdvance<ReadFMA32, 0>;
-def : ReadAdvance<ReadFMA32Addend, 0>;
-def : ReadAdvance<ReadFMA64, 0>;
-def : ReadAdvance<ReadFMA64Addend, 0>;
-def : ReadAdvance<ReadFDiv16, 0>;
-def : ReadAdvance<ReadFDiv32, 0>;
-def : ReadAdvance<ReadFDiv64, 0>;
-def : ReadAdvance<ReadFSqrt16, 0>;
-def : ReadAdvance<ReadFSqrt32, 0>;
-def : ReadAdvance<ReadFSqrt64, 0>;
-def : ReadAdvance<ReadFCmp16, 0>;
-def : ReadAdvance<ReadFCmp32, 0>;
-def : ReadAdvance<ReadFCmp64, 0>;
-def : ReadAdvance<ReadFSGNJ16, 0>;
-def : ReadAdvance<ReadFSGNJ32, 0>;
-def : ReadAdvance<ReadFSGNJ64, 0>;
-def : ReadAdvance<ReadFMinMax16, 0>;
-def : ReadAdvance<ReadFMinMax32, 0>;
-def : ReadAdvance<ReadFMinMax64, 0>;
-def : ReadAdvance<ReadFCvtF16ToI32, 0>;
-def : ReadAdvance<ReadFCvtF16ToI64, 0>;
-def : ReadAdvance<ReadFCvtF32ToI32, 0>;
-def : ReadAdvance<ReadFCvtF32ToI64, 0>;
-def : ReadAdvance<ReadFCvtF64ToI32, 0>;
-def : ReadAdvance<ReadFCvtF64ToI64, 0>;
-def : ReadAdvance<ReadFCvtI32ToF16, 0>;
-def : ReadAdvance<ReadFCvtI32ToF32, 0>;
-def : ReadAdvance<ReadFCvtI32ToF64, 0>;
-def : ReadAdvance<ReadFCvtI64ToF16, 0>;
-def : ReadAdvance<ReadFCvtI64ToF32, 0>;
-def : ReadAdvance<ReadFCvtI64ToF64, 0>;
-def : ReadAdvance<ReadFCvtF32ToF64, 0>;
-def : ReadAdvance<ReadFCvtF64ToF32, 0>;
-def : ReadAdvance<ReadFCvtF16ToF32, 0>;
-def : ReadAdvance<ReadFCvtF32ToF16, 0>;
-def : ReadAdvance<ReadFCvtF16ToF64, 0>;
-def : ReadAdvance<ReadFCvtF64ToF16, 0>;
-def : ReadAdvance<ReadFMovF16ToI16, 0>;
-def : ReadAdvance<ReadFMovI16ToF16, 0>;
-def : ReadAdvance<ReadFMovF32ToI32, 0>;
-def : ReadAdvance<ReadFMovI32ToF32, 0>;
-def : ReadAdvance<ReadFMovF64ToI64, 0>;
-def : ReadAdvance<ReadFMovI64ToF64, 0>;
-def : ReadAdvance<ReadFClass16, 0>;
-def : ReadAdvance<ReadFClass32, 0>;
-def : ReadAdvance<ReadFClass64, 0>;
-
-// Bitmanip
-def : ReadAdvance<ReadRotateImm, 0>;
-def : ReadAdvance<ReadRotateImm32, 0>;
-def : ReadAdvance<ReadRotateReg, 0>;
-def : ReadAdvance<ReadRotateReg32, 0>;
-def : ReadAdvance<ReadCLZ, 0>;
-def : ReadAdvance<ReadCLZ32, 0>;
-def : ReadAdvance<ReadCTZ, 0>;
-def : ReadAdvance<ReadCTZ32, 0>;
-def : ReadAdvance<ReadCPOP, 0>;
-def : ReadAdvance<ReadCPOP32, 0>;
-def : ReadAdvance<ReadORCB, 0>;
-def : ReadAdvance<ReadIMinMax, 0>;
-def : ReadAdvance<ReadREV8, 0>;
-def : ReadAdvance<ReadSHXADD, 0>;
-def : ReadAdvance<ReadSHXADD32, 0>;
-// Single-bit instructions
-def : ReadAdvance<ReadSingleBit, 0>;
-def : ReadAdvance<ReadSingleBitImm, 0>;
+  let Latency = 12, ReleaseAtCycles = [12] in {
+  def :  WriteRes<WriteFDiv64, [AscalonFP]>;
+  def :  WriteRes<WriteFSqrt64, [AscalonFP]>;
+  }
 
-//===----------------------------------------------------------------------===//
-// Vector
-def : WriteRes<WriteRdVLENB, [AscalonFXA]>;
-
-// Configuration-Setting Instructions
-def : WriteRes<WriteVSETVLI, [AscalonV]>;
-def : WriteRes<WriteVSETIVLI, [AscalonV]>;
-let Latency = 2 in {
-  def : WriteRes<WriteVSETVL, [AscalonV]>;
-}
+  // Conversions
+  def : WriteRes<WriteFCvtI32ToF16, [AscalonFXB]>;
+  def : WriteRes<WriteFCvtI32ToF32, [AscalonFXB]>;
+  def : WriteRes<WriteFCvtI32ToF64, [AscalonFXB]>;
+  def : WriteRes<WriteFCvtI64ToF16, [AscalonFXB]>;
+  def : WriteRes<WriteFCvtI64ToF32, [AscalonFXB]>;
+  def : WriteRes<WriteFCvtI64ToF64, [AscalonFXB]>;
+  def : WriteRes<WriteFCvtF16ToI32, [AscalonFXA]>;
+  def : WriteRes<WriteFCvtF16ToI64, [AscalonFXA]>;
+  def : WriteRes<WriteFCvtF16ToF32, [AscalonFP]>;
+  def : WriteRes<WriteFCvtF16ToF64, [AscalonFP]>;
+  def : WriteRes<WriteFCvtF32ToI32, [AscalonFXA]>;
+  def : WriteRes<WriteFCvtF32ToI64, [AscalonFXA]>;
+  def : WriteRes<WriteFCvtF32ToF16, [AscalonFP]>;
+  def : WriteRes<WriteFCvtF32ToF64, [AscalonFP]>;
+  def : WriteRes<WriteFCvtF64ToI32, [AscalonFXA]>;
+  def : WriteRes<WriteFCvtF64ToI64, [AscalonFXA]>;
+  def : WriteRes<WriteFCvtF64ToF16, [AscalonFP]>;
+  def : WriteRes<WriteFCvtF64ToF32, [AscalonFP]>;
+
+  def : WriteRes<WriteFClass16, [AscalonFP]>;
+  def : WriteRes<WriteFClass32, [AscalonFP]>;
+  def : WriteRes<WriteFClass64, [AscalonFP]>;
+  def : WriteRes<WriteFCmp16, [AscalonFP]>;
+  def : WriteRes<WriteFCmp32, [AscalonFP]>;
+  def : WriteRes<WriteFCmp64, [AscalonFP]>;
+
+  def : WriteRes<WriteFMovI16ToF16, [AscalonFXB]>;
+  def : WriteRes<WriteFMovF16ToI16, [AscalonFXA]>;
+  def : WriteRes<WriteFMovI32ToF32, [AscalonFXB]>;
+  def : WriteRes<WriteFMovF32ToI32, [AscalonFXA]>;
+  def : WriteRes<WriteFMovI64ToF64, [AscalonFXB]>;
+  def : WriteRes<WriteFMovF64ToI64, [AscalonFXA]>;
+
+  // Others
+  def : WriteRes<WriteCSR, [AscalonFXA]>;
+  def : WriteRes<WriteNop, [AscalonFX]>;
+
+  def : InstRW<[WriteIALU], (instrs COPY)>;
+
+  
//===--------------------------------------------------------------------===//
+  // Bypass and advance
+  def : ReadAdvance<ReadJmp, 0>;
+  def : ReadAdvance<ReadJalr, 0>;
+  def : ReadAdvance<ReadCSR, 0>;
+  def : ReadAdvance<ReadStoreData, 0>;
+  def : ReadAdvance<ReadMemBase, 0>;
+  def : ReadAdvance<ReadIALU, 0>;
+  def : ReadAdvance<ReadIALU32, 0>;
+  def : ReadAdvance<ReadShiftImm, 0>;
+  def : ReadAdvance<ReadShiftImm32, 0>;
+  def : ReadAdvance<ReadShiftReg, 0>;
+  def : ReadAdvance<ReadShiftReg32, 0>;
+  def : ReadAdvance<ReadIDiv, 0>;
+  def : ReadAdvance<ReadIDiv32, 0>;
+  def : ReadAdvance<ReadIRem, 0>;
+  def : ReadAdvance<ReadIRem32, 0>;
+  def : ReadAdvance<ReadIMul, 0>;
+  def : ReadAdvance<ReadIMul32, 0>;
+  def : ReadAdvance<ReadAtomicWA, 0>;
+  def : ReadAdvance<ReadAtomicWD, 0>;
+  def : ReadAdvance<ReadAtomicDA, 0>;
+  def : ReadAdvance<ReadAtomicDD, 0>;
+  def : ReadAdvance<ReadAtomicLDW, 0>;
+  def : ReadAdvance<ReadAtomicLDD, 0>;
+  def : ReadAdvance<ReadAtomicSTW, 0>;
+  def : ReadAdvance<ReadAtomicSTD, 0>;
+  def : ReadAdvance<ReadFStoreData, 0>;
+  def : ReadAdvance<ReadFMemBase, 0>;
+  def : ReadAdvance<ReadFAdd16, 0>;
+  def : ReadAdvance<ReadFAdd32, 0>;
+  def : ReadAdvance<ReadFAdd64, 0>;
+  def : ReadAdvance<ReadFMul16, 0>;
+  def : ReadAdvance<ReadFMA16, 0>;
+  def : ReadAdvance<ReadFMA16Addend, 0>;
+  def : ReadAdvance<ReadFMul32, 0>;
+  def : ReadAdvance<ReadFMul64, 0>;
+  def : ReadAdvance<ReadFMA32, 0>;
+  def : ReadAdvance<ReadFMA32Addend, 0>;
+  def : ReadAdvance<ReadFMA64, 0>;
+  def : ReadAdvance<ReadFMA64Addend, 0>;
+  def : ReadAdvance<ReadFDiv16, 0>;
+  def : ReadAdvance<ReadFDiv32, 0>;
+  def : ReadAdvance<ReadFDiv64, 0>;
+  def : ReadAdvance<ReadFSqrt16, 0>;
+  def : ReadAdvance<ReadFSqrt32, 0>;
+  def : ReadAdvance<ReadFSqrt64, 0>;
+  def : ReadAdvance<ReadFCmp16, 0>;
+  def : ReadAdvance<ReadFCmp32, 0>;
+  def : ReadAdvance<ReadFCmp64, 0>;
+  def : ReadAdvance<ReadFSGNJ16, 0>;
+  def : ReadAdvance<ReadFSGNJ32, 0>;
+  def : ReadAdvance<ReadFSGNJ64, 0>;
+  def : ReadAdvance<ReadFMinMax16, 0>;
+  def : ReadAdvance<ReadFMinMax32, 0>;
+  def : ReadAdvance<ReadFMinMax64, 0>;
+  def : ReadAdvance<ReadFCvtF16ToI32, 0>;
+  def : ReadAdvance<ReadFCvtF16ToI64, 0>;
+  def : ReadAdvance<ReadFCvtF32ToI32, 0>;
+  def : ReadAdvance<ReadFCvtF32ToI64, 0>;
+  def : ReadAdvance<ReadFCvtF64ToI32, 0>;
+  def : ReadAdvance<ReadFCvtF64ToI64, 0>;
+  def : ReadAdvance<ReadFCvtI32ToF16, 0>;
+  def : ReadAdvance<ReadFCvtI32ToF32, 0>;
+  def : ReadAdvance<ReadFCvtI32ToF64, 0>;
+  def : ReadAdvance<ReadFCvtI64ToF16, 0>;
+  def : ReadAdvance<ReadFCvtI64ToF32, 0>;
+  def : ReadAdvance<ReadFCvtI64ToF64, 0>;
+  def : ReadAdvance<ReadFCvtF32ToF64, 0>;
+  def : ReadAdvance<ReadFCvtF64ToF32, 0>;
+  def : ReadAdvance<ReadFCvtF16ToF32, 0>;
+  def : ReadAdvance<ReadFCvtF32ToF16, 0>;
+  def : ReadAdvance<ReadFCvtF16ToF64, 0>;
+  def : ReadAdvance<ReadFCvtF64ToF16, 0>;
+  def : ReadAdvance<ReadFMovF16ToI16, 0>;
+  def : ReadAdvance<ReadFMovI16ToF16, 0>;
+  def : ReadAdvance<ReadFMovF32ToI32, 0>;
+  def : ReadAdvance<ReadFMovI32ToF32, 0>;
+  def : ReadAdvance<ReadFMovF64ToI64, 0>;
+  def : ReadAdvance<ReadFMovI64ToF64, 0>;
+  def : ReadAdvance<ReadFClass16, 0>;
+  def : ReadAdvance<ReadFClass32, 0>;
+  def : ReadAdvance<ReadFClass64, 0>;
+
+  // Bitmanip
+  def : ReadAdvance<ReadRotateImm, 0>;
+  def : ReadAdvance<ReadRotateImm32, 0>;
+  def : ReadAdvance<ReadRotateReg, 0>;
+  def : ReadAdvance<ReadRotateReg32, 0>;
+  def : ReadAdvance<ReadCLZ, 0>;
+  def : ReadAdvance<ReadCLZ32, 0>;
+  def : ReadAdvance<ReadCTZ, 0>;
+  def : ReadAdvance<ReadCTZ32, 0>;
+  def : ReadAdvance<ReadCPOP, 0>;
+  def : ReadAdvance<ReadCPOP32, 0>;
+  def : ReadAdvance<ReadORCB, 0>;
+  def : ReadAdvance<ReadIMinMax, 0>;
+  def : ReadAdvance<ReadREV8, 0>;
+  def : ReadAdvance<ReadSHXADD, 0>;
+  def : ReadAdvance<ReadSHXADD32, 0>;
+  // Single-bit instructions
+  def : ReadAdvance<ReadSingleBit, 0>;
+  def : ReadAdvance<ReadSingleBitImm, 0>;
+
+  
//===--------------------------------------------------------------------===//
+  // Vector
+  def : WriteRes<WriteRdVLENB, [AscalonFXA]>;
 
-// Vector Loads and Stores
-foreach mx = SchedMxList in {
-  defvar Cycles = AscalonGetCyclesDefault<mx>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-  let Latency = Cycles in {
-    defm "" : LMULWriteResMX<"WriteVLDE",    [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVLDFF",   [AscalonLS], mx, IsWorstCase>;
+  // Configuration-Setting Instructions
+  def : WriteRes<WriteVSETVLI, [AscalonV]>;
+  def : WriteRes<WriteVSETIVLI, [AscalonV]>;
+  let Latency = 2 in {
+    def : WriteRes<WriteVSETVL, [AscalonV]>;
   }
-  defm "" : LMULWriteResMX<"WriteVSTE",    [AscalonLS], mx, IsWorstCase>;
-}
 
-foreach mx = SchedMxList in {
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-  defm "" : LMULWriteResMX<"WriteVLDM",    [AscalonLS], mx, IsWorstCase>;
-  defm "" : LMULWriteResMX<"WriteVSTM",    [AscalonLS], mx, IsWorstCase>;
-}
+  // Vector Loads and Stores
+  foreach mx = SchedMxList in {
+    defvar Cycles = AscalonGetCyclesDefault<mx>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
+    let Latency = Cycles in {
+      defm "" : LMULWriteResMX<"WriteVLDE",    [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVLDFF",   [AscalonLS], mx, IsWorstCase>;
+    }
+    defm "" : LMULWriteResMX<"WriteVSTE",    [AscalonLS], mx, IsWorstCase>;
+  }
 
-foreach mx = SchedMxListEEW8 in {
-  defvar Cycles = AscalonGetCyclesLMUL<mx, 2>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-  let Latency = Cycles in {
-    defm "" : LMULWriteResMX<"WriteVLDS8", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVLDUX8", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVLDOX8", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTS8",  [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTUX8", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTOX8", [AscalonLS], mx, IsWorstCase>;
+  foreach mx = SchedMxList in {
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
+    defm "" : LMULWriteResMX<"WriteVLDM",    [AscalonLS], mx, IsWorstCase>;
+    defm "" : LMULWriteResMX<"WriteVSTM",    [AscalonLS], mx, IsWorstCase>;
   }
-}
-foreach mx = SchedMxListEEW16 in {
-  defvar Cycles = AscalonGetCyclesLMUL<mx, 2>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-  let Latency = Cycles in {
-    defm "" : LMULWriteResMX<"WriteVLDS16", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVLDUX16", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVLDOX16", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTS16",  [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTUX16", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTOX16", [AscalonLS], mx, IsWorstCase>;
+
+  foreach mx = SchedMxListEEW8 in {
+    defvar Cycles = AscalonGetCyclesLMUL<mx, 2>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
+    let Latency = Cycles in {
+      defm "" : LMULWriteResMX<"WriteVLDS8", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVLDUX8", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVLDOX8", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTS8",  [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTUX8", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTOX8", [AscalonLS], mx, IsWorstCase>;
+    }
   }
-}
-foreach mx = SchedMxListEEW32 in {
-  defvar Cycles = AscalonGetCyclesLMUL<mx, 2>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-  let Latency = Cycles in {
-    defm "" : LMULWriteResMX<"WriteVLDS32", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVLDUX32", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVLDOX32", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTS32",  [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTUX32", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTOX32", [AscalonLS], mx, IsWorstCase>;
+  foreach mx = SchedMxListEEW16 in {
+    defvar Cycles = AscalonGetCyclesLMUL<mx, 2>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
+    let Latency = Cycles in {
+      defm "" : LMULWriteResMX<"WriteVLDS16", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVLDUX16", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVLDOX16", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTS16",  [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTUX16", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTOX16", [AscalonLS], mx, IsWorstCase>;
+    }
   }
-}
-foreach mx = SchedMxListEEW64 in {
-  defvar Cycles = AscalonGetCyclesLMUL<mx, 2>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-  let Latency = Cycles in {
-    defm "" : LMULWriteResMX<"WriteVLDS64", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVLDUX64", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVLDOX64", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTS64",  [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTUX64", [AscalonLS], mx, IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSTOX64", [AscalonLS], mx, IsWorstCase>;
+  foreach mx = SchedMxListEEW32 in {
+    defvar Cycles = AscalonGetCyclesLMUL<mx, 2>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
+    let Latency = Cycles in {
+      defm "" : LMULWriteResMX<"WriteVLDS32", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVLDUX32", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVLDOX32", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTS32",  [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTUX32", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTOX32", [AscalonLS], mx, IsWorstCase>;
+    }
+  }
+  foreach mx = SchedMxListEEW64 in {
+    defvar Cycles = AscalonGetCyclesLMUL<mx, 2>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
+    let Latency = Cycles in {
+      defm "" : LMULWriteResMX<"WriteVLDS64", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVLDUX64", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVLDOX64", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTS64",  [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTUX64", [AscalonLS], mx, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSTOX64", [AscalonLS], mx, IsWorstCase>;
+    }
   }
-}
 
-// VLD*R is not LMUL aware
-def : WriteRes<WriteVLD1R,  [AscalonLS]>;
-def : WriteRes<WriteVLD2R,  [AscalonLS]>;
-def : WriteRes<WriteVLD4R,  [AscalonLS]>;
-def : WriteRes<WriteVLD8R,  [AscalonLS]>;
-// VST*R is not LMUL aware
-def : WriteRes<WriteVST1R,   [AscalonLS]>;
-def : WriteRes<WriteVST2R,   [AscalonLS]>;
-def : WriteRes<WriteVST4R,   [AscalonLS]>;
-def : WriteRes<WriteVST8R,   [AscalonLS]>;
-
-// Segmented Loads and Stores
-foreach mx = SchedMxList in {
-  foreach eew = [8, 16, 32, 64] in {
-    foreach nf=2-8 in {
-      defvar Cycles = AscalonGetCyclesDefault<mx>.c;
-      defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-      let Latency = Cycles in {
-        defm "" : LMULWriteResMX<"WriteVLSEG" # nf # "e" # eew,   [AscalonLS], 
mx, IsWorstCase>;
-        defm "" : LMULWriteResMX<"WriteVLSEGFF" # nf # "e" # eew, [AscalonLS], 
mx, IsWorstCase>;
+  // VLD*R is not LMUL aware
+  def : WriteRes<WriteVLD1R,  [AscalonLS]>;
+  def : WriteRes<WriteVLD2R,  [AscalonLS]>;
+  def : WriteRes<WriteVLD4R,  [AscalonLS]>;
+  def : WriteRes<WriteVLD8R,  [AscalonLS]>;
+  // VST*R is not LMUL aware
+  def : WriteRes<WriteVST1R,   [AscalonLS]>;
+  def : WriteRes<WriteVST2R,   [AscalonLS]>;
+  def : WriteRes<WriteVST4R,   [AscalonLS]>;
+  def : WriteRes<WriteVST8R,   [AscalonLS]>;
+
+  // Segmented Loads and Stores
+  foreach mx = SchedMxList in {
+    foreach eew = [8, 16, 32, 64] in {
+      foreach nf=2-8 in {
+        defvar Cycles = AscalonGetCyclesDefault<mx>.c;
+        defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
+        let Latency = Cycles in {
+          defm "" : LMULWriteResMX<"WriteVLSEG" # nf # "e" # eew,   
[AscalonLS], mx, IsWorstCase>;
+          defm "" : LMULWriteResMX<"WriteVLSEGFF" # nf # "e" # eew, 
[AscalonLS], mx, IsWorstCase>;
+        }
+        let Latency = 1, AcquireAtCycles = [1], ReleaseAtCycles = [!add(1, 
Cycles)] in
+        defm "" : LMULWriteResMX<"WriteVSSEG" # nf # "e" # eew,   [AscalonLS], 
mx, IsWorstCase>;
       }
-      let Latency = 1, AcquireAtCycles = [1], ReleaseAtCycles = [!add(1, 
Cycles)] in
-      defm "" : LMULWriteResMX<"WriteVSSEG" # nf # "e" # eew,   [AscalonLS], 
mx, IsWorstCase>;
     }
   }
-}
-foreach mx = SchedMxList in {
-  foreach nf=2-8 in {
-    foreach eew = [8, 16, 32, 64] in {
-      defvar Cycles = AscalonGetCyclesStridedSegmented<mx, eew>.c;
-      defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-      let Latency = Cycles in {
-        defm "" : LMULWriteResMX<"WriteVLSSEG" # nf # "e" # eew,  [AscalonLS], 
mx, IsWorstCase>;
-        defm "" : LMULWriteResMX<"WriteVLUXSEG" # nf # "e" # eew, [AscalonLS], 
mx, IsWorstCase>;
-        defm "" : LMULWriteResMX<"WriteVLOXSEG" # nf # "e" # eew, [AscalonLS], 
mx, IsWorstCase>;
-        defm "" : LMULWriteResMX<"WriteVSSSEG" # nf # "e" # eew,  [AscalonLS], 
mx, IsWorstCase>;
-        defm "" : LMULWriteResMX<"WriteVSUXSEG" # nf # "e" # eew, [AscalonLS], 
mx, IsWorstCase>;
-        defm "" : LMULWriteResMX<"WriteVSOXSEG" # nf # "e" # eew, [AscalonLS], 
mx, IsWorstCase>;
+  foreach mx = SchedMxList in {
+    foreach nf=2-8 in {
+      foreach eew = [8, 16, 32, 64] in {
+        defvar Cycles = AscalonGetCyclesStridedSegmented<mx, eew>.c;
+        defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
+        let Latency = Cycles in {
+          defm "" : LMULWriteResMX<"WriteVLSSEG" # nf # "e" # eew,  
[AscalonLS], mx, IsWorstCase>;
+          defm "" : LMULWriteResMX<"WriteVLUXSEG" # nf # "e" # eew, 
[AscalonLS], mx, IsWorstCase>;
+          defm "" : LMULWriteResMX<"WriteVLOXSEG" # nf # "e" # eew, 
[AscalonLS], mx, IsWorstCase>;
+          defm "" : LMULWriteResMX<"WriteVSSSEG" # nf # "e" # eew,  
[AscalonLS], mx, IsWorstCase>;
+          defm "" : LMULWriteResMX<"WriteVSUXSEG" # nf # "e" # eew, 
[AscalonLS], mx, IsWorstCase>;
+          defm "" : LMULWriteResMX<"WriteVSOXSEG" # nf # "e" # eew, 
[AscalonLS], mx, IsWorstCase>;
+        }
       }
     }
   }
-}
 
-// Vector Fixed-Point Arithmetic Instructions
-foreach mx = SchedMxList in {
-  defvar Cycles = AscalonGetCyclesDefault<mx>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-  let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
-    defm "" : LMULWriteResMX<"WriteVSALUV",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSALUX",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSALUI",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVAALUV",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVAALUX",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSMulV",   [AscalonFXA, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSMulX",   [AscalonFXA, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSShiftV", [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSShiftX", [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVSShiftI", [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+  // Vector Fixed-Point Arithmetic Instructions
+  foreach mx = SchedMxList in {
+    defvar Cycles = AscalonGetCyclesDefault<mx>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
+    let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
+      defm "" : LMULWriteResMX<"WriteVSALUV",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSALUX",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSALUI",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVAALUV",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVAALUX",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSMulV",   [AscalonFXA, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSMulX",   [AscalonFXA, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSShiftV", [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSShiftX", [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVSShiftI", [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+    }
   }
-}
-// Narrowing
-foreach mx = SchedMxListW in {
-  defvar Cycles = AscalonGetCyclesNarrowing<mx>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxListW>.c;
-  let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
-    defm "" : LMULWriteResMX<"WriteVNClipV",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVNClipX",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVNClipI",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+  // Narrowing
+  foreach mx = SchedMxListW in {
+    defvar Cycles = AscalonGetCyclesNarrowing<mx>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxListW>.c;
+    let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
+      defm "" : LMULWriteResMX<"WriteVNClipV",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVNClipX",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVNClipI",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+    }
   }
-}
 
-// Configuration-Setting Instructions
-def : ReadAdvance<ReadVSETVLI, 1>;
-def : ReadAdvance<ReadVSETVL, 1>;
-
-// Vector Loads and Stores
-def : ReadAdvance<ReadVLDX, 0>;
-def : ReadAdvance<ReadVSTX, 0>;
-defm "" : LMULReadAdvance<"ReadVSTEV", 0>;
-defm "" : LMULReadAdvance<"ReadVSTM", 0>;
-def : ReadAdvance<ReadVLDSX, 0>;
-def : ReadAdvance<ReadVSTSX, 0>;
-defm "" : LMULReadAdvance<"ReadVSTS8V", 0>;
-defm "" : LMULReadAdvance<"ReadVSTS16V", 0>;
-defm "" : LMULReadAdvance<"ReadVSTS32V", 0>;
-defm "" : LMULReadAdvance<"ReadVSTS64V", 0>;
-defm "" : LMULReadAdvance<"ReadVLDUXV", 0>;
-defm "" : LMULReadAdvance<"ReadVLDOXV", 0>;
-defm "" : LMULReadAdvance<"ReadVSTUX8", 0>;
-defm "" : LMULReadAdvance<"ReadVSTUX16", 0>;
-defm "" : LMULReadAdvance<"ReadVSTUX32", 0>;
-defm "" : LMULReadAdvance<"ReadVSTUX64", 0>;
-defm "" : LMULReadAdvance<"ReadVSTUXV", 0>;
-defm "" : LMULReadAdvance<"ReadVSTUX8V", 0>;
-defm "" : LMULReadAdvance<"ReadVSTUX16V", 0>;
-defm "" : LMULReadAdvance<"ReadVSTUX32V", 0>;
-defm "" : LMULReadAdvance<"ReadVSTUX64V", 0>;
-defm "" : LMULReadAdvance<"ReadVSTOX8", 0>;
-defm "" : LMULReadAdvance<"ReadVSTOX16", 0>;
-defm "" : LMULReadAdvance<"ReadVSTOX32", 0>;
-defm "" : LMULReadAdvance<"ReadVSTOX64", 0>;
-defm "" : LMULReadAdvance<"ReadVSTOXV", 0>;
-defm "" : LMULReadAdvance<"ReadVSTOX8V", 0>;
-defm "" : LMULReadAdvance<"ReadVSTOX16V", 0>;
-defm "" : LMULReadAdvance<"ReadVSTOX32V", 0>;
-defm "" : LMULReadAdvance<"ReadVSTOX64V", 0>;
-// LMUL Aware
-def : ReadAdvance<ReadVST1R, 0>;
-def : ReadAdvance<ReadVST2R, 0>;
-def : ReadAdvance<ReadVST4R, 0>;
-def : ReadAdvance<ReadVST8R, 0>;
-
-// Vector Integer Arithmetic Instructions
-foreach mx = SchedMxList in {
-  defvar Cycles = AscalonGetCyclesDefault<mx>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-  let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
-    defm "" : LMULWriteResMX<"WriteVIALUV",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIALUX",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIALUI",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVICALUV",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVICALUX",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVICALUI",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVICALUMV",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVICALUMX",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVICALUMI",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVShiftV",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVShiftX",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVShiftI",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMinMaxV",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMinMaxX",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMulV",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMulX",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMulAddV",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMulAddX",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMergeV",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMergeX",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMergeI",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMovV",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMovX",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIMovI",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVICmpV",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVICmpX",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVICmpI",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-  }
-}
-foreach mx = SchedMxList in {
-  defvar Cycles = AscalonGetCyclesDefault<mx>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-  let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
-    defm "" : LMULWriteResMX<"WriteVExtV",      [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-  }
-}
-foreach mx = SchedMxList in {
-  foreach sew = SchedSEWSet<mx>.val in {
-    defvar Cycles = AscalonGetCyclesDivOrSqrt<mx, sew>.c;
-    defvar IsWorstCase = AscalonIsWorstCaseMXSEW<mx, sew, SchedMxList>.c;
+  // Configuration-Setting Instructions
+  def : ReadAdvance<ReadVSETVLI, 1>;
+  def : ReadAdvance<ReadVSETVL, 1>;
+
+  // Vector Loads and Stores
+  def : ReadAdvance<ReadVLDX, 0>;
+  def : ReadAdvance<ReadVSTX, 0>;
+  defm "" : LMULReadAdvance<"ReadVSTEV", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTM", 0>;
+  def : ReadAdvance<ReadVLDSX, 0>;
+  def : ReadAdvance<ReadVSTSX, 0>;
+  defm "" : LMULReadAdvance<"ReadVSTS8V", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTS16V", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTS32V", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTS64V", 0>;
+  defm "" : LMULReadAdvance<"ReadVLDUXV", 0>;
+  defm "" : LMULReadAdvance<"ReadVLDOXV", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTUX8", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTUX16", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTUX32", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTUX64", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTUXV", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTUX8V", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTUX16V", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTUX32V", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTUX64V", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTOX8", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTOX16", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTOX32", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTOX64", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTOXV", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTOX8V", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTOX16V", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTOX32V", 0>;
+  defm "" : LMULReadAdvance<"ReadVSTOX64V", 0>;
+  // LMUL Aware
+  def : ReadAdvance<ReadVST1R, 0>;
+  def : ReadAdvance<ReadVST2R, 0>;
+  def : ReadAdvance<ReadVST4R, 0>;
+  def : ReadAdvance<ReadVST8R, 0>;
+
+  // Vector Integer Arithmetic Instructions
+  foreach mx = SchedMxList in {
+    defvar Cycles = AscalonGetCyclesDefault<mx>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
     let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
-      defm "" : LMULSEWWriteResMXSEW<"WriteVIDivV", [AscalonFX, AscalonV], mx, 
sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVIDivX", [AscalonFX, AscalonV], mx, 
sew, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIALUV",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIALUX",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIALUI",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVICALUV",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVICALUX",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVICALUI",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVICALUMV",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVICALUMX",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVICALUMI",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVShiftV",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVShiftX",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVShiftI",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMinMaxV",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMinMaxX",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMulV",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMulX",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMulAddV",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMulAddX",  [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMergeV",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMergeX",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMergeI",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMovV",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMovX",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIMovI",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVICmpV",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVICmpX",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVICmpI",     [AscalonFX, AscalonV], mx, 
IsWorstCase>;
     }
   }
-}
-
-// Widening
-foreach mx = SchedMxListW in {
-  defvar Cycles = AscalonGetCyclesDefault<mx>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxListW>.c;
-  let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
-    defm "" : LMULWriteResMX<"WriteVIWALUV",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIWALUX",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIWALUI",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIWMulV",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIWMulX",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIWMulAddV", [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVIWMulAddX", [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+  foreach mx = SchedMxList in {
+    defvar Cycles = AscalonGetCyclesDefault<mx>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
+    let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
+      defm "" : LMULWriteResMX<"WriteVExtV",      [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+    }
   }
-}
-// Narrowing
-foreach mx = SchedMxListW in {
-  defvar Cycles = AscalonGetCyclesNarrowing<mx>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxListW>.c;
-  let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
-    defm "" : LMULWriteResMX<"WriteVNShiftV",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVNShiftX",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVNShiftI",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+  foreach mx = SchedMxList in {
+    foreach sew = SchedSEWSet<mx>.val in {
+      defvar Cycles = AscalonGetCyclesDivOrSqrt<mx, sew>.c;
+      defvar IsWorstCase = AscalonIsWorstCaseMXSEW<mx, sew, SchedMxList>.c;
+      let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
+        defm "" : LMULSEWWriteResMXSEW<"WriteVIDivV", [AscalonFX, AscalonV], 
mx, sew, IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVIDivX", [AscalonFX, AscalonV], 
mx, sew, IsWorstCase>;
+      }
+    }
   }
-}
 
-// Vector Floating-Point Instructions
-foreach mx = SchedMxListF in {
-  foreach sew = SchedSEWSet<mx, isF=1>.val in {
+  // Widening
+  foreach mx = SchedMxListW in {
     defvar Cycles = AscalonGetCyclesDefault<mx>.c;
-    defvar IsWorstCase = AscalonIsWorstCaseMXSEW<mx, sew, SchedMxListF, 
isF=1>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxListW>.c;
     let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFALUV",  [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFALUF",  [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFMulV",  [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFMulF",  [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFMulAddV", [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFMulAddF", [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFRecpV",   [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFCvtIToFV", [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFMinMaxV", [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFMinMaxF", [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFSgnjV",   [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFSgnjF",   [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIWALUV",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIWALUX",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIWALUI",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIWMulV",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIWMulX",    [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIWMulAddV", [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVIWMulAddX", [AscalonFX, AscalonV], mx, 
IsWorstCase>;
     }
   }
-}
-foreach mx = SchedMxList in {
-  defvar Cycles = AscalonGetCyclesDefault<mx>.c;
-  defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxList>.c;
-  let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
-    defm "" : LMULWriteResMX<"WriteVFCvtFToIV",  [AscalonFPA, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVFClassV",    [AscalonFP, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVFMergeV",    [AscalonFP, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVFMovV",      [AscalonFP, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVFCmpV",      [AscalonFP, AscalonV], mx, 
IsWorstCase>;
-    defm "" : LMULWriteResMX<"WriteVFCmpF",      [AscalonFP, AscalonV], mx, 
IsWorstCase>;
-  }
-}
-foreach mx = SchedMxListF in {
-  foreach sew = SchedSEWSet<mx, isF=1>.val in {
-    defvar Cycles = AscalonGetCyclesDivOrSqrt<mx, sew>.c;
-    defvar IsWorstCase = AscalonIsWorstCaseMXSEW<mx, sew, SchedMxListF, 1>.c;
+  // Narrowing
+  foreach mx = SchedMxListW in {
+    defvar Cycles = AscalonGetCyclesNarrowing<mx>.c;
+    defvar IsWorstCase = AscalonIsWorstCaseMX<mx, SchedMxListW>.c;
     let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFSqrtV", [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFDivV",  [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
-      defm "" : LMULSEWWriteResMXSEW<"WriteVFDivF",  [AscalonFP, AscalonV], 
mx, sew, IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVNShiftV",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVNShiftX",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
+      defm "" : LMULWriteResMX<"WriteVNShiftI",   [AscalonFX, AscalonV], mx, 
IsWorstCase>;
     }
   }
-}
 
-// Widening
-foreach mx = SchedMxListW in {
-  foreach sew = SchedSEWSet<mx, isF=0, isWidening=1>.val in {
-    defvar Cycles = AscalonGetCyclesDefault<mx>.c;
-    defvar IsWorstCase = AscalonIsWorstCaseMXSEW<mx, sew, SchedMxListW>.c;
-    let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in
-    defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtIToFV", [AscalonFXB, AscalonV], 
mx, sew, IsWorstCase>;
+  // Vector Floating-Point Instructions
+  foreach mx = SchedMxListF in {
+    foreach sew = SchedSEWSet<mx, isF=1>.val in {
+      defvar Cycles = AscalonGetCyclesDefault<mx>.c;
+      defvar IsWorstCase = AscalonIsWorstCaseMXSEW<mx, sew, SchedMxListF, 
isF=1>.c;
+      // FP64 add/mul/fma have reduced throughput on Ascalon XG.
+      defvar IsFP64 = !and(ReducedFP64Vec, !eq(sew, 64));
+      defvar FP64 = AscalonXGFP64Vec<Cycles>;
+      defvar FPVRes = !if(IsFP64, [AscalonFP, AscalonV, AscalonFP64V],
+                                  [AscalonFP, AscalonV]);
+      let Latency = !if(IsFP64, FP64.Latency, Cycles),
+          ReleaseAtCycles = !if(IsFP64, [1, Cycles, FP64.ReleaseAtCycles],
+                                        [1, Cycles]) in {
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFALUV",  FPVRes, mx, sew, 
IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFALUF",  FPVRes, mx, sew, 
IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFMulV",  FPVRes, mx, sew, 
IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFMulF",  FPVRes, mx, sew, 
IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFMulAddV", FPVRes, mx, sew, 
IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFMulAddF", FPVRes, mx, sew, 
IsWorstCase>;
+      }
+      let Latency = Cycles, ReleaseAtCycles = [1, Cycles] in {
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFRecpV",   [AscalonFP, 
AscalonV], mx, sew, IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFCvtIToFV", [AscalonFP, 
AscalonV], mx, sew, IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFMinMaxV", [AscalonFP, 
AscalonV], mx, sew, IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFMinMaxF", [AscalonFP, 
AscalonV], mx, sew, IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFSgnjV",   [AscalonFP, 
AscalonV], mx, sew, IsWorstCase>;
+        defm "" : LMULSEWWriteResMXSEW<"WriteVFSgnjF",   [AscalonFP, 
AscalonV], mx, sew, IsWorstCase>;
----------------
mshockwave wrote:

is there any reason these instructions are not subject to reduced FP64 
throughput?

https://github.com/llvm/llvm-project/pull/229030
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to