10b57cec5SDimitry Andric//===- X86ScheduleAtom.td - X86 Atom Scheduling Definitions -*- 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 schedule class data for the Intel Atom 100b57cec5SDimitry Andric// in order (Saltwell-32nm/Bonnell-45nm) processors. 110b57cec5SDimitry Andric// 120b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric// 150b57cec5SDimitry Andric// Scheduling information derived from the "Intel 64 and IA32 Architectures 160b57cec5SDimitry Andric// Optimization Reference Manual", Chapter 13, Section 4. 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric// Atom machine model. 190b57cec5SDimitry Andricdef AtomModel : SchedMachineModel { 200b57cec5SDimitry Andric let IssueWidth = 2; // Allows 2 instructions per scheduling group. 210b57cec5SDimitry Andric let MicroOpBufferSize = 0; // In-order execution, always hide latency. 220b57cec5SDimitry Andric let LoadLatency = 3; // Expected cycles, may be overriden. 230b57cec5SDimitry Andric let HighLatency = 30;// Expected, may be overriden. 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric // On the Atom, the throughput for taken branches is 2 cycles. For small 260b57cec5SDimitry Andric // simple loops, expand by a small factor to hide the backedge cost. 270b57cec5SDimitry Andric let LoopMicroOpBufferSize = 10; 280b57cec5SDimitry Andric let PostRAScheduler = 1; 290b57cec5SDimitry Andric let CompleteModel = 0; 300b57cec5SDimitry Andric} 310b57cec5SDimitry Andric 320b57cec5SDimitry Andriclet SchedModel = AtomModel in { 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric// Functional Units 350b57cec5SDimitry Andricdef AtomPort0 : ProcResource<1>; // ALU: ALU0, shift/rotate, load/store 360b57cec5SDimitry Andric // SIMD/FP: SIMD ALU, Shuffle,SIMD/FP multiply, divide 370b57cec5SDimitry Andricdef AtomPort1 : ProcResource<1>; // ALU: ALU1, bit processing, jump, and LEA 380b57cec5SDimitry Andric // SIMD/FP: SIMD ALU, FP Adder 390b57cec5SDimitry Andric 40fe6060f1SDimitry Andric// NOTE: This is for ops that can use EITHER port, not for ops that require BOTH ports. 410b57cec5SDimitry Andricdef AtomPort01 : ProcResGroup<[AtomPort0, AtomPort1]>; 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric// Loads are 3 cycles, so ReadAfterLd registers needn't be available until 3 440b57cec5SDimitry Andric// cycles after the memory operand. 450b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterLd, 3>; 460b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecLd, 3>; 470b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecXLd, 3>; 480b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecYLd, 3>; 490b57cec5SDimitry Andric 500b57cec5SDimitry Andricdef : ReadAdvance<ReadInt2Fpu, 0>; 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric// This multiclass defines the resource usage for variants with and without 530b57cec5SDimitry Andric// folded loads. 540b57cec5SDimitry Andricmulticlass AtomWriteResPair<X86FoldableSchedWrite SchedRW, 550b57cec5SDimitry Andric list<ProcResourceKind> RRPorts, 560b57cec5SDimitry Andric list<ProcResourceKind> RMPorts, 570b57cec5SDimitry Andric int RRLat = 1, int RMLat = 1, 580b57cec5SDimitry Andric list<int> RRRes = [1], 59349cc55cSDimitry Andric list<int> RMRes = [1], 60349cc55cSDimitry Andric int RRUOps = 1, 61349cc55cSDimitry Andric int RMUOps = 1> { 62fe6060f1SDimitry Andric // Register variant. 630b57cec5SDimitry Andric def : WriteRes<SchedRW, RRPorts> { 640b57cec5SDimitry Andric let Latency = RRLat; 65*5f757f3fSDimitry Andric let ReleaseAtCycles = RRRes; 66349cc55cSDimitry Andric let NumMicroOps = RRUOps; 670b57cec5SDimitry Andric } 680b57cec5SDimitry Andric 69fe6060f1SDimitry Andric // Memory variant. 700b57cec5SDimitry Andric def : WriteRes<SchedRW.Folded, RMPorts> { 710b57cec5SDimitry Andric let Latency = RMLat; 72*5f757f3fSDimitry Andric let ReleaseAtCycles = RMRes; 73349cc55cSDimitry Andric let NumMicroOps = RMUOps; 740b57cec5SDimitry Andric } 750b57cec5SDimitry Andric} 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric// A folded store needs a cycle on Port0 for the store data. 780b57cec5SDimitry Andricdef : WriteRes<WriteRMW, [AtomPort0]>; 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 810b57cec5SDimitry Andric// Arithmetic. 820b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 830b57cec5SDimitry Andric 840b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteALU, [AtomPort01], [AtomPort0]>; 850b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteADC, [AtomPort01], [AtomPort0]>; 860b57cec5SDimitry Andric 87349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIMul8, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 7, 7, [7,7], [7,7], 3, 3>; 88349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIMul16, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 7, 8, [7,7], [8,8], 4, 5>; 89349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIMul16Imm, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [6,6], [7,7], 2, 3>; 90349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIMul16Reg, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [6,6], [7,7], 2, 3>; 91349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIMul32, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [6,6], [7,7], 3, 4>; 920b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteIMul32Imm, [AtomPort0], [AtomPort0], 5, 5, [5], [5]>; 930b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteIMul32Reg, [AtomPort0], [AtomPort0], 5, 5, [5], [5]>; 94349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIMul64, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 12, 12, [12,12], [12,12], 8, 8>; 95349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIMul64Imm, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 14, 14, [14,14], [14,14], 7, 7>; 96349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIMul64Reg, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 12, 12, [12,12], [12,12], 6, 6>; 970b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteIMulH>; 98349cc55cSDimitry Andricdefm : X86WriteResUnsupported<WriteIMulHLd>; 99349cc55cSDimitry Andricdefm : X86WriteResPairUnsupported<WriteMULX32>; 100349cc55cSDimitry Andricdefm : X86WriteResPairUnsupported<WriteMULX64>; 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andricdefm : X86WriteRes<WriteXCHG, [AtomPort01], 2, [2], 1>; 1030b57cec5SDimitry Andricdefm : X86WriteRes<WriteBSWAP32, [AtomPort0], 1, [1], 1>; 1040b57cec5SDimitry Andricdefm : X86WriteRes<WriteBSWAP64, [AtomPort0], 1, [1], 1>; 1050b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteCMPXCHG, [AtomPort01], [AtomPort01], 15, 15, [15]>; 1060b57cec5SDimitry Andricdefm : X86WriteRes<WriteCMPXCHGRMW, [AtomPort01, AtomPort0], 1, [1, 1], 1>; 1070b57cec5SDimitry Andric 108349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteDiv8, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 50, 68, [50,50], [68,68], 9, 9>; 109349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteDiv16, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 50, 50, [50,50], [50,50], 12, 12>; 110349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteDiv32, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 50, 50, [50,50], [50,50], 12, 12>; 111349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteDiv64, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],130,130,[130,130],[130,130], 38, 38>; 112349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIDiv8, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62], 26, 26>; 113349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIDiv16, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62], 29, 29>; 114349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIDiv32, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62], 29, 29>; 115349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteIDiv64, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],130,130,[130,130],[130,130], 60, 60>; 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCRC32>; 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteCMOV, [AtomPort01], [AtomPort0]>; 1200b57cec5SDimitry Andricdefm : X86WriteRes<WriteFCMOV, [AtomPort01], 9, [9], 1>; // x87 conditional move. 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andricdef : WriteRes<WriteSETCC, [AtomPort01]>; 1230b57cec5SDimitry Andricdef : WriteRes<WriteSETCCStore, [AtomPort01]> { 1240b57cec5SDimitry Andric let Latency = 2; 125*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 1260b57cec5SDimitry Andric} 1270b57cec5SDimitry Andricdef : WriteRes<WriteLAHFSAHF, [AtomPort01]> { 1280b57cec5SDimitry Andric let Latency = 2; 129*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 1300b57cec5SDimitry Andric} 1310b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTest, [AtomPort1], 1, [1], 1>; 1320b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestImmLd, [AtomPort0], 1, [1], 1>; 1330b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestRegLd, [AtomPort01], 9, [9], 1>; 1340b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestSet, [AtomPort1], 1, [1], 1>; 1350b57cec5SDimitry Andric//defm : X86WriteRes<WriteBitTestSetImmLd, [AtomPort1], 1, [1], 1>; 1360b57cec5SDimitry Andric//defm : X86WriteRes<WriteBitTestSetRegLd, [AtomPort1], 1, [1], 1>; 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric// This is for simple LEAs with one or two input operands. 1390b57cec5SDimitry Andricdef : WriteRes<WriteLEA, [AtomPort1]>; 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andric// Bit counts. 142349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteBSF, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 16, 16, [16,16], [16,16], 10, 10>; 143349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteBSR, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 16, 16, [16,16], [16,16], 10, 10>; 1440b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePOPCNT>; 1450b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteLZCNT>; 1460b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteTZCNT>; 1470b57cec5SDimitry Andric 1480b57cec5SDimitry Andric// BMI1 BEXTR/BLS, BMI2 BZHI 1490b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteBEXTR>; 1500b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteBLS>; 1510b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteBZHI>; 1520b57cec5SDimitry Andric 1530b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 1540b57cec5SDimitry Andric// Integer shifts and rotates. 1550b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteShift, [AtomPort0], [AtomPort0]>; 1580b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteShiftCL, [AtomPort0], [AtomPort0]>; 1590b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteRotate, [AtomPort0], [AtomPort0]>; 1600b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteRotateCL, [AtomPort0], [AtomPort0]>; 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDrri, [AtomPort01], 2, [2], 1>; 1630b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDrrcl,[AtomPort01], 2, [2], 1>; 1640b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDmri, [AtomPort01], 4, [4], 1>; 1650b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDmrcl,[AtomPort01], 4, [4], 1>; 1660b57cec5SDimitry Andric 1670b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 1680b57cec5SDimitry Andric// Loads, stores, and moves, not folded with other operations. 1690b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andricdef : WriteRes<WriteLoad, [AtomPort0]>; 1720b57cec5SDimitry Andricdef : WriteRes<WriteStore, [AtomPort0]>; 1730b57cec5SDimitry Andricdef : WriteRes<WriteStoreNT, [AtomPort0]>; 1740b57cec5SDimitry Andricdef : WriteRes<WriteMove, [AtomPort01]>; 175fe6060f1SDimitry Andricdefm : X86WriteResUnsupported<WriteVecMaskedGatherWriteback>; 1760b57cec5SDimitry Andric 1770b57cec5SDimitry Andric// Treat misc copies as a move. 1780b57cec5SDimitry Andricdef : InstRW<[WriteMove], (instrs COPY)>; 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 1810b57cec5SDimitry Andric// Idioms that clear a register, like xorps %xmm0, %xmm0. 1820b57cec5SDimitry Andric// These can often bypass execution ports completely. 1830b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andricdef : WriteRes<WriteZero, []>; 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 1880b57cec5SDimitry Andric// Branches don't produce values, so they have no latency, but they still 1890b57cec5SDimitry Andric// consume resources. Indirect branches can fold loads. 1900b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteJump, [AtomPort1], [AtomPort1]>; 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 1950b57cec5SDimitry Andric// Special case scheduling classes. 1960b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 1970b57cec5SDimitry Andric 1980b57cec5SDimitry Andricdef : WriteRes<WriteSystem, [AtomPort01]> { let Latency = 100; } 1990b57cec5SDimitry Andricdef : WriteRes<WriteMicrocoded, [AtomPort01]> { let Latency = 100; } 2000b57cec5SDimitry Andricdef : WriteRes<WriteFence, [AtomPort0]>; 2010b57cec5SDimitry Andric 2020b57cec5SDimitry Andric// Nops don't have dependencies, so there's no actual latency, but we set this 2030b57cec5SDimitry Andric// to '1' to tell the scheduler that the nop uses an ALU slot for a cycle. 2040b57cec5SDimitry Andricdef : WriteRes<WriteNop, [AtomPort01]>; 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 2070b57cec5SDimitry Andric// Floating point. This covers both scalar and vector operations. 2080b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 2090b57cec5SDimitry Andric 2100b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLD0, [AtomPort01], 1, [1], 1>; 2110b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLD1, [AtomPort01], 6, [6], 1>; 2120b57cec5SDimitry Andricdef : WriteRes<WriteFLoad, [AtomPort0]>; 2130b57cec5SDimitry Andricdef : WriteRes<WriteFLoadX, [AtomPort0]>; 2140b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteFLoadY>; 2150b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteFMaskedLoad>; 2160b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteFMaskedLoadY>; 2170b57cec5SDimitry Andric 2180b57cec5SDimitry Andricdef : WriteRes<WriteFStore, [AtomPort0]>; 2190b57cec5SDimitry Andricdef : WriteRes<WriteFStoreX, [AtomPort0]>; 2200b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteFStoreY>; 2210b57cec5SDimitry Andricdef : WriteRes<WriteFStoreNT, [AtomPort0]>; 2220b57cec5SDimitry Andricdef : WriteRes<WriteFStoreNTX, [AtomPort0]>; 2230b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteFStoreNTY>; 2248bcb0991SDimitry Andricdefm : X86WriteResUnsupported<WriteFMaskedStore32>; 2258bcb0991SDimitry Andricdefm : X86WriteResUnsupported<WriteFMaskedStore32Y>; 2268bcb0991SDimitry Andricdefm : X86WriteResUnsupported<WriteFMaskedStore64>; 2278bcb0991SDimitry Andricdefm : X86WriteResUnsupported<WriteFMaskedStore64Y>; 2280b57cec5SDimitry Andric 2290b57cec5SDimitry Andricdef : WriteRes<WriteFMove, [AtomPort01]>; 2300b57cec5SDimitry Andricdef : WriteRes<WriteFMoveX, [AtomPort01]>; 2310b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteFMoveY>; 23204eeddc0SDimitry Andricdefm : X86WriteResUnsupported<WriteFMoveZ>; 2330b57cec5SDimitry Andric 2340b57cec5SDimitry Andricdefm : X86WriteRes<WriteEMMS, [AtomPort01], 5, [5], 1>; 2350b57cec5SDimitry Andric 236fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteFAdd, [AtomPort1], [AtomPort0,AtomPort1], 5, 5, [1], [1,1]>; 237fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteFAddX, [AtomPort1], [AtomPort0,AtomPort1], 5, 5, [1], [1,1]>; 2380b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFAddY>; 2390b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFAddZ>; 240fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteFAdd64, [AtomPort1], [AtomPort0,AtomPort1], 5, 5, [1], [1,1]>; 241349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFAdd64X, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [5,5], [6,6], 3, 4>; 2420b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFAdd64Y>; 2430b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFAdd64Z>; 244fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteFCmp, [AtomPort1], [AtomPort0,AtomPort1], 5, 5, [1], [1,1]>; 245349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFCmpX, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [5,5], [6,6], 3, 4>; 2460b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFCmpY>; 2470b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFCmpZ>; 248fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteFCmp64, [AtomPort1], [AtomPort0,AtomPort1], 5, 5, [1], [1,1]>; 249349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFCmp64X, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [5,5], [6,6], 3, 4>; 2500b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFCmp64Y>; 2510b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFCmp64Z>; 2520b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteFCom, [AtomPort0], [AtomPort0], 5, 5, [5], [5]>; 253349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFComX, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 9, 10, [9,9],[10,10], 4, 5>; 254fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteFMul, [AtomPort0], [AtomPort0], 4, 4, [2], [2]>; 255fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteFMulX, [AtomPort0], [AtomPort0], 5, 5, [2], [2]>; 2560b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMulY>; 2570b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMulZ>; 258fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteFMul64, [AtomPort0], [AtomPort0], 5, 5, [2], [2]>; 259349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFMul64X, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 9, 10, [9,9],[10,10], 6, 7>; 2600b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMul64Y>; 2610b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMul64Z>; 2620b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteFRcp, [AtomPort0], [AtomPort0], 4, 4, [4], [4]>; 263349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFRcpX, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 9, 10, [9,9], [10,10], 5, 6>; 2640b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRcpY>; 2650b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRcpZ>; 2660b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteFRsqrt, [AtomPort0], [AtomPort0], 4, 4, [4], [4]>; 267349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFRsqrtX, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 9, 10, [9,9], [10,10], 5, 6>; 2680b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRsqrtY>; 2690b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRsqrtZ>; 270349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFDiv, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 34, 34, [34,34], [34,34], 3, 4>; 271349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFDivX, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 70, 70, [70,70], [70,70], 6, 7>; 2720b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFDivY>; 2730b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFDivZ>; 274349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFDiv64, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62], 3, 4>; 275349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFDiv64X, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],125,125,[125,125],[125,125], 6, 7>; 2760b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFDiv64Y>; 2770b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFDiv64Z>; 278349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFSqrt, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 34, 34, [34,34], [34,34], 3, 4>; 279349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFSqrtX, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 70, 70, [70,70], [70,70], 5, 6>; 2800b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFSqrtY>; 2810b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFSqrtZ>; 282349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFSqrt64, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62], 3, 4>; 283349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFSqrt64X, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],125,125,[125,125],[125,125], 5, 6>; 2840b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFSqrt64Y>; 2850b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFSqrt64Z>; 286349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFSqrt80, [AtomPort0], [AtomPort0], 71, 71, [71], [71]>; 2870b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteFSign, [AtomPort1], [AtomPort1]>; 2880b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteFRnd, [AtomPort0], [AtomPort0], 5, 5, [5], [5]>; 2890b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRndY>; 2900b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRndZ>; 2910b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteFLogic, [AtomPort01], [AtomPort0]>; 2920b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFLogicY>; 2930b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFLogicZ>; 2940b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteFTest, [AtomPort01], [AtomPort0]>; 2950b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFTestY>; 2960b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFTestZ>; 2970b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteFShuffle, [AtomPort0], [AtomPort0]>; 2980b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFShuffleY>; 2990b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFShuffleZ>; 3000b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarShuffle>; 3010b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarShuffleY>; 3020b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarShuffleZ>; 3030b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMA>; 3040b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMAX>; 3050b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMAY>; 3060b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMAZ>; 3070b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteDPPD>; 3080b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteDPPS>; 3090b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteDPPSY>; 3100b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFBlend>; 3110b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFBlendY>; 3120b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFBlendZ>; 3130b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarBlend>; 3140b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarBlendY>; 3150b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarBlendZ>; 3160b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFShuffle256>; 3170b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarShuffle256>; 3180b57cec5SDimitry Andric 3190b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 3200b57cec5SDimitry Andric// Conversions. 3210b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 3220b57cec5SDimitry Andric 3230eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtSS2I, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 8, 9, [8,8], [9,9], 3, 4>; 3240eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtPS2I, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [6,6], [7,7], 3, 4>; 3250b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPS2IY>; 3260b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPS2IZ>; 3270eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtSD2I, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 8, 9, [8,8],[10,10], 3, 4>; 3280eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtPD2I, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 7, 8, [7,7], [8,8], 4, 5>; 3290b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPD2IY>; 3300b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPD2IZ>; 3310b57cec5SDimitry Andric 3320eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtI2SS, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [6,6], [6,6], 3, 1>; 3330eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtI2PS, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [6,6], [7,7], 3, 4>; 3340b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtI2PSY>; 3350b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtI2PSZ>; 3360eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtI2SD, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [6,6], [7,7], 3, 3>; 3370eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtI2PD, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 7, 8, [6,6], [7,7], 3, 4>; 3380b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtI2PDY>; 3390b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtI2PDZ>; 3400b57cec5SDimitry Andric 3410eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtSS2SD, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 6, 7, [6,6], [7,7], 3, 4>; 3420eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtPS2PD, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 7, 8, [6,6], [7,7], 4, 5>; 3430b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPS2PDY>; 3440b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPS2PDZ>; 3450eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtSD2SS, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 10, 11,[10,10],[12,12], 3, 4>; 3460eae32dcSDimitry Andricdefm : AtomWriteResPair<WriteCvtPD2PS, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 11, 12,[11,11],[12,12], 4, 5>; 3470b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPD2PSY>; 3480b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPD2PSZ>; 3490b57cec5SDimitry Andric 3500b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPH2PS>; 3510b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPH2PSY>; 3520b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPH2PSZ>; 3530b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PH>; 3540b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHSt>; 3550b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHY>; 3560b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHZ>; 3570b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHYSt>; 3580b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHZSt>; 3590b57cec5SDimitry Andric 3600b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 3610b57cec5SDimitry Andric// Vector integer operations. 3620b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 3630b57cec5SDimitry Andric 3640b57cec5SDimitry Andricdef : WriteRes<WriteVecLoad, [AtomPort0]>; 3650b57cec5SDimitry Andricdef : WriteRes<WriteVecLoadX, [AtomPort0]>; 3660b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteVecLoadY>; 3670b57cec5SDimitry Andricdef : WriteRes<WriteVecLoadNT, [AtomPort0]>; 3680b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteVecLoadNTY>; 3690b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteVecMaskedLoad>; 3700b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteVecMaskedLoadY>; 3710b57cec5SDimitry Andric 3720b57cec5SDimitry Andricdef : WriteRes<WriteVecStore, [AtomPort0]>; 3730b57cec5SDimitry Andricdef : WriteRes<WriteVecStoreX, [AtomPort0]>; 3740b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteVecStoreY>; 3750b57cec5SDimitry Andricdef : WriteRes<WriteVecStoreNT, [AtomPort0]>; 3760b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteVecStoreNTY>; 3775ffd83dbSDimitry Andricdefm : X86WriteResUnsupported<WriteVecMaskedStore32>; 3785ffd83dbSDimitry Andricdefm : X86WriteResUnsupported<WriteVecMaskedStore64>; 3795ffd83dbSDimitry Andricdefm : X86WriteResUnsupported<WriteVecMaskedStore32Y>; 3805ffd83dbSDimitry Andricdefm : X86WriteResUnsupported<WriteVecMaskedStore64Y>; 3810b57cec5SDimitry Andric 3820b57cec5SDimitry Andricdef : WriteRes<WriteVecMove, [AtomPort0]>; 3830b57cec5SDimitry Andricdef : WriteRes<WriteVecMoveX, [AtomPort01]>; 3840b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteVecMoveY>; 38504eeddc0SDimitry Andricdefm : X86WriteResUnsupported<WriteVecMoveZ>; 3860b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveToGpr, [AtomPort0], 3, [3], 1>; 3870b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveFromGpr, [AtomPort0], 1, [1], 1>; 3880b57cec5SDimitry Andric 3890b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteVecALU, [AtomPort01], [AtomPort0], 1, 1>; 3900b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteVecALUX, [AtomPort01], [AtomPort0], 1, 1>; 3910b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecALUY>; 3920b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecALUZ>; 3930b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteVecLogic, [AtomPort01], [AtomPort0], 1, 1>; 3940b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteVecLogicX, [AtomPort01], [AtomPort0], 1, 1>; 3950b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecLogicY>; 3960b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecLogicZ>; 397fe6060f1SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecTest>; 3980b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecTestY>; 3990b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecTestZ>; 400349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteVecShift, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 2, 3, [1,1], [2,2], 2, 3>; 401349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteVecShiftX, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 2, 3, [1,1], [2,2], 2, 3>; 4020b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecShiftY>; 4030b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecShiftZ>; 404fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteVecShiftImm, [AtomPort0], [AtomPort0], 1, 1>; 405fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteVecShiftImmX, [AtomPort0], [AtomPort0], 1, 1>; 4060b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecShiftImmY>; 4070b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecShiftImmZ>; 408fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteVecIMul, [AtomPort0], [AtomPort0], 4, 4, [1], [1]>; 409fe6060f1SDimitry Andricdefm : AtomWriteResPair<WriteVecIMulX, [AtomPort0], [AtomPort0], 5, 5, [2], [2]>; 4100b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecIMulY>; 4110b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecIMulZ>; 4120b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePMULLD>; 4130b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePMULLDY>; 4140b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePMULLDZ>; 4150b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePHMINPOS>; 4160b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteMPSAD>; 4170b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteMPSADY>; 4180b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteMPSADZ>; 419fe6060f1SDimitry Andricdefm : AtomWriteResPair<WritePSADBW, [AtomPort0], [AtomPort0], 4, 4, [1], [1]>; 420fe6060f1SDimitry Andricdefm : AtomWriteResPair<WritePSADBWX, [AtomPort0], [AtomPort0], 5, 5, [2], [2]>; 4210b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePSADBWY>; 4220b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePSADBWZ>; 4230b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteShuffle, [AtomPort0], [AtomPort0], 1, 1>; 4240b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteShuffleX, [AtomPort0], [AtomPort0], 1, 1>; 4250b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteShuffleY>; 4260b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteShuffleZ>; 4270b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteVarShuffle, [AtomPort0], [AtomPort0], 1, 1>; 428349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteVarShuffleX, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 4, 5, [3,3], [4,4], 4, 5>; 4290b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarShuffleY>; 4300b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarShuffleZ>; 4310b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteBlend>; 4320b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteBlendY>; 4330b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteBlendZ>; 4340b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarBlend>; 4350b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarBlendY>; 4360b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarBlendZ>; 4370b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteShuffle256>; 438fe6060f1SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVPMOV256>; 4390b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarShuffle256>; 4400b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarVecShift>; 4410b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarVecShiftY>; 4420b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarVecShiftZ>; 4430b57cec5SDimitry Andric 4440b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4450b57cec5SDimitry Andric// Vector insert/extract operations. 4460b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4470b57cec5SDimitry Andric 4480b57cec5SDimitry Andricdefm : AtomWriteResPair<WriteVecInsert, [AtomPort0], [AtomPort0], 1, 1>; 4490b57cec5SDimitry Andricdef : WriteRes<WriteVecExtract, [AtomPort0]>; 4500b57cec5SDimitry Andricdef : WriteRes<WriteVecExtractSt, [AtomPort0]>; 4510b57cec5SDimitry Andric 4520b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4530b57cec5SDimitry Andric// SSE42 String instructions. 4540b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4550b57cec5SDimitry Andric 4560b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePCmpIStrI>; 4570b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePCmpIStrM>; 4580b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePCmpEStrI>; 4590b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePCmpEStrM>; 4600b57cec5SDimitry Andric 4610b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4620b57cec5SDimitry Andric// MOVMSK Instructions. 4630b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4640b57cec5SDimitry Andric 465*5f757f3fSDimitry Andricdef : WriteRes<WriteFMOVMSK, [AtomPort0]> { let Latency = 3; let ReleaseAtCycles = [3]; } 466*5f757f3fSDimitry Andricdef : WriteRes<WriteVecMOVMSK, [AtomPort0]> { let Latency = 3; let ReleaseAtCycles = [3]; } 4670b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteVecMOVMSKY>; 468*5f757f3fSDimitry Andricdef : WriteRes<WriteMMXMOVMSK, [AtomPort0]> { let Latency = 3; let ReleaseAtCycles = [3]; } 4690b57cec5SDimitry Andric 4700b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4710b57cec5SDimitry Andric// AES instructions. 4720b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4730b57cec5SDimitry Andric 4740b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteAESIMC>; 4750b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteAESKeyGen>; 4760b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteAESDecEnc>; 4770b57cec5SDimitry Andric 4780b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4790b57cec5SDimitry Andric// Horizontal add/sub instructions. 4800b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4810b57cec5SDimitry Andric 482349cc55cSDimitry Andricdefm : AtomWriteResPair<WriteFHAdd, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 8, 9, [8,8], [9,9], 5, 6>; 483349cc55cSDimitry Andricdefm : X86WriteResPairUnsupported<WriteFHAddY>; 484349cc55cSDimitry Andricdefm : AtomWriteResPair<WritePHAdd, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 3, 4, [3,3], [4,4], 3, 4>; 485349cc55cSDimitry Andricdefm : AtomWriteResPair<WritePHAddX, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 7, 8, [7,7], [8,8], 3, 4>; 486349cc55cSDimitry Andricdefm : X86WriteResPairUnsupported<WritePHAddY>; 4870b57cec5SDimitry Andric 4880b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4890b57cec5SDimitry Andric// Carry-less multiplication instructions. 4900b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4910b57cec5SDimitry Andric 4920b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCLMul>; 4930b57cec5SDimitry Andric 4940b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4950b57cec5SDimitry Andric// Load/store MXCSR. 4960b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4970b57cec5SDimitry Andric 498349cc55cSDimitry Andricdefm : X86WriteRes<WriteLDMXCSR, [AtomPort0,AtomPort1], 5, [5,5], 4>; 499349cc55cSDimitry Andricdefm : X86WriteRes<WriteSTMXCSR, [AtomPort0,AtomPort1], 15, [15,15], 4>; 5000b57cec5SDimitry Andric 5010b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 5020b57cec5SDimitry Andric// Special Cases. 5030b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 5040b57cec5SDimitry Andric 5050b57cec5SDimitry Andric// Port0 5060b57cec5SDimitry Andricdef AtomWrite0_1 : SchedWriteRes<[AtomPort0]> { 5070b57cec5SDimitry Andric let Latency = 1; 508*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 5090b57cec5SDimitry Andric} 510fe6060f1SDimitry Andricdef : InstRW<[AtomWrite0_1], (instrs XAM_F, LD_Frr, 5110b57cec5SDimitry Andric MOVSX64rr32)>; 5120b57cec5SDimitry Andricdef : SchedAlias<WriteALURMW, AtomWrite0_1>; 5130b57cec5SDimitry Andricdef : SchedAlias<WriteADCRMW, AtomWrite0_1>; 5140b57cec5SDimitry Andricdef : InstRW<[AtomWrite0_1], (instregex "(RCL|RCR|ROL|ROR|SAR|SHL|SHR)(8|16|32|64)m", 5150b57cec5SDimitry Andric "MOV(S|Z)X(32|64)rr(8|8_NOREX|16)")>; 5160b57cec5SDimitry Andric 5170b57cec5SDimitry Andric// Port1 5180b57cec5SDimitry Andricdef AtomWrite1_1 : SchedWriteRes<[AtomPort1]> { 5190b57cec5SDimitry Andric let Latency = 1; 520*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 5210b57cec5SDimitry Andric} 5220b57cec5SDimitry Andricdef : InstRW<[AtomWrite1_1], (instrs FCOMPP)>; 5230b57cec5SDimitry Andricdef : InstRW<[AtomWrite1_1], (instregex "UCOM_F(P|PP)?r")>; 5240b57cec5SDimitry Andric 5250b57cec5SDimitry Andricdef AtomWrite1_5 : SchedWriteRes<[AtomPort1]> { 5260b57cec5SDimitry Andric let Latency = 5; 527*5f757f3fSDimitry Andric let ReleaseAtCycles = [5]; 5280b57cec5SDimitry Andric} 5290eae32dcSDimitry Andricdef : InstRW<[AtomWrite1_5], (instrs MMX_CVTPI2PSrr, MMX_CVTPI2PSrm, 5300eae32dcSDimitry Andric MMX_CVTPS2PIrr, MMX_CVTTPS2PIrr)>; 5310b57cec5SDimitry Andric 5320b57cec5SDimitry Andric// Port0 and Port1 5330b57cec5SDimitry Andricdef AtomWrite0_1_1 : SchedWriteRes<[AtomPort0, AtomPort1]> { 5340b57cec5SDimitry Andric let Latency = 1; 535*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 1]; 5360b57cec5SDimitry Andric} 5370b57cec5SDimitry Andricdef : InstRW<[AtomWrite0_1_1], (instrs POP32r, POP64r, 5380b57cec5SDimitry Andric POP16rmr, POP32rmr, POP64rmr, 5390b57cec5SDimitry Andric PUSH16r, PUSH32r, PUSH64r, 54006c3fb27SDimitry Andric PUSH16i, PUSH32i, 5410b57cec5SDimitry Andric PUSH16rmr, PUSH32rmr, PUSH64rmr, 5420b57cec5SDimitry Andric PUSH16i8, PUSH32i8, PUSH64i8, PUSH64i32, 5430b57cec5SDimitry Andric XCH_F)>; 544349cc55cSDimitry Andricdef : InstRW<[AtomWrite0_1_1], (instregex "RETI(16|32|64)$", 5450b57cec5SDimitry Andric "IRET(16|32|64)?")>; 5460b57cec5SDimitry Andric 5470b57cec5SDimitry Andricdef AtomWrite0_1_5 : SchedWriteRes<[AtomPort0, AtomPort1]> { 5480b57cec5SDimitry Andric let Latency = 5; 549*5f757f3fSDimitry Andric let ReleaseAtCycles = [5, 5]; 5500b57cec5SDimitry Andric} 5510eae32dcSDimitry Andricdef : InstRW<[AtomWrite0_1_5], (instrs MMX_CVTPS2PIrm, MMX_CVTTPS2PIrm)>; 5520b57cec5SDimitry Andricdef : InstRW<[AtomWrite0_1_5], (instregex "ILD_F(16|32|64)")>; 5530b57cec5SDimitry Andric 5540eae32dcSDimitry Andricdef AtomWrite0_1_7 : SchedWriteRes<[AtomPort0,AtomPort1]> { 5550eae32dcSDimitry Andric let Latency = 7; 556*5f757f3fSDimitry Andric let ReleaseAtCycles = [6,6]; 5570eae32dcSDimitry Andric} 5580eae32dcSDimitry Andricdef : InstRW<[AtomWrite0_1_7], (instregex "CVTSI642SDrm(_Int)?")>; 5590eae32dcSDimitry Andric 5600eae32dcSDimitry Andricdef AtomWrite0_1_7_4 : SchedWriteRes<[AtomPort0,AtomPort1]> { 5610eae32dcSDimitry Andric let Latency = 7; 562*5f757f3fSDimitry Andric let ReleaseAtCycles = [8,8]; 5630eae32dcSDimitry Andric let NumMicroOps = 4; 5640eae32dcSDimitry Andric} 5650eae32dcSDimitry Andricdef : InstRW<[AtomWrite0_1_7_4], (instregex "CVTSI642SSrr(_Int)?")>; 5660eae32dcSDimitry Andric 5670eae32dcSDimitry Andricdef AtomWrite0_1_8_4 : SchedWriteRes<[AtomPort0,AtomPort1]> { 5680eae32dcSDimitry Andric let Latency = 8; 569*5f757f3fSDimitry Andric let ReleaseAtCycles = [8,8]; 5700eae32dcSDimitry Andric let NumMicroOps = 4; 5710eae32dcSDimitry Andric} 5720eae32dcSDimitry Andricdef : InstRW<[AtomWrite0_1_7_4], (instregex "CVTSI642SSrm(_Int)?")>; 5730eae32dcSDimitry Andric 5740eae32dcSDimitry Andricdef AtomWrite0_1_9 : SchedWriteRes<[AtomPort0,AtomPort1]> { 5750eae32dcSDimitry Andric let Latency = 9; 576*5f757f3fSDimitry Andric let ReleaseAtCycles = [9,9]; 5770eae32dcSDimitry Andric let NumMicroOps = 4; 5780eae32dcSDimitry Andric} 5790eae32dcSDimitry Andricdef : InstRW<[AtomWrite0_1_9], (instregex "CVT(T)?SS2SI64rr(_Int)?")>; 5800eae32dcSDimitry Andric 5810eae32dcSDimitry Andricdef AtomWrite0_1_10 : SchedWriteRes<[AtomPort0,AtomPort1]> { 5820eae32dcSDimitry Andric let Latency = 10; 583*5f757f3fSDimitry Andric let ReleaseAtCycles = [11,11]; 5840eae32dcSDimitry Andric let NumMicroOps = 5; 5850eae32dcSDimitry Andric} 5860eae32dcSDimitry Andricdef : InstRW<[AtomWrite0_1_10], (instregex "CVT(T)?SS2SI64rm(_Int)?")>; 5870eae32dcSDimitry Andric 5880b57cec5SDimitry Andric// Port0 or Port1 5890b57cec5SDimitry Andricdef AtomWrite01_1 : SchedWriteRes<[AtomPort01]> { 5900b57cec5SDimitry Andric let Latency = 1; 591*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 5920b57cec5SDimitry Andric} 5930b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_1], (instrs FDECSTP, FFREE, FFREEP, FINCSTP, WAIT, 5940b57cec5SDimitry Andric LFENCE, 5950b57cec5SDimitry Andric STOSB, STOSL, STOSQ, STOSW, 596349cc55cSDimitry Andric MOVSSrr, MOVSSrr_REV)>; 5970b57cec5SDimitry Andric 5980b57cec5SDimitry Andricdef AtomWrite01_2 : SchedWriteRes<[AtomPort01]> { 5990b57cec5SDimitry Andric let Latency = 2; 600*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 6010b57cec5SDimitry Andric} 6020b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_2], (instrs LEAVE, LEAVE64, POP16r, 6030b57cec5SDimitry Andric PUSH16rmm, PUSH32rmm, PUSH64rmm, 6040b57cec5SDimitry Andric LODSB, LODSL, LODSQ, LODSW, 6050b57cec5SDimitry Andric SCASB, SCASL, SCASQ, SCASW)>; 6060b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_2], (instregex "PUSH(CS|DS|ES|FS|GS|SS)(16|32|64)", 6070b57cec5SDimitry Andric "(ST|ISTT)_F(P)?(16|32|64)?(m|rr)", 6080eae32dcSDimitry Andric "MMX_P(ADD|SUB)Qrr", 6090b57cec5SDimitry Andric "MOV(S|Z)X16rr8", 6100b57cec5SDimitry Andric "MOV(UPS|UPD|DQU)mr", 6110b57cec5SDimitry Andric "MASKMOVDQU(64)?", 6120b57cec5SDimitry Andric "P(ADD|SUB)Qrr")>; 6130b57cec5SDimitry Andricdef : SchedAlias<WriteBitTestSetImmRMW, AtomWrite01_2>; 6140b57cec5SDimitry Andric 6150b57cec5SDimitry Andricdef AtomWrite01_3 : SchedWriteRes<[AtomPort01]> { 6160b57cec5SDimitry Andric let Latency = 3; 617*5f757f3fSDimitry Andric let ReleaseAtCycles = [3]; 6180b57cec5SDimitry Andric} 6190b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_3], (instrs CLD, LDDQUrm, 6200b57cec5SDimitry Andric CMPSB, CMPSL, CMPSQ, CMPSW, 6210b57cec5SDimitry Andric MOVSB, MOVSL, MOVSQ, MOVSW, 6220b57cec5SDimitry Andric POP16rmm, POP32rmm, POP64rmm)>; 6230b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_3], (instregex "XADD(8|16|32|64)rm", 6240b57cec5SDimitry Andric "XCHG(8|16|32|64)rm", 6250b57cec5SDimitry Andric "PH(ADD|SUB)Drr", 6260b57cec5SDimitry Andric "MOV(S|Z)X16rm8", 6270eae32dcSDimitry Andric "MMX_P(ADD|SUB)Qrm", 6280b57cec5SDimitry Andric "MOV(UPS|UPD|DQU)rm", 6290b57cec5SDimitry Andric "P(ADD|SUB)Qrm")>; 6300b57cec5SDimitry Andric 6310b57cec5SDimitry Andricdef AtomWrite01_4 : SchedWriteRes<[AtomPort01]> { 6320b57cec5SDimitry Andric let Latency = 4; 633*5f757f3fSDimitry Andric let ReleaseAtCycles = [4]; 6340b57cec5SDimitry Andric} 6350b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_4], (instrs CBW, CWD, CWDE, CDQ, CDQE, CQO, 6360b57cec5SDimitry Andric JCXZ, JECXZ, JRCXZ, 6370b57cec5SDimitry Andric LD_F80m)>; 6380b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_4], (instregex "PH(ADD|SUB)Drm", 6390b57cec5SDimitry Andric "(MMX_)?PEXTRWrr(_REV)?")>; 6400b57cec5SDimitry Andric 6410b57cec5SDimitry Andricdef AtomWrite01_5 : SchedWriteRes<[AtomPort01]> { 6420b57cec5SDimitry Andric let Latency = 5; 643*5f757f3fSDimitry Andric let ReleaseAtCycles = [5]; 6440b57cec5SDimitry Andric} 6450b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_5], (instrs FLDCW16m, ST_FP80m)>; 6460b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_5], (instregex "MMX_PH(ADD|SUB)S?Wrr")>; 6470b57cec5SDimitry Andric 6480b57cec5SDimitry Andricdef AtomWrite01_6 : SchedWriteRes<[AtomPort01]> { 6490b57cec5SDimitry Andric let Latency = 6; 650*5f757f3fSDimitry Andric let ReleaseAtCycles = [6]; 6510b57cec5SDimitry Andric} 6520b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_6], (instrs CMPXCHG8rm, INTO, XLAT, 6530b57cec5SDimitry Andric SHLD16rrCL, SHRD16rrCL, 6540b57cec5SDimitry Andric SHLD16rri8, SHRD16rri8, 6550b57cec5SDimitry Andric SHLD16mrCL, SHRD16mrCL, 6560b57cec5SDimitry Andric SHLD16mri8, SHRD16mri8)>; 6570b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_6], (instregex "IST_F(P)?(16|32|64)?m", 6580b57cec5SDimitry Andric "MMX_PH(ADD|SUB)S?Wrm")>; 6590b57cec5SDimitry Andric 6600b57cec5SDimitry Andricdef AtomWrite01_7 : SchedWriteRes<[AtomPort01]> { 6610b57cec5SDimitry Andric let Latency = 7; 662*5f757f3fSDimitry Andric let ReleaseAtCycles = [7]; 6630b57cec5SDimitry Andric} 6640b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_7], (instrs AAD8i8)>; 6650b57cec5SDimitry Andric 6660b57cec5SDimitry Andricdef AtomWrite01_8 : SchedWriteRes<[AtomPort01]> { 6670b57cec5SDimitry Andric let Latency = 8; 668*5f757f3fSDimitry Andric let ReleaseAtCycles = [8]; 6690b57cec5SDimitry Andric} 6700b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_8], (instrs LOOPE, 6710b57cec5SDimitry Andric PUSHA16, PUSHA32, 6720b57cec5SDimitry Andric SHLD64rrCL, SHRD64rrCL, 6730b57cec5SDimitry Andric FNSTCW16m)>; 6740b57cec5SDimitry Andric 6750b57cec5SDimitry Andricdef AtomWrite01_9 : SchedWriteRes<[AtomPort01]> { 6760b57cec5SDimitry Andric let Latency = 9; 677*5f757f3fSDimitry Andric let ReleaseAtCycles = [9]; 6780b57cec5SDimitry Andric} 6790b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_9], (instrs POPA16, POPA32, 6800b57cec5SDimitry Andric PUSHF16, PUSHF32, PUSHF64, 6810b57cec5SDimitry Andric SHLD64mrCL, SHRD64mrCL, 6820b57cec5SDimitry Andric SHLD64mri8, SHRD64mri8, 6830b57cec5SDimitry Andric SHLD64rri8, SHRD64rri8, 6840b57cec5SDimitry Andric CMPXCHG8rr)>; 6850eae32dcSDimitry Andricdef : InstRW<[AtomWrite01_9], (instregex "(U)?COM_FI", "TST_F")>; 6860b57cec5SDimitry Andric 6870b57cec5SDimitry Andricdef AtomWrite01_10 : SchedWriteRes<[AtomPort01]> { 6880b57cec5SDimitry Andric let Latency = 10; 689*5f757f3fSDimitry Andric let ReleaseAtCycles = [10]; 6900b57cec5SDimitry Andric} 6910b57cec5SDimitry Andricdef : SchedAlias<WriteFLDC, AtomWrite01_10>; 6920b57cec5SDimitry Andric 6930b57cec5SDimitry Andricdef AtomWrite01_11 : SchedWriteRes<[AtomPort01]> { 6940b57cec5SDimitry Andric let Latency = 11; 695*5f757f3fSDimitry Andric let ReleaseAtCycles = [11]; 6960b57cec5SDimitry Andric} 6970b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_11], (instrs BOUNDS16rm, BOUNDS32rm)>; 6980b57cec5SDimitry Andricdef : SchedAlias<WriteBitTestSetRegRMW, AtomWrite01_11>; 6990b57cec5SDimitry Andric 7000b57cec5SDimitry Andricdef AtomWrite01_13 : SchedWriteRes<[AtomPort01]> { 7010b57cec5SDimitry Andric let Latency = 13; 702*5f757f3fSDimitry Andric let ReleaseAtCycles = [13]; 7030b57cec5SDimitry Andric} 7040b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_13], (instrs AAA, AAS)>; 7050b57cec5SDimitry Andric 7060b57cec5SDimitry Andricdef AtomWrite01_14 : SchedWriteRes<[AtomPort01]> { 7070b57cec5SDimitry Andric let Latency = 14; 708*5f757f3fSDimitry Andric let ReleaseAtCycles = [14]; 7090b57cec5SDimitry Andric} 7100b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_14], (instrs CMPXCHG16rm, CMPXCHG32rm, CMPXCHG64rm)>; 7110b57cec5SDimitry Andric 7120b57cec5SDimitry Andricdef AtomWrite01_17 : SchedWriteRes<[AtomPort01]> { 7130b57cec5SDimitry Andric let Latency = 17; 714*5f757f3fSDimitry Andric let ReleaseAtCycles = [17]; 7150b57cec5SDimitry Andric} 7160b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_17], (instrs LOOPNE, PAUSE)>; 7170b57cec5SDimitry Andric 7180b57cec5SDimitry Andricdef AtomWrite01_18 : SchedWriteRes<[AtomPort01]> { 7190b57cec5SDimitry Andric let Latency = 18; 720*5f757f3fSDimitry Andric let ReleaseAtCycles = [18]; 7210b57cec5SDimitry Andric} 7220b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_18], (instrs CMPXCHG8B, DAA, LOOP)>; 7230b57cec5SDimitry Andric 7240b57cec5SDimitry Andricdef AtomWrite01_20 : SchedWriteRes<[AtomPort01]> { 7250b57cec5SDimitry Andric let Latency = 20; 726*5f757f3fSDimitry Andric let ReleaseAtCycles = [20]; 7270b57cec5SDimitry Andric} 7280b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_20], (instrs DAS)>; 7290b57cec5SDimitry Andric 7300b57cec5SDimitry Andricdef AtomWrite01_21 : SchedWriteRes<[AtomPort01]> { 7310b57cec5SDimitry Andric let Latency = 21; 732*5f757f3fSDimitry Andric let ReleaseAtCycles = [21]; 7330b57cec5SDimitry Andric} 7340b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_21], (instrs AAM8i8, STD)>; 7350b57cec5SDimitry Andric 7360b57cec5SDimitry Andricdef AtomWrite01_22 : SchedWriteRes<[AtomPort01]> { 7370b57cec5SDimitry Andric let Latency = 22; 738*5f757f3fSDimitry Andric let ReleaseAtCycles = [22]; 7390b57cec5SDimitry Andric} 7400b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_22], (instrs CMPXCHG16B)>; 7410b57cec5SDimitry Andric 7420b57cec5SDimitry Andricdef AtomWrite01_23 : SchedWriteRes<[AtomPort01]> { 7430b57cec5SDimitry Andric let Latency = 23; 744*5f757f3fSDimitry Andric let ReleaseAtCycles = [23]; 7450b57cec5SDimitry Andric} 7460b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_23], (instrs ARPL16mr, ARPL16rr)>; 7470b57cec5SDimitry Andric 7480b57cec5SDimitry Andricdef AtomWrite01_25 : SchedWriteRes<[AtomPort01]> { 7490b57cec5SDimitry Andric let Latency = 25; 750*5f757f3fSDimitry Andric let ReleaseAtCycles = [25]; 7510b57cec5SDimitry Andric} 7520b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_25], (instrs FNCLEX, FXTRACT)>; 7530b57cec5SDimitry Andric 7540b57cec5SDimitry Andricdef AtomWrite01_26 : SchedWriteRes<[AtomPort01]> { 7550b57cec5SDimitry Andric let Latency = 26; 756*5f757f3fSDimitry Andric let ReleaseAtCycles = [26]; 7570b57cec5SDimitry Andric} 7580b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_26], (instrs POPF32, POPF64)>; 7590b57cec5SDimitry Andric 7600b57cec5SDimitry Andricdef AtomWrite01_29 : SchedWriteRes<[AtomPort01]> { 7610b57cec5SDimitry Andric let Latency = 29; 762*5f757f3fSDimitry Andric let ReleaseAtCycles = [29]; 7630b57cec5SDimitry Andric} 7640b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_29], (instregex "POP(DS|ES|FS|GS)(16|32|64)")>; 7650b57cec5SDimitry Andric 7660b57cec5SDimitry Andricdef AtomWrite01_30 : SchedWriteRes<[AtomPort01]> { 7670b57cec5SDimitry Andric let Latency = 30; 768*5f757f3fSDimitry Andric let ReleaseAtCycles = [30]; 7690b57cec5SDimitry Andric} 7700b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_30], (instrs RDTSC, RDTSCP)>; 7710b57cec5SDimitry Andric 7720b57cec5SDimitry Andricdef AtomWrite01_32 : SchedWriteRes<[AtomPort01]> { 7730b57cec5SDimitry Andric let Latency = 32; 774*5f757f3fSDimitry Andric let ReleaseAtCycles = [32]; 7750b57cec5SDimitry Andric} 7760b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_32], (instrs ENTER, POPF16)>; 7770b57cec5SDimitry Andric 7780b57cec5SDimitry Andricdef AtomWrite01_45 : SchedWriteRes<[AtomPort01]> { 7790b57cec5SDimitry Andric let Latency = 45; 780*5f757f3fSDimitry Andric let ReleaseAtCycles = [45]; 7810b57cec5SDimitry Andric} 7820b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_45], (instrs MONITOR32rrr, MONITOR64rrr)>; 7830b57cec5SDimitry Andric 7840b57cec5SDimitry Andricdef AtomWrite01_46 : SchedWriteRes<[AtomPort01]> { 7850b57cec5SDimitry Andric let Latency = 46; 786*5f757f3fSDimitry Andric let ReleaseAtCycles = [46]; 7870b57cec5SDimitry Andric} 7880b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_46], (instrs FRNDINT, MWAITrr, RDPMC)>; 7890b57cec5SDimitry Andric 7900b57cec5SDimitry Andricdef AtomWrite01_48 : SchedWriteRes<[AtomPort01]> { 7910b57cec5SDimitry Andric let Latency = 48; 792*5f757f3fSDimitry Andric let ReleaseAtCycles = [48]; 7930b57cec5SDimitry Andric} 7940b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_48], (instrs POPSS16, POPSS32)>; 7950b57cec5SDimitry Andric 7960b57cec5SDimitry Andricdef AtomWrite01_55 : SchedWriteRes<[AtomPort01]> { 7970b57cec5SDimitry Andric let Latency = 55; 798*5f757f3fSDimitry Andric let ReleaseAtCycles = [55]; 7990b57cec5SDimitry Andric} 8000b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_55], (instrs FPREM)>; 8010b57cec5SDimitry Andric 8020b57cec5SDimitry Andricdef AtomWrite01_59 : SchedWriteRes<[AtomPort01]> { 8030b57cec5SDimitry Andric let Latency = 59; 804*5f757f3fSDimitry Andric let ReleaseAtCycles = [59]; 8050b57cec5SDimitry Andric} 8060b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_59], (instrs INSB, INSL, INSW)>; 8070b57cec5SDimitry Andric 8080b57cec5SDimitry Andricdef AtomWrite01_63 : SchedWriteRes<[AtomPort01]> { 8090b57cec5SDimitry Andric let Latency = 63; 810*5f757f3fSDimitry Andric let ReleaseAtCycles = [63]; 8110b57cec5SDimitry Andric} 8120b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_63], (instrs FNINIT)>; 8130b57cec5SDimitry Andric 8140b57cec5SDimitry Andricdef AtomWrite01_68 : SchedWriteRes<[AtomPort01]> { 8150b57cec5SDimitry Andric let Latency = 68; 816*5f757f3fSDimitry Andric let ReleaseAtCycles = [68]; 8170b57cec5SDimitry Andric} 8180b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_68], (instrs OUT8rr, OUT16rr, OUT32rr)>; 8190b57cec5SDimitry Andric 8200b57cec5SDimitry Andricdef AtomWrite01_71 : SchedWriteRes<[AtomPort01]> { 8210b57cec5SDimitry Andric let Latency = 71; 822*5f757f3fSDimitry Andric let ReleaseAtCycles = [71]; 8230b57cec5SDimitry Andric} 8240b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_71], (instrs FPREM1, 8250b57cec5SDimitry Andric INVLPG, INVLPGA32, INVLPGA64)>; 8260b57cec5SDimitry Andric 8270b57cec5SDimitry Andricdef AtomWrite01_72 : SchedWriteRes<[AtomPort01]> { 8280b57cec5SDimitry Andric let Latency = 72; 829*5f757f3fSDimitry Andric let ReleaseAtCycles = [72]; 8300b57cec5SDimitry Andric} 8310b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_72], (instrs OUT8ir, OUT16ir, OUT32ir)>; 8320b57cec5SDimitry Andric 8330b57cec5SDimitry Andricdef AtomWrite01_74 : SchedWriteRes<[AtomPort01]> { 8340b57cec5SDimitry Andric let Latency = 74; 835*5f757f3fSDimitry Andric let ReleaseAtCycles = [74]; 8360b57cec5SDimitry Andric} 8370b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_74], (instrs OUTSB, OUTSL, OUTSW)>; 8380b57cec5SDimitry Andric 8390b57cec5SDimitry Andricdef AtomWrite01_77 : SchedWriteRes<[AtomPort01]> { 8400b57cec5SDimitry Andric let Latency = 77; 841*5f757f3fSDimitry Andric let ReleaseAtCycles = [77]; 8420b57cec5SDimitry Andric} 8430b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_77], (instrs FSCALE)>; 8440b57cec5SDimitry Andric 8450b57cec5SDimitry Andricdef AtomWrite01_78 : SchedWriteRes<[AtomPort01]> { 8460b57cec5SDimitry Andric let Latency = 78; 847*5f757f3fSDimitry Andric let ReleaseAtCycles = [78]; 8480b57cec5SDimitry Andric} 8490b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_78], (instrs RDMSR)>; 8500b57cec5SDimitry Andric 8510b57cec5SDimitry Andricdef AtomWrite01_79 : SchedWriteRes<[AtomPort01]> { 8520b57cec5SDimitry Andric let Latency = 79; 853*5f757f3fSDimitry Andric let ReleaseAtCycles = [79]; 8540b57cec5SDimitry Andric} 855349cc55cSDimitry Andricdef : InstRW<[AtomWrite01_79], (instregex "RET(16|32|64)?$", 856349cc55cSDimitry Andric "LRETI?(16|32|64)")>; 8570b57cec5SDimitry Andric 8580b57cec5SDimitry Andricdef AtomWrite01_92 : SchedWriteRes<[AtomPort01]> { 8590b57cec5SDimitry Andric let Latency = 92; 860*5f757f3fSDimitry Andric let ReleaseAtCycles = [92]; 8610b57cec5SDimitry Andric} 8620b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_92], (instrs IN8ri, IN16ri, IN32ri)>; 8630b57cec5SDimitry Andric 8640b57cec5SDimitry Andricdef AtomWrite01_94 : SchedWriteRes<[AtomPort01]> { 8650b57cec5SDimitry Andric let Latency = 94; 866*5f757f3fSDimitry Andric let ReleaseAtCycles = [94]; 8670b57cec5SDimitry Andric} 8680b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_94], (instrs IN8rr, IN16rr, IN32rr)>; 8690b57cec5SDimitry Andric 8700b57cec5SDimitry Andricdef AtomWrite01_99 : SchedWriteRes<[AtomPort01]> { 8710b57cec5SDimitry Andric let Latency = 99; 872*5f757f3fSDimitry Andric let ReleaseAtCycles = [99]; 8730b57cec5SDimitry Andric} 8740b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_99], (instrs F2XM1)>; 8750b57cec5SDimitry Andric 8760b57cec5SDimitry Andricdef AtomWrite01_121 : SchedWriteRes<[AtomPort01]> { 8770b57cec5SDimitry Andric let Latency = 121; 878*5f757f3fSDimitry Andric let ReleaseAtCycles = [121]; 8790b57cec5SDimitry Andric} 8800b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_121], (instrs CPUID)>; 8810b57cec5SDimitry Andric 8820b57cec5SDimitry Andricdef AtomWrite01_127 : SchedWriteRes<[AtomPort01]> { 8830b57cec5SDimitry Andric let Latency = 127; 884*5f757f3fSDimitry Andric let ReleaseAtCycles = [127]; 8850b57cec5SDimitry Andric} 8860b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_127], (instrs INT)>; 8870b57cec5SDimitry Andric 8880b57cec5SDimitry Andricdef AtomWrite01_130 : SchedWriteRes<[AtomPort01]> { 8890b57cec5SDimitry Andric let Latency = 130; 890*5f757f3fSDimitry Andric let ReleaseAtCycles = [130]; 8910b57cec5SDimitry Andric} 8920b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_130], (instrs INT3)>; 8930b57cec5SDimitry Andric 8940b57cec5SDimitry Andricdef AtomWrite01_140 : SchedWriteRes<[AtomPort01]> { 8950b57cec5SDimitry Andric let Latency = 140; 896*5f757f3fSDimitry Andric let ReleaseAtCycles = [140]; 8970b57cec5SDimitry Andric} 8980b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_140], (instrs FXSAVE, FXSAVE64)>; 8990b57cec5SDimitry Andric 9000b57cec5SDimitry Andricdef AtomWrite01_141 : SchedWriteRes<[AtomPort01]> { 9010b57cec5SDimitry Andric let Latency = 141; 902*5f757f3fSDimitry Andric let ReleaseAtCycles = [141]; 9030b57cec5SDimitry Andric} 9040b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_141], (instrs FXRSTOR, FXRSTOR64)>; 9050b57cec5SDimitry Andric 9060b57cec5SDimitry Andricdef AtomWrite01_146 : SchedWriteRes<[AtomPort01]> { 9070b57cec5SDimitry Andric let Latency = 146; 908*5f757f3fSDimitry Andric let ReleaseAtCycles = [146]; 9090b57cec5SDimitry Andric} 9100b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_146], (instrs FYL2X)>; 9110b57cec5SDimitry Andric 9120b57cec5SDimitry Andricdef AtomWrite01_147 : SchedWriteRes<[AtomPort01]> { 9130b57cec5SDimitry Andric let Latency = 147; 914*5f757f3fSDimitry Andric let ReleaseAtCycles = [147]; 9150b57cec5SDimitry Andric} 9160b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_147], (instrs FYL2XP1)>; 9170b57cec5SDimitry Andric 9180b57cec5SDimitry Andricdef AtomWrite01_168 : SchedWriteRes<[AtomPort01]> { 9190b57cec5SDimitry Andric let Latency = 168; 920*5f757f3fSDimitry Andric let ReleaseAtCycles = [168]; 9210b57cec5SDimitry Andric} 9220b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_168], (instrs FPTAN)>; 9230b57cec5SDimitry Andric 9240b57cec5SDimitry Andricdef AtomWrite01_174 : SchedWriteRes<[AtomPort01]> { 9250b57cec5SDimitry Andric let Latency = 174; 926*5f757f3fSDimitry Andric let ReleaseAtCycles = [174]; 9270b57cec5SDimitry Andric} 928480093f4SDimitry Andricdef : InstRW<[AtomWrite01_174], (instrs FSINCOS, FSIN, FCOS)>; 9290b57cec5SDimitry Andric 9300b57cec5SDimitry Andricdef AtomWrite01_183 : SchedWriteRes<[AtomPort01]> { 9310b57cec5SDimitry Andric let Latency = 183; 932*5f757f3fSDimitry Andric let ReleaseAtCycles = [183]; 9330b57cec5SDimitry Andric} 9340b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_183], (instrs FPATAN)>; 9350b57cec5SDimitry Andric 9360b57cec5SDimitry Andricdef AtomWrite01_202 : SchedWriteRes<[AtomPort01]> { 9370b57cec5SDimitry Andric let Latency = 202; 938*5f757f3fSDimitry Andric let ReleaseAtCycles = [202]; 9390b57cec5SDimitry Andric} 9400b57cec5SDimitry Andricdef : InstRW<[AtomWrite01_202], (instrs WRMSR)>; 9410b57cec5SDimitry Andric 9420b57cec5SDimitry Andric} // SchedModel 943