10b57cec5SDimitry Andric//=- X86ScheduleZnver1.td - X86 Znver1 Scheduling -------------*- tablegen -*-=// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// 90b57cec5SDimitry Andric// This file defines the machine model for Znver1 to support instruction 100b57cec5SDimitry Andric// scheduling and other instruction cost heuristics. 110b57cec5SDimitry Andric// 120b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andricdef Znver1Model : SchedMachineModel { 150b57cec5SDimitry Andric // Zen can decode 4 instructions per cycle. 160b57cec5SDimitry Andric let IssueWidth = 4; 170b57cec5SDimitry Andric // Based on the reorder buffer we define MicroOpBufferSize 180b57cec5SDimitry Andric let MicroOpBufferSize = 192; 190b57cec5SDimitry Andric let LoadLatency = 4; 200b57cec5SDimitry Andric let MispredictPenalty = 17; 210b57cec5SDimitry Andric let HighLatency = 25; 220b57cec5SDimitry Andric let PostRAScheduler = 1; 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric // FIXME: This variable is required for incomplete model. 250b57cec5SDimitry Andric // We haven't catered all instructions. 260b57cec5SDimitry Andric // So, we reset the value of this variable so as to 270b57cec5SDimitry Andric // say that the model is incomplete. 280b57cec5SDimitry Andric let CompleteModel = 0; 290b57cec5SDimitry Andric} 300b57cec5SDimitry Andric 310b57cec5SDimitry Andriclet SchedModel = Znver1Model in { 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric// Zen can issue micro-ops to 10 different units in one cycle. 340b57cec5SDimitry Andric// These are 350b57cec5SDimitry Andric// * Four integer ALU units (ZALU0, ZALU1, ZALU2, ZALU3) 360b57cec5SDimitry Andric// * Two AGU units (ZAGU0, ZAGU1) 370b57cec5SDimitry Andric// * Four FPU units (ZFPU0, ZFPU1, ZFPU2, ZFPU3) 380b57cec5SDimitry Andric// AGUs feed load store queues @two loads and 1 store per cycle. 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric// Four ALU units are defined below 410b57cec5SDimitry Andricdef ZnALU0 : ProcResource<1>; 420b57cec5SDimitry Andricdef ZnALU1 : ProcResource<1>; 430b57cec5SDimitry Andricdef ZnALU2 : ProcResource<1>; 440b57cec5SDimitry Andricdef ZnALU3 : ProcResource<1>; 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric// Two AGU units are defined below 470b57cec5SDimitry Andricdef ZnAGU0 : ProcResource<1>; 480b57cec5SDimitry Andricdef ZnAGU1 : ProcResource<1>; 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric// Four FPU units are defined below 510b57cec5SDimitry Andricdef ZnFPU0 : ProcResource<1>; 520b57cec5SDimitry Andricdef ZnFPU1 : ProcResource<1>; 530b57cec5SDimitry Andricdef ZnFPU2 : ProcResource<1>; 540b57cec5SDimitry Andricdef ZnFPU3 : ProcResource<1>; 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric// FPU grouping 570b57cec5SDimitry Andricdef ZnFPU013 : ProcResGroup<[ZnFPU0, ZnFPU1, ZnFPU3]>; 580b57cec5SDimitry Andricdef ZnFPU01 : ProcResGroup<[ZnFPU0, ZnFPU1]>; 590b57cec5SDimitry Andricdef ZnFPU12 : ProcResGroup<[ZnFPU1, ZnFPU2]>; 600b57cec5SDimitry Andricdef ZnFPU13 : ProcResGroup<[ZnFPU1, ZnFPU3]>; 610b57cec5SDimitry Andricdef ZnFPU23 : ProcResGroup<[ZnFPU2, ZnFPU3]>; 620b57cec5SDimitry Andricdef ZnFPU02 : ProcResGroup<[ZnFPU0, ZnFPU2]>; 630b57cec5SDimitry Andricdef ZnFPU03 : ProcResGroup<[ZnFPU0, ZnFPU3]>; 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric// Below are the grouping of the units. 660b57cec5SDimitry Andric// Micro-ops to be issued to multiple units are tackled this way. 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric// ALU grouping 690b57cec5SDimitry Andric// ZnALU03 - 0,3 grouping 700b57cec5SDimitry Andricdef ZnALU03: ProcResGroup<[ZnALU0, ZnALU3]>; 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric// 56 Entry (14x4 entries) Int Scheduler 730b57cec5SDimitry Andricdef ZnALU : ProcResGroup<[ZnALU0, ZnALU1, ZnALU2, ZnALU3]> { 740b57cec5SDimitry Andric let BufferSize=56; 750b57cec5SDimitry Andric} 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric// 28 Entry (14x2) AGU group. AGUs can't be used for all ALU operations 780b57cec5SDimitry Andric// but are relevant for some instructions 790b57cec5SDimitry Andricdef ZnAGU : ProcResGroup<[ZnAGU0, ZnAGU1]> { 800b57cec5SDimitry Andric let BufferSize=28; 810b57cec5SDimitry Andric} 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric// Integer Multiplication issued on ALU1. 840b57cec5SDimitry Andricdef ZnMultiplier : ProcResource<1>; 850b57cec5SDimitry Andric 860b57cec5SDimitry Andric// Integer division issued on ALU2. 870b57cec5SDimitry Andricdef ZnDivider : ProcResource<1>; 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric// 4 Cycles integer load-to use Latency is captured 900b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterLd, 4>; 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric// 8 Cycles vector load-to use Latency is captured 930b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecLd, 8>; 940b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecXLd, 8>; 950b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecYLd, 8>; 960b57cec5SDimitry Andric 970b57cec5SDimitry Andricdef : ReadAdvance<ReadInt2Fpu, 0>; 980b57cec5SDimitry Andric 990b57cec5SDimitry Andric// The Integer PRF for Zen is 168 entries, and it holds the architectural and 1000b57cec5SDimitry Andric// speculative version of the 64-bit integer registers. 1010b57cec5SDimitry Andric// Reference: "Software Optimization Guide for AMD Family 17h Processors" 1020b57cec5SDimitry Andricdef ZnIntegerPRF : RegisterFile<168, [GR64, CCR]>; 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andric// 36 Entry (9x4 entries) floating-point Scheduler 1050b57cec5SDimitry Andricdef ZnFPU : ProcResGroup<[ZnFPU0, ZnFPU1, ZnFPU2, ZnFPU3]> { 1060b57cec5SDimitry Andriclet BufferSize=36; 1070b57cec5SDimitry Andric} 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andric// The Zen FP Retire Queue renames SIMD and FP uOps onto a pool of 160 128-bit 1100b57cec5SDimitry Andric// registers. Operations on 256-bit data types are cracked into two COPs. 1110b57cec5SDimitry Andric// Reference: "Software Optimization Guide for AMD Family 17h Processors" 1120b57cec5SDimitry Andricdef ZnFpuPRF: RegisterFile<160, [VR64, VR128, VR256], [1, 1, 2]>; 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric// The unit can track up to 192 macro ops in-flight. 1150b57cec5SDimitry Andric// The retire unit handles in-order commit of up to 8 macro ops per cycle. 1160b57cec5SDimitry Andric// Reference: "Software Optimization Guide for AMD Family 17h Processors" 1170b57cec5SDimitry Andric// To be noted, the retire unit is shared between integer and FP ops. 1180b57cec5SDimitry Andric// In SMT mode it is 96 entry per thread. But, we do not use the conservative 1190b57cec5SDimitry Andric// value here because there is currently no way to fully mode the SMT mode, 1200b57cec5SDimitry Andric// so there is no point in trying. 1210b57cec5SDimitry Andricdef ZnRCU : RetireControlUnit<192, 8>; 1220b57cec5SDimitry Andric 1230b57cec5SDimitry Andric// FIXME: there are 72 read buffers and 44 write buffers. 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric// (a folded load is an instruction that loads and does some operation) 1260b57cec5SDimitry Andric// Ex: ADDPD xmm,[mem]-> This instruction has two micro-ops 1270b57cec5SDimitry Andric// Instructions with folded loads are usually micro-fused, so they only appear 1280b57cec5SDimitry Andric// as two micro-ops. 1290b57cec5SDimitry Andric// a. load and 1300b57cec5SDimitry Andric// b. addpd 1310b57cec5SDimitry Andric// This multiclass is for folded loads for integer units. 1320b57cec5SDimitry Andricmulticlass ZnWriteResPair<X86FoldableSchedWrite SchedRW, 1330b57cec5SDimitry Andric list<ProcResourceKind> ExePorts, 1340b57cec5SDimitry Andric int Lat, list<int> Res = [], int UOps = 1, 1350b57cec5SDimitry Andric int LoadLat = 4, int LoadUOps = 1> { 1360b57cec5SDimitry Andric // Register variant takes 1-cycle on Execution Port. 1370b57cec5SDimitry Andric def : WriteRes<SchedRW, ExePorts> { 1380b57cec5SDimitry Andric let Latency = Lat; 139*5f757f3fSDimitry Andric let ReleaseAtCycles = Res; 1400b57cec5SDimitry Andric let NumMicroOps = UOps; 1410b57cec5SDimitry Andric } 1420b57cec5SDimitry Andric 1430b57cec5SDimitry Andric // Memory variant also uses a cycle on ZnAGU 1440b57cec5SDimitry Andric // adds LoadLat cycles to the latency (default = 4). 1450b57cec5SDimitry Andric def : WriteRes<SchedRW.Folded, !listconcat([ZnAGU], ExePorts)> { 1460b57cec5SDimitry Andric let Latency = !add(Lat, LoadLat); 147*5f757f3fSDimitry Andric let ReleaseAtCycles = !if(!empty(Res), [], !listconcat([1], Res)); 1480b57cec5SDimitry Andric let NumMicroOps = !add(UOps, LoadUOps); 1490b57cec5SDimitry Andric } 1500b57cec5SDimitry Andric} 1510b57cec5SDimitry Andric 1520b57cec5SDimitry Andric// This multiclass is for folded loads for floating point units. 1530b57cec5SDimitry Andricmulticlass ZnWriteResFpuPair<X86FoldableSchedWrite SchedRW, 1540b57cec5SDimitry Andric list<ProcResourceKind> ExePorts, 1550b57cec5SDimitry Andric int Lat, list<int> Res = [], int UOps = 1, 1560b57cec5SDimitry Andric int LoadLat = 7, int LoadUOps = 0> { 1570b57cec5SDimitry Andric // Register variant takes 1-cycle on Execution Port. 1580b57cec5SDimitry Andric def : WriteRes<SchedRW, ExePorts> { 1590b57cec5SDimitry Andric let Latency = Lat; 160*5f757f3fSDimitry Andric let ReleaseAtCycles = Res; 1610b57cec5SDimitry Andric let NumMicroOps = UOps; 1620b57cec5SDimitry Andric } 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric // Memory variant also uses a cycle on ZnAGU 1650b57cec5SDimitry Andric // adds LoadLat cycles to the latency (default = 7). 1660b57cec5SDimitry Andric def : WriteRes<SchedRW.Folded, !listconcat([ZnAGU], ExePorts)> { 1670b57cec5SDimitry Andric let Latency = !add(Lat, LoadLat); 168*5f757f3fSDimitry Andric let ReleaseAtCycles = !if(!empty(Res), [], !listconcat([1], Res)); 1690b57cec5SDimitry Andric let NumMicroOps = !add(UOps, LoadUOps); 1700b57cec5SDimitry Andric } 1710b57cec5SDimitry Andric} 1720b57cec5SDimitry Andric 1730b57cec5SDimitry Andric// WriteRMW is set for instructions with Memory write 1740b57cec5SDimitry Andric// operation in codegen 1750b57cec5SDimitry Andricdef : WriteRes<WriteRMW, [ZnAGU]>; 1760b57cec5SDimitry Andric 1770b57cec5SDimitry Andricdef : WriteRes<WriteStore, [ZnAGU]>; 1780b57cec5SDimitry Andricdef : WriteRes<WriteStoreNT, [ZnAGU]>; 1790b57cec5SDimitry Andricdef : WriteRes<WriteMove, [ZnALU]>; 180bdd1243dSDimitry Andricdef : WriteRes<WriteLoad, [ZnAGU]> { let Latency = 4; } 1810b57cec5SDimitry Andric 182fe6060f1SDimitry Andric// Model the effect of clobbering the read-write mask operand of the GATHER operation. 183fe6060f1SDimitry Andric// Does not cost anything by itself, only has latency, matching that of the WriteLoad, 184fe6060f1SDimitry Andricdef : WriteRes<WriteVecMaskedGatherWriteback, []> { let Latency = 8; let NumMicroOps = 0; } 185fe6060f1SDimitry Andric 1860b57cec5SDimitry Andricdef : WriteRes<WriteZero, []>; 1870b57cec5SDimitry Andricdef : WriteRes<WriteLEA, [ZnALU]>; 1880b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteALU, [ZnALU], 1>; 1890b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteADC, [ZnALU], 1>; 1900b57cec5SDimitry Andric 1910b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteIMul8, [ZnALU1, ZnMultiplier], 4>; 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andricdefm : X86WriteRes<WriteBSWAP32, [ZnALU], 1, [4], 1>; 1940b57cec5SDimitry Andricdefm : X86WriteRes<WriteBSWAP64, [ZnALU], 1, [4], 1>; 1950b57cec5SDimitry Andricdefm : X86WriteRes<WriteCMPXCHG, [ZnALU], 1, [1], 1>; 1960b57cec5SDimitry Andricdefm : X86WriteRes<WriteCMPXCHGRMW,[ZnALU,ZnAGU], 8, [1,1], 5>; 1970b57cec5SDimitry Andricdefm : X86WriteRes<WriteXCHG, [ZnALU], 1, [2], 2>; 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteShift, [ZnALU], 1>; 2000b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteShiftCL, [ZnALU], 1>; 2010b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteRotate, [ZnALU], 1>; 2020b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteRotateCL, [ZnALU], 1>; 2030b57cec5SDimitry Andric 2040b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDrri, [ZnALU], 1, [1], 1>; 2050b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteSHDrrcl>; 2060b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteSHDmri>; 2070b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteSHDmrcl>; 2080b57cec5SDimitry Andric 2090b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteJump, [ZnALU], 1>; 2100b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCRC32, [ZnFPU0], 3>; 2110b57cec5SDimitry Andric 2120b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteCMOV, [ZnALU], 1>; 2130b57cec5SDimitry Andricdef : WriteRes<WriteSETCC, [ZnALU]>; 2140b57cec5SDimitry Andricdef : WriteRes<WriteSETCCStore, [ZnALU, ZnAGU]>; 2150b57cec5SDimitry Andricdefm : X86WriteRes<WriteLAHFSAHF, [ZnALU], 2, [1], 2>; 2160b57cec5SDimitry Andric 2170b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTest, [ZnALU], 1, [1], 1>; 2180b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestImmLd, [ZnALU,ZnAGU], 5, [1,1], 2>; 2190b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestRegLd, [ZnALU,ZnAGU], 5, [1,1], 2>; 2200b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestSet, [ZnALU], 2, [1], 2>; 2210b57cec5SDimitry Andric 2220b57cec5SDimitry Andric// Bit counts. 22381ad6265SDimitry Andricdefm : ZnWriteResPair<WriteBSF, [ZnALU], 3, [12], 6, 4, 2>; 22481ad6265SDimitry Andricdefm : ZnWriteResPair<WriteBSR, [ZnALU], 4, [16], 6, 4, 2>; 2250b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteLZCNT, [ZnALU], 2>; 226bdd1243dSDimitry Andricdefm : ZnWriteResPair<WriteTZCNT, [ZnALU], 2, [2], 2, 4, 0>; 2270b57cec5SDimitry Andricdefm : ZnWriteResPair<WritePOPCNT, [ZnALU], 1>; 2280b57cec5SDimitry Andric 2290b57cec5SDimitry Andric// Treat misc copies as a move. 2300b57cec5SDimitry Andricdef : InstRW<[WriteMove], (instrs COPY)>; 2310b57cec5SDimitry Andric 23281ad6265SDimitry Andric// BMI1 BEXTR, BMI2 BZHI 233bdd1243dSDimitry Andricdefm : ZnWriteResPair<WriteBEXTR, [ZnALU], 1, [1], 1, 4, 1>; 234bdd1243dSDimitry Andricdefm : ZnWriteResPair<WriteBLS, [ZnALU], 2, [2], 2, 4, 1>; 2350b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteBZHI, [ZnALU], 1>; 2360b57cec5SDimitry Andric 2370b57cec5SDimitry Andric// IDIV 2380b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteDiv8, [ZnALU2, ZnDivider], 15, [1,15], 1>; 2390b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteDiv16, [ZnALU2, ZnDivider], 17, [1,17], 2>; 2400b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteDiv32, [ZnALU2, ZnDivider], 25, [1,25], 2>; 2410b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteDiv64, [ZnALU2, ZnDivider], 41, [1,41], 2>; 2420b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteIDiv8, [ZnALU2, ZnDivider], 15, [1,15], 1>; 2430b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteIDiv16, [ZnALU2, ZnDivider], 17, [1,17], 2>; 2440b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteIDiv32, [ZnALU2, ZnDivider], 25, [1,25], 2>; 2450b57cec5SDimitry Andricdefm : ZnWriteResPair<WriteIDiv64, [ZnALU2, ZnDivider], 41, [1,41], 2>; 2460b57cec5SDimitry Andric 2470b57cec5SDimitry Andric// IMULH 248349cc55cSDimitry Andricdef ZnWriteIMulH : WriteRes<WriteIMulH, [ZnMultiplier]>{ 249349cc55cSDimitry Andric let Latency = 3; 250349cc55cSDimitry Andric let NumMicroOps = 0; 251349cc55cSDimitry Andric} 252349cc55cSDimitry Andricdef : WriteRes<WriteIMulHLd, [ZnMultiplier]> { 253349cc55cSDimitry Andric let Latency = !add(ZnWriteIMulH.Latency, Znver1Model.LoadLatency); 254349cc55cSDimitry Andric let NumMicroOps = ZnWriteIMulH.NumMicroOps; 2550b57cec5SDimitry Andric} 2560b57cec5SDimitry Andric 2570b57cec5SDimitry Andric// Floating point operations 2580b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLoad, [ZnAGU], 8, [1], 1>; 2590b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLoadX, [ZnAGU], 8, [1], 1>; 2600b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLoadY, [ZnAGU], 8, [1], 1>; 2610b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMaskedLoad, [ZnAGU,ZnFPU01], 8, [1,1], 1>; 2620b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMaskedLoadY, [ZnAGU,ZnFPU01], 8, [1,2], 2>; 26381ad6265SDimitry Andric 2640b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStore, [ZnAGU], 1, [1], 1>; 2650b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreX, [ZnAGU], 1, [1], 1>; 2660b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreY, [ZnAGU], 1, [1], 1>; 2670b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreNT, [ZnAGU,ZnFPU2], 8, [1,1], 1>; 2680b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreNTX, [ZnAGU], 1, [1], 1>; 2690b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreNTY, [ZnAGU], 1, [1], 1>; 2708bcb0991SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore32, [ZnAGU,ZnFPU01], 4, [1,1], 1>; 2718bcb0991SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore32Y, [ZnAGU,ZnFPU01], 5, [1,2], 2>; 2728bcb0991SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore64, [ZnAGU,ZnFPU01], 4, [1,1], 1>; 2738bcb0991SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore64Y, [ZnAGU,ZnFPU01], 5, [1,2], 2>; 2748bcb0991SDimitry Andric 2750b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMove, [ZnFPU], 1, [1], 1>; 2760b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMoveX, [ZnFPU], 1, [1], 1>; 2770b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMoveY, [ZnFPU], 1, [1], 1>; 27804eeddc0SDimitry Andricdefm : X86WriteResUnsupported<WriteFMoveZ>; 2790b57cec5SDimitry Andric 28081ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFAdd, [ZnFPU23], 3>; 28181ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFAddX, [ZnFPU23], 3>; 28281ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFAddY, [ZnFPU23], 3, [2], 2>; 2830b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFAddZ>; 28481ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFAdd64, [ZnFPU23], 3>; 28581ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFAdd64X, [ZnFPU23], 3>; 28681ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFAdd64Y, [ZnFPU23], 3, [2], 2>; 2870b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFAdd64Z>; 28881ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFCmp, [ZnFPU01], 1>; 28981ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFCmpX, [ZnFPU01], 1>; 29081ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFCmpY, [ZnFPU01], 1, [2], 2>; 2910b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFCmpZ>; 29281ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFCmp64, [ZnFPU01], 1>; 29381ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFCmp64X, [ZnFPU01], 1>; 29481ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFCmp64Y, [ZnFPU01], 1, [2], 2>; 2950b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFCmp64Z>; 29681ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFCom, [ZnFPU01,ZnFPU2], 3, [1,1], 2>; 29781ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFComX, [ZnFPU01,ZnFPU2], 3, [1,1], 2>; 2980b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFBlend, [ZnFPU01], 1>; 2990b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFBlendY, [ZnFPU01], 1>; 3000b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFBlendZ>; 3010b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFVarBlend, [ZnFPU01], 1>; 302bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFVarBlendY,[ZnFPU01], 1, [2], 2>; 3030b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarBlendZ>; 3040b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtSS2I, [ZnFPU3], 5>; 3050b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtPS2I, [ZnFPU3], 5>; 3060b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtPS2IY, [ZnFPU3], 5>; 3070b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPS2IZ>; 3080b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtSD2I, [ZnFPU3], 5>; 3090b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtPD2I, [ZnFPU3], 5>; 3100b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtPD2IY, [ZnFPU3], 5>; 3110b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPD2IZ>; 3120b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtI2SS, [ZnFPU3], 5>; 3130b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtI2PS, [ZnFPU3], 5>; 3140b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtI2PSY, [ZnFPU3], 5>; 3150b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtI2PSZ>; 3160b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtI2SD, [ZnFPU3], 5>; 3170b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtI2PD, [ZnFPU3], 5>; 3180b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteCvtI2PDY, [ZnFPU3], 5>; 3190b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtI2PDZ>; 320bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFDiv, [ZnFPU3], 10, [3]>; 321bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFDivX, [ZnFPU3], 10, [3]>; 322bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFDivY, [ZnFPU3], 10, [6], 2>; 3230b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFDivZ>; 324bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFDiv64, [ZnFPU3], 13, [5]>; 325bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFDiv64X, [ZnFPU3], 13, [5]>; 326bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFDiv64Y, [ZnFPU3], 15, [9], 2>; 3270b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFDiv64Z>; 3280b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFSign, [ZnFPU3], 2>; 3290b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFRnd, [ZnFPU3], 4, [1], 1, 7, 1>; // FIXME: Should folds require 1 extra uops? 3300b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFRndY, [ZnFPU3], 4, [1], 1, 7, 1>; // FIXME: Should folds require 1 extra uops? 3310b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRndZ>; 3320b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFLogic, [ZnFPU], 1>; 333bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFLogicY, [ZnFPU], 1, [2], 2>; 3340b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFLogicZ>; 33581ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFTest, [ZnFPU12], 2, [2], 1, 7, 1>; 33681ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFTestY, [ZnFPU12], 4, [4], 3, 7, 2>; 3370b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFTestZ>; 3380b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFShuffle, [ZnFPU12], 1>; 339bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFShuffleY, [ZnFPU12], 1, [2], 2>; 3400b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFShuffleZ>; 3410b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFVarShuffle, [ZnFPU12], 1>; 342bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFVarShuffleY,[ZnFPU12], 1, [2], 2>; 3430b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarShuffleZ>; 344bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFMul, [ZnFPU01], 3>; 345bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFMulX, [ZnFPU01], 3>; 346bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFMulY, [ZnFPU01], 3, [2], 2>; 3470b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMulZ>; 348bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFMul64, [ZnFPU01], 4>; 349bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFMul64X, [ZnFPU01], 4>; 350bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFMul64Y, [ZnFPU01], 4, [2], 2>; 3510b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMul64Z>; 352bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFMA, [ZnFPU01], 5>; 353bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFMAX, [ZnFPU01], 5>; 354bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFMAY, [ZnFPU01], 5, [2], 2>; 3550b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMAZ>; 3560b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFRcp, [ZnFPU01], 5>; 3570b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFRcpX, [ZnFPU01], 5>; 358bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFRcpY, [ZnFPU01], 5, [2], 2>; 3590b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRcpZ>; 360bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFRsqrt, [ZnFPU01], 5>; 361bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFRsqrtX, [ZnFPU01], 5>; 362bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFRsqrtY, [ZnFPU01], 5, [2], 2>; 3630b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRsqrtZ>; 364bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFSqrt, [ZnFPU3], 14, [5]>; 365bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFSqrtX, [ZnFPU3], 14, [5]>; 366bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFSqrtY, [ZnFPU3], 14, [10], 2>; 3670b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFSqrtZ>; 368bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFSqrt64, [ZnFPU3], 20, [8]>; 369bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFSqrt64X, [ZnFPU3], 20, [8]>; 370bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFSqrt64Y, [ZnFPU3], 20, [16], 2>; 3710b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFSqrt64Z>; 3720b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteFSqrt80, [ZnFPU3], 20, [20]>; 373bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFShuffle256, [ZnFPU12], 2, [2], 2>; 374bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteFVarShuffle256, [ZnFPU12], 2, [2], 2>; 3750b57cec5SDimitry Andric 3760b57cec5SDimitry Andric// Vector integer operations which uses FPU units 3770b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoad, [ZnAGU], 8, [1], 1>; 3780b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadX, [ZnAGU], 8, [1], 1>; 3790b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadY, [ZnAGU], 8, [1], 1>; 3800b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadNT, [ZnAGU], 8, [1], 1>; 3810b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadNTY, [ZnAGU], 8, [1], 1>; 3820b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMaskedLoad, [ZnAGU,ZnFPU01], 8, [1,2], 2>; 3830b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMaskedLoadY, [ZnAGU,ZnFPU01], 9, [1,3], 2>; 3840b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStore, [ZnAGU], 1, [1], 1>; 3850b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreX, [ZnAGU], 1, [1], 1>; 3860b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreY, [ZnAGU], 1, [1], 1>; 3870b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreNT, [ZnAGU], 1, [1], 1>; 3880b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreNTY, [ZnAGU], 1, [1], 1>; 3895ffd83dbSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore32, [ZnAGU,ZnFPU01], 4, [1,1], 1>; 3905ffd83dbSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore32Y, [ZnAGU,ZnFPU01], 5, [1,2], 2>; 3915ffd83dbSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore64, [ZnAGU,ZnFPU01], 4, [1,1], 1>; 3925ffd83dbSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore64Y, [ZnAGU,ZnFPU01], 5, [1,2], 2>; 3930b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMove, [ZnFPU], 1, [1], 1>; 3940b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveX, [ZnFPU], 1, [1], 1>; 3950b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveY, [ZnFPU], 2, [1], 2>; 39604eeddc0SDimitry Andricdefm : X86WriteResUnsupported<WriteVecMoveZ>; 3970b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveToGpr, [ZnFPU2], 2, [1], 1>; 3980b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveFromGpr, [ZnFPU2], 3, [1], 1>; 3990b57cec5SDimitry Andricdefm : X86WriteRes<WriteEMMS, [ZnFPU], 2, [1], 1>; 4000b57cec5SDimitry Andric 40181ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecShift, [ZnFPU2], 1>; 4020b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecShiftX, [ZnFPU2], 1>; 40381ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecShiftY, [ZnFPU2], 1, [2], 2>; 4040b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecShiftZ>; 40581ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecShiftImm, [ZnFPU2], 1>; 40681ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecShiftImmX, [ZnFPU2], 1>; 40781ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecShiftImmY, [ZnFPU2], 1, [2], 2>; 4080b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecShiftImmZ>; 40981ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteVarVecShift, [ZnFPU1], 3, [2], 1>; 41081ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteVarVecShiftY, [ZnFPU1], 3, [4], 2>; 41181ad6265SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarVecShiftZ>; 4120b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecLogic, [ZnFPU], 1>; 4130b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecLogicX, [ZnFPU], 1>; 414bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVecLogicY, [ZnFPU], 1, [2], 2>; 4150b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecLogicZ>; 41681ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecTest, [ZnFPU12], 2, [2], 1, 7, 1>; 41781ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecTestY, [ZnFPU12], 4, [4], 3, 7, 2>; 4180b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecTestZ>; 419bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVecALU, [ZnFPU013], 1>; 420bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVecALUX, [ZnFPU013], 1>; 421bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVecALUY, [ZnFPU013], 1, [2], 2>; 4220b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecALUZ>; 4230b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecIMul, [ZnFPU0], 4>; 4240b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecIMulX, [ZnFPU0], 4>; 425bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVecIMulY, [ZnFPU0], 4, [2], 2>; 4260b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecIMulZ>; 427bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WritePMULLD, [ZnFPU0], 4, [2]>; 428bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WritePMULLDY, [ZnFPU0], 4, [4], 2>; 4290b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePMULLDZ>; 430bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteShuffle, [ZnFPU12], 1>; 431bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteShuffleX, [ZnFPU12], 1>; 432bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteShuffleY, [ZnFPU12], 1, [2], 2>; 4330b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteShuffleZ>; 434bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVarShuffle, [ZnFPU12], 1>; 435bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVarShuffleX,[ZnFPU12], 1>; 436bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVarShuffleY,[ZnFPU12], 1, [2], 2>; 4370b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarShuffleZ>; 438bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteBlend, [ZnFPU013], 1>; 439bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteBlendY, [ZnFPU013], 1, [2], 2>; 4400b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteBlendZ>; 441bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVarBlend, [ZnFPU0], 1>; 442bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVarBlendY, [ZnFPU0], 1, [2], 2>; 443bdd1243dSDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarBlendZ>; 444bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteShuffle256, [ZnFPU12], 2, [2], 2>; 44581ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteVPMOV256, [ZnFPU12], 1, [4], 3>; 446bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WriteVarShuffle256, [ZnFPU12],2, [2], 2>; 4470b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WritePSADBW, [ZnFPU0], 3>; 4480b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WritePSADBWX, [ZnFPU0], 3>; 449bdd1243dSDimitry Andricdefm : ZnWriteResFpuPair<WritePSADBWY, [ZnFPU0], 3, [2], 2>; 4500b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePSADBWZ>; 4510b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WritePHMINPOS, [ZnFPU0], 4>; 4520b57cec5SDimitry Andric 4530b57cec5SDimitry Andric// Vector insert/extract operations. 4540b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteVecInsert, [ZnFPU], 1>; 4550b57cec5SDimitry Andric 4560b57cec5SDimitry Andricdef : WriteRes<WriteVecExtract, [ZnFPU12, ZnFPU2]> { 4570b57cec5SDimitry Andric let Latency = 2; 458*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 4590b57cec5SDimitry Andric} 4600b57cec5SDimitry Andricdef : WriteRes<WriteVecExtractSt, [ZnAGU, ZnFPU12, ZnFPU2]> { 4610b57cec5SDimitry Andric let Latency = 5; 4620b57cec5SDimitry Andric let NumMicroOps = 2; 463*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2, 3]; 4640b57cec5SDimitry Andric} 4650b57cec5SDimitry Andric 4660b57cec5SDimitry Andric// MOVMSK Instructions. 4670b57cec5SDimitry Andricdef : WriteRes<WriteFMOVMSK, [ZnFPU2]>; 4680b57cec5SDimitry Andricdef : WriteRes<WriteMMXMOVMSK, [ZnFPU2]>; 4690b57cec5SDimitry Andricdef : WriteRes<WriteVecMOVMSK, [ZnFPU2]>; 4700b57cec5SDimitry Andric 4710b57cec5SDimitry Andricdef : WriteRes<WriteVecMOVMSKY, [ZnFPU2]> { 4720b57cec5SDimitry Andric let NumMicroOps = 2; 4730b57cec5SDimitry Andric let Latency = 2; 474*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 4750b57cec5SDimitry Andric} 4760b57cec5SDimitry Andric 4770b57cec5SDimitry Andric// AES Instructions. 4780b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteAESDecEnc, [ZnFPU01], 4>; 4790b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteAESIMC, [ZnFPU01], 4>; 4800b57cec5SDimitry Andricdefm : ZnWriteResFpuPair<WriteAESKeyGen, [ZnFPU01], 4>; 4810b57cec5SDimitry Andric 4820b57cec5SDimitry Andricdef : WriteRes<WriteFence, [ZnAGU]>; 4830b57cec5SDimitry Andricdef : WriteRes<WriteNop, []>; 4840b57cec5SDimitry Andric 4850b57cec5SDimitry Andric// Microcoded Instructions 4860b57cec5SDimitry Andricdef ZnWriteMicrocoded : SchedWriteRes<[]> { 4870b57cec5SDimitry Andric let Latency = 100; 4880b57cec5SDimitry Andric} 4890b57cec5SDimitry Andric 4900b57cec5SDimitry Andricdef : SchedAlias<WriteMicrocoded, ZnWriteMicrocoded>; 4910b57cec5SDimitry Andricdef : SchedAlias<WriteFCMOV, ZnWriteMicrocoded>; 4920b57cec5SDimitry Andricdef : SchedAlias<WriteSystem, ZnWriteMicrocoded>; 4930b57cec5SDimitry Andricdef : SchedAlias<WriteMPSAD, ZnWriteMicrocoded>; 4940b57cec5SDimitry Andricdef : SchedAlias<WriteMPSADY, ZnWriteMicrocoded>; 4950b57cec5SDimitry Andricdef : SchedAlias<WriteMPSADLd, ZnWriteMicrocoded>; 4960b57cec5SDimitry Andricdef : SchedAlias<WriteMPSADYLd, ZnWriteMicrocoded>; 4970b57cec5SDimitry Andricdef : SchedAlias<WriteCLMul, ZnWriteMicrocoded>; 4980b57cec5SDimitry Andricdef : SchedAlias<WriteCLMulLd, ZnWriteMicrocoded>; 4990b57cec5SDimitry Andricdef : SchedAlias<WritePCmpIStrM, ZnWriteMicrocoded>; 5000b57cec5SDimitry Andricdef : SchedAlias<WritePCmpIStrMLd, ZnWriteMicrocoded>; 5010b57cec5SDimitry Andricdef : SchedAlias<WritePCmpEStrI, ZnWriteMicrocoded>; 5020b57cec5SDimitry Andricdef : SchedAlias<WritePCmpEStrILd, ZnWriteMicrocoded>; 5030b57cec5SDimitry Andricdef : SchedAlias<WritePCmpEStrM, ZnWriteMicrocoded>; 5040b57cec5SDimitry Andricdef : SchedAlias<WritePCmpEStrMLd, ZnWriteMicrocoded>; 5050b57cec5SDimitry Andricdef : SchedAlias<WritePCmpIStrI, ZnWriteMicrocoded>; 5060b57cec5SDimitry Andricdef : SchedAlias<WritePCmpIStrILd, ZnWriteMicrocoded>; 5070b57cec5SDimitry Andricdef : SchedAlias<WriteLDMXCSR, ZnWriteMicrocoded>; 5080b57cec5SDimitry Andricdef : SchedAlias<WriteSTMXCSR, ZnWriteMicrocoded>; 5090b57cec5SDimitry Andric 5100b57cec5SDimitry Andric//=== Regex based InstRW ===// 5110b57cec5SDimitry Andric// Notation: 5120b57cec5SDimitry Andric// - r: register. 5130b57cec5SDimitry Andric// - m = memory. 5140b57cec5SDimitry Andric// - i = immediate 5150b57cec5SDimitry Andric// - mm: 64 bit mmx register. 5160b57cec5SDimitry Andric// - x = 128 bit xmm register. 5170b57cec5SDimitry Andric// - (x)mm = mmx or xmm register. 5180b57cec5SDimitry Andric// - y = 256 bit ymm register. 5190b57cec5SDimitry Andric// - v = any vector register. 5200b57cec5SDimitry Andric 5210b57cec5SDimitry Andric//=== Integer Instructions ===// 5220b57cec5SDimitry Andric//-- Move instructions --// 5230b57cec5SDimitry Andric// MOV. 5240b57cec5SDimitry Andric// r16,m. 5250b57cec5SDimitry Andricdef : InstRW<[WriteALULd, ReadAfterLd], (instrs MOV16rm)>; 5260b57cec5SDimitry Andric 5270b57cec5SDimitry Andric// XCHG. 5280b57cec5SDimitry Andric// r,m. 5290b57cec5SDimitry Andricdef ZnWriteXCHGrm : SchedWriteRes<[ZnAGU, ZnALU]> { 5300b57cec5SDimitry Andric let Latency = 5; 5310b57cec5SDimitry Andric let NumMicroOps = 2; 5320b57cec5SDimitry Andric} 5330b57cec5SDimitry Andricdef : InstRW<[ZnWriteXCHGrm, ReadAfterLd], (instregex "XCHG(8|16|32|64)rm")>; 5340b57cec5SDimitry Andric 5350b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs XLAT)>; 5360b57cec5SDimitry Andric 5370b57cec5SDimitry Andric// POP16. 5380b57cec5SDimitry Andric// r. 5390b57cec5SDimitry Andricdef ZnWritePop16r : SchedWriteRes<[ZnAGU]>{ 5400b57cec5SDimitry Andric let Latency = 5; 5410b57cec5SDimitry Andric let NumMicroOps = 2; 5420b57cec5SDimitry Andric} 5430b57cec5SDimitry Andricdef : InstRW<[ZnWritePop16r], (instrs POP16rmm)>; 5440b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "POPF(16|32)")>; 5450b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "POPA(16|32)")>; 5460b57cec5SDimitry Andric 5470b57cec5SDimitry Andric 5480b57cec5SDimitry Andric// PUSH. 5490b57cec5SDimitry Andric// r. Has default values. 5500b57cec5SDimitry Andric// m. 5510b57cec5SDimitry Andricdef ZnWritePUSH : SchedWriteRes<[ZnAGU]>{ 5520b57cec5SDimitry Andric let Latency = 4; 5530b57cec5SDimitry Andric} 5540b57cec5SDimitry Andricdef : InstRW<[ZnWritePUSH], (instregex "PUSH(16|32)rmm")>; 5550b57cec5SDimitry Andric 5560b57cec5SDimitry Andric// PUSHF 5570b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "PUSHF(16|32)")>; 5580b57cec5SDimitry Andric 5590b57cec5SDimitry Andric// PUSHA. 5600b57cec5SDimitry Andricdef ZnWritePushA : SchedWriteRes<[ZnAGU]> { 5610b57cec5SDimitry Andric let Latency = 8; 5620b57cec5SDimitry Andric} 5630b57cec5SDimitry Andricdef : InstRW<[ZnWritePushA], (instregex "PUSHA(16|32)")>; 5640b57cec5SDimitry Andric 5650b57cec5SDimitry Andric//LAHF 5660b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs LAHF)>; 5670b57cec5SDimitry Andric 5680b57cec5SDimitry Andric// MOVBE. 5690b57cec5SDimitry Andric// r,m. 5700b57cec5SDimitry Andricdef ZnWriteMOVBE : SchedWriteRes<[ZnAGU, ZnALU]> { 5710b57cec5SDimitry Andric let Latency = 5; 5720b57cec5SDimitry Andric} 5730b57cec5SDimitry Andricdef : InstRW<[ZnWriteMOVBE, ReadAfterLd], (instregex "MOVBE(16|32|64)rm")>; 5740b57cec5SDimitry Andric 5750b57cec5SDimitry Andric// m16,r16. 5760b57cec5SDimitry Andricdef : InstRW<[ZnWriteMOVBE], (instregex "MOVBE(16|32|64)mr")>; 5770b57cec5SDimitry Andric 5780b57cec5SDimitry Andric//-- Arithmetic instructions --// 5790b57cec5SDimitry Andric 5800b57cec5SDimitry Andric// ADD SUB. 5810b57cec5SDimitry Andric// m,r/i. 5820b57cec5SDimitry Andricdef : InstRW<[WriteALULd], (instregex "(ADD|SUB)(8|16|32|64)m(r|i)", 5830b57cec5SDimitry Andric "(ADD|SUB)(8|16|32|64)mi8", 5840b57cec5SDimitry Andric "(ADD|SUB)64mi32")>; 5850b57cec5SDimitry Andric 5860b57cec5SDimitry Andric// ADC SBB. 5870b57cec5SDimitry Andric// m,r/i. 5880b57cec5SDimitry Andricdef : InstRW<[WriteALULd], 5890b57cec5SDimitry Andric (instregex "(ADC|SBB)(8|16|32|64)m(r|i)", 5900b57cec5SDimitry Andric "(ADC|SBB)(16|32|64)mi8", 5910b57cec5SDimitry Andric "(ADC|SBB)64mi32")>; 5920b57cec5SDimitry Andric 5930b57cec5SDimitry Andric// INC DEC NOT NEG. 5940b57cec5SDimitry Andric// m. 5950b57cec5SDimitry Andricdef : InstRW<[WriteALULd], 5960b57cec5SDimitry Andric (instregex "(INC|DEC|NOT|NEG)(8|16|32|64)m")>; 5970b57cec5SDimitry Andric 5980b57cec5SDimitry Andric// MUL IMUL. 5990b57cec5SDimitry Andric// r16. 6000b57cec5SDimitry Andricdef ZnWriteMul16 : SchedWriteRes<[ZnALU1, ZnMultiplier]> { 6010b57cec5SDimitry Andric let Latency = 3; 6020b57cec5SDimitry Andric} 6030b57cec5SDimitry Andricdef : SchedAlias<WriteIMul16, ZnWriteMul16>; 6040b57cec5SDimitry Andricdef : SchedAlias<WriteIMul16Imm, ZnWriteMul16>; // TODO: is this right? 6050b57cec5SDimitry Andricdef : SchedAlias<WriteIMul16Reg, ZnWriteMul16>; // TODO: is this right? 6060b57cec5SDimitry Andric 6070b57cec5SDimitry Andric// m16. 6080b57cec5SDimitry Andricdef ZnWriteMul16Ld : SchedWriteRes<[ZnAGU, ZnALU1, ZnMultiplier]> { 6090b57cec5SDimitry Andric let Latency = 8; 6100b57cec5SDimitry Andric} 6110b57cec5SDimitry Andricdef : SchedAlias<WriteIMul16Ld, ZnWriteMul16Ld>; 61281ad6265SDimitry Andricdef : SchedAlias<WriteIMul16ImmLd, ZnWriteMul16>; // TODO: this is definitely wrong but matches what the instregex did. 61381ad6265SDimitry Andricdef : SchedAlias<WriteIMul16RegLd, ZnWriteMul16>; // TODO: this is definitely wrong but matches what the instregex did. 6140b57cec5SDimitry Andric// r32. 6150b57cec5SDimitry Andricdef ZnWriteMul32 : SchedWriteRes<[ZnALU1, ZnMultiplier]> { 6160b57cec5SDimitry Andric let Latency = 3; 6170b57cec5SDimitry Andric} 6180b57cec5SDimitry Andricdef : SchedAlias<WriteIMul32, ZnWriteMul32>; 6190b57cec5SDimitry Andricdef : SchedAlias<WriteIMul32Imm, ZnWriteMul32>; // TODO: is this right? 6200b57cec5SDimitry Andricdef : SchedAlias<WriteIMul32Reg, ZnWriteMul32>; // TODO: is this right? 6210b57cec5SDimitry Andric 6220b57cec5SDimitry Andric// m32. 6230b57cec5SDimitry Andricdef ZnWriteMul32Ld : SchedWriteRes<[ZnAGU, ZnALU1, ZnMultiplier]> { 6240b57cec5SDimitry Andric let Latency = 8; 6250b57cec5SDimitry Andric} 6260b57cec5SDimitry Andricdef : SchedAlias<WriteIMul32Ld, ZnWriteMul32Ld>; 62781ad6265SDimitry Andricdef : SchedAlias<WriteIMul32ImmLd, ZnWriteMul32>; // TODO: this is definitely wrong but matches what the instregex did. 62881ad6265SDimitry Andricdef : SchedAlias<WriteIMul32RegLd, ZnWriteMul32>; // TODO: this is definitely wrong but matches what the instregex did. 6290b57cec5SDimitry Andric 6300b57cec5SDimitry Andric// r64. 6310b57cec5SDimitry Andricdef ZnWriteMul64 : SchedWriteRes<[ZnALU1, ZnMultiplier]> { 6320b57cec5SDimitry Andric let Latency = 4; 6330b57cec5SDimitry Andric let NumMicroOps = 2; 6340b57cec5SDimitry Andric} 6350b57cec5SDimitry Andricdef : SchedAlias<WriteIMul64, ZnWriteMul64>; 6360b57cec5SDimitry Andricdef : SchedAlias<WriteIMul64Imm, ZnWriteMul64>; // TODO: is this right? 6370b57cec5SDimitry Andricdef : SchedAlias<WriteIMul64Reg, ZnWriteMul64>; // TODO: is this right? 6380b57cec5SDimitry Andric 6390b57cec5SDimitry Andric// m64. 6400b57cec5SDimitry Andricdef ZnWriteMul64Ld : SchedWriteRes<[ZnAGU, ZnALU1, ZnMultiplier]> { 6410b57cec5SDimitry Andric let Latency = 9; 6420b57cec5SDimitry Andric let NumMicroOps = 2; 6430b57cec5SDimitry Andric} 6440b57cec5SDimitry Andricdef : SchedAlias<WriteIMul64Ld, ZnWriteMul64Ld>; 64581ad6265SDimitry Andricdef : SchedAlias<WriteIMul64ImmLd, ZnWriteMul64>; // TODO: this is definitely wrong but matches what the instregex did. 64681ad6265SDimitry Andricdef : SchedAlias<WriteIMul64RegLd, ZnWriteMul64>; // TODO: this is definitely wrong but matches what the instregex did. 6470b57cec5SDimitry Andric 648349cc55cSDimitry Andric// MULX 649349cc55cSDimitry Andric// Numbers are based on the AMD SOG for Family 17h - Instruction Latencies. 650349cc55cSDimitry Andricdefm : ZnWriteResPair<WriteMULX32, [ZnALU1, ZnMultiplier], 3, [1, 1], 1, 5, 0>; 651349cc55cSDimitry Andricdefm : ZnWriteResPair<WriteMULX64, [ZnALU1, ZnMultiplier], 3, [1, 1], 1, 5, 0>; 6520b57cec5SDimitry Andric 6530b57cec5SDimitry Andric//-- Control transfer instructions --// 6540b57cec5SDimitry Andric 6550b57cec5SDimitry Andric// J(E|R)CXZ. 6560b57cec5SDimitry Andricdef ZnWriteJCXZ : SchedWriteRes<[ZnALU03]>; 6570b57cec5SDimitry Andricdef : InstRW<[ZnWriteJCXZ], (instrs JCXZ, JECXZ, JRCXZ)>; 6580b57cec5SDimitry Andric 6590b57cec5SDimitry Andric// LOOP. 6600b57cec5SDimitry Andricdef ZnWriteLOOP : SchedWriteRes<[ZnALU03]>; 6610b57cec5SDimitry Andricdef : InstRW<[ZnWriteLOOP], (instrs LOOP)>; 6620b57cec5SDimitry Andric 6630b57cec5SDimitry Andric// LOOP(N)E, LOOP(N)Z 6640b57cec5SDimitry Andricdef ZnWriteLOOPE : SchedWriteRes<[ZnALU03]>; 6650b57cec5SDimitry Andricdef : InstRW<[ZnWriteLOOPE], (instrs LOOPE, LOOPNE)>; 6660b57cec5SDimitry Andric 6670b57cec5SDimitry Andric// CALL. 6680b57cec5SDimitry Andric// r. 6690b57cec5SDimitry Andricdef ZnWriteCALLr : SchedWriteRes<[ZnAGU, ZnALU03]>; 6700b57cec5SDimitry Andricdef : InstRW<[ZnWriteCALLr], (instregex "CALL(16|32)r")>; 6710b57cec5SDimitry Andric 6720b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "CALL(16|32)m")>; 6730b57cec5SDimitry Andric 6740b57cec5SDimitry Andric// RET. 6750b57cec5SDimitry Andricdef ZnWriteRET : SchedWriteRes<[ZnALU03]> { 6760b57cec5SDimitry Andric let NumMicroOps = 2; 6770b57cec5SDimitry Andric} 678349cc55cSDimitry Andricdef : InstRW<[ZnWriteRET], (instregex "RET(16|32|64)", "LRET(16|32|64)", 6790b57cec5SDimitry Andric "IRET(16|32|64)")>; 6800b57cec5SDimitry Andric 6810b57cec5SDimitry Andric//-- Logic instructions --// 6820b57cec5SDimitry Andric 6830b57cec5SDimitry Andric// AND OR XOR. 6840b57cec5SDimitry Andric// m,r/i. 6850b57cec5SDimitry Andricdef : InstRW<[WriteALULd], 6860b57cec5SDimitry Andric (instregex "(AND|OR|XOR)(8|16|32|64)m(r|i)", 6870b57cec5SDimitry Andric "(AND|OR|XOR)(8|16|32|64)mi8", "(AND|OR|XOR)64mi32")>; 6880b57cec5SDimitry Andric 6890b57cec5SDimitry Andric// Define ALU latency variants 6900b57cec5SDimitry Andricdef ZnWriteALULat2 : SchedWriteRes<[ZnALU]> { 6910b57cec5SDimitry Andric let Latency = 2; 6920b57cec5SDimitry Andric} 6930b57cec5SDimitry Andricdef ZnWriteALULat2Ld : SchedWriteRes<[ZnAGU, ZnALU]> { 6940b57cec5SDimitry Andric let Latency = 6; 6950b57cec5SDimitry Andric} 6960b57cec5SDimitry Andric 6970b57cec5SDimitry Andric// BTR BTS BTC. 6980b57cec5SDimitry Andric// m,r,i. 6990b57cec5SDimitry Andricdef ZnWriteBTRSCm : SchedWriteRes<[ZnAGU, ZnALU]> { 7000b57cec5SDimitry Andric let Latency = 6; 7010b57cec5SDimitry Andric let NumMicroOps = 2; 7020b57cec5SDimitry Andric} 7030b57cec5SDimitry Andric// m,r,i. 7040b57cec5SDimitry Andricdef : SchedAlias<WriteBitTestSetImmRMW, ZnWriteBTRSCm>; 7050b57cec5SDimitry Andricdef : SchedAlias<WriteBitTestSetRegRMW, ZnWriteBTRSCm>; 7060b57cec5SDimitry Andric 7070b57cec5SDimitry Andric// PDEP PEXT. 7080b57cec5SDimitry Andric// r,r,r. 7090b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "PDEP(32|64)rr", "PEXT(32|64)rr")>; 7100b57cec5SDimitry Andric// r,r,m. 7110b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "PDEP(32|64)rm", "PEXT(32|64)rm")>; 7120b57cec5SDimitry Andric 7130b57cec5SDimitry Andric// RCR RCL. 7140b57cec5SDimitry Andric// m,i. 7150b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "RC(R|L)(8|16|32|64)m(1|i|CL)")>; 7160b57cec5SDimitry Andric 7170b57cec5SDimitry Andric// SHR SHL SAR. 7180b57cec5SDimitry Andric// m,i. 7190b57cec5SDimitry Andricdef : InstRW<[WriteShiftLd], (instregex "S(A|H)(R|L)(8|16|32|64)m(i|1)")>; 7200b57cec5SDimitry Andric 7210b57cec5SDimitry Andric// SHRD SHLD. 7220b57cec5SDimitry Andric// m,r 7230b57cec5SDimitry Andricdef : InstRW<[WriteShiftLd], (instregex "SH(R|L)D(16|32|64)mri8")>; 7240b57cec5SDimitry Andric 7250b57cec5SDimitry Andric// r,r,cl. 7260b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "SH(R|L)D(16|32|64)rrCL")>; 7270b57cec5SDimitry Andric 7280b57cec5SDimitry Andric// m,r,cl. 7290b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "SH(R|L)D(16|32|64)mrCL")>; 7300b57cec5SDimitry Andric 7310b57cec5SDimitry Andric//-- Misc instructions --// 7320b57cec5SDimitry Andric// CMPXCHG8B. 7330b57cec5SDimitry Andricdef ZnWriteCMPXCHG8B : SchedWriteRes<[ZnAGU, ZnALU]> { 7340b57cec5SDimitry Andric let NumMicroOps = 18; 7350b57cec5SDimitry Andric} 7360b57cec5SDimitry Andricdef : InstRW<[ZnWriteCMPXCHG8B], (instrs CMPXCHG8B)>; 7370b57cec5SDimitry Andric 7380b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs CMPXCHG16B)>; 7390b57cec5SDimitry Andric 7400b57cec5SDimitry Andric// LEAVE 7410b57cec5SDimitry Andricdef ZnWriteLEAVE : SchedWriteRes<[ZnALU, ZnAGU]> { 7420b57cec5SDimitry Andric let Latency = 8; 7430b57cec5SDimitry Andric let NumMicroOps = 2; 7440b57cec5SDimitry Andric} 7450b57cec5SDimitry Andricdef : InstRW<[ZnWriteLEAVE], (instregex "LEAVE")>; 7460b57cec5SDimitry Andric 7470b57cec5SDimitry Andric// PAUSE. 7480b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs PAUSE)>; 7490b57cec5SDimitry Andric 7500b57cec5SDimitry Andric// XADD. 7510b57cec5SDimitry Andricdef ZnXADD : SchedWriteRes<[ZnALU]>; 7520b57cec5SDimitry Andricdef : InstRW<[ZnXADD], (instregex "XADD(8|16|32|64)rr")>; 7530b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "XADD(8|16|32|64)rm")>; 7540b57cec5SDimitry Andric 7550b57cec5SDimitry Andric//=== Floating Point x87 Instructions ===// 7560b57cec5SDimitry Andric//-- Move instructions --// 7570b57cec5SDimitry Andric 7580b57cec5SDimitry Andricdef ZnWriteFLDr : SchedWriteRes<[ZnFPU13]> ; 7590b57cec5SDimitry Andric 7600b57cec5SDimitry Andricdef ZnWriteSTr: SchedWriteRes<[ZnFPU23]> { 7610b57cec5SDimitry Andric let Latency = 5; 7620b57cec5SDimitry Andric let NumMicroOps = 2; 7630b57cec5SDimitry Andric} 7640b57cec5SDimitry Andric 7650b57cec5SDimitry Andric// LD_F. 7660b57cec5SDimitry Andric// r. 7670b57cec5SDimitry Andricdef : InstRW<[ZnWriteFLDr], (instrs LD_Frr)>; 7680b57cec5SDimitry Andric 7690b57cec5SDimitry Andric// m. 7700b57cec5SDimitry Andricdef ZnWriteLD_F80m : SchedWriteRes<[ZnAGU, ZnFPU13]> { 7710b57cec5SDimitry Andric let NumMicroOps = 2; 7720b57cec5SDimitry Andric} 7730b57cec5SDimitry Andricdef : InstRW<[ZnWriteLD_F80m], (instrs LD_F80m)>; 7740b57cec5SDimitry Andric 7750b57cec5SDimitry Andric// FST(P). 7760b57cec5SDimitry Andric// r. 7770b57cec5SDimitry Andricdef : InstRW<[ZnWriteSTr], (instregex "ST_(F|FP)rr")>; 7780b57cec5SDimitry Andric 7790b57cec5SDimitry Andric// m80. 7800b57cec5SDimitry Andricdef ZnWriteST_FP80m : SchedWriteRes<[ZnAGU, ZnFPU23]> { 7810b57cec5SDimitry Andric let Latency = 5; 7820b57cec5SDimitry Andric} 7830b57cec5SDimitry Andricdef : InstRW<[ZnWriteST_FP80m], (instrs ST_FP80m)>; 7840b57cec5SDimitry Andric 7850b57cec5SDimitry Andricdef ZnWriteFXCH : SchedWriteRes<[ZnFPU]>; 7860b57cec5SDimitry Andric 7870b57cec5SDimitry Andric// FXCHG. 7880b57cec5SDimitry Andricdef : InstRW<[ZnWriteFXCH], (instrs XCH_F)>; 7890b57cec5SDimitry Andric 7900b57cec5SDimitry Andric// FILD. 7910b57cec5SDimitry Andricdef ZnWriteFILD : SchedWriteRes<[ZnAGU, ZnFPU3]> { 7920b57cec5SDimitry Andric let Latency = 11; 7930b57cec5SDimitry Andric let NumMicroOps = 2; 7940b57cec5SDimitry Andric} 7950b57cec5SDimitry Andricdef : InstRW<[ZnWriteFILD], (instregex "ILD_F(16|32|64)m")>; 7960b57cec5SDimitry Andric 7970b57cec5SDimitry Andric// FIST(P) FISTTP. 7980b57cec5SDimitry Andricdef ZnWriteFIST : SchedWriteRes<[ZnAGU, ZnFPU23]> { 7990b57cec5SDimitry Andric let Latency = 12; 8000b57cec5SDimitry Andric} 8010b57cec5SDimitry Andricdef : InstRW<[ZnWriteFIST], (instregex "IS(T|TT)_(F|FP)(16|32|64)m")>; 8020b57cec5SDimitry Andric 8030b57cec5SDimitry Andricdef ZnWriteFPU13 : SchedWriteRes<[ZnAGU, ZnFPU13]> { 8040b57cec5SDimitry Andric let Latency = 8; 8050b57cec5SDimitry Andric} 8060b57cec5SDimitry Andric 8070b57cec5SDimitry Andricdef ZnWriteFPU3 : SchedWriteRes<[ZnAGU, ZnFPU3]> { 8080b57cec5SDimitry Andric let Latency = 11; 8090b57cec5SDimitry Andric} 8100b57cec5SDimitry Andric 8110b57cec5SDimitry Andric// FLDZ. 8120b57cec5SDimitry Andricdef : SchedAlias<WriteFLD0, ZnWriteFPU13>; 8130b57cec5SDimitry Andric 8140b57cec5SDimitry Andric// FLD1. 8150b57cec5SDimitry Andricdef : SchedAlias<WriteFLD1, ZnWriteFPU3>; 8160b57cec5SDimitry Andric 8170b57cec5SDimitry Andric// FLDPI FLDL2E etc. 8180b57cec5SDimitry Andricdef : SchedAlias<WriteFLDC, ZnWriteFPU3>; 8190b57cec5SDimitry Andric 8200b57cec5SDimitry Andric// FNSTSW. 8210b57cec5SDimitry Andric// AX. 8220b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs FNSTSW16r)>; 8230b57cec5SDimitry Andric 8240b57cec5SDimitry Andric// FLDCW. 8250b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs FLDCW16m)>; 8260b57cec5SDimitry Andric 8270b57cec5SDimitry Andric// FNSTCW. 8280b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs FNSTCW16m)>; 8290b57cec5SDimitry Andric 8300b57cec5SDimitry Andric// FINCSTP FDECSTP. 8310b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU3], (instrs FINCSTP, FDECSTP)>; 8320b57cec5SDimitry Andric 8330b57cec5SDimitry Andric// FFREE. 8340b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU3], (instregex "FFREE")>; 8350b57cec5SDimitry Andric 8360b57cec5SDimitry Andric//-- Arithmetic instructions --// 8370b57cec5SDimitry Andric 8380b57cec5SDimitry Andricdef ZnWriteFPU3Lat1 : SchedWriteRes<[ZnFPU3]> ; 8390b57cec5SDimitry Andric 8400b57cec5SDimitry Andricdef ZnWriteFPU0Lat1 : SchedWriteRes<[ZnFPU0]> ; 8410b57cec5SDimitry Andric 8420b57cec5SDimitry Andricdef ZnWriteFPU0Lat1Ld : SchedWriteRes<[ZnAGU, ZnFPU0]> { 8430b57cec5SDimitry Andric let Latency = 8; 8440b57cec5SDimitry Andric} 8450b57cec5SDimitry Andric 8460b57cec5SDimitry Andric// FCHS. 8470b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU3Lat1], (instregex "CHS_F")>; 8480b57cec5SDimitry Andric 8490b57cec5SDimitry Andric// FCOM(P) FUCOM(P). 8500b57cec5SDimitry Andric// r. 8510b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU0Lat1], (instregex "COM(P?)_FST0r", "UCOM_F(P?)r")>; 8520b57cec5SDimitry Andric// m. 8530b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU0Lat1Ld], (instregex "FCOM(P?)(32|64)m")>; 8540b57cec5SDimitry Andric 8550b57cec5SDimitry Andric// FCOMPP FUCOMPP. 8560b57cec5SDimitry Andric// r. 8570b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU0Lat1], (instrs FCOMPP, UCOM_FPPr)>; 8580b57cec5SDimitry Andric 8590b57cec5SDimitry Andricdef ZnWriteFPU02 : SchedWriteRes<[ZnAGU, ZnFPU02]> 8600b57cec5SDimitry Andric{ 8610b57cec5SDimitry Andric let Latency = 9; 8620b57cec5SDimitry Andric} 8630b57cec5SDimitry Andric 8640b57cec5SDimitry Andric// FCOMI(P) FUCOMI(P). 8650b57cec5SDimitry Andric// m. 8660b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU02], (instrs COM_FIPr, COM_FIr, UCOM_FIPr, UCOM_FIr)>; 8670b57cec5SDimitry Andric 8680b57cec5SDimitry Andricdef ZnWriteFPU03 : SchedWriteRes<[ZnAGU, ZnFPU03]> 8690b57cec5SDimitry Andric{ 8700b57cec5SDimitry Andric let Latency = 12; 8710b57cec5SDimitry Andric let NumMicroOps = 2; 872*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,3]; 8730b57cec5SDimitry Andric} 8740b57cec5SDimitry Andric 8750b57cec5SDimitry Andric// FICOM(P). 8760b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU03], (instregex "FICOM(P?)(16|32)m")>; 8770b57cec5SDimitry Andric 8780b57cec5SDimitry Andric// FTST. 8790b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU0Lat1], (instregex "TST_F")>; 8800b57cec5SDimitry Andric 8810b57cec5SDimitry Andric// FXAM. 882fe6060f1SDimitry Andricdef : InstRW<[ZnWriteFPU3Lat1], (instrs XAM_F)>; 8830b57cec5SDimitry Andric 8840b57cec5SDimitry Andric// FNOP. 8850b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU0Lat1], (instrs FNOP)>; 8860b57cec5SDimitry Andric 8870b57cec5SDimitry Andric// WAIT. 8880b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU0Lat1], (instrs WAIT)>; 8890b57cec5SDimitry Andric 8900b57cec5SDimitry Andric//=== Integer MMX and XMM Instructions ===// 8910b57cec5SDimitry Andric 8920b57cec5SDimitry Andricdef ZnWriteFPU013 : SchedWriteRes<[ZnFPU013]> ; 8930b57cec5SDimitry Andricdef ZnWriteFPU013m : SchedWriteRes<[ZnAGU, ZnFPU013]> { 8940b57cec5SDimitry Andric let Latency = 8; 8950b57cec5SDimitry Andric let NumMicroOps = 2; 8960b57cec5SDimitry Andric} 8970b57cec5SDimitry Andric 8980b57cec5SDimitry Andricdef ZnWriteFPU01 : SchedWriteRes<[ZnFPU01]> ; 8990b57cec5SDimitry Andricdef ZnWriteFPU01Y : SchedWriteRes<[ZnFPU01]> { 9000b57cec5SDimitry Andric let NumMicroOps = 2; 9010b57cec5SDimitry Andric} 9020b57cec5SDimitry Andric 9030b57cec5SDimitry Andric// VPBLENDD. 9040b57cec5SDimitry Andric// v,v,v,i. 9050b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU01], (instrs VPBLENDDrri)>; 9060b57cec5SDimitry Andric// ymm 9070b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU01Y], (instrs VPBLENDDYrri)>; 9080b57cec5SDimitry Andric 9090b57cec5SDimitry Andric// v,v,m,i 9100b57cec5SDimitry Andricdef ZnWriteFPU01Op2 : SchedWriteRes<[ZnAGU, ZnFPU01]> { 9110b57cec5SDimitry Andric let NumMicroOps = 2; 9120b57cec5SDimitry Andric let Latency = 8; 913*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 9140b57cec5SDimitry Andric} 9150b57cec5SDimitry Andricdef ZnWriteFPU01Op2Y : SchedWriteRes<[ZnAGU, ZnFPU01]> { 9160b57cec5SDimitry Andric let NumMicroOps = 2; 9170b57cec5SDimitry Andric let Latency = 9; 918*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 3]; 9190b57cec5SDimitry Andric} 9200b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU01Op2], (instrs VPBLENDDrmi)>; 9210b57cec5SDimitry Andricdef : InstRW<[ZnWriteFPU01Op2Y], (instrs VPBLENDDYrmi)>; 9220b57cec5SDimitry Andric 9230b57cec5SDimitry Andric// MASKMOVQ. 9240b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "MMX_MASKMOVQ(64)?")>; 9250b57cec5SDimitry Andric 9260b57cec5SDimitry Andric// MASKMOVDQU. 9270b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "(V?)MASKMOVDQU(64)?")>; 9280b57cec5SDimitry Andric 9290b57cec5SDimitry Andric// VPMASKMOVD. 9300b57cec5SDimitry Andric// ymm 9310b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], 9320b57cec5SDimitry Andric (instregex "VPMASKMOVD(Y?)rm")>; 9330b57cec5SDimitry Andric// m, v,v. 9340b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "VPMASKMOV(D|Q)(Y?)mr")>; 9350b57cec5SDimitry Andric 9360b57cec5SDimitry Andric// VPBROADCAST B/W. 9370b57cec5SDimitry Andric// x, m8/16. 9380b57cec5SDimitry Andricdef ZnWriteVPBROADCAST128Ld : SchedWriteRes<[ZnAGU, ZnFPU12]> { 9390b57cec5SDimitry Andric let Latency = 8; 9400b57cec5SDimitry Andric let NumMicroOps = 2; 941*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 9420b57cec5SDimitry Andric} 9430b57cec5SDimitry Andricdef : InstRW<[ZnWriteVPBROADCAST128Ld], 9440b57cec5SDimitry Andric (instregex "VPBROADCAST(B|W)rm")>; 9450b57cec5SDimitry Andric 9460b57cec5SDimitry Andric// y, m8/16 9470b57cec5SDimitry Andricdef ZnWriteVPBROADCAST256Ld : SchedWriteRes<[ZnAGU, ZnFPU1]> { 9480b57cec5SDimitry Andric let Latency = 8; 9490b57cec5SDimitry Andric let NumMicroOps = 2; 950*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 9510b57cec5SDimitry Andric} 9520b57cec5SDimitry Andricdef : InstRW<[ZnWriteVPBROADCAST256Ld], 9530b57cec5SDimitry Andric (instregex "VPBROADCAST(B|W)Yrm")>; 9540b57cec5SDimitry Andric 9550b57cec5SDimitry Andric// VPGATHER. 9560b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "VPGATHER(Q|D)(Q|D)(Y?)rm")>; 9570b57cec5SDimitry Andric 9580b57cec5SDimitry Andric//-- Arithmetic instructions --// 9590b57cec5SDimitry Andric 9600b57cec5SDimitry Andric// HADD, HSUB PS/PD 9610b57cec5SDimitry Andric// PHADD|PHSUB (S) W/D. 96281ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFHAdd, [], 7>; 96381ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WriteFHAddY, [], 7>; 96481ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WritePHAdd, [], 3>; 96581ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WritePHAddX, [], 3>; 96681ad6265SDimitry Andricdefm : ZnWriteResFpuPair<WritePHAddY, [], 3>; 9670b57cec5SDimitry Andric 9680b57cec5SDimitry Andric// PCMPGTQ. 9690b57cec5SDimitry Andricdef ZnWritePCMPGTQr : SchedWriteRes<[ZnFPU03]>; 9700b57cec5SDimitry Andricdef : InstRW<[ZnWritePCMPGTQr], (instregex "(V?)PCMPGTQ(Y?)rr")>; 9710b57cec5SDimitry Andric 9720b57cec5SDimitry Andric// x <- x,m. 9730b57cec5SDimitry Andricdef ZnWritePCMPGTQm : SchedWriteRes<[ZnAGU, ZnFPU03]> { 9740b57cec5SDimitry Andric let Latency = 8; 9750b57cec5SDimitry Andric} 9760b57cec5SDimitry Andric// ymm. 9770b57cec5SDimitry Andricdef ZnWritePCMPGTQYm : SchedWriteRes<[ZnAGU, ZnFPU03]> { 9780b57cec5SDimitry Andric let Latency = 8; 9790b57cec5SDimitry Andric let NumMicroOps = 2; 980*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 9810b57cec5SDimitry Andric} 9820b57cec5SDimitry Andricdef : InstRW<[ZnWritePCMPGTQm], (instregex "(V?)PCMPGTQrm")>; 9830b57cec5SDimitry Andricdef : InstRW<[ZnWritePCMPGTQYm], (instrs VPCMPGTQYrm)>; 9840b57cec5SDimitry Andric 9850b57cec5SDimitry Andric//=== Floating Point XMM and YMM Instructions ===// 9860b57cec5SDimitry Andric//-- Move instructions --// 9870b57cec5SDimitry Andric 988bdd1243dSDimitry Andric// VPERM2F128 / VPERM2I128. 989bdd1243dSDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs VPERM2F128rr, 990bdd1243dSDimitry Andric VPERM2I128rr)>; 991bdd1243dSDimitry Andricdef : InstRW<[WriteMicrocoded], (instrs VPERM2F128rm, 992bdd1243dSDimitry Andric VPERM2I128rm)>; 9930b57cec5SDimitry Andric 9940b57cec5SDimitry Andricdef ZnWriteBROADCAST : SchedWriteRes<[ZnAGU, ZnFPU13]> { 9950b57cec5SDimitry Andric let NumMicroOps = 2; 9960b57cec5SDimitry Andric let Latency = 8; 9970b57cec5SDimitry Andric} 998bdd1243dSDimitry Andric// VBROADCASTF128 / VBROADCASTI128. 999*5f757f3fSDimitry Andricdef : InstRW<[ZnWriteBROADCAST], (instrs VBROADCASTF128rm, 1000*5f757f3fSDimitry Andric VBROADCASTI128rm)>; 10010b57cec5SDimitry Andric 10020b57cec5SDimitry Andric// EXTRACTPS. 10030b57cec5SDimitry Andric// r32,x,i. 10040b57cec5SDimitry Andricdef ZnWriteEXTRACTPSr : SchedWriteRes<[ZnFPU12, ZnFPU2]> { 10050b57cec5SDimitry Andric let Latency = 2; 10060b57cec5SDimitry Andric let NumMicroOps = 2; 1007*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 10080b57cec5SDimitry Andric} 10090b57cec5SDimitry Andricdef : InstRW<[ZnWriteEXTRACTPSr], (instregex "(V?)EXTRACTPSrr")>; 10100b57cec5SDimitry Andric 10110b57cec5SDimitry Andricdef ZnWriteEXTRACTPSm : SchedWriteRes<[ZnAGU,ZnFPU12, ZnFPU2]> { 10120b57cec5SDimitry Andric let Latency = 5; 10130b57cec5SDimitry Andric let NumMicroOps = 2; 1014*5f757f3fSDimitry Andric let ReleaseAtCycles = [5, 1, 2]; 10150b57cec5SDimitry Andric} 10160b57cec5SDimitry Andric// m32,x,i. 10170b57cec5SDimitry Andricdef : InstRW<[ZnWriteEXTRACTPSm], (instregex "(V?)EXTRACTPSmr")>; 10180b57cec5SDimitry Andric 1019bdd1243dSDimitry Andric// VEXTRACTF128 / VEXTRACTI128. 10200b57cec5SDimitry Andric// x,y,i. 1021bdd1243dSDimitry Andricdef : InstRW<[ZnWriteFPU013], (instrs VEXTRACTF128rr, 1022bdd1243dSDimitry Andric VEXTRACTI128rr)>; 10230b57cec5SDimitry Andric 10240b57cec5SDimitry Andric// m128,y,i. 1025bdd1243dSDimitry Andricdef : InstRW<[ZnWriteFPU013m], (instrs VEXTRACTF128mr, 1026bdd1243dSDimitry Andric VEXTRACTI128mr)>; 10270b57cec5SDimitry Andric 10280b57cec5SDimitry Andricdef ZnWriteVINSERT128r: SchedWriteRes<[ZnFPU013]> { 10290b57cec5SDimitry Andric let Latency = 2; 1030*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 10310b57cec5SDimitry Andric} 10320b57cec5SDimitry Andricdef ZnWriteVINSERT128Ld: SchedWriteRes<[ZnAGU,ZnFPU013]> { 10330b57cec5SDimitry Andric let Latency = 9; 10340b57cec5SDimitry Andric let NumMicroOps = 2; 1035*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 10360b57cec5SDimitry Andric} 1037bdd1243dSDimitry Andric// VINSERTF128 / VINSERTI128. 10380b57cec5SDimitry Andric// y,y,x,i. 1039bdd1243dSDimitry Andricdef : InstRW<[ZnWriteVINSERT128r], (instrs VINSERTF128rr, 1040bdd1243dSDimitry Andric VINSERTI128rr)>; 1041bdd1243dSDimitry Andricdef : InstRW<[ZnWriteVINSERT128Ld], (instrs VINSERTF128rm, 1042bdd1243dSDimitry Andric VINSERTI128rm)>; 10430b57cec5SDimitry Andric 10440b57cec5SDimitry Andric// VGATHER. 10450b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "VGATHER(Q|D)(PD|PS)(Y?)rm")>; 10460b57cec5SDimitry Andric 10470b57cec5SDimitry Andric//-- Conversion instructions --// 10480b57cec5SDimitry Andricdef ZnWriteCVTPD2PSr: SchedWriteRes<[ZnFPU3]> { 10490b57cec5SDimitry Andric let Latency = 4; 10500b57cec5SDimitry Andric} 10510b57cec5SDimitry Andricdef ZnWriteCVTPD2PSYr: SchedWriteRes<[ZnFPU3]> { 10520b57cec5SDimitry Andric let Latency = 5; 1053bdd1243dSDimitry Andric let NumMicroOps = 2; 1054*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 10550b57cec5SDimitry Andric} 10560b57cec5SDimitry Andric 10570b57cec5SDimitry Andric// CVTPD2PS. 10580b57cec5SDimitry Andric// x,x. 10590b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPD2PS, ZnWriteCVTPD2PSr>; 10600b57cec5SDimitry Andric// y,y. 10610b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPD2PSY, ZnWriteCVTPD2PSYr>; 10620b57cec5SDimitry Andric// z,z. 10630b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPD2PSZ>; 10640b57cec5SDimitry Andric 1065bdd1243dSDimitry Andricdef ZnWriteCVTPD2PSLd: SchedWriteRes<[ZnAGU,ZnFPU3]> { 10660b57cec5SDimitry Andric let Latency = 11; 10670b57cec5SDimitry Andric} 10680b57cec5SDimitry Andric// x,m128. 10690b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPD2PSLd, ZnWriteCVTPD2PSLd>; 10700b57cec5SDimitry Andric 10710b57cec5SDimitry Andric// x,m256. 10720b57cec5SDimitry Andricdef ZnWriteCVTPD2PSYLd : SchedWriteRes<[ZnAGU, ZnFPU3]> { 10730b57cec5SDimitry Andric let Latency = 11; 1074bdd1243dSDimitry Andric let NumMicroOps = 2; 1075*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 10760b57cec5SDimitry Andric} 10770b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPD2PSYLd, ZnWriteCVTPD2PSYLd>; 10780b57cec5SDimitry Andric// z,m512 10790b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPD2PSZLd>; 10800b57cec5SDimitry Andric 10810b57cec5SDimitry Andric// CVTSD2SS. 10820b57cec5SDimitry Andric// x,x. 10830b57cec5SDimitry Andric// Same as WriteCVTPD2PSr 10840b57cec5SDimitry Andricdef : SchedAlias<WriteCvtSD2SS, ZnWriteCVTPD2PSr>; 10850b57cec5SDimitry Andric 10860b57cec5SDimitry Andric// x,m64. 10870b57cec5SDimitry Andricdef : SchedAlias<WriteCvtSD2SSLd, ZnWriteCVTPD2PSLd>; 10880b57cec5SDimitry Andric 10890b57cec5SDimitry Andric// CVTPS2PD. 10900b57cec5SDimitry Andric// x,x. 10910b57cec5SDimitry Andricdef ZnWriteCVTPS2PDr : SchedWriteRes<[ZnFPU3]> { 10920b57cec5SDimitry Andric let Latency = 3; 10930b57cec5SDimitry Andric} 10940b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPS2PD, ZnWriteCVTPS2PDr>; 10950b57cec5SDimitry Andric 10960b57cec5SDimitry Andric// x,m64. 10970b57cec5SDimitry Andric// y,m128. 10980b57cec5SDimitry Andricdef ZnWriteCVTPS2PDLd : SchedWriteRes<[ZnAGU, ZnFPU3]> { 10990b57cec5SDimitry Andric let Latency = 10; 11000b57cec5SDimitry Andric let NumMicroOps = 2; 11010b57cec5SDimitry Andric} 11020b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPS2PDLd, ZnWriteCVTPS2PDLd>; 11030b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPS2PDYLd, ZnWriteCVTPS2PDLd>; 11040b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PDZLd>; 11050b57cec5SDimitry Andric 11060b57cec5SDimitry Andric// y,x. 11070b57cec5SDimitry Andricdef ZnWriteVCVTPS2PDY : SchedWriteRes<[ZnFPU3]> { 11080b57cec5SDimitry Andric let Latency = 3; 11090b57cec5SDimitry Andric} 11100b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPS2PDY, ZnWriteVCVTPS2PDY>; 11110b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PDZ>; 11120b57cec5SDimitry Andric 11130b57cec5SDimitry Andric// CVTSS2SD. 11140b57cec5SDimitry Andric// x,x. 11150b57cec5SDimitry Andricdef ZnWriteCVTSS2SDr : SchedWriteRes<[ZnFPU3]> { 11160b57cec5SDimitry Andric let Latency = 4; 11170b57cec5SDimitry Andric} 11180b57cec5SDimitry Andricdef : SchedAlias<WriteCvtSS2SD, ZnWriteCVTSS2SDr>; 11190b57cec5SDimitry Andric 11200b57cec5SDimitry Andric// x,m32. 11210b57cec5SDimitry Andricdef ZnWriteCVTSS2SDLd : SchedWriteRes<[ZnAGU, ZnFPU3]> { 11220b57cec5SDimitry Andric let Latency = 11; 11230b57cec5SDimitry Andric let NumMicroOps = 2; 1124*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2]; 11250b57cec5SDimitry Andric} 11260b57cec5SDimitry Andricdef : SchedAlias<WriteCvtSS2SDLd, ZnWriteCVTSS2SDLd>; 11270b57cec5SDimitry Andric 11280b57cec5SDimitry Andricdef ZnWriteCVTDQ2PDr: SchedWriteRes<[ZnFPU12,ZnFPU3]> { 11290b57cec5SDimitry Andric let Latency = 5; 11300b57cec5SDimitry Andric} 11310b57cec5SDimitry Andric// CVTDQ2PD. 11320b57cec5SDimitry Andric// x,x. 11330b57cec5SDimitry Andricdef : InstRW<[ZnWriteCVTDQ2PDr], (instregex "(V)?CVTDQ2PDrr")>; 11340b57cec5SDimitry Andric 11350b57cec5SDimitry Andric// Same as xmm 11360b57cec5SDimitry Andric// y,x. 11370b57cec5SDimitry Andricdef : InstRW<[ZnWriteCVTDQ2PDr], (instrs VCVTDQ2PDYrr)>; 11380b57cec5SDimitry Andric 11390b57cec5SDimitry Andricdef ZnWriteCVTPD2DQr: SchedWriteRes<[ZnFPU12, ZnFPU3]> { 11400b57cec5SDimitry Andric let Latency = 5; 11410b57cec5SDimitry Andric} 11420b57cec5SDimitry Andric// CVT(T)PD2DQ. 11430b57cec5SDimitry Andric// x,x. 1144bdd1243dSDimitry Andricdef : InstRW<[ZnWriteCVTPD2DQr], (instregex "(V?)CVT(T?)PD2DQrr")>; 11450b57cec5SDimitry Andric 11460b57cec5SDimitry Andricdef ZnWriteCVTPD2DQLd: SchedWriteRes<[ZnAGU,ZnFPU12,ZnFPU3]> { 11470b57cec5SDimitry Andric let Latency = 12; 11480b57cec5SDimitry Andric let NumMicroOps = 2; 11490b57cec5SDimitry Andric} 11500b57cec5SDimitry Andric// x,m128. 11510b57cec5SDimitry Andricdef : InstRW<[ZnWriteCVTPD2DQLd], (instregex "(V?)CVT(T?)PD2DQrm")>; 11520b57cec5SDimitry Andric// same as xmm handling 11530b57cec5SDimitry Andric// x,y. 11540b57cec5SDimitry Andricdef : InstRW<[ZnWriteCVTPD2DQr], (instregex "VCVT(T?)PD2DQYrr")>; 11550b57cec5SDimitry Andric// x,m256. 11560b57cec5SDimitry Andricdef : InstRW<[ZnWriteCVTPD2DQLd], (instregex "VCVT(T?)PD2DQYrm")>; 11570b57cec5SDimitry Andric 11580b57cec5SDimitry Andricdef ZnWriteCVTPS2PIr: SchedWriteRes<[ZnFPU3]> { 11590b57cec5SDimitry Andric let Latency = 4; 11600b57cec5SDimitry Andric} 11610b57cec5SDimitry Andric// CVT(T)PS2PI. 11620b57cec5SDimitry Andric// mm,x. 11630eae32dcSDimitry Andricdef : InstRW<[ZnWriteCVTPS2PIr], (instregex "MMX_CVT(T?)PS2PIrr")>; 11640b57cec5SDimitry Andric 11650b57cec5SDimitry Andric// CVTPI2PD. 11660b57cec5SDimitry Andric// x,mm. 11670eae32dcSDimitry Andricdef : InstRW<[ZnWriteCVTPS2PDr], (instrs MMX_CVTPI2PDrr)>; 11680b57cec5SDimitry Andric 11690b57cec5SDimitry Andric// CVT(T)PD2PI. 11700b57cec5SDimitry Andric// mm,x. 11710eae32dcSDimitry Andricdef : InstRW<[ZnWriteCVTPS2PIr], (instregex "MMX_CVT(T?)PD2PIrr")>; 11720b57cec5SDimitry Andric 11730b57cec5SDimitry Andricdef ZnWriteCVSTSI2SSr: SchedWriteRes<[ZnFPU3]> { 11740b57cec5SDimitry Andric let Latency = 5; 11750b57cec5SDimitry Andric} 11760b57cec5SDimitry Andric 11770b57cec5SDimitry Andric// same as CVTPD2DQr 11780b57cec5SDimitry Andric// CVT(T)SS2SI. 11790b57cec5SDimitry Andric// r32,x. 11800b57cec5SDimitry Andricdef : InstRW<[ZnWriteCVTPD2DQr], (instregex "(V?)CVT(T?)SS2SI(64)?rr")>; 11810b57cec5SDimitry Andric// same as CVTPD2DQm 11820b57cec5SDimitry Andric// r32,m32. 11830b57cec5SDimitry Andricdef : InstRW<[ZnWriteCVTPD2DQLd], (instregex "(V?)CVT(T?)SS2SI(64)?rm")>; 11840b57cec5SDimitry Andric 11850b57cec5SDimitry Andricdef ZnWriteCVSTSI2SDr: SchedWriteRes<[ZnFPU013, ZnFPU3]> { 11860b57cec5SDimitry Andric let Latency = 5; 11870b57cec5SDimitry Andric} 11880b57cec5SDimitry Andric// CVTSI2SD. 11890b57cec5SDimitry Andric// x,r32/64. 11900b57cec5SDimitry Andricdef : InstRW<[ZnWriteCVSTSI2SDr], (instregex "(V?)CVTSI(64)?2SDrr")>; 11910b57cec5SDimitry Andric 11920b57cec5SDimitry Andric 11930b57cec5SDimitry Andricdef ZnWriteCVSTSI2SIr: SchedWriteRes<[ZnFPU3, ZnFPU2]> { 11940b57cec5SDimitry Andric let Latency = 5; 11950b57cec5SDimitry Andric} 11960b57cec5SDimitry Andricdef ZnWriteCVSTSI2SILd: SchedWriteRes<[ZnAGU, ZnFPU3, ZnFPU2]> { 11970b57cec5SDimitry Andric let Latency = 12; 11980b57cec5SDimitry Andric} 11990b57cec5SDimitry Andric// CVTSD2SI. 12000b57cec5SDimitry Andric// r32/64 12010b57cec5SDimitry Andricdef : InstRW<[ZnWriteCVSTSI2SIr], (instregex "(V?)CVT(T?)SD2SI(64)?rr")>; 12020b57cec5SDimitry Andric// r32,m32. 12030b57cec5SDimitry Andricdef : InstRW<[ZnWriteCVSTSI2SILd], (instregex "(V?)CVT(T?)SD2SI(64)?rm")>; 12040b57cec5SDimitry Andric 12050b57cec5SDimitry Andric// VCVTPS2PH. 12060b57cec5SDimitry Andric// x,v,i. 12070b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPS2PH, ZnWriteMicrocoded>; 12080b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPS2PHY, ZnWriteMicrocoded>; 12090b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHZ>; 12100b57cec5SDimitry Andric// m,v,i. 12110b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPS2PHSt, ZnWriteMicrocoded>; 12120b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPS2PHYSt, ZnWriteMicrocoded>; 12130b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHZSt>; 12140b57cec5SDimitry Andric 12150b57cec5SDimitry Andric// VCVTPH2PS. 12160b57cec5SDimitry Andric// v,x. 12170b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPH2PS, ZnWriteMicrocoded>; 12180b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPH2PSY, ZnWriteMicrocoded>; 12190b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPH2PSZ>; 12200b57cec5SDimitry Andric// v,m. 12210b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPH2PSLd, ZnWriteMicrocoded>; 12220b57cec5SDimitry Andricdef : SchedAlias<WriteCvtPH2PSYLd, ZnWriteMicrocoded>; 12230b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPH2PSZLd>; 12240b57cec5SDimitry Andric 12250b57cec5SDimitry Andric//-- SSE4A instructions --// 12260b57cec5SDimitry Andric// EXTRQ 12270b57cec5SDimitry Andricdef ZnWriteEXTRQ: SchedWriteRes<[ZnFPU12, ZnFPU2]> { 12280b57cec5SDimitry Andric let Latency = 2; 12290b57cec5SDimitry Andric} 12300b57cec5SDimitry Andricdef : InstRW<[ZnWriteEXTRQ], (instregex "EXTRQ")>; 12310b57cec5SDimitry Andric 12320b57cec5SDimitry Andric// INSERTQ 12330b57cec5SDimitry Andricdef ZnWriteINSERTQ: SchedWriteRes<[ZnFPU03,ZnFPU1]> { 12340b57cec5SDimitry Andric let Latency = 4; 12350b57cec5SDimitry Andric} 12360b57cec5SDimitry Andricdef : InstRW<[ZnWriteINSERTQ], (instregex "INSERTQ")>; 12370b57cec5SDimitry Andric 12380b57cec5SDimitry Andric//-- SHA instructions --// 12390b57cec5SDimitry Andric// SHA256MSG2 12400b57cec5SDimitry Andricdef : InstRW<[WriteMicrocoded], (instregex "SHA256MSG2(Y?)r(r|m)")>; 12410b57cec5SDimitry Andric 12420b57cec5SDimitry Andric// SHA1MSG1, SHA256MSG1 12430b57cec5SDimitry Andric// x,x. 12440b57cec5SDimitry Andricdef ZnWriteSHA1MSG1r : SchedWriteRes<[ZnFPU12]> { 12450b57cec5SDimitry Andric let Latency = 2; 1246*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 12470b57cec5SDimitry Andric} 12480b57cec5SDimitry Andricdef : InstRW<[ZnWriteSHA1MSG1r], (instregex "SHA(1|256)MSG1rr")>; 12490b57cec5SDimitry Andric// x,m. 12500b57cec5SDimitry Andricdef ZnWriteSHA1MSG1Ld : SchedWriteRes<[ZnAGU, ZnFPU12]> { 12510b57cec5SDimitry Andric let Latency = 9; 1252*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 12530b57cec5SDimitry Andric} 12540b57cec5SDimitry Andricdef : InstRW<[ZnWriteSHA1MSG1Ld], (instregex "SHA(1|256)MSG1rm")>; 12550b57cec5SDimitry Andric 12560b57cec5SDimitry Andric// SHA1MSG2 12570b57cec5SDimitry Andric// x,x. 12580b57cec5SDimitry Andricdef ZnWriteSHA1MSG2r : SchedWriteRes<[ZnFPU12]> ; 12590b57cec5SDimitry Andricdef : InstRW<[ZnWriteSHA1MSG2r], (instrs SHA1MSG2rr)>; 12600b57cec5SDimitry Andric// x,m. 12610b57cec5SDimitry Andricdef ZnWriteSHA1MSG2Ld : SchedWriteRes<[ZnAGU, ZnFPU12]> { 12620b57cec5SDimitry Andric let Latency = 8; 12630b57cec5SDimitry Andric} 12640b57cec5SDimitry Andricdef : InstRW<[ZnWriteSHA1MSG2Ld], (instrs SHA1MSG2rm)>; 12650b57cec5SDimitry Andric 12660b57cec5SDimitry Andric// SHA1NEXTE 12670b57cec5SDimitry Andric// x,x. 12680b57cec5SDimitry Andricdef ZnWriteSHA1NEXTEr : SchedWriteRes<[ZnFPU1]> ; 12690b57cec5SDimitry Andricdef : InstRW<[ZnWriteSHA1NEXTEr], (instrs SHA1NEXTErr)>; 12700b57cec5SDimitry Andric// x,m. 12710b57cec5SDimitry Andricdef ZnWriteSHA1NEXTELd : SchedWriteRes<[ZnAGU, ZnFPU1]> { 12720b57cec5SDimitry Andric let Latency = 8; 12730b57cec5SDimitry Andric} 12740b57cec5SDimitry Andricdef : InstRW<[ZnWriteSHA1NEXTELd], (instrs SHA1NEXTErm)>; 12750b57cec5SDimitry Andric 12760b57cec5SDimitry Andric// SHA1RNDS4 12770b57cec5SDimitry Andric// x,x. 12780b57cec5SDimitry Andricdef ZnWriteSHA1RNDS4r : SchedWriteRes<[ZnFPU1]> { 12790b57cec5SDimitry Andric let Latency = 6; 12800b57cec5SDimitry Andric} 12810b57cec5SDimitry Andricdef : InstRW<[ZnWriteSHA1RNDS4r], (instrs SHA1RNDS4rri)>; 12820b57cec5SDimitry Andric// x,m. 12830b57cec5SDimitry Andricdef ZnWriteSHA1RNDS4Ld : SchedWriteRes<[ZnAGU, ZnFPU1]> { 12840b57cec5SDimitry Andric let Latency = 13; 12850b57cec5SDimitry Andric} 12860b57cec5SDimitry Andricdef : InstRW<[ZnWriteSHA1RNDS4Ld], (instrs SHA1RNDS4rmi)>; 12870b57cec5SDimitry Andric 12880b57cec5SDimitry Andric// SHA256RNDS2 12890b57cec5SDimitry Andric// x,x. 12900b57cec5SDimitry Andricdef ZnWriteSHA256RNDS2r : SchedWriteRes<[ZnFPU1]> { 12910b57cec5SDimitry Andric let Latency = 4; 12920b57cec5SDimitry Andric} 12930b57cec5SDimitry Andricdef : InstRW<[ZnWriteSHA256RNDS2r], (instrs SHA256RNDS2rr)>; 12940b57cec5SDimitry Andric// x,m. 12950b57cec5SDimitry Andricdef ZnWriteSHA256RNDS2Ld : SchedWriteRes<[ZnAGU, ZnFPU1]> { 12960b57cec5SDimitry Andric let Latency = 11; 12970b57cec5SDimitry Andric} 12980b57cec5SDimitry Andricdef : InstRW<[ZnWriteSHA256RNDS2Ld], (instrs SHA256RNDS2rm)>; 12990b57cec5SDimitry Andric 13000b57cec5SDimitry Andric//-- Arithmetic instructions --// 13010b57cec5SDimitry Andric 13020b57cec5SDimitry Andric// DPPS. 13030b57cec5SDimitry Andric// x,x,i / v,v,v,i. 13040b57cec5SDimitry Andricdef : SchedAlias<WriteDPPS, ZnWriteMicrocoded>; 13050b57cec5SDimitry Andricdef : SchedAlias<WriteDPPSY, ZnWriteMicrocoded>; 13060b57cec5SDimitry Andric 13070b57cec5SDimitry Andric// x,m,i / v,v,m,i. 13080b57cec5SDimitry Andricdef : SchedAlias<WriteDPPSLd, ZnWriteMicrocoded>; 13090b57cec5SDimitry Andricdef : SchedAlias<WriteDPPSYLd,ZnWriteMicrocoded>; 13100b57cec5SDimitry Andric 13110b57cec5SDimitry Andric// DPPD. 13120b57cec5SDimitry Andric// x,x,i. 13130b57cec5SDimitry Andricdef : SchedAlias<WriteDPPD, ZnWriteMicrocoded>; 13140b57cec5SDimitry Andric 13150b57cec5SDimitry Andric// x,m,i. 13160b57cec5SDimitry Andricdef : SchedAlias<WriteDPPDLd, ZnWriteMicrocoded>; 13170b57cec5SDimitry Andric 131804eeddc0SDimitry Andric/////////////////////////////////////////////////////////////////////////////// 131904eeddc0SDimitry Andric// Dependency breaking instructions. 132004eeddc0SDimitry Andric/////////////////////////////////////////////////////////////////////////////// 132104eeddc0SDimitry Andric 132204eeddc0SDimitry Andricdef : IsZeroIdiomFunction<[ 132304eeddc0SDimitry Andric // GPR Zero-idioms. 132404eeddc0SDimitry Andric DepBreakingClass<[ 132504eeddc0SDimitry Andric SUB32rr, SUB64rr, 132604eeddc0SDimitry Andric XOR32rr, XOR64rr 132704eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 132804eeddc0SDimitry Andric 132904eeddc0SDimitry Andric // MMX Zero-idioms. 133004eeddc0SDimitry Andric DepBreakingClass<[ 133104eeddc0SDimitry Andric MMX_PXORrr, MMX_PANDNrr, MMX_PSUBBrr, 133204eeddc0SDimitry Andric MMX_PSUBDrr, MMX_PSUBQrr, MMX_PSUBWrr, 133304eeddc0SDimitry Andric MMX_PSUBSBrr, MMX_PSUBSWrr, MMX_PSUBUSBrr, MMX_PSUBUSWrr, 133404eeddc0SDimitry Andric MMX_PCMPGTBrr, MMX_PCMPGTDrr, MMX_PCMPGTWrr 133504eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 133604eeddc0SDimitry Andric 133704eeddc0SDimitry Andric // SSE Zero-idioms. 133804eeddc0SDimitry Andric DepBreakingClass<[ 133904eeddc0SDimitry Andric // fp variants. 134004eeddc0SDimitry Andric XORPSrr, XORPDrr, ANDNPSrr, ANDNPDrr, 134104eeddc0SDimitry Andric 134204eeddc0SDimitry Andric // int variants. 134304eeddc0SDimitry Andric PXORrr, PANDNrr, 134404eeddc0SDimitry Andric PSUBBrr, PSUBWrr, PSUBDrr, PSUBQrr, 134504eeddc0SDimitry Andric PCMPGTBrr, PCMPGTDrr, PCMPGTQrr, PCMPGTWrr 134604eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 134704eeddc0SDimitry Andric 134804eeddc0SDimitry Andric // AVX XMM Zero-idioms. 134904eeddc0SDimitry Andric DepBreakingClass<[ 135004eeddc0SDimitry Andric // fp variants. 135104eeddc0SDimitry Andric VXORPSrr, VXORPDrr, VANDNPSrr, VANDNPDrr, 135204eeddc0SDimitry Andric 135304eeddc0SDimitry Andric // int variants. 135404eeddc0SDimitry Andric VPXORrr, VPANDNrr, 135504eeddc0SDimitry Andric VPSUBBrr, VPSUBWrr, VPSUBDrr, VPSUBQrr, 135604eeddc0SDimitry Andric VPCMPGTBrr, VPCMPGTWrr, VPCMPGTDrr, VPCMPGTQrr 135704eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 135804eeddc0SDimitry Andric 135904eeddc0SDimitry Andric // AVX YMM Zero-idioms. 136004eeddc0SDimitry Andric DepBreakingClass<[ 136104eeddc0SDimitry Andric // fp variants 136204eeddc0SDimitry Andric VXORPSYrr, VXORPDYrr, VANDNPSYrr, VANDNPDYrr, 136304eeddc0SDimitry Andric 136404eeddc0SDimitry Andric // int variants 136504eeddc0SDimitry Andric VPXORYrr, VPANDNYrr, 136604eeddc0SDimitry Andric VPSUBBYrr, VPSUBWYrr, VPSUBDYrr, VPSUBQYrr, 136704eeddc0SDimitry Andric VPCMPGTBYrr, VPCMPGTWYrr, VPCMPGTDYrr, VPCMPGTQYrr 136804eeddc0SDimitry Andric ], ZeroIdiomPredicate> 136904eeddc0SDimitry Andric]>; 137004eeddc0SDimitry Andric 137104eeddc0SDimitry Andricdef : IsDepBreakingFunction<[ 137204eeddc0SDimitry Andric // GPR 137304eeddc0SDimitry Andric DepBreakingClass<[ SBB32rr, SBB64rr ], ZeroIdiomPredicate>, 137404eeddc0SDimitry Andric DepBreakingClass<[ CMP32rr, CMP64rr ], CheckSameRegOperand<0, 1> >, 137504eeddc0SDimitry Andric 137604eeddc0SDimitry Andric // MMX 137704eeddc0SDimitry Andric DepBreakingClass<[ 137804eeddc0SDimitry Andric MMX_PCMPEQBrr, MMX_PCMPEQWrr, MMX_PCMPEQDrr 137904eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 138004eeddc0SDimitry Andric 138104eeddc0SDimitry Andric // SSE 138204eeddc0SDimitry Andric DepBreakingClass<[ 138304eeddc0SDimitry Andric PCMPEQBrr, PCMPEQWrr, PCMPEQDrr, PCMPEQQrr 138404eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 138504eeddc0SDimitry Andric 138604eeddc0SDimitry Andric // AVX XMM 138704eeddc0SDimitry Andric DepBreakingClass<[ 138804eeddc0SDimitry Andric VPCMPEQBrr, VPCMPEQWrr, VPCMPEQDrr, VPCMPEQQrr 138904eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 139004eeddc0SDimitry Andric 139104eeddc0SDimitry Andric // AVX YMM 139204eeddc0SDimitry Andric DepBreakingClass<[ 139304eeddc0SDimitry Andric VPCMPEQBYrr, VPCMPEQWYrr, VPCMPEQDYrr, VPCMPEQQYrr 139404eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 139504eeddc0SDimitry Andric]>; 139604eeddc0SDimitry Andric 13970b57cec5SDimitry Andric} // SchedModel 1398