106c3fb27SDimitry Andric//=- AArch64SchedNeoverseN1.td - NeoverseN1 Scheduling Model -*- tablegen -*-=// 206c3fb27SDimitry Andric// 306c3fb27SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406c3fb27SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 506c3fb27SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606c3fb27SDimitry Andric// 706c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 806c3fb27SDimitry Andric// 906c3fb27SDimitry Andric// This file defines the scheduling model for the Arm Neoverse N1 processors. 1006c3fb27SDimitry Andric// 1106c3fb27SDimitry Andric// References: 1206c3fb27SDimitry Andric// - "Arm Neoverse N1 Software Optimization Guide" 1306c3fb27SDimitry Andric// - https://en.wikichip.org/wiki/arm_holdings/microarchitectures/neoverse_n1 1406c3fb27SDimitry Andric// 1506c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 1606c3fb27SDimitry Andric 1706c3fb27SDimitry Andricdef NeoverseN1Model : SchedMachineModel { 1806c3fb27SDimitry Andric let IssueWidth = 8; // Maximum micro-ops dispatch rate. 1906c3fb27SDimitry Andric let MicroOpBufferSize = 128; // NOTE: Copied from Cortex-A76. 2006c3fb27SDimitry Andric let LoadLatency = 4; // Optimistic load latency. 2106c3fb27SDimitry Andric let MispredictPenalty = 11; // Cycles cost of branch mispredicted. 2206c3fb27SDimitry Andric let LoopMicroOpBufferSize = 16; // NOTE: Copied from Cortex-A57. 2306c3fb27SDimitry Andric let CompleteModel = 1; 2406c3fb27SDimitry Andric 2506c3fb27SDimitry Andric list<Predicate> UnsupportedFeatures = !listconcat(PAUnsupported.F, 2606c3fb27SDimitry Andric SMEUnsupported.F, 2706c3fb27SDimitry Andric SVEUnsupported.F, 28*4c2d3b02SDimitry Andric [HasMTE, HasCSSC]); 2906c3fb27SDimitry Andric} 3006c3fb27SDimitry Andric 3106c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 3206c3fb27SDimitry Andric// Define each kind of processor resource and number available on Neoverse N1. 3306c3fb27SDimitry Andric// Instructions are first fetched and then decoded into internal macro-ops 3406c3fb27SDimitry Andric// (MOPs). From there, the MOPs proceed through register renaming and dispatch 3506c3fb27SDimitry Andric// stages. A MOP can be split into one or more micro-ops further down the 3606c3fb27SDimitry Andric// pipeline, after the decode stage. Once dispatched, micro-ops wait for their 3706c3fb27SDimitry Andric// operands and issue out-of-order to one of the issue pipelines. Each issue 3806c3fb27SDimitry Andric// pipeline can accept one micro-op per cycle. 3906c3fb27SDimitry Andric 4006c3fb27SDimitry Andriclet SchedModel = NeoverseN1Model in { 4106c3fb27SDimitry Andric 4206c3fb27SDimitry Andric// Define the issue ports. 4306c3fb27SDimitry Andricdef N1UnitB : ProcResource<1>; // Branch 4406c3fb27SDimitry Andricdef N1UnitS : ProcResource<2>; // Integer single cycle 0/1 4506c3fb27SDimitry Andricdef N1UnitM : ProcResource<1>; // Integer multicycle 4606c3fb27SDimitry Andricdef N1UnitL : ProcResource<2>; // Load/Store 0/1 4706c3fb27SDimitry Andricdef N1UnitD : ProcResource<2>; // Store data 0/1 4806c3fb27SDimitry Andricdef N1UnitV0 : ProcResource<1>; // FP/ASIMD 0 4906c3fb27SDimitry Andricdef N1UnitV1 : ProcResource<1>; // FP/ASIMD 1 5006c3fb27SDimitry Andric 5106c3fb27SDimitry Andricdef N1UnitI : ProcResGroup<[N1UnitS, N1UnitM]>; // Integer units 5206c3fb27SDimitry Andricdef N1UnitV : ProcResGroup<[N1UnitV0, N1UnitV1]>; // FP/ASIMD units 5306c3fb27SDimitry Andric 5406c3fb27SDimitry Andric// Define commonly used read types. 5506c3fb27SDimitry Andric 5606c3fb27SDimitry Andric// No generic forwarding is provided for these types. 5706c3fb27SDimitry Andricdef : ReadAdvance<ReadI, 0>; 5806c3fb27SDimitry Andricdef : ReadAdvance<ReadISReg, 0>; 5906c3fb27SDimitry Andricdef : ReadAdvance<ReadIEReg, 0>; 6006c3fb27SDimitry Andricdef : ReadAdvance<ReadIM, 0>; 6106c3fb27SDimitry Andricdef : ReadAdvance<ReadIMA, 0>; 6206c3fb27SDimitry Andricdef : ReadAdvance<ReadID, 0>; 6306c3fb27SDimitry Andricdef : ReadAdvance<ReadExtrHi, 0>; 6406c3fb27SDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>; 6506c3fb27SDimitry Andricdef : ReadAdvance<ReadST, 0>; 6606c3fb27SDimitry Andricdef : ReadAdvance<ReadVLD, 0>; 6706c3fb27SDimitry Andric 6806c3fb27SDimitry Andricdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; } 6906c3fb27SDimitry Andricdef : WriteRes<WriteBarrier, []> { let Latency = 1; } 7006c3fb27SDimitry Andricdef : WriteRes<WriteHint, []> { let Latency = 1; } 7106c3fb27SDimitry Andric 7206c3fb27SDimitry Andric 7306c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 7406c3fb27SDimitry Andric// Define generic 0 micro-op types 7506c3fb27SDimitry Andric 7606c3fb27SDimitry Andriclet Latency = 0, NumMicroOps = 0 in 7706c3fb27SDimitry Andricdef N1Write_0c_0Z : SchedWriteRes<[]>; 7806c3fb27SDimitry Andric 7906c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 8006c3fb27SDimitry Andric// Define generic 1 micro-op types 8106c3fb27SDimitry Andric 8206c3fb27SDimitry Andricdef N1Write_1c_1B : SchedWriteRes<[N1UnitB]> { let Latency = 1; } 8306c3fb27SDimitry Andricdef N1Write_1c_1I : SchedWriteRes<[N1UnitI]> { let Latency = 1; } 8406c3fb27SDimitry Andricdef N1Write_2c_1M : SchedWriteRes<[N1UnitM]> { let Latency = 2; } 8506c3fb27SDimitry Andricdef N1Write_3c_1M : SchedWriteRes<[N1UnitM]> { let Latency = 3; } 8606c3fb27SDimitry Andricdef N1Write_4c3_1M : SchedWriteRes<[N1UnitM]> { let Latency = 4; 875f757f3fSDimitry Andric let ReleaseAtCycles = [3]; } 8806c3fb27SDimitry Andricdef N1Write_5c3_1M : SchedWriteRes<[N1UnitM]> { let Latency = 5; 895f757f3fSDimitry Andric let ReleaseAtCycles = [3]; } 9006c3fb27SDimitry Andricdef N1Write_12c5_1M : SchedWriteRes<[N1UnitM]> { let Latency = 12; 915f757f3fSDimitry Andric let ReleaseAtCycles = [5]; } 9206c3fb27SDimitry Andricdef N1Write_20c5_1M : SchedWriteRes<[N1UnitM]> { let Latency = 20; 935f757f3fSDimitry Andric let ReleaseAtCycles = [5]; } 9406c3fb27SDimitry Andricdef N1Write_4c_1L : SchedWriteRes<[N1UnitL]> { let Latency = 4; } 9506c3fb27SDimitry Andricdef N1Write_5c_1L : SchedWriteRes<[N1UnitL]> { let Latency = 5; } 9606c3fb27SDimitry Andricdef N1Write_7c_1L : SchedWriteRes<[N1UnitL]> { let Latency = 7; } 9706c3fb27SDimitry Andricdef N1Write_2c_1V : SchedWriteRes<[N1UnitV]> { let Latency = 2; } 9806c3fb27SDimitry Andricdef N1Write_3c_1V : SchedWriteRes<[N1UnitV]> { let Latency = 3; } 9906c3fb27SDimitry Andricdef N1Write_4c_1V : SchedWriteRes<[N1UnitV]> { let Latency = 4; } 10006c3fb27SDimitry Andricdef N1Write_5c_1V : SchedWriteRes<[N1UnitV]> { let Latency = 5; } 10106c3fb27SDimitry Andricdef N1Write_2c_1V0 : SchedWriteRes<[N1UnitV0]> { let Latency = 2; } 10206c3fb27SDimitry Andricdef N1Write_3c_1V0 : SchedWriteRes<[N1UnitV0]> { let Latency = 3; } 10306c3fb27SDimitry Andricdef N1Write_4c_1V0 : SchedWriteRes<[N1UnitV0]> { let Latency = 4; } 10406c3fb27SDimitry Andricdef N1Write_7c7_1V0 : SchedWriteRes<[N1UnitV0]> { let Latency = 7; 1055f757f3fSDimitry Andric let ReleaseAtCycles = [7]; } 10606c3fb27SDimitry Andricdef N1Write_10c7_1V0 : SchedWriteRes<[N1UnitV0]> { let Latency = 10; 1075f757f3fSDimitry Andric let ReleaseAtCycles = [7]; } 10806c3fb27SDimitry Andricdef N1Write_13c10_1V0 : SchedWriteRes<[N1UnitV0]> { let Latency = 13; 1095f757f3fSDimitry Andric let ReleaseAtCycles = [10]; } 11006c3fb27SDimitry Andricdef N1Write_15c7_1V0 : SchedWriteRes<[N1UnitV0]> { let Latency = 15; 1115f757f3fSDimitry Andric let ReleaseAtCycles = [7]; } 11206c3fb27SDimitry Andricdef N1Write_17c7_1V0 : SchedWriteRes<[N1UnitV0]> { let Latency = 17; 1135f757f3fSDimitry Andric let ReleaseAtCycles = [7]; } 11406c3fb27SDimitry Andricdef N1Write_2c_1V1 : SchedWriteRes<[N1UnitV1]> { let Latency = 2; } 11506c3fb27SDimitry Andricdef N1Write_3c_1V1 : SchedWriteRes<[N1UnitV1]> { let Latency = 3; } 11606c3fb27SDimitry Andricdef N1Write_4c_1V1 : SchedWriteRes<[N1UnitV1]> { let Latency = 4; } 11706c3fb27SDimitry Andric 11806c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 11906c3fb27SDimitry Andric// Define generic 2 micro-op types 12006c3fb27SDimitry Andric 12106c3fb27SDimitry Andriclet Latency = 1, NumMicroOps = 2 in 12206c3fb27SDimitry Andricdef N1Write_1c_1B_1I : SchedWriteRes<[N1UnitB, N1UnitI]>; 12306c3fb27SDimitry Andriclet Latency = 3, NumMicroOps = 2 in 12406c3fb27SDimitry Andricdef N1Write_3c_1I_1M : SchedWriteRes<[N1UnitI, N1UnitM]>; 12506c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 2 in 12606c3fb27SDimitry Andricdef N1Write_2c_1I_1L : SchedWriteRes<[N1UnitI, N1UnitL]>; 12706c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 2 in 12806c3fb27SDimitry Andricdef N1Write_5c_1I_1L : SchedWriteRes<[N1UnitI, N1UnitL]>; 12906c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 2 in 13006c3fb27SDimitry Andricdef N1Write_6c_1I_1L : SchedWriteRes<[N1UnitI, N1UnitL]>; 13106c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 2 in 13206c3fb27SDimitry Andricdef N1Write_7c_1I_1L : SchedWriteRes<[N1UnitI, N1UnitL]>; 13306c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 2 in 13406c3fb27SDimitry Andricdef N1Write_5c_1M_1V : SchedWriteRes<[N1UnitM, N1UnitV]>; 13506c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 2 in 13606c3fb27SDimitry Andricdef N1Write_6c_1M_1V0 : SchedWriteRes<[N1UnitM, N1UnitV0]>; 13706c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 2 in 13806c3fb27SDimitry Andricdef N1Write_5c_2L : SchedWriteRes<[N1UnitL, N1UnitL]>; 13906c3fb27SDimitry Andriclet Latency = 1, NumMicroOps = 2 in 14006c3fb27SDimitry Andricdef N1Write_1c_1L_1D : SchedWriteRes<[N1UnitL, N1UnitD]>; 14106c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 2 in 14206c3fb27SDimitry Andricdef N1Write_2c_1L_1V : SchedWriteRes<[N1UnitL, N1UnitV]>; 14306c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 2 in 14406c3fb27SDimitry Andricdef N1Write_4c_1L_1V : SchedWriteRes<[N1UnitL, N1UnitV]>; 14506c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 2 in 14606c3fb27SDimitry Andricdef N1Write_7c_1L_1V : SchedWriteRes<[N1UnitL, N1UnitV]>; 14706c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 2 in 14806c3fb27SDimitry Andricdef N1Write_4c_1V0_1V1 : SchedWriteRes<[N1UnitV0, N1UnitV1]>; 14906c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 2 in 15006c3fb27SDimitry Andricdef N1Write_4c_2V0 : SchedWriteRes<[N1UnitV0, N1UnitV0]>; 15106c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 2 in 15206c3fb27SDimitry Andricdef N1Write_5c_2V0 : SchedWriteRes<[N1UnitV0, N1UnitV0]>; 15306c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 2 in 15406c3fb27SDimitry Andricdef N1Write_6c_2V1 : SchedWriteRes<[N1UnitV1, N1UnitV1]>; 15506c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 2 in 15606c3fb27SDimitry Andricdef N1Write_5c_1V1_1V : SchedWriteRes<[N1UnitV1, N1UnitV]>; 15706c3fb27SDimitry Andric 15806c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 15906c3fb27SDimitry Andric// Define generic 3 micro-op types 16006c3fb27SDimitry Andric 16106c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 3 in 16206c3fb27SDimitry Andricdef N1Write_2c_1I_1L_1V : SchedWriteRes<[N1UnitI, N1UnitL, N1UnitV]>; 16306c3fb27SDimitry Andriclet Latency = 1, NumMicroOps = 3 in 16406c3fb27SDimitry Andricdef N1Write_1c_2L_1D : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitD]>; 16506c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 3 in 16606c3fb27SDimitry Andricdef N1Write_2c_1L_2V : SchedWriteRes<[N1UnitL, N1UnitV, N1UnitV]>; 16706c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 3 in 16806c3fb27SDimitry Andricdef N1Write_6c_3L : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL]>; 16906c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 3 in 17006c3fb27SDimitry Andricdef N1Write_4c_3V : SchedWriteRes<[N1UnitV, N1UnitV, N1UnitV]>; 17106c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 3 in 17206c3fb27SDimitry Andricdef N1Write_6c_3V : SchedWriteRes<[N1UnitV, N1UnitV, N1UnitV]>; 17306c3fb27SDimitry Andriclet Latency = 8, NumMicroOps = 3 in 17406c3fb27SDimitry Andricdef N1Write_8c_3V : SchedWriteRes<[N1UnitV, N1UnitV, N1UnitV]>; 17506c3fb27SDimitry Andric 17606c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 17706c3fb27SDimitry Andric// Define generic 4 micro-op types 17806c3fb27SDimitry Andric 17906c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 4 in 18006c3fb27SDimitry Andricdef N1Write_2c_2I_2L : SchedWriteRes<[N1UnitI, N1UnitI, N1UnitL, N1UnitL]>; 18106c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 4 in 18206c3fb27SDimitry Andricdef N1Write_6c_4L : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL]>; 18306c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 4 in 18406c3fb27SDimitry Andricdef N1Write_2c_2L_2V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitV, N1UnitV]>; 18506c3fb27SDimitry Andriclet Latency = 2, NumMicroOps = 4 in 18606c3fb27SDimitry Andricdef N1Write_3c_2L_2V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitV, N1UnitV]>; 18706c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 4 in 18806c3fb27SDimitry Andricdef N1Write_5c_2L_2V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitV, N1UnitV]>; 18906c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 4 in 19006c3fb27SDimitry Andricdef N1Write_7c_2L_2V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitV, N1UnitV]>; 19106c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 4 in 19206c3fb27SDimitry Andricdef N1Write_4c_4V : SchedWriteRes<[N1UnitV, N1UnitV, N1UnitV, N1UnitV]>; 19306c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 4 in 19406c3fb27SDimitry Andricdef N1Write_6c_4V0 : SchedWriteRes<[N1UnitV0, N1UnitV0, N1UnitV0, N1UnitV0]>; 19506c3fb27SDimitry Andric 19606c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 19706c3fb27SDimitry Andric// Define generic 5 micro-op types 19806c3fb27SDimitry Andric 19906c3fb27SDimitry Andriclet Latency = 3, NumMicroOps = 5 in 20006c3fb27SDimitry Andricdef N1Write_3c_2L_3V : SchedWriteRes<[N1UnitL, N1UnitL, 20106c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV]>; 20206c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 5 in 20306c3fb27SDimitry Andricdef N1Write_7c_2L_3V : SchedWriteRes<[N1UnitL, N1UnitL, 20406c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV]>; 20506c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 5 in 20606c3fb27SDimitry Andricdef N1Write_6c_5V : SchedWriteRes<[N1UnitV, N1UnitV, N1UnitV, N1UnitV, N1UnitV]>; 20706c3fb27SDimitry Andric 20806c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 20906c3fb27SDimitry Andric// Define generic 6 micro-op types 21006c3fb27SDimitry Andric 21106c3fb27SDimitry Andriclet Latency = 3, NumMicroOps = 6 in 21206c3fb27SDimitry Andricdef N1Write_3c_4L_2V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL, 21306c3fb27SDimitry Andric N1UnitV, N1UnitV]>; 21406c3fb27SDimitry Andriclet Latency = 4, NumMicroOps = 6 in 21506c3fb27SDimitry Andricdef N1Write_4c_3L_3V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, 21606c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV]>; 21706c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 6 in 21806c3fb27SDimitry Andricdef N1Write_5c_3L_3V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, 21906c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV]>; 22006c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 6 in 22106c3fb27SDimitry Andricdef N1Write_6c_3L_3V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, 22206c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV]>; 22306c3fb27SDimitry Andriclet Latency = 7, NumMicroOps = 6 in 22406c3fb27SDimitry Andricdef N1Write_7c_3L_3V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, 22506c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV]>; 22606c3fb27SDimitry Andriclet Latency = 8, NumMicroOps = 6 in 22706c3fb27SDimitry Andricdef N1Write_8c_3L_3V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, 22806c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV]>; 22906c3fb27SDimitry Andric 23006c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 23106c3fb27SDimitry Andric// Define generic 7 micro-op types 23206c3fb27SDimitry Andric 23306c3fb27SDimitry Andriclet Latency = 8, NumMicroOps = 7 in 23406c3fb27SDimitry Andricdef N1Write_8c_3L_4V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, 23506c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV, N1UnitV]>; 23606c3fb27SDimitry Andric 23706c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 23806c3fb27SDimitry Andric// Define generic 8 micro-op types 23906c3fb27SDimitry Andric 24006c3fb27SDimitry Andriclet Latency = 5, NumMicroOps = 8 in 24106c3fb27SDimitry Andricdef N1Write_5c_4L_4V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL, 24206c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV, N1UnitV]>; 24306c3fb27SDimitry Andriclet Latency = 6, NumMicroOps = 8 in 24406c3fb27SDimitry Andricdef N1Write_6c_4L_4V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL, 24506c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV, N1UnitV]>; 24606c3fb27SDimitry Andriclet Latency = 8, NumMicroOps = 8 in 24706c3fb27SDimitry Andricdef N1Write_8c_4L_4V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL, 24806c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV, N1UnitV]>; 24906c3fb27SDimitry Andriclet Latency = 10, NumMicroOps = 8 in 25006c3fb27SDimitry Andricdef N1Write_10c_4L_4V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, N1UnitL, 25106c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV, N1UnitV]>; 25206c3fb27SDimitry Andric 25306c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 25406c3fb27SDimitry Andric// Define generic 12 micro-op types 25506c3fb27SDimitry Andric 25606c3fb27SDimitry Andriclet Latency = 9, NumMicroOps = 12 in 25706c3fb27SDimitry Andricdef N1Write_9c_6L_6V : SchedWriteRes<[N1UnitL, N1UnitL, N1UnitL, 25806c3fb27SDimitry Andric N1UnitL, N1UnitL, N1UnitL, 25906c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV, 26006c3fb27SDimitry Andric N1UnitV, N1UnitV, N1UnitV]>; 26106c3fb27SDimitry Andric 26206c3fb27SDimitry Andric 26306c3fb27SDimitry Andric// Miscellaneous Instructions 26406c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 26506c3fb27SDimitry Andric 26606c3fb27SDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>; 26706c3fb27SDimitry Andric 26806c3fb27SDimitry Andric// Convert floating-point condition flags 26906c3fb27SDimitry Andric// Flag manipulation instructions 27006c3fb27SDimitry Andricdef : WriteRes<WriteSys, []> { let Latency = 1; } 27106c3fb27SDimitry Andric 27206c3fb27SDimitry Andric 27306c3fb27SDimitry Andric// Branch Instructions 27406c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 27506c3fb27SDimitry Andric 27606c3fb27SDimitry Andric// Branch, immed 27706c3fb27SDimitry Andric// Compare and branch 27806c3fb27SDimitry Andricdef : SchedAlias<WriteBr, N1Write_1c_1B>; 27906c3fb27SDimitry Andric 28006c3fb27SDimitry Andric// Branch, register 28106c3fb27SDimitry Andricdef : SchedAlias<WriteBrReg, N1Write_1c_1B>; 28206c3fb27SDimitry Andric 28306c3fb27SDimitry Andric// Branch and link, immed 28406c3fb27SDimitry Andric// Branch and link, register 28506c3fb27SDimitry Andricdef : InstRW<[N1Write_1c_1B_1I], (instrs BL, BLR)>; 28606c3fb27SDimitry Andric 28706c3fb27SDimitry Andric// Compare and branch 28806c3fb27SDimitry Andricdef : InstRW<[N1Write_1c_1B], (instregex "^[CT]BN?Z[XW]$")>; 28906c3fb27SDimitry Andric 29006c3fb27SDimitry Andric 29106c3fb27SDimitry Andric// Arithmetic and Logical Instructions 29206c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 29306c3fb27SDimitry Andric 29406c3fb27SDimitry Andric// ALU, basic 29506c3fb27SDimitry Andric// ALU, basic, flagset 29606c3fb27SDimitry Andric// Conditional compare 29706c3fb27SDimitry Andric// Conditional select 29806c3fb27SDimitry Andric// Logical, basic 29906c3fb27SDimitry Andric// Address generation 30006c3fb27SDimitry Andric// Count leading 30106c3fb27SDimitry Andric// Reverse bits/bytes 30206c3fb27SDimitry Andric// Move immediate 30306c3fb27SDimitry Andricdef : SchedAlias<WriteI, N1Write_1c_1I>; 30406c3fb27SDimitry Andric 30506c3fb27SDimitry Andric// ALU, extend and shift 30606c3fb27SDimitry Andricdef : SchedAlias<WriteIEReg, N1Write_2c_1M>; 30706c3fb27SDimitry Andric 30806c3fb27SDimitry Andric// Arithmetic, LSL shift, shift <= 4 30906c3fb27SDimitry Andric// Arithmetic, flagset, LSL shift, shift <= 4 31006c3fb27SDimitry Andric// Arithmetic, LSR/ASR/ROR shift or LSL shift > 4 31106c3fb27SDimitry Andricdef N1WriteISReg : SchedWriteVariant<[ 31206c3fb27SDimitry Andric SchedVar<IsCheapLSL, [N1Write_1c_1I]>, 31306c3fb27SDimitry Andric SchedVar<NoSchedPred, [N1Write_2c_1M]>]>; 31406c3fb27SDimitry Andricdef : SchedAlias<WriteISReg, N1WriteISReg>; 31506c3fb27SDimitry Andric 31606c3fb27SDimitry Andric// Logical, shift, no flagset 31706c3fb27SDimitry Andricdef : InstRW<[N1Write_1c_1I], 31806c3fb27SDimitry Andric (instregex "^(AND|BIC|EON|EOR|ORN|ORR)[WX]rs$")>; 31906c3fb27SDimitry Andric 32006c3fb27SDimitry Andric// Logical, shift, flagset 32106c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1M], (instregex "^(AND|BIC)S[WX]rs$")>; 32206c3fb27SDimitry Andric 32306c3fb27SDimitry Andric 32406c3fb27SDimitry Andric// Divide and multiply instructions 32506c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 32606c3fb27SDimitry Andric 32706c3fb27SDimitry Andric// Divide 32806c3fb27SDimitry Andricdef : SchedAlias<WriteID32, N1Write_12c5_1M>; 32906c3fb27SDimitry Andricdef : SchedAlias<WriteID64, N1Write_20c5_1M>; 33006c3fb27SDimitry Andric 33106c3fb27SDimitry Andric// Multiply accumulate 33206c3fb27SDimitry Andric// Multiply accumulate, long 33306c3fb27SDimitry Andricdef : SchedAlias<WriteIM32, N1Write_2c_1M>; 33406c3fb27SDimitry Andricdef : SchedAlias<WriteIM64, N1Write_4c3_1M>; 33506c3fb27SDimitry Andric 33606c3fb27SDimitry Andric// Multiply high 33706c3fb27SDimitry Andricdef : InstRW<[N1Write_5c3_1M, ReadIM, ReadIM], (instrs SMULHrr, UMULHrr)>; 33806c3fb27SDimitry Andric 33906c3fb27SDimitry Andric 34006c3fb27SDimitry Andric// Miscellaneous data-processing instructions 34106c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 34206c3fb27SDimitry Andric 34306c3fb27SDimitry Andric// Bitfield extract, one reg 34406c3fb27SDimitry Andric// Bitfield extract, two regs 34506c3fb27SDimitry Andricdef N1WriteExtr : SchedWriteVariant<[ 34606c3fb27SDimitry Andric SchedVar<IsRORImmIdiomPred, [N1Write_1c_1I]>, 34706c3fb27SDimitry Andric SchedVar<NoSchedPred, [N1Write_3c_1I_1M]>]>; 34806c3fb27SDimitry Andricdef : SchedAlias<WriteExtr, N1WriteExtr>; 34906c3fb27SDimitry Andric 35006c3fb27SDimitry Andric// Bitfield move, basic 35106c3fb27SDimitry Andric// Variable shift 35206c3fb27SDimitry Andricdef : SchedAlias<WriteIS, N1Write_1c_1I>; 35306c3fb27SDimitry Andric 35406c3fb27SDimitry Andric// Bitfield move, insert 35506c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1M], (instregex "^BFM[WX]ri$")>; 35606c3fb27SDimitry Andric 35706c3fb27SDimitry Andric// Move immediate 35806c3fb27SDimitry Andricdef : SchedAlias<WriteImm, N1Write_1c_1I>; 35906c3fb27SDimitry Andric 36006c3fb27SDimitry Andric// Load instructions 36106c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 36206c3fb27SDimitry Andric 36306c3fb27SDimitry Andric// Load register, immed offset 36406c3fb27SDimitry Andricdef : SchedAlias<WriteLD, N1Write_4c_1L>; 36506c3fb27SDimitry Andric 36606c3fb27SDimitry Andric// Load register, immed offset, index 36706c3fb27SDimitry Andricdef : SchedAlias<WriteLDIdx, N1Write_4c_1L>; 36806c3fb27SDimitry Andricdef : SchedAlias<WriteAdr, N1Write_1c_1I>; 36906c3fb27SDimitry Andric 37006c3fb27SDimitry Andric// Load pair, immed offset 37106c3fb27SDimitry Andricdef : SchedAlias<WriteLDHi, N1Write_4c_1L>; 37206c3fb27SDimitry Andric 37306c3fb27SDimitry Andric// Load pair, immed offset, W-form 37406c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1L, N1Write_0c_0Z], (instrs LDPWi, LDNPWi)>; 37506c3fb27SDimitry Andric 37606c3fb27SDimitry Andric// Load pair, signed immed offset, signed words 37706c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1I_1L, N1Write_0c_0Z], (instrs LDPSWi)>; 37806c3fb27SDimitry Andric 37906c3fb27SDimitry Andric// Load pair, immed post or pre-index, signed words 3805f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_1I_1L, N1Write_0c_0Z], 38106c3fb27SDimitry Andric (instrs LDPSWpost, LDPSWpre)>; 38206c3fb27SDimitry Andric 38306c3fb27SDimitry Andric 38406c3fb27SDimitry Andric// Store instructions 38506c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 38606c3fb27SDimitry Andric 38706c3fb27SDimitry Andric// Store register, immed offset 38806c3fb27SDimitry Andricdef : SchedAlias<WriteST, N1Write_1c_1L_1D>; 38906c3fb27SDimitry Andric 39006c3fb27SDimitry Andric// Store register, immed offset, index 39106c3fb27SDimitry Andricdef : SchedAlias<WriteSTIdx, N1Write_1c_1L_1D>; 39206c3fb27SDimitry Andric 39306c3fb27SDimitry Andric// Store pair, immed offset 39406c3fb27SDimitry Andricdef : SchedAlias<WriteSTP, N1Write_1c_2L_1D>; 39506c3fb27SDimitry Andric 39606c3fb27SDimitry Andric// Store pair, immed offset, W-form 39706c3fb27SDimitry Andricdef : InstRW<[N1Write_1c_1L_1D], (instrs STPWi)>; 39806c3fb27SDimitry Andric 39906c3fb27SDimitry Andric 40006c3fb27SDimitry Andric// FP data processing instructions 40106c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 40206c3fb27SDimitry Andric 40306c3fb27SDimitry Andric// FP absolute value 40406c3fb27SDimitry Andric// FP arithmetic 40506c3fb27SDimitry Andric// FP min/max 40606c3fb27SDimitry Andric// FP negate 40706c3fb27SDimitry Andric// FP select 40806c3fb27SDimitry Andricdef : SchedAlias<WriteF, N1Write_2c_1V>; 40906c3fb27SDimitry Andric 41006c3fb27SDimitry Andric// FP compare 41106c3fb27SDimitry Andricdef : SchedAlias<WriteFCmp, N1Write_2c_1V0>; 41206c3fb27SDimitry Andric 41306c3fb27SDimitry Andric// FP divide 41406c3fb27SDimitry Andric// FP square root 41506c3fb27SDimitry Andricdef : SchedAlias<WriteFDiv, N1Write_10c7_1V0>; 41606c3fb27SDimitry Andric 41706c3fb27SDimitry Andric// FP divide, H-form 41806c3fb27SDimitry Andric// FP square root, H-form 41906c3fb27SDimitry Andricdef : InstRW<[N1Write_7c7_1V0], (instrs FDIVHrr, FSQRTHr)>; 42006c3fb27SDimitry Andric 42106c3fb27SDimitry Andric// FP divide, S-form 42206c3fb27SDimitry Andric// FP square root, S-form 42306c3fb27SDimitry Andricdef : InstRW<[N1Write_10c7_1V0], (instrs FDIVSrr, FSQRTSr)>; 42406c3fb27SDimitry Andric 42506c3fb27SDimitry Andric// FP divide, D-form 42606c3fb27SDimitry Andricdef : InstRW<[N1Write_15c7_1V0], (instrs FDIVDrr)>; 42706c3fb27SDimitry Andric 42806c3fb27SDimitry Andric// FP square root, D-form 42906c3fb27SDimitry Andricdef : InstRW<[N1Write_17c7_1V0], (instrs FSQRTDr)>; 43006c3fb27SDimitry Andric 43106c3fb27SDimitry Andric// FP multiply 43206c3fb27SDimitry Andricdef : SchedAlias<WriteFMul, N1Write_3c_1V>; 43306c3fb27SDimitry Andric 43406c3fb27SDimitry Andric// FP multiply accumulate 43506c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V], (instregex "^FN?M(ADD|SUB)[HSD]rrr$")>; 43606c3fb27SDimitry Andric 43706c3fb27SDimitry Andric// FP round to integral 43806c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instregex "^FRINT[AIMNPXZ][HSD]r$", 43906c3fb27SDimitry Andric "^FRINT(32|64)[XZ][SD]r$")>; 44006c3fb27SDimitry Andric 44106c3fb27SDimitry Andric 44206c3fb27SDimitry Andric// FP miscellaneous instructions 44306c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 44406c3fb27SDimitry Andric 44506c3fb27SDimitry Andric// FP convert, from vec to vec reg 44606c3fb27SDimitry Andric// FP convert, Javascript from vec to gen reg 44706c3fb27SDimitry Andricdef : SchedAlias<WriteFCvt, N1Write_3c_1V>; 44806c3fb27SDimitry Andric 44906c3fb27SDimitry Andric// FP convert, from gen to vec reg 45006c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_1M_1V0], (instregex "^[SU]CVTF[SU][WX][HSD]ri$")>; 45106c3fb27SDimitry Andric 45206c3fb27SDimitry Andric// FP convert, from vec to gen reg 45306c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V0_1V1], (instregex "^FCVT[AMNPZ][SU][SU][WX][HSD]r$")>; 45406c3fb27SDimitry Andric 45506c3fb27SDimitry Andric// FP move, immed 45606c3fb27SDimitry Andricdef : SchedAlias<WriteFImm, N1Write_2c_1V>; 45706c3fb27SDimitry Andric 45806c3fb27SDimitry Andric// FP move, register 45906c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1V], (instrs FMOVHr, FMOVSr, FMOVDr)>; 46006c3fb27SDimitry Andric 46106c3fb27SDimitry Andric// FP transfer, from gen to low half of vec reg 46206c3fb27SDimitry Andric// FP transfer, from gen to high half of vec reg 46306c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1M], (instrs FMOVWHr, FMOVXHr, FMOVWSr, FMOVXDr, 46406c3fb27SDimitry Andric FMOVXDHighr)>; 46506c3fb27SDimitry Andric 46606c3fb27SDimitry Andric// FP transfer, from vec to gen reg 46706c3fb27SDimitry Andricdef : SchedAlias<WriteFCopy, N1Write_2c_1V1>; 46806c3fb27SDimitry Andric 46906c3fb27SDimitry Andric 47006c3fb27SDimitry Andric// FP load instructions 47106c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 47206c3fb27SDimitry Andric 47306c3fb27SDimitry Andric// Load vector reg, literal, S/D/Q forms 47406c3fb27SDimitry Andric// Load vector reg, unscaled immed 47506c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1L, ReadAdrBase], (instregex "^LDR[SDQ]l$", 47606c3fb27SDimitry Andric "^LDUR[BHSDQ]i$")>; 47706c3fb27SDimitry Andric 47806c3fb27SDimitry Andric// Load vector reg, immed post-index 47906c3fb27SDimitry Andric// Load vector reg, immed pre-index 4805f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_1L], 48106c3fb27SDimitry Andric (instregex "^LDR[BHSDQ](post|pre)$")>; 48206c3fb27SDimitry Andric 48306c3fb27SDimitry Andric// Load vector reg, unsigned immed 48406c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1I_1L], (instregex "^LDR[BHSDQ]ui$")>; 48506c3fb27SDimitry Andric 48606c3fb27SDimitry Andric// Load vector reg, register offset, basic 48706c3fb27SDimitry Andric// Load vector reg, register offset, scale, S/D-form 48806c3fb27SDimitry Andric// Load vector reg, register offset, extend 48906c3fb27SDimitry Andric// Load vector reg, register offset, extend, scale, S/D-form 49006c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1I_1L, ReadAdrBase], (instregex "^LDR[BSD]ro[WX]$")>; 49106c3fb27SDimitry Andric 49206c3fb27SDimitry Andric// Load vector reg, register offset, scale, H/Q-form 49306c3fb27SDimitry Andric// Load vector reg, register offset, extend, scale, H/Q-form 49406c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_1I_1L, ReadAdrBase], (instregex "^LDR[HQ]ro[WX]$")>; 49506c3fb27SDimitry Andric 49606c3fb27SDimitry Andric// Load vector pair, immed offset, S/D-form 49706c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1I_1L, WriteLDHi], (instregex "^LDN?P[SD]i$")>; 49806c3fb27SDimitry Andric 49906c3fb27SDimitry Andric// Load vector pair, immed offset, H/Q-form 50006c3fb27SDimitry Andricdef : InstRW<[N1Write_7c_1I_1L, WriteLDHi], (instregex "^LDPN?[HQ]i$")>; 50106c3fb27SDimitry Andric 50206c3fb27SDimitry Andric// Load vector pair, immed post-index, S/D-form 50306c3fb27SDimitry Andric// Load vector pair, immed pre-index, S/D-form 5045f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_1L, WriteLDHi], 50506c3fb27SDimitry Andric (instregex "^LDP[SD](pre|post)$")>; 50606c3fb27SDimitry Andric 50706c3fb27SDimitry Andric// Load vector pair, immed post-index, Q-form 50806c3fb27SDimitry Andric// Load vector pair, immed pre-index, Q-form 5095f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_7c_1L, WriteLDHi], 51006c3fb27SDimitry Andric (instrs LDPQpost, LDPQpre)>; 51106c3fb27SDimitry Andric 51206c3fb27SDimitry Andric 51306c3fb27SDimitry Andric// FP store instructions 51406c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 51506c3fb27SDimitry Andric 51606c3fb27SDimitry Andric// Store vector reg, unscaled immed, B/H/S/D-form 51706c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1I_1L], (instregex "^STUR[BHSD]i$")>; 51806c3fb27SDimitry Andric 51906c3fb27SDimitry Andric// Store vector reg, unscaled immed, Q-form 52006c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_2I_2L], (instrs STURQi)>; 52106c3fb27SDimitry Andric 52206c3fb27SDimitry Andric// Store vector reg, immed post-index, B/H/S/D-form 52306c3fb27SDimitry Andric// Store vector reg, immed pre-index, B/H/S/D-form 5245f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_1L_1V], (instregex "^STR[BHSD](pre|post)$")>; 52506c3fb27SDimitry Andric 52606c3fb27SDimitry Andric// Store vector reg, immed pre-index, Q-form 52706c3fb27SDimitry Andric// Store vector reg, immed post-index, Q-form 5285f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_2L_2V], (instrs STRQpre, STRQpost)>; 52906c3fb27SDimitry Andric 53006c3fb27SDimitry Andric// Store vector reg, unsigned immed, B/H/S/D-form 53106c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_1V], (instregex "^STR[BHSD]ui$")>; 53206c3fb27SDimitry Andric 53306c3fb27SDimitry Andric// Store vector reg, unsigned immed, Q-form 53406c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_2L_2V], (instrs STRQui)>; 53506c3fb27SDimitry Andric 53606c3fb27SDimitry Andric// Store vector reg, register offset, basic, B/S/D-form 53706c3fb27SDimitry Andric// Store vector reg, register offset, scale, B/S/D-form 53806c3fb27SDimitry Andric// Store vector reg, register offset, extend, B/S/D-form 53906c3fb27SDimitry Andric// Store vector reg, register offset, extend, scale, B/S/D-form 54006c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_1V, ReadAdrBase], (instregex "^STR[BSD]ro[WX]$")>; 54106c3fb27SDimitry Andric 54206c3fb27SDimitry Andric// Store vector reg, register offset, basic, H-form 54306c3fb27SDimitry Andric// Store vector reg, register offset, scale, H-form 54406c3fb27SDimitry Andric// Store vector reg, register offset, extend, H-form 54506c3fb27SDimitry Andric// Store vector reg, register offset, extend, scale, H-form 54606c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1I_1L_1V, ReadAdrBase], (instregex "^STRHro[WX]$")>; 54706c3fb27SDimitry Andric 54806c3fb27SDimitry Andric// Store vector reg, register offset, basic, Q-form 54906c3fb27SDimitry Andric// Store vector reg, register offset, scale, Q-form 55006c3fb27SDimitry Andric// Store vector reg, register offset, extend, Q-form 55106c3fb27SDimitry Andric// Store vector reg, register offset, extend, scale, Q-form 55206c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_2L_2V, ReadAdrBase], (instregex "^STRQro[WX]$")>; 55306c3fb27SDimitry Andric 55406c3fb27SDimitry Andric// Store vector pair, immed offset, S-form 55506c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_1V], (instrs STPSi, STNPSi)>; 55606c3fb27SDimitry Andric 55706c3fb27SDimitry Andric// Store vector pair, immed offset, D-form 55806c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_2L_2V], (instrs STPDi, STNPDi)>; 55906c3fb27SDimitry Andric 56006c3fb27SDimitry Andric// Store vector pair, immed offset, Q-form 56106c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_4L_2V], (instrs STPQi, STNPQi)>; 56206c3fb27SDimitry Andric 56306c3fb27SDimitry Andric// Store vector pair, immed post-index, S-form 56406c3fb27SDimitry Andric// Store vector pair, immed pre-index, S-form 5655f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_1L_1V], (instrs STPSpre, STPSpost)>; 56606c3fb27SDimitry Andric 56706c3fb27SDimitry Andric// Store vector pair, immed post-index, D-form 56806c3fb27SDimitry Andric// Store vector pair, immed pre-index, D-form 5695f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_2L_2V], (instrs STPDpre, STPDpost)>; 57006c3fb27SDimitry Andric 57106c3fb27SDimitry Andric// Store vector pair, immed post-index, Q-form 57206c3fb27SDimitry Andric// Store vector pair, immed pre-index, Q-form 5735f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_3c_4L_2V], (instrs STPQpre, STPQpost)>; 57406c3fb27SDimitry Andric 57506c3fb27SDimitry Andric 57606c3fb27SDimitry Andric// ASIMD integer instructions 57706c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 57806c3fb27SDimitry Andric 57906c3fb27SDimitry Andric// ASIMD absolute diff 58006c3fb27SDimitry Andric// ASIMD absolute diff long 58106c3fb27SDimitry Andric// ASIMD arith, basic 58206c3fb27SDimitry Andric// ASIMD arith, complex 58306c3fb27SDimitry Andric// ASIMD arith, pair-wise 58406c3fb27SDimitry Andric// ASIMD compare 58506c3fb27SDimitry Andric// ASIMD logical 58606c3fb27SDimitry Andric// ASIMD max/min, basic and pair-wise 58706c3fb27SDimitry Andricdef : SchedAlias<WriteVd, N1Write_2c_1V>; 58806c3fb27SDimitry Andricdef : SchedAlias<WriteVq, N1Write_2c_1V>; 58906c3fb27SDimitry Andric 59006c3fb27SDimitry Andric// ASIMD absolute diff accum 59106c3fb27SDimitry Andric// ASIMD absolute diff accum long 59206c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V1], (instregex "^[SU]ABAL?v")>; 59306c3fb27SDimitry Andric 59406c3fb27SDimitry Andric// ASIMD arith, reduce, 4H/4S 59506c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V1], (instregex "^(ADDV|[SU]ADDLV)v4(i16|i32)v$")>; 59606c3fb27SDimitry Andric 59706c3fb27SDimitry Andric// ASIMD arith, reduce, 8B/8H 59806c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1V1_1V], (instregex "^(ADDV|[SU]ADDLV)v8(i8|i16)v$")>; 59906c3fb27SDimitry Andric 60006c3fb27SDimitry Andric// ASIMD arith, reduce, 16B 60106c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_2V1], (instregex "^(ADDV|[SU]ADDLV)v16i8v$")>; 60206c3fb27SDimitry Andric 60306c3fb27SDimitry Andric// ASIMD max/min, reduce, 4H/4S 60406c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V1], (instregex "^[SU](MAX|MIN)Vv4(i16|i32)v$")>; 60506c3fb27SDimitry Andric 60606c3fb27SDimitry Andric// ASIMD max/min, reduce, 8B/8H 60706c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1V1_1V], (instregex "^[SU](MAX|MIN)Vv8(i8|i16)v$")>; 60806c3fb27SDimitry Andric 60906c3fb27SDimitry Andric// ASIMD max/min, reduce, 16B 61006c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_2V1], (instregex "[SU](MAX|MIN)Vv16i8v$")>; 61106c3fb27SDimitry Andric 61206c3fb27SDimitry Andric// ASIMD multiply, D-form 61306c3fb27SDimitry Andric// ASIMD multiply accumulate, D-form 61406c3fb27SDimitry Andric// ASIMD multiply accumulate high, D-form 61506c3fb27SDimitry Andric// ASIMD multiply accumulate saturating long 61606c3fb27SDimitry Andric// ASIMD multiply long 61706c3fb27SDimitry Andric// ASIMD multiply accumulate long 61806c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V0], (instregex "^MUL(v[14]i16|v[12]i32)$", 61906c3fb27SDimitry Andric "^ML[AS](v[14]i16|v[12]i32)$", 62006c3fb27SDimitry Andric "^SQ(R)?DMULH(v[14]i16|v[12]i32)$", 62106c3fb27SDimitry Andric "^SQRDML[AS]H(v[14]i16|v[12]i32)$", 62206c3fb27SDimitry Andric "^SQDML[AS]Lv", 62306c3fb27SDimitry Andric "^([SU]|SQD)MULLv", 62406c3fb27SDimitry Andric "^[SU]ML[AS]Lv")>; 62506c3fb27SDimitry Andric 62606c3fb27SDimitry Andric// ASIMD multiply, Q-form 62706c3fb27SDimitry Andric// ASIMD multiply accumulate, Q-form 62806c3fb27SDimitry Andric// ASIMD multiply accumulate high, Q-form 62906c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_2V0], (instregex "^MUL(v8i16|v4i32)$", 63006c3fb27SDimitry Andric "^ML[AS](v8i16|v4i32)$", 63106c3fb27SDimitry Andric "^SQ(R)?DMULH(v8i16|v4i32)$", 63206c3fb27SDimitry Andric "^SQRDML[AS]H(v8i16|v4i32)$")>; 63306c3fb27SDimitry Andric 63406c3fb27SDimitry Andric// ASIMD multiply/multiply long (8x8) polynomial, D-form 63506c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instrs PMULv8i8, PMULLv8i8)>; 63606c3fb27SDimitry Andric 63706c3fb27SDimitry Andric// ASIMD multiply/multiply long (8x8) polynomial, Q-form 63806c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instrs PMULv16i8, PMULLv16i8)>; 63906c3fb27SDimitry Andric 64006c3fb27SDimitry Andric// ASIMD pairwise add and accumulate long 64106c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V1], (instregex "^[SU]ADALPv")>; 64206c3fb27SDimitry Andric 64306c3fb27SDimitry Andric// ASIMD shift accumulate 64406c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V1], (instregex "^[SU]R?SRAv")>; 64506c3fb27SDimitry Andric 64606c3fb27SDimitry Andric// ASIMD shift by immed, basic 64706c3fb27SDimitry Andric// ASIMD shift by immed and insert, basic 64806c3fb27SDimitry Andric// ASIMD shift by register, basic 64906c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1V1], (instregex "^SHLL?v", "^SHRNv", "^[SU]SHLLv", 65006c3fb27SDimitry Andric "^[SU]SHRv", "^S[LR]Iv", "^[SU]SHLv")>; 65106c3fb27SDimitry Andric 65206c3fb27SDimitry Andric// ASIMD shift by immed, complex 65306c3fb27SDimitry Andric// ASIMD shift by register, complex 65406c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V1], 65506c3fb27SDimitry Andric (instregex "^RSHRNv", "^SQRSHRU?Nv", "^(SQSHLU?|UQSHL)[bhsd]$", 65606c3fb27SDimitry Andric "^(SQSHLU?|UQSHL)(v8i8|v16i8|v4i16|v8i16|v2i32|v4i32|v2i64)_shift$", 65706c3fb27SDimitry Andric "^SQSHU?RNv", "^[SU]RSHRv", "^UQR?SHRNv", 65806c3fb27SDimitry Andric "^[SU]Q?RSHLv", "^[SU]QSHLv")>; 65906c3fb27SDimitry Andric 66006c3fb27SDimitry Andric 66106c3fb27SDimitry Andric// ASIMD FP instructions 66206c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 66306c3fb27SDimitry Andric 66406c3fb27SDimitry Andric// ASIMD FP absolute value/difference 66506c3fb27SDimitry Andric// ASIMD FP arith, normal 66606c3fb27SDimitry Andric// ASIMD FP compare 66706c3fb27SDimitry Andric// ASIMD FP max/min, normal 66806c3fb27SDimitry Andric// ASIMD FP max/min, pairwise 66906c3fb27SDimitry Andric// ASIMD FP negate 67006c3fb27SDimitry Andric// Covered by "SchedAlias (WriteV[dq]...)" above 67106c3fb27SDimitry Andric 67206c3fb27SDimitry Andric// ASIMD FP convert, long (F16 to F32) 67306c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instregex "^FCVTL(v4|v8)i16$")>; 67406c3fb27SDimitry Andric 67506c3fb27SDimitry Andric// ASIMD FP convert, long (F32 to F64) 67606c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instregex "^FCVTL(v2|v4)i32$")>; 67706c3fb27SDimitry Andric 67806c3fb27SDimitry Andric// ASIMD FP convert, narrow (F32 to F16) 67906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instregex "^FCVTN(v4|v8)i16$")>; 68006c3fb27SDimitry Andric 68106c3fb27SDimitry Andric// ASIMD FP convert, narrow (F64 to F32) 68206c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instregex "^FCVTN(v2|v4)i32$", 68306c3fb27SDimitry Andric "^FCVTXN(v2|v4)f32$")>; 68406c3fb27SDimitry Andric 68506c3fb27SDimitry Andric// ASIMD FP convert, other, D-form F32 and Q-form F64 68606c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instregex "^[FSU]CVT[AMNPZ][SU]v2f(32|64)$", 68706c3fb27SDimitry Andric "^[SU]CVTFv2f(32|64)$")>; 68806c3fb27SDimitry Andric 68906c3fb27SDimitry Andric// ASIMD FP convert, other, D-form F16 and Q-form F32 69006c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instregex "^[FSU]CVT[AMNPZ][SU]v4f(16|32)$", 69106c3fb27SDimitry Andric "^[SU]CVTFv4f(16|32)$")>; 69206c3fb27SDimitry Andric 69306c3fb27SDimitry Andric// ASIMD FP convert, other, Q-form F16 69406c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_4V0], (instregex "^[FSU]CVT[AMNPZ][SU]v8f16$", 69506c3fb27SDimitry Andric "^[SU]CVTFv8f16$")>; 69606c3fb27SDimitry Andric 69706c3fb27SDimitry Andric// ASIMD FP divide, D-form, F16 69806c3fb27SDimitry Andric// ASIMD FP square root, D-form, F16 69906c3fb27SDimitry Andricdef : InstRW<[N1Write_7c7_1V0], (instrs FDIVv4f16, FSQRTv4f16)>; 70006c3fb27SDimitry Andric 70106c3fb27SDimitry Andric// ASIMD FP divide, D-form, F32 70206c3fb27SDimitry Andric// ASIMD FP square root, D-form, F32 70306c3fb27SDimitry Andricdef : InstRW<[N1Write_10c7_1V0], (instrs FDIVv2f32, FSQRTv2f32)>; 70406c3fb27SDimitry Andric 70506c3fb27SDimitry Andric// ASIMD FP divide, Q-form, F16 70606c3fb27SDimitry Andric// ASIMD FP square root, Q-form, F16 70706c3fb27SDimitry Andricdef : InstRW<[N1Write_13c10_1V0], (instrs FDIVv8f16, FSQRTv8f16)>; 70806c3fb27SDimitry Andric 70906c3fb27SDimitry Andric// ASIMD FP divide, Q-form, F32 71006c3fb27SDimitry Andric// ASIMD FP square root, Q-form, F32 71106c3fb27SDimitry Andricdef : InstRW<[N1Write_10c7_1V0], (instrs FDIVv4f32, FSQRTv4f32)>; 71206c3fb27SDimitry Andric 71306c3fb27SDimitry Andric// ASIMD FP divide, Q-form, F64 71406c3fb27SDimitry Andricdef : InstRW<[N1Write_15c7_1V0], (instrs FDIVv2f64)>; 71506c3fb27SDimitry Andric 71606c3fb27SDimitry Andric// ASIMD FP square root, Q-form, F64 71706c3fb27SDimitry Andricdef : InstRW<[N1Write_17c7_1V0], (instrs FSQRTv2f64)>; 71806c3fb27SDimitry Andric 71906c3fb27SDimitry Andric// ASIMD FP max/min, reduce, F32 and D-form F16 72006c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1V], (instregex "^F(MAX|MIN)(NM)?Vv4(i16|i32)v$")>; 72106c3fb27SDimitry Andric 72206c3fb27SDimitry Andric// ASIMD FP max/min, reduce, Q-form F16 72306c3fb27SDimitry Andricdef : InstRW<[N1Write_8c_3V], (instregex "^F(MAX|MIN)(NM)?Vv8i16v$")>; 72406c3fb27SDimitry Andric 72506c3fb27SDimitry Andric// ASIMD FP multiply 72606c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V], (instregex "^FMULX?v")>; 72706c3fb27SDimitry Andric 72806c3fb27SDimitry Andric// ASIMD FP multiply accumulate 72906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V], (instregex "^FML[AS]v")>; 73006c3fb27SDimitry Andric 73106c3fb27SDimitry Andric// ASIMD FP multiply accumulate long 73206c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1V], (instregex "^FML[AS]L2?v")>; 73306c3fb27SDimitry Andric 73406c3fb27SDimitry Andric// ASIMD FP round, D-form F32 and Q-form F64 73506c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instregex "^FRINT[AIMNPXZ]v2f(32|64)$")>; 73606c3fb27SDimitry Andric 73706c3fb27SDimitry Andric// ASIMD FP round, D-form F16 and Q-form F32 73806c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instregex "^FRINT[AIMNPXZ]v4f(16|32)$")>; 73906c3fb27SDimitry Andric 74006c3fb27SDimitry Andric// ASIMD FP round, Q-form F16 74106c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_4V0], (instregex "^FRINT[AIMNPXZ]v8f16$")>; 74206c3fb27SDimitry Andric 74306c3fb27SDimitry Andric 74406c3fb27SDimitry Andric// ASIMD miscellaneous instructions 74506c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 74606c3fb27SDimitry Andric 74706c3fb27SDimitry Andric// ASIMD bit reverse 74806c3fb27SDimitry Andric// ASIMD bitwise insert 74906c3fb27SDimitry Andric// ASIMD count 75006c3fb27SDimitry Andric// ASIMD duplicate, element 75106c3fb27SDimitry Andric// ASIMD extract 75206c3fb27SDimitry Andric// ASIMD extract narrow 75306c3fb27SDimitry Andric// ASIMD insert, element to element 75406c3fb27SDimitry Andric// ASIMD move, FP immed 75506c3fb27SDimitry Andric// ASIMD move, integer immed 75606c3fb27SDimitry Andric// ASIMD reverse 75706c3fb27SDimitry Andric// ASIMD table lookup, 1 or 2 table regs 75806c3fb27SDimitry Andric// ASIMD table lookup extension, 1 table reg 75906c3fb27SDimitry Andric// ASIMD transfer, element to gen reg 76006c3fb27SDimitry Andric// ASIMD transpose 76106c3fb27SDimitry Andric// ASIMD unzip/zip 76206c3fb27SDimitry Andric// Covered by "SchedAlias (WriteV[dq]...)" above 76306c3fb27SDimitry Andric 76406c3fb27SDimitry Andric// ASIMD duplicate, gen reg 76506c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1M], 76606c3fb27SDimitry Andric (instregex "^DUP((v16|v8)i8|(v8|v4)i16|(v4|v2)i32|v2i64)gpr$")>; 76706c3fb27SDimitry Andric 76806c3fb27SDimitry Andric// ASIMD extract narrow, saturating 76906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V1], (instregex "^[SU]QXTNv", "^SQXTUNv")>; 77006c3fb27SDimitry Andric 77106c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, D-form F32 and F64 77206c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_1V0], (instrs FRECPEv1i32, FRECPEv2f32, FRECPEv1i64, 77306c3fb27SDimitry Andric FRECPXv1i32, FRECPXv1i64, 77406c3fb27SDimitry Andric URECPEv2i32, 77506c3fb27SDimitry Andric FRSQRTEv1i32, FRSQRTEv2f32, FRSQRTEv1i64, 77606c3fb27SDimitry Andric URSQRTEv2i32)>; 77706c3fb27SDimitry Andric 77806c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, D-form F16 and Q-form F32 77906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_2V0], (instrs FRECPEv1f16, FRECPEv4f16, FRECPEv4f32, 78006c3fb27SDimitry Andric FRECPXv1f16, 78106c3fb27SDimitry Andric URECPEv4i32, 78206c3fb27SDimitry Andric FRSQRTEv1f16, FRSQRTEv4f16, FRSQRTEv4f32, 78306c3fb27SDimitry Andric URSQRTEv4i32)>; 78406c3fb27SDimitry Andric 78506c3fb27SDimitry Andric// ASIMD reciprocal and square root estimate, Q-form F16 78606c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_4V0], (instrs FRECPEv8f16, 78706c3fb27SDimitry Andric FRSQRTEv8f16)>; 78806c3fb27SDimitry Andric 78906c3fb27SDimitry Andric// ASIMD reciprocal step 79006c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V], (instregex "^FRECPS(16|32|64)$", "^FRECPSv", 79106c3fb27SDimitry Andric "^FRSQRTS(16|32|64)$", "^FRSQRTSv")>; 79206c3fb27SDimitry Andric 79306c3fb27SDimitry Andric// ASIMD table lookup, 3 table regs 79406c3fb27SDimitry Andric// ASIMD table lookup extension, 2 table reg 79506c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_4V], (instrs TBLv8i8Three, TBLv16i8Three, 79606c3fb27SDimitry Andric TBXv8i8Two, TBXv16i8Two)>; 79706c3fb27SDimitry Andric 79806c3fb27SDimitry Andric// ASIMD table lookup, 4 table regs 79906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_3V], (instrs TBLv8i8Four, TBLv16i8Four)>; 80006c3fb27SDimitry Andric 80106c3fb27SDimitry Andric// ASIMD table lookup extension, 3 table reg 80206c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_3V], (instrs TBXv8i8Three, TBXv16i8Three)>; 80306c3fb27SDimitry Andric 80406c3fb27SDimitry Andric// ASIMD table lookup extension, 4 table reg 80506c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_5V], (instrs TBXv8i8Four, TBXv16i8Four)>; 80606c3fb27SDimitry Andric 80706c3fb27SDimitry Andric// ASIMD transfer, element to gen reg 80806c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1V1], (instregex "^SMOVvi(((8|16)to(32|64))|32to64)$", 80906c3fb27SDimitry Andric "^UMOVvi(8|16|32|64)$")>; 81006c3fb27SDimitry Andric 81106c3fb27SDimitry Andric// ASIMD transfer, gen reg to element 81206c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1M_1V], (instregex "^INSvi(8|16|32|64)gpr$")>; 81306c3fb27SDimitry Andric 81406c3fb27SDimitry Andric 81506c3fb27SDimitry Andric// ASIMD load instructions 81606c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 81706c3fb27SDimitry Andric 81806c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 1 reg 81906c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_1L], 82006c3fb27SDimitry Andric (instregex "^LD1Onev(8b|16b|4h|8h|2s|4s|1d|2d)$")>; 8215f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_1L], 82206c3fb27SDimitry Andric (instregex "^LD1Onev(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>; 82306c3fb27SDimitry Andric 82406c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 2 reg 82506c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_2L], 82606c3fb27SDimitry Andric (instregex "^LD1Twov(8b|16b|4h|8h|2s|4s|1d|2d)$")>; 8275f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_2L], 82806c3fb27SDimitry Andric (instregex "^LD1Twov(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>; 82906c3fb27SDimitry Andric 83006c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 3 reg 83106c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_3L], 83206c3fb27SDimitry Andric (instregex "^LD1Threev(8b|16b|4h|8h|2s|4s|1d|2d)$")>; 8335f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_6c_3L], 83406c3fb27SDimitry Andric (instregex "^LD1Threev(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>; 83506c3fb27SDimitry Andric 83606c3fb27SDimitry Andric// ASIMD load, 1 element, multiple, 4 reg 83706c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_4L], 83806c3fb27SDimitry Andric (instregex "^LD1Fourv(8b|16b|4h|8h|2s|4s|1d|2d)$")>; 8395f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_6c_4L], 84006c3fb27SDimitry Andric (instregex "^LD1Fourv(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>; 84106c3fb27SDimitry Andric 84206c3fb27SDimitry Andric// ASIMD load, 1 element, one lane 84306c3fb27SDimitry Andric// ASIMD load, 1 element, all lanes 84406c3fb27SDimitry Andricdef : InstRW<[N1Write_7c_1L_1V], 84506c3fb27SDimitry Andric (instregex "LD1(i|Rv)(8|16|32|64)$", 84606c3fb27SDimitry Andric "LD1Rv(8b|16b|4h|8h|2s|4s|1d|2d)$")>; 8475f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_7c_1L_1V], 84806c3fb27SDimitry Andric (instregex "LD1i(8|16|32|64)_POST$", 84906c3fb27SDimitry Andric "LD1Rv(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>; 85006c3fb27SDimitry Andric 85106c3fb27SDimitry Andric// ASIMD load, 2 element, multiple 85206c3fb27SDimitry Andric// ASIMD load, 2 element, one lane 85306c3fb27SDimitry Andric// ASIMD load, 2 element, all lanes 85406c3fb27SDimitry Andricdef : InstRW<[N1Write_7c_2L_2V], 85506c3fb27SDimitry Andric (instregex "LD2Twov(8b|16b|4h|8h|2s|4s|2d)$", 85606c3fb27SDimitry Andric "LD2i(8|16|32|64)$", 85706c3fb27SDimitry Andric "LD2Rv(8b|16b|4h|8h|2s|4s|1d|2d)$")>; 8585f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_7c_2L_2V], 85906c3fb27SDimitry Andric (instregex "LD2Twov(8b|16b|4h|8h|2s|4s|2d)_POST$", 86006c3fb27SDimitry Andric "LD2i(8|16|32|64)_POST$", 86106c3fb27SDimitry Andric "LD2Rv(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>; 86206c3fb27SDimitry Andric 86306c3fb27SDimitry Andric// ASIMD load, 3 element, multiple 86406c3fb27SDimitry Andricdef : InstRW<[N1Write_8c_3L_3V], 86506c3fb27SDimitry Andric (instregex "LD3Threev(8b|16b|4h|8h|2s|4s|2d)$")>; 8665f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_8c_3L_3V], 86706c3fb27SDimitry Andric (instregex "LD3Threev(8b|16b|4h|8h|2s|4s|2d)_POST$")>; 86806c3fb27SDimitry Andric 86906c3fb27SDimitry Andric// ASIMD load, 3 element, one lane 87006c3fb27SDimitry Andric// ASIMD load, 3 element, all lanes 87106c3fb27SDimitry Andricdef : InstRW<[N1Write_7c_2L_3V], 87206c3fb27SDimitry Andric (instregex "LD3i(8|16|32|64)$", 87306c3fb27SDimitry Andric "LD3Rv(8b|16b|4h|8h|2s|4s|1d|2d)$")>; 8745f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_7c_2L_3V], 87506c3fb27SDimitry Andric (instregex "LD3i(8|16|32|64)_POST$", 87606c3fb27SDimitry Andric "LD3Rv(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>; 87706c3fb27SDimitry Andric 87806c3fb27SDimitry Andric// ASIMD load, 4 element, multiple, D-form 87906c3fb27SDimitry Andricdef : InstRW<[N1Write_8c_3L_4V], 88006c3fb27SDimitry Andric (instregex "LD4Fourv(8b|4h|2s)$")>; 8815f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_8c_3L_4V], 88206c3fb27SDimitry Andric (instregex "LD4Fourv(8b|4h|2s)_POST$")>; 88306c3fb27SDimitry Andric 88406c3fb27SDimitry Andric// ASIMD load, 4 element, multiple, Q-form 88506c3fb27SDimitry Andricdef : InstRW<[N1Write_10c_4L_4V], 88606c3fb27SDimitry Andric (instregex "LD4Fourv(16b|8h|4s|2d)$")>; 8875f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_10c_4L_4V], 88806c3fb27SDimitry Andric (instregex "LD4Fourv(16b|8h|4s|2d)_POST$")>; 88906c3fb27SDimitry Andric 89006c3fb27SDimitry Andric// ASIMD load, 4 element, one lane 89106c3fb27SDimitry Andric// ASIMD load, 4 element, all lanes 89206c3fb27SDimitry Andricdef : InstRW<[N1Write_8c_4L_4V], 89306c3fb27SDimitry Andric (instregex "LD4i(8|16|32|64)$", 89406c3fb27SDimitry Andric "LD4Rv(8b|16b|4h|8h|2s|4s|1d|2d)$")>; 8955f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_8c_4L_4V], 89606c3fb27SDimitry Andric (instregex "LD4i(8|16|32|64)_POST$", 89706c3fb27SDimitry Andric "LD4Rv(8b|16b|4h|8h|2s|4s|1d|2d)_POST$")>; 89806c3fb27SDimitry Andric 89906c3fb27SDimitry Andric 90006c3fb27SDimitry Andric// ASIMD store instructions 90106c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 90206c3fb27SDimitry Andric 90306c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, D-form 90406c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_1V], 90506c3fb27SDimitry Andric (instregex "ST1Onev(8b|4h|2s|1d)$")>; 9065f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_1L_1V], 90706c3fb27SDimitry Andric (instregex "ST1Onev(8b|4h|2s|1d)_POST$")>; 90806c3fb27SDimitry Andric 90906c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, Q-form 91006c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_1V], 91106c3fb27SDimitry Andric (instregex "ST1Onev(16b|8h|4s|2d)$")>; 9125f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_1L_1V], 91306c3fb27SDimitry Andric (instregex "ST1Onev(16b|8h|4s|2d)_POST$")>; 91406c3fb27SDimitry Andric 91506c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, D-form 91606c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1L_2V], 91706c3fb27SDimitry Andric (instregex "ST1Twov(8b|4h|2s|1d)$")>; 9185f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_2c_1L_2V], 91906c3fb27SDimitry Andric (instregex "ST1Twov(8b|4h|2s|1d)_POST$")>; 92006c3fb27SDimitry Andric 92106c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, Q-form 92206c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_2L_2V], 92306c3fb27SDimitry Andric (instregex "ST1Twov(16b|8h|4s|2d)$")>; 9245f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_3c_2L_2V], 92506c3fb27SDimitry Andric (instregex "ST1Twov(16b|8h|4s|2d)_POST$")>; 92606c3fb27SDimitry Andric 92706c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, D-form 92806c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_2L_3V], 92906c3fb27SDimitry Andric (instregex "ST1Threev(8b|4h|2s|1d)$")>; 9305f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_3c_2L_3V], 93106c3fb27SDimitry Andric (instregex "ST1Threev(8b|4h|2s|1d)_POST$")>; 93206c3fb27SDimitry Andric 93306c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, Q-form 93406c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_3L_3V], 93506c3fb27SDimitry Andric (instregex "ST1Threev(16b|8h|4s|2d)$")>; 9365f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_3L_3V], 93706c3fb27SDimitry Andric (instregex "ST1Threev(16b|8h|4s|2d)_POST$")>; 93806c3fb27SDimitry Andric 93906c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, D-form 94006c3fb27SDimitry Andricdef : InstRW<[N1Write_3c_2L_2V], 94106c3fb27SDimitry Andric (instregex "ST1Fourv(8b|4h|2s|1d)$")>; 9425f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_3c_2L_2V], 94306c3fb27SDimitry Andric (instregex "ST1Fourv(8b|4h|2s|1d)_POST$")>; 94406c3fb27SDimitry Andric 94506c3fb27SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, Q-form 94606c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_4L_4V], 94706c3fb27SDimitry Andric (instregex "ST1Fourv(16b|8h|4s|2d)$")>; 9485f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_4L_4V], 94906c3fb27SDimitry Andric (instregex "ST1Fourv(16b|8h|4s|2d)_POST$")>; 95006c3fb27SDimitry Andric 95106c3fb27SDimitry Andric// ASIMD store, 1 element, one lane 95206c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1L_1V], 95306c3fb27SDimitry Andric (instregex "ST1i(8|16|32|64)$")>; 9545f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_1L_1V], 95506c3fb27SDimitry Andric (instregex "ST1i(8|16|32|64)_POST$")>; 95606c3fb27SDimitry Andric 95706c3fb27SDimitry Andric// ASIMD store, 2 element, multiple, D-form, B/H/S 95806c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1L_1V], 95906c3fb27SDimitry Andric (instregex "ST2Twov(8b|4h|2s)$")>; 9605f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_1L_1V], 96106c3fb27SDimitry Andric (instregex "ST2Twov(8b|4h|2s)_POST$")>; 96206c3fb27SDimitry Andric 96306c3fb27SDimitry Andric// ASIMD store, 2 element, multiple, Q-form 96406c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_2L_2V], 96506c3fb27SDimitry Andric (instregex "ST2Twov(16b|8h|4s|2d)$")>; 9665f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_2L_2V], 96706c3fb27SDimitry Andric (instregex "ST2Twov(16b|8h|4s|2d)_POST$")>; 96806c3fb27SDimitry Andric 96906c3fb27SDimitry Andric// ASIMD store, 2 element, one lane 97006c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1L_1V], 97106c3fb27SDimitry Andric (instregex "ST2i(8|16|32|64)$")>; 9725f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_1L_1V], 97306c3fb27SDimitry Andric (instregex "ST2i(8|16|32|64)_POST$")>; 97406c3fb27SDimitry Andric 97506c3fb27SDimitry Andric// ASIMD store, 3 element, multiple, D-form, B/H/S 97606c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_2L_2V], 97706c3fb27SDimitry Andric (instregex "ST3Threev(8b|4h|2s)$")>; 9785f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_2L_2V], 97906c3fb27SDimitry Andric (instregex "ST3Threev(8b|4h|2s)_POST$")>; 98006c3fb27SDimitry Andric 98106c3fb27SDimitry Andric// ASIMD store, 3 element, multiple, Q-form 98206c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_3L_3V], 98306c3fb27SDimitry Andric (instregex "ST3Threev(16b|8h|4s|2d)$")>; 9845f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_6c_3L_3V], 98506c3fb27SDimitry Andric (instregex "ST3Threev(16b|8h|4s|2d)_POST$")>; 98606c3fb27SDimitry Andric 98706c3fb27SDimitry Andric// ASIMD store, 3 element, one lane, B/H/S 98806c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_3L_3V], 98906c3fb27SDimitry Andric (instregex "ST3i(8|16|32)$")>; 9905f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_3L_3V], 99106c3fb27SDimitry Andric (instregex "ST3i(8|16|32)_POST$")>; 99206c3fb27SDimitry Andric 99306c3fb27SDimitry Andric// ASIMD store, 3 element, one lane, D 99406c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_3L_3V], 99506c3fb27SDimitry Andric (instrs ST3i64)>; 9965f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_3L_3V], 99706c3fb27SDimitry Andric (instrs ST3i64_POST)>; 99806c3fb27SDimitry Andric 99906c3fb27SDimitry Andric// ASIMD store, 4 element, multiple, D-form, B/H/S 100006c3fb27SDimitry Andricdef : InstRW<[N1Write_7c_3L_3V], 100106c3fb27SDimitry Andric (instregex "ST4Fourv(8b|4h|2s)$")>; 10025f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_7c_3L_3V], 100306c3fb27SDimitry Andric (instregex "ST4Fourv(8b|4h|2s)_POST$")>; 100406c3fb27SDimitry Andric 100506c3fb27SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, B/H/S 100606c3fb27SDimitry Andricdef : InstRW<[N1Write_9c_6L_6V], 100706c3fb27SDimitry Andric (instregex "ST4Fourv(16b|8h|4s)$")>; 10085f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_9c_6L_6V], 100906c3fb27SDimitry Andric (instregex "ST4Fourv(16b|8h|4s)_POST$")>; 101006c3fb27SDimitry Andric 101106c3fb27SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, D 101206c3fb27SDimitry Andricdef : InstRW<[N1Write_6c_4L_4V], 101306c3fb27SDimitry Andric (instrs ST4Fourv2d)>; 10145f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_6c_4L_4V], 101506c3fb27SDimitry Andric (instrs ST4Fourv2d_POST)>; 101606c3fb27SDimitry Andric 101706c3fb27SDimitry Andric// ASIMD store, 4 element, one lane, B/H/S 101806c3fb27SDimitry Andricdef : InstRW<[N1Write_5c_3L_3V], 101906c3fb27SDimitry Andric (instregex "ST4i(8|16|32)$")>; 10205f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_5c_3L_3V], 102106c3fb27SDimitry Andric (instregex "ST4i(8|16|32)_POST$")>; 102206c3fb27SDimitry Andric 102306c3fb27SDimitry Andric// ASIMD store, 4 element, one lane, D 102406c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_3L_3V], 102506c3fb27SDimitry Andric (instrs ST4i64)>; 10265f757f3fSDimitry Andricdef : InstRW<[WriteAdr, N1Write_4c_3L_3V], 102706c3fb27SDimitry Andric (instrs ST4i64_POST)>; 102806c3fb27SDimitry Andric 102906c3fb27SDimitry Andric 103006c3fb27SDimitry Andric// Cryptography extensions 103106c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 103206c3fb27SDimitry Andric 103306c3fb27SDimitry Andric// Crypto AES ops 103406c3fb27SDimitry Andricdef N1WriteVC : WriteSequence<[N1Write_2c_1V0]>; 103506c3fb27SDimitry Andricdef N1ReadVC : SchedReadAdvance<2, [N1WriteVC]>; 103606c3fb27SDimitry Andricdef : InstRW<[N1WriteVC], (instrs AESDrr, AESErr)>; 103706c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1V0, N1ReadVC], (instrs AESMCrr, AESIMCrr)>; 103806c3fb27SDimitry Andric 103906c3fb27SDimitry Andric// Crypto polynomial (64x64) multiply long 104006c3fb27SDimitry Andric// Crypto SHA1 hash acceleration op 104106c3fb27SDimitry Andric// Crypto SHA1 schedule acceleration ops 104206c3fb27SDimitry Andric// Crypto SHA256 schedule acceleration ops 104306c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1V0], (instregex "^PMULLv[12]i64$", 104406c3fb27SDimitry Andric "^SHA1(H|SU0|SU1)rr", 104506c3fb27SDimitry Andric "^SHA256SU[01]rr")>; 104606c3fb27SDimitry Andric 104706c3fb27SDimitry Andric// Crypto SHA1 hash acceleration ops 104806c3fb27SDimitry Andric// Crypto SHA256 hash acceleration ops 104906c3fb27SDimitry Andricdef : InstRW<[N1Write_4c_1V0], (instregex "^SHA1[CMP]rrr$", 105006c3fb27SDimitry Andric "^SHA256H2?rrr$")>; 105106c3fb27SDimitry Andric 105206c3fb27SDimitry Andric 105306c3fb27SDimitry Andric// CRC 105406c3fb27SDimitry Andric// ----------------------------------------------------------------------------- 105506c3fb27SDimitry Andric 105606c3fb27SDimitry Andric// CRC checksum ops 105706c3fb27SDimitry Andricdef : InstRW<[N1Write_2c_1M], (instregex "^CRC32C?[BHWX]rr$")>; 105806c3fb27SDimitry Andric 105906c3fb27SDimitry Andric 106006c3fb27SDimitry Andric} 1061