1480093f4SDimitry Andric//=- X86ScheduleZnver2.td - X86 Znver2 Scheduling -------------*- tablegen -*-=// 2480093f4SDimitry Andric// 3480093f4SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4480093f4SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5480093f4SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6480093f4SDimitry Andric// 7480093f4SDimitry Andric//===----------------------------------------------------------------------===// 8480093f4SDimitry Andric// 9480093f4SDimitry Andric// This file defines the machine model for Znver2 to support instruction 10480093f4SDimitry Andric// scheduling and other instruction cost heuristics. 11480093f4SDimitry Andric// 12480093f4SDimitry Andric//===----------------------------------------------------------------------===// 13480093f4SDimitry Andric 14480093f4SDimitry Andricdef Znver2Model : SchedMachineModel { 15480093f4SDimitry Andric // Zen can decode 4 instructions per cycle. 16480093f4SDimitry Andric let IssueWidth = 4; 17480093f4SDimitry Andric // Based on the reorder buffer we define MicroOpBufferSize 18480093f4SDimitry Andric let MicroOpBufferSize = 224; 19480093f4SDimitry Andric let LoadLatency = 4; 20480093f4SDimitry Andric let MispredictPenalty = 17; 21480093f4SDimitry Andric let HighLatency = 25; 22480093f4SDimitry Andric let PostRAScheduler = 1; 23480093f4SDimitry Andric 24480093f4SDimitry Andric // FIXME: This variable is required for incomplete model. 25480093f4SDimitry Andric // We haven't catered all instructions. 26480093f4SDimitry Andric // So, we reset the value of this variable so as to 27480093f4SDimitry Andric // say that the model is incomplete. 28480093f4SDimitry Andric let CompleteModel = 0; 29480093f4SDimitry Andric} 30480093f4SDimitry Andric 31480093f4SDimitry Andriclet SchedModel = Znver2Model in { 32480093f4SDimitry Andric 33480093f4SDimitry Andric// Zen can issue micro-ops to 10 different units in one cycle. 34480093f4SDimitry Andric// These are 35480093f4SDimitry Andric// * Four integer ALU units (ZALU0, ZALU1, ZALU2, ZALU3) 36480093f4SDimitry Andric// * Three AGU units (ZAGU0, ZAGU1, ZAGU2) 37480093f4SDimitry Andric// * Four FPU units (ZFPU0, ZFPU1, ZFPU2, ZFPU3) 38480093f4SDimitry Andric// AGUs feed load store queues @two loads and 1 store per cycle. 39480093f4SDimitry Andric 40480093f4SDimitry Andric// Four ALU units are defined below 41480093f4SDimitry Andricdef Zn2ALU0 : ProcResource<1>; 42480093f4SDimitry Andricdef Zn2ALU1 : ProcResource<1>; 43480093f4SDimitry Andricdef Zn2ALU2 : ProcResource<1>; 44480093f4SDimitry Andricdef Zn2ALU3 : ProcResource<1>; 45480093f4SDimitry Andric 46480093f4SDimitry Andric// Three AGU units are defined below 47480093f4SDimitry Andricdef Zn2AGU0 : ProcResource<1>; 48480093f4SDimitry Andricdef Zn2AGU1 : ProcResource<1>; 49480093f4SDimitry Andricdef Zn2AGU2 : ProcResource<1>; 50480093f4SDimitry Andric 51480093f4SDimitry Andric// Four FPU units are defined below 52480093f4SDimitry Andricdef Zn2FPU0 : ProcResource<1>; 53480093f4SDimitry Andricdef Zn2FPU1 : ProcResource<1>; 54480093f4SDimitry Andricdef Zn2FPU2 : ProcResource<1>; 55480093f4SDimitry Andricdef Zn2FPU3 : ProcResource<1>; 56480093f4SDimitry Andric 57480093f4SDimitry Andric// FPU grouping 58480093f4SDimitry Andricdef Zn2FPU013 : ProcResGroup<[Zn2FPU0, Zn2FPU1, Zn2FPU3]>; 59480093f4SDimitry Andricdef Zn2FPU01 : ProcResGroup<[Zn2FPU0, Zn2FPU1]>; 60480093f4SDimitry Andricdef Zn2FPU12 : ProcResGroup<[Zn2FPU1, Zn2FPU2]>; 61480093f4SDimitry Andricdef Zn2FPU13 : ProcResGroup<[Zn2FPU1, Zn2FPU3]>; 62480093f4SDimitry Andricdef Zn2FPU23 : ProcResGroup<[Zn2FPU2, Zn2FPU3]>; 63480093f4SDimitry Andricdef Zn2FPU02 : ProcResGroup<[Zn2FPU0, Zn2FPU2]>; 64480093f4SDimitry Andricdef Zn2FPU03 : ProcResGroup<[Zn2FPU0, Zn2FPU3]>; 65480093f4SDimitry Andric 66480093f4SDimitry Andric// Below are the grouping of the units. 67480093f4SDimitry Andric// Micro-ops to be issued to multiple units are tackled this way. 68480093f4SDimitry Andric 69480093f4SDimitry Andric// ALU grouping 70480093f4SDimitry Andric// Zn2ALU03 - 0,3 grouping 71480093f4SDimitry Andricdef Zn2ALU03: ProcResGroup<[Zn2ALU0, Zn2ALU3]>; 72480093f4SDimitry Andric 73480093f4SDimitry Andric// 64 Entry (16x4 entries) Int Scheduler 74480093f4SDimitry Andricdef Zn2ALU : ProcResGroup<[Zn2ALU0, Zn2ALU1, Zn2ALU2, Zn2ALU3]> { 75480093f4SDimitry Andric let BufferSize=64; 76480093f4SDimitry Andric} 77480093f4SDimitry Andric 78480093f4SDimitry Andric// 28 Entry (14x2) AGU group. AGUs can't be used for all ALU operations 79480093f4SDimitry Andric// but are relevant for some instructions 80480093f4SDimitry Andricdef Zn2AGU : ProcResGroup<[Zn2AGU0, Zn2AGU1, Zn2AGU2]> { 81480093f4SDimitry Andric let BufferSize=28; 82480093f4SDimitry Andric} 83480093f4SDimitry Andric 84480093f4SDimitry Andric// Integer Multiplication issued on ALU1. 85480093f4SDimitry Andricdef Zn2Multiplier : ProcResource<1>; 86480093f4SDimitry Andric 87480093f4SDimitry Andric// Integer division issued on ALU2. 88480093f4SDimitry Andricdef Zn2Divider : ProcResource<1>; 89480093f4SDimitry Andric 90480093f4SDimitry Andric// 4 Cycles load-to use Latency is captured 91480093f4SDimitry Andricdef : ReadAdvance<ReadAfterLd, 4>; 92480093f4SDimitry Andric 93480093f4SDimitry Andric// 7 Cycles vector load-to use Latency is captured 94480093f4SDimitry Andricdef : ReadAdvance<ReadAfterVecLd, 7>; 95480093f4SDimitry Andricdef : ReadAdvance<ReadAfterVecXLd, 7>; 96480093f4SDimitry Andricdef : ReadAdvance<ReadAfterVecYLd, 7>; 97480093f4SDimitry Andric 98480093f4SDimitry Andricdef : ReadAdvance<ReadInt2Fpu, 0>; 99480093f4SDimitry Andric 100480093f4SDimitry Andric// The Integer PRF for Zen is 168 entries, and it holds the architectural and 101480093f4SDimitry Andric// speculative version of the 64-bit integer registers. 102480093f4SDimitry Andric// Reference: "Software Optimization Guide for AMD Family 17h Processors" 103480093f4SDimitry Andricdef Zn2IntegerPRF : RegisterFile<168, [GR64, CCR]>; 104480093f4SDimitry Andric 105480093f4SDimitry Andric// 36 Entry (9x4 entries) floating-point Scheduler 106480093f4SDimitry Andricdef Zn2FPU : ProcResGroup<[Zn2FPU0, Zn2FPU1, Zn2FPU2, Zn2FPU3]> { 107480093f4SDimitry Andric let BufferSize=36; 108480093f4SDimitry Andric} 109480093f4SDimitry Andric 110480093f4SDimitry Andric// The Zen FP Retire Queue renames SIMD and FP uOps onto a pool of 160 128-bit 111480093f4SDimitry Andric// registers. Operations on 256-bit data types are cracked into two COPs. 112480093f4SDimitry Andric// Reference: "Software Optimization Guide for AMD Family 17h Processors" 113480093f4SDimitry Andricdef Zn2FpuPRF: RegisterFile<160, [VR64, VR128, VR256], [1, 1, 2]>; 114480093f4SDimitry Andric 115480093f4SDimitry Andric// The unit can track up to 192 macro ops in-flight. 116480093f4SDimitry Andric// The retire unit handles in-order commit of up to 8 macro ops per cycle. 117480093f4SDimitry Andric// Reference: "Software Optimization Guide for AMD Family 17h Processors" 118480093f4SDimitry Andric// To be noted, the retire unit is shared between integer and FP ops. 119480093f4SDimitry Andric// In SMT mode it is 96 entry per thread. But, we do not use the conservative 120480093f4SDimitry Andric// value here because there is currently no way to fully mode the SMT mode, 121480093f4SDimitry Andric// so there is no point in trying. 122480093f4SDimitry Andricdef Zn2RCU : RetireControlUnit<192, 8>; 123480093f4SDimitry Andric 124480093f4SDimitry Andric// (a folded load is an instruction that loads and does some operation) 125480093f4SDimitry Andric// Ex: ADDPD xmm,[mem]-> This instruction has two micro-ops 126480093f4SDimitry Andric// Instructions with folded loads are usually micro-fused, so they only appear 127480093f4SDimitry Andric// as two micro-ops. 128480093f4SDimitry Andric// a. load and 129480093f4SDimitry Andric// b. addpd 130480093f4SDimitry Andric// This multiclass is for folded loads for integer units. 131480093f4SDimitry Andricmulticlass Zn2WriteResPair<X86FoldableSchedWrite SchedRW, 132480093f4SDimitry Andric list<ProcResourceKind> ExePorts, 133480093f4SDimitry Andric int Lat, list<int> Res = [], int UOps = 1, 134480093f4SDimitry Andric int LoadLat = 4, int LoadUOps = 1> { 135480093f4SDimitry Andric // Register variant takes 1-cycle on Execution Port. 136480093f4SDimitry Andric def : WriteRes<SchedRW, ExePorts> { 137480093f4SDimitry Andric let Latency = Lat; 138*5f757f3fSDimitry Andric let ReleaseAtCycles = Res; 139480093f4SDimitry Andric let NumMicroOps = UOps; 140480093f4SDimitry Andric } 141480093f4SDimitry Andric 142480093f4SDimitry Andric // Memory variant also uses a cycle on Zn2AGU 143480093f4SDimitry Andric // adds LoadLat cycles to the latency (default = 4). 144480093f4SDimitry Andric def : WriteRes<SchedRW.Folded, !listconcat([Zn2AGU], ExePorts)> { 145480093f4SDimitry Andric let Latency = !add(Lat, LoadLat); 146*5f757f3fSDimitry Andric let ReleaseAtCycles = !if(!empty(Res), [], !listconcat([1], Res)); 147480093f4SDimitry Andric let NumMicroOps = !add(UOps, LoadUOps); 148480093f4SDimitry Andric } 149480093f4SDimitry Andric} 150480093f4SDimitry Andric 151480093f4SDimitry Andric// This multiclass is for folded loads for floating point units. 152480093f4SDimitry Andricmulticlass Zn2WriteResFpuPair<X86FoldableSchedWrite SchedRW, 153480093f4SDimitry Andric list<ProcResourceKind> ExePorts, 154480093f4SDimitry Andric int Lat, list<int> Res = [], int UOps = 1, 155480093f4SDimitry Andric int LoadLat = 7, int LoadUOps = 0> { 156480093f4SDimitry Andric // Register variant takes 1-cycle on Execution Port. 157480093f4SDimitry Andric def : WriteRes<SchedRW, ExePorts> { 158480093f4SDimitry Andric let Latency = Lat; 159*5f757f3fSDimitry Andric let ReleaseAtCycles = Res; 160480093f4SDimitry Andric let NumMicroOps = UOps; 161480093f4SDimitry Andric } 162480093f4SDimitry Andric 163480093f4SDimitry Andric // Memory variant also uses a cycle on Zn2AGU 164480093f4SDimitry Andric // adds LoadLat cycles to the latency (default = 7). 165480093f4SDimitry Andric def : WriteRes<SchedRW.Folded, !listconcat([Zn2AGU], ExePorts)> { 166480093f4SDimitry Andric let Latency = !add(Lat, LoadLat); 167*5f757f3fSDimitry Andric let ReleaseAtCycles = !if(!empty(Res), [], !listconcat([1], Res)); 168480093f4SDimitry Andric let NumMicroOps = !add(UOps, LoadUOps); 169480093f4SDimitry Andric } 170480093f4SDimitry Andric} 171480093f4SDimitry Andric 172480093f4SDimitry Andric// WriteRMW is set for instructions with Memory write 173480093f4SDimitry Andric// operation in codegen 174480093f4SDimitry Andricdef : WriteRes<WriteRMW, [Zn2AGU]>; 175480093f4SDimitry Andric 176480093f4SDimitry Andricdef : WriteRes<WriteStore, [Zn2AGU]>; 177480093f4SDimitry Andricdef : WriteRes<WriteStoreNT, [Zn2AGU]>; 178480093f4SDimitry Andricdef : WriteRes<WriteMove, [Zn2ALU]>; 179bdd1243dSDimitry Andricdef : WriteRes<WriteLoad, [Zn2AGU]> { let Latency = 4; } 180480093f4SDimitry Andric 181fe6060f1SDimitry Andric// Model the effect of clobbering the read-write mask operand of the GATHER operation. 182fe6060f1SDimitry Andric// Does not cost anything by itself, only has latency, matching that of the WriteLoad, 183fe6060f1SDimitry Andricdef : WriteRes<WriteVecMaskedGatherWriteback, []> { let Latency = 8; let NumMicroOps = 0; } 184fe6060f1SDimitry Andric 185480093f4SDimitry Andricdef : WriteRes<WriteZero, []>; 186480093f4SDimitry Andricdef : WriteRes<WriteLEA, [Zn2ALU]>; 187480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteALU, [Zn2ALU], 1>; 188480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteADC, [Zn2ALU], 1>; 189480093f4SDimitry Andric 190480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteIMul8, [Zn2ALU1, Zn2Multiplier], 4>; 191480093f4SDimitry Andric 192480093f4SDimitry Andricdefm : X86WriteRes<WriteBSWAP32, [Zn2ALU], 1, [4], 1>; 193480093f4SDimitry Andricdefm : X86WriteRes<WriteBSWAP64, [Zn2ALU], 1, [4], 1>; 1945ffd83dbSDimitry Andricdefm : X86WriteRes<WriteCMPXCHG, [Zn2ALU], 3, [1], 1>; 195480093f4SDimitry Andricdefm : X86WriteRes<WriteCMPXCHGRMW,[Zn2ALU,Zn2AGU], 8, [1,1], 5>; 196480093f4SDimitry Andricdefm : X86WriteRes<WriteXCHG, [Zn2ALU], 1, [2], 2>; 197480093f4SDimitry Andric 198480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteShift, [Zn2ALU], 1>; 199480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteShiftCL, [Zn2ALU], 1>; 200480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteRotate, [Zn2ALU], 1>; 201480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteRotateCL, [Zn2ALU], 1>; 202480093f4SDimitry Andric 203480093f4SDimitry Andricdefm : X86WriteRes<WriteSHDrri, [Zn2ALU], 1, [1], 1>; 204480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteSHDrrcl>; 205480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteSHDmri>; 206480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteSHDmrcl>; 207480093f4SDimitry Andric 208480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteJump, [Zn2ALU], 1>; 209480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCRC32, [Zn2FPU0], 3>; 210480093f4SDimitry Andric 211480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteCMOV, [Zn2ALU], 1>; 212480093f4SDimitry Andricdef : WriteRes<WriteSETCC, [Zn2ALU]>; 213480093f4SDimitry Andricdef : WriteRes<WriteSETCCStore, [Zn2ALU, Zn2AGU]>; 214480093f4SDimitry Andricdefm : X86WriteRes<WriteLAHFSAHF, [Zn2ALU], 2, [1], 2>; 215480093f4SDimitry Andric 216480093f4SDimitry Andricdefm : X86WriteRes<WriteBitTest, [Zn2ALU], 1, [1], 1>; 217480093f4SDimitry Andricdefm : X86WriteRes<WriteBitTestImmLd, [Zn2ALU,Zn2AGU], 5, [1,1], 2>; 218480093f4SDimitry Andricdefm : X86WriteRes<WriteBitTestRegLd, [Zn2ALU,Zn2AGU], 5, [1,1], 2>; 219480093f4SDimitry Andricdefm : X86WriteRes<WriteBitTestSet, [Zn2ALU], 2, [1], 2>; 220480093f4SDimitry Andric 221480093f4SDimitry Andric// Bit counts. 22281ad6265SDimitry Andricdefm : Zn2WriteResPair<WriteBSF, [Zn2ALU], 3, [12], 6, 4, 2>; 22381ad6265SDimitry Andricdefm : Zn2WriteResPair<WriteBSR, [Zn2ALU], 4, [16], 6, 4, 2>; 224480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteLZCNT, [Zn2ALU], 1>; 225bdd1243dSDimitry Andricdefm : Zn2WriteResPair<WriteTZCNT, [Zn2ALU], 2, [2], 2, 4, 0>; 226480093f4SDimitry Andricdefm : Zn2WriteResPair<WritePOPCNT, [Zn2ALU], 1>; 227480093f4SDimitry Andric 228480093f4SDimitry Andric// Treat misc copies as a move. 229480093f4SDimitry Andricdef : InstRW<[WriteMove], (instrs COPY)>; 230480093f4SDimitry Andric 231480093f4SDimitry Andric// BMI1 BEXTR, BMI2 BZHI 232bdd1243dSDimitry Andricdefm : Zn2WriteResPair<WriteBEXTR, [Zn2ALU], 1, [1], 1, 4, 1>; 233bdd1243dSDimitry Andricdefm : Zn2WriteResPair<WriteBLS, [Zn2ALU], 2, [2], 2, 4, 1>; 234480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteBZHI, [Zn2ALU], 1>; 235480093f4SDimitry Andric 236480093f4SDimitry Andric// IDIV 237480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteDiv8, [Zn2ALU2, Zn2Divider], 15, [1,15], 1>; 238480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteDiv16, [Zn2ALU2, Zn2Divider], 17, [1,17], 2>; 239480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteDiv32, [Zn2ALU2, Zn2Divider], 25, [1,25], 2>; 240480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteDiv64, [Zn2ALU2, Zn2Divider], 41, [1,41], 2>; 241480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteIDiv8, [Zn2ALU2, Zn2Divider], 15, [1,15], 1>; 242480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteIDiv16, [Zn2ALU2, Zn2Divider], 17, [1,17], 2>; 243480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteIDiv32, [Zn2ALU2, Zn2Divider], 25, [1,25], 2>; 244480093f4SDimitry Andricdefm : Zn2WriteResPair<WriteIDiv64, [Zn2ALU2, Zn2Divider], 41, [1,41], 2>; 245480093f4SDimitry Andric 246480093f4SDimitry Andric// IMULH 247349cc55cSDimitry Andricdef Zn2WriteIMulH : WriteRes<WriteIMulH, [Zn2Multiplier]>{ 248349cc55cSDimitry Andric let Latency = 3; 249349cc55cSDimitry Andric let NumMicroOps = 0; 250480093f4SDimitry Andric} 251349cc55cSDimitry Andricdef : WriteRes<WriteIMulHLd, [Zn2Multiplier]>{ 252349cc55cSDimitry Andric let Latency = !add(Zn2WriteIMulH.Latency, Znver2Model.LoadLatency); 253349cc55cSDimitry Andric let NumMicroOps = Zn2WriteIMulH.NumMicroOps; 254349cc55cSDimitry Andric} 255349cc55cSDimitry Andric 256480093f4SDimitry Andric// Floating point operations 257480093f4SDimitry Andricdefm : X86WriteRes<WriteFLoad, [Zn2AGU], 8, [1], 1>; 258480093f4SDimitry Andricdefm : X86WriteRes<WriteFLoadX, [Zn2AGU], 8, [1], 1>; 259480093f4SDimitry Andricdefm : X86WriteRes<WriteFLoadY, [Zn2AGU], 8, [1], 1>; 260480093f4SDimitry Andricdefm : X86WriteRes<WriteFMaskedLoad, [Zn2AGU,Zn2FPU01], 8, [1,1], 1>; 261480093f4SDimitry Andricdefm : X86WriteRes<WriteFMaskedLoadY, [Zn2AGU,Zn2FPU01], 8, [1,1], 2>; 262480093f4SDimitry Andric 263480093f4SDimitry Andricdefm : X86WriteRes<WriteFStore, [Zn2AGU], 1, [1], 1>; 264480093f4SDimitry Andricdefm : X86WriteRes<WriteFStoreX, [Zn2AGU], 1, [1], 1>; 265480093f4SDimitry Andricdefm : X86WriteRes<WriteFStoreY, [Zn2AGU], 1, [1], 1>; 266480093f4SDimitry Andricdefm : X86WriteRes<WriteFStoreNT, [Zn2AGU,Zn2FPU2], 8, [1,1], 1>; 267480093f4SDimitry Andricdefm : X86WriteRes<WriteFStoreNTX, [Zn2AGU], 1, [1], 1>; 268480093f4SDimitry Andricdefm : X86WriteRes<WriteFStoreNTY, [Zn2AGU], 1, [1], 1>; 26981ad6265SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore32, [Zn2AGU,Zn2FPU01], 4, [1,1], 1>; 27081ad6265SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore32Y, [Zn2AGU,Zn2FPU01], 5, [1,2], 2>; 27181ad6265SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore64, [Zn2AGU,Zn2FPU01], 4, [1,1], 1>; 27281ad6265SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore64Y, [Zn2AGU,Zn2FPU01], 5, [1,2], 2>; 27381ad6265SDimitry Andric 274480093f4SDimitry Andricdefm : X86WriteRes<WriteFMove, [Zn2FPU], 1, [1], 1>; 275480093f4SDimitry Andricdefm : X86WriteRes<WriteFMoveX, [Zn2FPU], 1, [1], 1>; 276480093f4SDimitry Andricdefm : X86WriteRes<WriteFMoveY, [Zn2FPU], 1, [1], 1>; 27704eeddc0SDimitry Andricdefm : X86WriteResUnsupported<WriteFMoveZ>; 278480093f4SDimitry Andric 27981ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFAdd, [Zn2FPU23], 3>; 28081ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFAddX, [Zn2FPU23], 3>; 28181ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFAddY, [Zn2FPU23], 3>; 282480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFAddZ>; 28381ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFAdd64, [Zn2FPU23], 3>; 28481ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFAdd64X, [Zn2FPU23], 3>; 28581ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFAdd64Y, [Zn2FPU23], 3>; 286480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFAdd64Z>; 28781ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFCmp, [Zn2FPU01], 1>; 28881ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFCmpX, [Zn2FPU01], 1>; 28981ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFCmpY, [Zn2FPU01], 1>; 290480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFCmpZ>; 29181ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFCmp64, [Zn2FPU01], 1>; 29281ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFCmp64X, [Zn2FPU01], 1>; 29381ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFCmp64Y, [Zn2FPU01], 1>; 294480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFCmp64Z>; 29581ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFCom, [Zn2FPU01,Zn2FPU2], 3, [1,1], 2>; 29681ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFComX, [Zn2FPU01,Zn2FPU2], 3, [1,1], 2>; 297480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFBlend, [Zn2FPU01], 1>; 298480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFBlendY, [Zn2FPU01], 1>; 299480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFBlendZ>; 300480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFVarBlend, [Zn2FPU01], 1>; 301480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFVarBlendY,[Zn2FPU01], 1>; 302480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarBlendZ>; 303480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtSS2I, [Zn2FPU3], 5>; 304480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtPS2I, [Zn2FPU3], 5>; 305480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtPS2IY, [Zn2FPU3], 5>; 306480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPS2IZ>; 307480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtSD2I, [Zn2FPU3], 5>; 308480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtPD2I, [Zn2FPU3], 5>; 309480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtPD2IY, [Zn2FPU3], 5>; 310480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPD2IZ>; 311480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtI2SS, [Zn2FPU3], 5>; 312480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtI2PS, [Zn2FPU3], 5>; 313480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtI2PSY, [Zn2FPU3], 5>; 314480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtI2PSZ>; 315480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtI2SD, [Zn2FPU3], 5>; 316480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtI2PD, [Zn2FPU3], 5>; 317480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteCvtI2PDY, [Zn2FPU3], 5>; 318480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtI2PDZ>; 319bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFDiv, [Zn2FPU3], 10, [5]>; 320bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFDivX, [Zn2FPU3], 10, [5]>; 321bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFDivY, [Zn2FPU3], 10, [5]>; 322480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFDivZ>; 323bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFDiv64, [Zn2FPU3], 13, [6]>; 324bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFDiv64X, [Zn2FPU3], 13, [6]>; 325bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFDiv64Y, [Zn2FPU3], 13, [6]>; 326480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFDiv64Z>; 327480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFSign, [Zn2FPU3], 2>; 3285ffd83dbSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFRnd, [Zn2FPU3], 3, [1], 1, 7, 0>; 3295ffd83dbSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFRndY, [Zn2FPU3], 3, [1], 1, 7, 0>; 330480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRndZ>; 331480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFLogic, [Zn2FPU], 1>; 332480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFLogicY, [Zn2FPU], 1>; 333480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFLogicZ>; 33481ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFTest, [Zn2FPU12], 3, [2], 1, 7, 1>; 33581ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFTestY, [Zn2FPU12], 3, [2], 1, 7, 1>; 336480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFTestZ>; 337480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFShuffle, [Zn2FPU12], 1>; 338480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFShuffleY, [Zn2FPU12], 1>; 339480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFShuffleZ>; 3405ffd83dbSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFVarShuffle, [Zn2FPU12], 3>; 3415ffd83dbSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFVarShuffleY,[Zn2FPU12], 3>; 342480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarShuffleZ>; 343bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFMul, [Zn2FPU01], 3>; 344bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFMulX, [Zn2FPU01], 3>; 345bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFMulY, [Zn2FPU01], 3>; 346480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMulZ>; 347bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFMul64, [Zn2FPU01], 3>; 348bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFMul64X, [Zn2FPU01], 3>; 349bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFMul64Y, [Zn2FPU01], 3>; 350480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMul64Z>; 351bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFMA, [Zn2FPU01], 5>; 352bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFMAX, [Zn2FPU01], 5>; 353bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFMAY, [Zn2FPU01], 5>; 354480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMAZ>; 355480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFRcp, [Zn2FPU01], 5>; 356480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFRcpX, [Zn2FPU01], 5>; 357bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFRcpY, [Zn2FPU01], 5>; 358480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRcpZ>; 359bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFRsqrt, [Zn2FPU01], 5>; 360bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFRsqrtX, [Zn2FPU01], 5>; 361bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFRsqrtY, [Zn2FPU01], 5>; 362480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRsqrtZ>; 363bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFSqrt, [Zn2FPU3], 14, [7]>; 364bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFSqrtX, [Zn2FPU3], 14, [7]>; 365bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFSqrtY, [Zn2FPU3], 14, [7]>; 366480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFSqrtZ>; 367bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFSqrt64, [Zn2FPU3], 20, [10]>; 368bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFSqrt64X, [Zn2FPU3], 20, [10]>; 369bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFSqrt64Y, [Zn2FPU3], 20, [10]>; 370480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFSqrt64Z>; 371480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFSqrt80, [Zn2FPU3], 20, [20]>; 372bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFShuffle256, [Zn2FPU12], 2>; 373bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteFVarShuffle256, [Zn2FPU12], 2>; 374480093f4SDimitry Andric 375480093f4SDimitry Andric// Vector integer operations which uses FPU units 376480093f4SDimitry Andricdefm : X86WriteRes<WriteVecLoad, [Zn2AGU], 8, [1], 1>; 377480093f4SDimitry Andricdefm : X86WriteRes<WriteVecLoadX, [Zn2AGU], 8, [1], 1>; 378480093f4SDimitry Andricdefm : X86WriteRes<WriteVecLoadY, [Zn2AGU], 8, [1], 1>; 379480093f4SDimitry Andricdefm : X86WriteRes<WriteVecLoadNT, [Zn2AGU], 8, [1], 1>; 380480093f4SDimitry Andricdefm : X86WriteRes<WriteVecLoadNTY, [Zn2AGU], 8, [1], 1>; 381480093f4SDimitry Andricdefm : X86WriteRes<WriteVecMaskedLoad, [Zn2AGU,Zn2FPU01], 8, [1,2], 2>; 382480093f4SDimitry Andricdefm : X86WriteRes<WriteVecMaskedLoadY, [Zn2AGU,Zn2FPU01], 8, [1,2], 2>; 383480093f4SDimitry Andricdefm : X86WriteRes<WriteVecStore, [Zn2AGU], 1, [1], 1>; 384480093f4SDimitry Andricdefm : X86WriteRes<WriteVecStoreX, [Zn2AGU], 1, [1], 1>; 385480093f4SDimitry Andricdefm : X86WriteRes<WriteVecStoreY, [Zn2AGU], 1, [1], 1>; 386480093f4SDimitry Andricdefm : X86WriteRes<WriteVecStoreNT, [Zn2AGU], 1, [1], 1>; 387480093f4SDimitry Andricdefm : X86WriteRes<WriteVecStoreNTY, [Zn2AGU], 1, [1], 1>; 3885ffd83dbSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore32, [Zn2AGU,Zn2FPU01], 4, [1,1], 1>; 3895ffd83dbSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore32Y, [Zn2AGU,Zn2FPU01], 5, [1,2], 2>; 3905ffd83dbSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore64, [Zn2AGU,Zn2FPU01], 4, [1,1], 1>; 3915ffd83dbSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore64Y, [Zn2AGU,Zn2FPU01], 5, [1,2], 2>; 392480093f4SDimitry Andricdefm : X86WriteRes<WriteVecMove, [Zn2FPU], 1, [1], 1>; 393480093f4SDimitry Andricdefm : X86WriteRes<WriteVecMoveX, [Zn2FPU], 1, [1], 1>; 394480093f4SDimitry Andricdefm : X86WriteRes<WriteVecMoveY, [Zn2FPU], 2, [1], 2>; 39504eeddc0SDimitry Andricdefm : X86WriteResUnsupported<WriteVecMoveZ>; 396480093f4SDimitry Andricdefm : X86WriteRes<WriteVecMoveToGpr, [Zn2FPU2], 2, [1], 1>; 397480093f4SDimitry Andricdefm : X86WriteRes<WriteVecMoveFromGpr, [Zn2FPU2], 3, [1], 1>; 398480093f4SDimitry Andricdefm : X86WriteRes<WriteEMMS, [Zn2FPU], 2, [1], 1>; 399480093f4SDimitry Andric 40081ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecShift, [Zn2FPU2], 1>; 401480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecShiftX, [Zn2FPU2], 1>; 4025ffd83dbSDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecShiftY, [Zn2FPU2], 1>; 403480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecShiftZ>; 40481ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecShiftImm, [Zn2FPU2], 1>; 40581ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecShiftImmX, [Zn2FPU2], 1>; 40681ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecShiftImmY, [Zn2FPU2], 1>; 407480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecShiftImmZ>; 40881ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVarVecShift, [Zn2FPU1], 3, [2], 1>; 40981ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVarVecShiftY, [Zn2FPU1], 3, [2], 1>; 41081ad6265SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarVecShiftZ>; 411480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecLogic, [Zn2FPU], 1>; 412480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecLogicX, [Zn2FPU], 1>; 413480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecLogicY, [Zn2FPU], 1>; 414480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecLogicZ>; 41581ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecTest, [Zn2FPU12], 3, [2], 1, 7, 1>; 41681ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecTestY, [Zn2FPU12], 3, [2], 1, 7, 1>; 417480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecTestZ>; 418bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecALU, [Zn2FPU013], 1>; 419bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecALUX, [Zn2FPU013], 1>; 420bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecALUY, [Zn2FPU013], 1>; 421480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecALUZ>; 422480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecIMul, [Zn2FPU0], 4>; 423480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecIMulX, [Zn2FPU0], 4>; 424480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecIMulY, [Zn2FPU0], 4>; 425480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecIMulZ>; 426bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WritePMULLD, [Zn2FPU0], 4, [2]>; 427bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WritePMULLDY, [Zn2FPU0], 4, [2]>; 428480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WritePMULLDZ>; 429bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteShuffle, [Zn2FPU12], 1>; 430bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteShuffleX, [Zn2FPU12], 1>; 431bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteShuffleY, [Zn2FPU12], 1>; 432480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteShuffleZ>; 433bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteVarShuffle, [Zn2FPU12], 1>; 434bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteVarShuffleX,[Zn2FPU12], 1>; 435bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteVarShuffleY,[Zn2FPU12], 1>; 436480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarShuffleZ>; 437bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteBlend, [Zn2FPU013], 1>; 438bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteBlendY, [Zn2FPU013], 1>; 439480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WriteBlendZ>; 440bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteVarBlend, [Zn2FPU0], 1>; 441bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteVarBlendY, [Zn2FPU0], 1>; 442bdd1243dSDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarBlendZ>; 443bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteShuffle256, [Zn2FPU12], 2>; 444fe6060f1SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVPMOV256, [Zn2FPU12], 4, [1], 2, 4>; 445bdd1243dSDimitry Andricdefm : Zn2WriteResFpuPair<WriteVarShuffle256, [Zn2FPU12], 2>; 446480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WritePSADBW, [Zn2FPU0], 3>; 447480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WritePSADBWX, [Zn2FPU0], 3>; 448480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WritePSADBWY, [Zn2FPU0], 3>; 449480093f4SDimitry Andricdefm : X86WriteResPairUnsupported<WritePSADBWZ>; 450480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WritePHMINPOS, [Zn2FPU0], 4>; 451480093f4SDimitry Andric 452480093f4SDimitry Andric// Vector insert/extract operations. 453480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteVecInsert, [Zn2FPU], 1>; 454480093f4SDimitry Andric 455480093f4SDimitry Andricdef : WriteRes<WriteVecExtract, [Zn2FPU12, Zn2FPU2]> { 456480093f4SDimitry Andric let Latency = 2; 457*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 458480093f4SDimitry Andric} 459480093f4SDimitry Andricdef : WriteRes<WriteVecExtractSt, [Zn2AGU, Zn2FPU12, Zn2FPU2]> { 460480093f4SDimitry Andric let Latency = 5; 461480093f4SDimitry Andric let NumMicroOps = 2; 462*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2, 3]; 463480093f4SDimitry Andric} 464480093f4SDimitry Andric 465480093f4SDimitry Andric// MOVMSK Instructions. 466480093f4SDimitry Andricdef : WriteRes<WriteFMOVMSK, [Zn2FPU2]>; 467480093f4SDimitry Andricdef : WriteRes<WriteMMXMOVMSK, [Zn2FPU2]>; 468480093f4SDimitry Andricdef : WriteRes<WriteVecMOVMSK, [Zn2FPU2]>; 469480093f4SDimitry Andric 470480093f4SDimitry Andricdef : WriteRes<WriteVecMOVMSKY, [Zn2FPU2]> { 471480093f4SDimitry Andric let NumMicroOps = 2; 472480093f4SDimitry Andric let Latency = 2; 473*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 474480093f4SDimitry Andric} 475480093f4SDimitry Andric 476480093f4SDimitry Andric// AES Instructions. 477480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteAESDecEnc, [Zn2FPU01], 4>; 478480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteAESIMC, [Zn2FPU01], 4>; 479480093f4SDimitry Andricdefm : Zn2WriteResFpuPair<WriteAESKeyGen, [Zn2FPU01], 4>; 480480093f4SDimitry Andric 481480093f4SDimitry Andricdef : WriteRes<WriteFence, [Zn2AGU]>; 482480093f4SDimitry Andricdef : WriteRes<WriteNop, []>; 483480093f4SDimitry Andric 484480093f4SDimitry Andric// Microcoded Instructions 485480093f4SDimitry Andricdef Zn2WriteMicrocoded : SchedWriteRes<[]> { 486480093f4SDimitry Andric let Latency = 100; 487480093f4SDimitry Andric} 488480093f4SDimitry Andric 489480093f4SDimitry Andricdef : SchedAlias<WriteMicrocoded, Zn2WriteMicrocoded>; 490480093f4SDimitry Andricdef : SchedAlias<WriteFCMOV, Zn2WriteMicrocoded>; 491480093f4SDimitry Andricdef : SchedAlias<WriteSystem, Zn2WriteMicrocoded>; 492480093f4SDimitry Andricdef : SchedAlias<WriteMPSAD, Zn2WriteMicrocoded>; 493480093f4SDimitry Andricdef : SchedAlias<WriteMPSADY, Zn2WriteMicrocoded>; 494480093f4SDimitry Andricdef : SchedAlias<WriteMPSADLd, Zn2WriteMicrocoded>; 495480093f4SDimitry Andricdef : SchedAlias<WriteMPSADYLd, Zn2WriteMicrocoded>; 496480093f4SDimitry Andricdef : SchedAlias<WriteCLMul, Zn2WriteMicrocoded>; 497480093f4SDimitry Andricdef : SchedAlias<WriteCLMulLd, Zn2WriteMicrocoded>; 498480093f4SDimitry Andricdef : SchedAlias<WritePCmpIStrM, Zn2WriteMicrocoded>; 499480093f4SDimitry Andricdef : SchedAlias<WritePCmpIStrMLd, Zn2WriteMicrocoded>; 500480093f4SDimitry Andricdef : SchedAlias<WritePCmpEStrI, Zn2WriteMicrocoded>; 501480093f4SDimitry Andricdef : SchedAlias<WritePCmpEStrILd, Zn2WriteMicrocoded>; 502480093f4SDimitry Andricdef : SchedAlias<WritePCmpEStrM, Zn2WriteMicrocoded>; 503480093f4SDimitry Andricdef : SchedAlias<WritePCmpEStrMLd, Zn2WriteMicrocoded>; 504480093f4SDimitry Andricdef : SchedAlias<WritePCmpIStrI, Zn2WriteMicrocoded>; 505480093f4SDimitry Andricdef : SchedAlias<WritePCmpIStrILd, Zn2WriteMicrocoded>; 506480093f4SDimitry Andricdef : SchedAlias<WriteLDMXCSR, Zn2WriteMicrocoded>; 507480093f4SDimitry Andricdef : SchedAlias<WriteSTMXCSR, Zn2WriteMicrocoded>; 508480093f4SDimitry Andric 509480093f4SDimitry Andric//=== Regex based InstRW ===// 510480093f4SDimitry Andric// Notation: 511480093f4SDimitry Andric// - r: register. 512480093f4SDimitry Andric// - m = memory. 513480093f4SDimitry Andric// - i = immediate 514480093f4SDimitry Andric// - mm: 64 bit mmx register. 515480093f4SDimitry Andric// - x = 128 bit xmm register. 516480093f4SDimitry Andric// - (x)mm = mmx or xmm register. 517480093f4SDimitry Andric// - y = 256 bit ymm register. 518480093f4SDimitry Andric// - v = any vector register. 519480093f4SDimitry Andric 520480093f4SDimitry Andric//=== Integer Instructions ===// 521480093f4SDimitry Andric//-- Move instructions --// 522480093f4SDimitry Andric// MOV. 523480093f4SDimitry Andric// r16,m. 524bdd1243dSDimitry Andricdef : InstRW<[WriteALULd, ReadAfterLd], (instrs MOV16rm)>; 525480093f4SDimitry Andric 526480093f4SDimitry Andric// XCHG. 527480093f4SDimitry Andric// r,r. 528480093f4SDimitry Andricdef Zn2WriteXCHG : SchedWriteRes<[Zn2ALU]> { 529480093f4SDimitry Andric let NumMicroOps = 2; 530480093f4SDimitry Andric} 531480093f4SDimitry Andric 5325ffd83dbSDimitry Andricdef : InstRW<[Zn2WriteXCHG], (instregex "^XCHG(8|16|32|64)rr", "^XCHG(16|32|64)ar")>; 533480093f4SDimitry Andric 534480093f4SDimitry Andric// r,m. 535480093f4SDimitry Andricdef Zn2WriteXCHGrm : SchedWriteRes<[Zn2AGU, Zn2ALU]> { 536480093f4SDimitry Andric let Latency = 5; 537480093f4SDimitry Andric let NumMicroOps = 2; 538480093f4SDimitry Andric} 5395ffd83dbSDimitry Andricdef : InstRW<[Zn2WriteXCHGrm, ReadAfterLd], (instregex "^XCHG(8|16|32|64)rm")>; 540480093f4SDimitry Andric 541480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs XLAT)>; 542480093f4SDimitry Andric 543480093f4SDimitry Andric// POP16. 544480093f4SDimitry Andric// r. 545480093f4SDimitry Andricdef Zn2WritePop16r : SchedWriteRes<[Zn2AGU]>{ 546480093f4SDimitry Andric let Latency = 5; 547480093f4SDimitry Andric let NumMicroOps = 2; 548480093f4SDimitry Andric} 549bdd1243dSDimitry Andricdef : InstRW<[Zn2WritePop16r], (instrs POP16rmm)>; 550480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "POPF(16|32)")>; 551480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "POPA(16|32)")>; 552480093f4SDimitry Andric 553480093f4SDimitry Andric 554480093f4SDimitry Andric// PUSH. 555480093f4SDimitry Andric// r. Has default values. 556480093f4SDimitry Andric// m. 557480093f4SDimitry Andricdef Zn2WritePUSH : SchedWriteRes<[Zn2AGU]>{ 558480093f4SDimitry Andric let Latency = 4; 559480093f4SDimitry Andric} 560480093f4SDimitry Andricdef : InstRW<[Zn2WritePUSH], (instregex "PUSH(16|32)rmm")>; 561480093f4SDimitry Andric 562480093f4SDimitry Andric// PUSHF 563480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "PUSHF(16|32)")>; 564480093f4SDimitry Andric 565480093f4SDimitry Andric// PUSHA. 566480093f4SDimitry Andricdef Zn2WritePushA : SchedWriteRes<[Zn2AGU]> { 567480093f4SDimitry Andric let Latency = 8; 568480093f4SDimitry Andric} 569480093f4SDimitry Andricdef : InstRW<[Zn2WritePushA], (instregex "PUSHA(16|32)")>; 570480093f4SDimitry Andric 571480093f4SDimitry Andric//LAHF 572480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs LAHF)>; 573480093f4SDimitry Andric 574480093f4SDimitry Andric// MOVBE. 575480093f4SDimitry Andric// r,m. 576480093f4SDimitry Andricdef Zn2WriteMOVBE : SchedWriteRes<[Zn2AGU, Zn2ALU]> { 577480093f4SDimitry Andric let Latency = 5; 578480093f4SDimitry Andric} 579480093f4SDimitry Andricdef : InstRW<[Zn2WriteMOVBE, ReadAfterLd], (instregex "MOVBE(16|32|64)rm")>; 580480093f4SDimitry Andric 581480093f4SDimitry Andric// m16,r16. 582480093f4SDimitry Andricdef : InstRW<[Zn2WriteMOVBE], (instregex "MOVBE(16|32|64)mr")>; 583480093f4SDimitry Andric 584480093f4SDimitry Andric//-- Arithmetic instructions --// 585480093f4SDimitry Andric 586480093f4SDimitry Andric// ADD SUB. 587480093f4SDimitry Andric// m,r/i. 588480093f4SDimitry Andricdef : InstRW<[WriteALULd], (instregex "(ADD|SUB)(8|16|32|64)m(r|i)", 589480093f4SDimitry Andric "(ADD|SUB)(8|16|32|64)mi8", 590480093f4SDimitry Andric "(ADD|SUB)64mi32")>; 591480093f4SDimitry Andric 592480093f4SDimitry Andric// ADC SBB. 593480093f4SDimitry Andric// m,r/i. 594480093f4SDimitry Andricdef : InstRW<[WriteALULd], 595480093f4SDimitry Andric (instregex "(ADC|SBB)(8|16|32|64)m(r|i)", 596480093f4SDimitry Andric "(ADC|SBB)(16|32|64)mi8", 597480093f4SDimitry Andric "(ADC|SBB)64mi32")>; 598480093f4SDimitry Andric 599480093f4SDimitry Andric// INC DEC NOT NEG. 600480093f4SDimitry Andric// m. 601480093f4SDimitry Andricdef : InstRW<[WriteALULd], 602480093f4SDimitry Andric (instregex "(INC|DEC|NOT|NEG)(8|16|32|64)m")>; 603480093f4SDimitry Andric 604480093f4SDimitry Andric// MUL IMUL. 605480093f4SDimitry Andric// r16. 606480093f4SDimitry Andricdef Zn2WriteMul16 : SchedWriteRes<[Zn2ALU1, Zn2Multiplier]> { 607480093f4SDimitry Andric let Latency = 3; 608480093f4SDimitry Andric} 6095ffd83dbSDimitry Andricdef Zn2WriteMul16Imm : SchedWriteRes<[Zn2ALU1, Zn2Multiplier]> { 6105ffd83dbSDimitry Andric let Latency = 4; 6115ffd83dbSDimitry Andric} 612480093f4SDimitry Andricdef : SchedAlias<WriteIMul16, Zn2WriteMul16>; 6135ffd83dbSDimitry Andricdef : SchedAlias<WriteIMul16Imm, Zn2WriteMul16Imm>; 614480093f4SDimitry Andricdef : SchedAlias<WriteIMul16Reg, Zn2WriteMul16>; 615480093f4SDimitry Andric 616480093f4SDimitry Andric// m16. 617480093f4SDimitry Andricdef Zn2WriteMul16Ld : SchedWriteRes<[Zn2AGU, Zn2ALU1, Zn2Multiplier]> { 618480093f4SDimitry Andric let Latency = 7; 619480093f4SDimitry Andric} 620480093f4SDimitry Andricdef : SchedAlias<WriteIMul16Ld, Zn2WriteMul16Ld>; 621480093f4SDimitry Andricdef : SchedAlias<WriteIMul16ImmLd, Zn2WriteMul16Ld>; 622480093f4SDimitry Andricdef : SchedAlias<WriteIMul16RegLd, Zn2WriteMul16Ld>; 623480093f4SDimitry Andric 624480093f4SDimitry Andric// r32. 625480093f4SDimitry Andricdef Zn2WriteMul32 : SchedWriteRes<[Zn2ALU1, Zn2Multiplier]> { 626480093f4SDimitry Andric let Latency = 3; 627480093f4SDimitry Andric} 628480093f4SDimitry Andricdef : SchedAlias<WriteIMul32, Zn2WriteMul32>; 629480093f4SDimitry Andricdef : SchedAlias<WriteIMul32Imm, Zn2WriteMul32>; 630480093f4SDimitry Andricdef : SchedAlias<WriteIMul32Reg, Zn2WriteMul32>; 631480093f4SDimitry Andric 632480093f4SDimitry Andric// m32. 633480093f4SDimitry Andricdef Zn2WriteMul32Ld : SchedWriteRes<[Zn2AGU, Zn2ALU1, Zn2Multiplier]> { 634480093f4SDimitry Andric let Latency = 7; 635480093f4SDimitry Andric} 636480093f4SDimitry Andricdef : SchedAlias<WriteIMul32Ld, Zn2WriteMul32Ld>; 637480093f4SDimitry Andricdef : SchedAlias<WriteIMul32ImmLd, Zn2WriteMul32Ld>; 638480093f4SDimitry Andricdef : SchedAlias<WriteIMul32RegLd, Zn2WriteMul32Ld>; 639480093f4SDimitry Andric 640480093f4SDimitry Andric// r64. 641480093f4SDimitry Andricdef Zn2WriteMul64 : SchedWriteRes<[Zn2ALU1, Zn2Multiplier]> { 642480093f4SDimitry Andric let Latency = 4; 643480093f4SDimitry Andric let NumMicroOps = 2; 644480093f4SDimitry Andric} 645480093f4SDimitry Andricdef : SchedAlias<WriteIMul64, Zn2WriteMul64>; 646480093f4SDimitry Andricdef : SchedAlias<WriteIMul64Imm, Zn2WriteMul64>; 647480093f4SDimitry Andricdef : SchedAlias<WriteIMul64Reg, Zn2WriteMul64>; 648480093f4SDimitry Andric 649480093f4SDimitry Andric// m64. 650480093f4SDimitry Andricdef Zn2WriteMul64Ld : SchedWriteRes<[Zn2AGU, Zn2ALU1, Zn2Multiplier]> { 651480093f4SDimitry Andric let Latency = 8; 652480093f4SDimitry Andric let NumMicroOps = 2; 653480093f4SDimitry Andric} 654480093f4SDimitry Andricdef : SchedAlias<WriteIMul64Ld, Zn2WriteMul64Ld>; 655480093f4SDimitry Andricdef : SchedAlias<WriteIMul64ImmLd, Zn2WriteMul64Ld>; 656480093f4SDimitry Andricdef : SchedAlias<WriteIMul64RegLd, Zn2WriteMul64Ld>; 657480093f4SDimitry Andric 658480093f4SDimitry Andric// MULX. 659349cc55cSDimitry Andric// Numbers are based on the AMD SOG for Family 17h - Instruction Latencies. 660349cc55cSDimitry Andricdefm : Zn2WriteResPair<WriteMULX32, [Zn2ALU1, Zn2Multiplier], 3, [1, 1], 1, 4, 0>; 661349cc55cSDimitry Andricdefm : Zn2WriteResPair<WriteMULX64, [Zn2ALU1, Zn2Multiplier], 3, [1, 1], 1, 4, 0>; 662480093f4SDimitry Andric 663480093f4SDimitry Andric//-- Control transfer instructions --// 664480093f4SDimitry Andric 665480093f4SDimitry Andric// J(E|R)CXZ. 666480093f4SDimitry Andricdef Zn2WriteJCXZ : SchedWriteRes<[Zn2ALU03]>; 667480093f4SDimitry Andricdef : InstRW<[Zn2WriteJCXZ], (instrs JCXZ, JECXZ, JRCXZ)>; 668480093f4SDimitry Andric 669480093f4SDimitry Andric// LOOP. 670480093f4SDimitry Andricdef Zn2WriteLOOP : SchedWriteRes<[Zn2ALU03]>; 671480093f4SDimitry Andricdef : InstRW<[Zn2WriteLOOP], (instrs LOOP)>; 672480093f4SDimitry Andric 673480093f4SDimitry Andric// LOOP(N)E, LOOP(N)Z 674480093f4SDimitry Andricdef Zn2WriteLOOPE : SchedWriteRes<[Zn2ALU03]>; 675480093f4SDimitry Andricdef : InstRW<[Zn2WriteLOOPE], (instrs LOOPE, LOOPNE)>; 676480093f4SDimitry Andric 677480093f4SDimitry Andric// CALL. 678480093f4SDimitry Andric// r. 679480093f4SDimitry Andricdef Zn2WriteCALLr : SchedWriteRes<[Zn2AGU, Zn2ALU03]>; 680480093f4SDimitry Andricdef : InstRW<[Zn2WriteCALLr], (instregex "CALL(16|32)r")>; 681480093f4SDimitry Andric 682480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "CALL(16|32)m")>; 683480093f4SDimitry Andric 684480093f4SDimitry Andric// RET. 685480093f4SDimitry Andricdef Zn2WriteRET : SchedWriteRes<[Zn2ALU03]> { 686480093f4SDimitry Andric let NumMicroOps = 2; 687480093f4SDimitry Andric} 688349cc55cSDimitry Andricdef : InstRW<[Zn2WriteRET], (instregex "RET(16|32|64)", "LRET(16|32|64)", 689480093f4SDimitry Andric "IRET(16|32|64)")>; 690480093f4SDimitry Andric 691480093f4SDimitry Andric//-- Logic instructions --// 692480093f4SDimitry Andric 693480093f4SDimitry Andric// AND OR XOR. 694480093f4SDimitry Andric// m,r/i. 695480093f4SDimitry Andricdef : InstRW<[WriteALULd], 696480093f4SDimitry Andric (instregex "(AND|OR|XOR)(8|16|32|64)m(r|i)", 697480093f4SDimitry Andric "(AND|OR|XOR)(8|16|32|64)mi8", "(AND|OR|XOR)64mi32")>; 698480093f4SDimitry Andric 699480093f4SDimitry Andric// Define ALU latency variants 700480093f4SDimitry Andricdef Zn2WriteALULat2 : SchedWriteRes<[Zn2ALU]> { 701480093f4SDimitry Andric let Latency = 2; 702480093f4SDimitry Andric} 703480093f4SDimitry Andricdef Zn2WriteALULat2Ld : SchedWriteRes<[Zn2AGU, Zn2ALU]> { 704480093f4SDimitry Andric let Latency = 6; 705480093f4SDimitry Andric} 706480093f4SDimitry Andric 707480093f4SDimitry Andric// BTR BTS BTC. 708480093f4SDimitry Andric// m,r,i. 709480093f4SDimitry Andricdef Zn2WriteBTRSCm : SchedWriteRes<[Zn2AGU, Zn2ALU]> { 710480093f4SDimitry Andric let Latency = 6; 711480093f4SDimitry Andric let NumMicroOps = 2; 712480093f4SDimitry Andric} 713480093f4SDimitry Andric// m,r,i. 714480093f4SDimitry Andricdef : SchedAlias<WriteBitTestSetImmRMW, Zn2WriteBTRSCm>; 715480093f4SDimitry Andricdef : SchedAlias<WriteBitTestSetRegRMW, Zn2WriteBTRSCm>; 716480093f4SDimitry Andric 717480093f4SDimitry Andric// PDEP PEXT. 718480093f4SDimitry Andric// r,r,r. 719480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "PDEP(32|64)rr", "PEXT(32|64)rr")>; 720480093f4SDimitry Andric// r,r,m. 721480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "PDEP(32|64)rm", "PEXT(32|64)rm")>; 722480093f4SDimitry Andric 723480093f4SDimitry Andric// RCR RCL. 724480093f4SDimitry Andric// m,i. 725480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "RC(R|L)(8|16|32|64)m(1|i|CL)")>; 726480093f4SDimitry Andric 727480093f4SDimitry Andric// SHR SHL SAR. 728480093f4SDimitry Andric// m,i. 729480093f4SDimitry Andricdef : InstRW<[WriteShiftLd], (instregex "S(A|H)(R|L)(8|16|32|64)m(i|1)")>; 730480093f4SDimitry Andric 731480093f4SDimitry Andric// SHRD SHLD. 732480093f4SDimitry Andric// m,r 733480093f4SDimitry Andricdef : InstRW<[WriteShiftLd], (instregex "SH(R|L)D(16|32|64)mri8")>; 734480093f4SDimitry Andric 735480093f4SDimitry Andric// r,r,cl. 736480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "SH(R|L)D(16|32|64)rrCL")>; 737480093f4SDimitry Andric 738480093f4SDimitry Andric// m,r,cl. 739480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "SH(R|L)D(16|32|64)mrCL")>; 740480093f4SDimitry Andric 741480093f4SDimitry Andric//-- Misc instructions --// 742480093f4SDimitry Andric// CMPXCHG8B. 743480093f4SDimitry Andricdef Zn2WriteCMPXCHG8B : SchedWriteRes<[Zn2AGU, Zn2ALU]> { 744480093f4SDimitry Andric let NumMicroOps = 18; 745480093f4SDimitry Andric} 746480093f4SDimitry Andricdef : InstRW<[Zn2WriteCMPXCHG8B], (instrs CMPXCHG8B)>; 747480093f4SDimitry Andric 748480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs CMPXCHG16B)>; 749480093f4SDimitry Andric 750480093f4SDimitry Andric// LEAVE 751480093f4SDimitry Andricdef Zn2WriteLEAVE : SchedWriteRes<[Zn2ALU, Zn2AGU]> { 752480093f4SDimitry Andric let Latency = 8; 753480093f4SDimitry Andric let NumMicroOps = 2; 754480093f4SDimitry Andric} 755480093f4SDimitry Andricdef : InstRW<[Zn2WriteLEAVE], (instregex "LEAVE")>; 756480093f4SDimitry Andric 757480093f4SDimitry Andric// PAUSE. 758480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs PAUSE)>; 759480093f4SDimitry Andric 760480093f4SDimitry Andric// XADD. 761480093f4SDimitry Andricdef Zn2XADD : SchedWriteRes<[Zn2ALU]>; 762480093f4SDimitry Andricdef : InstRW<[Zn2XADD], (instregex "XADD(8|16|32|64)rr")>; 763480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "XADD(8|16|32|64)rm")>; 764480093f4SDimitry Andric 765480093f4SDimitry Andric//=== Floating Point x87 Instructions ===// 766480093f4SDimitry Andric//-- Move instructions --// 767480093f4SDimitry Andric 768480093f4SDimitry Andricdef Zn2WriteFLDr : SchedWriteRes<[Zn2FPU13]> ; 769480093f4SDimitry Andric 770480093f4SDimitry Andricdef Zn2WriteSTr: SchedWriteRes<[Zn2FPU23]> { 771480093f4SDimitry Andric let Latency = 5; 772480093f4SDimitry Andric let NumMicroOps = 2; 773480093f4SDimitry Andric} 774480093f4SDimitry Andric 775480093f4SDimitry Andric// LD_F. 776480093f4SDimitry Andric// r. 777bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteFLDr], (instrs LD_Frr)>; 778480093f4SDimitry Andric 779480093f4SDimitry Andric// m. 780480093f4SDimitry Andricdef Zn2WriteLD_F80m : SchedWriteRes<[Zn2AGU, Zn2FPU13]> { 781480093f4SDimitry Andric let NumMicroOps = 2; 782480093f4SDimitry Andric} 783bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteLD_F80m], (instrs LD_F80m)>; 784480093f4SDimitry Andric 785480093f4SDimitry Andric// FST(P). 786480093f4SDimitry Andric// r. 787480093f4SDimitry Andricdef : InstRW<[Zn2WriteSTr], (instregex "ST_(F|FP)rr")>; 788480093f4SDimitry Andric 789480093f4SDimitry Andric// m80. 790480093f4SDimitry Andricdef Zn2WriteST_FP80m : SchedWriteRes<[Zn2AGU, Zn2FPU23]> { 791480093f4SDimitry Andric let Latency = 5; 792480093f4SDimitry Andric} 793bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteST_FP80m], (instrs ST_FP80m)>; 794480093f4SDimitry Andric 795480093f4SDimitry Andricdef Zn2WriteFXCH : SchedWriteRes<[Zn2FPU]>; 796480093f4SDimitry Andric 797480093f4SDimitry Andric// FXCHG. 798480093f4SDimitry Andricdef : InstRW<[Zn2WriteFXCH], (instrs XCH_F)>; 799480093f4SDimitry Andric 800480093f4SDimitry Andric// FILD. 801480093f4SDimitry Andricdef Zn2WriteFILD : SchedWriteRes<[Zn2AGU, Zn2FPU3]> { 802480093f4SDimitry Andric let Latency = 11; 803480093f4SDimitry Andric let NumMicroOps = 2; 804480093f4SDimitry Andric} 805480093f4SDimitry Andricdef : InstRW<[Zn2WriteFILD], (instregex "ILD_F(16|32|64)m")>; 806480093f4SDimitry Andric 807480093f4SDimitry Andric// FIST(P) FISTTP. 808480093f4SDimitry Andricdef Zn2WriteFIST : SchedWriteRes<[Zn2AGU, Zn2FPU23]> { 809480093f4SDimitry Andric let Latency = 12; 810480093f4SDimitry Andric} 811480093f4SDimitry Andricdef : InstRW<[Zn2WriteFIST], (instregex "IS(T|TT)_(F|FP)(16|32|64)m")>; 812480093f4SDimitry Andric 813480093f4SDimitry Andricdef Zn2WriteFPU13 : SchedWriteRes<[Zn2AGU, Zn2FPU13]> { 814480093f4SDimitry Andric let Latency = 8; 815480093f4SDimitry Andric} 816480093f4SDimitry Andric 817480093f4SDimitry Andricdef Zn2WriteFPU3 : SchedWriteRes<[Zn2AGU, Zn2FPU3]> { 818480093f4SDimitry Andric let Latency = 11; 819480093f4SDimitry Andric} 820480093f4SDimitry Andric 821480093f4SDimitry Andric// FLDZ. 822480093f4SDimitry Andricdef : SchedAlias<WriteFLD0, Zn2WriteFPU13>; 823480093f4SDimitry Andric 824480093f4SDimitry Andric// FLD1. 825480093f4SDimitry Andricdef : SchedAlias<WriteFLD1, Zn2WriteFPU3>; 826480093f4SDimitry Andric 827480093f4SDimitry Andric// FLDPI FLDL2E etc. 828480093f4SDimitry Andricdef : SchedAlias<WriteFLDC, Zn2WriteFPU3>; 829480093f4SDimitry Andric 830480093f4SDimitry Andric// FNSTSW. 831480093f4SDimitry Andric// AX. 832480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs FNSTSW16r)>; 833480093f4SDimitry Andric 834480093f4SDimitry Andric// FLDCW. 835480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs FLDCW16m)>; 836480093f4SDimitry Andric 837480093f4SDimitry Andric// FNSTCW. 838480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs FNSTCW16m)>; 839480093f4SDimitry Andric 840480093f4SDimitry Andric// FINCSTP FDECSTP. 841480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU3], (instrs FINCSTP, FDECSTP)>; 842480093f4SDimitry Andric 843480093f4SDimitry Andric// FFREE. 844480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU3], (instregex "FFREE")>; 845480093f4SDimitry Andric 846480093f4SDimitry Andric//-- Arithmetic instructions --// 847480093f4SDimitry Andric 848480093f4SDimitry Andricdef Zn2WriteFPU3Lat1 : SchedWriteRes<[Zn2FPU3]> ; 849480093f4SDimitry Andric 850480093f4SDimitry Andricdef Zn2WriteFPU0Lat1 : SchedWriteRes<[Zn2FPU0]> ; 851480093f4SDimitry Andric 852480093f4SDimitry Andricdef Zn2WriteFPU0Lat1Ld : SchedWriteRes<[Zn2AGU, Zn2FPU0]> { 853480093f4SDimitry Andric let Latency = 8; 854480093f4SDimitry Andric} 855480093f4SDimitry Andric 856480093f4SDimitry Andric// FCHS. 857480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU3Lat1], (instregex "CHS_F")>; 858480093f4SDimitry Andric 859480093f4SDimitry Andric// FCOM(P) FUCOM(P). 860480093f4SDimitry Andric// r. 861480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU0Lat1], (instregex "COM(P?)_FST0r", "UCOM_F(P?)r")>; 862480093f4SDimitry Andric// m. 863480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU0Lat1Ld], (instregex "FCOM(P?)(32|64)m")>; 864480093f4SDimitry Andric 865480093f4SDimitry Andric// FCOMPP FUCOMPP. 866480093f4SDimitry Andric// r. 867480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU0Lat1], (instrs FCOMPP, UCOM_FPPr)>; 868480093f4SDimitry Andric 869480093f4SDimitry Andricdef Zn2WriteFPU02 : SchedWriteRes<[Zn2AGU, Zn2FPU02]> 870480093f4SDimitry Andric{ 871480093f4SDimitry Andric let Latency = 9; 872480093f4SDimitry Andric} 873480093f4SDimitry Andric 874480093f4SDimitry Andric// FCOMI(P) FUCOMI(P). 875480093f4SDimitry Andric// m. 876480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU02], (instrs COM_FIPr, COM_FIr, UCOM_FIPr, UCOM_FIr)>; 877480093f4SDimitry Andric 878480093f4SDimitry Andricdef Zn2WriteFPU03 : SchedWriteRes<[Zn2AGU, Zn2FPU03]> 879480093f4SDimitry Andric{ 880480093f4SDimitry Andric let Latency = 12; 881480093f4SDimitry Andric let NumMicroOps = 2; 882*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,3]; 883480093f4SDimitry Andric} 884480093f4SDimitry Andric 885480093f4SDimitry Andric// FICOM(P). 886480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU03], (instregex "FICOM(P?)(16|32)m")>; 887480093f4SDimitry Andric 888480093f4SDimitry Andric// FTST. 889480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU0Lat1], (instregex "TST_F")>; 890480093f4SDimitry Andric 891480093f4SDimitry Andric// FXAM. 892fe6060f1SDimitry Andricdef : InstRW<[Zn2WriteFPU3Lat1], (instrs XAM_F)>; 893480093f4SDimitry Andric 894480093f4SDimitry Andric// FNOP. 895480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU0Lat1], (instrs FNOP)>; 896480093f4SDimitry Andric 897480093f4SDimitry Andric// WAIT. 898480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU0Lat1], (instrs WAIT)>; 899480093f4SDimitry Andric 900480093f4SDimitry Andric//=== Integer MMX and XMM Instructions ===// 901480093f4SDimitry Andric 902480093f4SDimitry Andricdef Zn2WriteFPU013 : SchedWriteRes<[Zn2FPU013]> ; 903480093f4SDimitry Andricdef Zn2WriteFPU013m : SchedWriteRes<[Zn2AGU, Zn2FPU013]> { 904480093f4SDimitry Andric let Latency = 8; 905480093f4SDimitry Andric let NumMicroOps = 2; 906480093f4SDimitry Andric} 907480093f4SDimitry Andric 908480093f4SDimitry Andricdef Zn2WriteFPU01 : SchedWriteRes<[Zn2FPU01]> ; 909480093f4SDimitry Andricdef Zn2WriteFPU01Y : SchedWriteRes<[Zn2FPU01]> { 910480093f4SDimitry Andric let NumMicroOps = 2; 911480093f4SDimitry Andric} 912480093f4SDimitry Andric 913480093f4SDimitry Andric// VPBLENDD. 914480093f4SDimitry Andric// v,v,v,i. 915480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU01], (instrs VPBLENDDrri)>; 916480093f4SDimitry Andric// ymm 917480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU01Y], (instrs VPBLENDDYrri)>; 918480093f4SDimitry Andric 919480093f4SDimitry Andric// v,v,m,i 920480093f4SDimitry Andricdef Zn2WriteFPU01Op2 : SchedWriteRes<[Zn2AGU, Zn2FPU01]> { 921480093f4SDimitry Andric let NumMicroOps = 2; 922480093f4SDimitry Andric let Latency = 8; 923*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 924480093f4SDimitry Andric} 925480093f4SDimitry Andricdef Zn2WriteFPU01Op2Y : SchedWriteRes<[Zn2AGU, Zn2FPU01]> { 926480093f4SDimitry Andric let NumMicroOps = 2; 927480093f4SDimitry Andric let Latency = 9; 928*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 3]; 929480093f4SDimitry Andric} 930480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU01Op2], (instrs VPBLENDDrmi)>; 931480093f4SDimitry Andricdef : InstRW<[Zn2WriteFPU01Op2Y], (instrs VPBLENDDYrmi)>; 932480093f4SDimitry Andric 933480093f4SDimitry Andric// MASKMOVQ. 934480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "MMX_MASKMOVQ(64)?")>; 935480093f4SDimitry Andric 936480093f4SDimitry Andric// MASKMOVDQU. 937480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "(V?)MASKMOVDQU(64)?")>; 938480093f4SDimitry Andric 939480093f4SDimitry Andric// VPMASKMOVD. 940480093f4SDimitry Andric// ymm 941480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], 942480093f4SDimitry Andric (instregex "VPMASKMOVD(Y?)rm")>; 943480093f4SDimitry Andric// m, v,v. 944480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "VPMASKMOV(D|Q)(Y?)mr")>; 945480093f4SDimitry Andric 946480093f4SDimitry Andric// VPBROADCAST B/W. 947480093f4SDimitry Andric// x, m8/16. 948480093f4SDimitry Andricdef Zn2WriteVPBROADCAST128Ld : SchedWriteRes<[Zn2AGU, Zn2FPU12]> { 949480093f4SDimitry Andric let Latency = 8; 950480093f4SDimitry Andric let NumMicroOps = 2; 951*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 952480093f4SDimitry Andric} 953480093f4SDimitry Andricdef : InstRW<[Zn2WriteVPBROADCAST128Ld], 954480093f4SDimitry Andric (instregex "VPBROADCAST(B|W)rm")>; 955480093f4SDimitry Andric 956480093f4SDimitry Andric// y, m8/16 957480093f4SDimitry Andricdef Zn2WriteVPBROADCAST256Ld : SchedWriteRes<[Zn2AGU, Zn2FPU1]> { 958480093f4SDimitry Andric let Latency = 8; 959480093f4SDimitry Andric let NumMicroOps = 2; 960*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 961480093f4SDimitry Andric} 962480093f4SDimitry Andricdef : InstRW<[Zn2WriteVPBROADCAST256Ld], 963480093f4SDimitry Andric (instregex "VPBROADCAST(B|W)Yrm")>; 964480093f4SDimitry Andric 965480093f4SDimitry Andric// VPGATHER. 966480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "VPGATHER(Q|D)(Q|D)(Y?)rm")>; 967480093f4SDimitry Andric 968480093f4SDimitry Andric//-- Arithmetic instructions --// 969480093f4SDimitry Andric 97081ad6265SDimitry Andric// HADD, HSUB PS/PD 97181ad6265SDimitry Andric// PHADD|PHSUB (S) W/D. 97281ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFHAdd, [], 7>; 97381ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WriteFHAddY, [], 7>; 97481ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WritePHAdd, [], 3>; 97581ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WritePHAddX, [], 3>; 97681ad6265SDimitry Andricdefm : Zn2WriteResFpuPair<WritePHAddY, [], 3>; 97781ad6265SDimitry Andric 978480093f4SDimitry Andric// PCMPGTQ. 979480093f4SDimitry Andricdef Zn2WritePCMPGTQr : SchedWriteRes<[Zn2FPU03]>; 980480093f4SDimitry Andricdef : InstRW<[Zn2WritePCMPGTQr], (instregex "(V?)PCMPGTQ(Y?)rr")>; 981480093f4SDimitry Andric 982480093f4SDimitry Andric// x <- x,m. 983480093f4SDimitry Andricdef Zn2WritePCMPGTQm : SchedWriteRes<[Zn2AGU, Zn2FPU03]> { 984480093f4SDimitry Andric let Latency = 8; 985480093f4SDimitry Andric} 986480093f4SDimitry Andric// ymm. 987480093f4SDimitry Andricdef Zn2WritePCMPGTQYm : SchedWriteRes<[Zn2AGU, Zn2FPU03]> { 988480093f4SDimitry Andric let Latency = 8; 989480093f4SDimitry Andric} 990480093f4SDimitry Andricdef : InstRW<[Zn2WritePCMPGTQm], (instregex "(V?)PCMPGTQrm")>; 991480093f4SDimitry Andricdef : InstRW<[Zn2WritePCMPGTQYm], (instrs VPCMPGTQYrm)>; 992480093f4SDimitry Andric 993480093f4SDimitry Andric//=== Floating Point XMM and YMM Instructions ===// 994480093f4SDimitry Andric//-- Move instructions --// 995480093f4SDimitry Andric 996bdd1243dSDimitry Andric// VPERM2F128 / VPERM2I128. 997bdd1243dSDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs VPERM2F128rr, 998bdd1243dSDimitry Andric VPERM2I128rr)>; 999bdd1243dSDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs VPERM2F128rm, 1000bdd1243dSDimitry Andric VPERM2I128rm)>; 1001480093f4SDimitry Andric 1002480093f4SDimitry Andricdef Zn2WriteBROADCAST : SchedWriteRes<[Zn2AGU, Zn2FPU13]> { 1003480093f4SDimitry Andric let NumMicroOps = 2; 1004480093f4SDimitry Andric let Latency = 8; 1005480093f4SDimitry Andric} 1006bdd1243dSDimitry Andric// VBROADCASTF128 / VBROADCASTI128. 1007*5f757f3fSDimitry Andricdef : InstRW<[Zn2WriteBROADCAST], (instrs VBROADCASTF128rm, 1008*5f757f3fSDimitry Andric VBROADCASTI128rm)>; 1009480093f4SDimitry Andric 1010480093f4SDimitry Andric// EXTRACTPS. 1011480093f4SDimitry Andric// r32,x,i. 1012480093f4SDimitry Andricdef Zn2WriteEXTRACTPSr : SchedWriteRes<[Zn2FPU12, Zn2FPU2]> { 1013480093f4SDimitry Andric let Latency = 2; 1014bdd1243dSDimitry Andric let NumMicroOps = 2; 1015*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 1016480093f4SDimitry Andric} 1017480093f4SDimitry Andricdef : InstRW<[Zn2WriteEXTRACTPSr], (instregex "(V?)EXTRACTPSrr")>; 1018480093f4SDimitry Andric 1019480093f4SDimitry Andricdef Zn2WriteEXTRACTPSm : SchedWriteRes<[Zn2AGU,Zn2FPU12, Zn2FPU2]> { 1020480093f4SDimitry Andric let Latency = 5; 1021480093f4SDimitry Andric let NumMicroOps = 2; 1022*5f757f3fSDimitry Andric let ReleaseAtCycles = [5, 1, 2]; 1023480093f4SDimitry Andric} 1024480093f4SDimitry Andric// m32,x,i. 1025480093f4SDimitry Andricdef : InstRW<[Zn2WriteEXTRACTPSm], (instregex "(V?)EXTRACTPSmr")>; 1026480093f4SDimitry Andric 1027bdd1243dSDimitry Andric// VEXTRACTF128 / VEXTRACTI128. 1028480093f4SDimitry Andric// x,y,i. 1029bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteFPU013], (instrs VEXTRACTF128rr, 1030bdd1243dSDimitry Andric VEXTRACTI128rr)>; 1031480093f4SDimitry Andric 1032480093f4SDimitry Andric// m128,y,i. 1033bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteFPU013m], (instrs VEXTRACTF128mr, 1034bdd1243dSDimitry Andric VEXTRACTI128mr)>; 1035480093f4SDimitry Andric 1036480093f4SDimitry Andricdef Zn2WriteVINSERT128r: SchedWriteRes<[Zn2FPU013]> { 1037480093f4SDimitry Andric let Latency = 2; 1038*5f757f3fSDimitry Andric// let ReleaseAtCycles = [2]; 1039480093f4SDimitry Andric} 1040480093f4SDimitry Andricdef Zn2WriteVINSERT128Ld: SchedWriteRes<[Zn2AGU,Zn2FPU013]> { 1041480093f4SDimitry Andric let Latency = 9; 1042480093f4SDimitry Andric let NumMicroOps = 2; 1043480093f4SDimitry Andric} 1044bdd1243dSDimitry Andric// VINSERTF128 / VINSERTI128. 1045480093f4SDimitry Andric// y,y,x,i. 1046bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteVINSERT128r], (instrs VINSERTF128rr, 1047bdd1243dSDimitry Andric VINSERTI128rr)>; 1048bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteVINSERT128Ld], (instrs VINSERTF128rm, 1049bdd1243dSDimitry Andric VINSERTI128rm)>; 1050480093f4SDimitry Andric 1051480093f4SDimitry Andric// VGATHER. 1052480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "VGATHER(Q|D)(PD|PS)(Y?)rm")>; 1053480093f4SDimitry Andric 1054480093f4SDimitry Andric//-- Conversion instructions --// 1055480093f4SDimitry Andricdef Zn2WriteCVTPD2PSr: SchedWriteRes<[Zn2FPU3]> { 1056480093f4SDimitry Andric let Latency = 3; 1057480093f4SDimitry Andric} 1058480093f4SDimitry Andricdef Zn2WriteCVTPD2PSYr: SchedWriteRes<[Zn2FPU3]> { 1059480093f4SDimitry Andric let Latency = 3; 1060480093f4SDimitry Andric} 1061480093f4SDimitry Andric 1062480093f4SDimitry Andric// CVTPD2PS. 1063480093f4SDimitry Andric// x,x. 1064480093f4SDimitry Andricdef : SchedAlias<WriteCvtPD2PS, Zn2WriteCVTPD2PSr>; 1065480093f4SDimitry Andric// y,y. 1066480093f4SDimitry Andricdef : SchedAlias<WriteCvtPD2PSY, Zn2WriteCVTPD2PSYr>; 1067480093f4SDimitry Andric// z,z. 1068480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPD2PSZ>; 1069480093f4SDimitry Andric 1070bdd1243dSDimitry Andricdef Zn2WriteCVTPD2PSLd: SchedWriteRes<[Zn2AGU,Zn2FPU3]> { 1071480093f4SDimitry Andric let Latency = 10; 1072480093f4SDimitry Andric} 1073480093f4SDimitry Andric// x,m128. 1074480093f4SDimitry Andricdef : SchedAlias<WriteCvtPD2PSLd, Zn2WriteCVTPD2PSLd>; 1075480093f4SDimitry Andric 1076480093f4SDimitry Andric// x,m256. 1077480093f4SDimitry Andricdef Zn2WriteCVTPD2PSYLd : SchedWriteRes<[Zn2AGU, Zn2FPU3]> { 1078480093f4SDimitry Andric let Latency = 10; 1079480093f4SDimitry Andric} 1080480093f4SDimitry Andricdef : SchedAlias<WriteCvtPD2PSYLd, Zn2WriteCVTPD2PSYLd>; 1081480093f4SDimitry Andric// z,m512 1082480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPD2PSZLd>; 1083480093f4SDimitry Andric 1084480093f4SDimitry Andric// CVTSD2SS. 1085480093f4SDimitry Andric// x,x. 1086480093f4SDimitry Andric// Same as WriteCVTPD2PSr 1087480093f4SDimitry Andricdef : SchedAlias<WriteCvtSD2SS, Zn2WriteCVTPD2PSr>; 1088480093f4SDimitry Andric 1089480093f4SDimitry Andric// x,m64. 1090480093f4SDimitry Andricdef : SchedAlias<WriteCvtSD2SSLd, Zn2WriteCVTPD2PSLd>; 1091480093f4SDimitry Andric 1092480093f4SDimitry Andric// CVTPS2PD. 1093480093f4SDimitry Andric// x,x. 1094480093f4SDimitry Andricdef Zn2WriteCVTPS2PDr : SchedWriteRes<[Zn2FPU3]> { 1095480093f4SDimitry Andric let Latency = 3; 1096480093f4SDimitry Andric} 1097480093f4SDimitry Andricdef : SchedAlias<WriteCvtPS2PD, Zn2WriteCVTPS2PDr>; 1098480093f4SDimitry Andric 1099480093f4SDimitry Andric// x,m64. 1100480093f4SDimitry Andric// y,m128. 1101480093f4SDimitry Andricdef Zn2WriteCVTPS2PDLd : SchedWriteRes<[Zn2AGU, Zn2FPU3]> { 1102480093f4SDimitry Andric let Latency = 10; 1103480093f4SDimitry Andric let NumMicroOps = 2; 1104480093f4SDimitry Andric} 1105480093f4SDimitry Andricdef : SchedAlias<WriteCvtPS2PDLd, Zn2WriteCVTPS2PDLd>; 1106480093f4SDimitry Andricdef : SchedAlias<WriteCvtPS2PDYLd, Zn2WriteCVTPS2PDLd>; 1107480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PDZLd>; 1108480093f4SDimitry Andric 1109480093f4SDimitry Andric// y,x. 1110480093f4SDimitry Andricdef Zn2WriteVCVTPS2PDY : SchedWriteRes<[Zn2FPU3]> { 1111480093f4SDimitry Andric let Latency = 3; 1112480093f4SDimitry Andric} 1113480093f4SDimitry Andricdef : SchedAlias<WriteCvtPS2PDY, Zn2WriteVCVTPS2PDY>; 1114480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PDZ>; 1115480093f4SDimitry Andric 1116480093f4SDimitry Andric// CVTSS2SD. 1117480093f4SDimitry Andric// x,x. 1118480093f4SDimitry Andricdef Zn2WriteCVTSS2SDr : SchedWriteRes<[Zn2FPU3]> { 1119480093f4SDimitry Andric let Latency = 3; 1120480093f4SDimitry Andric} 1121480093f4SDimitry Andricdef : SchedAlias<WriteCvtSS2SD, Zn2WriteCVTSS2SDr>; 1122480093f4SDimitry Andric 1123480093f4SDimitry Andric// x,m32. 1124480093f4SDimitry Andricdef Zn2WriteCVTSS2SDLd : SchedWriteRes<[Zn2AGU, Zn2FPU3]> { 1125480093f4SDimitry Andric let Latency = 10; 1126480093f4SDimitry Andric let NumMicroOps = 2; 1127*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 1128480093f4SDimitry Andric} 1129480093f4SDimitry Andricdef : SchedAlias<WriteCvtSS2SDLd, Zn2WriteCVTSS2SDLd>; 1130480093f4SDimitry Andric 1131480093f4SDimitry Andricdef Zn2WriteCVTDQ2PDr: SchedWriteRes<[Zn2FPU12,Zn2FPU3]> { 1132480093f4SDimitry Andric let Latency = 3; 1133480093f4SDimitry Andric} 1134480093f4SDimitry Andric// CVTDQ2PD. 1135480093f4SDimitry Andric// x,x. 11365ffd83dbSDimitry Andricdef : InstRW<[Zn2WriteCVTDQ2PDr], (instregex "(V)?CVTDQ2P(D|S)rr")>; 1137480093f4SDimitry Andric 1138480093f4SDimitry Andric// Same as xmm 1139480093f4SDimitry Andric// y,x. 1140480093f4SDimitry Andricdef : InstRW<[Zn2WriteCVTDQ2PDr], (instrs VCVTDQ2PDYrr)>; 1141480093f4SDimitry Andricdef : InstRW<[Zn2WriteCVTDQ2PDr], (instrs VCVTDQ2PSYrr)>; 1142480093f4SDimitry Andric 1143480093f4SDimitry Andricdef Zn2WriteCVTPD2DQr: SchedWriteRes<[Zn2FPU12, Zn2FPU3]> { 1144480093f4SDimitry Andric let Latency = 3; 1145480093f4SDimitry Andric} 11465ffd83dbSDimitry Andric// CVT(T)P(D|S)2DQ. 1147480093f4SDimitry Andric// x,x. 11485ffd83dbSDimitry Andricdef : InstRW<[Zn2WriteCVTPD2DQr], (instregex "(V?)CVT(T?)P(D|S)2DQrr")>; 1149480093f4SDimitry Andric 1150480093f4SDimitry Andricdef Zn2WriteCVTPD2DQLd: SchedWriteRes<[Zn2AGU,Zn2FPU12,Zn2FPU3]> { 1151480093f4SDimitry Andric let Latency = 10; 1152480093f4SDimitry Andric let NumMicroOps = 2; 1153480093f4SDimitry Andric} 1154480093f4SDimitry Andric// x,m128. 1155480093f4SDimitry Andricdef : InstRW<[Zn2WriteCVTPD2DQLd], (instregex "(V?)CVT(T?)PD2DQrm")>; 1156480093f4SDimitry Andric// same as xmm handling 1157480093f4SDimitry Andric// x,y. 1158480093f4SDimitry Andricdef : InstRW<[Zn2WriteCVTPD2DQr], (instregex "VCVT(T?)PD2DQYrr")>; 1159480093f4SDimitry Andric// x,m256. 1160480093f4SDimitry Andricdef : InstRW<[Zn2WriteCVTPD2DQLd], (instregex "VCVT(T?)PD2DQYrm")>; 1161480093f4SDimitry Andric 1162480093f4SDimitry Andricdef Zn2WriteCVTPS2PIr: SchedWriteRes<[Zn2FPU3]> { 1163480093f4SDimitry Andric let Latency = 4; 1164480093f4SDimitry Andric} 1165480093f4SDimitry Andric// CVT(T)PS2PI. 1166480093f4SDimitry Andric// mm,x. 11670eae32dcSDimitry Andricdef : InstRW<[Zn2WriteCVTPS2PIr], (instregex "MMX_CVT(T?)PS2PIrr")>; 1168480093f4SDimitry Andric 1169480093f4SDimitry Andric// CVTPI2PD. 1170480093f4SDimitry Andric// x,mm. 11710eae32dcSDimitry Andricdef : InstRW<[Zn2WriteCVTPS2PDr], (instrs MMX_CVTPI2PDrr)>; 1172480093f4SDimitry Andric 1173480093f4SDimitry Andric// CVT(T)PD2PI. 1174480093f4SDimitry Andric// mm,x. 11750eae32dcSDimitry Andricdef : InstRW<[Zn2WriteCVTPS2PIr], (instregex "MMX_CVT(T?)PD2PIrr")>; 1176480093f4SDimitry Andric 1177480093f4SDimitry Andricdef Zn2WriteCVSTSI2SSr: SchedWriteRes<[Zn2FPU3]> { 11785ffd83dbSDimitry Andric let Latency = 3; 1179480093f4SDimitry Andric} 1180480093f4SDimitry Andric 1181480093f4SDimitry Andric// same as CVTPD2DQr 1182480093f4SDimitry Andric// CVT(T)SS2SI. 1183480093f4SDimitry Andric// r32,x. 1184480093f4SDimitry Andricdef : InstRW<[Zn2WriteCVTPD2DQr], (instregex "(V?)CVT(T?)SS2SI(64)?rr")>; 1185480093f4SDimitry Andric// same as CVTPD2DQm 1186480093f4SDimitry Andric// r32,m32. 1187480093f4SDimitry Andricdef : InstRW<[Zn2WriteCVTPD2DQLd], (instregex "(V?)CVT(T?)SS2SI(64)?rm")>; 1188480093f4SDimitry Andric 1189480093f4SDimitry Andricdef Zn2WriteCVSTSI2SDr: SchedWriteRes<[Zn2FPU013, Zn2FPU3]> { 11905ffd83dbSDimitry Andric let Latency = 3; 1191480093f4SDimitry Andric} 1192480093f4SDimitry Andric// CVTSI2SD. 1193480093f4SDimitry Andric// x,r32/64. 1194480093f4SDimitry Andricdef : InstRW<[Zn2WriteCVSTSI2SDr], (instregex "(V?)CVTSI(64)?2SDrr")>; 1195480093f4SDimitry Andric 1196480093f4SDimitry Andric 1197480093f4SDimitry Andricdef Zn2WriteCVSTSI2SIr: SchedWriteRes<[Zn2FPU3, Zn2FPU2]> { 1198480093f4SDimitry Andric let Latency = 4; 1199480093f4SDimitry Andric} 1200480093f4SDimitry Andricdef Zn2WriteCVSTSI2SILd: SchedWriteRes<[Zn2AGU, Zn2FPU3, Zn2FPU2]> { 1201480093f4SDimitry Andric let Latency = 11; 1202480093f4SDimitry Andric} 1203480093f4SDimitry Andric// CVTSD2SI. 1204480093f4SDimitry Andric// r32/64 1205480093f4SDimitry Andricdef : InstRW<[Zn2WriteCVSTSI2SIr], (instregex "(V?)CVT(T?)SD2SI(64)?rr")>; 1206480093f4SDimitry Andric// r32,m32. 1207480093f4SDimitry Andricdef : InstRW<[Zn2WriteCVSTSI2SILd], (instregex "(V?)CVT(T?)SD2SI(64)?rm")>; 1208480093f4SDimitry Andric 1209480093f4SDimitry Andric// VCVTPS2PH. 1210480093f4SDimitry Andric// x,v,i. 1211480093f4SDimitry Andricdef : SchedAlias<WriteCvtPS2PH, Zn2WriteMicrocoded>; 1212480093f4SDimitry Andricdef : SchedAlias<WriteCvtPS2PHY, Zn2WriteMicrocoded>; 1213480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHZ>; 1214480093f4SDimitry Andric// m,v,i. 1215480093f4SDimitry Andricdef : SchedAlias<WriteCvtPS2PHSt, Zn2WriteMicrocoded>; 1216480093f4SDimitry Andricdef : SchedAlias<WriteCvtPS2PHYSt, Zn2WriteMicrocoded>; 1217480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHZSt>; 1218480093f4SDimitry Andric 1219480093f4SDimitry Andric// VCVTPH2PS. 1220480093f4SDimitry Andric// v,x. 1221480093f4SDimitry Andricdef : SchedAlias<WriteCvtPH2PS, Zn2WriteMicrocoded>; 1222480093f4SDimitry Andricdef : SchedAlias<WriteCvtPH2PSY, Zn2WriteMicrocoded>; 1223480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPH2PSZ>; 1224480093f4SDimitry Andric// v,m. 1225480093f4SDimitry Andricdef : SchedAlias<WriteCvtPH2PSLd, Zn2WriteMicrocoded>; 1226480093f4SDimitry Andricdef : SchedAlias<WriteCvtPH2PSYLd, Zn2WriteMicrocoded>; 1227480093f4SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPH2PSZLd>; 1228480093f4SDimitry Andric 1229480093f4SDimitry Andric//-- SSE4A instructions --// 1230480093f4SDimitry Andric// EXTRQ 1231480093f4SDimitry Andricdef Zn2WriteEXTRQ: SchedWriteRes<[Zn2FPU12, Zn2FPU2]> { 12325ffd83dbSDimitry Andric let Latency = 3; 1233480093f4SDimitry Andric} 1234480093f4SDimitry Andricdef : InstRW<[Zn2WriteEXTRQ], (instregex "EXTRQ")>; 1235480093f4SDimitry Andric 1236480093f4SDimitry Andric// INSERTQ 1237480093f4SDimitry Andricdef Zn2WriteINSERTQ: SchedWriteRes<[Zn2FPU03,Zn2FPU1]> { 1238480093f4SDimitry Andric let Latency = 4; 1239480093f4SDimitry Andric} 1240480093f4SDimitry Andricdef : InstRW<[Zn2WriteINSERTQ], (instregex "INSERTQ")>; 1241480093f4SDimitry Andric 1242480093f4SDimitry Andric//-- SHA instructions --// 1243480093f4SDimitry Andric// SHA256MSG2 1244480093f4SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "SHA256MSG2(Y?)r(r|m)")>; 1245480093f4SDimitry Andric 1246480093f4SDimitry Andric// SHA1MSG1, SHA256MSG1 1247480093f4SDimitry Andric// x,x. 1248480093f4SDimitry Andricdef Zn2WriteSHA1MSG1r : SchedWriteRes<[Zn2FPU12]> { 1249480093f4SDimitry Andric let Latency = 2; 1250480093f4SDimitry Andric} 1251480093f4SDimitry Andricdef : InstRW<[Zn2WriteSHA1MSG1r], (instregex "SHA(1|256)MSG1rr")>; 1252480093f4SDimitry Andric// x,m. 1253480093f4SDimitry Andricdef Zn2WriteSHA1MSG1Ld : SchedWriteRes<[Zn2AGU, Zn2FPU12]> { 1254480093f4SDimitry Andric let Latency = 9; 1255480093f4SDimitry Andric} 1256480093f4SDimitry Andricdef : InstRW<[Zn2WriteSHA1MSG1Ld], (instregex "SHA(1|256)MSG1rm")>; 1257480093f4SDimitry Andric 1258480093f4SDimitry Andric// SHA1MSG2 1259480093f4SDimitry Andric// x,x. 1260480093f4SDimitry Andricdef Zn2WriteSHA1MSG2r : SchedWriteRes<[Zn2FPU12]> ; 1261bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteSHA1MSG2r], (instrs SHA1MSG2rr)>; 1262480093f4SDimitry Andric// x,m. 1263480093f4SDimitry Andricdef Zn2WriteSHA1MSG2Ld : SchedWriteRes<[Zn2AGU, Zn2FPU12]> { 1264480093f4SDimitry Andric let Latency = 8; 1265480093f4SDimitry Andric} 1266bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteSHA1MSG2Ld], (instrs SHA1MSG2rm)>; 1267480093f4SDimitry Andric 1268480093f4SDimitry Andric// SHA1NEXTE 1269480093f4SDimitry Andric// x,x. 1270480093f4SDimitry Andricdef Zn2WriteSHA1NEXTEr : SchedWriteRes<[Zn2FPU1]> ; 1271bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteSHA1NEXTEr], (instrs SHA1NEXTErr)>; 1272480093f4SDimitry Andric// x,m. 1273480093f4SDimitry Andricdef Zn2WriteSHA1NEXTELd : SchedWriteRes<[Zn2AGU, Zn2FPU1]> { 1274480093f4SDimitry Andric let Latency = 8; 1275480093f4SDimitry Andric} 1276bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteSHA1NEXTELd], (instrs SHA1NEXTErm)>; 1277480093f4SDimitry Andric 1278480093f4SDimitry Andric// SHA1RNDS4 1279480093f4SDimitry Andric// x,x. 1280480093f4SDimitry Andricdef Zn2WriteSHA1RNDS4r : SchedWriteRes<[Zn2FPU1]> { 1281480093f4SDimitry Andric let Latency = 6; 1282480093f4SDimitry Andric} 1283bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteSHA1RNDS4r], (instrs SHA1RNDS4rri)>; 1284480093f4SDimitry Andric// x,m. 1285480093f4SDimitry Andricdef Zn2WriteSHA1RNDS4Ld : SchedWriteRes<[Zn2AGU, Zn2FPU1]> { 1286480093f4SDimitry Andric let Latency = 13; 1287480093f4SDimitry Andric} 1288bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteSHA1RNDS4Ld], (instrs SHA1RNDS4rmi)>; 1289480093f4SDimitry Andric 1290480093f4SDimitry Andric// SHA256RNDS2 1291480093f4SDimitry Andric// x,x. 1292480093f4SDimitry Andricdef Zn2WriteSHA256RNDS2r : SchedWriteRes<[Zn2FPU1]> { 1293480093f4SDimitry Andric let Latency = 4; 1294480093f4SDimitry Andric} 1295bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteSHA256RNDS2r], (instrs SHA256RNDS2rr)>; 1296480093f4SDimitry Andric// x,m. 1297480093f4SDimitry Andricdef Zn2WriteSHA256RNDS2Ld : SchedWriteRes<[Zn2AGU, Zn2FPU1]> { 1298480093f4SDimitry Andric let Latency = 11; 1299480093f4SDimitry Andric} 1300bdd1243dSDimitry Andricdef : InstRW<[Zn2WriteSHA256RNDS2Ld], (instrs SHA256RNDS2rm)>; 1301480093f4SDimitry Andric 1302480093f4SDimitry Andric//-- Arithmetic instructions --// 1303480093f4SDimitry Andric 1304480093f4SDimitry Andric// DPPS. 1305480093f4SDimitry Andric// x,x,i / v,v,v,i. 130681ad6265SDimitry Andricdefm : Zn2WriteResPair<WriteDPPS, [], 15>; 1307480093f4SDimitry Andricdef : SchedAlias<WriteDPPSY, Zn2WriteMicrocoded>; 1308480093f4SDimitry Andric 1309480093f4SDimitry Andric// x,m,i / v,v,m,i. 1310480093f4SDimitry Andricdef : SchedAlias<WriteDPPSYLd,Zn2WriteMicrocoded>; 1311480093f4SDimitry Andric 1312480093f4SDimitry Andric// DPPD. 1313480093f4SDimitry Andric// x,x,i. 1314480093f4SDimitry Andricdef : SchedAlias<WriteDPPD, Zn2WriteMicrocoded>; 1315480093f4SDimitry Andric 1316480093f4SDimitry Andric// x,m,i. 1317480093f4SDimitry Andricdef : SchedAlias<WriteDPPDLd, Zn2WriteMicrocoded>; 1318480093f4SDimitry Andric 1319480093f4SDimitry Andric//-- Other instructions --// 1320480093f4SDimitry Andric 1321480093f4SDimitry Andric// VZEROUPPER. 1322480093f4SDimitry Andricdef : InstRW<[WriteALU], (instrs VZEROUPPER)>; 1323480093f4SDimitry Andric 132404eeddc0SDimitry Andric/////////////////////////////////////////////////////////////////////////////// 132504eeddc0SDimitry Andric// Dependency breaking instructions. 132604eeddc0SDimitry Andric/////////////////////////////////////////////////////////////////////////////// 132704eeddc0SDimitry Andric 132804eeddc0SDimitry Andricdef : IsZeroIdiomFunction<[ 132904eeddc0SDimitry Andric // GPR Zero-idioms. 133004eeddc0SDimitry Andric DepBreakingClass<[ 133104eeddc0SDimitry Andric SUB32rr, SUB64rr, 133204eeddc0SDimitry Andric XOR32rr, XOR64rr 133304eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 133404eeddc0SDimitry Andric 133504eeddc0SDimitry Andric // MMX Zero-idioms. 133604eeddc0SDimitry Andric DepBreakingClass<[ 133704eeddc0SDimitry Andric MMX_PXORrr, MMX_PANDNrr, MMX_PSUBBrr, 133804eeddc0SDimitry Andric MMX_PSUBDrr, MMX_PSUBQrr, MMX_PSUBWrr, 133904eeddc0SDimitry Andric MMX_PSUBSBrr, MMX_PSUBSWrr, MMX_PSUBUSBrr, MMX_PSUBUSWrr, 134004eeddc0SDimitry Andric MMX_PCMPGTBrr, MMX_PCMPGTDrr, MMX_PCMPGTWrr 134104eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 134204eeddc0SDimitry Andric 134304eeddc0SDimitry Andric // SSE Zero-idioms. 134404eeddc0SDimitry Andric DepBreakingClass<[ 134504eeddc0SDimitry Andric // fp variants. 134604eeddc0SDimitry Andric XORPSrr, XORPDrr, ANDNPSrr, ANDNPDrr, 134704eeddc0SDimitry Andric 134804eeddc0SDimitry Andric // int variants. 134904eeddc0SDimitry Andric PXORrr, PANDNrr, 135004eeddc0SDimitry Andric PSUBBrr, PSUBWrr, PSUBDrr, PSUBQrr, 135104eeddc0SDimitry Andric PCMPGTBrr, PCMPGTDrr, PCMPGTQrr, PCMPGTWrr 135204eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 135304eeddc0SDimitry Andric 135404eeddc0SDimitry Andric // AVX XMM Zero-idioms. 135504eeddc0SDimitry Andric DepBreakingClass<[ 135604eeddc0SDimitry Andric // fp variants. 135704eeddc0SDimitry Andric VXORPSrr, VXORPDrr, VANDNPSrr, VANDNPDrr, 135804eeddc0SDimitry Andric 135904eeddc0SDimitry Andric // int variants. 136004eeddc0SDimitry Andric VPXORrr, VPANDNrr, 136104eeddc0SDimitry Andric VPSUBBrr, VPSUBWrr, VPSUBDrr, VPSUBQrr, 136204eeddc0SDimitry Andric VPCMPGTBrr, VPCMPGTWrr, VPCMPGTDrr, VPCMPGTQrr 136304eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 136404eeddc0SDimitry Andric 136504eeddc0SDimitry Andric // AVX YMM Zero-idioms. 136604eeddc0SDimitry Andric DepBreakingClass<[ 136704eeddc0SDimitry Andric // fp variants 136804eeddc0SDimitry Andric VXORPSYrr, VXORPDYrr, VANDNPSYrr, VANDNPDYrr, 136904eeddc0SDimitry Andric 137004eeddc0SDimitry Andric // int variants 137104eeddc0SDimitry Andric VPXORYrr, VPANDNYrr, 137204eeddc0SDimitry Andric VPSUBBYrr, VPSUBWYrr, VPSUBDYrr, VPSUBQYrr, 137304eeddc0SDimitry Andric VPCMPGTBYrr, VPCMPGTWYrr, VPCMPGTDYrr, VPCMPGTQYrr 137404eeddc0SDimitry Andric ], ZeroIdiomPredicate> 137504eeddc0SDimitry Andric]>; 137604eeddc0SDimitry Andric 137704eeddc0SDimitry Andricdef : IsDepBreakingFunction<[ 137804eeddc0SDimitry Andric // GPR 137904eeddc0SDimitry Andric DepBreakingClass<[ SBB32rr, SBB64rr ], ZeroIdiomPredicate>, 138004eeddc0SDimitry Andric DepBreakingClass<[ CMP32rr, CMP64rr ], CheckSameRegOperand<0, 1> >, 138104eeddc0SDimitry Andric 138204eeddc0SDimitry Andric // MMX 138304eeddc0SDimitry Andric DepBreakingClass<[ 138404eeddc0SDimitry Andric MMX_PCMPEQBrr, MMX_PCMPEQWrr, MMX_PCMPEQDrr 138504eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 138604eeddc0SDimitry Andric 138704eeddc0SDimitry Andric // SSE 138804eeddc0SDimitry Andric DepBreakingClass<[ 138904eeddc0SDimitry Andric PCMPEQBrr, PCMPEQWrr, PCMPEQDrr, PCMPEQQrr 139004eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 139104eeddc0SDimitry Andric 139204eeddc0SDimitry Andric // AVX XMM 139304eeddc0SDimitry Andric DepBreakingClass<[ 139404eeddc0SDimitry Andric VPCMPEQBrr, VPCMPEQWrr, VPCMPEQDrr, VPCMPEQQrr 139504eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 139604eeddc0SDimitry Andric 139704eeddc0SDimitry Andric // AVX YMM 139804eeddc0SDimitry Andric DepBreakingClass<[ 139904eeddc0SDimitry Andric VPCMPEQBYrr, VPCMPEQWYrr, VPCMPEQDYrr, VPCMPEQQYrr 140004eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 140104eeddc0SDimitry Andric]>; 140204eeddc0SDimitry Andric 1403480093f4SDimitry Andric} // SchedModel 1404