1753f127fSDimitry Andric//=- AArch64SchedNeoverseN2.td - NeoverseN2 Scheduling Defs --*- tablegen -*-=// 2753f127fSDimitry Andric// 3753f127fSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4753f127fSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5753f127fSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6753f127fSDimitry Andric// 7753f127fSDimitry Andric//===----------------------------------------------------------------------===// 8753f127fSDimitry Andric// 9753f127fSDimitry Andric// This file defines the scheduling model for the Arm Neoverse N2 processors. 10753f127fSDimitry Andric// 11753f127fSDimitry Andric//===----------------------------------------------------------------------===// 12753f127fSDimitry Andric 13753f127fSDimitry Andricdef NeoverseN2Model : SchedMachineModel { 14753f127fSDimitry Andric let IssueWidth = 10; // Micro-ops dispatched at a time. 15753f127fSDimitry Andric let MicroOpBufferSize = 160; // Entries in micro-op re-order buffer. 16753f127fSDimitry Andric let LoadLatency = 4; // Optimistic load latency. 17753f127fSDimitry Andric let MispredictPenalty = 10; // Extra cycles for mispredicted branch. 18753f127fSDimitry Andric let LoopMicroOpBufferSize = 16; // NOTE: Copied from Cortex-A57. 19753f127fSDimitry Andric let CompleteModel = 1; 20753f127fSDimitry Andric 21bdd1243dSDimitry Andric list<Predicate> UnsupportedFeatures = !listconcat(SMEUnsupported.F, 224c2d3b02SDimitry Andric [HasSVE2p1, HasPAuthLR, HasCPA, HasCSSC]); 23753f127fSDimitry Andric} 24753f127fSDimitry Andric 25753f127fSDimitry Andric//===----------------------------------------------------------------------===// 26753f127fSDimitry Andric// Define each kind of processor resource and number available on Neoverse N2. 27753f127fSDimitry Andric// Instructions are first fetched and then decoded into internal macro-ops 28753f127fSDimitry Andric// (MOPs). From there, the MOPs proceed through register renaming and dispatch 29753f127fSDimitry Andric// stages. A MOP can be split into two micro-ops further down the pipeline 30753f127fSDimitry Andric// after the decode stage. Once dispatched, micro-ops wait for their operands 31753f127fSDimitry Andric// and issue out-of-order to one of thirteen issue pipelines. Each issue 32753f127fSDimitry Andric// pipeline can accept one micro-op per cycle. 33753f127fSDimitry Andric 34753f127fSDimitry Andriclet SchedModel = NeoverseN2Model in { 35753f127fSDimitry Andric 36753f127fSDimitry Andric// Define the (13) issue ports. 37753f127fSDimitry Andricdef N2UnitB : ProcResource<2>; // Branch 0/1 38753f127fSDimitry Andricdef N2UnitS : ProcResource<2>; // Integer single Cycle 0/1 39753f127fSDimitry Andricdef N2UnitM0 : ProcResource<1>; // Integer multicycle 0 40753f127fSDimitry Andricdef N2UnitM1 : ProcResource<1>; // Integer multicycle 1 41753f127fSDimitry Andricdef N2UnitL01 : ProcResource<2>; // Load/Store 0/1 42753f127fSDimitry Andricdef N2UnitL2 : ProcResource<1>; // Load 2 43753f127fSDimitry Andricdef N2UnitD : ProcResource<2>; // Store data 0/1 44753f127fSDimitry Andricdef N2UnitV0 : ProcResource<1>; // FP/ASIMD 0 45753f127fSDimitry Andricdef N2UnitV1 : ProcResource<1>; // FP/ASIMD 1 46753f127fSDimitry Andric 47753f127fSDimitry Andricdef N2UnitV : ProcResGroup<[N2UnitV0, N2UnitV1]>; // FP/ASIMD 0/1 48753f127fSDimitry Andricdef N2UnitM : ProcResGroup<[N2UnitM0, N2UnitM1]>; // Integer single/multicycle 0/1 49753f127fSDimitry Andricdef N2UnitL : ProcResGroup<[N2UnitL01, N2UnitL2]>; // Load/Store 0/1 and Load 2 50753f127fSDimitry Andricdef N2UnitI : ProcResGroup<[N2UnitS, N2UnitM0, N2UnitM1]>; // Integer single cycle 0/1 and single/multicycle 0/1 51753f127fSDimitry Andric 52753f127fSDimitry Andric// Define commonly used read types. 53753f127fSDimitry Andric 54753f127fSDimitry Andric// No forwarding is provided for these types. 55753f127fSDimitry Andricdef : ReadAdvance<ReadI, 0>; 56753f127fSDimitry Andricdef : ReadAdvance<ReadISReg, 0>; 57753f127fSDimitry Andricdef : ReadAdvance<ReadIEReg, 0>; 58753f127fSDimitry Andricdef : ReadAdvance<ReadIM, 0>; 59753f127fSDimitry Andricdef : ReadAdvance<ReadIMA, 0>; 60753f127fSDimitry Andricdef : ReadAdvance<ReadID, 0>; 61753f127fSDimitry Andricdef : ReadAdvance<ReadExtrHi, 0>; 62753f127fSDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>; 63753f127fSDimitry Andricdef : ReadAdvance<ReadST, 0>; 64753f127fSDimitry Andricdef : ReadAdvance<ReadVLD, 0>; 65753f127fSDimitry Andric 66753f127fSDimitry Andricdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; } 67753f127fSDimitry Andricdef : WriteRes<WriteBarrier, []> { let Latency = 1; } 68753f127fSDimitry Andricdef : WriteRes<WriteHint, []> { let Latency = 1; } 69753f127fSDimitry Andricdef : WriteRes<WriteLDHi, []> { let Latency = 4; } 70753f127fSDimitry Andric 71753f127fSDimitry Andric//===----------------------------------------------------------------------===// 72753f127fSDimitry Andric// Define customized scheduler read/write types specific to the Neoverse N2. 73753f127fSDimitry Andric 74753f127fSDimitry Andric//===----------------------------------------------------------------------===// 75753f127fSDimitry Andric// Define generic 1 micro-op types 76753f127fSDimitry Andric 77753f127fSDimitry Andricdef N2Write_1cyc_1B : SchedWriteRes<[N2UnitB]> { let Latency = 1; } 78753f127fSDimitry Andricdef N2Write_1cyc_1I : SchedWriteRes<[N2UnitI]> { let Latency = 1; } 79753f127fSDimitry Andricdef N2Write_1cyc_1M : SchedWriteRes<[N2UnitM]> { let Latency = 1; } 80753f127fSDimitry Andricdef N2Write_1cyc_1M0 : SchedWriteRes<[N2UnitM0]> { let Latency = 1; } 81753f127fSDimitry Andricdef N2Write_1cyc_1L01 : SchedWriteRes<[N2UnitL01]> { let Latency = 1; } 82753f127fSDimitry Andricdef N2Write_2cyc_1M : SchedWriteRes<[N2UnitM]> { let Latency = 2; } 83753f127fSDimitry Andricdef N2Write_3cyc_1M : SchedWriteRes<[N2UnitM]> { let Latency = 3; } 84753f127fSDimitry Andricdef N2Write_2cyc_1M0 : SchedWriteRes<[N2UnitM0]> { let Latency = 2; 855f757f3fSDimitry Andric let ReleaseAtCycles = [2]; } 86753f127fSDimitry Andricdef N2Write_3cyc_1M0 : SchedWriteRes<[N2UnitM0]> { let Latency = 3; 875f757f3fSDimitry Andric let ReleaseAtCycles = [3]; } 88753f127fSDimitry Andricdef N2Write_5cyc_1M0 : SchedWriteRes<[N2UnitM0]> { let Latency = 5; 895f757f3fSDimitry Andric let ReleaseAtCycles = [5]; } 90753f127fSDimitry Andricdef N2Write_12cyc_1M0 : SchedWriteRes<[N2UnitM0]> { let Latency = 12; 915f757f3fSDimitry Andric let ReleaseAtCycles = [12]; } 92753f127fSDimitry Andricdef N2Write_20cyc_1M0 : SchedWriteRes<[N2UnitM0]> { let Latency = 20; 935f757f3fSDimitry Andric let ReleaseAtCycles = [20]; } 94753f127fSDimitry Andricdef N2Write_4cyc_1L : SchedWriteRes<[N2UnitL]> { let Latency = 4; } 95753f127fSDimitry Andricdef N2Write_6cyc_1L : SchedWriteRes<[N2UnitL]> { let Latency = 6; } 96753f127fSDimitry Andricdef N2Write_2cyc_1V : SchedWriteRes<[N2UnitV]> { let Latency = 2; } 97753f127fSDimitry Andricdef N2Write_3cyc_1V : SchedWriteRes<[N2UnitV]> { let Latency = 3; } 98753f127fSDimitry Andricdef N2Write_4cyc_1V : SchedWriteRes<[N2UnitV]> { let Latency = 4; } 99753f127fSDimitry Andricdef N2Write_5cyc_1V : SchedWriteRes<[N2UnitV]> { let Latency = 5; } 100753f127fSDimitry Andricdef N2Write_12cyc_1V : SchedWriteRes<[N2UnitV]> { let Latency = 12; } 101753f127fSDimitry Andricdef N2Write_2cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 2; } 102753f127fSDimitry Andricdef N2Write_3cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 3; } 103753f127fSDimitry Andricdef N2Write_4cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 4; } 104753f127fSDimitry Andricdef N2Write_7cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 7; 1055f757f3fSDimitry Andric let ReleaseAtCycles = [7]; } 106753f127fSDimitry Andricdef N2Write_9cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 9; } 107753f127fSDimitry Andricdef N2Write_10cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 10; } 108753f127fSDimitry Andricdef N2Write_12cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 12; } 109753f127fSDimitry Andricdef N2Write_13cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 13; } 110753f127fSDimitry Andricdef N2Write_15cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 15; } 111753f127fSDimitry Andricdef N2Write_16cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 16; } 112753f127fSDimitry Andricdef N2Write_20cyc_1V0 : SchedWriteRes<[N2UnitV0]> { let Latency = 20; } 113753f127fSDimitry Andricdef N2Write_2cyc_1V1 : SchedWriteRes<[N2UnitV1]> { let Latency = 2; } 114753f127fSDimitry Andricdef N2Write_3cyc_1V1 : SchedWriteRes<[N2UnitV1]> { let Latency = 3; } 115753f127fSDimitry Andricdef N2Write_4cyc_1V1 : SchedWriteRes<[N2UnitV1]> { let Latency = 4; } 116753f127fSDimitry Andricdef N2Write_6cyc_1V1 : SchedWriteRes<[N2UnitV1]> { let Latency = 6; } 117753f127fSDimitry Andricdef N2Write_10cyc_1V1 : SchedWriteRes<[N2UnitV1]> { let Latency = 10; } 118753f127fSDimitry Andricdef N2Write_6cyc_1L01 : SchedWriteRes<[N2UnitL01]> { let Latency = 6; } 119753f127fSDimitry Andric 120753f127fSDimitry Andric//===----------------------------------------------------------------------===// 121753f127fSDimitry Andric// Define generic 2 micro-op types 122753f127fSDimitry Andric 123753f127fSDimitry Andricdef N2Write_1cyc_1B_1S : SchedWriteRes<[N2UnitB, N2UnitS]> { 124753f127fSDimitry Andric let Latency = 1; 125753f127fSDimitry Andric let NumMicroOps = 2; 126753f127fSDimitry Andric} 127753f127fSDimitry Andric 128753f127fSDimitry Andricdef N2Write_6cyc_1M0_1B : SchedWriteRes<[N2UnitM0, N2UnitB]> { 129753f127fSDimitry Andric let Latency = 6; 130753f127fSDimitry Andric let NumMicroOps = 2; 131753f127fSDimitry Andric} 132753f127fSDimitry Andric 133753f127fSDimitry Andricdef N2Write_9cyc_1M0_1L : SchedWriteRes<[N2UnitM0, N2UnitL]> { 134753f127fSDimitry Andric let Latency = 9; 135753f127fSDimitry Andric let NumMicroOps = 2; 136753f127fSDimitry Andric} 137753f127fSDimitry Andric 138753f127fSDimitry Andricdef N2Write_3cyc_1I_1M : SchedWriteRes<[N2UnitI, N2UnitM]> { 139753f127fSDimitry Andric let Latency = 3; 140753f127fSDimitry Andric let NumMicroOps = 2; 141753f127fSDimitry Andric} 142753f127fSDimitry Andric 143753f127fSDimitry Andricdef N2Write_4cyc_1I_1L : SchedWriteRes<[N2UnitI, N2UnitL]> { 144753f127fSDimitry Andric let Latency = 4; 145753f127fSDimitry Andric let NumMicroOps = 2; 146753f127fSDimitry Andric} 147753f127fSDimitry Andric 148753f127fSDimitry Andricdef N2Write_5cyc_1I_1L : SchedWriteRes<[N2UnitI, N2UnitL]> { 149753f127fSDimitry Andric let Latency = 5; 150753f127fSDimitry Andric let NumMicroOps = 2; 151753f127fSDimitry Andric} 152753f127fSDimitry Andric 153753f127fSDimitry Andricdef N2Write_6cyc_1I_1L : SchedWriteRes<[N2UnitI, N2UnitL]> { 154753f127fSDimitry Andric let Latency = 6; 155753f127fSDimitry Andric let NumMicroOps = 2; 156753f127fSDimitry Andric} 157753f127fSDimitry Andric 158753f127fSDimitry Andricdef N2Write_7cyc_1I_1L : SchedWriteRes<[N2UnitI, N2UnitL]> { 159753f127fSDimitry Andric let Latency = 7; 160753f127fSDimitry Andric let NumMicroOps = 2; 161753f127fSDimitry Andric} 162753f127fSDimitry Andric 163753f127fSDimitry Andricdef N2Write_1cyc_1L01_1D : SchedWriteRes<[N2UnitL01, N2UnitD]> { 164753f127fSDimitry Andric let Latency = 1; 165753f127fSDimitry Andric let NumMicroOps = 2; 166753f127fSDimitry Andric} 167753f127fSDimitry Andric 168753f127fSDimitry Andricdef N2Write_5cyc_1M0_1V : SchedWriteRes<[N2UnitM0, N2UnitV]> { 169753f127fSDimitry Andric let Latency = 5; 170753f127fSDimitry Andric let NumMicroOps = 2; 171753f127fSDimitry Andric} 172753f127fSDimitry Andric 173753f127fSDimitry Andricdef N2Write_2cyc_1L01_1V : SchedWriteRes<[N2UnitL01, N2UnitV]> { 174753f127fSDimitry Andric let Latency = 2; 175753f127fSDimitry Andric let NumMicroOps = 2; 176753f127fSDimitry Andric} 177753f127fSDimitry Andric 178753f127fSDimitry Andricdef N2Write_4cyc_1V1_1V : SchedWriteRes<[N2UnitV1, N2UnitV]> { 179753f127fSDimitry Andric let Latency = 4; 180753f127fSDimitry Andric let NumMicroOps = 2; 181753f127fSDimitry Andric} 182753f127fSDimitry Andric 183753f127fSDimitry Andricdef N2Write_4cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> { 184753f127fSDimitry Andric let Latency = 4; 185753f127fSDimitry Andric let NumMicroOps = 2; 186753f127fSDimitry Andric} 187753f127fSDimitry Andric 188753f127fSDimitry Andricdef N2Write_10cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> { 189753f127fSDimitry Andric let Latency = 10; 190753f127fSDimitry Andric let NumMicroOps = 2; 1915f757f3fSDimitry Andric let ReleaseAtCycles = [5, 5]; 192753f127fSDimitry Andric} 193753f127fSDimitry Andric 194753f127fSDimitry Andricdef N2Write_13cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> { 195753f127fSDimitry Andric let Latency = 13; 196753f127fSDimitry Andric let NumMicroOps = 2; 1975f757f3fSDimitry Andric let ReleaseAtCycles = [6, 7]; 198753f127fSDimitry Andric} 199753f127fSDimitry Andric 200753f127fSDimitry Andricdef N2Write_15cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> { 201753f127fSDimitry Andric let Latency = 15; 202753f127fSDimitry Andric let NumMicroOps = 2; 2035f757f3fSDimitry Andric let ReleaseAtCycles = [7, 8]; 204753f127fSDimitry Andric} 205753f127fSDimitry Andric 206753f127fSDimitry Andricdef N2Write_16cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> { 207753f127fSDimitry Andric let Latency = 16; 208753f127fSDimitry Andric let NumMicroOps = 2; 2095f757f3fSDimitry Andric let ReleaseAtCycles = [8, 8]; 210753f127fSDimitry Andric} 211753f127fSDimitry Andric 212753f127fSDimitry Andricdef N2Write_4cyc_2V : SchedWriteRes<[N2UnitV, N2UnitV]> { 213753f127fSDimitry Andric let Latency = 4; 214753f127fSDimitry Andric let NumMicroOps = 2; 215753f127fSDimitry Andric} 216753f127fSDimitry Andric 217753f127fSDimitry Andricdef N2Write_6cyc_2V : SchedWriteRes<[N2UnitV, N2UnitV]> { 218753f127fSDimitry Andric let Latency = 6; 219753f127fSDimitry Andric let NumMicroOps = 2; 220753f127fSDimitry Andric} 221753f127fSDimitry Andric 222753f127fSDimitry Andricdef N2Write_6cyc_2L : SchedWriteRes<[N2UnitL, N2UnitL]> { 223753f127fSDimitry Andric let Latency = 6; 224753f127fSDimitry Andric let NumMicroOps = 2; 225753f127fSDimitry Andric} 226753f127fSDimitry Andric 227753f127fSDimitry Andricdef N2Write_8cyc_1L_1V : SchedWriteRes<[N2UnitL, N2UnitV]> { 228753f127fSDimitry Andric let Latency = 8; 229753f127fSDimitry Andric let NumMicroOps = 2; 230753f127fSDimitry Andric} 231753f127fSDimitry Andric 232753f127fSDimitry Andricdef N2Write_4cyc_1L01_1V : SchedWriteRes<[N2UnitL01, N2UnitV]> { 233753f127fSDimitry Andric let Latency = 4; 234753f127fSDimitry Andric let NumMicroOps = 2; 235753f127fSDimitry Andric} 236753f127fSDimitry Andric 237753f127fSDimitry Andricdef N2Write_3cyc_1M0_1M : SchedWriteRes<[N2UnitM0, N2UnitM]> { 238753f127fSDimitry Andric let Latency = 3; 239753f127fSDimitry Andric let NumMicroOps = 2; 240753f127fSDimitry Andric} 241753f127fSDimitry Andric 242753f127fSDimitry Andricdef N2Write_2cyc_1M0_1M : SchedWriteRes<[N2UnitM0, N2UnitM]> { 243753f127fSDimitry Andric let Latency = 2; 244753f127fSDimitry Andric let NumMicroOps = 2; 245753f127fSDimitry Andric} 246753f127fSDimitry Andric 247753f127fSDimitry Andricdef N2Write_6cyc_2V1 : SchedWriteRes<[N2UnitV1, N2UnitV1]> { 248753f127fSDimitry Andric let Latency = 6; 249753f127fSDimitry Andric let NumMicroOps = 2; 250753f127fSDimitry Andric} 251753f127fSDimitry Andric 252753f127fSDimitry Andricdef N2Write_4cyc_1V0_1M : SchedWriteRes<[N2UnitV0, N2UnitM]> { 253753f127fSDimitry Andric let Latency = 4; 254753f127fSDimitry Andric let NumMicroOps = 2; 255753f127fSDimitry Andric} 256753f127fSDimitry Andric 257753f127fSDimitry Andricdef N2Write_5cyc_2V0 : SchedWriteRes<[N2UnitV0, N2UnitV0]> { 258753f127fSDimitry Andric let Latency = 5; 259753f127fSDimitry Andric let NumMicroOps = 2; 260753f127fSDimitry Andric} 261753f127fSDimitry Andric 262753f127fSDimitry Andricdef N2Write_5cyc_1V1_1M0 : SchedWriteRes<[N2UnitV1, N2UnitM0]> { 263753f127fSDimitry Andric let Latency = 5; 264753f127fSDimitry Andric let NumMicroOps = 2; 265753f127fSDimitry Andric} 266753f127fSDimitry Andric 267753f127fSDimitry Andricdef N2Write_7cyc_1M0_1V0 : SchedWriteRes<[N2UnitM0, N2UnitV0]> { 268753f127fSDimitry Andric let Latency = 7; 269753f127fSDimitry Andric let NumMicroOps = 2; 270753f127fSDimitry Andric} 271753f127fSDimitry Andric 272753f127fSDimitry Andricdef N2Write_2cyc_1V0_1M : SchedWriteRes<[N2UnitV0, N2UnitM]> { 273753f127fSDimitry Andric let Latency = 2; 274753f127fSDimitry Andric let NumMicroOps = 2; 275753f127fSDimitry Andric} 276753f127fSDimitry Andric 277753f127fSDimitry Andricdef N2Write_6cyc_1V_1V1 : SchedWriteRes<[N2UnitV, N2UnitV1]> { 278753f127fSDimitry Andric let Latency = 6; 279753f127fSDimitry Andric let NumMicroOps = 2; 280753f127fSDimitry Andric} 281753f127fSDimitry Andric 282753f127fSDimitry Andricdef N2Write_6cyc_1L_1M : SchedWriteRes<[N2UnitL, N2UnitM]> { 283753f127fSDimitry Andric let Latency = 6; 284753f127fSDimitry Andric let NumMicroOps = 2; 285753f127fSDimitry Andric} 286753f127fSDimitry Andric 287753f127fSDimitry Andricdef N2Write_6cyc_1L_1S : SchedWriteRes<[N2UnitL, N2UnitS]> { 288753f127fSDimitry Andric let Latency = 6; 289753f127fSDimitry Andric let NumMicroOps = 2; 290753f127fSDimitry Andric} 291753f127fSDimitry Andric 292753f127fSDimitry Andricdef N2Write_9cyc_1L_1V : SchedWriteRes<[N2UnitL, N2UnitV]> { 293753f127fSDimitry Andric let Latency = 9; 294753f127fSDimitry Andric let NumMicroOps = 2; 295753f127fSDimitry Andric} 296753f127fSDimitry Andric 297753f127fSDimitry Andricdef N2Write_4cyc_2V1 : SchedWriteRes<[N2UnitV1, N2UnitV1]> { 298753f127fSDimitry Andric let Latency = 4; 299753f127fSDimitry Andric let NumMicroOps = 2; 300753f127fSDimitry Andric} 301753f127fSDimitry Andric 302753f127fSDimitry Andric//===----------------------------------------------------------------------===// 303753f127fSDimitry Andric// Define generic 3 micro-op types 304753f127fSDimitry Andric 305753f127fSDimitry Andricdef N2Write_1cyc_1L01_1D_1I : SchedWriteRes<[N2UnitL01, N2UnitD, N2UnitI]> { 306753f127fSDimitry Andric let Latency = 1; 307753f127fSDimitry Andric let NumMicroOps = 3; 308753f127fSDimitry Andric} 309753f127fSDimitry Andric 310753f127fSDimitry Andricdef N2Write_2cyc_1L01_1V_1I : SchedWriteRes<[N2UnitL01, N2UnitV, N2UnitI]> { 311753f127fSDimitry Andric let Latency = 2; 312753f127fSDimitry Andric let NumMicroOps = 3; 313753f127fSDimitry Andric} 314753f127fSDimitry Andric 315753f127fSDimitry Andricdef N2Write_2cyc_1L01_2V : SchedWriteRes<[N2UnitL01, N2UnitV, N2UnitV]> { 316753f127fSDimitry Andric let Latency = 2; 317753f127fSDimitry Andric let NumMicroOps = 3; 318753f127fSDimitry Andric} 319753f127fSDimitry Andric 320753f127fSDimitry Andricdef N2Write_7cyc_1M_1M0_1V : SchedWriteRes<[N2UnitM, N2UnitM0, N2UnitV]> { 321753f127fSDimitry Andric let Latency = 7; 322753f127fSDimitry Andric let NumMicroOps = 3; 323753f127fSDimitry Andric} 324753f127fSDimitry Andric 325753f127fSDimitry Andricdef N2Write_8cyc_1M0_1V1_1V : SchedWriteRes<[N2UnitM0, N2UnitV1, N2UnitV]> { 326753f127fSDimitry Andric let Latency = 8; 327753f127fSDimitry Andric let NumMicroOps = 3; 328753f127fSDimitry Andric} 329753f127fSDimitry Andric 330753f127fSDimitry Andricdef N2Write_10cyc_1V_1L_1S : SchedWriteRes<[N2UnitV, N2UnitL, N2UnitL]> { 331753f127fSDimitry Andric let Latency = 10; 332753f127fSDimitry Andric let NumMicroOps = 3; 333753f127fSDimitry Andric} 334753f127fSDimitry Andric 335753f127fSDimitry Andricdef N2Write_2cyc_1L01_1S_1V : SchedWriteRes<[N2UnitL01, N2UnitS, N2UnitV]> { 336753f127fSDimitry Andric let Latency = 2; 337753f127fSDimitry Andric let NumMicroOps = 3; 338753f127fSDimitry Andric} 339753f127fSDimitry Andric 340753f127fSDimitry Andricdef N2Write_4cyc_1L01_1S_1V : SchedWriteRes<[N2UnitL01, N2UnitS, N2UnitV]> { 341753f127fSDimitry Andric let Latency = 4; 342753f127fSDimitry Andric let NumMicroOps = 3; 343753f127fSDimitry Andric} 344753f127fSDimitry Andric 345753f127fSDimitry Andricdef N2Write_6cyc_3L : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL]> { 346753f127fSDimitry Andric let Latency = 6; 347753f127fSDimitry Andric let NumMicroOps = 3; 348753f127fSDimitry Andric} 349753f127fSDimitry Andric 350753f127fSDimitry Andricdef N2Write_8cyc_1L_2V : SchedWriteRes<[N2UnitL, N2UnitV, N2UnitV]> { 351753f127fSDimitry Andric let Latency = 8; 352753f127fSDimitry Andric let NumMicroOps = 3; 353753f127fSDimitry Andric} 354753f127fSDimitry Andric 355753f127fSDimitry Andric//===----------------------------------------------------------------------===// 356753f127fSDimitry Andric// Define generic 4 micro-op types 357753f127fSDimitry Andric 358753f127fSDimitry Andricdef N2Write_2cyc_1L01_2V_1I : SchedWriteRes<[N2UnitL01, N2UnitV, N2UnitV, 359753f127fSDimitry Andric N2UnitI]> { 360753f127fSDimitry Andric let Latency = 2; 361753f127fSDimitry Andric let NumMicroOps = 4; 362753f127fSDimitry Andric} 363753f127fSDimitry Andric 364753f127fSDimitry Andricdef N2Write_6cyc_4V0 : SchedWriteRes<[N2UnitV0, N2UnitV0, N2UnitV0, N2UnitV0]> { 365753f127fSDimitry Andric let Latency = 6; 366753f127fSDimitry Andric let NumMicroOps = 4; 367753f127fSDimitry Andric} 368753f127fSDimitry Andric 369753f127fSDimitry Andricdef N2Write_4cyc_4V : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV, N2UnitV]> { 370753f127fSDimitry Andric let Latency = 4; 371753f127fSDimitry Andric let NumMicroOps = 4; 372753f127fSDimitry Andric} 373753f127fSDimitry Andric 374753f127fSDimitry Andricdef N2Write_6cyc_4V : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV, N2UnitV]> { 375753f127fSDimitry Andric let Latency = 6; 376753f127fSDimitry Andric let NumMicroOps = 4; 377753f127fSDimitry Andric} 378753f127fSDimitry Andric 379753f127fSDimitry Andricdef N2Write_8cyc_2L_2V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitV, N2UnitV]> { 380753f127fSDimitry Andric let Latency = 8; 381753f127fSDimitry Andric let NumMicroOps = 4; 382753f127fSDimitry Andric} 383753f127fSDimitry Andric 384753f127fSDimitry Andricdef N2Write_9cyc_2L_2V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitV, N2UnitV]> { 385753f127fSDimitry Andric let Latency = 9; 386753f127fSDimitry Andric let NumMicroOps = 4; 387753f127fSDimitry Andric} 388753f127fSDimitry Andric 389753f127fSDimitry Andricdef N2Write_2cyc_2L01_2V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitV, 390753f127fSDimitry Andric N2UnitV]> { 391753f127fSDimitry Andric let Latency = 2; 392753f127fSDimitry Andric let NumMicroOps = 4; 393753f127fSDimitry Andric} 394753f127fSDimitry Andric 395753f127fSDimitry Andricdef N2Write_4cyc_2L01_2V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitV, 396753f127fSDimitry Andric N2UnitV]> { 397753f127fSDimitry Andric let Latency = 4; 398753f127fSDimitry Andric let NumMicroOps = 4; 399753f127fSDimitry Andric} 400753f127fSDimitry Andric 401753f127fSDimitry Andricdef N2Write_5cyc_2L01_2V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitV, 402753f127fSDimitry Andric N2UnitV]> { 403753f127fSDimitry Andric let Latency = 5; 404753f127fSDimitry Andric let NumMicroOps = 4; 405753f127fSDimitry Andric} 406753f127fSDimitry Andric 407753f127fSDimitry Andricdef N2Write_8cyc_2M0_2V0 : SchedWriteRes<[N2UnitM0, N2UnitM0, N2UnitV0, 408753f127fSDimitry Andric N2UnitV0]> { 409753f127fSDimitry Andric let Latency = 8; 410753f127fSDimitry Andric let NumMicroOps = 4; 411753f127fSDimitry Andric} 412753f127fSDimitry Andric 413753f127fSDimitry Andricdef N2Write_11cyc_2V_2V1 : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV1, 414753f127fSDimitry Andric N2UnitV1]> { 415753f127fSDimitry Andric let Latency = 11; 416753f127fSDimitry Andric let NumMicroOps = 4; 417753f127fSDimitry Andric} 418753f127fSDimitry Andric 419753f127fSDimitry Andricdef N2Write_9cyc_2V_2V1 : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV1, 420753f127fSDimitry Andric N2UnitV1]> { 421753f127fSDimitry Andric let Latency = 9; 422753f127fSDimitry Andric let NumMicroOps = 4; 423753f127fSDimitry Andric} 424753f127fSDimitry Andric 425753f127fSDimitry Andricdef N2Write_8cyc_2V_2V1 : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV1, 426753f127fSDimitry Andric N2UnitV1]> { 427753f127fSDimitry Andric let Latency = 8; 428753f127fSDimitry Andric let NumMicroOps = 4; 429753f127fSDimitry Andric} 430753f127fSDimitry Andric 431753f127fSDimitry Andricdef N2Write_10cyc_2L_2V1 : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV1, 432753f127fSDimitry Andric N2UnitV1]> { 433753f127fSDimitry Andric let Latency = 10; 434753f127fSDimitry Andric let NumMicroOps = 4; 435753f127fSDimitry Andric} 436753f127fSDimitry Andric 437753f127fSDimitry Andricdef N2Write_10cyc_2L_2V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitV, N2UnitV]> { 438753f127fSDimitry Andric let Latency = 10; 439753f127fSDimitry Andric let NumMicroOps = 4; 440753f127fSDimitry Andric} 441753f127fSDimitry Andric 442753f127fSDimitry Andricdef N2Write_4cyc_2M0_2M : SchedWriteRes<[N2UnitM0, N2UnitM0, N2UnitM, 443753f127fSDimitry Andric N2UnitM]> { 444753f127fSDimitry Andric let Latency = 4; 445753f127fSDimitry Andric let NumMicroOps = 4; 446753f127fSDimitry Andric} 447753f127fSDimitry Andric 448753f127fSDimitry Andricdef N2Write_6cyc_2I_2L : SchedWriteRes<[N2UnitI, N2UnitI, N2UnitL, N2UnitL]> { 449753f127fSDimitry Andric let Latency = 6; 450753f127fSDimitry Andric let NumMicroOps = 4; 451753f127fSDimitry Andric} 452753f127fSDimitry Andric 453753f127fSDimitry Andricdef N2Write_7cyc_4L : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL, N2UnitL]> { 454753f127fSDimitry Andric let Latency = 7; 455753f127fSDimitry Andric let NumMicroOps = 4; 456753f127fSDimitry Andric} 457753f127fSDimitry Andric 458753f127fSDimitry Andric//===----------------------------------------------------------------------===// 459753f127fSDimitry Andric// Define generic 5 micro-op types 460753f127fSDimitry Andric 461753f127fSDimitry Andricdef N2Write_2cyc_1L01_2V_2I : SchedWriteRes<[N2UnitL01, N2UnitV, N2UnitV, 462753f127fSDimitry Andric N2UnitI, N2UnitI]> { 463753f127fSDimitry Andric let Latency = 2; 464753f127fSDimitry Andric let NumMicroOps = 5; 465753f127fSDimitry Andric} 466753f127fSDimitry Andric 467753f127fSDimitry Andricdef N2Write_8cyc_2L_3V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitV, N2UnitV, 468753f127fSDimitry Andric N2UnitV]> { 469753f127fSDimitry Andric let Latency = 8; 470753f127fSDimitry Andric let NumMicroOps = 5; 471753f127fSDimitry Andric} 472753f127fSDimitry Andric 473753f127fSDimitry Andric//===----------------------------------------------------------------------===// 474753f127fSDimitry Andric// Define generic 6 micro-op types 475753f127fSDimitry Andric 476753f127fSDimitry Andricdef N2Write_8cyc_3L_3V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL, 477753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV]> { 478753f127fSDimitry Andric let Latency = 8; 479753f127fSDimitry Andric let NumMicroOps = 6; 480753f127fSDimitry Andric} 481753f127fSDimitry Andric 482753f127fSDimitry Andricdef N2Write_2cyc_3L01_3V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01, 483753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV]> { 484753f127fSDimitry Andric let Latency = 2; 485753f127fSDimitry Andric let NumMicroOps = 6; 486753f127fSDimitry Andric} 487753f127fSDimitry Andric 488753f127fSDimitry Andricdef N2Write_6cyc_3L01_3V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01, 489753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV]> { 490753f127fSDimitry Andric let Latency = 6; 491753f127fSDimitry Andric let NumMicroOps = 6; 492753f127fSDimitry Andric} 493753f127fSDimitry Andric 494753f127fSDimitry Andricdef N2Write_4cyc_3L01_3V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01, 495753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV]> { 496753f127fSDimitry Andric let Latency = 4; 497753f127fSDimitry Andric let NumMicroOps = 6; 498753f127fSDimitry Andric} 499753f127fSDimitry Andric 500753f127fSDimitry Andricdef N2Write_10cyc_2L_2V_2S : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitV, N2UnitV, 501753f127fSDimitry Andric N2UnitS, N2UnitS]> { 502753f127fSDimitry Andric let Latency = 10; 503753f127fSDimitry Andric let NumMicroOps = 6; 504753f127fSDimitry Andric} 505753f127fSDimitry Andric 506753f127fSDimitry Andric//===----------------------------------------------------------------------===// 507753f127fSDimitry Andric// Define generic 7 micro-op types 508753f127fSDimitry Andric 509753f127fSDimitry Andricdef N2Write_8cyc_3L_4V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL, 510753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV, N2UnitV]> { 511753f127fSDimitry Andric let Latency = 8; 512753f127fSDimitry Andric let NumMicroOps = 7; 513753f127fSDimitry Andric} 514753f127fSDimitry Andric 515753f127fSDimitry Andric//===----------------------------------------------------------------------===// 516753f127fSDimitry Andric// Define generic 8 micro-op types 517753f127fSDimitry Andric 518753f127fSDimitry Andricdef N2Write_6cyc_8V : SchedWriteRes<[N2UnitV, N2UnitV, N2UnitV, N2UnitV, 519753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV, N2UnitV]> { 520753f127fSDimitry Andric let Latency = 6; 521753f127fSDimitry Andric let NumMicroOps = 8; 522753f127fSDimitry Andric} 523753f127fSDimitry Andric 524753f127fSDimitry Andricdef N2Write_2cyc_4L01_4V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01, 525753f127fSDimitry Andric N2UnitL01, N2UnitV, N2UnitV, N2UnitV, 526753f127fSDimitry Andric N2UnitV]> { 527753f127fSDimitry Andric let Latency = 2; 528753f127fSDimitry Andric let NumMicroOps = 8; 529753f127fSDimitry Andric} 530753f127fSDimitry Andric 531753f127fSDimitry Andricdef N2Write_5cyc_4L01_4V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01, 532753f127fSDimitry Andric N2UnitL01, N2UnitV, N2UnitV, N2UnitV, 533753f127fSDimitry Andric N2UnitV]> { 534753f127fSDimitry Andric let Latency = 5; 535753f127fSDimitry Andric let NumMicroOps = 8; 536753f127fSDimitry Andric} 537753f127fSDimitry Andric 538753f127fSDimitry Andricdef N2Write_8cyc_4L_4V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL, N2UnitL, 539753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV, N2UnitV]> { 540753f127fSDimitry Andric let Latency = 8; 541753f127fSDimitry Andric let NumMicroOps = 8; 542753f127fSDimitry Andric} 543753f127fSDimitry Andric 544753f127fSDimitry Andricdef N2Write_9cyc_4L_4V : SchedWriteRes<[N2UnitL, N2UnitL, N2UnitL, N2UnitL, 545753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV, N2UnitV]> { 546753f127fSDimitry Andric let Latency = 9; 547753f127fSDimitry Andric let NumMicroOps = 8; 548753f127fSDimitry Andric} 549753f127fSDimitry Andric 550753f127fSDimitry Andric//===----------------------------------------------------------------------===// 551753f127fSDimitry Andric// Define generic 10 micro-op types 552753f127fSDimitry Andric 553753f127fSDimitry Andricdef N2Write_7cyc_5L01_5V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01, 554753f127fSDimitry Andric N2UnitL01, N2UnitL01, N2UnitV, 555753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV, N2UnitV]> { 556753f127fSDimitry Andric let Latency = 7; 557753f127fSDimitry Andric let NumMicroOps = 10; 558753f127fSDimitry Andric} 559753f127fSDimitry Andric 560753f127fSDimitry Andric//===----------------------------------------------------------------------===// 561753f127fSDimitry Andric// Define generic 12 micro-op types 562753f127fSDimitry Andric 563753f127fSDimitry Andricdef N2Write_7cyc_6L01_6V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01, 564753f127fSDimitry Andric N2UnitL01, N2UnitL01, N2UnitL01, 565753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV, N2UnitV, 566753f127fSDimitry Andric N2UnitV, N2UnitV]> { 567753f127fSDimitry Andric let Latency = 7; 568753f127fSDimitry Andric let NumMicroOps = 12; 569753f127fSDimitry Andric} 570753f127fSDimitry Andric 571753f127fSDimitry Andric//===----------------------------------------------------------------------===// 572753f127fSDimitry Andric// Define generic 15 micro-op types 573753f127fSDimitry Andric 574753f127fSDimitry Andricdef N2Write_7cyc_5L01_5S_5V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01, 575753f127fSDimitry Andric N2UnitL01, N2UnitL01, N2UnitS, 576753f127fSDimitry Andric N2UnitS, N2UnitS, N2UnitS, 577753f127fSDimitry Andric N2UnitS, N2UnitV, N2UnitV, 578753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV]> { 579753f127fSDimitry Andric let Latency = 7; 580753f127fSDimitry Andric let NumMicroOps = 15; 581753f127fSDimitry Andric} 582753f127fSDimitry Andric 583753f127fSDimitry Andric//===----------------------------------------------------------------------===// 584753f127fSDimitry Andric// Define generic 18 micro-op types 585753f127fSDimitry Andric 586753f127fSDimitry Andricdef N2Write_11cyc_9L01_9V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01, 587753f127fSDimitry Andric N2UnitL01, N2UnitL01, N2UnitL01, 588753f127fSDimitry Andric N2UnitL01, N2UnitL01, N2UnitL01, 589753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV, 590753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV, 591753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV]> { 592753f127fSDimitry Andric let Latency = 11; 593753f127fSDimitry Andric let NumMicroOps = 18; 594753f127fSDimitry Andric} 595753f127fSDimitry Andric 596753f127fSDimitry Andric//===----------------------------------------------------------------------===// 597753f127fSDimitry Andric// Define generic 27 micro-op types 598753f127fSDimitry Andric 599753f127fSDimitry Andricdef N2Write_11cyc_9L01_9S_9V : SchedWriteRes<[N2UnitL01, N2UnitL01, N2UnitL01, 600753f127fSDimitry Andric N2UnitL01, N2UnitL01, N2UnitL01, 601753f127fSDimitry Andric N2UnitL01, N2UnitL01, N2UnitL01, 602753f127fSDimitry Andric N2UnitS, N2UnitS, N2UnitS, 603753f127fSDimitry Andric N2UnitS, N2UnitS, N2UnitS, 604753f127fSDimitry Andric N2UnitS, N2UnitS, N2UnitS, 605753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV, 606753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV, 607753f127fSDimitry Andric N2UnitV, N2UnitV, N2UnitV]> { 608753f127fSDimitry Andric let Latency = 11; 609753f127fSDimitry Andric let NumMicroOps = 27; 610753f127fSDimitry Andric} 611753f127fSDimitry Andric 61206c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 61306c3fb27SDimitry Andric// Define types for arithmetic and logical ops with short shifts 61406c3fb27SDimitry Andricdef N2Write_Arith : SchedWriteVariant<[ 61506c3fb27SDimitry Andric SchedVar<IsCheapLSL, [N2Write_1cyc_1I]>, 61606c3fb27SDimitry Andric SchedVar<NoSchedPred, [N2Write_2cyc_1M]>]>; 61706c3fb27SDimitry Andric 61806c3fb27SDimitry Andricdef N2Write_Logical: SchedWriteVariant<[ 61906c3fb27SDimitry Andric SchedVar<NeoverseNoLSL, [N2Write_1cyc_1I]>, 62006c3fb27SDimitry Andric SchedVar<NoSchedPred, [N2Write_2cyc_1M]>]>; 62106c3fb27SDimitry Andric 622753f127fSDimitry Andric// Miscellaneous 623753f127fSDimitry Andric// ----------------------------------------------------------------------------- 624753f127fSDimitry Andric 625753f127fSDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>; 626753f127fSDimitry Andric 627753f127fSDimitry Andric// Branch Instructions 628753f127fSDimitry Andric// ----------------------------------------------------------------------------- 629753f127fSDimitry Andric 630753f127fSDimitry Andric// Branch, immed 631753f127fSDimitry Andric// Compare and branch 632753f127fSDimitry Andricdef : SchedAlias<WriteBr, N2Write_1cyc_1B>; 633753f127fSDimitry Andric 634753f127fSDimitry Andric// Branch, register 635753f127fSDimitry Andricdef : SchedAlias<WriteBrReg, N2Write_1cyc_1B>; 636753f127fSDimitry Andric 637753f127fSDimitry Andric// Branch and link, immed 638753f127fSDimitry Andric// Branch and link, register 639753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1B_1S], (instrs BL, BLR)>; 640753f127fSDimitry Andric 641753f127fSDimitry Andric// Arithmetic and Logical Instructions 642753f127fSDimitry Andric// ----------------------------------------------------------------------------- 643753f127fSDimitry Andric 644753f127fSDimitry Andric// ALU, basic 645753f127fSDimitry Andric// ALU, basic, flagset 646753f127fSDimitry Andricdef : SchedAlias<WriteI, N2Write_1cyc_1I>; 647753f127fSDimitry Andric 648753f127fSDimitry Andric// ALU, extend and shift 649753f127fSDimitry Andricdef : SchedAlias<WriteIEReg, N2Write_2cyc_1M>; 650753f127fSDimitry Andric 65106c3fb27SDimitry Andric// Arithmetic, LSL shift, shift <= 4 65206c3fb27SDimitry Andric// Arithmetic, flagset, LSL shift, shift <= 4 65306c3fb27SDimitry Andric// Arithmetic, LSR/ASR/ROR shift or LSL shift > 4 65406c3fb27SDimitry Andricdef : SchedAlias<WriteISReg, N2Write_Arith>; 65506c3fb27SDimitry Andric 65606c3fb27SDimitry Andric// Logical, shift, no flagset 65706c3fb27SDimitry Andricdef : InstRW<[N2Write_1cyc_1I], 65806c3fb27SDimitry Andric (instregex "^(AND|BIC|EON|EOR|ORN|ORR)[WX]rs$")>; 65906c3fb27SDimitry Andric 66006c3fb27SDimitry Andric// Logical, shift, flagset 66106c3fb27SDimitry Andricdef : InstRW<[N2Write_Logical], (instregex "^(AND|BIC)S[WX]rs$")>; 66206c3fb27SDimitry Andric 663753f127fSDimitry Andric// Arithmetic, immediate to logical address tag 664753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instrs ADDG, SUBG)>; 665753f127fSDimitry Andric 666753f127fSDimitry Andric// Convert floating-point condition flags 667753f127fSDimitry Andric// Flag manipulation instructions 668753f127fSDimitry Andricdef : WriteRes<WriteSys, []> { let Latency = 1; } 669753f127fSDimitry Andric 670753f127fSDimitry Andric// Insert Random Tags 671753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instrs IRG, IRGstack)>; 672753f127fSDimitry Andric 673753f127fSDimitry Andric// Insert Tag Mask 674753f127fSDimitry Andric// Subtract Pointer 675753f127fSDimitry Andric// Subtract Pointer, flagset 676753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1I], (instrs GMI, SUBP, SUBPS)>; 677753f127fSDimitry Andric 678753f127fSDimitry Andric// Move and shift instructions 679753f127fSDimitry Andric// ----------------------------------------------------------------------------- 680753f127fSDimitry Andric 681753f127fSDimitry Andricdef : SchedAlias<WriteImm, N2Write_1cyc_1I>; 682753f127fSDimitry Andric 683753f127fSDimitry Andric// Divide and Multiply Instructions 684753f127fSDimitry Andric// ----------------------------------------------------------------------------- 685753f127fSDimitry Andric 686753f127fSDimitry Andric// SDIV, UDIV 687753f127fSDimitry Andricdef : SchedAlias<WriteID32, N2Write_12cyc_1M0>; 688753f127fSDimitry Andricdef : SchedAlias<WriteID64, N2Write_20cyc_1M0>; 689753f127fSDimitry Andric 690753f127fSDimitry Andricdef : WriteRes<WriteIM32, [N2UnitM]> { let Latency = 2; } 691753f127fSDimitry Andricdef : WriteRes<WriteIM64, [N2UnitM]> { let Latency = 2; } 692753f127fSDimitry Andric 693753f127fSDimitry Andric// Multiply high 694753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], (instrs SMULHrr, UMULHrr)>; 695753f127fSDimitry Andric 696753f127fSDimitry Andric// Pointer Authentication Instructions (v8.3 PAC) 697753f127fSDimitry Andric// ----------------------------------------------------------------------------- 698753f127fSDimitry Andric 699753f127fSDimitry Andric// Authenticate data address 700753f127fSDimitry Andric// Authenticate instruction address 701753f127fSDimitry Andric// Compute pointer authentication code for data address 702753f127fSDimitry Andric// Compute pointer authentication code, using generic key 703753f127fSDimitry Andric// Compute pointer authentication code for instruction address 704753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1M0], (instregex "^AUT", "^PAC")>; 705753f127fSDimitry Andric 706753f127fSDimitry Andric// Branch and link, register, with pointer authentication 707753f127fSDimitry Andric// Branch, register, with pointer authentication 708753f127fSDimitry Andric// Branch, return, with pointer authentication 709753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1M0_1B], (instrs BLRAA, BLRAAZ, BLRAB, BLRABZ, BRAA, 710753f127fSDimitry Andric BRAAZ, BRAB, BRABZ, RETAA, RETAB, 711753f127fSDimitry Andric ERETAA, ERETAB)>; 712753f127fSDimitry Andric 713753f127fSDimitry Andric 714753f127fSDimitry Andric// Load register, with pointer authentication 715753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_1M0_1L], (instregex "^LDRA[AB](indexed|writeback)")>; 716753f127fSDimitry Andric 717753f127fSDimitry Andric// Strip pointer authentication code 718753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M0], (instrs XPACD, XPACI, XPACLRI)>; 719753f127fSDimitry Andric 720753f127fSDimitry Andric// Miscellaneous data-processing instructions 721753f127fSDimitry Andric// ----------------------------------------------------------------------------- 722753f127fSDimitry Andric 723753f127fSDimitry Andric// Bitfield extract, one reg 724753f127fSDimitry Andric// Bitfield extract, two regs 725753f127fSDimitry Andric// NOTE: We don't model the difference between EXTR where both operands are the 726753f127fSDimitry Andric// same (one reg). 727753f127fSDimitry Andricdef : SchedAlias<WriteExtr, N2Write_3cyc_1I_1M>; 728753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1I_1M], (instrs EXTRWrri, EXTRXrri)>; 729753f127fSDimitry Andric 730753f127fSDimitry Andric// Bitfield move, basic 731753f127fSDimitry Andricdef : SchedAlias<WriteIS, N2Write_1cyc_1I>; 732753f127fSDimitry Andric 733753f127fSDimitry Andric// Bitfield move, insert 734753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instregex "^BFM[WX]ri$")>; 735753f127fSDimitry Andric 736753f127fSDimitry Andric// Load instructions 737753f127fSDimitry Andric// ----------------------------------------------------------------------------- 738753f127fSDimitry Andric 739753f127fSDimitry Andricdef : SchedAlias<WriteLD, N2Write_4cyc_1L>; 740753f127fSDimitry Andricdef : SchedAlias<WriteLDIdx, N2Write_4cyc_1I_1L>; 741753f127fSDimitry Andric 742753f127fSDimitry Andric// Load pair, signed immed offset, signed words 743753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1M0, WriteLDHi], (instrs LDPSWi)>; 744753f127fSDimitry Andric// Load pair, immed post-index or immed pre-index, signed words 7455f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_5cyc_1M0, WriteLDHi], 746753f127fSDimitry Andric (instregex "^LDPSW(post|pre)$")>; 747753f127fSDimitry Andric 748753f127fSDimitry Andric// Store instructions 749753f127fSDimitry Andric// ----------------------------------------------------------------------------- 750753f127fSDimitry Andric 751753f127fSDimitry Andricdef : SchedAlias<WriteST, N2Write_1cyc_1L01_1D>; 752753f127fSDimitry Andricdef : SchedAlias<WriteSTIdx, N2Write_1cyc_1L01_1D_1I>; 753753f127fSDimitry Andricdef : SchedAlias<WriteSTP, N2Write_1cyc_1L01_1D>; 754753f127fSDimitry Andricdef : SchedAlias<WriteAdr, N2Write_1cyc_1I>; // copied from A57. 755753f127fSDimitry Andric 756753f127fSDimitry Andric// Tag load instructions 757753f127fSDimitry Andric// ----------------------------------------------------------------------------- 758753f127fSDimitry Andric 759753f127fSDimitry Andric// Load allocation tag 760753f127fSDimitry Andric// Load multiple allocation tags 761753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L], (instrs LDG, LDGM)>; 762753f127fSDimitry Andric 763753f127fSDimitry Andric// Tag store instructions 764753f127fSDimitry Andric// ----------------------------------------------------------------------------- 765753f127fSDimitry Andric 766753f127fSDimitry Andric// Store allocation tags to one or two granules, post-index 767753f127fSDimitry Andric// Store allocation tags to one or two granules, pre-index 768753f127fSDimitry Andric// Store allocation tag to one or two granules, zeroing, post-index 769753f127fSDimitry Andric// Store Allocation Tag to one or two granules, zeroing, pre-index 770753f127fSDimitry Andric// Store allocation tag and reg pair to memory, post-Index 771753f127fSDimitry Andric// Store allocation tag and reg pair to memory, pre-Index 772753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1L01_1D_1I], (instrs STGPreIndex, STGPostIndex, 773753f127fSDimitry Andric ST2GPreIndex, ST2GPostIndex, 774753f127fSDimitry Andric STZGPreIndex, STZGPostIndex, 775753f127fSDimitry Andric STZ2GPreIndex, STZ2GPostIndex, 776753f127fSDimitry Andric STGPpre, STGPpost)>; 777753f127fSDimitry Andric 778753f127fSDimitry Andric// Store allocation tags to one or two granules, signed offset 779753f127fSDimitry Andric// Store allocation tag to two granules, zeroing, signed offset 780753f127fSDimitry Andric// Store allocation tag and reg pair to memory, signed offset 781753f127fSDimitry Andric// Store multiple allocation tags 78206c3fb27SDimitry Andricdef : InstRW<[N2Write_1cyc_1L01_1D], (instrs STGi, ST2Gi, STZGi, 78306c3fb27SDimitry Andric STZ2Gi, STGPi, STGM, STZGM)>; 784753f127fSDimitry Andric 785753f127fSDimitry Andric// FP data processing instructions 786753f127fSDimitry Andric// ----------------------------------------------------------------------------- 787753f127fSDimitry Andric 788753f127fSDimitry Andric// FP absolute value 789753f127fSDimitry Andric// FP arithmetic 790753f127fSDimitry Andric// FP min/max 791753f127fSDimitry Andric// FP negate 792753f127fSDimitry Andric// FP select 793753f127fSDimitry Andricdef : SchedAlias<WriteF, N2Write_2cyc_1V>; 794753f127fSDimitry Andric 795753f127fSDimitry Andric// FP compare 796753f127fSDimitry Andricdef : SchedAlias<WriteFCmp, N2Write_2cyc_1V0>; 797753f127fSDimitry Andric 798753f127fSDimitry Andric// FP divide, square root 799753f127fSDimitry Andricdef : SchedAlias<WriteFDiv, N2Write_7cyc_1V0>; 800753f127fSDimitry Andric 801753f127fSDimitry Andric// FP divide, H-form 802753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1V0], (instrs FDIVHrr)>; 803753f127fSDimitry Andric// FP divide, S-form 804753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_1V0], (instrs FDIVSrr)>; 805753f127fSDimitry Andric// FP divide, D-form 806753f127fSDimitry Andricdef : InstRW<[N2Write_15cyc_1V0], (instrs FDIVDrr)>; 807753f127fSDimitry Andric 808753f127fSDimitry Andric// FP square root, H-form 809753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1V0], (instrs FSQRTHr)>; 810753f127fSDimitry Andric// FP square root, S-form 811753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_1V0], (instrs FSQRTSr)>; 812753f127fSDimitry Andric// FP square root, D-form 813753f127fSDimitry Andricdef : InstRW<[N2Write_16cyc_1V0], (instrs FSQRTDr)>; 814753f127fSDimitry Andric 815753f127fSDimitry Andric// FP multiply 816753f127fSDimitry Andricdef : WriteRes<WriteFMul, [N2UnitV]> { let Latency = 3; } 817753f127fSDimitry Andric 818753f127fSDimitry Andric// FP multiply accumulate 819753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FN?M(ADD|SUB)[HSD]rrr$")>; 820753f127fSDimitry Andric 821753f127fSDimitry Andric// FP round to integral 822753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FRINT[AIMNPXZ][HSD]r$", 823753f127fSDimitry Andric "^FRINT(32|64)[XZ][SD]r$")>; 824753f127fSDimitry Andric 825753f127fSDimitry Andric// FP miscellaneous instructions 826753f127fSDimitry Andric// ----------------------------------------------------------------------------- 827753f127fSDimitry Andric 828753f127fSDimitry Andric// FP convert, from gen to vec reg 829753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M0], (instregex "^[SU]CVTF[SU][WX][HSD]ri$")>; 830753f127fSDimitry Andric 831753f127fSDimitry Andric// FP convert, from vec to gen reg 832753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^FCVT[AMNPZ][SU][SU][WX][HSD]r$")>; 833753f127fSDimitry Andric 834753f127fSDimitry Andric// FP convert, Javascript from vec to gen reg 835753f127fSDimitry Andric// FP convert, from vec to vec reg 836753f127fSDimitry Andricdef : SchedAlias<WriteFCvt, N2Write_3cyc_1V0>; 837753f127fSDimitry Andric 838753f127fSDimitry Andric// FP move, immed 839753f127fSDimitry Andric// FP move, register 840753f127fSDimitry Andricdef : SchedAlias<WriteFImm, N2Write_2cyc_1V>; 841753f127fSDimitry Andric 842753f127fSDimitry Andric// FP transfer, from gen to low half of vec reg 843753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M0], (instrs FMOVWHr, FMOVXHr, FMOVWSr, FMOVXDr, 844753f127fSDimitry Andric FMOVHWr, FMOVHXr, FMOVSWr, FMOVDXr)>; 845753f127fSDimitry Andric 846753f127fSDimitry Andric// FP transfer, from gen to high half of vec reg 847753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1M0_1V], (instrs FMOVXDHighr)>; 848753f127fSDimitry Andric 849753f127fSDimitry Andric// FP transfer, from vec to gen reg 850753f127fSDimitry Andricdef : SchedAlias<WriteFCopy, N2Write_2cyc_1V>; 851753f127fSDimitry Andric 852753f127fSDimitry Andric// FP load instructions 853753f127fSDimitry Andric// ----------------------------------------------------------------------------- 854753f127fSDimitry Andric 855753f127fSDimitry Andric// Load vector reg, literal, S/D/Q forms 856753f127fSDimitry Andric// Load vector reg, unscaled immed 857753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LDR[SDQ]l$", 858753f127fSDimitry Andric "^LDUR[BHSDQ]i$")>; 859753f127fSDimitry Andric 860753f127fSDimitry Andric// Load vector reg, immed post-index 861753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1I_1L, WriteI], (instregex "^LDR[BHSDQ]post$")>; 862753f127fSDimitry Andric// Load vector reg, immed pre-index 8635f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_1I_1L], (instregex "^LDR[BHSDQ]pre$")>; 864753f127fSDimitry Andric 865753f127fSDimitry Andric// Load vector reg, unsigned immed 866753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LDR[BHSDQ]ui$")>; 867753f127fSDimitry Andric 868753f127fSDimitry Andric// Load vector reg, register offset, basic 869753f127fSDimitry Andric// Load vector reg, register offset, scale, S/D-form 870753f127fSDimitry Andric// Load vector reg, register offset, extend 871753f127fSDimitry Andric// Load vector reg, register offset, extend, scale, S/D-form 872753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L, ReadAdrBase], (instregex "^LDR[BSD]ro[WX]$")>; 873753f127fSDimitry Andric 874753f127fSDimitry Andric// Load vector reg, register offset, scale, H/Q-form 875753f127fSDimitry Andric// Load vector reg, register offset, extend, scale, H/Q-form 876753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1I_1L, ReadAdrBase], (instregex "^LDR[HQ]ro[WX]$")>; 877753f127fSDimitry Andric 878753f127fSDimitry Andric// Load vector pair, immed offset, S/D-form 879753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L, WriteLDHi], (instregex "^LDN?P[SD]i$")>; 880753f127fSDimitry Andric 881753f127fSDimitry Andric// Load vector pair, immed offset, Q-form 882753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_2L, WriteLDHi], (instrs LDPQi, LDNPQi)>; 883753f127fSDimitry Andric 884753f127fSDimitry Andric// Load vector pair, immed post-index, S/D-form 885753f127fSDimitry Andric// Load vector pair, immed pre-index, S/D-form 8865f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_1I_1L, WriteLDHi], 887753f127fSDimitry Andric (instregex "^LDP[SD](pre|post)$")>; 888753f127fSDimitry Andric 889753f127fSDimitry Andric// Load vector pair, immed post-index, Q-form 890753f127fSDimitry Andric// Load vector pair, immed pre-index, Q-form 8915f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_2I_2L, WriteLDHi], (instrs LDPQpost, 892753f127fSDimitry Andric LDPQpre)>; 893753f127fSDimitry Andric 894753f127fSDimitry Andric// FP store instructions 895753f127fSDimitry Andric// ----------------------------------------------------------------------------- 896753f127fSDimitry Andric 897753f127fSDimitry Andric// Store vector reg, unscaled immed, B/H/S/D-form 898753f127fSDimitry Andric// Store vector reg, unscaled immed, Q-form 899753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STUR[BHSDQ]i$")>; 900753f127fSDimitry Andric 901753f127fSDimitry Andric// Store vector reg, immed post-index, B/H/S/D-form 902753f127fSDimitry Andric// Store vector reg, immed post-index, Q-form 903753f127fSDimitry Andric// Store vector reg, immed pre-index, B/H/S/D-form 904753f127fSDimitry Andric// Store vector reg, immed pre-index, Q-form 905753f127fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_1L01_1V_1I, ReadAdrBase], 906753f127fSDimitry Andric (instregex "^STR[BHSDQ](pre|post)$")>; 907753f127fSDimitry Andric 908753f127fSDimitry Andric// Store vector reg, unsigned immed, B/H/S/D-form 909753f127fSDimitry Andric// Store vector reg, unsigned immed, Q-form 910753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STR[BHSDQ]ui$")>; 911753f127fSDimitry Andric 912753f127fSDimitry Andric// Store vector reg, register offset, basic, B/H/S/D-form 913753f127fSDimitry Andric// Store vector reg, register offset, basic, Q-form 914753f127fSDimitry Andric// Store vector reg, register offset, scale, S/D-form 915753f127fSDimitry Andric// Store vector reg, register offset, extend, B/H/S/D-form 916753f127fSDimitry Andric// Store vector reg, register offset, extend, Q-form 917753f127fSDimitry Andric// Store vector reg, register offset, extend, scale, S/D-form 918753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V, ReadAdrBase], 919753f127fSDimitry Andric (instregex "^STR[BSD]ro[WX]$")>; 920753f127fSDimitry Andric 921753f127fSDimitry Andric// Store vector reg, register offset, scale, H-form 922753f127fSDimitry Andric// Store vector reg, register offset, scale, Q-form 923753f127fSDimitry Andric// Store vector reg, register offset, extend, scale, H-form 924753f127fSDimitry Andric// Store vector reg, register offset, extend, scale, Q-form 925753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V, ReadAdrBase], 926753f127fSDimitry Andric (instregex "^STR[HQ]ro[WX]$")>; 927753f127fSDimitry Andric 928753f127fSDimitry Andric// Store vector pair, immed offset, S-form 929753f127fSDimitry Andric// Store vector pair, immed offset, D-form 930753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STN?P[SD]i$")>; 931753f127fSDimitry Andric 932753f127fSDimitry Andric// Store vector pair, immed offset, Q-form 933753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_2V], (instrs STPQi, STNPQi)>; 934753f127fSDimitry Andric 935753f127fSDimitry Andric// Store vector pair, immed post-index, S-form 936753f127fSDimitry Andric// Store vector pair, immed post-index, D-form 937753f127fSDimitry Andric// Store vector pair, immed pre-index, S-form 938753f127fSDimitry Andric// Store vector pair, immed pre-index, D-form 939753f127fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_1L01_1V_1I], 940753f127fSDimitry Andric (instregex "^STP[SD](pre|post)$")>; 941753f127fSDimitry Andric 942753f127fSDimitry Andric// Store vector pair, immed post-index, Q-form 943753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_2V_1I], (instrs STPQpost)>; 944753f127fSDimitry Andric 945753f127fSDimitry Andric// Store vector pair, immed pre-index, Q-form 946753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_2V_2I], (instrs STPQpre)>; 947753f127fSDimitry Andric 948753f127fSDimitry Andric// ASIMD integer instructions 949753f127fSDimitry Andric// ----------------------------------------------------------------------------- 950753f127fSDimitry Andric 951753f127fSDimitry Andric// ASIMD absolute diff 952753f127fSDimitry Andric// ASIMD absolute diff long 953753f127fSDimitry Andric// ASIMD arith, basic 954753f127fSDimitry Andric// ASIMD arith, complex 955753f127fSDimitry Andric// ASIMD arith, pair-wise 956753f127fSDimitry Andric// ASIMD compare 957753f127fSDimitry Andric// ASIMD logical 958753f127fSDimitry Andric// ASIMD max/min, basic and pair-wise 959753f127fSDimitry Andricdef : SchedAlias<WriteVd, N2Write_2cyc_1V>; 960753f127fSDimitry Andricdef : SchedAlias<WriteVq, N2Write_2cyc_1V>; 961753f127fSDimitry Andric 962753f127fSDimitry Andric// ASIMD absolute diff accum 963753f127fSDimitry Andric// ASIMD absolute diff accum long 964753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], 965753f127fSDimitry Andric (instregex "^SABAv", "^UABAv", "^SABALv", "^UABALv")>; 966753f127fSDimitry Andric 967753f127fSDimitry Andric// ASIMD arith, reduce, 4H/4S 968753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^(ADDV|[SU]ADDLV)v4(i16|i32)v$")>; 969753f127fSDimitry Andric 970753f127fSDimitry Andric// ASIMD arith, reduce, 8B/8H 971753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1_1V], 972753f127fSDimitry Andric (instregex "^(ADDV|[SU]ADDLV)v8(i8|i16)v$")>; 973753f127fSDimitry Andric 974753f127fSDimitry Andric// ASIMD arith, reduce, 16B 975753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instrs ADDVv16i8v, SADDLVv16i8v, 976753f127fSDimitry Andric UADDLVv16i8v)>; 977753f127fSDimitry Andric 978753f127fSDimitry Andric// ASIMD dot product 979753f127fSDimitry Andric// ASIMD dot product using signed and unsigned integers 980753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], 981753f127fSDimitry Andric (instregex "^([SU]|SU|US)DOT(lane)?(v8|v16)i8$")>; 982753f127fSDimitry Andric 983753f127fSDimitry Andric// ASIMD matrix multiply-accumulate 984753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instrs SMMLA, UMMLA, USMMLA)>; 985753f127fSDimitry Andric 986753f127fSDimitry Andric// ASIMD max/min, reduce, 4H/4S 987753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^[SU](MAX|MIN)Vv4i16v$", 988753f127fSDimitry Andric "^[SU](MAX|MIN)Vv4i32v$")>; 989753f127fSDimitry Andric 990753f127fSDimitry Andric// ASIMD max/min, reduce, 8B/8H 991753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1_1V], (instregex "^[SU](MAX|MIN)Vv8i8v$", 992753f127fSDimitry Andric "^[SU](MAX|MIN)Vv8i16v$")>; 993753f127fSDimitry Andric 994753f127fSDimitry Andric// ASIMD max/min, reduce, 16B 995753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V1], (instregex "[SU](MAX|MIN)Vv16i8v$")>; 996753f127fSDimitry Andric 997753f127fSDimitry Andric// ASIMD multiply 998753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^MULv", "^SQ(R)?DMULHv")>; 999753f127fSDimitry Andric 1000753f127fSDimitry Andric// ASIMD multiply accumulate 1001753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^MLAv", "^MLSv")>; 1002753f127fSDimitry Andric 1003753f127fSDimitry Andric// ASIMD multiply accumulate high 1004753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQRDMLAHv", "^SQRDMLSHv")>; 1005753f127fSDimitry Andric 1006753f127fSDimitry Andric// ASIMD multiply accumulate long 1007753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^[SU]MLALv", "^[SU]MLSLv")>; 1008753f127fSDimitry Andric 1009753f127fSDimitry Andric// ASIMD multiply accumulate saturating long 1010753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQDMLALv", "^SQDMLSLv")>; 1011753f127fSDimitry Andric 1012753f127fSDimitry Andric// ASIMD multiply/multiply long (8x8) polynomial, D-form 1013753f127fSDimitry Andric// ASIMD multiply/multiply long (8x8) polynomial, Q-form 1014753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^PMULL?(v8i8|v16i8)$")>; 1015753f127fSDimitry Andric 1016753f127fSDimitry Andric// ASIMD multiply long 1017753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^[SU]MULLv", "^SQDMULLv")>; 1018753f127fSDimitry Andric 1019753f127fSDimitry Andric// ASIMD pairwise add and accumulate long 1020753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]ADALPv")>; 1021753f127fSDimitry Andric 1022753f127fSDimitry Andric// ASIMD shift accumulate 1023753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]SRAv", "^[SU]RSRAv")>; 1024753f127fSDimitry Andric 1025753f127fSDimitry Andric// ASIMD shift by immed, basic 1026753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^SHLv", "^SHLLv", "^SHRNv", 1027753f127fSDimitry Andric "^SSHLLv", "^SSHRv", "^USHLLv", 1028753f127fSDimitry Andric "^USHRv")>; 1029753f127fSDimitry Andric 1030753f127fSDimitry Andric// ASIMD shift by immed and insert, basic 1031753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^SLIv", "^SRIv")>; 1032753f127fSDimitry Andric 1033753f127fSDimitry Andric// ASIMD shift by immed, complex 1034753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], 1035753f127fSDimitry Andric (instregex "^RSHRNv", "^SQRSHRNv", "^SQRSHRUNv", 1036753f127fSDimitry Andric "^(SQSHLU?|UQSHL)[bhsd]$", 1037753f127fSDimitry Andric "^(SQSHLU?|UQSHL)(v8i8|v16i8|v4i16|v8i16|v2i32|v4i32|v2i64)_shift$", 1038753f127fSDimitry Andric "^SQSHRNv", "^SQSHRUNv", "^SRSHRv", "^UQRSHRNv", 1039753f127fSDimitry Andric "^UQSHRNv", "^URSHRv")>; 1040753f127fSDimitry Andric 1041753f127fSDimitry Andric// ASIMD shift by register, basic 1042753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^[SU]SHLv")>; 1043753f127fSDimitry Andric 1044753f127fSDimitry Andric// ASIMD shift by register, complex 1045753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], 1046753f127fSDimitry Andric (instregex "^[SU]RSHLv", "^[SU]QRSHLv", 1047753f127fSDimitry Andric "^[SU]QSHL(v1i8|v1i16|v1i32|v1i64|v8i8|v16i8|v4i16|v8i16|v2i32|v4i32|v2i64)$")>; 1048753f127fSDimitry Andric 1049753f127fSDimitry Andric// ASIMD floating-point instructions 1050753f127fSDimitry Andric// ----------------------------------------------------------------------------- 1051753f127fSDimitry Andric 1052753f127fSDimitry Andric// ASIMD FP absolute value/difference 1053753f127fSDimitry Andric// ASIMD FP arith, normal 1054753f127fSDimitry Andric// ASIMD FP compare 1055753f127fSDimitry Andric// ASIMD FP complex add 1056753f127fSDimitry Andric// ASIMD FP max/min, normal 1057753f127fSDimitry Andric// ASIMD FP max/min, pairwise 1058753f127fSDimitry Andric// ASIMD FP negate 1059753f127fSDimitry Andric// Handled by SchedAlias<WriteV[dq], ...> 1060753f127fSDimitry Andric 1061753f127fSDimitry Andric// ASIMD FP complex multiply add 1062753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FCMLAv")>; 1063753f127fSDimitry Andric 1064753f127fSDimitry Andric// ASIMD FP convert, long (F16 to F32) 1065753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FCVTL(v4|v8)i16")>; 1066753f127fSDimitry Andric 1067753f127fSDimitry Andric// ASIMD FP convert, long (F32 to F64) 1068753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FCVTL(v2|v4)i32")>; 1069753f127fSDimitry Andric 1070753f127fSDimitry Andric// ASIMD FP convert, narrow (F32 to F16) 1071753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FCVTN(v4|v8)i16")>; 1072753f127fSDimitry Andric 1073753f127fSDimitry Andric// ASIMD FP convert, narrow (F64 to F32) 1074753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FCVTN(v2|v4)i32", 1075753f127fSDimitry Andric "^FCVTXN(v2|v4)f32")>; 1076753f127fSDimitry Andric 1077753f127fSDimitry Andric// ASIMD FP convert, other, D-form F32 and Q-form F64 1078753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^[FSU]CVT[AMNPZ][SU]v2f(32|64)$", 1079753f127fSDimitry Andric "^[SU]CVTFv2f(32|64)$")>; 1080753f127fSDimitry Andric 1081753f127fSDimitry Andric// ASIMD FP convert, other, D-form F16 and Q-form F32 1082753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^[FSU]CVT[AMNPZ][SU]v4f(16|32)$", 1083753f127fSDimitry Andric "^[SU]CVTFv4f(16|32)$")>; 1084753f127fSDimitry Andric 1085753f127fSDimitry Andric// ASIMD FP convert, other, Q-form F16 1086753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^[FSU]CVT[AMNPZ][SU]v8f16$", 1087753f127fSDimitry Andric "^[SU]CVTFv8f16$")>; 1088753f127fSDimitry Andric 1089753f127fSDimitry Andric// ASIMD FP divide, D-form, F16 1090753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1V0], (instrs FDIVv4f16)>; 1091753f127fSDimitry Andric 1092753f127fSDimitry Andric// ASIMD FP divide, D-form, F32 1093753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2V0], (instrs FDIVv2f32)>; 1094753f127fSDimitry Andric 1095753f127fSDimitry Andric// ASIMD FP divide, Q-form, F16 1096753f127fSDimitry Andricdef : InstRW<[N2Write_13cyc_2V0], (instrs FDIVv8f16)>; 1097753f127fSDimitry Andric 1098753f127fSDimitry Andric// ASIMD FP divide, Q-form, F32 1099753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2V0], (instrs FDIVv4f32)>; 1100753f127fSDimitry Andric 1101753f127fSDimitry Andric// ASIMD FP divide, Q-form, F64 1102753f127fSDimitry Andricdef : InstRW<[N2Write_15cyc_2V0], (instrs FDIVv2f64)>; 1103753f127fSDimitry Andric 1104753f127fSDimitry Andric// ASIMD FP max/min, reduce, F32 and D-form F16 1105753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^(FMAX|FMIN)(NM)?Vv4(i16|i32)v$")>; 1106753f127fSDimitry Andric 1107753f127fSDimitry Andric// ASIMD FP max/min, reduce, Q-form F16 1108753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_2V], (instregex "^(FMAX|FMIN)(NM)?Vv8i16v$")>; 1109753f127fSDimitry Andric 1110753f127fSDimitry Andric// ASIMD FP multiply 1111753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^FMULv", "^FMULXv")>; 1112753f127fSDimitry Andric 1113753f127fSDimitry Andric// ASIMD FP multiply accumulate 1114753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FMLAv", "^FMLSv")>; 1115753f127fSDimitry Andric 1116753f127fSDimitry Andric// ASIMD FP multiply accumulate long 1117753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1V], (instregex "^FMLALv", "^FMLSLv")>; 1118753f127fSDimitry Andric 1119753f127fSDimitry Andric// ASIMD FP round, D-form F32 and Q-form F64 1120753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], 1121753f127fSDimitry Andric (instregex "^FRINT[AIMNPXZ]v2f(32|64)$", 1122753f127fSDimitry Andric "^FRINT[32|64)[XZ]v2f(32|64)$")>; 1123753f127fSDimitry Andric 1124753f127fSDimitry Andric// ASIMD FP round, D-form F16 and Q-form F32 1125753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], 1126753f127fSDimitry Andric (instregex "^FRINT[AIMNPXZ]v4f(16|32)$", 1127753f127fSDimitry Andric "^FRINT(32|64)[XZ]v4f32$")>; 1128753f127fSDimitry Andric 1129753f127fSDimitry Andric 1130753f127fSDimitry Andric// ASIMD FP round, Q-form F16 1131753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^FRINT[AIMNPXZ]v8f16$")>; 1132753f127fSDimitry Andric 1133753f127fSDimitry Andric// ASIMD FP square root, D-form, F16 1134753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1V0], (instrs FSQRTv4f16)>; 1135753f127fSDimitry Andric 1136753f127fSDimitry Andric// ASIMD FP square root, D-form, F32 1137753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2V0], (instrs FSQRTv2f32)>; 1138753f127fSDimitry Andric 1139753f127fSDimitry Andric// ASIMD FP square root, Q-form, F16 1140753f127fSDimitry Andricdef : InstRW<[N2Write_13cyc_2V0], (instrs FSQRTv8f16)>; 1141753f127fSDimitry Andric 1142753f127fSDimitry Andric// ASIMD FP square root, Q-form, F32 1143753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2V0], (instrs FSQRTv4f32)>; 1144753f127fSDimitry Andric 1145753f127fSDimitry Andric// ASIMD FP square root, Q-form, F64 1146753f127fSDimitry Andricdef : InstRW<[N2Write_16cyc_2V0], (instrs FSQRTv2f64)>; 1147753f127fSDimitry Andric 1148753f127fSDimitry Andric// ASIMD BFloat16 (BF16) instructions 1149753f127fSDimitry Andric// ----------------------------------------------------------------------------- 1150753f127fSDimitry Andric 1151753f127fSDimitry Andric// ASIMD convert, F32 to BF16 1152753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instrs BFCVTN, BFCVTN2)>; 1153753f127fSDimitry Andric 1154753f127fSDimitry Andric// ASIMD dot product 1155753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instrs BFDOTv4bf16, BFDOTv8bf16)>; 1156753f127fSDimitry Andric 1157753f127fSDimitry Andric// ASIMD matrix multiply accumulate 1158753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1V], (instrs BFMMLA)>; 1159753f127fSDimitry Andric 1160753f127fSDimitry Andric// ASIMD multiply accumulate long 1161753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instrs BFMLALB, BFMLALBIdx, BFMLALT, 1162753f127fSDimitry Andric BFMLALTIdx)>; 1163753f127fSDimitry Andric 1164753f127fSDimitry Andric// Scalar convert, F32 to BF16 1165753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instrs BFCVT)>; 1166753f127fSDimitry Andric 1167753f127fSDimitry Andric// ASIMD miscellaneous instructions 1168753f127fSDimitry Andric// ----------------------------------------------------------------------------- 1169753f127fSDimitry Andric 1170753f127fSDimitry Andric// ASIMD bit reverse 1171753f127fSDimitry Andric// ASIMD bitwise insert 1172753f127fSDimitry Andric// ASIMD count 1173753f127fSDimitry Andric// ASIMD duplicate, element 1174753f127fSDimitry Andric// ASIMD extract 1175753f127fSDimitry Andric// ASIMD extract narrow 1176753f127fSDimitry Andric// ASIMD insert, element to element 1177753f127fSDimitry Andric// ASIMD move, FP immed 1178753f127fSDimitry Andric// ASIMD move, integer immed 1179753f127fSDimitry Andric// ASIMD reverse 1180753f127fSDimitry Andric// ASIMD table lookup, 1 or 2 table regs 1181753f127fSDimitry Andric// ASIMD table lookup extension, 1 table reg 1182753f127fSDimitry Andric// ASIMD transfer, element to gen reg 1183753f127fSDimitry Andric// ASIMD transpose 1184753f127fSDimitry Andric// ASIMD unzip/zip 1185753f127fSDimitry Andric// Handled by SchedAlias<WriteV[dq], ...> 1186753f127fSDimitry Andric 1187753f127fSDimitry Andric// ASIMD duplicate, gen reg 1188753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M0], (instregex "^DUPv.+gpr")>; 1189753f127fSDimitry Andric 1190753f127fSDimitry Andric// ASIMD extract narrow, saturating 1191753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]QXTNv", "^SQXTUNv")>; 1192753f127fSDimitry Andric 1193753f127fSDimitry Andric// ASIMD reciprocal and square root estimate, D-form U32 1194753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instrs URECPEv2i32, URSQRTEv2i32)>; 1195753f127fSDimitry Andric 1196753f127fSDimitry Andric// ASIMD reciprocal and square root estimate, Q-form U32 1197753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instrs URECPEv4i32, URSQRTEv4i32)>; 1198753f127fSDimitry Andric 1199753f127fSDimitry Andric// ASIMD reciprocal and square root estimate, D-form F32 and scalar forms 1200753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instrs FRECPEv1f16, FRECPEv1i32, 1201753f127fSDimitry Andric FRECPEv1i64, FRECPEv2f32, 1202753f127fSDimitry Andric FRSQRTEv1f16, FRSQRTEv1i32, 1203753f127fSDimitry Andric FRSQRTEv1i64, FRSQRTEv2f32)>; 1204753f127fSDimitry Andric 1205753f127fSDimitry Andric// ASIMD reciprocal and square root estimate, D-form F16 and Q-form F32 1206753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instrs FRECPEv4f16, FRECPEv4f32, 1207753f127fSDimitry Andric FRSQRTEv4f16, FRSQRTEv4f32)>; 1208753f127fSDimitry Andric 1209753f127fSDimitry Andric// ASIMD reciprocal and square root estimate, Q-form F16 1210753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instrs FRECPEv8f16, FRSQRTEv8f16)>; 1211753f127fSDimitry Andric 1212753f127fSDimitry Andric// ASIMD reciprocal exponent 1213753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FRECPXv")>; 1214753f127fSDimitry Andric 1215753f127fSDimitry Andric// ASIMD reciprocal step 1216753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FRECPSv", "^FRSQRTSv")>; 1217753f127fSDimitry Andric 1218753f127fSDimitry Andric// ASIMD table lookup, 3 table regs 1219753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V], (instrs TBLv8i8Three, TBLv16i8Three)>; 1220753f127fSDimitry Andric 1221753f127fSDimitry Andric// ASIMD table lookup, 4 table regs 1222753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_4V], (instrs TBLv8i8Four, TBLv16i8Four)>; 1223753f127fSDimitry Andric 1224753f127fSDimitry Andric// ASIMD table lookup extension, 2 table reg 1225753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2V], (instrs TBXv8i8Two, TBXv16i8Two)>; 1226753f127fSDimitry Andric 1227753f127fSDimitry Andric// ASIMD table lookup extension, 3 table reg 1228753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_4V], (instrs TBXv8i8Three, TBXv16i8Three)>; 1229753f127fSDimitry Andric 1230753f127fSDimitry Andric// ASIMD table lookup extension, 4 table reg 1231753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_8V], (instrs TBXv8i8Four, TBXv16i8Four)>; 1232753f127fSDimitry Andric 1233753f127fSDimitry Andric// ASIMD transfer, gen reg to element 123406c3fb27SDimitry Andricdef : InstRW<[N2Write_5cyc_1M0_1V], (instregex "^INSvi(8|16|32|64)gpr$")>; 1235753f127fSDimitry Andric 1236753f127fSDimitry Andric// ASIMD load instructions 1237753f127fSDimitry Andric// ----------------------------------------------------------------------------- 1238753f127fSDimitry Andric 1239753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, D-form 1240753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LD1Onev(8b|4h|2s|1d)$")>; 12415f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_1L], 1242753f127fSDimitry Andric (instregex "^LD1Onev(8b|4h|2s|1d)_POST$")>; 1243753f127fSDimitry Andric 1244753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, Q-form 1245753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LD1Onev(16b|8h|4s|2d)$")>; 12465f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_1L], 1247753f127fSDimitry Andric (instregex "^LD1Onev(16b|8h|4s|2d)_POST$")>; 1248753f127fSDimitry Andric 1249753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, D-form 1250753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_2L], (instregex "^LD1Twov(8b|4h|2s|1d)$")>; 12515f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_2L], 1252753f127fSDimitry Andric (instregex "^LD1Twov(8b|4h|2s|1d)_POST$")>; 1253753f127fSDimitry Andric 1254753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, Q-form 1255753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_2L], (instregex "^LD1Twov(16b|8h|4s|2d)$")>; 12565f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_2L], 1257753f127fSDimitry Andric (instregex "^LD1Twov(16b|8h|4s|2d)_POST$")>; 1258753f127fSDimitry Andric 1259753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, D-form 1260753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L], (instregex "^LD1Threev(8b|4h|2s|1d)$")>; 12615f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L], 1262753f127fSDimitry Andric (instregex "^LD1Threev(8b|4h|2s|1d)_POST$")>; 1263753f127fSDimitry Andric 1264753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, Q-form 1265753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L], (instregex "^LD1Threev(16b|8h|4s|2d)$")>; 12665f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L], 1267753f127fSDimitry Andric (instregex "^LD1Threev(16b|8h|4s|2d)_POST$")>; 1268753f127fSDimitry Andric 1269753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, D-form 1270753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_4L], (instregex "^LD1Fourv(8b|4h|2s|1d)$")>; 12715f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_7cyc_4L], 1272753f127fSDimitry Andric (instregex "^LD1Fourv(8b|4h|2s|1d)_POST$")>; 1273753f127fSDimitry Andric 1274753f127fSDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, Q-form 1275753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_4L], (instregex "^LD1Fourv(16b|8h|4s|2d)$")>; 12765f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_7cyc_4L], 1277753f127fSDimitry Andric (instregex "^LD1Fourv(16b|8h|4s|2d)_POST$")>; 1278753f127fSDimitry Andric 1279753f127fSDimitry Andric// ASIMD load, 1 element, one lane, B/H/S 1280753f127fSDimitry Andric// ASIMD load, 1 element, one lane, D 1281753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_1V], (instregex "LD1i(8|16|32|64)$")>; 12825f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_1V], (instregex "LD1i(8|16|32|64)_POST$")>; 1283753f127fSDimitry Andric 1284753f127fSDimitry Andric// ASIMD load, 1 element, all lanes, D-form, B/H/S 1285753f127fSDimitry Andric// ASIMD load, 1 element, all lanes, D-form, D 1286753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_1V], (instregex "LD1Rv(8b|4h|2s|1d)$")>; 12875f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_1V], (instregex "LD1Rv(8b|4h|2s|1d)_POST$")>; 1288753f127fSDimitry Andric 1289753f127fSDimitry Andric// ASIMD load, 1 element, all lanes, Q-form 1290753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_1V], (instregex "LD1Rv(16b|8h|4s|2d)$")>; 12915f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_1V], (instregex "LD1Rv(16b|8h|4s|2d)_POST$")>; 1292753f127fSDimitry Andric 1293753f127fSDimitry Andric// ASIMD load, 2 element, multiple, D-form, B/H/S 1294753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_2V], (instregex "LD2Twov(8b|4h|2s)$")>; 12955f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_2V], (instregex "LD2Twov(8b|4h|2s)_POST$")>; 1296753f127fSDimitry Andric 1297753f127fSDimitry Andric// ASIMD load, 2 element, multiple, Q-form, B/H/S 1298753f127fSDimitry Andric// ASIMD load, 2 element, multiple, Q-form, D 1299753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2L_2V], (instregex "LD2Twov(16b|8h|4s|2d)$")>; 13005f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_2L_2V], (instregex "LD2Twov(16b|8h|4s|2d)_POST$")>; 1301753f127fSDimitry Andric 1302753f127fSDimitry Andric// ASIMD load, 2 element, one lane, B/H 1303753f127fSDimitry Andric// ASIMD load, 2 element, one lane, S 1304753f127fSDimitry Andric// ASIMD load, 2 element, one lane, D 1305753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_2V], (instregex "LD2i(8|16|32|64)$")>; 13065f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_2V], (instregex "LD2i(8|16|32|64)_POST$")>; 1307753f127fSDimitry Andric 1308753f127fSDimitry Andric// ASIMD load, 2 element, all lanes, D-form, B/H/S 1309753f127fSDimitry Andric// ASIMD load, 2 element, all lanes, D-form, D 1310753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_2V], (instregex "LD2Rv(8b|4h|2s|1d)$")>; 13115f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_2V], (instregex "LD2Rv(8b|4h|2s|1d)_POST$")>; 1312753f127fSDimitry Andric 1313753f127fSDimitry Andric// ASIMD load, 2 element, all lanes, Q-form 1314753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_2V], (instregex "LD2Rv(16b|8h|4s|2d)$")>; 13155f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_1L_2V], (instregex "LD2Rv(16b|8h|4s|2d)_POST$")>; 1316753f127fSDimitry Andric 1317753f127fSDimitry Andric// ASIMD load, 3 element, multiple, D-form, B/H/S 1318753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2L_3V], (instregex "LD3Threev(8b|4h|2s)$")>; 13195f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_2L_3V], (instregex "LD3Threev(8b|4h|2s)_POST$")>; 1320753f127fSDimitry Andric 1321753f127fSDimitry Andric// ASIMD load, 3 element, multiple, Q-form, B/H/S 1322753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_3V], (instregex "LD3Threev(16b|8h|4s)$")>; 13235f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_3V], (instregex "LD3Threev(16b|8h|4s)_POST$")>; 1324753f127fSDimitry Andric 1325753f127fSDimitry Andric// ASIMD load, 3 element, multiple, Q-form, D 1326753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_3V], (instregex "LD3Threev(2d)$")>; 13275f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_3V], (instregex "LD3Threev(2d)_POST$")>; 1328753f127fSDimitry Andric 1329753f127fSDimitry Andric// ASIMD load, 3 element, one lane, B/H 1330753f127fSDimitry Andric// ASIMD load, 3 element, one lane, S 1331753f127fSDimitry Andric// ASIMD load, 3 element, one lane, D 1332753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2L_3V], (instregex "LD3i(8|16|32|64)$")>; 13335f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_2L_3V], (instregex "LD3i(8|16|32|64)_POST$")>; 1334753f127fSDimitry Andric 1335753f127fSDimitry Andric// ASIMD load, 3 element, all lanes, D-form, B/H/S 1336753f127fSDimitry Andric// ASIMD load, 3 element, all lanes, D-form, D 1337753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2L_3V], (instregex "LD3Rv(8b|4h|2s|1d)$")>; 13385f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_2L_3V], (instregex "LD3Rv(8b|4h|2s|1d)_POST$")>; 1339753f127fSDimitry Andric 1340753f127fSDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, B/H/S 1341753f127fSDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, D 1342753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_3V], (instregex "LD3Rv(16b|8h|4s|2d)$")>; 13435f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_3V], (instregex "LD3Rv(16b|8h|4s|2d)_POST$")>; 1344753f127fSDimitry Andric 1345753f127fSDimitry Andric// ASIMD load, 4 element, multiple, D-form, B/H/S 1346753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_4V], (instregex "LD4Fourv(8b|4h|2s)$")>; 13475f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_4V], (instregex "LD4Fourv(8b|4h|2s)_POST$")>; 1348753f127fSDimitry Andric 1349753f127fSDimitry Andric// ASIMD load, 4 element, multiple, Q-form, B/H/S 1350753f127fSDimitry Andric// ASIMD load, 4 element, multiple, Q-form, D 1351753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_4L_4V], (instregex "LD4Fourv(16b|8h|4s|2d)$")>; 13525f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_9cyc_4L_4V], (instregex "LD4Fourv(16b|8h|4s|2d)_POST$")>; 1353753f127fSDimitry Andric 1354753f127fSDimitry Andric// ASIMD load, 4 element, one lane, B/H 1355753f127fSDimitry Andric// ASIMD load, 4 element, one lane, S 1356753f127fSDimitry Andric// ASIMD load, 4 element, one lane, D 1357753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_4V], (instregex "LD4i(8|16|32|64)$")>; 13585f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_4V], (instregex "LD4i(8|16|32|64)_POST$")>; 1359753f127fSDimitry Andric 1360753f127fSDimitry Andric// ASIMD load, 4 element, all lanes, D-form, B/H/S 1361753f127fSDimitry Andric// ASIMD load, 4 element, all lanes, D-form, D 1362753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_3L_4V], (instregex "LD4Rv(8b|4h|2s|1d)$")>; 13635f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_3L_4V], (instregex "LD4Rv(8b|4h|2s|1d)_POST$")>; 1364753f127fSDimitry Andric 1365753f127fSDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, B/H/S 1366753f127fSDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, D 1367753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_4L_4V], (instregex "LD4Rv(16b|8h|4s|2d)$")>; 13685f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_8cyc_4L_4V], (instregex "LD4Rv(16b|8h|4s|2d)_POST$")>; 1369753f127fSDimitry Andric 1370753f127fSDimitry Andric// ASIMD store instructions 1371753f127fSDimitry Andric// ----------------------------------------------------------------------------- 1372753f127fSDimitry Andric 1373753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, D-form 1374753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "ST1Onev(8b|4h|2s|1d)$")>; 13755f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_1L01_1V], (instregex "ST1Onev(8b|4h|2s|1d)_POST$")>; 1376753f127fSDimitry Andric 1377753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, Q-form 1378753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "ST1Onev(16b|8h|4s|2d)$")>; 13795f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_1L01_1V], (instregex "ST1Onev(16b|8h|4s|2d)_POST$")>; 1380753f127fSDimitry Andric 1381753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, D-form 1382753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "ST1Twov(8b|4h|2s|1d)$")>; 13835f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_1L01_1V], (instregex "ST1Twov(8b|4h|2s|1d)_POST$")>; 1384753f127fSDimitry Andric 1385753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, Q-form 1386753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_2L01_2V], (instregex "ST1Twov(16b|8h|4s|2d)$")>; 13875f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_2L01_2V], (instregex "ST1Twov(16b|8h|4s|2d)_POST$")>; 1388753f127fSDimitry Andric 1389753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, D-form 1390753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_2L01_2V], (instregex "ST1Threev(8b|4h|2s|1d)$")>; 13915f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_2L01_2V], (instregex "ST1Threev(8b|4h|2s|1d)_POST$")>; 1392753f127fSDimitry Andric 1393753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, Q-form 1394753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_3L01_3V], (instregex "ST1Threev(16b|8h|4s|2d)$")>; 13955f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_3L01_3V], (instregex "ST1Threev(16b|8h|4s|2d)_POST$")>; 1396753f127fSDimitry Andric 1397753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, D-form 1398753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_2L01_2V], (instregex "ST1Fourv(8b|4h|2s|1d)$")>; 13995f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_2L01_2V], (instregex "ST1Fourv(8b|4h|2s|1d)_POST$")>; 1400753f127fSDimitry Andric 1401753f127fSDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, Q-form 1402753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_4L01_4V], (instregex "ST1Fourv(16b|8h|4s|2d)$")>; 14035f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_2cyc_4L01_4V], (instregex "ST1Fourv(16b|8h|4s|2d)_POST$")>; 1404753f127fSDimitry Andric 1405753f127fSDimitry Andric// ASIMD store, 1 element, one lane, B/H/S 1406753f127fSDimitry Andric// ASIMD store, 1 element, one lane, D 1407753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1V], (instregex "ST1i(8|16|32|64)$")>; 14085f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_4cyc_1L01_1V], (instregex "ST1i(8|16|32|64)_POST$")>; 1409753f127fSDimitry Andric 1410753f127fSDimitry Andric// ASIMD store, 2 element, multiple, D-form, B/H/S 1411753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1V], (instregex "ST2Twov(8b|4h|2s)$")>; 14125f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_4cyc_1L01_1V], (instregex "ST2Twov(8b|4h|2s)_POST$")>; 1413753f127fSDimitry Andric 1414753f127fSDimitry Andric// ASIMD store, 2 element, multiple, Q-form, B/H/S 1415753f127fSDimitry Andric// ASIMD store, 2 element, multiple, Q-form, D 1416753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2L01_2V], (instregex "ST2Twov(16b|8h|4s|2d)$")>; 14175f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_4cyc_2L01_2V], (instregex "ST2Twov(16b|8h|4s|2d)_POST$")>; 1418753f127fSDimitry Andric 1419753f127fSDimitry Andric// ASIMD store, 2 element, one lane, B/H/S 1420753f127fSDimitry Andric// ASIMD store, 2 element, one lane, D 1421753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1V], (instregex "ST2i(8|16|32|64)$")>; 14225f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_4cyc_1L01_1V], (instregex "ST2i(8|16|32|64)_POST$")>; 1423753f127fSDimitry Andric 1424753f127fSDimitry Andric// ASIMD store, 3 element, multiple, D-form, B/H/S 1425753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2L01_2V], (instregex "ST3Threev(8b|4h|2s)$")>; 14265f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_5cyc_2L01_2V], (instregex "ST3Threev(8b|4h|2s)_POST$")>; 1427753f127fSDimitry Andric 1428753f127fSDimitry Andric// ASIMD store, 3 element, multiple, Q-form, B/H/S 1429753f127fSDimitry Andric// ASIMD store, 3 element, multiple, Q-form, D 1430753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L01_3V], (instregex "ST3Threev(16b|8h|4s|2d)$")>; 14315f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L01_3V], (instregex "ST3Threev(16b|8h|4s|2d)_POST$")>; 1432753f127fSDimitry Andric 1433753f127fSDimitry Andric// ASIMD store, 3 element, one lane, B/H 1434753f127fSDimitry Andric// ASIMD store, 3 element, one lane, S 1435753f127fSDimitry Andric// ASIMD store, 3 element, one lane, D 1436753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L01_3V], (instregex "ST3i(8|16|32|64)$")>; 14375f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L01_3V], (instregex "ST3i(8|16|32|64)_POST$")>; 1438753f127fSDimitry Andric 1439753f127fSDimitry Andric// ASIMD store, 4 element, multiple, D-form, B/H/S 1440753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L01_3V], (instregex "ST4Fourv(8b|4h|2s)$")>; 14415f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L01_3V], (instregex "ST4Fourv(8b|4h|2s)_POST$")>; 1442753f127fSDimitry Andric 1443753f127fSDimitry Andric// ASIMD store, 4 element, multiple, Q-form, B/H/S 1444753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_6L01_6V], (instregex "ST4Fourv(16b|8h|4s)$")>; 14455f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_7cyc_6L01_6V], (instregex "ST4Fourv(16b|8h|4s)_POST$")>; 1446753f127fSDimitry Andric 1447753f127fSDimitry Andric// ASIMD store, 4 element, multiple, Q-form, D 1448753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_4L01_4V], (instregex "ST4Fourv(2d)$")>; 14495f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_5cyc_4L01_4V], (instregex "ST4Fourv(2d)_POST$")>; 1450753f127fSDimitry Andric 1451753f127fSDimitry Andric// ASIMD store, 4 element, one lane, B/H/S 1452753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_3L01_3V], (instregex "ST4i(8|16|32)$")>; 14535f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_6cyc_3L01_3V], (instregex "ST4i(8|16|32)_POST$")>; 1454753f127fSDimitry Andric 1455753f127fSDimitry Andric// ASIMD store, 4 element, one lane, D 1456753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_3L01_3V], (instregex "ST4i(64)$")>; 14575f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N2Write_4cyc_3L01_3V], (instregex "ST4i(64)_POST$")>; 1458753f127fSDimitry Andric 1459753f127fSDimitry Andric// Cryptography extensions 1460753f127fSDimitry Andric// ----------------------------------------------------------------------------- 1461753f127fSDimitry Andric 1462753f127fSDimitry Andric// Crypto AES ops 1463753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^AES[DE]rr$", "^AESI?MCrr")>; 1464753f127fSDimitry Andric 1465753f127fSDimitry Andric// Crypto polynomial (64x64) multiply long 1466753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instrs PMULLv1i64, PMULLv2i64)>; 1467753f127fSDimitry Andric 1468753f127fSDimitry Andric// Crypto SHA1 hash acceleration op 1469753f127fSDimitry Andric// Crypto SHA1 schedule acceleration ops 1470753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^SHA1(H|SU0|SU1)")>; 1471753f127fSDimitry Andric 1472753f127fSDimitry Andric// Crypto SHA1 hash acceleration ops 1473753f127fSDimitry Andric// Crypto SHA256 hash acceleration ops 1474753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SHA1[CMP]", "^SHA256H2?")>; 1475753f127fSDimitry Andric 1476753f127fSDimitry Andric// Crypto SHA256 schedule acceleration ops 1477753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^SHA256SU[01]")>; 1478753f127fSDimitry Andric 1479753f127fSDimitry Andric// Crypto SHA512 hash acceleration ops 1480753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^SHA512(H|H2|SU0|SU1)")>; 1481753f127fSDimitry Andric 1482753f127fSDimitry Andric// Crypto SHA3 ops 1483753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instrs BCAX, EOR3, RAX1, XAR)>; 1484753f127fSDimitry Andric 1485753f127fSDimitry Andric// Crypto SM3 ops 1486753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^SM3PARTW[12]$", "^SM3SS1$", 1487753f127fSDimitry Andric "^SM3TT[12][AB]$")>; 1488753f127fSDimitry Andric 1489753f127fSDimitry Andric// Crypto SM4 ops 1490753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instrs SM4E, SM4ENCKEY)>; 1491753f127fSDimitry Andric 1492753f127fSDimitry Andric// CRC 1493753f127fSDimitry Andric// ----------------------------------------------------------------------------- 1494753f127fSDimitry Andric 1495753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M0], (instregex "^CRC32")>; 1496753f127fSDimitry Andric 1497753f127fSDimitry Andric// SVE Predicate instructions 1498753f127fSDimitry Andric// ----------------------------------------------------------------------------- 1499753f127fSDimitry Andric 1500753f127fSDimitry Andric// Loop control, based on predicate 1501753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instrs BRKA_PPmP, BRKA_PPzP, 1502753f127fSDimitry Andric BRKB_PPmP, BRKB_PPzP)>; 1503753f127fSDimitry Andric 1504753f127fSDimitry Andric// Loop control, based on predicate and flag setting 1505753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], (instrs BRKAS_PPzP, BRKBS_PPzP)>; 1506753f127fSDimitry Andric 1507753f127fSDimitry Andric// Loop control, propagating 1508753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M0], (instrs BRKN_PPzP, BRKPA_PPzPP, BRKPB_PPzPP)>; 1509753f127fSDimitry Andric 1510753f127fSDimitry Andric// Loop control, propagating and flag setting 1511753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M0_1M], (instrs BRKNS_PPzP, BRKPAS_PPzPP, 1512753f127fSDimitry Andric BRKPBS_PPzPP)>; 1513753f127fSDimitry Andric 1514753f127fSDimitry Andric// Loop control, based on GPR 1515753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], 1516753f127fSDimitry Andric (instregex "^WHILE(GE|GT|HI|HS|LE|LO|LS|LT)_P(WW|XX)_[BHSD]$")>; 1517753f127fSDimitry Andric 1518753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], (instregex "^WHILE(RW|WR)_PXX_[BHSD]$")>; 1519753f127fSDimitry Andric 1520753f127fSDimitry Andric// Loop terminate 1521753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1M], (instregex "^CTERM(EQ|NE)_(WW|XX)$")>; 1522753f127fSDimitry Andric 1523753f127fSDimitry Andric// Predicate counting scalar 1524753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instrs ADDPL_XXI, ADDVL_XXI, RDVLI_XI)>; 1525753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], 1526753f127fSDimitry Andric (instregex "^(CNT|DEC|INC|SQDEC|SQINC|UQDEC|UQINC)[BHWD]_XPiI$", 1527753f127fSDimitry Andric "^SQ(DEC|INC)[BHWD]_XPiWdI$", 1528753f127fSDimitry Andric "^(UQDEC|UQINC)[BHWD]_WPiI$")>; 1529753f127fSDimitry Andric 1530753f127fSDimitry Andric// Predicate counting scalar, active predicate 1531753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], 1532753f127fSDimitry Andric (instregex "^CNTP_XPP_[BHSD]$", 1533753f127fSDimitry Andric "^(DEC|INC|SQDEC|SQINC|UQDEC|UQINC)P_XP_[BHSD]$", 1534753f127fSDimitry Andric "^(UQDEC|UQINC)P_WP_[BHSD]$", 1535753f127fSDimitry Andric "^(SQDEC|SQINC|UQDEC|UQINC)P_XPWd_[BHSD]$")>; 1536753f127fSDimitry Andric 1537753f127fSDimitry Andric// Predicate counting vector, active predicate 1538753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1M_1M0_1V], 1539753f127fSDimitry Andric (instregex "^(DEC|INC|SQDEC|SQINC|UQDEC|UQINC)P_ZP_[HSD]$")>; 1540753f127fSDimitry Andric 1541753f127fSDimitry Andric// Predicate logical 1542753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1M0], 1543753f127fSDimitry Andric (instregex "^(AND|BIC|EOR|NAND|NOR|ORN|ORR)_PPzPP$")>; 1544753f127fSDimitry Andric 1545753f127fSDimitry Andric// Predicate logical, flag setting 1546753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M0_1M], 1547753f127fSDimitry Andric (instregex "^(ANDS|BICS|EORS|NANDS|NORS|ORNS|ORRS)_PPzPP$")>; 1548753f127fSDimitry Andric 1549753f127fSDimitry Andric// Predicate reverse 1550753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instregex "^REV_PP_[BHSD]$")>; 1551753f127fSDimitry Andric 1552753f127fSDimitry Andric// Predicate select 1553753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1M0], (instrs SEL_PPPP)>; 1554753f127fSDimitry Andric 1555753f127fSDimitry Andric// Predicate set 1556753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instregex "^PFALSE$", "^PTRUE_[BHSD]$")>; 1557753f127fSDimitry Andric 1558753f127fSDimitry Andric// Predicate set/initialize, set flags 1559753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], (instregex "^PTRUES_[BHSD]$")>; 1560753f127fSDimitry Andric 1561753f127fSDimitry Andric// Predicate find first/next 1562753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M], (instregex "^PFIRST_B$", "^PNEXT_[BHSD]$")>; 1563753f127fSDimitry Andric 1564753f127fSDimitry Andric// Predicate test 1565753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1M], (instrs PTEST_PP)>; 1566753f127fSDimitry Andric 1567753f127fSDimitry Andric// Predicate transpose 1568753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instregex "^TRN[12]_PPP_[BHSDQ]$")>; 1569753f127fSDimitry Andric 1570753f127fSDimitry Andric// Predicate unpack and widen 1571753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instrs PUNPKHI_PP, PUNPKLO_PP)>; 1572753f127fSDimitry Andric 1573753f127fSDimitry Andric// Predicate zip/unzip 1574753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M], (instregex "^(ZIP|UZP)[12]_PPP_[BHSDQ]$")>; 1575753f127fSDimitry Andric 1576753f127fSDimitry Andric// SVE integer instructions 1577753f127fSDimitry Andric// ----------------------------------------------------------------------------- 1578753f127fSDimitry Andric 1579753f127fSDimitry Andric// Arithmetic, absolute diff 1580*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^[SU]ABD_ZPmZ_[BHSD]", 1581*0fca6ea1SDimitry Andric "^[SU]ABD_ZPZZ_[BHSD]")>; 1582753f127fSDimitry Andric 1583753f127fSDimitry Andric// Arithmetic, absolute diff accum 1584753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]ABA_ZZZ_[BHSD]$")>; 1585753f127fSDimitry Andric 1586753f127fSDimitry Andric// Arithmetic, absolute diff accum long 1587753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]ABAL[TB]_ZZZ_[HSD]$")>; 1588753f127fSDimitry Andric 1589753f127fSDimitry Andric// Arithmetic, absolute diff long 1590753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^[SU]ABDL[TB]_ZZZ_[HSD]$")>; 1591753f127fSDimitry Andric 1592753f127fSDimitry Andric// Arithmetic, basic 1593753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], 1594*0fca6ea1SDimitry Andric (instregex "^(ABS|ADD|CNOT|NEG|SUB|SUBR)_ZPmZ_[BHSD]", 1595*0fca6ea1SDimitry Andric "^(ADD|SUB)_ZZZ_[BHSD]", 1596*0fca6ea1SDimitry Andric "^(ADD|SUB|SUBR)_ZPZZ_[BHSD]", 1597*0fca6ea1SDimitry Andric "^(ADD|SUB|SUBR)_ZI_[BHSD]", 1598*0fca6ea1SDimitry Andric "^ADR_[SU]XTW_ZZZ_D_[0123]", 1599*0fca6ea1SDimitry Andric "^ADR_LSL_ZZZ_[SD]_[0123]", 1600*0fca6ea1SDimitry Andric "^[SU](ADD|SUB)[LW][BT]_ZZZ_[HSD]", 1601*0fca6ea1SDimitry Andric "^SADDLBT_ZZZ_[HSD]", 1602*0fca6ea1SDimitry Andric "^[SU]H(ADD|SUB|SUBR)_ZPmZ_[BHSD]", 1603*0fca6ea1SDimitry Andric "^SSUBL(BT|TB)_ZZZ_[HSD]")>; 1604753f127fSDimitry Andric 1605753f127fSDimitry Andric// Arithmetic, complex 1606753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], 1607*0fca6ea1SDimitry Andric (instregex "^R?(ADD|SUB)HN[BT]_ZZZ_[BHS]", 1608*0fca6ea1SDimitry Andric "^SQ(ABS|ADD|NEG|SUB|SUBR)_ZPmZ_[BHSD]", 1609*0fca6ea1SDimitry Andric "^[SU]Q(ADD|SUB)_ZZZ_[BHSD]", 1610*0fca6ea1SDimitry Andric "^[SU]Q(ADD|SUB)_ZI_[BHSD]", 1611*0fca6ea1SDimitry Andric "^(SRH|SUQ|UQ|USQ|URH)ADD_ZPmZ_[BHSD]", 1612*0fca6ea1SDimitry Andric "^(UQSUB|UQSUBR)_ZPmZ_[BHSD]")>; 1613753f127fSDimitry Andric 1614753f127fSDimitry Andric// Arithmetic, large integer 1615753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^(AD|SB)CL[BT]_ZZZ_[SD]$")>; 1616753f127fSDimitry Andric 1617753f127fSDimitry Andric// Arithmetic, pairwise add 1618753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^ADDP_ZPmZ_[BHSD]$")>; 1619753f127fSDimitry Andric 1620753f127fSDimitry Andric// Arithmetic, pairwise add and accum long 1621753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]ADALP_ZPmZ_[HSD]$")>; 1622753f127fSDimitry Andric 1623753f127fSDimitry Andric// Arithmetic, shift 1624753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], 1625*0fca6ea1SDimitry Andric (instregex "^(ASR|LSL|LSR)_WIDE_ZPmZ_[BHS]", 1626*0fca6ea1SDimitry Andric "^(ASR|LSL|LSR)_WIDE_ZZZ_[BHS]", 1627*0fca6ea1SDimitry Andric "^(ASR|LSL|LSR)_ZPmI_[BHSD]", 1628*0fca6ea1SDimitry Andric "^(ASR|LSL|LSR)_ZPmZ_[BHSD]", 1629*0fca6ea1SDimitry Andric "^(ASR|LSL|LSR)_ZZI_[BHSD]", 1630*0fca6ea1SDimitry Andric "^(ASR|LSL|LSR)_ZPZ[IZ]_[BHSD]", 1631*0fca6ea1SDimitry Andric "^(ASRR|LSLR|LSRR)_ZPmZ_[BHSD]")>; 1632753f127fSDimitry Andric 1633753f127fSDimitry Andric// Arithmetic, shift and accumulate 1634753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], 1635753f127fSDimitry Andric (instregex "^(SRSRA|SSRA|URSRA|USRA)_ZZI_[BHSD]$")>; 1636753f127fSDimitry Andric 1637753f127fSDimitry Andric// Arithmetic, shift by immediate 1638753f127fSDimitry Andric// Arithmetic, shift by immediate and insert 1639753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], 1640753f127fSDimitry Andric (instregex "^(SHRNB|SHRNT|SSHLLB|SSHLLT|USHLLB|USHLLT|SLI|SRI)_ZZI_[BHSD]$")>; 1641753f127fSDimitry Andric 1642753f127fSDimitry Andric// Arithmetic, shift complex 1643753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], 1644*0fca6ea1SDimitry Andric (instregex "^(SQ)?RSHRU?N[BT]_ZZI_[BHS]", 1645*0fca6ea1SDimitry Andric "^(SQRSHL|SQRSHLR|SQSHL|SQSHLR|UQRSHL|UQRSHLR|UQSHL|UQSHLR)_ZPmZ_[BHSD]", 1646*0fca6ea1SDimitry Andric "^[SU]QR?SHL_ZPZZ_[BHSD]", 1647*0fca6ea1SDimitry Andric "^(SQSHL|SQSHLU|UQSHL)_(ZPmI|ZPZI)_[BHSD]", 1648*0fca6ea1SDimitry Andric "^SQSHRU?N[BT]_ZZI_[BHS]", 1649*0fca6ea1SDimitry Andric "^UQR?SHRN[BT]_ZZI_[BHS]")>; 1650753f127fSDimitry Andric 1651753f127fSDimitry Andric// Arithmetic, shift right for divide 1652*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^ASRD_(ZPmI|ZPZI)_[BHSD]")>; 1653753f127fSDimitry Andric 1654753f127fSDimitry Andric// Arithmetic, shift rounding 1655*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]RSHLR?_ZPmZ_[BHSD]", 1656*0fca6ea1SDimitry Andric "^[SU]RSHL_ZPZZ_[BHSD]", 1657*0fca6ea1SDimitry Andric "^[SU]RSHR_(ZPmI|ZPZI)_[BHSD]")>; 1658753f127fSDimitry Andric 1659753f127fSDimitry Andric// Bit manipulation 1660*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_2V1], (instregex "^(BDEP|BEXT|BGRP)_ZZZ_[BHSD]")>; 1661753f127fSDimitry Andric 1662753f127fSDimitry Andric// Bitwise select 1663753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^(BSL|BSL1N|BSL2N|NBSL)_ZZZZ$")>; 1664753f127fSDimitry Andric 1665753f127fSDimitry Andric// Count/reverse bits 1666*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^(CLS|CLZ|CNT|RBIT)_ZPmZ_[BHSD]")>; 1667753f127fSDimitry Andric 1668753f127fSDimitry Andric// Broadcast logical bitmask immediate to vector 1669753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instrs DUPM_ZI)>; 1670753f127fSDimitry Andric 1671753f127fSDimitry Andric// Compare and set flags 1672753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0_1M], 1673753f127fSDimitry Andric (instregex "^CMP(EQ|GE|GT|HI|HS|LE|LO|LS|LT|NE)_PPzZ[IZ]_[BHSD]$", 1674753f127fSDimitry Andric "^CMP(EQ|GE|GT|HI|HS|LE|LO|LS|LT|NE)_WIDE_PPzZZ_[BHS]$")>; 1675753f127fSDimitry Andric 1676753f127fSDimitry Andric// Complex add 1677753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^(SQ)?CADD_ZZI_[BHSD]$")>; 1678753f127fSDimitry Andric 1679753f127fSDimitry Andric// Complex dot product 8-bit element 1680753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instrs CDOT_ZZZ_S, CDOT_ZZZI_S)>; 1681753f127fSDimitry Andric 1682753f127fSDimitry Andric// Complex dot product 16-bit element 1683753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instrs CDOT_ZZZ_D, CDOT_ZZZI_D)>; 1684753f127fSDimitry Andric 1685753f127fSDimitry Andric// Complex multiply-add B, H, S element size 1686753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^CMLA_ZZZ_[BHS]$", 1687753f127fSDimitry Andric "^CMLA_ZZZI_[HS]$")>; 1688753f127fSDimitry Andric 1689753f127fSDimitry Andric// Complex multiply-add D element size 1690753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instrs CMLA_ZZZ_D)>; 1691753f127fSDimitry Andric 1692753f127fSDimitry Andric// Conditional extract operations, scalar form 1693753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1M0_1V1_1V], (instregex "^CLAST[AB]_RPZ_[BHSD]$")>; 1694753f127fSDimitry Andric 1695753f127fSDimitry Andric// Conditional extract operations, SIMD&FP scalar and vector forms 1696753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V1], (instregex "^CLAST[AB]_[VZ]PZ_[BHSD]$", 1697753f127fSDimitry Andric "^COMPACT_ZPZ_[SD]$", 1698753f127fSDimitry Andric "^SPLICE_ZPZZ?_[BHSD]$")>; 1699753f127fSDimitry Andric 1700753f127fSDimitry Andric// Convert to floating point, 64b to float or convert to double 1701*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^[SU]CVTF_ZPmZ_Dto[HSD]", 1702*0fca6ea1SDimitry Andric "^[SU]CVTF_ZPmZ_StoD")>; 1703753f127fSDimitry Andric 1704753f127fSDimitry Andric// Convert to floating point, 32b to single or half 1705*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^[SU]CVTF_ZPmZ_Sto[HS]")>; 1706753f127fSDimitry Andric 1707753f127fSDimitry Andric// Convert to floating point, 16b to half 1708*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^[SU]CVTF_ZPmZ_HtoH")>; 1709753f127fSDimitry Andric 1710753f127fSDimitry Andric// Copy, scalar 1711753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1M0_1V], (instregex "^CPY_ZPmR_[BHSD]$")>; 1712753f127fSDimitry Andric 1713753f127fSDimitry Andric// Copy, scalar SIMD&FP or imm 1714753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^CPY_ZPm[IV]_[BHSD]$", 1715753f127fSDimitry Andric "^CPY_ZPzI_[BHSD]$")>; 1716753f127fSDimitry Andric 1717753f127fSDimitry Andric// Divides, 32 bit 1718*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_12cyc_1V0], (instregex "^[SU]DIVR?_ZPmZ_S", 1719*0fca6ea1SDimitry Andric "^[SU]DIV_ZPZZ_S")>; 1720753f127fSDimitry Andric 1721753f127fSDimitry Andric// Divides, 64 bit 1722*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_20cyc_1V0], (instregex "^[SU]DIVR?_ZPmZ_D", 1723*0fca6ea1SDimitry Andric "^[SU]DIV_ZPZZ_D")>; 1724753f127fSDimitry Andric 1725753f127fSDimitry Andric// Dot product, 8 bit 1726753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^[SU]DOT_ZZZI?_S$")>; 1727753f127fSDimitry Andric 1728753f127fSDimitry Andric// Dot product, 8 bit, using signed and unsigned integers 1729753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instrs SUDOT_ZZZI, USDOT_ZZZI, USDOT_ZZZ)>; 1730753f127fSDimitry Andric 1731753f127fSDimitry Andric// Dot product, 16 bit 1732753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^[SU]DOT_ZZZI?_D$")>; 1733753f127fSDimitry Andric 1734753f127fSDimitry Andric// Duplicate, immediate and indexed form 1735753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^DUP_ZI_[BHSD]$", 1736753f127fSDimitry Andric "^DUP_ZZI_[BHSDQ]$")>; 1737753f127fSDimitry Andric 1738753f127fSDimitry Andric// Duplicate, scalar form 1739753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1M0], (instregex "^DUP_ZR_[BHSD]$")>; 1740753f127fSDimitry Andric 1741753f127fSDimitry Andric// Extend, sign or zero 1742*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V1], (instregex "^[SU]XTB_ZPmZ_[HSD]", 1743*0fca6ea1SDimitry Andric "^[SU]XTH_ZPmZ_[SD]", 1744*0fca6ea1SDimitry Andric "^[SU]XTW_ZPmZ_[D]")>; 1745753f127fSDimitry Andric 1746753f127fSDimitry Andric// Extract 1747753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instrs EXT_ZZI, EXT_ZZI_B)>; 1748753f127fSDimitry Andric 1749753f127fSDimitry Andric// Extract narrow saturating 1750753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V1], (instregex "^[SU]QXTN[BT]_ZZ_[BHS]$", 1751753f127fSDimitry Andric "^SQXTUN[BT]_ZZ_[BHS]$")>; 1752753f127fSDimitry Andric 1753753f127fSDimitry Andric// Extract/insert operation, SIMD and FP scalar form 1754753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V1], (instregex "^LAST[AB]_VPZ_[BHSD]$", 1755753f127fSDimitry Andric "^INSR_ZV_[BHSD]$")>; 1756753f127fSDimitry Andric 1757753f127fSDimitry Andric// Extract/insert operation, scalar 1758753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1V1_1M0], (instregex "^LAST[AB]_RPZ_[BHSD]$", 1759753f127fSDimitry Andric "^INSR_ZR_[BHSD]$")>; 1760753f127fSDimitry Andric 1761753f127fSDimitry Andric// Histogram operations 1762753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^HISTCNT_ZPzZZ_[SD]$", 1763753f127fSDimitry Andric "^HISTSEG_ZZZ$")>; 1764753f127fSDimitry Andric 1765753f127fSDimitry Andric// Horizontal operations, B, H, S form, immediate operands only 1766753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^INDEX_II_[BHS]$")>; 1767753f127fSDimitry Andric 1768753f127fSDimitry Andric// Horizontal operations, B, H, S form, scalar, immediate operands/ scalar 1769753f127fSDimitry Andric// operands only / immediate, scalar operands 1770753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_1M0_1V0], (instregex "^INDEX_(IR|RI|RR)_[BHS]$")>; 1771753f127fSDimitry Andric 1772753f127fSDimitry Andric// Horizontal operations, D form, immediate operands only 1773753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instrs INDEX_II_D)>; 1774753f127fSDimitry Andric 1775753f127fSDimitry Andric// Horizontal operations, D form, scalar, immediate operands)/ scalar operands 1776753f127fSDimitry Andric// only / immediate, scalar operands 1777753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2M0_2V0], (instregex "^INDEX_(IR|RI|RR)_D$")>; 1778753f127fSDimitry Andric 1779753f127fSDimitry Andric// Logical 1780753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], 1781*0fca6ea1SDimitry Andric (instregex "^(AND|EOR|ORR)_ZI", 1782*0fca6ea1SDimitry Andric "^(AND|BIC|EOR|ORR)_ZZZ", 1783*0fca6ea1SDimitry Andric "^EOR(BT|TB)_ZZZ_[BHSD]", 1784*0fca6ea1SDimitry Andric "^(AND|BIC|EOR|NOT|ORR)_(ZPmZ|ZPZZ)_[BHSD]", 1785*0fca6ea1SDimitry Andric "^NOT_ZPmZ_[BHSD]")>; 1786753f127fSDimitry Andric 1787753f127fSDimitry Andric// Max/min, basic and pairwise 1788*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^[SU](MAX|MIN)_ZI_[BHSD]", 1789*0fca6ea1SDimitry Andric "^[SU](MAX|MIN)P?_ZPmZ_[BHSD]", 1790*0fca6ea1SDimitry Andric "^[SU](MAX|MIN)_ZPZZ_[BHSD]")>; 1791753f127fSDimitry Andric 1792753f127fSDimitry Andric// Matching operations 1793753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0_1M], (instregex "^N?MATCH_PPzZZ_[BH]$")>; 1794753f127fSDimitry Andric 1795753f127fSDimitry Andric// Matrix multiply-accumulate 1796753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instrs SMMLA_ZZZ, UMMLA_ZZZ, USMMLA_ZZZ)>; 1797753f127fSDimitry Andric 1798753f127fSDimitry Andric// Move prefix 1799753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^MOVPRFX_ZP[mz]Z_[BHSD]$", 1800753f127fSDimitry Andric "^MOVPRFX_ZZ$")>; 1801753f127fSDimitry Andric 1802753f127fSDimitry Andric// Multiply, B, H, S element size 1803*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^MUL_(ZI|ZPmZ|ZZZI|ZZZ)_[BHS]", 1804*0fca6ea1SDimitry Andric "^MUL_ZPZZ_[BHS]", 1805*0fca6ea1SDimitry Andric "^[SU]MULH_(ZPmZ|ZZZ)_[BHS]", 1806*0fca6ea1SDimitry Andric "^[SU]MULH_ZPZZ_[BHS]")>; 1807753f127fSDimitry Andric 1808753f127fSDimitry Andric// Multiply, D element size 1809*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instregex "^MUL_(ZI|ZPmZ|ZZZI|ZZZ)_D", 1810*0fca6ea1SDimitry Andric "^MUL_ZPZZ_D", 1811*0fca6ea1SDimitry Andric "^[SU]MULH_(ZPmZ|ZZZ)_D", 1812*0fca6ea1SDimitry Andric "^[SU]MULH_ZPZZ_D")>; 1813753f127fSDimitry Andric 1814753f127fSDimitry Andric// Multiply long 1815753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^[SU]MULL[BT]_ZZZI_[SD]$", 1816753f127fSDimitry Andric "^[SU]MULL[BT]_ZZZ_[HSD]$")>; 1817753f127fSDimitry Andric 1818753f127fSDimitry Andric// Multiply accumulate, B, H, S element size 1819753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^ML[AS]_ZZZI_[BHS]$", 1820*0fca6ea1SDimitry Andric "^(ML[AS]|MAD|MSB)_(ZPmZZ|ZPZZZ)_[BHS]")>; 1821753f127fSDimitry Andric 1822753f127fSDimitry Andric// Multiply accumulate, D element size 1823753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instregex "^ML[AS]_ZZZI_D$", 1824*0fca6ea1SDimitry Andric "^(ML[AS]|MAD|MSB)_(ZPmZZ|ZPZZZ)_D")>; 1825753f127fSDimitry Andric 1826753f127fSDimitry Andric// Multiply accumulate long 1827753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^[SU]ML[AS]L[BT]_ZZZ_[HSD]$", 1828753f127fSDimitry Andric "^[SU]ML[AS]L[BT]_ZZZI_[SD]$")>; 1829753f127fSDimitry Andric 1830753f127fSDimitry Andric// Multiply accumulate saturating doubling long regular 1831753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQDML[AS](LB|LT|LBT)_ZZZ_[HSD]$", 1832753f127fSDimitry Andric "^SQDML[AS](LB|LT)_ZZZI_[SD]$")>; 1833753f127fSDimitry Andric 1834753f127fSDimitry Andric// Multiply saturating doubling high, B, H, S element size 1835753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQDMULH_ZZZ_[BHS]$", 1836753f127fSDimitry Andric "^SQDMULH_ZZZI_[HS]$")>; 1837753f127fSDimitry Andric 1838753f127fSDimitry Andric// Multiply saturating doubling high, D element size 1839753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instrs SQDMULH_ZZZ_D, SQDMULH_ZZZI_D)>; 1840753f127fSDimitry Andric 1841753f127fSDimitry Andric// Multiply saturating doubling long 1842753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQDMULL[BT]_ZZZ_[HSD]$", 1843753f127fSDimitry Andric "^SQDMULL[BT]_ZZZI_[SD]$")>; 1844753f127fSDimitry Andric 1845753f127fSDimitry Andric// Multiply saturating rounding doubling regular/complex accumulate, B, H, S 1846753f127fSDimitry Andric// element size 1847753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQRDML[AS]H_ZZZ_[BHS]$", 1848753f127fSDimitry Andric "^SQRDCMLAH_ZZZ_[BHS]$", 1849753f127fSDimitry Andric "^SQRDML[AS]H_ZZZI_[HS]$", 1850753f127fSDimitry Andric "^SQRDCMLAH_ZZZI_[HS]$")>; 1851753f127fSDimitry Andric 1852753f127fSDimitry Andric// Multiply saturating rounding doubling regular/complex accumulate, D element 1853753f127fSDimitry Andric// size 1854753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instregex "^SQRDML[AS]H_ZZZI?_D$", 1855753f127fSDimitry Andric "^SQRDCMLAH_ZZZ_D$")>; 1856753f127fSDimitry Andric 1857753f127fSDimitry Andric// Multiply saturating rounding doubling regular/complex, B, H, S element size 1858753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SQRDMULH_ZZZ_[BHS]$", 1859753f127fSDimitry Andric "^SQRDMULH_ZZZI_[HS]$")>; 1860753f127fSDimitry Andric 1861753f127fSDimitry Andric// Multiply saturating rounding doubling regular/complex, D element size 1862753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_2V0], (instregex "^SQRDMULH_ZZZI?_D$")>; 1863753f127fSDimitry Andric 1864753f127fSDimitry Andric// Multiply/multiply long, (8x8) polynomial 1865753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^PMUL_ZZZ_B$", 1866753f127fSDimitry Andric "^PMULL[BT]_ZZZ_[HDQ]$")>; 1867753f127fSDimitry Andric 1868753f127fSDimitry Andric// Predicate counting vector 1869753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], 1870753f127fSDimitry Andric (instregex "^(DEC|INC|SQDEC|SQINC|UQDEC|UQINC)[HWD]_ZPiI$")>; 1871753f127fSDimitry Andric 1872753f127fSDimitry Andric// Reciprocal estimate 1873*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^URECPE_ZPmZ_S", "^URSQRTE_ZPmZ_S")>; 1874753f127fSDimitry Andric 1875753f127fSDimitry Andric// Reduction, arithmetic, B form 1876753f127fSDimitry Andricdef : InstRW<[N2Write_11cyc_2V_2V1], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_B")>; 1877753f127fSDimitry Andric 1878753f127fSDimitry Andric// Reduction, arithmetic, H form 1879753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_2V_2V1], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_H")>; 1880753f127fSDimitry Andric 1881753f127fSDimitry Andric// Reduction, arithmetic, S form 1882753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2V_2V1], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_S")>; 1883753f127fSDimitry Andric 1884753f127fSDimitry Andric// Reduction, arithmetic, D form 1885753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_2V_2V1], (instregex "^[SU](ADD|MAX|MIN)V_VPZ_D")>; 1886753f127fSDimitry Andric 1887753f127fSDimitry Andric// Reduction, logical 1888753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1V_1V1], (instregex "^(ANDV|EORV|ORV)_VPZ_[BHSD]$")>; 1889753f127fSDimitry Andric 1890753f127fSDimitry Andric// Reverse, vector 1891753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^REV_ZZ_[BHSD]$", 1892753f127fSDimitry Andric "^REVB_ZPmZ_[HSD]$", 1893753f127fSDimitry Andric "^REVH_ZPmZ_[SD]$", 1894753f127fSDimitry Andric "^REVW_ZPmZ_D$")>; 1895753f127fSDimitry Andric 1896753f127fSDimitry Andric// Select, vector form 1897753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^SEL_ZPZZ_[BHSD]$")>; 1898753f127fSDimitry Andric 1899753f127fSDimitry Andric// Table lookup 1900753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^TBL_ZZZZ?_[BHSD]$")>; 1901753f127fSDimitry Andric 1902753f127fSDimitry Andric// Table lookup extension 1903753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^TBX_ZZZ_[BHSD]$")>; 1904753f127fSDimitry Andric 1905753f127fSDimitry Andric// Transpose, vector form 1906753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^TRN[12]_ZZZ_[BHSDQ]$")>; 1907753f127fSDimitry Andric 1908753f127fSDimitry Andric// Unpack and extend 1909753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^[SU]UNPK(HI|LO)_ZZ_[HSD]$")>; 1910753f127fSDimitry Andric 1911753f127fSDimitry Andric// Zip/unzip 1912753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^(UZP|ZIP)[12]_ZZZ_[BHSDQ]$")>; 1913753f127fSDimitry Andric 1914753f127fSDimitry Andric// SVE floating-point instructions 1915753f127fSDimitry Andric// ----------------------------------------------------------------------------- 1916753f127fSDimitry Andric 1917753f127fSDimitry Andric// Floating point absolute value/difference 1918*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^FAB[SD]_ZPmZ_[HSD]", 1919*0fca6ea1SDimitry Andric "^FABD_ZPZZ_[HSD]", 1920*0fca6ea1SDimitry Andric "^FABS_ZPmZ_[HSD]")>; 1921753f127fSDimitry Andric 1922753f127fSDimitry Andric// Floating point arithmetic 1923*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^F(ADD|SUB)_(ZPm[IZ]|ZZZ)_[HSD]", 1924*0fca6ea1SDimitry Andric "^F(ADD|SUB)_ZPZ[IZ]_[HSD]", 1925*0fca6ea1SDimitry Andric "^FADDP_ZPmZZ_[HSD]", 1926*0fca6ea1SDimitry Andric "^FNEG_ZPmZ_[HSD]", 1927*0fca6ea1SDimitry Andric "^FSUBR_ZPm[IZ]_[HSD]", 1928*0fca6ea1SDimitry Andric "^FSUBR_(ZPZI|ZPZZ)_[HSD]")>; 1929753f127fSDimitry Andric 1930753f127fSDimitry Andric// Floating point associative add, F16 1931753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_1V1], (instrs FADDA_VPZ_H)>; 1932753f127fSDimitry Andric 1933753f127fSDimitry Andric// Floating point associative add, F32 1934753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1V1], (instrs FADDA_VPZ_S)>; 1935753f127fSDimitry Andric 1936753f127fSDimitry Andric// Floating point associative add, F64 1937753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instrs FADDA_VPZ_D)>; 1938753f127fSDimitry Andric 1939753f127fSDimitry Andric// Floating point compare 1940753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^FACG[ET]_PPzZZ_[HSD]$", 1941753f127fSDimitry Andric "^FCM(EQ|GE|GT|NE)_PPzZ[0Z]_[HSD]$", 1942753f127fSDimitry Andric "^FCM(LE|LT)_PPzZ0_[HSD]$", 1943753f127fSDimitry Andric "^FCMUO_PPzZZ_[HSD]$")>; 1944753f127fSDimitry Andric 1945753f127fSDimitry Andric// Floating point complex add 1946753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^FCADD_ZPmZ_[HSD]$")>; 1947753f127fSDimitry Andric 1948753f127fSDimitry Andric// Floating point complex multiply add 1949753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1V], (instregex "^FCMLA_ZPmZZ_[HSD]$", 1950753f127fSDimitry Andric "^FCMLA_ZZZI_[HS]$")>; 1951753f127fSDimitry Andric 1952753f127fSDimitry Andric// Floating point convert, long or narrow (F16 to F32 or F32 to F16) 1953*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FCVT_ZPmZ_(HtoS|StoH)", 1954*0fca6ea1SDimitry Andric "^FCVTLT_ZPmZ_HtoS", 1955*0fca6ea1SDimitry Andric "^FCVTNT_ZPmZ_StoH")>; 1956753f127fSDimitry Andric 1957753f127fSDimitry Andric// Floating point convert, long or narrow (F16 to F64, F32 to F64, F64 to F32 1958753f127fSDimitry Andric// or F64 to F16) 1959*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FCVT_ZPmZ_(HtoD|StoD|DtoS|DtoH)", 1960*0fca6ea1SDimitry Andric "^FCVTLT_ZPmZ_StoD", 1961*0fca6ea1SDimitry Andric "^FCVTNT_ZPmZ_DtoS")>; 1962753f127fSDimitry Andric 1963753f127fSDimitry Andric// Floating point convert, round to odd 1964753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instrs FCVTX_ZPmZ_DtoS, FCVTXNT_ZPmZ_DtoS)>; 1965753f127fSDimitry Andric 1966753f127fSDimitry Andric// Floating point base2 log, F16 1967*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^FLOGB_(ZPmZ|ZPZZ)_H")>; 1968753f127fSDimitry Andric 1969753f127fSDimitry Andric// Floating point base2 log, F32 1970*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FLOGB_(ZPmZ|ZPZZ)_S")>; 1971753f127fSDimitry Andric 1972753f127fSDimitry Andric// Floating point base2 log, F64 1973*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FLOGB_(ZPmZ|ZPZZ)_D")>; 1974753f127fSDimitry Andric 1975753f127fSDimitry Andric// Floating point convert to integer, F16 1976*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^FCVTZ[SU]_ZPmZ_HtoH")>; 1977753f127fSDimitry Andric 1978753f127fSDimitry Andric// Floating point convert to integer, F32 1979*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FCVTZ[SU]_ZPmZ_(HtoS|StoS)")>; 1980753f127fSDimitry Andric 1981753f127fSDimitry Andric// Floating point convert to integer, F64 1982753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], 1983*0fca6ea1SDimitry Andric (instregex "^FCVTZ[SU]_ZPmZ_(HtoD|StoD|DtoS|DtoD)")>; 1984753f127fSDimitry Andric 1985753f127fSDimitry Andric// Floating point copy 1986753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^FCPY_ZPmI_[HSD]$", 1987753f127fSDimitry Andric "^FDUP_ZI_[HSD]$")>; 1988753f127fSDimitry Andric 1989753f127fSDimitry Andric// Floating point divide, F16 1990*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_13cyc_1V0], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_H")>; 1991753f127fSDimitry Andric 1992753f127fSDimitry Andric// Floating point divide, F32 1993*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_10cyc_1V0], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_S")>; 1994753f127fSDimitry Andric 1995753f127fSDimitry Andric// Floating point divide, F64 1996*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_15cyc_1V0], (instregex "^FDIVR?_(ZPmZ|ZPZZ)_D")>; 1997753f127fSDimitry Andric 1998753f127fSDimitry Andric// Floating point min/max pairwise 1999*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^F(MAX|MIN)(NM)?P_ZPmZZ_[HSD]")>; 2000753f127fSDimitry Andric 2001753f127fSDimitry Andric// Floating point min/max 2002*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^F(MAX|MIN)(NM)?_ZPm[IZ]_[HSD]", 2003*0fca6ea1SDimitry Andric "^F(MAX|MIN)(NM)?_ZPZ[IZ]_[HSD]")>; 2004753f127fSDimitry Andric 2005753f127fSDimitry Andric// Floating point multiply 2006*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^(FSCALE|FMULX)_ZPmZ_[HSD]", 2007*0fca6ea1SDimitry Andric "^FMULX_ZPZZ_[HSD]", 2008*0fca6ea1SDimitry Andric "^FMUL_(ZPm[IZ]|ZZZI?)_[HSD]", 2009*0fca6ea1SDimitry Andric "^FMUL_ZPZ[IZ]_[HSD]")>; 2010753f127fSDimitry Andric 2011753f127fSDimitry Andric// Floating point multiply accumulate 2012*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^F(N?M(AD|SB)|N?ML[AS])_ZPmZZ_[HSD]$", 2013*0fca6ea1SDimitry Andric "^FN?ML[AS]_ZPZZZ_[HSD]", 2014*0fca6ea1SDimitry Andric "^FML[AS]_ZZZI_[HSD]$")>; 2015753f127fSDimitry Andric 2016753f127fSDimitry Andric// Floating point multiply add/sub accumulate long 2017753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FML[AS]L[BT]_ZZZI?_SHH$")>; 2018753f127fSDimitry Andric 2019753f127fSDimitry Andric// Floating point reciprocal estimate, F16 2020*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^FR(ECP|SQRT)E_ZZ_H", "^FRECPX_ZPmZ_H")>; 2021753f127fSDimitry Andric 2022753f127fSDimitry Andric// Floating point reciprocal estimate, F32 2023*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FR(ECP|SQRT)E_ZZ_S", "^FRECPX_ZPmZ_S")>; 2024753f127fSDimitry Andric 2025753f127fSDimitry Andric// Floating point reciprocal estimate, F64 2026*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FR(ECP|SQRT)E_ZZ_D", "^FRECPX_ZPmZ_D")>; 2027753f127fSDimitry Andric 2028753f127fSDimitry Andric// Floating point reciprocal step 2029753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^F(RECPS|RSQRTS)_ZZZ_[HSD]$")>; 2030753f127fSDimitry Andric 2031753f127fSDimitry Andric// Floating point reduction, F16 2032753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_2V], 2033753f127fSDimitry Andric (instregex "^(FADDV|FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_H$")>; 2034753f127fSDimitry Andric 2035753f127fSDimitry Andric// Floating point reduction, F32 2036753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], 2037753f127fSDimitry Andric (instregex "^(FADDV|FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_S$")>; 2038753f127fSDimitry Andric 2039753f127fSDimitry Andric// Floating point reduction, F64 2040753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], 2041753f127fSDimitry Andric (instregex "^(FADDV|FMAXNMV|FMAXV|FMINNMV|FMINV)_VPZ_D$")>; 2042753f127fSDimitry Andric 2043753f127fSDimitry Andric// Floating point round to integral, F16 2044*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_4V0], (instregex "^FRINT[AIMNPXZ]_ZPmZ_H")>; 2045753f127fSDimitry Andric 2046753f127fSDimitry Andric// Floating point round to integral, F32 2047*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_4cyc_2V0], (instregex "^FRINT[AIMNPXZ]_ZPmZ_S")>; 2048753f127fSDimitry Andric 2049753f127fSDimitry Andric// Floating point round to integral, F64 2050*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instregex "^FRINT[AIMNPXZ]_ZPmZ_D")>; 2051753f127fSDimitry Andric 2052753f127fSDimitry Andric// Floating point square root, F16 2053*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_13cyc_1V0], (instregex "^FSQRT_ZPmZ_H")>; 2054753f127fSDimitry Andric 2055753f127fSDimitry Andric// Floating point square root, F32 2056*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_10cyc_1V0], (instregex "^FSQRT_ZPmZ_S")>; 2057753f127fSDimitry Andric 2058753f127fSDimitry Andric// Floating point square root, F64 2059*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_16cyc_1V0], (instregex "^FSQRT_ZPmZ_D")>; 2060753f127fSDimitry Andric 2061753f127fSDimitry Andric// Floating point trigonometric exponentiation 2062753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V1], (instregex "^FEXPA_ZZ_[HSD]$")>; 2063753f127fSDimitry Andric 2064753f127fSDimitry Andric// Floating point trigonometric multiply add 2065753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^FTMAD_ZZI_[HSD]$")>; 2066753f127fSDimitry Andric 2067753f127fSDimitry Andric// Floating point trigonometric, miscellaneous 2068753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V], (instregex "^FTS(MUL|SEL)_ZZZ_[HSD]$")>; 2069753f127fSDimitry Andric 2070753f127fSDimitry Andric// SVE BFloat16 (BF16) instructions 2071753f127fSDimitry Andric// ----------------------------------------------------------------------------- 2072753f127fSDimitry Andric 2073753f127fSDimitry Andric// Convert, F32 to BF16 2074753f127fSDimitry Andricdef : InstRW<[N2Write_3cyc_1V0], (instrs BFCVT_ZPmZ, BFCVTNT_ZPmZ)>; 2075753f127fSDimitry Andric 2076753f127fSDimitry Andric// Dot product 2077753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instrs BFDOT_ZZI, BFDOT_ZZZ)>; 2078753f127fSDimitry Andric 2079753f127fSDimitry Andric// Matrix multiply accumulate 2080753f127fSDimitry Andricdef : InstRW<[N2Write_5cyc_1V], (instrs BFMMLA_ZZZ)>; 2081753f127fSDimitry Andric 2082753f127fSDimitry Andric// Multiply accumulate long 2083bdd1243dSDimitry Andricdef : InstRW<[N2Write_4cyc_1V], (instregex "^BFMLAL[BT]_ZZZ(I)?$")>; 2084753f127fSDimitry Andric 2085753f127fSDimitry Andric// SVE Load instructions 2086753f127fSDimitry Andric// ----------------------------------------------------------------------------- 2087753f127fSDimitry Andric 2088753f127fSDimitry Andric// Load vector 2089753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instrs LDR_ZXI)>; 2090753f127fSDimitry Andric 2091753f127fSDimitry Andric// Load predicate 2092753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L_1M], (instrs LDR_PXI)>; 2093753f127fSDimitry Andric 2094753f127fSDimitry Andric// Contiguous load, scalar + imm 20955f757f3fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LD1[BHWD]_IMM$", 20965f757f3fSDimitry Andric "^LD1S?B_[HSD]_IMM$", 20975f757f3fSDimitry Andric "^LD1S?H_[SD]_IMM$", 20985f757f3fSDimitry Andric "^LD1S?W_D_IMM$" )>; 2099753f127fSDimitry Andric// Contiguous load, scalar + scalar 2100753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L01], (instregex "^LD1[BHWD]$", 2101753f127fSDimitry Andric "^LD1S?B_[HSD]$", 2102753f127fSDimitry Andric "^LD1S?H_[SD]$", 2103753f127fSDimitry Andric "^LD1S?W_D$" )>; 2104753f127fSDimitry Andric 2105753f127fSDimitry Andric// Contiguous load broadcast, scalar + imm 2106753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LD1R[BHWD]_IMM$", 2107753f127fSDimitry Andric "^LD1RSW_IMM$", 2108753f127fSDimitry Andric "^LD1RS?B_[HSD]_IMM$", 2109753f127fSDimitry Andric "^LD1RS?H_[SD]_IMM$", 2110753f127fSDimitry Andric "^LD1RS?W_D_IMM$", 2111753f127fSDimitry Andric "^LD1RQ_[BHWD]_IMM$")>; 2112753f127fSDimitry Andric 2113753f127fSDimitry Andric// Contiguous load broadcast, scalar + scalar 2114753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LD1RQ_[BHWD]$")>; 2115753f127fSDimitry Andric 2116753f127fSDimitry Andric// Non temporal load, scalar + imm 2117753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LDNT1[BHWD]_ZRI$")>; 2118753f127fSDimitry Andric 2119753f127fSDimitry Andric// Non temporal load, scalar + scalar 2120753f127fSDimitry Andricdef : InstRW<[N2Write_6cyc_1L_1S], (instregex "^LDNT1[BHWD]_ZRR$")>; 2121753f127fSDimitry Andric 2122753f127fSDimitry Andric// Non temporal gather load, vector + scalar 32-bit element size 2123*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_9cyc_1L_1V], (instregex "^LDNT1[BHW]_ZZR_S$", 2124*0fca6ea1SDimitry Andric "^LDNT1S[BH]_ZZR_S$")>; 2125753f127fSDimitry Andric 2126753f127fSDimitry Andric// Non temporal gather load, vector + scalar 64-bit element size 2127*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_10cyc_2L_2V1], (instregex "^LDNT1S?[BHW]_ZZR_D$")>; 2128*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_10cyc_2L_2V1], (instrs LDNT1D_ZZR_D)>; 2129753f127fSDimitry Andric 2130753f127fSDimitry Andric// Contiguous first faulting load, scalar + scalar 2131*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_1L_1S], (instregex "^LDFF1[BHWD]$", 2132*0fca6ea1SDimitry Andric "^LDFF1S?B_[HSD]$", 2133*0fca6ea1SDimitry Andric "^LDFF1S?H_[SD]$", 2134*0fca6ea1SDimitry Andric "^LDFF1S?W_D$")>; 2135753f127fSDimitry Andric 2136753f127fSDimitry Andric// Contiguous non faulting load, scalar + imm 2137*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_6cyc_1L], (instregex "^LDNF1[BHWD]_IMM$", 2138*0fca6ea1SDimitry Andric "^LDNF1S?B_[HSD]_IMM$", 2139*0fca6ea1SDimitry Andric "^LDNF1S?H_[SD]_IMM$", 2140*0fca6ea1SDimitry Andric "^LDNF1S?W_D_IMM$")>; 2141753f127fSDimitry Andric 2142753f127fSDimitry Andric// Contiguous Load two structures to two vectors, scalar + imm 2143753f127fSDimitry Andricdef : InstRW<[N2Write_8cyc_1L_1V], (instregex "^LD2[BHWD]_IMM$")>; 2144753f127fSDimitry Andric 2145753f127fSDimitry Andric// Contiguous Load two structures to two vectors, scalar + scalar 2146753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_1L_1V], (instregex "^LD2[BHWD]$")>; 2147753f127fSDimitry Andric 2148753f127fSDimitry Andric// Contiguous Load three structures to three vectors, scalar + imm 2149753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_1L_1V], (instregex "^LD3[BHWD]_IMM$")>; 2150753f127fSDimitry Andric 2151753f127fSDimitry Andric// Contiguous Load three structures to three vectors, scalar + scalar 2152753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_1V_1L_1S], (instregex "^LD3[BHWD]$")>; 2153753f127fSDimitry Andric 2154753f127fSDimitry Andric// Contiguous Load four structures to four vectors, scalar + imm 2155753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_2L_2V], (instregex "^LD4[BHWD]_IMM$")>; 2156753f127fSDimitry Andric 2157753f127fSDimitry Andric// Contiguous Load four structures to four vectors, scalar + scalar 2158753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2L_2V_2S], (instregex "^LD4[BHWD]$")>; 2159753f127fSDimitry Andric 2160753f127fSDimitry Andric// Gather load, vector + imm, 32-bit element size 2161*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_9cyc_1L_1V], (instregex "^GLD(FF)?1S?[BH]_S_IMM$", 2162*0fca6ea1SDimitry Andric "^GLD(FF)?1W_IMM$")>; 2163753f127fSDimitry Andric 2164753f127fSDimitry Andric// Gather load, vector + imm, 64-bit element size 2165*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_9cyc_2L_2V], (instregex "^GLD(FF)?1S?[BHW]_D_IMM$", 2166*0fca6ea1SDimitry Andric "^GLD(FF)?1D_IMM$")>; 2167753f127fSDimitry Andric 2168753f127fSDimitry Andric// Gather load, 64-bit element size 2169753f127fSDimitry Andricdef : InstRW<[N2Write_9cyc_2L_2V], 2170*0fca6ea1SDimitry Andric (instregex "^GLD(FF)?1S?[BHW]_D_[SU]XTW(_SCALED)?$", 2171*0fca6ea1SDimitry Andric "^GLD(FF)?1S?[BHW]_D(_SCALED)?$", 2172*0fca6ea1SDimitry Andric "^GLD(FF)?1D_[SU]XTW(_SCALED)?$", 2173*0fca6ea1SDimitry Andric "^GLD(FF)?1D(_SCALED)?$")>; 2174753f127fSDimitry Andric 2175753f127fSDimitry Andric// Gather load, 32-bit scaled offset 2176753f127fSDimitry Andricdef : InstRW<[N2Write_10cyc_2L_2V], 2177*0fca6ea1SDimitry Andric (instregex "^GLD(FF)?1S?[HW]_S_[SU]XTW_SCALED$", 2178*0fca6ea1SDimitry Andric "^GLD(FF)?1W_[SU]XTW_SCALED")>; 2179753f127fSDimitry Andric 2180753f127fSDimitry Andric// Gather load, 32-bit unpacked unscaled offset 2181*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_9cyc_1L_1V], (instregex "^GLD(FF)?1S?[BH]_S_[SU]XTW$", 2182*0fca6ea1SDimitry Andric "^GLD(FF)?1W_[SU]XTW$")>; 2183753f127fSDimitry Andric 2184753f127fSDimitry Andric// SVE Store instructions 2185753f127fSDimitry Andric// ----------------------------------------------------------------------------- 2186753f127fSDimitry Andric 2187753f127fSDimitry Andric// Store from predicate reg 2188753f127fSDimitry Andricdef : InstRW<[N2Write_1cyc_1L01], (instrs STR_PXI)>; 2189753f127fSDimitry Andric 2190753f127fSDimitry Andric// Store from vector reg 2191753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instrs STR_ZXI)>; 2192753f127fSDimitry Andric 2193753f127fSDimitry Andric// Contiguous store, scalar + imm 2194753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^ST1[BHWD]_IMM$", 2195753f127fSDimitry Andric "^ST1B_[HSD]_IMM$", 2196753f127fSDimitry Andric "^ST1H_[SD]_IMM$", 2197753f127fSDimitry Andric "^ST1W_D_IMM$")>; 2198753f127fSDimitry Andric 2199753f127fSDimitry Andric// Contiguous store, scalar + scalar 2200753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1S_1V], (instregex "^ST1H(_[SD])?$")>; 2201753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^ST1[BWD]$", 2202753f127fSDimitry Andric "^ST1B_[HSD]$", 2203753f127fSDimitry Andric "^ST1W_D$")>; 2204753f127fSDimitry Andric 2205753f127fSDimitry Andric// Contiguous store two structures from two vectors, scalar + imm 2206753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1V], (instregex "^ST2[BHWD]_IMM$")>; 2207753f127fSDimitry Andric 2208753f127fSDimitry Andric// Contiguous store two structures from two vectors, scalar + scalar 2209753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1S_1V], (instrs ST2H)>; 2210753f127fSDimitry Andric 2211753f127fSDimitry Andric// Contiguous store two structures from two vectors, scalar + scalar 2212753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L01_1V], (instregex "^ST2[BWD]$")>; 2213753f127fSDimitry Andric 2214753f127fSDimitry Andric// Contiguous store three structures from three vectors, scalar + imm 2215753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_5L01_5V], (instregex "^ST3[BHWD]_IMM$")>; 2216753f127fSDimitry Andric 2217753f127fSDimitry Andric// Contiguous store three structures from three vectors, scalar + scalar 2218753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_5L01_5S_5V], (instrs ST3H)>; 2219753f127fSDimitry Andric 2220753f127fSDimitry Andric// Contiguous store three structures from three vectors, scalar + scalar 2221753f127fSDimitry Andricdef : InstRW<[N2Write_7cyc_5L01_5S_5V], (instregex "^ST3[BWD]$")>; 2222753f127fSDimitry Andric 2223753f127fSDimitry Andric// Contiguous store four structures from four vectors, scalar + imm 2224753f127fSDimitry Andricdef : InstRW<[N2Write_11cyc_9L01_9V], (instregex "^ST4[BHWD]_IMM$")>; 2225753f127fSDimitry Andric 2226753f127fSDimitry Andric// Contiguous store four structures from four vectors, scalar + scalar 2227753f127fSDimitry Andricdef : InstRW<[N2Write_11cyc_9L01_9S_9V], (instrs ST4H)>; 2228753f127fSDimitry Andric 2229753f127fSDimitry Andric// Contiguous store four structures from four vectors, scalar + scalar 2230753f127fSDimitry Andricdef : InstRW<[N2Write_11cyc_9L01_9S_9V], (instregex "^ST4[BWD]$")>; 2231753f127fSDimitry Andric 2232753f127fSDimitry Andric// Non temporal store, scalar + imm 2233753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STNT1[BHWD]_ZRI$")>; 2234753f127fSDimitry Andric 2235753f127fSDimitry Andric// Non temporal store, scalar + scalar 2236753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1S_1V], (instrs STNT1H_ZRR)>; 2237753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STNT1[BWD]_ZRR$")>; 2238753f127fSDimitry Andric 2239753f127fSDimitry Andric// Scatter non temporal store, vector + scalar 32-bit element size 2240753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2L01_2V], (instregex "^STNT1[BHW]_ZZR_S")>; 2241753f127fSDimitry Andric 2242753f127fSDimitry Andric// Scatter non temporal store, vector + scalar 64-bit element size 2243753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^STNT1[BHWD]_ZZR_D")>; 2244753f127fSDimitry Andric 2245753f127fSDimitry Andric// Scatter store vector + imm 32-bit element size 2246753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2L01_2V], (instregex "^SST1[BH]_S_IMM$", 2247753f127fSDimitry Andric "^SST1W_IMM$")>; 2248753f127fSDimitry Andric 2249753f127fSDimitry Andric// Scatter store vector + imm 64-bit element size 2250753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^SST1[BHW]_D_IMM$", 2251753f127fSDimitry Andric "^SST1D_IMM$")>; 2252753f127fSDimitry Andric 2253753f127fSDimitry Andric// Scatter store, 32-bit scaled offset 2254753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2L01_2V], 2255753f127fSDimitry Andric (instregex "^SST1(H_S|W)_[SU]XTW_SCALED$")>; 2256753f127fSDimitry Andric 2257753f127fSDimitry Andric// Scatter store, 32-bit unpacked unscaled offset 2258753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^SST1[BHW]_D_[SU]XTW$", 2259753f127fSDimitry Andric "^SST1D_[SU]XTW$")>; 2260753f127fSDimitry Andric 2261753f127fSDimitry Andric// Scatter store, 32-bit unpacked scaled offset 2262753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^SST1[HW]_D_[SU]XTW_SCALED$", 2263753f127fSDimitry Andric "^SST1D_[SU]XTW_SCALED$")>; 2264753f127fSDimitry Andric 2265753f127fSDimitry Andric// Scatter store, 32-bit unscaled offset 2266753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2L01_2V], (instregex "^SST1[BH]_S_[SU]XTW$", 2267753f127fSDimitry Andric "^SST1W_[SU]XTW$")>; 2268753f127fSDimitry Andric 2269753f127fSDimitry Andric// Scatter store, 64-bit scaled offset 2270753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^SST1[HW]_D_SCALED$", 2271753f127fSDimitry Andric "^SST1D_SCALED$")>; 2272753f127fSDimitry Andric 2273753f127fSDimitry Andric// Scatter store, 64-bit unscaled offset 2274753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1L01_1V], (instregex "^SST1[BHW]_D$", 2275753f127fSDimitry Andric "^SST1D$")>; 2276753f127fSDimitry Andric 2277753f127fSDimitry Andric// SVE Miscellaneous instructions 2278753f127fSDimitry Andric// ----------------------------------------------------------------------------- 2279753f127fSDimitry Andric 2280753f127fSDimitry Andric// Read first fault register, unpredicated 2281*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_2cyc_1M0], (instrs RDFFR_P)>; 2282753f127fSDimitry Andric 2283753f127fSDimitry Andric// Read first fault register, predicated 2284*0fca6ea1SDimitry Andricdef : InstRW<[N2Write_3cyc_1M0_1M], (instrs RDFFR_PPz)>; 2285753f127fSDimitry Andric 2286753f127fSDimitry Andric// Read first fault register and set flags 2287753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_2M0_2M], (instrs RDFFRS_PPz)>; 2288753f127fSDimitry Andric 2289753f127fSDimitry Andric// Set first fault register 2290753f127fSDimitry Andric// Write to first fault register 2291753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1M0], (instrs SETFFR, WRFFR)>; 2292753f127fSDimitry Andric 2293753f127fSDimitry Andric// Prefetch 2294753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1L], (instregex "^PRF[BHWD]")>; 2295753f127fSDimitry Andric 2296753f127fSDimitry Andric// SVE Cryptographic instructions 2297753f127fSDimitry Andric// ----------------------------------------------------------------------------- 2298753f127fSDimitry Andric 2299753f127fSDimitry Andric// Crypto AES ops 2300753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V], (instregex "^AES[DE]_ZZZ_B$", 2301753f127fSDimitry Andric "^AESI?MC_ZZ_B$")>; 2302753f127fSDimitry Andric 2303753f127fSDimitry Andric// Crypto SHA3 ops 2304753f127fSDimitry Andricdef : InstRW<[N2Write_2cyc_1V0], (instregex "^(BCAX|EOR3)_ZZZZ$", 2305753f127fSDimitry Andric "^RAX1_ZZZ_D$", 2306753f127fSDimitry Andric "^XAR_ZZZI_[BHSD]$")>; 2307753f127fSDimitry Andric 2308753f127fSDimitry Andric// Crypto SM4 ops 2309753f127fSDimitry Andricdef : InstRW<[N2Write_4cyc_1V0], (instregex "^SM4E(KEY)?_ZZZ_S$")>; 2310753f127fSDimitry Andric 2311753f127fSDimitry Andric} 2312