blob: f4abd2a9689fd87864473ddd41f16805d573ec87 [file] [edit]
//=- AArch64SchedC1Ultra.td - C1 Ultra Scheduling Defs --*- tablegen -*-=//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file defines the scheduling model for the C1 Ultra processors.
// Information is taken from the C1 Ultra Software Optimization Guide
//
// Base scheduling model documentation
// https://developer.arm.com/documentation/111079/3-0
//
// SME2 scheduling model documentation
// https://developer.arm.com/documentation/111048/0103
//
//===----------------------------------------------------------------------===//
def C1UltraModel : SchedMachineModel {
let IssueWidth = 10;
let MicroOpBufferSize = 320; // Entries in micro-op re-order buffer. NOTE: Copied from Neoverse-V3
let LoadLatency = 4; // Optimistic load latency. NOTE: Copied from Neoverse-V3
let MispredictPenalty = 10; // Extra cycles for mispredicted branch. NOTE: Copied from N3.
let LoopMicroOpBufferSize = 16; // NOTE: Copied from Cortex-A57.
let CompleteModel = 1;
list<Predicate> UnsupportedFeatures = !listconcat(SVE2p1Unsupported.F, SME2p1Unsupported.F,
[HasSVEB16B16, HasCPA, HasMTE,
HasCSSC, HasMOPS, HasMOPS_GO,
HasSVEBFSCALE, HasFAMINMAX]);
}
//===----------------------------------------------------------------------===//
// Define each kind of processor resource and number available on C1 Ultra.
// Instructions are first fetched and then decoded into internal macro-ops
// (MOPs). From there, the MOPs proceed through register renaming and dispatch
// stages. A MOP can be split into two micro-ops further down the pipeline
// after the decode stage.
let SchedModel = C1UltraModel in {
// Define the issue ports.
def C1UUnitB : ProcResource<3>; // Branch 0/1/2
def C1UUnitS0 : ProcResource<1>; // Integer single-cycle 0
def C1UUnitS1 : ProcResource<1>; // Integer single-cycle 1
def C1UUnitS2 : ProcResource<1>; // Integer single-cycle 2
def C1UUnitS3 : ProcResource<1>; // Integer single-cycle 3
def C1UUnitS4 : ProcResource<1>; // Integer single-cycle 4
def C1UUnitS5 : ProcResource<1>; // Integer single-cycle 5
def C1UUnitM0 : ProcResource<1>; // Integer single/multicycle 0
def C1UUnitM1 : ProcResource<1>; // Integer single/multicycle 1
def C1UUnitV0 : ProcResource<1>; // FP/ASIMD 0
def C1UUnitV1 : ProcResource<1>; // FP/ASIMD 1
def C1UUnitV2 : ProcResource<1>; // FP/ASIMD 2
def C1UUnitV3 : ProcResource<1>; // FP/ASIMD 3
def C1UUnitV4 : ProcResource<1>; // FP/ASIMD 4
def C1UUnitV5 : ProcResource<1>; // FP/ASIMD 5
def C1UUnitLS0 : ProcResource<1>; // Load/Store 0
def C1UUnitLS1 : ProcResource<1>; // Load/Store 1
def C1UUnitL23 : ProcResource<2>; // Load 2/3
def C1UUnitD : ProcResource<2>; // Store data 0/1
def C1UUnitFlg : ProcResource<4>; // Flags
// Define the CME coprocessor pipelines from the C1-SME2 guide.
def C1UUnitCMELD : ProcResource<1>; // LD
def C1UUnitCMEST : ProcResource<1>; // ST
def C1UUnitCMEPF : ProcResource<1>; // PF
def C1UUnitCMEVX0ALU : ProcResource<1>; // VX0ALU
def C1UUnitCMEVX1ALU : ProcResource<1>; // VX1ALU
def C1UUnitCMEVX0FPDOT : ProcResource<1>; // VX0FPDOT
def C1UUnitCMEVX1FPDOT : ProcResource<1>; // VX1FPDOT
def C1UUnitCMEVX0MUL : ProcResource<1>; // VX0MUL
def C1UUnitCMEVX1MUL : ProcResource<1>; // VX1MUL
def C1UUnitCMEPERMF : ProcResource<1>; // PERMF
def C1UUnitCMEPERMS : ProcResource<1>; // PERMS
def C1UUnitCMEMC : ProcResource<1>; // MC
def C1UUnitCMEMML0 : ProcResource<1>; // MML0
def C1UUnitCMEMML1 : ProcResource<1>; // MML1
def C1UUnitCMERNMRET : ProcResource<3>; // RNMRET
def C1UUnitI : ProcResGroup<[C1UUnitS0, C1UUnitS1, C1UUnitS2, C1UUnitS3,
C1UUnitS4, C1UUnitS5, C1UUnitM0, C1UUnitM1]>;
def C1UUnitI4 : ProcResGroup<[C1UUnitS0, C1UUnitS2, C1UUnitS4, C1UUnitM0]>;
def C1UUnitM : ProcResGroup<[C1UUnitM0, C1UUnitM1]>;
def C1UUnitL : ProcResGroup<[C1UUnitLS0, C1UUnitLS1, C1UUnitL23]>;
def C1UUnitSA : ProcResGroup<[C1UUnitLS0, C1UUnitLS1]>;
def C1UUnitV : ProcResGroup<[C1UUnitV0, C1UUnitV1, C1UUnitV2,
C1UUnitV3, C1UUnitV4, C1UUnitV5]>;
def C1UUnitV01 : ProcResGroup<[C1UUnitV0, C1UUnitV1]>;
def C1UUnitV0134 : ProcResGroup<[C1UUnitV0, C1UUnitV1, C1UUnitV3, C1UUnitV4]>;
def C1UUnitCMEVXALU : ProcResGroup<[C1UUnitCMEVX0ALU, C1UUnitCMEVX1ALU]>;
def C1UUnitCMEVXFPDOT : ProcResGroup<[C1UUnitCMEVX0FPDOT,
C1UUnitCMEVX1FPDOT]>;
def C1UUnitCMEVXMUL : ProcResGroup<[C1UUnitCMEVX0MUL, C1UUnitCMEVX1MUL]>;
def C1UUnitCMEPERM : ProcResGroup<[C1UUnitCMEPERMS, C1UUnitCMEPERMF]>;
// Define commonly used read types.
def : ReadAdvance<ReadI, 0>;
def : ReadAdvance<ReadISReg, 0>;
def : ReadAdvance<ReadIEReg, 0>;
def : ReadAdvance<ReadIM, 0>;
def : ReadAdvance<ReadIMA, 0>;
def : ReadAdvance<ReadID, 0>;
def : ReadAdvance<ReadExtrHi, 0>;
def : ReadAdvance<ReadAdrBase, 0>;
def : ReadAdvance<ReadST, 0>;
def : ReadAdvance<ReadVLD, 0>;
def : WriteRes<WriteAtomic, []> { let Unsupported = 1; }
def : WriteRes<WriteBarrier, []> { let Latency = 1; }
def : WriteRes<WriteHint, []> { let Latency = 1; }
def : WriteRes<WriteLDHi, []> { let Latency = 4; }
//===----------------------------------------------------------------------===//
// Define customized scheduler read/write types specific to C1 Ultra.
//===----------------------------------------------------------------------===//
// The approach for modelling SME instructions should not be taken as accurate.
// This is due to limitations of tablegen and the actual behaviour we want to
// to model. The CME is a co-processor. Accurate modelling would allow for us
// to model core-to-processor communication latencies. This is out of the scope
// of what we can achieve at the present. As a consequence we model instructions
// that run on the CME as by only modelling their execution latency once issued
// rather than modelling the more complex relationship between the C1-Ultra and
// the CME co-processor and how that will affect execution latencies. Developers
// must therefore take latencies for SME instructions as inaccurate.
//
// We have several classes of SME instructions that we need to model.
//
// 1. SVE instructions added by SME and available when not in streaming SVE mode
// 2. SVE instructions added by SME but not sent to CME when in streaming SVE mode
// 3. FP/SVE/ASIMD instructions sent to CME when in streaming SVE mode
// 4. SME instructions sent to CME and only available in streaming SVE mode
//
// To model instructions of type (1) and (2) is fairly easy in that we know
// that these instructions aren't "dependent" on streaming SVE mode to model their
// scheduling information. To model these we use a predicate on these instructions
// which checks if the target supports SME (SMESchedPred).
//
// To model instructions of type (3) we recognise that llvm-mca doesn't include
// information of whether we are in streaming SVE mode. However, for the sake of
// completeness we model this class of instructions by adding
// an llvm-mca attribute (mca-streaming-sched) which is interpreted as the core
// being in streaming SVE mode. This allows us to at least have some data on how
// these instructions may be scheduled when in streaming SVE mode using llvm-mca
// if the core supports SME and this attribute is enabled. Otherwise, we default
// to the plain non-streaming SVE mode scheduling information.
//
// Similarly, to model instructions of type (4) we just extend the scheduling model
// to add definitions for this class of instructions which are "gated" via the
// SMESchedPred predicate and mca-streaming-sched attribute. The purpose of
// having these definitions is that information on how these instructions are
// scheduled on the CME coprocessor is useful for analysis.
// SME2 related read write types
// Define generic 1 micro-op types
def C1UWrite_1c : SchedWriteRes<[]> { let Latency = 1; }
class C1UCMEWrite<int LatencyCycles, list<ProcResourceKind> Resources>
: SchedWriteRes<Resources> {
let Latency = LatencyCycles;
}
class C1UCMEWriteRC<int LatencyCycles, list<ProcResourceKind> Resources,
list<int> ReleaseCycles>
: SchedWriteRes<Resources> {
let Latency = LatencyCycles;
let ReleaseAtCycles = ReleaseCycles;
}
// Instructions added by SME, available in non-streaming SVE mode or sent to CME
// when in streaming SVE mode.
class C1USMEStreamingSchedWrite<SchedWrite StreamingWrite,
SchedWrite SMEWrite>
: SchedWriteVariant<[
SchedVar<SMEMCStreamingSchedPred, [StreamingWrite]>,
SchedVar<SMESchedPred, [SMEWrite]>,
]>;
// Detailed CME scheduling derived from the SME2 software optimization guide.
def C1UWrite_1c_1CMERNMRET : C1UCMEWrite<1, [C1UUnitCMERNMRET]>;
def C1UWrite_2c_1CMELD: C1UCMEWrite<2, [C1UUnitCMELD]>;
def C1UWrite_2c_1CMELD_1rc : C1UCMEWriteRC<2, [C1UUnitCMELD], [1]>;
def C1UWrite_2c_1L_1CMELD : C1UCMEWrite<2, [C1UUnitL, C1UUnitCMELD]>;
def C1UWrite_2c_1I_1L_1CMELD : C1UCMEWrite<2, [C1UUnitI, C1UUnitL,
C1UUnitCMELD]>;
def C1UWrite_2c_1V01_1L_1CMELD : C1UCMEWrite<2, [C1UUnitV01, C1UUnitL,
C1UUnitCMELD]>;
def C1UWrite_2c_1I_1V01_1L_1CMELD
: C1UCMEWrite<2, [C1UUnitI, C1UUnitV01, C1UUnitL, C1UUnitCMELD]>;
def C1UWrite_2c_1CMEST : C1UCMEWrite<2, [C1UUnitCMEST]>;
def C1UWrite_2c_1CMEST_1rc : C1UCMEWriteRC<2, [C1UUnitCMEST], [1]>;
def C1UWrite_2c_1SA_1CMEST : C1UCMEWrite<2, [C1UUnitSA, C1UUnitCMEST]>;
def C1UWrite_2c_1SA_1V01_1CMEST : C1UCMEWrite<2, [C1UUnitSA, C1UUnitV01,
C1UUnitCMEST]>;
def C1UWrite_2c_1SA_1V01_1I_1CMEST
: C1UCMEWrite<2, [C1UUnitSA, C1UUnitV01, C1UUnitI, C1UUnitCMEST]>;
def C1UWrite_2c_2SA_2V01_1CMEST : C1UCMEWrite<2, [C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01,
C1UUnitCMEST]>;
def C1UWrite_2c_3SA_3V01_1CMEST : C1UCMEWrite<2, [C1UUnitSA, C1UUnitSA,
C1UUnitSA, C1UUnitV01,
C1UUnitV01, C1UUnitV01,
C1UUnitCMEST]>;
def C1UWrite_2c_4SA_4V01_1CMEST : C1UCMEWrite<2, [C1UUnitSA, C1UUnitSA,
C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01,
C1UUnitV01, C1UUnitV01,
C1UUnitCMEST]>;
def C1UWrite_11c_1SA_1CMEST : C1UCMEWrite<11, [C1UUnitSA, C1UUnitCMEST]>;
def C1UWrite_1c_1CMEPERM : C1UCMEWrite<1, [C1UUnitCMEPERM]>;
def C1UWrite_1c_1CMEPERM_2rc : C1UCMEWriteRC<1, [C1UUnitCMEPERM], [2]>;
def C1UWrite_4c_1CMEPERM : C1UCMEWrite<4, [C1UUnitCMEPERM]>;
def C1UWrite_4c_1CMEPERM_2rc : C1UCMEWriteRC<4, [C1UUnitCMEPERM], [2]>;
def C1UWrite_4c_1CMEPERMF : C1UCMEWrite<4, [C1UUnitCMEPERMF]>;
def C1UWrite_4c_1CMEPERMF_1rc : C1UCMEWriteRC<4, [C1UUnitCMEPERMF], [1]>;
def C1UWrite_4c_1M_1CMEPERM_1rc : C1UCMEWriteRC<4, [C1UUnitM, C1UUnitCMEPERM],
[1, 2]>;
def C1UWrite_4c_2M_1CMEPERM_1rc : C1UCMEWriteRC<4, [C1UUnitM, C1UUnitM,
C1UUnitCMEPERM],
[2, 2, 2]>;
def C1UWrite_5c_1CMEPERM_2rc : C1UCMEWriteRC<5, [C1UUnitCMEPERM], [2]>;
def C1UWrite_5c_1CMEPERMF_2rc : C1UCMEWriteRC<5, [C1UUnitCMEPERMF], [2]>;
def C1UWrite_8c_1CMEPERMF_1CMEVX0ALU_1rc
: C1UCMEWriteRC<8, [C1UUnitCMEPERMF, C1UUnitCMEVX0ALU], [1, 1]>;
def C1UWrite_8c_1CMEPERMF_1CMEPERMS_1rc : C1UCMEWriteRC<8, [C1UUnitCMEPERMF,
C1UUnitCMEPERM],
[1, 2]>;
def C1UWrite_4c_1CMEVXALU_1CMEPERMF_1d1rc
: C1UCMEWriteRC<4, [C1UUnitCMEVXALU, C1UUnitCMEPERMF], [2, 1]>;
def C1UWrite_8c_1CMEVXALU_1CMEPERMS_1rc : C1UCMEWriteRC<8, [C1UUnitCMEVXALU,
C1UUnitCMEPERM],
[2, 2]>;
def C1UWrite_8c_1CMEVXALU_1CMEPERMF_1rc
: C1UCMEWriteRC<8, [C1UUnitCMEVXALU, C1UUnitCMEPERMF], [2, 1]>;
def C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc
: C1UCMEWriteRC<12, [C1UUnitCMEVXALU, C1UUnitCMEPERMF], [3, 1]>;
def C1UWrite_12c_1CMEVX0ALU_1CMEPERMS_VXALU_2d5rc
: C1UCMEWriteRC<12, [C1UUnitCMEVX0ALU, C1UUnitCMEPERM,
C1UUnitCMEVXALU],
[2, 5, 2]>;
def C1UWrite_16c_1CMEVXALU_1CMEPERMF_2d3rc
: C1UCMEWriteRC<16, [C1UUnitCMEVXALU, C1UUnitCMEPERMF], [3, 1]>;
def C1UWrite_16c_1CMEVXALU_1CMEPERMS_2d3rc
: C1UCMEWriteRC<16, [C1UUnitCMEVXALU, C1UUnitCMEPERM], [3, 3]>;
def C1UWrite_20c_1CMEVXALU_1CMEPERMS_1d2rc
: C1UCMEWriteRC<20, [C1UUnitCMEVXALU, C1UUnitCMEPERM], [4, 4]>;
def C1UWrite_24c_1CMEVXALU_1CMEPERMS_2d5rc
: C1UCMEWriteRC<24, [C1UUnitCMEVXALU, C1UUnitCMEPERM], [5, 5]>;
def C1UWrite_2c_1CMEPF_2rc : C1UCMEWriteRC<2, [C1UUnitCMEPF], [2]>;
def C1UWrite_4c_1CMEVXALU : C1UCMEWrite<4, [C1UUnitCMEVXALU]>;
def C1UWrite_4c_1CMEVXALU_2rc : C1UCMEWriteRC<4, [C1UUnitCMEVXALU], [2]>;
def C1UWrite_4c_1CMEVXALU_4rc : C1UCMEWriteRC<4, [C1UUnitCMEVXALU], [4]>;
def C1UWrite_4c_1CMEVX0ALU : C1UCMEWrite<4, [C1UUnitCMEVX0ALU]>;
def C1UWrite_4c_1CMEVX0ALU_1CMEPERMF_1rc
: C1UCMEWriteRC<4, [C1UUnitCMEVX0ALU, C1UUnitCMEPERMF], [1, 1]>;
def C1UWrite_4c_1CMEVX0ALU_1CMEPERMF_2rc
: C1UCMEWriteRC<4, [C1UUnitCMEVX0ALU, C1UUnitCMEPERMF], [2, 2]>;
def C1UWrite_4c_1CMEVXFPDOT : C1UCMEWrite<4, [C1UUnitCMEVXFPDOT]>;
def C1UWrite_4c_1CMEVXMUL : C1UCMEWrite<4, [C1UUnitCMEVXMUL]>;
def C1UWrite_4c_1M0_1CMEVXALU : C1UCMEWrite<4, [C1UUnitM0, C1UUnitCMEVXALU]>;
def C1UWrite_4c_1M_1CMEVX0ALU : C1UCMEWrite<4, [C1UUnitM, C1UUnitCMEVX0ALU]>;
def C1UWrite_5c_1CMEVXALU_1rc : C1UCMEWriteRC<5, [C1UUnitCMEVXALU], [2]>;
def C1UWrite_5c_1CMEVXALU_4rc : C1UCMEWriteRC<5, [C1UUnitCMEVXALU], [4]>;
def C1UWrite_8c_1CMEVXMUL_1rc : C1UCMEWriteRC<8, [C1UUnitCMEVXMUL], [2]>;
def C1UWrite_8c_1CMEVXALU_1rc : C1UCMEWriteRC<8, [C1UUnitCMEVXALU], [2]>;
def C1UWrite_12c_1M0_1CMEPERMF_1CMEVX0ALU_2rc
: C1UCMEWriteRC<12, [C1UUnitM0, C1UUnitCMEPERMF, C1UUnitCMEVX0ALU],
[1, 2, 2]>;
def C1UWrite_6c_1CMEVXALU_4rc : C1UCMEWriteRC<6, [C1UUnitCMEVXALU], [4]>;
def C1UWrite_7c_1L_1CMELD : C1UCMEWrite<7, [C1UUnitL, C1UUnitCMELD]>;
def C1UWrite_7c_1CMEPERMF_4rc : C1UCMEWriteRC<7, [C1UUnitCMEPERMF], [4]>;
def C1UWrite_7c_1CMEVXALU_1CMEPERMF_1rc
: C1UCMEWriteRC<7, [C1UUnitCMEVXALU, C1UUnitCMEPERMF], [2, 1]>;
def C1UWrite_7c_1CMEVXALU_4rc : C1UCMEWriteRC<7, [C1UUnitCMEVXALU], [4]>;
def C1UWrite_11c_1CMEVXALU_2rc : C1UCMEWriteRC<11, [C1UUnitCMEVXALU], [2]>;
def C1UWrite_1c_1CMEMML0_2rc : C1UCMEWriteRC<1, [C1UUnitCMEMML0], [2]>;
def C1UWrite_2c_1CMEMML0_1rc : C1UCMEWriteRC<2, [C1UUnitCMEMML0], [1]>;
def C1UWrite_2c_1CMEMML0_2rc : C1UCMEWriteRC<2, [C1UUnitCMEMML0], [2]>;
def C1UWrite_4c_1CMEMML0_2rc : C1UCMEWriteRC<4, [C1UUnitCMEMML0], [2]>;
def C1UWrite_4c_1CMEMML0_3rc : C1UCMEWriteRC<4, [C1UUnitCMEMML0], [3]>;
def C1UWrite_4c_1CMEMML0_4rc : C1UCMEWriteRC<4, [C1UUnitCMEMML0], [4]>;
def C1UWrite_4c_1CMEMML0 : C1UCMEWrite<4, [C1UUnitCMEMML0]>;
def C1UWrite_4c_1CMEMML0_1rc : C1UCMEWriteRC<4, [C1UUnitCMEMML0], [1]>;
def C1UWrite_5c_1CMEMML0_1rc : C1UCMEWriteRC<5, [C1UUnitCMEMML0], [1]>;
def C1UWrite_9c_1CMEMML1 : C1UCMEWrite<9, [C1UUnitCMEMML1]>;
def C1UWrite_9c_1CMEMML1_2rc : C1UCMEWriteRC<9, [C1UUnitCMEMML1], [2]>;
def C1UWrite_9c_1CMEMML1_5rc : C1UCMEWriteRC<9, [C1UUnitCMEMML1], [5]>;
def C1UWrite_13c_1CMEMML1_1CMEPERMF_5rc
: C1UCMEWriteRC<13, [C1UUnitCMEMML1, C1UUnitCMEPERMF], [5, 1]>;
def C1UWrite_10c_1CMEMC_10rc : C1UCMEWriteRC<10, [C1UUnitCMEMC], [10]>;
def C1UWrite_11c_1CMEMC_11rc : C1UCMEWriteRC<11, [C1UUnitCMEMC], [11]>;
def C1UWrite_12c_1CMEMC_12rc : C1UCMEWriteRC<12, [C1UUnitCMEMC], [12]>;
def C1UWrite_17c_1CMEMC_17rc : C1UCMEWriteRC<17, [C1UUnitCMEMC], [17]>;
def C1UWrite_25c_1CMEMC_25rc : C1UCMEWriteRC<25, [C1UUnitCMEMC], [25]>;
// Define a small set of generic 1 micro-op types as placeholders.
def C1UWrite_2c_1B : SchedWriteRes<[C1UUnitB]> { let Latency = 2; }
def C1UWrite_2c_1B_1I : SchedWriteRes<[C1UUnitB, C1UUnitI]> { let Latency = 2; }
def C1UWrite_1c_1I : SchedWriteRes<[C1UUnitI]> { let Latency = 1; }
def C1UWrite_1c_8I : SchedWriteRes<[
C1UUnitI, C1UUnitI, C1UUnitI, C1UUnitI,
C1UUnitI, C1UUnitI, C1UUnitI, C1UUnitI
]> { let Latency = 1; }
def C1UWrite_2c_1I : SchedWriteRes<[C1UUnitI]> { let Latency = 2; }
def C1UWrite_3c_1I : SchedWriteRes<[C1UUnitI]> { let Latency = 3; }
def C1UWrite_2c_1I4 : SchedWriteRes<[C1UUnitI4]> { let Latency = 2; }
def C1UWrite_1c_1M : SchedWriteRes<[C1UUnitM]> { let Latency = 1; }
def C1UWrite_1c_2M : SchedWriteRes<[C1UUnitM, C1UUnitM]> { let Latency = 1; }
def C1UWrite_2c_1M : SchedWriteRes<[C1UUnitM]> { let Latency = 2; }
def C1UWrite_2c_2M : SchedWriteRes<[C1UUnitM, C1UUnitM]> { let Latency = 2; }
def C1UWrite_3c_1M : SchedWriteRes<[C1UUnitM]> { let Latency = 3; }
def C1UWrite_2c_1M0 : SchedWriteRes<[C1UUnitM0]> { let Latency = 2; }
def C1UWrite_3c_1M0 : SchedWriteRes<[C1UUnitM0]> { let Latency = 3; }
def C1UWrite_4c_1M0 : SchedWriteRes<[C1UUnitM0]> { let Latency = 4; }
def C1UWrite_12c_1M0 : SchedWriteRes<[C1UUnitM0]> { let Latency = 12;
let ReleaseAtCycles = [12]; }
def C1UWrite_20c_1M0 : SchedWriteRes<[C1UUnitM0]> { let Latency = 20;
let ReleaseAtCycles = [20]; }
def C1UWrite_2c_1V : SchedWriteRes<[C1UUnitV]> { let Latency = 2; }
def C1UWrite_2c_3V : SchedWriteRes<[C1UUnitV, C1UUnitV, C1UUnitV]> { let Latency = 2; }
def C1UWrite_3c_1V : SchedWriteRes<[C1UUnitV]> { let Latency = 3; }
def C1UWrite_4c_1V : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1UWrite_4c_2V : SchedWriteRes<[C1UUnitV, C1UUnitV]> { let Latency = 4; }
def C1UWrite_4c_3V : SchedWriteRes<[C1UUnitV, C1UUnitV, C1UUnitV]> { let Latency = 4; }
def C1UWrite_6c_3V : SchedWriteRes<[C1UUnitV, C1UUnitV, C1UUnitV]> { let Latency = 6; }
def C1UWrite_6c_5V : SchedWriteRes<[C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV]> { let Latency = 6; }
def C1UWrite_8c_4V : SchedWriteRes<[C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV]> { let Latency = 8; }
def C1UWrite_2c_1V0 : SchedWriteRes<[C1UUnitV0]> { let Latency = 2; }
def C1UWrite_4c_1V0 : SchedWriteRes<[C1UUnitV0]> { let Latency = 4; }
def C1UWrite_6c_6V0 : SchedWriteRes<[C1UUnitV0, C1UUnitV0, C1UUnitV0,
C1UUnitV0, C1UUnitV0, C1UUnitV0, ]> { let Latency = 6; }
def C1UWrite_10c_10V0 : SchedWriteRes<[C1UUnitV0, C1UUnitV0, C1UUnitV0,
C1UUnitV0, C1UUnitV0, C1UUnitV0,
C1UUnitV0, C1UUnitV0, C1UUnitV0,
C1UUnitV0]> { let Latency = 10; }
def C1UWrite_12c_7V0 : SchedWriteRes<[C1UUnitV0, C1UUnitV0, C1UUnitV0, C1UUnitV0,
C1UUnitV0, C1UUnitV0, C1UUnitV0]> { let Latency = 12; }
def C1UWrite_20c_7V0 : SchedWriteRes<[C1UUnitV0, C1UUnitV0, C1UUnitV0, C1UUnitV0,
C1UUnitV0, C1UUnitV0, C1UUnitV0]> { let Latency = 20; }
def C1UWrite_3c_1V1 : SchedWriteRes<[C1UUnitV1]> { let Latency = 3; }
def C1UWrite_5c_1V1 : SchedWriteRes<[C1UUnitV1]> { let Latency = 5; }
def C1UWrite_8c_1V1 : SchedWriteRes<[C1UUnitV1]> { let Latency = 8; }
def C1UWrite_12c_1V1 : SchedWriteRes<[C1UUnitV1]> { let Latency = 12; }
def C1UWrite_2c_1V01 : SchedWriteRes<[C1UUnitV01]> { let Latency = 2; }
def C1UWrite_3c_1V01 : SchedWriteRes<[C1UUnitV01]> { let Latency = 3; }
def C1UWrite_2c_1V0134 : SchedWriteRes<[C1UUnitV0134]> { let Latency = 2; }
def C1UWrite_3c_1V0134 : SchedWriteRes<[C1UUnitV0134]> { let Latency = 3; }
def C1UWrite_4c_1V0134 : SchedWriteRes<[C1UUnitV0134]> { let Latency = 4; }
def C1UWrite_4c_2V0134 : SchedWriteRes<[C1UUnitV0134, C1UUnitV0134]> { let Latency = 4; }
def C1UWrite_6c_1V0134 : SchedWriteRes<[C1UUnitV0134]> { let Latency = 6; }
def C1UWrite_6c_4V0134 : SchedWriteRes<[C1UUnitV0134, C1UUnitV0134,
C1UUnitV0134, C1UUnitV0134]> {
let Latency = 6;
}
def C1UWrite_4c_1L : SchedWriteRes<[C1UUnitL]> { let Latency = 4; }
def C1UWrite_4c_1L_1I : SchedWriteRes<[C1UUnitL, C1UUnitI]> { let Latency = 4; }
def C1UWrite_6c_1L : SchedWriteRes<[C1UUnitL]> { let Latency = 6; }
def C1UWrite_1c_1SA : SchedWriteRes<[C1UUnitSA]> { let Latency = 1; }
def C1UWrite_1c_1I_1Flg : SchedWriteRes<[C1UUnitI, C1UUnitFlg]> { let Latency = 1; }
def C1UWrite_2c_1I_1Flg : SchedWriteRes<[C1UUnitI, C1UUnitFlg]> { let Latency = 2; }
def C1UWrite_1c_1SA_1D : SchedWriteRes<[C1UUnitSA, C1UUnitD]> { let Latency = 1; }
def C1UWrite_1c_1SA_1D_1I : SchedWriteRes<[C1UUnitSA, C1UUnitD, C1UUnitI]> { let Latency = 1; }
def C1UWrite_2c_1SA_1V01 : SchedWriteRes<[C1UUnitSA, C1UUnitV01]> { let Latency = 2; }
def C1UWrite_2c_2SA_2V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitV01, C1UUnitV01]> { let Latency = 2; }
def C1UWrite_2c_3SA_3V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01]> { let Latency = 2; }
def C1UWrite_2c_4SA_4V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01]> { let Latency = 2; }
def C1UWrite_2c_3SA_6V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01,
C1UUnitV01, C1UUnitV01, C1UUnitV01]> { let Latency = 2; }
def C1UWrite_2c_1SA_1V01_1I : SchedWriteRes<[C1UUnitSA, C1UUnitV01, C1UUnitI]> { let Latency = 2; }
def C1UWrite_4c_2L : SchedWriteRes<[C1UUnitL, C1UUnitL]> { let Latency = 4; }
def C1UWrite_4c_2L_1I : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitI]> { let Latency = 4; }
def C1UWrite_5c_1L_1I : SchedWriteRes<[C1UUnitL, C1UUnitI]> {
let Latency = 5;
}
def C1UWrite_5c_2L_1I : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitI]> { let Latency = 5; }
def C1UWrite_6c_1L_1I : SchedWriteRes<[C1UUnitL, C1UUnitI]> {
let Latency = 6;
}
def C1UWrite_6c_2L_1I : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitI]> { let Latency = 6; }
def C1UWrite_7c_1L_1I : SchedWriteRes<[C1UUnitL, C1UUnitI]> {
let Latency = 7;
}
def C1UWrite_5c_1M0_1V : SchedWriteRes<[C1UUnitM0, C1UUnitV]> {
let Latency = 5;
}
def C1UWrite_3c_1M0_1V : SchedWriteRes<[C1UUnitM0, C1UUnitV]> {
let Latency = 3;
}
def C1UWrite_4c_1V0134_1V : SchedWriteRes<[C1UUnitV0134, C1UUnitV]> { let Latency = 4; }
def C1UWrite_8c_1V1_4rc : SchedWriteRes<[C1UUnitV1]> {
let Latency = 8;
let ReleaseAtCycles = [4];
}
def C1UWrite_9c_1V1_2rc : SchedWriteRes<[C1UUnitV1]> {
let Latency = 9;
let ReleaseAtCycles = [2];
}
def C1UWrite_6c_1M0_1B : SchedWriteRes<[C1UUnitM0, C1UUnitB]> {
let Latency = 6;
}
def C1UWrite_6c_1M0_1B_1I : SchedWriteRes<[C1UUnitM0, C1UUnitB, C1UUnitI]> {
let Latency = 6;
}
def C1UWrite_9c_1M0_1L : SchedWriteRes<[C1UUnitM0, C1UUnitL]> {
let Latency = 9;
}
def C1UWrite_6c_2L : SchedWriteRes<[C1UUnitL, C1UUnitL]> {
let Latency = 6;
}
def C1UWrite_6c_3L : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitL]> {
let Latency = 6;
}
def C1UWrite_6c_4L : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitL, C1UUnitL]> {
let Latency = 6;
}
def C1UWrite_7c_4L : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitL, C1UUnitL]> {
let Latency = 7;
}
def C1UWrite_6c_1L_1V : SchedWriteRes<[C1UUnitL, C1UUnitV]> {
let Latency = 6;
}
def C1UWrite_8c_1L_2V : SchedWriteRes<[C1UUnitL, C1UUnitV, C1UUnitV]> {
let Latency = 8;
}
def C1UWrite_8c_2L_2V : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitV, C1UUnitV]> {
let Latency = 8;
}
def C1UWrite_9c_2L_2V_1I : SchedWriteRes<[C1UUnitL, C1UUnitL,
C1UUnitV, C1UUnitV,
C1UUnitI]> {
let Latency = 9;
}
def C1UWrite_8c_2L_3V : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitV, C1UUnitV,
C1UUnitV]> {
let Latency = 8;
}
def C1UWrite_9c_2L_3V : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitV, C1UUnitV,
C1UUnitV]> {
let Latency = 9;
}
def C1UWrite_8c_3L_3V : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitL,
C1UUnitV, C1UUnitV, C1UUnitV]> {
let Latency = 8;
}
def C1UWrite_9c_3L_3V : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitL,
C1UUnitV, C1UUnitV, C1UUnitV]> {
let Latency = 9;
}
def C1UWrite_9c_3L_3V_1I : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitL,
C1UUnitV, C1UUnitV, C1UUnitV,
C1UUnitI]> {
let Latency = 9;
}
def C1UWrite_10c_4L_8V : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitL, C1UUnitL,
C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV,
C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV]> {
let Latency = 10;
}
def C1UWrite_11c_4L_8V_1I : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitL, C1UUnitL,
C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV,
C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV,
C1UUnitI]> {
let Latency = 11;
}
def C1UWrite_9c_4L_8V : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitL, C1UUnitL,
C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV,
C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV]> {
let Latency = 9;
}
def C1UWrite_8c_2L_4V : SchedWriteRes<[C1UUnitL, C1UUnitL, C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV]> {
let Latency = 8;
}
def C1UWrite_4c_1SA_1V01_1V : SchedWriteRes<[C1UUnitSA, C1UUnitV01, C1UUnitV]> { let Latency = 4; }
def C1UWrite_4c_2SA_2V01_2V : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitV01, C1UUnitV01,
C1UUnitV, C1UUnitV]> { let Latency = 4; }
def C1UWrite_5c_5SA_5V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01]> {
let Latency = 5;
}
def C1UWrite_5c_4SA_4V01_4V : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01,
C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV]> { let Latency = 5; }
def C1UWrite_6c_1SA_1V01_1V : SchedWriteRes<[C1UUnitSA, C1UUnitV01, C1UUnitV]> {
let Latency = 6;
}
def C1UWrite_6c_6SA_6V01_6V : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01,
C1UUnitV01, C1UUnitV01, C1UUnitV01,
C1UUnitV, C1UUnitV, C1UUnitV,
C1UUnitV, C1UUnitV, C1UUnitV]> {
let Latency = 6;
}
def C1UWrite_6c_8SA_8V01_8V : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitSA, C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01,
C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01,
C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV,
C1UUnitV, C1UUnitV, C1UUnitV, C1UUnitV]> {
let Latency = 6;
}
def C1UWrite_7c_5SA_5V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01]> {
let Latency = 7;
}
def C1UWrite_7c_12SA_12V01_12V : SchedWriteRes<[
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV,
C1UUnitSA, C1UUnitV01, C1UUnitV
]> {
let Latency = 7;
}
def C1UWrite_7c_1M_1M0_1V : SchedWriteRes<[C1UUnitM, C1UUnitM0, C1UUnitV]> { let Latency = 7; }
def C1UWrite_6c_2V1 : SchedWriteRes<[C1UUnitV1, C1UUnitV1]> { let Latency = 6; }
def C1UWrite_8c_1M0_1V1_1V01 : SchedWriteRes<[C1UUnitM0, C1UUnitV1, C1UUnitV01]> { let Latency = 8; }
def C1UWrite_5c_1V1_1V01 : SchedWriteRes<[C1UUnitV1, C1UUnitV01]> { let Latency = 5; }
def C1UWrite_7c_1M0_1V0134 : SchedWriteRes<[C1UUnitM0, C1UUnitV0134]> { let Latency = 7; }
def C1UWrite_5c_1V_1M0 : SchedWriteRes<[C1UUnitV, C1UUnitM0]> { let Latency = 5; }
def C1UWrite_8c_1V_3V0134 : SchedWriteRes<[C1UUnitV, C1UUnitV0134, C1UUnitV0134, C1UUnitV0134]> { let Latency = 8; }
def C1UWrite_6c_1V_2V0134 : SchedWriteRes<[C1UUnitV, C1UUnitV0134, C1UUnitV0134]> { let Latency = 6; }
def C1UWrite_6c_2V_1V0134 : SchedWriteRes<[C1UUnitV, C1UUnitV, C1UUnitV0134]> { let Latency = 6; }
def C1UWrite_4c_1V_1V0134 : SchedWriteRes<[C1UUnitV, C1UUnitV0134]> { let Latency = 4; }
def C1UWrite_12c_1V0_8rc : SchedWriteRes<[C1UUnitV0]> {
let Latency = 12;
let ReleaseAtCycles = [8];
}
def C1UWrite_11c_1V0_4rc : SchedWriteRes<[C1UUnitV0]> {
let Latency = 11;
let ReleaseAtCycles = [4];
}
def C1UWrite_13c_1V0_2rc : SchedWriteRes<[C1UUnitV0]> {
let Latency = 13;
let ReleaseAtCycles = [2];
}
def C1UWrite_12c_1V1_8rc : SchedWriteRes<[C1UUnitV1]> {
let Latency = 12;
let ReleaseAtCycles = [8];
}
def C1UWrite_11c_1V1_4rc : SchedWriteRes<[C1UUnitV1]> {
let Latency = 11;
let ReleaseAtCycles = [4];
}
def C1UWrite_13c_1V1_2rc : SchedWriteRes<[C1UUnitV1]> {
let Latency = 13;
let ReleaseAtCycles = [2];
}
def C1UWrite_6c_1L_1M : SchedWriteRes<[C1UUnitL, C1UUnitM]> {
let Latency = 6;
}
def C1UWrite_9c_1V01_1L : SchedWriteRes<[C1UUnitV01, C1UUnitL]> {
let Latency = 9;
}
def C1UWrite_4c_2SA_2V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01]> {
let Latency = 4;
}
def C1UWrite_4c_2SA_2V01_1I : SchedWriteRes<[C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01,
C1UUnitI]> {
let Latency = 4;
}
def C1UWrite_5c_3SA_3V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01]> {
let Latency = 5;
}
def C1UWrite_5c_3SA_3V01_1I : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01,
C1UUnitI]> {
let Latency = 5;
}
def C1UWrite_7c_4SA_4V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01]> {
let Latency = 7;
}
def C1UWrite_7c_4SA_4V01_1I : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01,
C1UUnitI]> {
let Latency = 7;
}
def C1UWrite_4c_1SA_1V01 : SchedWriteRes<[C1UUnitSA, C1UUnitV01]> { let Latency = 4; }
def C1UWrite_4c_3SA_3V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01]> { let Latency = 4; }
def C1UWrite_4c_3SA_6V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01, C1UUnitV01,
C1UUnitV01, C1UUnitV01]> { let Latency = 4; }
def C1UWrite_5c_3SA_6V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01,
C1UUnitV01, C1UUnitV01,
C1UUnitV01, C1UUnitV01]> { let Latency = 5; }
def C1UWrite_6c_3SA_3V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01, C1UUnitV01]> { let Latency = 6; }
def C1UWrite_7c_3SA_6V01 : SchedWriteRes<[C1UUnitSA, C1UUnitSA, C1UUnitSA,
C1UUnitV01, C1UUnitV01,
C1UUnitV01, C1UUnitV01,
C1UUnitV01, C1UUnitV01]> { let Latency = 7;}
// Forwarded types
def C1UWr_FMA : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_FMA : SchedReadAdvance<2, [WriteFMul, C1UWr_FMA]>;
def C1UWr_VA : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_VA : SchedReadAdvance<3, [C1UWr_VA]>;
def C1UWr_VDOT : SchedWriteRes<[C1UUnitV]> { let Latency = 3; }
def C1URd_VDOT : SchedReadAdvance<2, [C1UWr_VDOT]>;
def C1UWr_VMMA : SchedWriteRes<[C1UUnitV]> { let Latency = 3; }
def C1URd_VMMA : SchedReadAdvance<2, [C1UWr_VMMA]>;
def C1UWr_MA : SchedWriteRes<[C1UUnitI4]> { let Latency = 3; }
def C1URd_MA : SchedReadAdvance<2, [C1UWr_MA]>;
def C1UWrite_MAOrMul : SchedWriteVariant<[
SchedVar<IsReg3ZeroPred, [C1UWrite_2c_1I4]>,
SchedVar<NoSchedPred, [C1UWr_MA]>]>;
def C1UWr_VMA : SchedWriteRes<[C1UUnitV0134]> { let Latency = 4; }
def C1URd_VMA : SchedReadAdvance<3, [C1UWr_VMA]>;
def C1UWr_VMAH : SchedWriteRes<[C1UUnitV0134]> { let Latency = 4; }
def C1URd_VMAH : SchedReadAdvance<2, [C1UWr_VMAH]>;
def C1UWr_VPA : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_VPA : SchedReadAdvance<3, [C1UWr_VPA]>;
def C1UWr_VSA : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_VSA : SchedReadAdvance<3, [C1UWr_VSA]>;
def C1UWr_VFCMA : SchedWriteRes<[C1UUnitV]> { let Latency = 5; }
def C1URd_VFCMA : SchedReadAdvance<3, [C1UWr_VFCMA]>;
def C1UWr_VFMA : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_VFMA : SchedReadAdvance<2, [C1UWr_VFMA]>;
def C1UWr_VBFDOT : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_VBFDOT : SchedReadAdvance<2, [C1UWr_VBFDOT]>;
def C1UWr_VBFMMA : SchedWriteRes<[C1UUnitV]> { let Latency = 5; }
def C1URd_VBFMMA : SchedReadAdvance<1, [C1UWr_VBFMMA]>;
def C1UWr_VBFMAL : SchedWriteRes<[C1UUnitV]> { let Latency = 5; }
def C1URd_VBFMAL : SchedReadAdvance<3, [C1UWr_VBFMAL]>;
def C1UWr_ZA : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_ZA : SchedReadAdvance<3, [C1UWr_ZA]>;
def C1UWr_ZPA : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_ZPA : SchedReadAdvance<3, [C1UWr_ZPA]>;
def C1UWr_ZSA : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_ZSA : SchedReadAdvance<3, [C1UWr_ZSA]>;
def C1UWr_ZDOTB : SchedWriteRes<[C1UUnitV]> { let Latency = 3; }
def C1URd_ZDOTB : SchedReadAdvance<2, [C1UWr_ZDOTB]>;
def C1UWr_ZDOTH : SchedWriteRes<[C1UUnitV0134]> { let Latency = 3; }
def C1URd_ZDOTH : SchedReadAdvance<2, [C1UWr_ZDOTH]>;
def C1UWr_ZCMABHS : SchedWriteRes<[C1UUnitV0134]> { let Latency = 4; }
def C1URd_ZCMABHS : SchedReadAdvance<3, [C1UWr_ZCMABHS]>;
def C1UWr_ZMMA : SchedWriteRes<[C1UUnitV]> { let Latency = 3; }
def C1URd_ZMMA : SchedReadAdvance<2, [C1UWr_ZMMA]>;
def C1UWr_ZMA : SchedWriteRes<[C1UUnitV0134]> { let Latency = 4; }
def C1URd_ZMA : SchedReadAdvance<3, [C1UWr_ZMA]>;
def C1UWr_ZMASQL : SchedWriteRes<[C1UUnitV0134]> { let Latency = 4; }
def C1URd_ZMASQL : SchedReadAdvance<2, [C1UWr_ZMASQL]>;
def C1UWr_ZFCMA : SchedWriteRes<[C1UUnitV]> { let Latency = 5; }
def C1URd_ZFCMA : SchedReadAdvance<3, [C1UWr_ZFCMA]>;
def C1UWr_ZFMA : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_ZFMA : SchedReadAdvance<2, [C1UWr_ZFMA]>;
def C1UWr_ZFMAL : SchedWriteRes<[C1UUnitV]> { let Latency = 5; }
def C1URd_ZFMAL : SchedReadAdvance<3, [C1UWr_ZFMAL]>;
def C1UWr_ZBFDOT : SchedWriteRes<[C1UUnitV]> { let Latency = 4; }
def C1URd_ZBFDOT : SchedReadAdvance<2, [C1UWr_ZBFDOT]>;
def C1UWr_ZBFMMA : SchedWriteRes<[C1UUnitV]> { let Latency = 5; }
def C1URd_ZBFMMA : SchedReadAdvance<2, [C1UWr_ZBFMMA]>;
def C1UWr_ZBFMAL : SchedWriteRes<[C1UUnitV]> { let Latency = 5; }
def C1URd_ZBFMAL : SchedReadAdvance<3, [C1UWr_ZBFMAL]>;
def C1UWr_Pred : SchedWriteRes<[C1UUnitM, C1UUnitM]> { let Latency = 2; }
def C1URd_Pred : SchedReadAdvance<1, [C1UWr_Pred]>;
// Predicate controlled types
def C1UWrite_ArithI : SchedWriteVariant<[
SchedVar<IsCheapLSL, [C1UWrite_1c_1I]>,
SchedVar<NoSchedPred, [C1UWrite_2c_1I]>]>;
def C1UWrite_Extr : SchedWriteVariant<[
SchedVar<IsRORImmIdiomPred, [C1UWrite_1c_1I]>,
SchedVar<NoSchedPred, [C1UWrite_3c_1I]>]>;
def C1UWrite_1or2c_1I : SchedWriteVariant<[
SchedVar<IsXOrWDest, [C1UWrite_1c_1I]>,
SchedVar<NoSchedPred, [C1UWrite_2c_1I]>]>;
def C1UWrite_1or2c_1I_1Flg : SchedWriteVariant<[
SchedVar<IsXOrWDest, [C1UWrite_1c_1I_1Flg]>,
SchedVar<NoSchedPred, [C1UWrite_2c_1I_1Flg]>]>;
def C1UWrite_2or4c_1SA_1V01 : SchedWriteVariant<[
SchedVar<SameZRegDstSrcPred, [C1UWrite_4c_1SA_1V01]>,
SchedVar<NoSchedPred, [C1UWrite_2c_1SA_1V01]>]>;
def C1UWrite_2or4c_3SA_6V01 : SchedWriteVariant<[
SchedVar<SameZRegDstSrcPred, [C1UWrite_4c_3SA_6V01]>,
SchedVar<NoSchedPred, [C1UWrite_2c_3SA_6V01]>]>;
def C1UWrite_4or6c_3SA_3V01 : SchedWriteVariant<[
SchedVar<SameZRegDstSrcPred, [C1UWrite_6c_3SA_3V01]>,
SchedVar<NoSchedPred, [C1UWrite_4c_3SA_3V01]>]>;
def C1UWrite_5or7c_3SA_6V01 : SchedWriteVariant<[
SchedVar<SameZRegDstSrcPred, [C1UWrite_7c_3SA_6V01]>,
SchedVar<NoSchedPred, [C1UWrite_5c_3SA_6V01]>]>;
def C1UWrite_5or7c_5SA_5V01 : SchedWriteVariant<[
SchedVar<SameZRegDstSrcPred, [C1UWrite_7c_5SA_5V01]>,
SchedVar<NoSchedPred, [C1UWrite_5c_5SA_5V01]>]>;
def C1UWr_FMA_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWr_FMA>;
def C1UWr_VA_CME : C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1rc, C1UWr_VA>;
def C1UWr_VDOT_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWr_VDOT>;
def C1UWr_VMMA_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEMML0_2rc,
C1UWr_VMMA>;
def C1UWr_VMA_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWr_VMA>;
def C1UWr_VMAH_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWr_VMAH>;
def C1UWr_VPA_CME : C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1rc, C1UWr_VPA>;
def C1UWr_VSA_CME : C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1rc, C1UWr_VSA>;
def C1UWr_VFCMA_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL,
C1UWr_VFCMA>;
def C1UWr_VFMA_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWr_VFMA>;
def C1UWr_VBFDOT_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXFPDOT,
C1UWr_VBFDOT>;
def C1UWr_VBFMMA_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEMML0_2rc,
C1UWr_VBFMMA>;
def C1UWr_VBFMAL_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL,
C1UWr_VBFMAL>;
def C1UWr_ZA_CME : C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1rc, C1UWr_ZA>;
def C1UWr_ZPA_CME : C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1rc, C1UWr_ZPA>;
def C1UWr_ZSA_CME : C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1rc, C1UWr_ZSA>;
def C1UWr_ZDOTB_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWr_ZDOTB>;
def C1UWr_ZDOTH_CME : C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXMUL_1rc,
C1UWr_ZDOTH>;
def C1UWr_ZCMABHS_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL,
C1UWr_ZCMABHS>;
def C1UWr_ZMA_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWr_ZMA>;
def C1UWr_ZMASQL_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL,
C1UWr_ZMASQL>;
def C1UWr_ZFCMA_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL,
C1UWr_ZFCMA>;
def C1UWr_ZFMA_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWr_ZFMA>;
def C1UWr_ZFMAL_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL,
C1UWr_ZFMAL>;
def C1UWr_ZBFDOT_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXFPDOT,
C1UWr_ZBFDOT>;
def C1UWr_ZBFMAL_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL,
C1UWr_ZBFMAL>;
def C1UWrite_8c_1V_3V0134_CMEIntReduce
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_8c_1V_3V0134>;
def C1UWrite_6c_1V_2V0134_CMEIntReduce
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_6c_1V_2V0134>;
def C1UWrite_6c_2V_1V0134_CMEIntReduce
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_6c_2V_1V0134>;
def C1UWrite_4c_1V_1V0134_CMEIntReduce
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_4c_1V_1V0134>;
def C1UWrite_4c_2V_CMEIntReduce
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_4c_2V>;
def C1UWrite_8c_4V_CMEFPReduceH
: C1USMEStreamingSchedWrite<C1UWrite_24c_1CMEVXALU_1CMEPERMS_2d5rc,
C1UWrite_8c_4V>;
def C1UWrite_6c_3V_CMEFPReduceS
: C1USMEStreamingSchedWrite<C1UWrite_20c_1CMEVXALU_1CMEPERMS_1d2rc,
C1UWrite_6c_3V>;
def C1UWrite_8c_4V_CMEFPReduceMaxMin
: C1USMEStreamingSchedWrite<C1UWrite_16c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_8c_4V>;
def C1UWrite_6c_3V_CMEFPReduceMaxMin
: C1USMEStreamingSchedWrite<C1UWrite_16c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_6c_3V>;
def C1UWrite_4c_2V_CMEFPReduceD
: C1USMEStreamingSchedWrite<C1UWrite_16c_1CMEVXALU_1CMEPERMS_2d3rc,
C1UWrite_4c_2V>;
def C1UWrite_4c_2V_CMEFPReduceMaxMinD
: C1USMEStreamingSchedWrite<C1UWrite_16c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_4c_2V>;
def C1UWrite_2c_1V_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU,
C1UWrite_2c_1V>;
def C1UWrite_2c_1V0_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVX0ALU,
C1UWrite_2c_1V0>;
def C1UWrite_2c_1V01_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU,
C1UWrite_2c_1V01>;
def C1UWrite_2c_1V0134_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU,
C1UWrite_2c_1V0134>;
def C1UWrite_3c_1V0134_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU,
C1UWrite_3c_1V0134>;
def C1UWrite_3c_1V1_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEPERMF_1rc,
C1UWrite_3c_1V1>;
def C1UWrite_4c_1V_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU,
C1UWrite_4c_1V>;
def C1UWrite_4c_1V0134_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU,
C1UWrite_4c_1V0134>;
def C1UWrite_4c_1V0134_1V_CME
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_4c_1V0134_1V>;
def C1UWrite_4c_1V_1V0134_CME
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_4c_1V_1V0134>;
def C1UWrite_4c_2V_CME : C1USMEStreamingSchedWrite<C1UWrite_16c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_4c_2V>;
def C1UWrite_4c_2V0134_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU,
C1UWrite_4c_2V0134>;
def C1UWrite_6c_1V_2V0134_CME
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_6c_1V_2V0134>;
def C1UWrite_6c_2V_1V0134_CME
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_6c_2V_1V0134>;
def C1UWrite_6c_3V_CME : C1USMEStreamingSchedWrite<C1UWrite_16c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_6c_3V>;
def C1UWrite_8c_1V1_4rc_1CME
: C1USMEStreamingSchedWrite<C1UWrite_10c_1CMEMC_10rc, C1UWrite_8c_1V1_4rc>;
def C1UWrite_8c_1V_3V0134_CME
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVXALU_1CMEPERMF_2d3rc,
C1UWrite_8c_1V_3V0134>;
def C1UWrite_9c_1V1_2rc_1CME
: C1USMEStreamingSchedWrite<C1UWrite_11c_1CMEMC_11rc, C1UWrite_9c_1V1_2rc>;
def C1UWrite_11c_1V0_4rc_1CME
: C1USMEStreamingSchedWrite<C1UWrite_11c_1CMEMC_11rc, C1UWrite_11c_1V0_4rc>;
def C1UWrite_11c_1V1_4rc_1CME
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEMC_12rc, C1UWrite_11c_1V1_4rc>;
def C1UWrite_12c_1V0_8rc_1CME
: C1USMEStreamingSchedWrite<C1UWrite_10c_1CMEMC_10rc, C1UWrite_12c_1V0_8rc>;
def C1UWrite_12c_1V1_8rc_1CME
: C1USMEStreamingSchedWrite<C1UWrite_10c_1CMEMC_10rc, C1UWrite_12c_1V1_8rc>;
def C1UWrite_12c_7V0_CME
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEMC_12rc, C1UWrite_12c_7V0>;
def C1UWrite_13c_1V0_2rc_1CME
: C1USMEStreamingSchedWrite<C1UWrite_17c_1CMEMC_17rc, C1UWrite_13c_1V0_2rc>;
def C1UWrite_13c_1V1_2rc_1CME
: C1USMEStreamingSchedWrite<C1UWrite_25c_1CMEMC_25rc, C1UWrite_13c_1V1_2rc>;
def C1UWrite_20c_7V0_CME
: C1USMEStreamingSchedWrite<C1UWrite_20c_7V0, C1UWrite_20c_7V0>;
def C1UWrite_3c_1M0_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1M0_1CMEVXALU,
C1UWrite_3c_1M0>;
def C1UWrite_5c_1M0_1V_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1M0_1CMEVXALU,
C1UWrite_5c_1M0_1V>;
def C1UWrite_5c_1V1_1V01_CME : C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1CMEPERMF_1rc,
C1UWrite_5c_1V1_1V01>;
def C1UWrite_5c_1V_1M0_CME : C1USMEStreamingSchedWrite<C1UWrite_4c_1M_1CMEPERM_1rc,
C1UWrite_5c_1V_1M0>;
def C1UWrite_7c_1M0_1V0134_CME
: C1USMEStreamingSchedWrite<C1UCMEWriteRC<12, [C1UUnitM0, C1UUnitCMEVX0ALU,
C1UUnitCMEPERM,
C1UUnitCMEVXALU],
[12, 12, 12, 12]>,
C1UWrite_7c_1M0_1V0134>;
def C1UWrite_8c_1M0_1V1_1V01_CME
: C1USMEStreamingSchedWrite<C1UCMEWriteRC<8, [C1UUnitCMEVXALU,
C1UUnitCMEPERMF],
[8, 2]>,
C1UWrite_8c_1M0_1V1_1V01>;
def C1UWrite_6c_1L_CME : C1USMEStreamingSchedWrite<C1UWrite_2c_1L_1CMELD,
C1UWrite_6c_1L>;
def C1UWrite_6c_1L_1I_CME : C1USMEStreamingSchedWrite<C1UWrite_2c_1I_1L_1CMELD,
C1UWrite_6c_1L_1I>;
def C1UWrite_6c_1L_1M_CME : C1USMEStreamingSchedWrite<C1UWrite_2c_1L_1CMELD,
C1UWrite_6c_1L_1M>;
def C1UWrite_6c_2L_1I_CME : C1USMEStreamingSchedWrite<C1UWrite_2c_1I_1L_1CMELD,
C1UWrite_6c_2L_1I>;
def C1UWrite_7c_1L_1I_CME : C1USMEStreamingSchedWrite<C1UWrite_2c_1I_1L_1CMELD,
C1UWrite_7c_1L_1I>;
def C1UWrite_8c_2L_2V_CME : C1USMEStreamingSchedWrite<C1UWrite_2c_1V01_1L_1CMELD,
C1UWrite_8c_2L_2V>;
def C1UWrite_8c_3L_3V_CME : C1USMEStreamingSchedWrite<C1UWrite_2c_1V01_1L_1CMELD,
C1UWrite_8c_3L_3V>;
def C1UWrite_9c_2L_2V_1I_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_1I_1V01_1L_1CMELD,
C1UWrite_9c_2L_2V_1I>;
def C1UWrite_9c_3L_3V_1I_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_1I_1V01_1L_1CMELD,
C1UWrite_9c_3L_3V_1I>;
def C1UWrite_10c_4L_8V_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_1V01_1L_1CMELD, C1UWrite_10c_4L_8V>;
def C1UWrite_11c_4L_8V_1I_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_1I_1V01_1L_1CMELD,
C1UWrite_11c_4L_8V_1I>;
def C1UWrite_LdrQ_CME : SchedWriteVariant<[
SchedVar<FPIsQForm, [C1UWrite_7c_1L_1I_CME]>,
SchedVar<NoSchedPred, [C1UWrite_6c_1L_CME]>]>;
def C1UWrite_1c_1SA_CME : C1USMEStreamingSchedWrite<C1UWrite_2c_1SA_1CMEST,
C1UWrite_1c_1SA>;
def C1UWrite_2c_1SA_1V01_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_1SA_1V01_1CMEST,
C1UWrite_2c_1SA_1V01>;
def C1UWrite_2c_1SA_1V01_1I_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_1SA_1V01_1I_1CMEST,
C1UWrite_2c_1SA_1V01_1I>;
def C1UWrite_2c_2SA_2V01_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_2SA_2V01_1CMEST,
C1UWrite_2c_2SA_2V01>;
def C1UWrite_4c_2SA_2V01_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_2SA_2V01_1CMEST,
C1UWrite_4c_2SA_2V01>;
def C1UWrite_4c_2SA_2V01_1I_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_2SA_2V01_1CMEST,
C1UWrite_4c_2SA_2V01_1I>;
def C1UWrite_5c_3SA_3V01_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_3SA_3V01_1CMEST,
C1UWrite_5c_3SA_3V01>;
def C1UWrite_5c_3SA_3V01_1I_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_3SA_3V01_1CMEST,
C1UWrite_5c_3SA_3V01_1I>;
def C1UWrite_7c_4SA_4V01_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_4SA_4V01_1CMEST,
C1UWrite_7c_4SA_4V01>;
def C1UWrite_7c_4SA_4V01_1I_CME
: C1USMEStreamingSchedWrite<C1UWrite_2c_4SA_4V01_1CMEST,
C1UWrite_7c_4SA_4V01_1I>;
def C1UWrite_StrQ_CME : SchedWriteVariant<[
SchedVar<FPIsQForm, [C1UWrite_2c_1SA_1V01_1I_CME]>,
SchedVar<NoSchedPred, [C1UWrite_2c_1SA_1V01_CME]>]>;
// SME predicates
def C1UWrite_2c_1V_StreamingCME : C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU,
C1UWrite_2c_1V>;
def C1UWrite_3c_1V01_StreamingCME
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU, C1UWrite_3c_1V01>;
def C1UWrite_2c_1M_StreamingCME
: C1USMEStreamingSchedWrite<C1UWrite_4c_1M_1CMEVX0ALU, C1UWrite_2c_1M>;
def C1UWrite_2c_2M_StreamingCME
: C1USMEStreamingSchedWrite<C1UWrite_4c_2M_1CMEPERM_1rc, C1UWrite_2c_2M>;
def C1UWrite_2c_1V_StreamingCMEPERM
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEPERM, C1UWrite_2c_1V>;
def C1UWrite_2c_1V_StreamingCMEVXALU_1CMEPERMS
: C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1CMEPERMS_1rc, C1UWrite_2c_1V>;
def C1UWrite_2c_1V_StreamingCMEVXALU_5c
: C1USMEStreamingSchedWrite<C1UWrite_5c_1CMEVXALU_1rc, C1UWrite_2c_1V>;
def C1UWrite_4c_1V_StreamingCMEMML0
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEMML0_1rc, C1UWrite_4c_1V>;
def C1UWrite_2c_1M_StreamingCMEVX0ALU
: C1USMEStreamingSchedWrite<C1UWrite_4c_1M_1CMEVX0ALU, C1UWrite_2c_1M>;
def C1UWrite_2c_2M_StreamingCMEPERM
: C1USMEStreamingSchedWrite<C1UWrite_4c_2M_1CMEPERM_1rc, C1UWrite_2c_2M>;
def C1UWrite_2c_1V_1CMEVXALU
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU, C1UWrite_2c_1V>;
def C1UWrite_2c_1V_1CMEPERM
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEPERM, C1UWrite_2c_1V>;
def C1UWrite_2c_1V_1CMEPERMF_1rc
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEPERMF_1rc, C1UWrite_2c_1V>;
def C1UWrite_2c_1V_1CMEPERM_1c
: C1USMEStreamingSchedWrite<C1UWrite_1c_1CMEPERM, C1UWrite_2c_1V>;
def C1UWrite_2c_1V0_1CMEVX0ALU
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVX0ALU, C1UWrite_2c_1V0>;
def C1UWrite_3c_1V01_1CMEVXALU
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU, C1UWrite_3c_1V01>;
def C1UWrite_3c_1V_1CMEVXALU
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU, C1UWrite_3c_1V>;
def C1UWrite_3c_1V_1CMEVXMUL
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWrite_3c_1V>;
def C1UWrite_4c_1V_1CMEVXALU
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU, C1UWrite_4c_1V>;
def C1UWrite_4c_1V_1CMEVXMUL
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWrite_4c_1V>;
def C1UWrite_4c_1V0134_1CMEVXMUL
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWrite_4c_1V0134>;
def C1UWrite_3c_1V0134_1CMEVXMUL
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWrite_3c_1V0134>;
def C1UWrite_6c_1V0134_1CMEVXMUL
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXMUL, C1UWrite_6c_1V0134>;
def C1UWrite_3c_1M0_1V_1CMEPERMF_1CMEPERMS
: C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEPERMF_1CMEPERMS_1rc,
C1UWrite_3c_1M0_1V>;
def C1UWrite_3c_1M0_1CMEPERMF
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEPERMF, C1UWrite_3c_1M0>;
def C1UWrite_7c_1M0_1V0134_CMEINDEX_IRRI
: C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVXALU_1CMEPERMF_1d1rc,
C1UWrite_7c_1M0_1V0134>;
def C1UWrite_7c_1M0_1V0134_CMEINDEX_RR
: C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEVX0ALU_1CMEPERMS_VXALU_2d5rc,
C1UWrite_7c_1M0_1V0134>;
def C1UWrite_8c_1M0_1V1_1V01_CMECLAST
: C1USMEStreamingSchedWrite<C1UWrite_12c_1M0_1CMEPERMF_1CMEVX0ALU_2rc,
C1UWrite_8c_1M0_1V1_1V01>;
// Miscellaneous
// -----------------------------------------------------------------------------
def : InstRW<[WriteI], (instrs COPY)>;
def : WriteRes<WriteSys, []> { let Latency = 1; }
//===----------------------------------------------------------------------===//
// Instruction scheduling classes.
//===----------------------------------------------------------------------===//
// Branch instructions
// -----------------------------------------------------------------------------
// Branch, immed
// Compare and branch
def : SchedAlias<WriteBr, C1UWrite_2c_1B>;
// Branch, register
def : SchedAlias<WriteBrReg, C1UWrite_2c_1B>;
// Branch and link, immed
// Branch and link, register
def : InstRW<[C1UWrite_2c_1B_1I], (instrs BL, BLR)>;
// Arithmetic and logical operations
// -----------------------------------------------------------------------------
// ALU, basic
def : SchedAlias<WriteI, C1UWrite_1c_1I>;
// ALU, basic, flagset
def : InstRW<[C1UWrite_1c_1I_1Flg],
(instregex "^(ADC|SBC)S[WX]r$",
"^ANDS[WX]ri$",
"^(AND|BIC)S[WX]rr$")>;
// ALU, extend and shift
def : SchedAlias<WriteIEReg, C1UWrite_1or2c_1I>;
// ALU, extend and shift, flagset
def : InstRW<[C1UWrite_1or2c_1I_1Flg],
(instregex "^(ADD|SUB)S[WX]r[irx]$",
"^(ADD|SUB)SXrx64$")>;
def : InstRW<[C1UWrite_2c_1I_1Flg],
(instregex "^(ADD|SUB)S[WX]rs$")>;
// Arithmetic, LSL shift, shift <= 4
// Arithmetic, flagset, LSL shift, shift <= 4
// Arithmetic, LSR/ASR/ROR shift or LSL shift > 4
def : SchedAlias<WriteISReg, C1UWrite_ArithI>;
// Arithmetic, immediate to logical address tag
def : InstRW<[C1UWrite_2c_1I], (instrs ADDG, SUBG)>;
// Conditional compare
def : InstRW<[C1UWrite_1c_1I_1Flg], (instregex "^CCM[NP][WX][ir]")>;
// Conditional select
def : InstRW<[C1UWrite_1c_1I],
(instregex "(CSEL|CSINC|CSINV|CSNEG)(X|W)[ir]")>;
// Convert floating-point condition flags
// Flag manipulation instructions
def : InstRW<[C1UWrite_1c_8I],
(instrs AXFLAG, XAFLAG, SETF8, SETF16, RMIF, CFINV)>;
// Insert Random Tags
def : InstRW<[C1UWrite_2c_1M], (instrs IRG, IRGstack)>;
// Insert Tag Mask
// Subtract Pointer
def : InstRW<[C1UWrite_1c_1I], (instrs GMI, SUBP)>;
// Subtract Pointer, flagset
def : InstRW<[C1UWrite_1c_1I_1Flg], (instrs SUBPS)>;
// Logical, shift, no flagset
def : InstRW<[C1UWrite_1c_1I],
(instregex "^(AND|BIC|EON|EOR|ORN)[WX]rs",
"^ORR[WX]rs$")>;
// Logical, shift, flagset
def : InstRW<[C1UWrite_1c_1I_1Flg], (instregex "^(AND|BIC)S[WX]rs$")>;
// Move and shift instructions
// -----------------------------------------------------------------------------
def : SchedAlias<WriteImm, C1UWrite_1c_1I>;
// Divide and multiply instructions
// -----------------------------------------------------------------------------
// SDIV, UDIV
def : SchedAlias<WriteID32, C1UWrite_12c_1M0>;
def : SchedAlias<WriteID64, C1UWrite_20c_1M0>;
def : SchedAlias<WriteIM32, C1UWrite_2c_1I4>;
def : SchedAlias<WriteIM64, C1UWrite_2c_1I4>;
// Multiply accumulate, W-form
// Multiply accumulate, X-form
def : InstRW<[C1UWrite_MAOrMul, ReadIM, ReadIM, C1URd_MA],
(instregex "^M(ADD|SUB)[WX]rrr$")>;
// Multiply accumulate long
def : InstRW<[C1UWrite_MAOrMul, ReadIM, ReadIM, C1URd_MA],
(instregex "^(S|U)M(ADD|SUB)Lrrr$")>;
// Multiply high
def : InstRW<[C1UWrite_2c_1I4], (instrs SMULHrr, UMULHrr)>;
// Pointer Authentication Instructions (v8.3 PAC)
// -----------------------------------------------------------------------------
// Authenticate data address
// Authenticate instruction address
// Compute pointer authentication code for data address
// Compute pointer authentication code, using generic key
// Compute pointer authentication code for instruction address
def : InstRW<[C1UWrite_4c_1M0], (instregex "^AUT", "^PAC")>;
// Branch and link, register, with pointer authentication
def : InstRW<[C1UWrite_6c_1M0_1B_1I], (instrs BLRAA, BLRAAZ, BLRAB, BLRABZ)>;
// Branch, register, with pointer authentication
// Branch, return, with pointer authentication
def : InstRW<[C1UWrite_6c_1M0_1B], (instrs BRAA, BRAAZ, BRAB, BRABZ,
RETAA, RETAB, ERETAA, ERETAB)>;
// Load register, with pointer authentication
def : InstRW<[C1UWrite_9c_1M0_1L], (instregex "^LDRA[AB](indexed|writeback)")>;
// Strip pointer authentication code
def : InstRW<[C1UWrite_2c_1M0], (instrs XPACD, XPACI, XPACLRI)>;
// Miscellaneous data-processing instructions
// -----------------------------------------------------------------------------
// Address generation
def : InstRW<[C1UWrite_1c_1I], (instrs ADR, ADRP)>;
// Bitfield extract, one reg
// Bitfield extract, two regs
def : SchedAlias<WriteExtr, C1UWrite_Extr>;
def : InstRW<[C1UWrite_Extr], (instrs EXTRWrri, EXTRXrri)>;
// Bitfield move, basic
def : SchedAlias<WriteIS, C1UWrite_1c_1I>;
// Bitfield move, insert
def : InstRW<[C1UWrite_2c_1I], (instregex "^BFM[WX]ri$")>;
// Count leading
// Move immed
// Reverse bits/bytes
// Variable shift
def : InstRW<[C1UWrite_1c_1I],
(instregex "^(CLS|CLZ)(W|X)r",
"^(MOVN|MOVK|MOVZ)(W|X)i",
"^(RBIT|REV(16|32)?)(W|X)r",
"^(ASRV|LSLV|LSRV|RORV)(W|X)r")>;
// Load instructions
// -----------------------------------------------------------------------------
def : SchedAlias<WriteLD, C1UWrite_4c_1L>;
def : SchedAlias<WriteLDIdx, C1UWrite_4c_1L_1I>;
// Load register, literal
def : InstRW<[C1UWrite_5c_1L_1I], (instrs LDRWl, LDRXl, LDRSWl, PRFMl)>;
// Load pair, signed immed offset, normal X form
// Load pair, signed immed post-index or immed pre-index, normal X form
def : InstRW<[C1UWrite_4c_2L], (instrs LDPXi, LDNPXi)>;
def : InstRW<[C1UWrite_4c_2L_1I], (instrs LDPXpre, LDPXpost)>;
// Load pair, signed immed offset, signed words
def : InstRW<[C1UWrite_5c_2L_1I, WriteLDHi], (instrs LDPSWi)>;
// Load pair, immed post-index or immed pre-index, signed words
def : InstRW<[WriteAdr, C1UWrite_5c_2L_1I, WriteLDHi],
(instregex "^LDPSW(post|pre)$")>;
// Store instructions
// -----------------------------------------------------------------------------
def : SchedAlias<WriteST, C1UWrite_1c_1SA_1D>;
def : SchedAlias<WriteSTIdx, C1UWrite_1c_1SA_1D_1I>;
def : SchedAlias<WriteSTP, C1UWrite_1c_1SA_1D>;
def : SchedAlias<WriteAdr, C1UWrite_1c_1I>;
// Tag load instructions
// -----------------------------------------------------------------------------
// Load allocation tag
// Load multiple allocation tags
def : InstRW<[C1UWrite_4c_1L], (instrs LDG, LDGM)>;
// Tag store instructions
// -----------------------------------------------------------------------------
// Store allocation tags to one or two granules, post-index
// Store allocation tags to one or two granules, pre-index
// Store allocation tag to one or two granules, zeroing, post-index
// Store Allocation Tag to one or two granules, zeroing, pre-index
// Store allocation tag and reg pair to memory, post-Index
// Store allocation tag and reg pair to memory, pre-Index
def : InstRW<[C1UWrite_1c_1SA_1D_1I], (instrs STGPreIndex, STGPostIndex,
ST2GPreIndex, ST2GPostIndex,
STZGPreIndex, STZGPostIndex,
STZ2GPreIndex, STZ2GPostIndex,
STGPpre, STGPpost)>;
// Store allocation tags to one or two granules, signed offset
// Store allocation tag to two granules, zeroing, signed offset
// Store allocation tag and reg pair to memory, signed offset
// Store multiple allocation tags
def : InstRW<[C1UWrite_1c_1SA_1D], (instrs STGi, ST2Gi, STZGi,
STZ2Gi, STGPi, STGM, STZGM)>;
// FP data processing instructions
// -----------------------------------------------------------------------------
// FP absolute value
// FP arithmetic
// FP min/max
// FP negate
// FP select
def : SchedAlias<WriteF, C1UWrite_2c_1V_1CMEVXALU>;
// FP compare
def : SchedAlias<WriteFCmp,
C1USMEStreamingSchedWrite<C1UWrite_4c_1CMEVX0ALU,
C1UWrite_2c_1V01>>;
// FP divide
def : SchedAlias<WriteFDiv, C1USMEStreamingSchedWrite<C1UWrite_10c_1CMEMC_10rc,
C1UWrite_5c_1V1>>;
// FP divide, H-form
def : InstRW<[C1USMEStreamingSchedWrite<C1UWrite_10c_1CMEMC_10rc, C1UWrite_5c_1V1>],
(instrs FDIVHrr)>;
// FP divide, S-form
def : InstRW<[C1USMEStreamingSchedWrite<C1UWrite_11c_1CMEMC_11rc, C1UWrite_8c_1V1>],
(instrs FDIVSrr)>;
// FP divide, D-form
def : InstRW<[C1USMEStreamingSchedWrite<C1UWrite_17c_1CMEMC_17rc, C1UWrite_12c_1V1>],
(instrs FDIVDrr)>;
// FP square root, H-form
def : InstRW<[C1USMEStreamingSchedWrite<C1UWrite_10c_1CMEMC_10rc, C1UWrite_5c_1V1>],
(instrs FSQRTHr)>;
// FP square root, S-form
def : InstRW<[C1USMEStreamingSchedWrite<C1UWrite_12c_1CMEMC_12rc, C1UWrite_8c_1V1>],
(instrs FSQRTSr)>;
// FP square root, D-form
def : InstRW<[C1USMEStreamingSchedWrite<C1UWrite_25c_1CMEMC_25rc, C1UWrite_12c_1V1>],
(instrs FSQRTDr)>;
// FP multiply
def : WriteRes<WriteFMul, [C1UUnitV]> { let Latency = 3; }
// FP multiply accumulate
def : InstRW<[C1UWr_FMA_CME, ReadDefault, ReadDefault, C1URd_FMA],
(instregex "^FN?M(ADD|SUB)[HSD]rrr$")>;
// FP round to integral
def : InstRW<[C1UWrite_2c_1V0134_CME], (instregex "^FRINT[AIMNPXZ][HSD]r$",
"^FRINT(32|64)[XZ][SD]r$")>;
// FP miscellaneous instructions
// -----------------------------------------------------------------------------
// FP convert, from gen to vec reg
def : InstRW<[C1UWrite_3c_1M0_CME], (instregex "^[SU]CVTF[SU][WX][HSD]ri$")>;
// FP convert, from vec to gen reg
def : InstRW<[C1UWrite_3c_1V01_1CMEVXALU],
(instregex "^FCVT[AMNPZ][SU][SU][WX][HSD]ri?$")>;
// FP convert, Javascript from vec to gen reg
def : SchedAlias<WriteFCvt, C1UWrite_3c_1V01_1CMEVXALU>;
// FP convert, from vec to vec reg
def : InstRW<[C1UWrite_3c_1V0134_CME], (instrs FCVTSHr, FCVTDHr, FCVTHSr, FCVTDSr,
FCVTHDr, FCVTSDr, FCVTXNv1i64)>;
// FP move, immed
// FP move, register
def : SchedAlias<WriteFImm, C1UWrite_2c_1V_1CMEVXALU>;
// FP transfer, from gen to low half of vec reg
def : InstRW<[C1UWrite_3c_1M0_CME],
(instrs FMOVWHr, FMOVXHr, FMOVWSr, FMOVXDr)>;
// FP transfer, from gen to high half of vec reg
def : InstRW<[C1UWrite_5c_1M0_1V_CME], (instrs FMOVXDHighr)>;
// FP transfer, from vec to gen reg
def : SchedAlias<WriteFCopy, C1UWrite_2c_1V01_CME>;
// FP load instructions
// -----------------------------------------------------------------------------
// Load vector reg, literal, S/D/Q forms
def : InstRW<[C1UWrite_7c_1L_1I_CME], (instregex "^LDR[SDQ]l$")>;
// Load vector reg, unscaled immed
def : InstRW<[C1UWrite_6c_1L_CME], (instregex "^LDUR[BHSDQ]i$")>;
// Load vector reg, immed post-index
// Load vector reg, immed pre-index
def : InstRW<[WriteAdr, C1UWrite_6c_1L_1I_CME],
(instregex "^LDR[BHSDQ](pre|post)$")>;
// Load vector reg, unsigned immed
def : InstRW<[C1UWrite_6c_1L_CME], (instregex "^LDR[BHSDQ]ui$")>;
// Load vector reg, register offset, basic
// Load vector reg, register offset, scale, S/D-form
// Load vector reg, register offset, scale, H/Q-form
// Load vector reg, register offset, extend
// Load vector reg, register offset, extend, scale, S/D-form
// Load vector reg, register offset, extend, scale, H/Q-form
def : InstRW<[C1UWrite_LdrQ_CME, ReadAdrBase], (instregex "^LDR[BHSDQ]ro[WX]$")>;
// Load vector pair, immed offset, S/D-form
// Load vector pair, immed offset, Q-form
def : InstRW<[C1UWrite_6c_1L_CME, WriteLDHi], (instregex "^LDN?P[SDQ]i$")>;
// Load vector pair, immed post-index, S/D-form
// Load vector pair, immed pre-index, S/D-form
def : InstRW<[WriteAdr, C1UWrite_6c_1L_1I_CME, WriteLDHi],
(instregex "^LDP[SD](pre|post)$")>;
// Load vector pair, immed post-index, Q-form
// Load vector pair, immed pre-index, Q-form
def : InstRW<[WriteAdr, C1UWrite_6c_2L_1I_CME, WriteLDHi],
(instregex "^LDPQ(pre|post)$")>;
// FP store instructions
// -----------------------------------------------------------------------------
// Store vector reg, unscaled immed, B/H/S/D-form
// Store vector reg, unscaled immed, Q-form
def : InstRW<[C1UWrite_2c_1SA_1V01_CME], (instregex "^STUR[BHSDQ]i$")>;
// Store vector reg, immed post-index, B/H/S/D-form
// Store vector reg, immed post-index, Q-form
// Store vector reg, immed pre-index, B/H/S/D-form
// Store vector reg, immed pre-index, Q-form
def : InstRW<[WriteAdr, C1UWrite_2c_1SA_1V01_1I_CME],
(instregex "^STR[BHSDQ](pre|post)$")>;
// Store vector reg, unsigned immed, B/H/S/D-form
// Store vector reg, unsigned immed, Q-form
def : InstRW<[C1UWrite_2c_1SA_1V01_CME], (instregex "^STR[BHSDQ]ui$")>;
// Store vector reg, register offset, basic, B/H/S/D-form
// Store vector reg, register offset, basic, Q-form
// Store vector reg, register offset, scale, H-form
// Store vector reg, register offset, scale, S/D-form
// Store vector reg, register offset, scale, Q-form
// Store vector reg, register offset, extend, B/H/S/D-form
// Store vector reg, register offset, extend, Q-form
// Store vector reg, register offset, extend, scale, H-form
// Store vector reg, register offset, extend, scale, S/D-form
// Store vector reg, register offset, extend, scale, Q-form
def : InstRW<[C1UWrite_StrQ_CME, ReadAdrBase],
(instregex "^STR[BHSDQ]ro[WX]$")>;
// Store vector pair, immed offset, S-form
// Store vector pair, immed offset, D-form
def : InstRW<[C1UWrite_2c_1SA_1V01_CME], (instregex "^STN?P[SD]i$")>;
// Store vector pair, immed offset, Q-form
def : InstRW<[C1UWrite_2c_2SA_2V01_CME], (instregex "^STN?PQi$")>;
// Store vector pair, immed post-index, S-form
// Store vector pair, immed post-index, D-form
// Store vector pair, immed pre-index, S-form
// Store vector pair, immed pre-index, D-form
def : InstRW<[WriteAdr, C1UWrite_2c_1SA_1V01_1I_CME],
(instregex "^STP[SD](pre|post)$")>;
// Store vector pair, immed post-index, Q-form
// Store vector pair, immed pre-index, Q-form
def : InstRW<[C1UWrite_2c_2SA_2V01_CME], (instregex "^STPQ(post|pre)")>;
// ASIMD integer instructions
// -----------------------------------------------------------------------------
// ASIMD absolute diff
// ASIMD absolute diff long
// ASIMD arith, basic
// ASIMD arith, complex
// ASIMD arith, pair-wise
// ASIMD compare
// ASIMD logical
def : SchedAlias<WriteVd, C1UWrite_2c_1V>;
def : SchedAlias<WriteVq, C1UWrite_2c_1V>;
// ASIMD absolute diff accum
// ASIMD absolute diff accum long
def : InstRW<[C1UWr_VA_CME, C1URd_VA, C1URd_VA], (instregex "^[SU]ABAL?v")>;
// ASIMD arith, reduce, 4H/4S
def : InstRW<[C1UWrite_2c_1V0134_CME], (instregex "^(ADDV|[SU]ADDLV)v4(i16|i32)v$")>;
// ASIMD arith, reduce, 8B/8H
def : InstRW<[C1UWrite_4c_1V0134_CME],
(instregex "^(ADDV|[SU]ADDLV)v8(i8|i16)v$")>;
// ASIMD arith, reduce, 16B
def : InstRW<[C1UWrite_4c_2V0134_CME], (instregex "^(ADDV|[SU]ADDLV)v16i8v$")>;
// ASIMD dot product
// ASIMD dot product using signed and unsigned integers
def : InstRW<[C1UWr_VDOT_CME, C1URd_VDOT],
(instregex "^([SU]|SU|US)DOT(lane)?(v8|v16)i8$")>;
// ASIMD matrix multiply-accumulate
def : InstRW<[C1UWr_VMMA_CME, C1URd_VMMA], (instrs SMMLA, UMMLA, USMMLA)>;
// ASIMD max/min, basic and pair-wise
def : InstRW<[C1UWrite_2c_1V_CME], (instregex "^[SU](MAX|MIN)P?(v16|v8)i8")>;
// ASIMD max/min, reduce, 4H/4S
def : InstRW<[C1UWrite_2c_1V0134_CME], (instregex "^[SU](MAX|MIN)Vv4i16v$",
"^[SU](MAX|MIN)Vv4i32v$")>;
// ASIMD max/min, reduce, 8B/8H
def : InstRW<[C1UWrite_4c_1V0134_1V_CME], (instregex "^[SU](MAX|MIN)Vv8i8v$",
"^[SU](MAX|MIN)Vv8i16v$")>;
// ASIMD max/min, reduce, 16B
def : InstRW<[C1UWrite_4c_2V0134_CME], (instregex "[SU](MAX|MIN)Vv16i8v")>;
// ASIMD multiply
def : InstRW<[C1UWrite_4c_1V0134_CME], (instregex "^MULv", "^SQ(R)?DMULHv")>;
// ASIMD multiply accumulate
// ASIMD multiply accumulate long
def : InstRW<[C1UWr_VMA_CME, C1URd_VMA, C1URd_VMA], (instregex "^MLAv", "^MLSv",
"^[SU]MLALv", "^[SU]MLSLv")>;
// ASIMD multiply accumulate high
def : InstRW<[C1UWr_VMAH_CME, C1URd_VMAH, C1URd_VMAH], (instregex "^SQRDMLAHv", "^SQRDMLSHv")>;
// ASIMD multiply accumulate saturating long
def : InstRW<[C1UWrite_4c_1V0134_CME], (instregex "^SQDML[AS]L[iv]")>;
// ASIMD multiply/multiply long (8x8) polynomial, D-form
// ASIMD multiply/multiply long (8x8) polynomial, Q-form
def : InstRW<[C1UWrite_2c_1V0134_CME], (instregex "^PMULL?(v8i8|v16i8)$")>;
// ASIMD multiply long
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^[SU]MULLv", "^SQDMULL[iv]")>;
// ASIMD pairwise add and accumulate long
def : InstRW<[C1UWr_VPA_CME, C1URd_VPA, C1URd_VPA], (instregex "^[SU]ADALPv")>;
// ASIMD shift accumulate
def : InstRW<[C1UWr_VSA_CME, C1URd_VSA], (instregex "^[SU]SRA[dv]", "^[SU]RSRA[dv]")>;
// ASIMD shift by immed, basic
def : InstRW<[C1UWrite_2c_1V_CME], (instregex "^SHL[dv]", "^SHLLv", "^SHRNv",
"^SSHLLv", "^SSHR[dv]", "^USHLLv",
"^USHR[dv]")>;
// ASIMD shift by immed and insert, basic
def : InstRW<[C1UWrite_2c_1V_CME], (instregex "^SLI[dv]", "^SRI[dv]")>;
// ASIMD shift by immed, complex
// ASIMD shift by register, complex
def : InstRW<[C1UWrite_4c_1V_CME],
(instregex "^RSHRNv", "^SQRSHRU?N[bhsv]", "^(SQSHLU?|UQSHL)[bhsd]$",
"^(SQSHLU?|UQSHL)(v8i8|v16i8|v4i16|v8i16|v2i32|v4i32|v2i64)_shift$",
"^SQSHRU?N[bhsv]", "^SRSHR[dv]", "^UQRSHRN[bhsv]",
"^UQSHRN[bhsv]", "^URSHR[dv]",
"^[SU]RSHLv", "^[SU]QRSHLv",
"^[SU]QSHL(v1i8|v1i16|v1i32|v1i64|v8i8|v16i8|v4i16|v8i16|v2i32|v4i32|v2i64)$")>;
// ASIMD shift by register, basic
def : InstRW<[C1UWrite_2c_1V_CME], (instregex "^[SU]SHLv")>;
// ASIMD floating-point instructions
// -----------------------------------------------------------------------------
// ASIMD FP absolute value/difference
// ASIMD FP arith, normal
// ASIMD FP compare
// ASIMD FP max/min, normal
// ASIMD FP negate
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU],
(instregex "^FABSv", "^FADDv", "^FSUBv", "^FNEGv",
"^FMAXv", "^FMAXNMv", "^FMINv", "^FMINNMv")>;
// ASIMD FP complex add
// ASIMD FP max/min, pairwise
def : InstRW<[C1UWrite_3c_1V_1CMEVXMUL], (instregex "^FCADDv")>;
def : InstRW<[C1UWrite_3c_1V_1CMEVXALU],
(instregex "^(FMAXP|FMAXNMP|FMINP|FMINNMP)v")>;
// ASIMD FP complex multiply add
def : InstRW<[C1UWr_VFCMA_CME, C1URd_VFCMA, C1URd_VFCMA], (instregex "^FCMLAv")>;
// ASIMD FP convert, long (F16 to F32)
// ASIMD FP convert, long (F32 to F64)
// ASIMD FP convert, narrow (F32 to F16)
// ASIMD FP convert, narrow (F64 to F32)
// ASIMD FP convert, other, D-form F32 and Q-form F64
// ASIMD FP convert, other, D-form F16 and Q-form F32
// ASIMD FP convert, other, Q-form F16
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^FCVTL(v4|v8)(i16|i32)",
"^FCVTLv2i32",
"^FCVTN(v4|v8)i16",
"^FCVTN(v2|v4)i32",
"^FCVTXN(v2|v4)f32",
"^FCVT[AMNPZ][SU]v2f(32|64)$",
"^FCVT[AMNPZ][SU]v2i(32|64)_shift$",
"^FCVT[AMNPZ][SU]v1i64$",
"^FCVTZ[SU]d$",
"^[SU]CVTFv2f(32|64)$",
"^[SU]CVTFv2i(32|64)_shift$",
"^[SU]CVTFv1i64$",
"^[SU]CVTFd$",
"^FCVT[AMNPZ][SU]v4f(16|32)$",
"^FCVT[AMNPZ][SU]v4i(16|32)_shift$",
"^FCVT[AMNPZ][SU]v1i32$",
"^FCVTZ[SU]s$",
"^[SU]CVTFv4f(16|32)$",
"^[SU]CVTFv4i(16|32)_shift$",
"^[SU]CVTFv1i32$",
"^[SU]CVTFs$",
"^FCVT[AMNPZ][SU]v8f16$",
"^FCVT[AMNPZ][SU]v8i16_shift$",
"^FCVT[AMNPZ][SU]v1f16$",
"^FCVTZ[SU]h$",
"^[SU]CVTFv8f16$",
"^[SU]CVTFv8i16_shift$",
"^[SU]CVTFv1i16$",
"^[SU]CVTFh$")>;
// ASIMD FP divide, D-form, F16
def : InstRW<[C1UWrite_8c_1V1_4rc_1CME], (instrs FDIVv4f16)>;
// ASIMD FP divide, D-form, F32
def : InstRW<[C1UWrite_9c_1V1_2rc_1CME], (instrs FDIVv2f32)>;
// ASIMD FP divide, Q-form, F16
def : InstRW<[C1UWrite_12c_1V1_8rc_1CME], (instrs FDIVv8f16)>;
// ASIMD FP divide, Q-form, F32
def : InstRW<[C1UWrite_11c_1V1_4rc_1CME], (instrs FDIVv4f32)>;
// ASIMD FP divide, Q-form, F64
def : InstRW<[C1UWrite_13c_1V1_2rc_1CME], (instrs FDIVv2f64)>;
// ASIMD FP max/min, reduce, F32 and D-form F16
def : InstRW<[C1UWrite_4c_2V_CME], (instregex "^(FMAX|FMIN)(NM)?Vv4(i16|i32)v$")>;
// ASIMD FP max/min, reduce, Q-form F16
def : InstRW<[C1UWrite_6c_3V_CME], (instregex "^(FMAX|FMIN)(NM)?Vv8i16v$")>;
// ASIMD FP multiply
def : InstRW<[C1UWrite_3c_1V_1CMEVXMUL], (instregex "^FMULv", "^FMULXv")>;
def : InstRW<[C1UWrite_3c_1V_1CMEVXMUL], (instrs FMULX16, FMULX32, FMULX64)>;
// ASIMD FP multiply accumulate
// ASIMD FP multiply accumulate long
def : InstRW<[C1UWr_VFMA_CME, C1URd_VFMA, C1URd_VFMA], (instregex "^FMLAv", "^FMLSv",
"^FML[AS]L2?(lane)?v")>;
// ASIMD FP round, D-form F32 and Q-form F64
def : InstRW<[C1UWrite_3c_1V0134_CME],
(instregex "^FRINT[AIMNPXZ]v2f(32|64)$",
"^FRINT(32|64)[XZ]v2f(32|64)$")>;
// ASIMD FP round, D-form F16 and Q-form F32
def : InstRW<[C1UWrite_3c_1V0134_CME],
(instregex "^FRINT[AIMNPXZ]v4f(16|32)$",
"^FRINT(32|64)[XZ]v4f32$")>;
// ASIMD FP round, Q-form F16
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^FRINT[AIMNPXZ]v8f16$")>;
// ASIMD FP square root, D-form, F16
def : InstRW<[C1UWrite_8c_1V1_4rc_1CME], (instrs FSQRTv4f16)>;
// ASIMD FP square root, D-form, F32
def : InstRW<[C1UWrite_9c_1V1_2rc_1CME], (instrs FSQRTv2f32)>;
// ASIMD FP square root, Q-form, F16
def : InstRW<[C1UWrite_12c_1V1_8rc_1CME], (instrs FSQRTv8f16)>;
// ASIMD FP square root, Q-form, F32
def : InstRW<[C1UWrite_11c_1V1_4rc_1CME], (instrs FSQRTv4f32)>;
// ASIMD FP square root, Q-form, F64
def : InstRW<[C1UWrite_13c_1V1_2rc_1CME], (instrs FSQRTv2f64)>;
// ASIMD BFloat16 (BF16) instructions
// -----------------------------------------------------------------------------
// ASIMD convert, F32 to BF16
// Scalar convert, F32 to BF16
def : InstRW<[C1UWrite_3c_1V0134_CME], (instrs BFCVTN, BFCVTN2, BFCVT)>;
// ASIMD dot product
def : InstRW<[C1UWr_VBFDOT_CME, C1URd_VBFDOT, C1URd_VBFDOT],
(instregex "^BFDOTv[48]bf16$",
"^BF16DOTlanev[48]bf16$")>;
// ASIMD matrix multiply accumulate
def : InstRW<[C1UWr_VBFMMA_CME, C1URd_VBFMMA, C1URd_VBFMMA], (instrs BFMMLA)>;
// ASIMD multiply accumulate long
def : InstRW<[C1UWr_VBFMAL_CME, C1URd_VBFMAL, C1URd_VBFMAL], (instrs BFMLALB, BFMLALBIdx, BFMLALT,
BFMLALTIdx)>;
// ASIMD miscellaneous instructions
// -----------------------------------------------------------------------------
// ASIMD bit reverse
// ASIMD bitwise insert
// ASIMD count
// ASIMD duplicate, element
// ASIMD extract
// ASIMD extract narrow
// ASIMD insert, element to element
// ASIMD move, FP immed
// ASIMD move, integer immed
// ASIMD reverse
// ASIMD table lookup extension, 1 table reg
// ASIMD transpose
// ASIMD unzip/zip
// Handled by SchedAlias<WriteV[dq], ...>
// ASIMD duplicate, gen reg
def : InstRW<[C1UWrite_3c_1M0], (instregex "^DUPv.+gpr")>;
// ASIMD extract narrow, saturating
def : InstRW<[C1UWrite_4c_1V], (instregex "^[SU]QXTNv", "^SQXTUNv")>;
// ASIMD reciprocal and square root estimate, D-form U32
def : InstRW<[C1UWrite_4c_2V0134], (instrs URECPEv2i32, URSQRTEv2i32)>;
// ASIMD reciprocal and square root estimate, Q-form U32
def : InstRW<[C1UWrite_4c_2V0134], (instrs URECPEv4i32, URSQRTEv4i32)>;
// ASIMD reciprocal and square root estimate, D-form F32 and scalar forms
def : InstRW<[C1UWrite_3c_1V0134], (instrs FRECPEv1f16, FRECPEv1i32,
FRECPEv1i64, FRECPEv2f32, FRECPEv2f64,
FRSQRTEv1f16, FRSQRTEv1i32,
FRSQRTEv1i64, FRSQRTEv2f32, FRSQRTEv2f64)>;
// ASIMD reciprocal and square root estimate, D-form F16 and Q-form F32
def : InstRW<[C1UWrite_4c_2V0134], (instrs FRECPEv4f16, FRECPEv4f32,
FRSQRTEv4f16, FRSQRTEv4f32)>;
// ASIMD reciprocal and square root estimate, Q-form F16
def : InstRW<[C1UWrite_6c_4V0134], (instrs FRECPEv8f16, FRSQRTEv8f16)>;
// ASIMD reciprocal exponent
def : InstRW<[C1UWrite_3c_1V0134], (instregex "^FRECPXv")>;
// ASIMD reciprocal step
def : InstRW<[C1UWrite_4c_1V], (instregex "^FRECPS(16|32|64|v)",
"^FRSQRTS(16|32|64|v)")>;
// ASIMD table lookup, 1 or 2 table regs
def : InstRW<[C1UWrite_2c_1V], (instrs TBLv8i8One, TBLv16i8One,
TBLv8i8Two, TBLv16i8Two)>;
// ASIMD table lookup, 3 table regs
def : InstRW<[C1UWrite_4c_2V], (instrs TBLv8i8Three, TBLv16i8Three)>;
// ASIMD table lookup, 4 table regs
def : InstRW<[C1UWrite_4c_3V], (instrs TBLv8i8Four, TBLv16i8Four)>;
// ASIMD table lookup extension, 2 table reg
def : InstRW<[C1UWrite_4c_2V], (instrs TBXv8i8Two, TBXv16i8Two)>;
// ASIMD table lookup extension, 3 table reg
def : InstRW<[C1UWrite_6c_3V], (instrs TBXv8i8Three, TBXv16i8Three)>;
// ASIMD table lookup extension, 4 table reg
def : InstRW<[C1UWrite_6c_5V], (instrs TBXv8i8Four, TBXv16i8Four)>;
// ASIMD transfer, element to gen reg
def : InstRW<[C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1CMEPERMS_1rc,
C1UWrite_2c_3V>],
(instregex "^SMOVv")>;
def : InstRW<[C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1CMEPERMS_1rc,
C1UWrite_2c_3V>],
(instregex "^UMOVvi(8|16)(_idx0)?$")>;
def : InstRW<[C1USMEStreamingSchedWrite<C1UWrite_8c_1CMEVXALU_1CMEPERMS_1rc,
C1UWrite_2c_1V>],
(instregex "^UMOVvi(32|64)$")>;
// ASIMD transfer, gen reg to element
def : InstRW<[C1UWrite_2c_1V], (instregex "^INSvi(8|16|32|64)gpr$")>;
// ASIMD load instructions
// -----------------------------------------------------------------------------
// ASIMD load, 1 element, multiple, 1 reg, D-form
def : InstRW<[C1UWrite_6c_1L], (instregex "^LD1Onev(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_1L],
(instregex "^LD1Onev(8b|4h|2s|1d)_POST$")>;
// ASIMD load, 1 element, multiple, 1 reg, Q-form
def : InstRW<[C1UWrite_6c_1L], (instregex "^LD1Onev(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_1L],
(instregex "^LD1Onev(16b|8h|4s|2d)_POST$")>;
// ASIMD load, 1 element, multiple, 2 reg, D-form
def : InstRW<[C1UWrite_6c_2L], (instregex "^LD1Twov(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_2L],
(instregex "^LD1Twov(8b|4h|2s|1d)_POST$")>;
// ASIMD load, 1 element, multiple, 2 reg, Q-form
def : InstRW<[C1UWrite_6c_2L], (instregex "^LD1Twov(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_2L],
(instregex "^LD1Twov(16b|8h|4s|2d)_POST$")>;
// ASIMD load, 1 element, multiple, 3 reg, D-form
def : InstRW<[C1UWrite_6c_3L], (instregex "^LD1Threev(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_3L],
(instregex "^LD1Threev(8b|4h|2s|1d)_POST$")>;
// ASIMD load, 1 element, multiple, 3 reg, Q-form
def : InstRW<[C1UWrite_6c_3L], (instregex "^LD1Threev(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_3L],
(instregex "^LD1Threev(16b|8h|4s|2d)_POST$")>;
// ASIMD load, 1 element, multiple, 4 reg, D-form
def : InstRW<[C1UWrite_6c_4L], (instregex "^LD1Fourv(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_7c_4L],
(instregex "^LD1Fourv(8b|4h|2s|1d)_POST$")>;
// ASIMD load, 1 element, multiple, 4 reg, Q-form
def : InstRW<[C1UWrite_6c_4L], (instregex "^LD1Fourv(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_7c_4L],
(instregex "^LD1Fourv(16b|8h|4s|2d)_POST$")>;
// ASIMD load, 1 element, one lane, B/H/S
// ASIMD load, 1 element, one lane, D
def : InstRW<[C1UWrite_6c_1L_1V], (instregex "LD1i(8|16|32|64)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_1L_1V], (instregex "LD1i(8|16|32|64)_POST$")>;
// ASIMD load, 1 element, all lanes, D-form, B/H/S
// ASIMD load, 1 element, all lanes, D-form, D
def : InstRW<[C1UWrite_6c_1L_1V], (instregex "LD1Rv(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_1L_1V], (instregex "LD1Rv(8b|4h|2s|1d)_POST$")>;
// ASIMD load, 1 element, all lanes, Q-form
def : InstRW<[C1UWrite_6c_1L_1V], (instregex "LD1Rv(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_1L_1V], (instregex "LD1Rv(16b|8h|4s|2d)_POST$")>;
// ASIMD load, 2 element, multiple, D-form, B/H/S
def : InstRW<[C1UWrite_8c_1L_2V], (instregex "LD2Twov(8b|4h|2s)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_1L_2V], (instregex "LD2Twov(8b|4h|2s)_POST$")>;
// ASIMD load, 2 element, multiple, Q-form, B/H/S
// ASIMD load, 2 element, multiple, Q-form, D
def : InstRW<[C1UWrite_8c_2L_2V], (instregex "LD2Twov(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_2L_2V], (instregex "LD2Twov(16b|8h|4s|2d)_POST$")>;
// ASIMD load, 2 element, one lane, B/H
// ASIMD load, 2 element, one lane, S
// ASIMD load, 2 element, one lane, D
def : InstRW<[C1UWrite_8c_1L_2V], (instregex "LD2i(8|16|32|64)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_1L_2V], (instregex "LD2i(8|16|32|64)_POST$")>;
// ASIMD load, 2 element, all lanes, D-form, B/H/S
// ASIMD load, 2 element, all lanes, D-form, D
def : InstRW<[C1UWrite_8c_1L_2V], (instregex "LD2Rv(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_1L_2V], (instregex "LD2Rv(8b|4h|2s|1d)_POST$")>;
// ASIMD load, 2 element, all lanes, Q-form
def : InstRW<[C1UWrite_8c_1L_2V], (instregex "LD2Rv(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_1L_2V], (instregex "LD2Rv(16b|8h|4s|2d)_POST$")>;
// ASIMD load, 3 element, multiple, D-form, B/H/S
def : InstRW<[C1UWrite_9c_2L_3V], (instregex "LD3Threev(8b|4h|2s)$")>;
def : InstRW<[WriteAdr, C1UWrite_9c_2L_3V], (instregex "LD3Threev(8b|4h|2s)_POST$")>;
// ASIMD load, 3 element, multiple, Q-form, B/H/S
// ASIMD load, 3 element, multiple, Q-form, D
def : InstRW<[C1UWrite_9c_3L_3V], (instregex "LD3Threev(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_9c_3L_3V], (instregex "LD3Threev(16b|8h|4s|2d)_POST$")>;
// ASIMD load, 3 element, one lane, B/H
// ASIMD load, 3 element, one lane, S
// ASIMD load, 3 element, one lane, D
def : InstRW<[C1UWrite_9c_2L_3V], (instregex "LD3i(8|16|32|64)$")>;
def : InstRW<[WriteAdr, C1UWrite_9c_2L_3V], (instregex "LD3i(8|16|32|64)_POST$")>;
// ASIMD load, 3 element, all lanes, D-form, B/H/S
// ASIMD load, 3 element, all lanes, D-form, D
def : InstRW<[C1UWrite_8c_2L_3V], (instregex "LD3Rv(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_2L_3V], (instregex "LD3Rv(8b|4h|2s|1d)_POST$")>;
// ASIMD load, 3 element, all lanes, Q-form, B/H/S
// ASIMD load, 3 element, all lanes, Q-form, D
def : InstRW<[C1UWrite_8c_2L_3V], (instregex "LD3Rv(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_2L_3V], (instregex "LD3Rv(16b|8h|4s|2d)_POST$")>;
// ASIMD load, 4 element, multiple, D-form, B/H/S
def : InstRW<[C1UWrite_8c_2L_4V], (instregex "LD4Fourv(8b|4h|2s)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_2L_4V], (instregex "LD4Fourv(8b|4h|2s)_POST$")>;
// ASIMD load, 4 element, multiple, Q-form, B/H/S
// ASIMD load, 4 element, multiple, Q-form, D
def : InstRW<[C1UWrite_9c_4L_8V], (instregex "LD4Fourv(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_9c_4L_8V], (instregex "LD4Fourv(16b|8h|4s|2d)_POST$")>;
// ASIMD load, 4 element, one lane, B/H
// ASIMD load, 4 element, one lane, S
// ASIMD load, 4 element, one lane, D
def : InstRW<[C1UWrite_8c_2L_4V], (instregex "LD4i(8|16|32|64)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_2L_4V], (instregex "LD4i(8|16|32|64)_POST$")>;
// ASIMD load, 4 element, all lanes, D-form, B/H/S
// ASIMD load, 4 element, all lanes, D-form, D
def : InstRW<[C1UWrite_8c_2L_4V], (instregex "LD4Rv(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_2L_4V], (instregex "LD4Rv(8b|4h|2s|1d)_POST$")>;
// ASIMD load, 4 element, all lanes, Q-form, B/H/S
// ASIMD load, 4 element, all lanes, Q-form, D
def : InstRW<[C1UWrite_8c_2L_4V], (instregex "LD4Rv(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_8c_2L_4V], (instregex "LD4Rv(16b|8h|4s|2d)_POST$")>;
// ASIMD store instructions
// -----------------------------------------------------------------------------
// ASIMD store, 1 element, multiple, 1 reg, D-form
def : InstRW<[C1UWrite_2c_1SA_1V01], (instregex "ST1Onev(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_2c_1SA_1V01], (instregex "ST1Onev(8b|4h|2s|1d)_POST$")>;
// ASIMD store, 1 element, multiple, 1 reg, Q-form
def : InstRW<[C1UWrite_2c_1SA_1V01], (instregex "ST1Onev(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_2c_1SA_1V01], (instregex "ST1Onev(16b|8h|4s|2d)_POST$")>;
// ASIMD store, 1 element, multiple, 2 reg, D-form
def : InstRW<[C1UWrite_2c_1SA_1V01], (instregex "ST1Twov(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_2c_1SA_1V01], (instregex "ST1Twov(8b|4h|2s|1d)_POST$")>;
// ASIMD store, 1 element, multiple, 2 reg, Q-form
def : InstRW<[C1UWrite_2c_2SA_2V01], (instregex "ST1Twov(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_2c_2SA_2V01], (instregex "ST1Twov(16b|8h|4s|2d)_POST$")>;
// ASIMD store, 1 element, multiple, 3 reg, D-form
def : InstRW<[C1UWrite_2c_2SA_2V01], (instregex "ST1Threev(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_2c_2SA_2V01], (instregex "ST1Threev(8b|4h|2s|1d)_POST$")>;
// ASIMD store, 1 element, multiple, 3 reg, Q-form
def : InstRW<[C1UWrite_2c_3SA_3V01], (instregex "ST1Threev(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_2c_3SA_3V01], (instregex "ST1Threev(16b|8h|4s|2d)_POST$")>;
// ASIMD store, 1 element, multiple, 4 reg, D-form
def : InstRW<[C1UWrite_2c_2SA_2V01], (instregex "ST1Fourv(8b|4h|2s|1d)$")>;
def : InstRW<[WriteAdr, C1UWrite_2c_2SA_2V01], (instregex "ST1Fourv(8b|4h|2s|1d)_POST$")>;
// ASIMD store, 1 element, multiple, 4 reg, Q-form
def : InstRW<[C1UWrite_2c_4SA_4V01], (instregex "ST1Fourv(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_2c_4SA_4V01], (instregex "ST1Fourv(16b|8h|4s|2d)_POST$")>;
// ASIMD store, 1 element, one lane, B/H/S
// ASIMD store, 1 element, one lane, D
def : InstRW<[C1UWrite_4c_1SA_1V01_1V], (instregex "ST1i(8|16|32|64)$")>;
def : InstRW<[WriteAdr, C1UWrite_4c_1SA_1V01_1V], (instregex "ST1i(8|16|32|64)_POST$")>;
// ASIMD store, 2 element, multiple, D-form, B/H/S
def : InstRW<[C1UWrite_4c_2SA_2V01_2V], (instregex "ST2Twov(8b|4h|2s)$")>;
def : InstRW<[WriteAdr, C1UWrite_4c_2SA_2V01_2V], (instregex "ST2Twov(8b|4h|2s)_POST$")>;
// ASIMD store, 2 element, multiple, Q-form, B/H/S
// ASIMD store, 2 element, multiple, Q-form, D
def : InstRW<[C1UWrite_4c_2SA_2V01_2V], (instregex "ST2Twov(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_4c_2SA_2V01_2V], (instregex "ST2Twov(16b|8h|4s|2d)_POST$")>;
// ASIMD store, 2 element, one lane, B/H/S
// ASIMD store, 2 element, one lane, D
def : InstRW<[C1UWrite_4c_1SA_1V01_1V], (instregex "ST2i(8|16|32|64)$")>;
def : InstRW<[WriteAdr, C1UWrite_4c_1SA_1V01_1V], (instregex "ST2i(8|16|32|64)_POST$")>;
// ASIMD store, 3 element, multiple, D-form, B/H/S
def : InstRW<[C1UWrite_4c_2SA_2V01_2V], (instregex "ST3Threev(8b|4h|2s)$")>;
def : InstRW<[WriteAdr, C1UWrite_4c_2SA_2V01_2V], (instregex "ST3Threev(8b|4h|2s)_POST$")>;
// ASIMD store, 3 element, multiple, Q-form, B/H/S
// ASIMD store, 3 element, multiple, Q-form, D
def : InstRW<[C1UWrite_5c_4SA_4V01_4V], (instregex "ST3Threev(16b|8h|4s|2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_5c_4SA_4V01_4V], (instregex "ST3Threev(16b|8h|4s|2d)_POST$")>;
// ASIMD store, 3 element, one lane, B/H
// ASIMD store, 3 element, one lane, S
// ASIMD store, 3 element, one lane, D
def : InstRW<[C1UWrite_4c_2SA_2V01_2V], (instregex "ST3i(8|16|32|64)$")>;
def : InstRW<[WriteAdr, C1UWrite_4c_2SA_2V01_2V], (instregex "ST3i(8|16|32|64)_POST$")>;
// ASIMD store, 4 element, multiple, D-form, B/H/S
def : InstRW<[C1UWrite_6c_6SA_6V01_6V], (instregex "ST4Fourv(8b|4h|2s)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_6SA_6V01_6V], (instregex "ST4Fourv(8b|4h|2s)_POST$")>;
// ASIMD store, 4 element, multiple, Q-form, B/H/S
def : InstRW<[C1UWrite_7c_12SA_12V01_12V], (instregex "ST4Fourv(16b|8h|4s)$")>;
def : InstRW<[WriteAdr, C1UWrite_7c_12SA_12V01_12V], (instregex "ST4Fourv(16b|8h|4s)_POST$")>;
// ASIMD store, 4 element, multiple, Q-form, D
def : InstRW<[C1UWrite_6c_8SA_8V01_8V], (instregex "ST4Fourv(2d)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_8SA_8V01_8V], (instregex "ST4Fourv(2d)_POST$")>;
// ASIMD store, 4 element, one lane, B/H/S
def : InstRW<[C1UWrite_6c_1SA_1V01_1V], (instregex "ST4i(8|16|32)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_1SA_1V01_1V], (instregex "ST4i(8|16|32)_POST$")>;
// ASIMD store, 4 element, one lane, D
def : InstRW<[C1UWrite_6c_1SA_1V01_1V], (instregex "ST4i(64)$")>;
def : InstRW<[WriteAdr, C1UWrite_6c_1SA_1V01_1V], (instregex "ST4i(64)_POST$")>;
// Cryptography extensions
// -----------------------------------------------------------------------------
// Crypto AES ops
def : InstRW<[C1UWrite_2c_1V0134], (instregex "^AES[DE]rr$", "^AESI?MCrr")>;
// Crypto polynomial (64x64) multiply long
def : InstRW<[C1UWrite_2c_1V0134], (instrs PMULLv1i64, PMULLv2i64)>;
// Crypto SHA1 hash acceleration op
// Crypto SHA1 hash acceleration ops
// Crypto SHA1 schedule acceleration ops
def : InstRW<[C1UWrite_2c_1V0], (instregex "^SHA1(H|SU0|SU1|C|M|P)")>;
// Crypto SHA256 hash acceleration ops
def : InstRW<[C1UWrite_4c_1V0], (instregex "^SHA256H2?")>;
// Crypto SHA256 schedule acceleration ops
def : InstRW<[C1UWrite_2c_1V0], (instregex "^SHA256SU[01]")>;
// Crypto SHA512 hash acceleration ops
def : InstRW<[C1UWrite_2c_1V0], (instregex "^SHA512(H|H2|SU0|SU1)")>;
// Crypto SHA3 ops
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instrs BCAX, EOR3, RAX1, XAR)>;
// Crypto SM3 ops
def : InstRW<[C1UWrite_2c_1V0], (instregex "^SM3PARTW[12]$", "^SM3SS1$",
"^SM3TT[12][AB]$")>;
// Crypto SM4 ops
def : InstRW<[C1UWrite_4c_1V0], (instrs SM4E, SM4ENCKEY)>;
// CRC
// -----------------------------------------------------------------------------
def : InstRW<[C1UWrite_2c_1M], (instregex "^CRC32")>;
// SVE Predicate instructions
// -----------------------------------------------------------------------------
// Loop control, based on predicate
def : InstRW<[C1UWrite_1c_1M], (instrs BRKA_PPmP, BRKA_PPzP,
BRKB_PPmP, BRKB_PPzP)>;
// Loop control, based on predicate and flag setting
def : InstRW<[C1UWrite_1c_1M], (instrs BRKAS_PPzP, BRKBS_PPzP)>;
// Loop control, propagating
def : InstRW<[C1UWr_Pred, C1URd_Pred, C1URd_Pred, C1URd_Pred], (instrs BRKN_PPzP, BRKPA_PPzPP,
BRKPB_PPzPP)>;
// Loop control, propagating and flag setting
def : InstRW<[C1UWr_Pred, C1URd_Pred, C1URd_Pred, C1URd_Pred], (instrs BRKNS_PPzP, BRKPAS_PPzPP,
BRKPBS_PPzPP)>;
// Loop control, based on GPR
def : InstRW<[C1UWrite_1c_1M],
(instregex "^WHILE(GE|GT|HI|HS|LE|LO|LS|LT)_P(WW|XX)_[BHSD]")>;
def : InstRW<[C1UWrite_2c_1M], (instregex "^WHILE(RW|WR)_PXX_[BHSD]")>;
// Loop terminate
def : InstRW<[C1UWrite_1c_2M], (instregex "^CTERM(EQ|NE)_(WW|XX)")>;
// // Predicate counting scalar
def : InstRW<[C1UWrite_1c_1I], (instregex "^(CNT|DEC|INC)[BHWD]_XPiI")>;
def : InstRW<[C1UWrite_1c_1I], (instrs ADDPL_XXI, ADDVL_XXI, RDVLI_XI)>;
def : InstRW<[C1UWrite_2c_1M],
(instregex "^(SQDEC|SQINC|UQDEC|UQINC)[BHWD]_XPiI",
"^SQ(DEC|INC)[BHWD]_XPiWdI",
"^UQ(DEC|INC)[BHWD]_WPiI")>;
// Predicate counting scalar, active predicate
def : InstRW<[C1UWrite_2c_1M],
(instregex "^CNTP_XPP_[BHSD]",
"^(DEC|SQDEC|SQINC|UQDEC|UQINC)P_XP_[BHSD]",
"^(UQDEC|UQINC)P_WP_[BHSD]",
"^(SQDEC|SQINC)P_XPWd_[BHSD]")>;
// Predicate counting vector, active predicate
def : InstRW<[C1UWrite_7c_1M_1M0_1V],
(instregex "^(DEC|INC|SQDEC|SQINC|UQDEC|UQINC)P_ZP_[HSD]")>;
def : InstRW<[C1UWrite_7c_1M_1M0_1V], (instregex "^INCP_XP_[BHSD]")>;
// Predicate logical
def : InstRW<[C1UWr_Pred, C1URd_Pred, C1URd_Pred, C1URd_Pred],
(instregex "^(AND|BIC|EOR|NAND|NOR|ORN|ORR)_PPzPP")>;
// Predicate logical, flag setting
def : InstRW<[C1UWr_Pred, C1URd_Pred, C1URd_Pred, C1URd_Pred],
(instregex "^(ANDS|BICS|EORS|NANDS|NORS|ORNS|ORRS)_PPzPP")>;
// Predicate reverse
def : InstRW<[C1UWrite_2c_1M], (instregex "^REV_PP_[BHSD]")>;
// Predicate select
def : InstRW<[C1UWr_Pred, C1URd_Pred, C1URd_Pred, C1URd_Pred], (instrs SEL_PPPP)>;
// Predicate set
def : InstRW<[C1UWrite_2c_1M], (instregex "^PFALSE", "^PTRUE_[BHSD]")>;
// Predicate set/initialize, set flags
def : InstRW<[C1UWrite_2c_1M], (instregex "^PTRUES_[BHSD]")>;
// Predicate find first/next
def : InstRW<[C1UWrite_2c_1M], (instregex "^PFIRST_B", "^PNEXT_[BHSD]")>;
// Predicate test
def : InstRW<[C1UWrite_1c_1M], (instrs PTEST_PP, PTEST_PP_ANY, PTEST_PP_FIRST)>;
// Predicate transpose
def : InstRW<[C1UWrite_2c_1M], (instregex "^TRN[12]_PPP_[BHSD]")>;
// Predicate unpack and widen
def : InstRW<[C1UWrite_2c_1M], (instrs PUNPKHI_PP, PUNPKLO_PP)>;
// Predicate zip/unzip
def : InstRW<[C1UWrite_2c_1M], (instregex "^(ZIP|UZP)[12]_PPP_[BHSD]")>;
// SVE integer instructions
// -----------------------------------------------------------------------------
// Arithmetic, absolute diff
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^[SU]ABD_ZPmZ_[BHSD]",
"^[SU]ABD_ZPZZ_[BHSD]")>;
// Arithmetic, absolute diff accum
def : InstRW<[C1UWr_ZA_CME, C1URd_ZA, C1URd_ZA], (instregex "^[SU]ABA_ZZZ_[BHSD]")>;
// Arithmetic, absolute diff accum long
def : InstRW<[C1UWr_ZA_CME, C1URd_ZA, C1URd_ZA], (instregex "^[SU]ABAL[TB]_ZZZ_[HSD]")>;
// Arithmetic, absolute diff long
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^[SU]ABDL[TB]_ZZZ_[HSD]")>;
// Arithmetic, basic
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU],
(instregex "^(ABS|ADD|CNOT|NEG|SUB|SUBR)_ZPmZ_[BHSD]",
"^(ADD|SUB)_ZZZ_[BHSD]",
"^(ADD|SUB|SUBR)_ZPZZ_[BHSD]",
"^(ADD|SUB|SUBR)_ZI_[BHSD]",
"^ADR_[SU]XTW_ZZZ_D_[0123]",
"^ADR_LSL_ZZZ_[SD]_[0123]",
"^[SU](ADD|SUB)[LW][BT]_ZZZ_[HSD]",
"^SADDLBT_ZZZ_[HSD]",
"^[SU]H(ADD|SUB|SUBR)_(ZPmZ|ZPZZ)_[BHSD]",
"^SSUBL(BT|TB)_ZZZ_[HSD]")>;
// Arithmetic, complex
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU],
(instregex "^R?(ADD|SUB)HN[BT]_ZZZ_[BHS]",
"^SQ(ABS|ADD|NEG|SUB|SUBR)_ZPmZ_[BHSD]",
"^[SU]Q(ADD|SUB)_ZZZ_[BHSD]",
"^[SU]Q(ADD|SUB)_ZI_[BHSD]",
"^(SRH|SUQ|UQ|USQ|URH)ADD_ZPmZ_[BHSD]",
"^(UQSUB|UQSUBR)_ZPmZ_[BHSD]")>;
// Arithmetic, large integer
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^(AD|SB)CL[BT]_ZZZ_[SD]")>;
// Arithmetic, pairwise add
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^ADDP_ZPmZ_[BHSD]")>;
// Arithmetic, pairwise add and accum long
def : InstRW<[C1UWr_ZPA_CME, ReadDefault, C1URd_ZPA, C1URd_ZPA],
(instregex "^[SU]ADALP_ZPmZ_[HSD]")>;
// Arithmetic, shift
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU],
(instregex "^(ASR|LSL|LSR)_WIDE_ZPmZ_[BHS]",
"^(ASR|LSL|LSR)_WIDE_ZZZ_[BHS]",
"^(ASR|LSL|LSR)_ZPmI_[BHSD]",
"^(ASR|LSL|LSR)_ZPmZ_[BHSD]",
"^(ASR|LSL|LSR)_ZZI_[BHSD]",
"^(ASR|LSL|LSR)_ZPZ[IZ]_[BHSD]",
"^(ASRR|LSLR|LSRR)_ZPmZ_[BHSD]")>;
// Arithmetic, shift and accumulate
def : InstRW<[C1UWr_ZSA_CME, C1URd_ZSA], (instregex "^[SU]R?SRA_ZZI_[BHSD]")>;
// Arithmetic, shift by immediate
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^SHRN[BT]_ZZI_[BHS]",
"^[SU]SHLL[BT]_ZZI_[HSD]")>;
// Arithmetic, shift by immediate and insert
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^(SLI|SRI)_ZZI_[BHSD]")>;
// Arithmetic, shift complex
def : InstRW<[C1UWrite_4c_1V_CME],
(instregex "^(SQ)?RSHRU?N[BT]_ZZI_[BHS]",
"^(SQRSHL|SQRSHLR|SQSHL|SQSHLR|UQRSHL|UQRSHLR|UQSHL|UQSHLR)_ZPmZ_[BHSD]",
"^[SU]QR?SHL_ZPZZ_[BHSD]",
"^(SQSHL|SQSHLU|UQSHL)_(ZPmI|ZPZI)_[BHSD]",
"^SQSHRU?N[BT]_ZZI_[BHS]",
"^UQR?SHRN[BT]_ZZI_[BHS]")>;
// Arithmetic, shift right for divide
def : InstRW<[C1UWrite_4c_1V_CME], (instregex "^ASRD_(ZPmI|ZPZI)_[BHSD]")>;
// Arithmetic, shift rounding
def : InstRW<[C1UWrite_4c_1V_CME], (instregex "^[SU]RSHLR?_ZPmZ_[BHSD]",
"^[SU]RSHL_ZPZZ_[BHSD]",
"^[SU]RSHR_(ZPmI|ZPZI)_[BHSD]")>;
// Bit manipulation
def : InstRW<[C1UWrite_6c_2V1], (instregex "^(BDEP|BEXT|BGRP)_ZZZ_[BHSD]")>;
// Bitwise select
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^(BSL|BSL1N|BSL2N|NBSL)_ZZZZ")>;
// Count/reverse bits
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^(CLS|CLZ|CNT|RBIT)_ZPmZ_[BHSD]")>;
// Broadcast logical bitmask immediate to vector
def : InstRW<[C1UWrite_2c_1V_1CMEPERM], (instrs DUPM_ZI)>;
// Compare and set flags
def : InstRW<[C1UWrite_2c_1V0_CME],
(instregex "^CMP(EQ|GE|GT|HI|HS|LE|LO|LS|LT|NE)_PPzZ[IZ]_[BHSD]",
"^CMP(EQ|GE|GT|HI|HS|LE|LO|LS|LT|NE)_WIDE_PPzZZ_[BHS]")>;
// Complex add
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^(SQ)?CADD_ZZI_[BHSD]")>;
// Complex dot product 8-bit element
def : InstRW<[C1UWr_ZDOTB_CME, C1URd_ZDOTB, C1URd_ZDOTB], (instrs CDOT_ZZZ_S, CDOT_ZZZI_S)>;
// Complex dot product 16-bit element
def : InstRW<[C1UWr_ZDOTH_CME, C1URd_ZDOTH, C1URd_ZDOTH], (instrs CDOT_ZZZ_D, CDOT_ZZZI_D)>;
// Complex multiply-add B, H, S, D element size
def : InstRW<[C1UWr_ZCMABHS_CME, C1URd_ZCMABHS, C1URd_ZCMABHS], (instregex "^CMLA_ZZZ_[BHSD]",
"^CMLA_ZZZI_[HS]")>;
// Conditional extract operations, scalar form
def : InstRW<[C1UWrite_8c_1M0_1V1_1V01_CMECLAST],
(instregex "^CLAST[AB]_RPZ_[BHSD]")>;
// Conditional extract operations, SIMD&FP scalar and vector forms
def : InstRW<[C1UWrite_3c_1V1_CME], (instregex "^CLAST[AB]_[VZ]PZ_[BHSD]",
"^COMPACT_ZPZ_[SD]",
"^SPLICE_ZPZZ?_[BHSD]")>;
// Convert to floating point, 64b to float or convert to double
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^[SU]CVTF_ZPmZ_Dto[HSD]",
"^[SU]CVTF_ZPmZ_StoD")>;
// Convert to floating point, 32b to single or half
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^[SU]CVTF_ZPmZ_Sto[HS]")>;
// Convert to floating point, 16b to half
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^[SU]CVTF_ZPmZ_HtoH")>;
// Copy, scalar
def : InstRW<[C1UWrite_3c_1M0_1V_1CMEPERMF_1CMEPERMS], (instregex "^CPY_ZPmR_[BHSD]")>;
// Copy, scalar SIMD&FP or imm
def : InstRW<[C1UWrite_2c_1V_1CMEPERM_1c], (instregex "^CPY_ZPm[IV]_[BHSD]",
"^CPY_ZPzI_[BHSD]")>;
// Divides, 32 bit
def : InstRW<[C1UWrite_12c_7V0_CME], (instregex "^[SU]DIVR?_ZPmZ_S",
"^[SU]DIV_ZPZZ_S")>;
// Divides, 64 bit
def : InstRW<[C1UWrite_20c_7V0_CME], (instregex "^[SU]DIVR?_ZPmZ_D",
"^[SU]DIV_ZPZZ_D")>;
// Dot product, 8 bit
def : InstRW<[C1UWr_ZDOTB_CME, C1URd_ZDOTB, C1URd_ZDOTB], (instregex "^[SU]DOT_ZZZI?_BtoS")>;
// Dot product, 8 bit, using signed and unsigned integers
def : InstRW<[C1UWr_ZDOTB_CME, C1URd_ZDOTB, C1URd_ZDOTB], (instrs SUDOT_ZZZI, USDOT_ZZZI, USDOT_ZZZ)>;
// Dot product, 16 bit
def : InstRW<[C1UWr_ZDOTH_CME, C1URd_ZDOTH, C1URd_ZDOTB], (instregex "^[SU]DOT_ZZZI?_HtoD")>;
// Duplicate, immediate and indexed form
def : InstRW<[C1UWrite_2c_1V_StreamingCMEPERM], (instregex "^DUP_ZI_[BHSD]",
"^DUP_ZZI_[BHSDQ]")>;
// Duplicate, scalar form
def : InstRW<[C1UWrite_3c_1M0_1CMEPERMF], (instregex "^DUP_ZR_[BHSD]")>;
// Extend, sign or zero
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^[SU]XTB_ZPmZ_[HSD]",
"^[SU]XTH_ZPmZ_[SD]",
"^[SU]XTW_ZPmZ_[D]")>;
// Extract
def : InstRW<[C1UWrite_2c_1V_1CMEPERM], (instrs EXT_ZZI,
EXT_ZZI_CONSTRUCTIVE,
EXT_ZZI_B)>;
// Extract narrow saturating
def : InstRW<[C1UWrite_4c_1V_1CMEVXALU], (instregex "^[SU]QXTN[BT]_ZZ_[BHS]",
"^SQXTUN[BT]_ZZ_[BHS]")>;
// Extract operation, SIMD and FP scalar form
def : InstRW<[C1UWrite_3c_1V1_CME], (instregex "^LAST[AB]_VPZ_[BHSD]")>;
// Extract operation, scalar
def : InstRW<[C1UWrite_5c_1V1_1V01_CME], (instregex "^LAST[AB]_RPZ_[BHSD]")>;
// Histogram operations
def : InstRW<[C1UWrite_2c_1V], (instregex "^HISTCNT_ZPzZZ_[SD]",
"^HISTSEG_ZZZ")>;
// Horizontal operations,immediate operands only
def : InstRW<[C1UWrite_4c_1V0134], (instregex "^INDEX_(II)_[BHSD]")>;
// Horizontal operations, scalar, immediate operands / immediate, scalar operands
def : InstRW<[C1UWrite_7c_1M0_1V0134_CMEINDEX_IRRI],
(instregex "^INDEX_(IR|RI)_[BHSD]")>;
// Horizontal operations, scalar operands only
def : InstRW<[C1UWrite_7c_1M0_1V0134_CMEINDEX_RR], (instregex "^INDEX_RR_[BHSD]")>;
// insert operation, SIMD and FP scalar form
def : InstRW<[C1UWrite_2c_1V_1CMEPERM], (instregex "^INSR_ZV_[BHSD]")>;
// insert operation, scalar
def : InstRW<[C1UWrite_5c_1V_1M0_CME], (instregex "^INSR_ZR_[BHSD]")>;
// Logical
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU],
(instregex "^(AND|EOR|ORR)_ZI",
"^(AND|BIC|EOR|ORR|EON|NAND|NOR)_ZZZ",
"^EOR(BT|TB)_ZZZ_[BHSD]",
"^(AND|BIC|EOR|NOT|ORR)_(ZPmZ|ZPZZ)_[BHSD]",
"^NOT_ZPmZ_[BHSD]")>;
// Max/min, basic and pairwise
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^[SU](MAX|MIN)_ZI_[BHSD]",
"^[SU](MAX|MIN)P?_ZPmZ_[BHSD]",
"^[SU](MAX|MIN)_ZPZZ_[BHSD]")>;
// Matching operations
def : InstRW<[C1UWrite_2c_1V0], (instregex "^N?MATCH_PPzZZ_[BH]")>;
// Matrix multiply-accumulate
def : InstRW<[C1UWr_ZMMA, C1URd_ZMMA, C1URd_ZMMA], (instrs SMMLA_ZZZ, UMMLA_ZZZ, USMMLA_ZZZ)>;
// Move prefix
def : InstRW<[C1UWrite_2c_1V_1CMEPERM], (instregex "^MOVPRFX_ZP[mz]Z_[BHSD]",
"^MOVPRFX_ZZ")>;
// Multiply
def : InstRW<[C1UWrite_4c_1V0134_1CMEVXMUL],
(instregex "^MUL_(ZI|ZPmZ|ZZZI|ZZZ)_[BHSD]",
"^MUL_ZPZZ_[BHSD]",
"^[SU]MULH_(ZPmZ|ZZZ)_[BHSD]",
"^[SU]MULH_ZPZZ_[BHSD]")>;
// Multiply long
def : InstRW<[C1UWrite_4c_1V0134_1CMEVXMUL],
(instregex "^[SU]MULL[BT]_ZZZI_[SD]",
"^[SU]MULL[BT]_ZZZ_[HSD]")>;
// Multiply accumulate, B, H, S element size
def : InstRW<[C1UWr_ZMA_CME, ReadDefault, C1URd_ZMA, C1URd_ZMA],
(instregex "^ML[AS]_ZZZI_[HS]", "^ML[AS]_ZPZZZ_[BHS]")>;
def : InstRW<[C1UWr_ZMA_CME, ReadDefault, C1URd_ZMA, C1URd_ZMA],
(instregex "^(ML[AS]|MAD|MSB)_ZPmZZ_[BHS]")>;
// Multiply accumulate, D element size
def : InstRW<[C1UWr_ZMA_CME, ReadDefault, C1URd_ZMA, C1URd_ZMA],
(instregex "^ML[AS]_ZZZI_D", "^ML[AS]_ZPZZZ_D")>;
def : InstRW<[C1UWr_ZMA_CME, ReadDefault, C1URd_ZMA, C1URd_ZMA],
(instregex "^(ML[AS]|MAD|MSB)_ZPmZZ_D")>;
// Multiply accumulate long
def : InstRW<[C1UWr_ZMA_CME, C1URd_ZMA, C1URd_ZMA], (instregex "^[SU]ML[AS]L[BT]_ZZZ_[HSD]",
"^[SU]ML[AS]L[BT]_ZZZI_[SD]")>;
// Multiply accumulate saturating doubling long regular
def : InstRW<[C1UWr_ZMASQL_CME, C1URd_ZMASQL, C1URd_ZMASQL],
(instregex "^SQDML[AS]L(B|T|BT)_ZZZ_[HSD]",
"^SQDML[AS]L[BT]_ZZZI_[SD]")>;
// Multiply saturating doubling high
def : InstRW<[C1UWrite_4c_1V0134_1CMEVXMUL],
(instregex "^SQDMULH_ZZZ_[BHSD]",
"^SQDMULH_ZZZI_[HSD]")>;
// Multiply saturating doubling long
def : InstRW<[C1UWrite_4c_1V0134_1CMEVXMUL],
(instregex "^SQDMULL[BT]_ZZZ_[HSD]",
"^SQDMULL[BT]_ZZZI_[SD]")>;
// Multiply saturating rounding doubling regular/complex accumulate
def : InstRW<[C1UWr_ZMASQL_CME, C1URd_ZMASQL, C1URd_ZMASQL], (instregex "^SQRDML[AS]H_ZZZ_[BHSD]",
"^SQRDCMLAH_ZZZ_[BHSD]",
"^SQRDML[AS]H_ZZZI_[HSD]",
"^SQRDCMLAH_ZZZI_[HSD]")>;
// Multiply saturating rounding doubling regular/complex, B, H, S element size
def : InstRW<[C1UWrite_4c_1V0134_1CMEVXMUL],
(instregex "^SQRDMULH_ZZZ_[BHS]",
"^SQRDMULH_ZZZI_[HS]",
"^SQRDMULH_ZZZI?_D")>;
// Multiply/multiply long, (8x8) polynomial
def : InstRW<[C1UWrite_2c_1V0134], (instregex "^PMUL_ZZZ_B",
"^PMULL(B|T)?_2?ZZZ_[HDQ]")>;
// Predicate counting vector
def : InstRW<[C1UWrite_2c_1V_CME], (instregex "^([SU]Q)?(DEC|INC)[HWD]_ZPiI")>;
// Reciprocal estimate
def : InstRW<[C1UWrite_4c_1V0134_1CMEVXMUL],
(instregex "^URECPE_ZPmZ_S", "^URSQRTE_ZPmZ_S")>;
// Reduction, arithmetic, B form
def : InstRW<[C1UWrite_8c_1V_3V0134_CMEIntReduce],
(instregex "^[SU]ADDV_VPZ_B")>;
def : InstRW<[C1UWrite_6c_1V_2V0134_CMEIntReduce],
(instregex "^[SU](MAX|MIN)V_VPZ_B")>;
// // Reduction, arithmetic, H form
def : InstRW<[C1UWrite_6c_1V_2V0134_CMEIntReduce],
(instregex "^[SU]ADDV_VPZ_H")>;
def : InstRW<[C1UWrite_6c_2V_1V0134_CMEIntReduce],
(instregex "^[SU](MAX|MIN)V_VPZ_H")>;
// Reduction, arithmetic, S form
def : InstRW<[C1UWrite_6c_2V_1V0134_CMEIntReduce],
(instregex "^[SU]ADDV_VPZ_S")>;
def : InstRW<[C1UWrite_4c_1V_1V0134_CMEIntReduce],
(instregex "^[SU](MAX|MIN)V_VPZ_S")>;
// Reduction, arithmetic, D form
def : InstRW<[C1UWrite_4c_2V_CMEIntReduce],
(instregex "^[SU](ADD|MAX|MIN)V_VPZ_D")>;
// Reduction, logical
def : InstRW<[C1UWrite_4c_1V_1V0134_CMEIntReduce],
(instregex "^(AND|EOR|OR)V_VPZ_[BHSD]")>;
// Reverse, vector
def : InstRW<[C1UWrite_2c_1V_StreamingCMEPERM], (instregex "^REV_ZZ_[BHSD]",
"^REV[BHWD]_ZPmZ_[HSD]")>;
// Select, vector form
def : InstRW<[C1USMEStreamingSchedWrite<C1UWrite_1c_1CMEPERM_2rc,
C1UWrite_2c_1V>],
(instregex "^SEL_ZPZZ_[BHSD]")>;
// Table lookup
def : InstRW<[C1UWrite_2c_1V_1CMEPERMF_1rc], (instregex "^TBL_ZZZZ?_[BHSD]")>;
// Table lookup extension
def : InstRW<[C1UWrite_2c_1V_1CMEPERMF_1rc], (instregex "^TBX_ZZZ_[BHSD]")>;
// Transpose, vector form
def : InstRW<[C1UWrite_2c_1V_1CMEPERM], (instregex "^TRN[12]_ZZZ_[BHSDQ]")>;
// Unpack and extend
def : InstRW<[C1UWrite_2c_1V_1CMEPERM], (instregex "^[SU]UNPK(HI|LO)_ZZ_[HSD]")>;
// Zip/unzip
def : InstRW<[C1UWrite_2c_1V_1CMEPERM], (instregex "^(UZP|ZIP)[12]_ZZZ_[BHSDQ]")>;
// SVE floating-point instructions
// -----------------------------------------------------------------------------
// Floating point absolute value/difference
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^FAB[SD]_ZPmZ_[HSD]",
"^FABD_ZPZZ_[HSD]",
"^FABS_ZPmZ_[HSD]")>;
// Floating point arithmetic
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU], (instregex "^F(ADD|SUB)_(ZPm[IZ]|ZZZ)_[HSD]",
"^F(ADD|SUB)_ZPZ[IZ]_[HSD]",
"^FADDP_ZPmZZ_[HSD]",
"^FNEG_ZPmZ_[HSD]",
"^FSUBR_ZPm[IZ]_[HSD]",
"^FSUBR_(ZPZI|ZPZZ)_[HSD]")>;
// Floating point associative add, F16
def : InstRW<[C1UWrite_10c_10V0], (instrs FADDA_VPZ_H)>;
// Floating point associative add, F32
def : InstRW<[C1UWrite_6c_6V0], (instrs FADDA_VPZ_S)>;
// Floating point associative add, F64
def : InstRW<[C1UWrite_4c_2V], (instrs FADDA_VPZ_D)>;
// Floating point compare
def : InstRW<[C1UWrite_2c_1V0_CME], (instregex "^FACG[ET]_PPzZZ_[HSD]",
"^FCM(EQ|GE|GT|NE)_PPzZ[0Z]_[HSD]",
"^FCM(LE|LT)_PPzZ0_[HSD]",
"^FCMUO_PPzZZ_[HSD]")>;
// Floating point complex add
def : InstRW<[C1UWrite_3c_1V_1CMEVXMUL], (instregex "^FCADD_ZPmZ_[HSD]")>;
// Floating point complex multiply add
def : InstRW<[C1UWr_ZFCMA_CME, ReadDefault, C1URd_ZFCMA, C1URd_ZFCMA], (instregex "^FCMLA_ZPmZZ_[HSD]")>;
def : InstRW<[C1UWr_ZFCMA_CME, C1URd_ZFCMA, C1URd_ZFCMA], (instregex "^FCMLA_ZZZI_[HS]")>;
// Floating point convert, long or narrow (F16 to F32 or F32 to F16)
def : InstRW<[C1UWrite_4c_1V0134_CME], (instregex "^FCVT_ZPmZ_(HtoS|StoH)",
"^FCVTLT_ZPmZ_HtoS",
"^FCVTNT_ZPmZ_StoH")>;
// Floating point convert, long or narrow (F16 to F64, F32 to F64, F64 to F32
// or F64 to F16)
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^FCVT_ZPmZ_(HtoD|StoD|DtoS|DtoH)",
"^FCVTLT_ZPmZ_StoD",
"^FCVTNT_ZPmZ_DtoS")>;
// Floating point convert, round to odd
def : InstRW<[C1UWrite_3c_1V0134_CME], (instrs FCVTX_ZPmZ_DtoS, FCVTXNT_ZPmZ_DtoS)>;
// Floating point base2 log, F16
def : InstRW<[C1UWrite_3c_1V0134_1CMEVXMUL], (instregex "^FLOGB_(ZPmZ|ZPZZ)_H")>;
// Floating point base2 log, F32
def : InstRW<[C1UWrite_3c_1V0134_1CMEVXMUL], (instregex "^FLOGB_(ZPmZ|ZPZZ)_S")>;
// Floating point base2 log, F64
def : InstRW<[C1UWrite_3c_1V0134_1CMEVXMUL], (instregex "^FLOGB_(ZPmZ|ZPZZ)_D")>;
// Floating point convert to integer, F16
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^FCVTZ[SU]_ZPmZ_HtoH")>;
// Floating point convert to integer, F32
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^FCVTZ[SU]_ZPmZ_(HtoS|StoS)")>;
// Floating point convert to integer, F64
def : InstRW<[C1UWrite_3c_1V0134_CME],
(instregex "^FCVTZ[SU]_ZPmZ_(HtoD|StoD|DtoS|DtoD)")>;
// Floating point copy
def : InstRW<[C1UWrite_2c_1V_1CMEPERM_1c], (instregex "^FCPY_ZPmI_[HSD]",
"^FDUP_ZI_[HSD]")>;
// Floating point divide, F16
def : InstRW<[C1UWrite_12c_1V0_8rc_1CME], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_H")>;
// Floating point divide, F32
def : InstRW<[C1UWrite_11c_1V0_4rc_1CME], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_S")>;
// Floating point divide, F64
def : InstRW<[C1UWrite_13c_1V0_2rc_1CME], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_D")>;
// Floating point min/max pairwise
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU],
(instregex "^F(MAX|MIN)(NM)?P_ZPmZZ_[HSD]")>;
// Floating point min/max
def : InstRW<[C1UWrite_2c_1V_1CMEVXALU],
(instregex "^F(MAX|MIN)(NM)?_ZPm[IZ]_[HSD]",
"^F(MAX|MIN)(NM)?_ZPZ[IZ]_[HSD]")>;
// Floating point multiply
def : InstRW<[C1UWrite_3c_1V_1CMEVXMUL],
(instregex "^(FSCALE|FMULX)_ZPmZ_[HSD]",
"^FMULX_ZPZZ_[HSD]",
"^FMUL_(ZPm[IZ]|ZZZI?)_[HSD]",
"^FMUL_ZPZ[IZ]_[HSD]")>;
// Floating point multiply accumulate
def : InstRW<[C1UWr_ZFMA_CME, ReadDefault, C1URd_ZFMA, C1URd_ZFMA],
(instregex "^FN?ML[AS]_ZPmZZ_[HSD]",
"^FN?(MAD|MSB)_ZPmZZ_[HSD]",
"^FN?ML[AS]_ZPZZZ_[HSD]")>;
def : InstRW<[C1UWr_ZFMA_CME, C1URd_ZFMA, C1URd_ZFMA],
(instregex "^FML[AS]_ZZZI_[HSD]")>;
// Floating point multiply add/sub accumulate long
def : InstRW<[C1UWr_ZFMAL_CME, C1URd_ZFMAL, C1URd_ZFMAL],
(instregex "^FML[AS]L[BT]_ZZZI?_SHH", "^FMLAL(B|T|BB|TT|LB|LT|LBB|LTT|LBT|LTB)_(ZZZ|ZZZI)")>;
// Floating point reciprocal estimate, F16
def : InstRW<[C1UWrite_6c_1V0134_1CMEVXMUL],
(instregex "^FR(ECP|SQRT)E_ZZ_H", "^FRECPX_ZPmZ_H")>;
// Floating point reciprocal estimate, F32
def : InstRW<[C1UWrite_4c_1V0134_1CMEVXMUL],
(instregex "^FR(ECP|SQRT)E_ZZ_S", "^FRECPX_ZPmZ_S")>;
// Floating point reciprocal estimate, F64
def : InstRW<[C1UWrite_3c_1V0134_1CMEVXMUL],
(instregex "^FR(ECP|SQRT)E_ZZ_D", "^FRECPX_ZPmZ_D")>;
// Floating point reciprocal step
def : InstRW<[C1UWrite_4c_1V_1CMEVXMUL], (instregex "^F(RECPS|RSQRTS)_ZZZ_[HSD]")>;
// Floating point reduction, F16
def : InstRW<[C1UWrite_8c_4V_CMEFPReduceH], (instrs FADDV_VPZ_H)>;
def : InstRW<[C1UWrite_8c_4V_CMEFPReduceMaxMin],
(instregex "^(FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_H")>;
// Floating point reduction, F32
def : InstRW<[C1UWrite_6c_3V_CMEFPReduceS], (instrs FADDV_VPZ_S)>;
def : InstRW<[C1UWrite_6c_3V_CMEFPReduceMaxMin],
(instregex "^(FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_S")>;
// Floating point reduction, F64
def : InstRW<[C1UWrite_4c_2V_CMEFPReduceD], (instrs FADDV_VPZ_D)>;
def : InstRW<[C1UWrite_4c_2V_CMEFPReduceMaxMinD],
(instregex "^(FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_D")>;
// Floating point round to integral, F16
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^FRINT[AIMNPXZ]_ZPmZ_H")>;
// Floating point round to integral, F32
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^FRINT[AIMNPXZ]_ZPmZ_S")>;
// Floating point round to integral, F64
def : InstRW<[C1UWrite_3c_1V0134_CME], (instregex "^FRINT[AIMNPXZ]_ZPmZ_D")>;
// Floating point square root, F16
def : InstRW<[C1UWrite_12c_1V1_8rc_1CME], (instregex "^FSQRT_ZPmZ_H")>;
// Floating point square root, F32
def : InstRW<[C1UWrite_11c_1V1_4rc_1CME], (instregex "^FSQRT_ZPmZ_S")>;
// Floating point square root, F64
def : InstRW<[C1UWrite_13c_1V1_2rc_1CME], (instregex "^FSQRT_ZPmZ_D")>;
// Floating point trigonometric exponentiation
def : InstRW<[C1UWrite_3c_1V1], (instregex "^FEXPA_ZZ_[HSD]")>;
// Floating point trigonometric multiply add
def : InstRW<[C1UWrite_4c_1V], (instregex "^FTMAD_ZZI_[HSD]")>;
// Floating point trigonometric, miscellaneous
def : InstRW<[C1UWrite_3c_1V], (instregex "^FTS(MUL|SEL)_ZZZ_[HSD]")>;
// SVE BFloat16 (BF16) instructions
// -----------------------------------------------------------------------------
// Convert, F32 to BF16
def : InstRW<[C1UWrite_3c_1V0134_CME], (instrs BFCVT_ZPmZ, BFCVTNT_ZPmZ)>;
// Dot product
def : InstRW<[C1UWr_ZBFDOT_CME, C1URd_ZBFDOT, C1URd_ZBFDOT], (instrs BFDOT_ZZI, BFDOT_ZZZ)>;
// Matrix multiply accumulate
def : InstRW<[C1UWr_ZBFMMA, C1URd_ZBFMMA, C1URd_ZBFMMA], (instrs BFMMLA_ZZZ_HtoS)>;
// Multiply accumulate long
def : InstRW<[C1UWr_ZBFMAL_CME, C1URd_ZBFMAL, C1URd_ZBFMAL], (instregex "^BFMLAL[BT]_ZZZI?")>;
// SVE Load instructions
// -----------------------------------------------------------------------------
// Load vector
def : InstRW<[C1UWrite_6c_1L_CME], (instrs LDR_ZXI)>;
// Load predicate
def : InstRW<[C1UWrite_6c_1L_1M_CME], (instrs LDR_PXI)>;
// Contiguous load, scalar + imm
def : InstRW<[C1UWrite_6c_1L_CME], (instregex "^LD1[BHWD]_IMM$",
"^LD1S?B_[HSD]_IMM$",
"^LD1S?H_[SD]_IMM$",
"^LD1S?W_D_IMM$" )>;
// Contiguous load, scalar + scalar
def : InstRW<[C1UWrite_6c_1L_CME], (instregex "^LD1[BHWD]$",
"^LD1S?B_[HSD]$",
"^LD1S?H_[SD]$",
"^LD1S?W_D$" )>;
// Contiguous load broadcast, scalar + imm
def : InstRW<[C1UWrite_6c_1L_CME], (instregex "^LD1R[BHWD]_IMM$",
"^LD1RS?B_[HSD]_IMM$",
"^LD1RS?H_[SD]_IMM$",
"^LD1RW_D_IMM$",
"^LD1RSW_IMM$",
"^LD1RQ_[BHWD]_IMM$")>;
// Contiguous load broadcast, scalar + scalar
def : InstRW<[C1UWrite_6c_1L_CME], (instregex "^LD1RQ_[BHWD]$")>;
// Non temporal load, scalar + imm
// Non temporal load, scalar + scalar
def : InstRW<[C1UWrite_6c_1L_CME], (instregex "^LDNT1[BHWD]_ZR[IR]$")>;
// Non temporal gather load, vector + scalar 32-bit element size
def : InstRW<[C1UWrite_9c_1V01_1L], (instregex "^LDNT1[BHW]_ZZR_S$",
"^LDNT1S[BH]_ZZR_S$")>;
// Non temporal gather load, vector + scalar 64-bit element size
def : InstRW<[C1UWrite_9c_1V01_1L], (instregex "^LDNT1S?[BHW]_ZZR_D$")>;
def : InstRW<[C1UWrite_6c_1L], (instrs LDNT1D_ZZR_D)>;
// Contiguous first faulting load, scalar + scalar
def : InstRW<[C1UWrite_9c_1V01_1L], (instregex "^LDFF1[BHWD]$",
"^LDFF1S?B_[HSD]$",
"^LDFF1S?H_[SD]$",
"^LDFF1S?W_D$")>;
// Contiguous non faulting load, scalar + imm
def : InstRW<[C1UWrite_6c_1L], (instregex "^LDNF1[BHWD]_IMM$",
"^LDNF1S?B_[HSD]_IMM$",
"^LDNF1S?H_[SD]_IMM$",
"^LDNF1S?W_D_IMM$")>;
// Contiguous Load two structures to two vectors, scalar + imm
def : InstRW<[C1UWrite_8c_2L_2V_CME], (instregex "^LD2[BHWD]_IMM$")>;
// Contiguous Load two structures to two vectors, scalar + scalar
def : InstRW<[C1UWrite_9c_2L_2V_1I_CME], (instregex "^LD2[BHWD]$")>;
// Contiguous Load three structures to three vectors, scalar + imm
def : InstRW<[C1UWrite_8c_3L_3V_CME], (instregex "^LD3[BHWD]_IMM$")>;
// Contiguous Load three structures to three vectors, scalar + scalar
def : InstRW<[C1UWrite_9c_3L_3V_1I_CME], (instregex "^LD3[BHWD]$")>;
// Contiguous Load four structures to four vectors, scalar + imm
def : InstRW<[C1UWrite_10c_4L_8V_CME], (instregex "^LD4[BHWD]_IMM$")>;
// Contiguous Load four structures to four vectors, scalar + scalar
def : InstRW<[C1UWrite_11c_4L_8V_1I_CME], (instregex "^LD4[BHWD]$")>;
// Gather load, vector + imm, 32-bit element size
def : InstRW<[C1UWrite_9c_1V01_1L], (instregex "^GLD(FF)?1S?[BH]_S_IMM$",
"^GLD(FF)?1W_IMM$")>;
// Gather load, vector + imm, 64-bit element size
def : InstRW<[C1UWrite_9c_1V01_1L], (instregex "^GLD(FF)?1S?[BHW]_D_IMM$",
"^GLD(FF)?1D_IMM$")>;
// Gather load, 32-bit scaled offset
def : InstRW<[C1UWrite_9c_1V01_1L],
(instregex "^GLD(FF)?1S?H_S_[SU]XTW_SCALED$",
"^GLD(FF)?1W_[SU]XTW_SCALED")>;
// Gather load, 64-bit scaled offset
// NOTE: These instructions are not specified in the SOG.
def : InstRW<[C1UWrite_9c_1V01_1L],
(instregex "^GLD(FF)?1S?[HW]_D_([SU]XTW_)?SCALED$",
"^GLD(FF)?1D_([SU]XTW_)?SCALED$")>;
// Gather load, 32-bit unpacked unscaled offset
def : InstRW<[C1UWrite_9c_1V01_1L], (instregex "^GLD(FF)?1S?[BH]_S_[SU]XTW$",
"^GLD(FF)?1W_[SU]XTW$")>;
// Gather load, 64-bit unpacked unscaled offset
// NOTE: These instructions are not specified in the SOG.
def : InstRW<[C1UWrite_9c_1V01_1L],
(instregex "^GLD(FF)?1S?[BHW]_D(_[SU]XTW)?$",
"^GLD(FF)?1D(_[SU]XTW)?$")>;
// SVE Store instructions
// -----------------------------------------------------------------------------
// Store from predicate reg
def : InstRW<[C1UWrite_1c_1SA_CME], (instrs STR_PXI)>;
// Store from vector reg
def : InstRW<[C1UWrite_2c_1SA_1V01_CME], (instrs STR_ZXI)>;
// Contiguous store, scalar + imm
def : InstRW<[C1UWrite_2c_1SA_1V01_CME], (instregex "^ST1[BHWD]_IMM$",
"^ST1B_[HSD]_IMM$",
"^ST1H_[SD]_IMM$",
"^ST1W_D_IMM$")>;
// Contiguous store, scalar + scalar
def : InstRW<[C1UWrite_2c_1SA_1V01_CME], (instregex "^ST1H(_[SD])?$",
"^ST1[BWD]$",
"^ST1B_[HSD]$",
"^ST1W_D$")>;
// Contiguous store two structures from two vectors, scalar + imm
def : InstRW<[C1UWrite_4c_2SA_2V01_CME], (instregex "^ST2[BHWD]_IMM$")>;
// Contiguous store two structures from two vectors, scalar + scalar
def : InstRW<[C1UWrite_4c_2SA_2V01_1I_CME], (instregex "^ST2[BHWD]$")>;
// Contiguous store three structures from three vectors, scalar + imm
def : InstRW<[C1UWrite_5c_3SA_3V01_CME], (instregex "^ST3[BHWD]_IMM$")>;
// Contiguous store three structures from three vectors, scalar + scalar
def : InstRW<[C1UWrite_5c_3SA_3V01_1I_CME], (instregex "^ST3[BHWD]$")>;
// Contiguous store four structures from four vectors, scalar + imm
def : InstRW<[C1UWrite_7c_4SA_4V01_CME], (instregex "^ST4[BHWD]_IMM$")>;
// Contiguous store four structures from four vectors, scalar + scalar
def : InstRW<[C1UWrite_7c_4SA_4V01_1I_CME], (instregex "^ST4[BHWD]$")>;
// Non temporal store, scalar + imm
def : InstRW<[C1UWrite_2c_1SA_1V01_CME], (instregex "^STNT1[BHWD]_ZRI$")>;
// Non temporal store, scalar + scalar
def : InstRW<[C1UWrite_2c_1SA_1V01_CME], (instregex "^STNT1[BHWD]_ZRR$")>;
// Scatter non temporal store, vector + scalar 32-bit element size
def : InstRW<[C1UWrite_5or7c_3SA_6V01], (instregex "^STNT1[BHW]_ZZR_S")>;
// Scatter non temporal store, vector + scalar 64-bit element size
def : InstRW<[C1UWrite_4or6c_3SA_3V01], (instregex "^STNT1[BHWD]_ZZR_D")>;
// Scatter store vector + imm 32-bit element size
def : InstRW<[C1UWrite_5or7c_5SA_5V01], (instregex "^SST1[BHW]_S_IMM$",
"^SST1W_IMM$")>;
// Scatter store vector + imm 64-bit element size
def : InstRW<[C1UWrite_4or6c_3SA_3V01], (instregex "^SST1[BHW]_D_IMM$",
"^SST1D_IMM$")>;
// Scatter store, 32-bit scaled offset
def : InstRW<[C1UWrite_2or4c_3SA_6V01],
(instregex "^SST1(H_S|W)_[SU]XTW_SCALED$")>;
// Scatter store, 32-bit unpacked unscaled offset
def : InstRW<[C1UWrite_2or4c_1SA_1V01], (instregex "^SST1[BHW]_D_[SU]XTW$",
"^SST1D_[SU]XTW$")>;
// Scatter store, 32-bit unpacked scaled offset
def : InstRW<[C1UWrite_2or4c_1SA_1V01], (instregex "^SST1[HW]_D_[SU]XTW_SCALED$",
"^SST1D_[SU]XTW_SCALED$")>;
// Scatter store, 32-bit unscaled offset
def : InstRW<[C1UWrite_2or4c_1SA_1V01], (instregex "^SST1[BH]_S_[SU]XTW$",
"^SST1W_[SU]XTW$")>;
// Scatter store, 64-bit scaled offset
def : InstRW<[C1UWrite_2or4c_1SA_1V01], (instregex "^SST1[HW]_D_SCALED$",
"^SST1D_SCALED$")>;
// Scatter store, 64-bit unscaled offset
def : InstRW<[C1UWrite_2or4c_1SA_1V01], (instregex "^SST1[BHW]_D$",
"^SST1D$")>;
// SVE Miscellaneous instructions
// -----------------------------------------------------------------------------
// Read first fault register, unpredicated
def : InstRW<[C1UWrite_2c_1M0], (instrs RDFFR_P)>;
// Read first fault register, predicated
def : InstRW<[C1UWrite_2c_1M0], (instrs RDFFR_PPz)>;
// Read first fault register and set flags
def : InstRW<[C1UWrite_3c_1M0], (instrs RDFFRS_PPz)>;
// Set first fault register
// Write to first fault register
def : InstRW<[C1UWrite_2c_1M0], (instrs SETFFR, WRFFR)>;
// Prefetch
// NOTE: This is not specified in the SOG.
def : InstRW<[C1UWrite_4c_1L], (instregex "^PRF[BHWD]")>;
// SVE Cryptographic instructions
// -----------------------------------------------------------------------------
// Crypto AES ops
def : InstRW<[C1UWrite_2c_1V0134], (instregex "^AES[DE]_ZZZ_B$",
"^AESI?MC_ZZ_B$",
"^AES(D|DIMC|E|EMC)?_(2|4)ZZI")>;
// Crypto SHA3 ops
def : InstRW<[C1UWrite_2c_1V], (instregex "^(BCAX|EOR3)_ZZZZ$",
"^RAX1_ZZZ_D$",
"^XAR_ZZZI_[BHSD]$")>;
// Crypto SM4 ops
def : InstRW<[C1UWrite_4c_1V0], (instregex "^SM4E(KEY)?_ZZZ_S$")>;
// SVE instructions added by SME and available when not in Streaming SVE mode
// -----------------------------------------------------------------------------
// BFloat16 floating-point multiply-subtract long from single-precision vector and indexed form
def : InstRW<[C1UWrite_4c_1V_StreamingCMEMML0], (instregex "^BFMLSLB_Z",
"^BFMLSLT_Z")>;
// Floating-point clamp to minimum/maximu m number
def : InstRW<[C1UWrite_2c_1V_StreamingCMEVXALU_5c], (instregex "^FCLAMP_ZZZ")>;
// Half-precision floating-point indexed or vector forms dot product
def : InstRW<[C1UWrite_4c_1V_StreamingCMEMML0], (instregex "^FDOT_(ZZZ|ZZZI)?(_S|_BtoS|_BtoH)$")>;
// Predicate selection
def : InstRW<[C1UWrite_2c_2M_StreamingCMEPERM], (instregex "^PSEL_PPPRI")>;
// Reverse doubleword elements
def : InstRW<[C1UWrite_2c_1V_StreamingCMEPERM], (instregex "^REVD_ZPmZ")>;
// Signed/unsigned clamp
def : InstRW<[C1UWrite_2c_1V_StreamingCME], (instregex "^(S|U)CLAMP_ZZZ")>;
// Half-precision signed/unsigned dot product vector and indexed forms
def : InstRW<[C1UWrite_3c_1V01_StreamingCME], (instregex "^(S|U)DOT_ZZZI?_HtoS")>;
// Signed/unsigned saturating narrow conversion
def : InstRW<[C1UWrite_2c_1V_StreamingCMEVXALU_1CMEPERMS],
(instregex "^SQCVTUN_Z2Z_StoH")>;
// Signed/unsigned saturating rounding shift-right narrow
def : InstRW<[C1UWrite_3c_1V01_StreamingCME], (instregex "^SQRSHRUN_Z2ZI_StoH")>;
// Signed/unsigned pair-producing while compare
def : InstRW<[C1UWrite_2c_1M_StreamingCMEVX0ALU],
(instregex "^WHILE(GE|GT|HI|HS|LE|LO|LS|LT)_2PXX")>;
// SVE instructions added by SME but not sent to CME when in Streaming SVE mode
// -----------------------------------------------------------------------------
// Add/Read multiple of streaming SVE Predicate/vector register size to scalar register
def : InstRW<[C1UWrite_1c_1I], (instrs ADDSPL_XXI, ADDSVL_XXI, RDSVLI_XI)>;
// Predicate counting scalar to count from predicate-as-counter
def : InstRW<[C1UWrite_2c_1M], (instregex "^CNTP_XCI_[BHSD]$")>;
// Set predicates from predicate-as-counter
def : InstRW<[C1UWrite_2c_1M], (instregex "^PEXT_PCI_[BHSD]$")>;
// Set pair of predicates from predicate-as-counter
def : InstRW<[C1UWrite_3c_1M], (instregex "^PEXT_2PCI_[BHSD]$")>;
// Predicate as counter set
def : InstRW<[C1UWrite_1c_1M], (instregex "^PTRUE_C_[BHSD]$")>;
// Loop control, based on GPR generating predicate as counter
def : InstRW<[C1UWrite_1c_1M], (instregex "^WHILE(GE|GT|HI|HS|LE|LO|LS|LT)_CXX_[BHSD]$")>;
// SVE instructions added by SME and only available in Streaming SVE mode
// -----------------------------------------------------------------------------
// Instructions added by SME and only available in streaming SVE mode
// For these, we return the CME write as a default even if not in streaming.
// Horizontal and vertical ZA reductions.
def : InstRW<[C1UWrite_4c_1CMEVXALU_4rc],
(instregex "^ADDHA_MPPZ_(S(_PSEUDO_S)?|D(_PSEUDO_D)?)$",
"^ADDVA_MPPZ_(S(_PSEUDO_S)?|D(_PSEUDO_D)?)$")>;
// Outer-product ZA updates.
def : InstRW<[C1UWrite_2c_1CMEMML0_2rc],
(instregex "^BMOPA_MPPZZ_S(_PSEUDO)?$", "^BMOPS_MPPZZ_S(_PSEUDO)?$",
"^(SMOPA|UMOPA|SMOPS|UMOPS)_MPPZZ_(S|D|HtoS)(_PSEUDO)?$",
"^(SUMOPA|USMOPA|SUMOPS|USMOPS)_MPPZZ_(S|D)(_PSEUDO)?$")>;
def : InstRW<[C1UWrite_4c_1CMEMML0_2rc],
(instregex "^(F?MOPA|F?MOPS)_MPPZZ_(S|D|H)(_PSEUDO)?$",
"^F?MOP(AL|SL)_MPPZZ(_PSEUDO)?$",
"^(BFMOPA|BFMOPS)_MPPZZ(_H)?(_PSEUDO)?$")>;
// ZA accumulators updated through multi-vector add/subtract operations.
def : InstRW<[C1UWrite_2c_1CMEMML0_1rc],
(instregex "^(ADD|SUB)_VG2_M2(Z|ZZ|Z2Z)_[SD](_PSEUDO)?$")>;
def : InstRW<[C1UWrite_2c_1CMEMML0_2rc],
(instregex "^(ADD|SUB)_VG4_M4(Z|ZZ|Z4Z)_[SD](_PSEUDO)?$")>;
def : InstRW<[C1UWrite_4c_1CMEMML0_1rc],
(instregex "^(FADD|FSUB|BFADD|BFSUB)_VG2_M2Z_[HSD](_PSEUDO)?$")>;
def : InstRW<[C1UWrite_4c_1CMEMML0_2rc],
(instregex "^(FADD|FSUB|BFADD|BFSUB)_VG4_M4Z_[HSD](_PSEUDO)?$")>;
def : InstRW<[C1UWrite_5c_1CMEVXALU_1rc],
(instregex "^ADD_VG2_2ZZ_")>;
def : InstRW<[C1UWrite_6c_1CMEVXALU_4rc],
(instregex "^ADD_VG4_4ZZ_")>;
// Streaming-only clamp, convert and shift families.
def : InstRW<[C1UWrite_5c_1CMEVXALU_1rc],
(instregex "^FCLAMP_VG2_2Z2Z_", "^BFCLAMP_VG2_2ZZZ",
"^(S|U)CLAMP_VG2_2Z2Z_", "^(FMAX|FMIN)_VG2_2(ZZ|Z2Z)_",
"^FA(MAX|MIN)_2Z2Z_", "^SQDMULH_VG2_2ZZ_",
"^(S|U)RSHL_VG2_2ZZ_")>;
def : InstRW<[C1UWrite_7c_1CMEVXALU_4rc],
(instregex "^FCLAMP_VG4_4Z4Z_", "^BFCLAMP_VG4_4ZZZ",
"^(S|U)CLAMP_VG4_4Z4Z_")>;
def : InstRW<[C1UWrite_4c_1CMEVXALU_2rc],
(instregex "^(S|U)(MAX|MIN)_VG2_2(ZZ|Z2Z)_",
"^(FMAXNM|FMINNM)_VG2_2(ZZ|Z2Z)_",
"^SQDMULH_VG2_2Z2Z_", "^(S|U)RSHL_VG2_2Z2Z_",
"^(SQRSHR|UQRSHR)_VG2_Z2ZI_",
"^(FRINT(A|M|N|P))_2Z2Z_")>;
def : InstRW<[C1UWrite_4c_1CMEVXALU_4rc],
(instregex "^(S|U)(MAX|MIN)_VG4_4Z4Z_",
"^(S|U)RSHL_VG4_4Z4Z_")>;
def : InstRW<[C1UWrite_5c_1CMEVXALU_4rc],
(instregex "^(S|U)(MAX|MIN)_VG4_4ZZ_",
"^(FMAX|FMIN|FMAXNM|FMINNM)_VG4_4(ZZ|Z4Z)_",
"^(BFMAX|BFMIN|BFMAXNM|BFMINNM)_VG4_4(Z2Z|ZZ)_",
"^SQDMULH_VG4_4(ZZ|Z4Z)_", "^(FRINT(A|M|N|P))_4Z4Z_",
"^FSCALE_4(ZZ|Z4Z)_")>;
def : InstRW<[C1UWrite_4c_1CMEVXALU_2rc],
(instregex "^(BFMAX|BFMIN|BFMAXNM|BFMINNM)_VG2_2(ZZ|Z2Z)_",
"^FSCALE_2(ZZ|Z2Z)_", "^FCVTZS_2Z2Z_StoS$",
"^FCVTZU_2Z2Z_StoS$", "^F[12]CVT_2?ZZ_BtoH$",
"^F[12]CVTL(T_ZZ|_2ZZ)_BtoH$",
"^FCVT_Z2Z_(HtoB|StoH)$", "^FCVT_2ZZ_H_S$",
"^FCVTL_2ZZ_H_S$", "^FCVT_Z4Z_StoB$")>;
def : InstRW<[C1UWrite_6c_1CMEVXALU_4rc],
(instregex "^(S|U)RSHL_VG4_4ZZ_")>;
def : InstRW<[C1UWrite_4c_1CMEVX0ALU_1CMEPERMF_1rc],
(instregex "^(S|U)CVTF_2Z2Z_StoS$")>;
def : InstRW<[C1UWrite_4c_1CMEVX0ALU_1CMEPERMF_2rc],
(instregex "^(S|U)CVTF_4Z4Z_StoS$")>;
def : InstRW<[C1UWrite_4c_1CMEVXALU_4rc],
(instregex "^FCVTZS_4Z4Z_StoS$", "^FCVTZU_4Z4Z_StoS$")>;
def : InstRW<[C1UWrite_4c_1CMEVXALU_1CMEPERMF_1d1rc],
(instregex "^FCVTN(B|T)?_Z2Z_(StoB|HtoB|StoH)$", "^FCVTN_Z4Z_StoB$")>;
def : InstRW<[C1UWrite_7c_1CMEVXALU_1CMEPERMF_1rc],
(instregex "^BFCVTN_Z2Z_(StoH|HtoB)$")>;
def : InstRW<[C1UWrite_11c_1CMEVXALU_2rc],
(instregex "^BFCVT_Z2Z_(StoH|HtoB)$", "^BF[12]CVT_2?ZZ_BtoH$",
"^BF[12]CVTL(T_ZZ|_2ZZ)_BtoH$")>;
def : InstRW<[C1UWrite_8c_1CMEVXALU_1CMEPERMS_1rc],
(instregex "^(SQCVT|UQCVT|SQCVTU|SQCVTN|SQCVTUN|UQCVTN)_Z4Z_",
"^(SQCVT|UQCVT|SQCVTU|SQCVTN|UQCVTN)_Z2Z_StoH",
"^SQRSHRU_VG2_Z2ZI_",
"^(SQRSHRN|UQRSHRN)_Z2ZI_StoH",
"^(SQRSHR|UQRSHR|SQRSHRU|SQRSHRN|UQRSHRN|SQRSHRUN)_VG4_Z4ZI_")>;
// SME integer and floating-point dot and multiply-accumulate families.
def : InstRW<[C1UWrite_4c_1CMEMML0],
(instregex "^FMLALL_M(ZZI|ZZ)_BtoS(_PSEUDO)?$",
"^BFMLAL_MZZ", "^BFMLSL_MZZ",
"^FMLAL(_VG2)?_MZZ(_BtoH)?", "^FMLSL_MZZ")>;
def : InstRW<[C1UWrite_2c_1CMEMML0_1rc],
(instregex "^(SUDOT|USDOT)_VG2_M2(ZZI|ZZ|Z2Z)_BToS(_PSEUDO)?$",
"^(SDOT|UDOT)_VG2_M2(ZZI|ZZ|Z2Z)_(BtoS|BToS|HtoS|HToS|HtoD)(_PSEUDO)?",
"^(SMLAL|UMLAL|SMLSL|UMLSL)_(MZZI|MZZ|VG2_M2)",
"^(SMLALL|UMLALL|USMLALL|SMLSLL|UMLSLL)_(MZZI|MZZ|VG2_M2ZZI|VG2_M2ZZ|VG2_M2Z2Z)_(BtoS|HtoD)(_PSEUDO)?$",
"^(SUMLALL|USMLALL)_(VG2_M2ZZI|VG2_M2ZZ|VG2_M2Z2Z|MZZI|MZZ)_BtoS(_PSEUDO)?$",
"^(SVDOT|UVDOT)_VG2_M2ZZI_")>;
def : InstRW<[C1UWrite_2c_1CMEMML0_2rc],
(instregex "^(SUDOT|USDOT)_VG4_M4(ZZI|ZZ|Z4Z)_BToS(_PSEUDO)?$",
"^(SDOT|UDOT)_VG4_M4(ZZI|ZZ|Z4Z)_(BtoS|BToS|HtoS|HtoD|HToS|HtoS)(_PSEUDO)?",
"^(SMLAL|UMLAL|SMLSL|UMLSL)_VG4_M4",
"^(SMLALL|UMLALL|USMLALL|SMLSLL|UMLSLL)_(VG4_M4ZZI|VG4_M4ZZ|VG4_M4Z4Z)_(BtoS|HtoD)(_PSEUDO)?$",
"^(SUMLALL|USMLALL)_(VG4_M4ZZI|VG4_M4ZZ|VG4_M4Z4Z)_BtoS(_PSEUDO)?$")>;
def : InstRW<[C1UWrite_4c_1CMEMML0_1rc],
(instregex "^(FDOT|BFDOT|FMLA|FMLS|BFMLA|BFMLS)_VG2_M2(ZZI|ZZ|Z2Z)(_BtoH|_BtoS|_HtoS|_[HSD])?(_PSEUDO)?$",
"^(FMLAL|FMLSL|BFMLAL|BFMLSL)_VG2_M2(ZZI|ZZ|Z2Z)(_BtoH|_HtoS)?(_PSEUDO)?$",
"^FMLALL_VG2_M2(ZZI|ZZ|Z2Z)_BtoS(_PSEUDO)?$",
"^(FVDOT|BFVDOT)_VG2_M2ZZI_(HtoS|BtoH)(_PSEUDO)?$")>;
def : InstRW<[C1UWrite_4c_1CMEMML0_2rc],
(instregex "^(FDOT|BFDOT|FMLA|FMLS|BFMLA|BFMLS)_VG4_M4(ZZI|ZZ|Z4Z)(_BtoH|_BtoS|_HtoS|_[HSD])?(_PSEUDO)?$",
"^(FMLAL|FMLSL|BFMLAL|BFMLSL)_VG4_M4(ZZI|ZZ|Z4Z)(_BtoH|_HtoS)?(_PSEUDO)?$",
"^FMLALL_VG4_M4(ZZI|ZZ|Z4Z)_BtoS(_PSEUDO)?$",
"^FVDOT[BT]_VG4_M2ZZI_(BtoS|BtoH)(_PSEUDO)?$")>;
def : InstRW<[C1UWrite_4c_1CMEMML0_3rc],
(instregex "^(SUVDOT|USVDOT)_VG4_M4ZZI_")>;
def : InstRW<[C1UWrite_4c_1CMEMML0_4rc],
(instregex "^(SVDOT|UVDOT)_VG4_M4ZZI_")>;
// Streaming-only misc and ZA move instructions.
def : InstRW<[C1UWrite_4c_1CMEPERM],
(instregex "^(SUNPK|UUNPK)_VG2_2ZZ_", "^(ZIP|UZP)_VG2_2ZZZ")>;
def : InstRW<[C1UWrite_4c_1CMEPERM_2rc],
(instregex "^(SUNPK|UUNPK)_VG4_4Z2Z_",
"^(ZIP|UZP)_VG4_4Z4Z")>;
def : InstRW<[C1UWrite_4c_1CMEPERM],
(instregex "^SEL_VG2_2ZC2Z2Z_")>;
def : InstRW<[C1UWrite_5c_1CMEPERM_2rc],
(instregex "^SEL_VG4_4ZC4Z4Z_")>;
def : InstRW<[C1UWrite_5c_1CMEMML0_1rc],
(instregex "^MOVA_MXI2Z_", "^MOVA_VG2_MXI2Z(_PSEUDO)?$",
"^INSERT_MXIPZ")>;
def : InstRW<[C1UWrite_2c_1CMEMML0_2rc],
(instregex "^MOVA_MXI4Z_", "^MOVA_VG4_MXI4Z(_PSEUDO)?$")>;
def : InstRW<[C1UWrite_9c_1CMEMML1],
(instregex "^MOVA_2ZMXI_", "^EXTRACT_ZPMXI_")>;
def : InstRW<[C1UWrite_9c_1CMEMML1_2rc],
(instregex "^MOVA_4ZMXI_")>;
def : InstRW<[C1UWrite_9c_1CMEMML1_5rc],
(instregex "^MOVA_VG2_2ZMXI$")>;
def : InstRW<[C1UWrite_13c_1CMEMML1_1CMEPERMF_5rc],
(instregex "^MOVA_VG4_4ZMXI$")>;
def : InstRW<[C1UWrite_4c_1CMEPERMF_1rc],
(instrs MOVT_TIX)>;
def : InstRW<[C1UWrite_8c_1CMEPERMF_1CMEVX0ALU_1rc],
(instrs MOVT_XTI)>;
def : InstRW<[C1UWrite_4c_1CMEPERMF_1rc],
(instregex "^LUTI(2|4)?_(Z2ZZI|ZZZI|2ZZZ|ZTZI)")>;
def : InstRW<[C1UWrite_5c_1CMEPERMF_2rc],
(instregex "^LUTI[24](_S)?_2ZTZI_")>;
def : InstRW<[C1UWrite_7c_1CMEPERMF_4rc],
(instregex "^LUTI[24](_S)?_4ZTZI_")>;
def : InstRW<[C1UWrite_1c_1CMEMML0_2rc],
(instregex "^ZERO_M(_PSEUDO)?")>;
def : InstRW<[C1UWrite_1c_1CMERNMRET],
(instregex "^ZERO_T(_PSEUDO)?")>;
def : InstRW<[C1UWrite_2c_1CMELD],
(instregex "^LD(NT)?1(B|H|W|D)_2Z(_.*)?$",
"^LDR_(PPXI|TX(_PSEUDO)?)$",
"^LDR_ZZXI(_STRIDED_CONTIGUOUS)?$")>;
def : InstRW<[C1UWrite_2c_1CMELD_1rc],
// 3-reg fill pseudos expand to repeated 1-reg loads, so reuse the
// widest SME load bucket when there is no dedicated guide row.
(instregex "^LD(NT)?1(B|H|W|D)_4Z(_.*)?$",
"^LDR_ZZZXI$",
"^LDR_ZZZZXI(_STRIDED_CONTIGUOUS)?$")>;
def : InstRW<[C1UWrite_7c_1L_1CMELD],
(instregex "^LD1_MXIPXX_[HV](_PSEUDO)?_[BDHSQ]$")>;
def : InstRW<[C1UWrite_7c_1L_1CMELD],
(instregex "^LDR_ZA(_PSEUDO)?")>;
def : InstRW<[C1UWrite_2c_1CMEST],
(instregex "^([Ss][Tt](NT)?1([Bb]|[Hh]|[Ww]|[Dd]))_2[Zz](_.*)?$",
"^STR_(PPXI|TX(_PSEUDO)?)$",
"^STR_ZZXI(_STRIDED_CONTIGUOUS)?$")>;
def : InstRW<[C1UWrite_2c_1CMEST_1rc],
// 3-reg spill pseudos expand to repeated 1-reg stores, so reuse the
// widest SME store bucket when there is no dedicated guide row.
(instregex "^([Ss][Tt](NT)?1([Bb]|[Hh]|[Ww]|[Dd]))_4[Zz](_.*)?$",
"^STR_ZZZXI$",
"^STR_ZZZZXI(_STRIDED_CONTIGUOUS)?$")>;
def : InstRW<[C1UWrite_11c_1SA_1CMEST],
(instregex "^ST1_MXIPXX_[HV]_[BDHSQ]$")>;
def : InstRW<[C1UWrite_11c_1SA_1CMEST],
(instregex "^STR_ZA(_PSEUDO)?")>;
def : InstRW<[C1UWrite_2c_1CMEPF_2rc],
(instrs RPRFM)>;
}