xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCScheduleP7.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric//===-- PPCScheduleP7.td - PPC P7 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//
9*5f757f3fSDimitry Andric// This file defines the SchedModel for the POWER7 processor.
100b57cec5SDimitry Andric//
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andricdef P7Model : SchedMachineModel {
140b57cec5SDimitry Andric  let IssueWidth = 6;  // 4 (non-branch) instructions are dispatched per cycle.
150b57cec5SDimitry Andric                       // Note that the dispatch bundle size is 6 (including
160b57cec5SDimitry Andric                       // branches), but the total internal issue bandwidth per
170b57cec5SDimitry Andric                       // cycle (from all queues) is 8.
180b57cec5SDimitry Andric
190b57cec5SDimitry Andric  let LoadLatency = 3; // Optimistic load latency assuming bypass.
200b57cec5SDimitry Andric                       // This is overriden by OperandCycles if the
210b57cec5SDimitry Andric                       // Itineraries are queried instead.
220b57cec5SDimitry Andric  let MispredictPenalty = 16;
230b57cec5SDimitry Andric
24*5f757f3fSDimitry Andric  let MicroOpBufferSize = 44;
25*5f757f3fSDimitry Andric
260b57cec5SDimitry Andric  // Try to make sure we have at least 10 dispatch groups in a loop.
270b57cec5SDimitry Andric  let LoopMicroOpBufferSize = 40;
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric  let CompleteModel = 0;
300b57cec5SDimitry Andric
31*5f757f3fSDimitry Andric  let UnsupportedFeatures = [HasSPE, PrefixInstrs, MMA,
32*5f757f3fSDimitry Andric                             PairedVectorMemops, IsISA3_0, IsISA2_07,
33*5f757f3fSDimitry Andric                             PCRelativeMemops, IsISA3_1, IsISAFuture];
340b57cec5SDimitry Andric}
350b57cec5SDimitry Andric
36*5f757f3fSDimitry Andriclet SchedModel = P7Model in {
37*5f757f3fSDimitry Andric  def P7_LSU_FXU: ProcResource<4>;
38*5f757f3fSDimitry Andric  def P7_LSU: ProcResource<2> {
39*5f757f3fSDimitry Andric    let Super = P7_LSU_FXU;
40*5f757f3fSDimitry Andric  }
41*5f757f3fSDimitry Andric  def P7_FXU: ProcResource<2> {
42*5f757f3fSDimitry Andric    let Super = P7_LSU_FXU;
43*5f757f3fSDimitry Andric  }
44*5f757f3fSDimitry Andric  // Implemented as two 2-way SIMD operations for double- and single-precision.
45*5f757f3fSDimitry Andric  def P7_FPU: ProcResource<4>;
46*5f757f3fSDimitry Andric  // Scalar binary floating point instructions can only use two FPUs.
47*5f757f3fSDimitry Andric  def P7_ScalarFPU: ProcResource<2> {
48*5f757f3fSDimitry Andric    let Super = P7_FPU;
49*5f757f3fSDimitry Andric  }
50*5f757f3fSDimitry Andric  def P7_VectorFPU: ProcResource<2> {
51*5f757f3fSDimitry Andric    let Super = P7_FPU;
52*5f757f3fSDimitry Andric  }
53*5f757f3fSDimitry Andric  // Executing simple FX, complex FX, permute and 4-way SIMD single-precision FP ops
54*5f757f3fSDimitry Andric  def P7_VMX: ProcResource<1>;
55*5f757f3fSDimitry Andric  def P7_VPM: ProcResource<1> {
56*5f757f3fSDimitry Andric    let Super = P7_VMX;
57*5f757f3fSDimitry Andric    let BufferSize = 1;
58*5f757f3fSDimitry Andric  }
59*5f757f3fSDimitry Andric  def P7_VXS: ProcResource<1> {
60*5f757f3fSDimitry Andric    let Super = P7_VMX;
61*5f757f3fSDimitry Andric  }
62*5f757f3fSDimitry Andric  def P7_DFU: ProcResource<1>;
63*5f757f3fSDimitry Andric  def P7_BRU: ProcResource<1>;
64*5f757f3fSDimitry Andric  def P7_CRU: ProcResource<1>;
65*5f757f3fSDimitry Andric
66*5f757f3fSDimitry Andric  def P7_PORT_LS : ProcResource<2>;
67*5f757f3fSDimitry Andric  def P7_PORT_FX : ProcResource<2>;
68*5f757f3fSDimitry Andric  def P7_PORT_FP : ProcResource<2>;
69*5f757f3fSDimitry Andric  def P7_PORT_BR : ProcResource<1>;
70*5f757f3fSDimitry Andric  def P7_PORT_CR : ProcResource<1>;
71*5f757f3fSDimitry Andric
72*5f757f3fSDimitry Andric  def P7_DISP_LS : SchedWriteRes<[P7_PORT_LS]>;
73*5f757f3fSDimitry Andric  def P7_DISP_FX : SchedWriteRes<[P7_PORT_FX]>;
74*5f757f3fSDimitry Andric  def P7_DISP_FP : SchedWriteRes<[P7_PORT_FP]>;
75*5f757f3fSDimitry Andric  def P7_DISP_BR : SchedWriteRes<[P7_PORT_BR]>;
76*5f757f3fSDimitry Andric  def P7_DISP_CR : SchedWriteRes<[P7_PORT_CR]>;
77*5f757f3fSDimitry Andric
78*5f757f3fSDimitry Andric  def P7_BRU_NONE : SchedWriteRes<[P7_BRU]>;
79*5f757f3fSDimitry Andric  def P7_BRU_3C : SchedWriteRes<[P7_BRU]> { let Latency = 3; }
80*5f757f3fSDimitry Andric  def P7_BRU_4C : SchedWriteRes<[P7_BRU]> { let Latency = 4; }
81*5f757f3fSDimitry Andric  def P7_CRU_NONE : SchedWriteRes<[P7_CRU]>;
82*5f757f3fSDimitry Andric  def P7_CRU_3C : SchedWriteRes<[P7_CRU]> { let Latency = 3; }
83*5f757f3fSDimitry Andric  def P7_CRU_6C : SchedWriteRes<[P7_CRU]> { let Latency = 6; }
84*5f757f3fSDimitry Andric  def P7_LSU_NONE : SchedWriteRes<[P7_LSU]>;
85*5f757f3fSDimitry Andric  def P7_LSU_2C : SchedWriteRes<[P7_LSU]> { let Latency = 2; }
86*5f757f3fSDimitry Andric  def P7_LSU_3C : SchedWriteRes<[P7_LSU]> { let Latency = 3; }
87*5f757f3fSDimitry Andric  def P7_LSU_4C : SchedWriteRes<[P7_LSU]> { let Latency = 4; }
88*5f757f3fSDimitry Andric  def P7_FXU_NONE : SchedWriteRes<[P7_FXU]>;
89*5f757f3fSDimitry Andric  def P7_FXU_2C : SchedWriteRes<[P7_FXU]> { let Latency = 2; }
90*5f757f3fSDimitry Andric  def P7_FXU_3C : SchedWriteRes<[P7_FXU]> { let Latency = 3; }
91*5f757f3fSDimitry Andric  def P7_FXU_4C : SchedWriteRes<[P7_FXU]> { let Latency = 4; }
92*5f757f3fSDimitry Andric  def P7_FXU_5C : SchedWriteRes<[P7_FXU]> { let Latency = 5; }
93*5f757f3fSDimitry Andric  def P7_FXU_38C : SchedWriteRes<[P7_FXU]> { let Latency = 38; }
94*5f757f3fSDimitry Andric  def P7_FXU_69C : SchedWriteRes<[P7_FXU]> { let Latency = 69; }
95*5f757f3fSDimitry Andric  def P7_LSU_FXU_2C : SchedWriteRes<[P7_LSU_FXU]> { let Latency = 2; }
96*5f757f3fSDimitry Andric  def P7_FPU_NONE : SchedWriteRes<[P7_FPU]>;
97*5f757f3fSDimitry Andric  def P7_VectorFPU_6C : SchedWriteRes<[P7_VectorFPU]> { let Latency = 6; }
98*5f757f3fSDimitry Andric  def P7_VectorFPU_25C : SchedWriteRes<[P7_VectorFPU]> { let Latency = 25; }
99*5f757f3fSDimitry Andric  def P7_VectorFPU_30C : SchedWriteRes<[P7_VectorFPU]> { let Latency = 30; }
100*5f757f3fSDimitry Andric  def P7_VectorFPU_31C : SchedWriteRes<[P7_VectorFPU]> { let Latency = 31; }
101*5f757f3fSDimitry Andric  def P7_VectorFPU_42C : SchedWriteRes<[P7_VectorFPU]> { let Latency = 42; }
102*5f757f3fSDimitry Andric  def P7_ScalarFPU_6C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 6; }
103*5f757f3fSDimitry Andric  def P7_ScalarFPU_8C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 8; }
104*5f757f3fSDimitry Andric  def P7_ScalarFPU_27C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 27; }
105*5f757f3fSDimitry Andric  def P7_ScalarFPU_31C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 31; }
106*5f757f3fSDimitry Andric  def P7_ScalarFPU_32C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 32; }
107*5f757f3fSDimitry Andric  def P7_ScalarFPU_33C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 33; }
108*5f757f3fSDimitry Andric  def P7_ScalarFPU_42C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 42; }
109*5f757f3fSDimitry Andric  def P7_ScalarFPU_44C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 44; }
110*5f757f3fSDimitry Andric  def P7_VXS_2C : SchedWriteRes<[P7_VXS]> { let Latency = 2; }
111*5f757f3fSDimitry Andric  def P7_VPM_3C : SchedWriteRes<[P7_VPM]> { let Latency = 3; }
112*5f757f3fSDimitry Andric
113*5f757f3fSDimitry Andric  // Instruction of BRU pipeline
114*5f757f3fSDimitry Andric
115*5f757f3fSDimitry Andric  def : InstRW<[P7_BRU_NONE, P7_DISP_BR],
116*5f757f3fSDimitry Andric    (instregex "^B(L)?(A)?(8)?(_NOP|_NOTOC)?(_TLS|_RM)?(_)?$")>;
117*5f757f3fSDimitry Andric
118*5f757f3fSDimitry Andric  def : InstRW<[P7_BRU_3C, P7_DISP_BR], (instrs
119*5f757f3fSDimitry Andric    BDZLRLp, BDZLRm, BDZLRp, BDZLm, BDZLp, BDZm, BDZp,
120*5f757f3fSDimitry Andric    BDNZ, BDNZ8, BDNZA, BDNZAm, BDNZAp, BDNZL, BDNZLA, BDNZLAm, BDNZLAp, BDNZLR,
121*5f757f3fSDimitry Andric    BDNZLR8, BDNZLRL, BDNZLRLm, BDNZLRLp, BDNZLRm, BDNZLRp, BDNZLm, BDNZLp,
122*5f757f3fSDimitry Andric    BDNZm, BDNZp, BDZ, BDZ8, BDZA, BDZAm, BDZAp, BDZL, BDZLA, BDZLAm, BDZLAp,
123*5f757f3fSDimitry Andric    BDZLR, BDZLR8, BDZLRL, BDZLRLm, BLR, BLR8, BLRL, BCL, BCLR, BCLRL, BCLRLn,
124*5f757f3fSDimitry Andric    BCLRn, BCLalways, BCLn, BCTR, BCTR8, BCTRL, BCTRL8, BCTRL8_LDinto_toc,
125*5f757f3fSDimitry Andric    BCTRL8_LDinto_toc_RM, BCTRL8_RM, BCTRL_LWZinto_toc, BCTRL_LWZinto_toc_RM,
126*5f757f3fSDimitry Andric    BCTRL_RM, BCn, BC, BCC, BCCA, BCCCTR, BCCCTR8, BCCCTRL, BCCCTRL8, BCCL,
127*5f757f3fSDimitry Andric    BCCLA, BCCLR, BCCLRL, BCCTR, BCCTR8, BCCTR8n, BCCTRL, BCCTRL8,
128*5f757f3fSDimitry Andric    BCCCTR, BCCCTR8, BCCCTRL, BCCCTRL8, BCCL, BCCLA, BCCLR, BCCLRL, BCCTR,
129*5f757f3fSDimitry Andric    BCCTR8, BCCTR8n, BCCTRL, BCCTRL8, BCCTRL8n, BCCTRLn, BCCTRn, gBC, gBCA,
130*5f757f3fSDimitry Andric    gBCAat, gBCCTR, gBCCTRL, gBCL, gBCLA, gBCLAat, gBCLR, gBCLRL, gBCLat, gBCat,
131*5f757f3fSDimitry Andric    MFCTR, MFCTR8, MFLR, MFLR8
132*5f757f3fSDimitry Andric  )>;
133*5f757f3fSDimitry Andric
134*5f757f3fSDimitry Andric  def : InstRW<[P7_BRU_4C], (instrs MTLR, MTLR8, MTCTR, MTCTR8, MTCTR8loop, MTCTRloop)>;
135*5f757f3fSDimitry Andric
136*5f757f3fSDimitry Andric  // Instructions of CRU pipeline
137*5f757f3fSDimitry Andric
138*5f757f3fSDimitry Andric  def : InstRW<[P7_CRU_NONE], (instrs MFCR, MFCR8)>;
139*5f757f3fSDimitry Andric  def : InstRW<[P7_CRU_3C], (instrs MCRF)>;
140*5f757f3fSDimitry Andric  def : InstRW<[P7_CRU_6C, P7_DISP_CR], (instrs
141*5f757f3fSDimitry Andric    CR6SET, CR6UNSET, CRSET, CRUNSET,
142*5f757f3fSDimitry Andric    CRAND, CRANDC, CREQV, CRNAND, CRNOR, CRNOT, CROR, CRORC
143*5f757f3fSDimitry Andric  )>;
144*5f757f3fSDimitry Andric
145*5f757f3fSDimitry Andric  // Instructions of LSU and FXU pipelines
146*5f757f3fSDimitry Andric
147*5f757f3fSDimitry Andric  def : InstRW<[P7_LSU_NONE, P7_DISP_LS], (instrs LMW, LWARX, LWARXL, LDARX, LDARXL)>;
148*5f757f3fSDimitry Andric  def : InstRW<[P7_LSU_2C, P7_DISP_LS], (instrs LHBRX, LHBRX8, LWBRX, LWBRX8)>;
149*5f757f3fSDimitry Andric  def : InstRW<[P7_LSU_3C], (instrs MFSR, MFSRIN)>;
150*5f757f3fSDimitry Andric
151*5f757f3fSDimitry Andric  def : InstRW<[P7_LSU_3C, P7_DISP_LS], (instrs
152*5f757f3fSDimitry Andric    LFS, LFSX, LFSXTLS, LFSXTLS_, LFD, LFDX, LFDXTLS, LFDXTLS_, LXSDX, LXVD2X,
153*5f757f3fSDimitry Andric    LXVW4X, LXVDSX
154*5f757f3fSDimitry Andric  )>;
155*5f757f3fSDimitry Andric
156*5f757f3fSDimitry Andric  def : InstRW<[P7_LSU_3C, P7_FXU_3C, P7_DISP_LS], (instrs
157*5f757f3fSDimitry Andric    LFSU, LFSUX, LFDU, LFDUX)>;
158*5f757f3fSDimitry Andric
159*5f757f3fSDimitry Andric  def : InstRW<[P7_LSU_NONE, P7_FPU_NONE, P7_DISP_LS], (instrs
160*5f757f3fSDimitry Andric    STXSDX, STXVD2X, STXVW4X)>;
161*5f757f3fSDimitry Andric
162*5f757f3fSDimitry Andric  def : InstRW<[P7_LSU_4C, P7_FXU_4C, P7_DISP_LS], (instrs
163*5f757f3fSDimitry Andric    LBARX, LBZCIX, LDBRX, LDCIX, LFIWAX, LFIWZX, LHARX, LHZCIX, LSWI, LVEBX,
164*5f757f3fSDimitry Andric    LVEHX, LVEWX, LVSL, LVSR, LVX, LVXL, LWZCIX,
165*5f757f3fSDimitry Andric    STFD, STFDU, STFDUX, STFDX, STFIWX, STFS, STFSU, STFSUX, STFSX,
166*5f757f3fSDimitry Andric    STHCIX, STSWI, STVEBX, STVEHX, STVEWX, STVX, STVXL, STWCIX,
167*5f757f3fSDimitry Andric    LHA, LHA8, LHAX, LHAX8, LWA, LWAX, LWAX_32, LWA_32, LHAU, LHAU8,
168*5f757f3fSDimitry Andric    LHAUX, LHAUX8, LWAUX
169*5f757f3fSDimitry Andric  )>;
170*5f757f3fSDimitry Andric
171*5f757f3fSDimitry Andric  def : InstRW<[P7_LSU_NONE, P7_FXU_NONE, P7_DISP_LS], (instrs
172*5f757f3fSDimitry Andric    STB, STB8, STH, STH8, STW, STW8, STD, STBX, STBX8, STHX, STHX8, STWX,
173*5f757f3fSDimitry Andric    STWX8, STDX, STHBRX, STWBRX, STMW, STWCX, STDCX, STDU, STHU, STHU8,
174*5f757f3fSDimitry Andric    STBU, STBU8, STWU, STWU8, STDUX, STWUX, STWUX8, STHUX, STHUX8, STBUX, STBUX8
175*5f757f3fSDimitry Andric  )>;
176*5f757f3fSDimitry Andric
177*5f757f3fSDimitry Andric  def : InstRW<[P7_LSU_2C, P7_FXU_2C, P7_DISP_LS], (instrs
178*5f757f3fSDimitry Andric    LWZU, LWZU8, LHZU, LHZU8, LBZU, LBZU8, LDU,
179*5f757f3fSDimitry Andric    LWZUX, LWZUX8, LHZUX, LHZUX8, LBZUX, LBZUX8, LDUX
180*5f757f3fSDimitry Andric  )>;
181*5f757f3fSDimitry Andric
182*5f757f3fSDimitry Andric  def : InstRW<[P7_LSU_FXU_2C, P7_DISP_FX], (instrs
183*5f757f3fSDimitry Andric    (instregex "^(ADD|L)I(S)?(8)?$"),
184*5f757f3fSDimitry Andric    (instregex "^(ADD|SUBF)(4|8)(TLS)?(_)?(_rec)?$"),
185*5f757f3fSDimitry Andric    (instregex "^(X)?ORI(S)?(8)?$"),
186*5f757f3fSDimitry Andric    (instregex "^(X)OR(8)?(_rec)?$"),
187*5f757f3fSDimitry Andric    ADDIC, ADDIC8, SUBFIC, SUBFIC8, SUBFZE, SUBFZE8,
188*5f757f3fSDimitry Andric    ADDE, ADDE8, ADDME, ADDME8, SUBFME, SUBFME8,
189*5f757f3fSDimitry Andric    NEG, NEG8, NEG8_rec, NEG_rec, NEG8O, NEGO,
190*5f757f3fSDimitry Andric    ANDI_rec, ANDIS_rec, AND, AND8, AND_rec, AND8_rec,
191*5f757f3fSDimitry Andric    NAND, NAND8, NAND_rec, NAND8_rec, NOR, NOR8, NOR_rec, NOR8_rec,
192*5f757f3fSDimitry Andric    EQV, EQV8, EQV_rec, EQV8_rec, ANDC, ANDC8, ANDC_rec, ANDC8_rec,
193*5f757f3fSDimitry Andric    ORC, ORC8, ORC_rec, ORC8_rec
194*5f757f3fSDimitry Andric  )>;
195*5f757f3fSDimitry Andric
196*5f757f3fSDimitry Andric  def : InstRW<[P7_FXU_2C, P7_DISP_FX], (instrs
197*5f757f3fSDimitry Andric    CMPD, CMPDI, CMPLD, CMPLDI, CMPLW, CMPLWI, CMPW, CMPWI,
198*5f757f3fSDimitry Andric    EXTSB8_32_64, EXTSB8_rec, EXTSH8_32_64, EXTSH8_rec, EXTSW_32,
199*5f757f3fSDimitry Andric    EXTSW_32_64, EXTSW_32_64_rec, POPCNTB, POPCNTB8, POPCNTD, POPCNTW,
200*5f757f3fSDimitry Andric    ADDPCIS, ANDI8_rec, ANDIS8_rec, SUBFUS, SUBFUS_rec,
201*5f757f3fSDimitry Andric    ADD4O, ADD8O, ADDC, ADDC8, SUBFO, SUBF8O, SUBFC, SUBFC8,
202*5f757f3fSDimitry Andric    ADDIC_rec, ADDE8_rec, ADDE_rec, SUBFE8_rec, SUBFE_rec,
203*5f757f3fSDimitry Andric    ADDME8_rec, ADDME_rec, SUBFME8_rec, SUBFME_rec, ADDZE8_rec, ADDZE_rec,
204*5f757f3fSDimitry Andric    SUBFZE_rec, SUBFZE8_rec, ADD8O_rec, SUBFO_rec, SUBF8O_rec, ADD4O_rec,
205*5f757f3fSDimitry Andric    ADD8O_rec, SUBF8O_rec, SUBFO_rec, ADDE8O, ADDEO, SUBFE8O, SUBFEO, ADDME8O,
206*5f757f3fSDimitry Andric    ADDMEO, SUBFME8O, SUBFMEO, ADDZE8O, ADDZEO, SUBFZE8O, SUBFZEO, NEG8O_rec,
207*5f757f3fSDimitry Andric    NEGO_rec, ADDEO, ADDE8O, SUBFEO, SUBFE8O, ADDMEO, SUBFMEO, SUBFME8O, ADDME8O,
208*5f757f3fSDimitry Andric    ADDZEO, ADDZE8O, SUBFZEO, SUBFZE8O, NEG8O_rec, NEGO_rec,
209*5f757f3fSDimitry Andric    ADDE8O_rec, ADDEO_rec, ADDMEO_rec, ADDME8O_rec, SUBFMEO_rec, SUBFME8O_rec,
210*5f757f3fSDimitry Andric    ADDZEO_rec, ADDZE8O_rec, SUBFZEO_rec, SUBFZE8O_rec,
211*5f757f3fSDimitry Andric    ADDC8_rec, ADDC_rec, ADDCO, ADDCO_rec, ADDC8O, ADDC8O_rec,
212*5f757f3fSDimitry Andric    SUBFC8_rec, SUBFC_rec, SUBFCO, SUBFC8O,  SUBFCO_rec, SUBFC8O_rec,
213*5f757f3fSDimitry Andric    EXTSB, EXTSB8, EXTSB_rec, EXTSH, EXTSH8, EXTSH_rec, EXTSW, EXTSW_rec,
214*5f757f3fSDimitry Andric    RLDICL, RLDICL_rec, RLDICR, RLDICR_rec, RLDIC, RLDIC_rec,
215*5f757f3fSDimitry Andric    RLWINM, RLWINM8, RLWINM_rec, RLDCL, RLDCL_rec, RLDCR, RLDCR_rec,
216*5f757f3fSDimitry Andric    RLWNM, RLWNM8, RLWNM_rec, RLDIMI, RLDIMI_rec,
217*5f757f3fSDimitry Andric    RLDICL_32, RLDICL_32_64, RLDICL_32_rec, RLDICR_32, RLWINM8_rec, RLWNM8_rec,
218*5f757f3fSDimitry Andric    SLD, SLD_rec, SLW, SLW8, SLW_rec, SLW8_rec, SRD, SRD_rec, SRW, SRW8, SRW_rec,
219*5f757f3fSDimitry Andric    SRW8_rec, SRADI, SRADI_rec, SRAWI, SRAWI_rec, SRAD, SRAD_rec, SRAW, SRAW_rec,
220*5f757f3fSDimitry Andric    SRADI_32, SUBFE, SUBFE8, SUBFE8O_rec, SUBFEO_rec
221*5f757f3fSDimitry Andric  )>;
222*5f757f3fSDimitry Andric
223*5f757f3fSDimitry Andric  def : InstRW<[P7_FXU_3C, P7_DISP_FX], (instregex "^CNT(L|T)Z(D|W)(8)?(M)?(_rec)?$")>;
224*5f757f3fSDimitry Andric
225*5f757f3fSDimitry Andric  def : InstRW<[P7_FXU_5C, P7_DISP_FX], (instrs
226*5f757f3fSDimitry Andric    MULLI, MULLI8, MULLW, MULHW, MULHWU, MULLD, MULHD, MULHDU, MULLWO, MULLDO,
227*5f757f3fSDimitry Andric    MULLW_rec, MULLD_rec, MULHD_rec, MULHW_rec, MULHDU_rec, MULHWU_rec, MULLWO_rec,
228*5f757f3fSDimitry Andric    MULLDO_rec
229*5f757f3fSDimitry Andric  )>;
230*5f757f3fSDimitry Andric
231*5f757f3fSDimitry Andric  def : InstRW<[P7_FXU_38C, P7_DISP_FX], (instrs
232*5f757f3fSDimitry Andric    DIVDE, DIVDEO, DIVDEO_rec, DIVDEU, DIVDEUO, DIVDEUO_rec, DIVDEU_rec, DIVDE_rec,
233*5f757f3fSDimitry Andric    DIVWE, DIVWEO, DIVWEO_rec, DIVWEU, DIVWEUO, DIVWEUO_rec, DIVWEU_rec, DIVWE_rec,
234*5f757f3fSDimitry Andric    DIVW, DIVWU, DIVWU_rec, DIVWO, DIVWO_rec, DIVWUO, DIVWUO_rec, DIVW_rec
235*5f757f3fSDimitry Andric  )>;
236*5f757f3fSDimitry Andric
237*5f757f3fSDimitry Andric  def : InstRW<[P7_FXU_69C, P7_DISP_FX], (instrs
238*5f757f3fSDimitry Andric    DIVD, DIVDU, DIVDO, DIVDO_rec, DIVDUO, DIVDUO_rec, DIVDU_rec, DIVD_rec)>;
239*5f757f3fSDimitry Andric
240*5f757f3fSDimitry Andric  // Instructions of FPU and VMX pipeline
241*5f757f3fSDimitry Andric
242*5f757f3fSDimitry Andric  def : InstRW<[P7_ScalarFPU_6C, P7_DISP_FP], (instrs
243*5f757f3fSDimitry Andric    (instregex "^F(N)?(M)?(R|ADD|SUB|ABS|NEG|NABS|UL)(D|S)?(_rec)?$"),
244*5f757f3fSDimitry Andric    (instregex "^FC(T|F)I(D|W)(U)?(S)?(Z)?(_rec)?$"),
245*5f757f3fSDimitry Andric    (instregex "^XS(N)?M(SUB|ADD)(A|M)(D|S)P$"),
246*5f757f3fSDimitry Andric    (instregex "^XS(NEG|ABS|NABS|ADD|SUB|MUL)(D|S)P(s)?$"),
247*5f757f3fSDimitry Andric    FRE, FRES_rec, FRE_rec, FRSP_rec, FTDIV, FTSQRT,
248*5f757f3fSDimitry Andric    FRSP, FRES, FRSQRTE, FRSQRTES, FRSQRTES_rec, FRSQRTE_rec, FSELD, FSELS,
249*5f757f3fSDimitry Andric    FSELD_rec, FSELS_rec, FCPSGND, FCPSGND_rec, FCPSGNS, FCPSGNS_rec,
250*5f757f3fSDimitry Andric    FRIMD, FRIMD_rec, FRIMS, FRIMS_rec, FRIND, FRIND_rec, FRINS, FRINS_rec,
251*5f757f3fSDimitry Andric    FRIPD, FRIPD_rec, FRIPS, FRIPS_rec, FRIZD, FRIZD_rec, FRIZS, FRIZS_rec,
252*5f757f3fSDimitry Andric    XSCPSGNDP, XSCVDPSP, XSCVDPSXDS, XSCVDPSXDSs, XSCVDPSXWS, XSCVDPSXWSs,
253*5f757f3fSDimitry Andric    XSCVDPUXDS, XSCVDPUXDSs, XSCVDPUXWS, XSCVDPUXWSs, XSCVSPDP, XSCVSXDDP,
254*5f757f3fSDimitry Andric    XSCVUXDDP, XSMAXDP, XSMINDP, XSRDPI, XSRDPIC, XSRDPIM, XSRDPIP, XSRDPIZ,
255*5f757f3fSDimitry Andric    XSREDP, XSRSQRTEDP, XSTDIVDP, XSTSQRTDP, XSCMPODP, XSCMPUDP
256*5f757f3fSDimitry Andric  )>;
257*5f757f3fSDimitry Andric
258*5f757f3fSDimitry Andric  def : InstRW<[P7_VectorFPU_6C, P7_DISP_FP], (instrs
259*5f757f3fSDimitry Andric    (instregex "^XV(N)?(M)?(ADD|SUB)(A|M)?(D|S)P$"),
260*5f757f3fSDimitry Andric    (instregex "^XV(MAX|MIN|MUL|NEG|ABS|ADD|NABS)(D|S)P$"),
261*5f757f3fSDimitry Andric    XVCMPEQDP, XVCMPEQDP_rec, XVCMPGEDP, XVCMPGEDP_rec, XVCMPGTDP, XVCMPGTDP_rec,
262*5f757f3fSDimitry Andric    XVCPSGNDP, XVCVDPSXDS, XVCVDPSXWS, XVCVDPUXDS, XVCVDPUXWS, XVCVSPSXDS,
263*5f757f3fSDimitry Andric    XVCVSPSXWS, XVCVSPUXDS, XVCVSPUXWS, XVCVSXDDP, XVCVSXWDP, XVCVUXDDP,
264*5f757f3fSDimitry Andric    XVCVUXWDP, XVRDPI, XVRDPIC, XVRDPIM, XVRDPIP, XVRDPIZ, XVREDP,
265*5f757f3fSDimitry Andric    XVRSPI, XVRSPIC, XVRSPIM, XVRSPIP, XVRSPIZ, XVRSQRTEDP, XVTDIVDP,
266*5f757f3fSDimitry Andric    XVTSQRTDP
267*5f757f3fSDimitry Andric  )>;
268*5f757f3fSDimitry Andric
269*5f757f3fSDimitry Andric  // TODO: Altivec instructions are not listed in Book IV.
270*5f757f3fSDimitry Andric  def : InstRW<[P7_VPM_3C, P7_DISP_FP], (instrs
271*5f757f3fSDimitry Andric    (instregex "^VPK(S|U)(H|W)(S|U)(S|M)$"),
272*5f757f3fSDimitry Andric    (instregex "^VUPK(H|L)(S|P)(X|B|H)$"),
273*5f757f3fSDimitry Andric    VPERM, XXMRGHW, XXMRGLW, XXPERMDI, XXPERMDIs, XXSLDWI, XXSLDWIs,
274*5f757f3fSDimitry Andric    VSPLTB, VSPLTBs, VSPLTH, VSPLTHs, VSPLTISB, VSPLTISH, VSPLTISW, VSPLTW,
275*5f757f3fSDimitry Andric    XXSPLTW, XXSPLTWs, VSEL, XXSEL, VPKPX
276*5f757f3fSDimitry Andric  )>;
277*5f757f3fSDimitry Andric
278*5f757f3fSDimitry Andric  def : InstRW<[P7_VXS_2C, P7_DISP_FP], (instrs
279*5f757f3fSDimitry Andric    (instregex "^VADD(U|S)(B|H|W)(S|M)$"),
280*5f757f3fSDimitry Andric    (instregex "^V(MAX|MIN)(S|U)(B|H|W)$"),
281*5f757f3fSDimitry Andric    (instregex "^V(MRG)(L|H)(B|H|W)$"),
282*5f757f3fSDimitry Andric    XXLORf, XXLXORdpz, XXLXORspz, XXLXORz, XVRSQRTESP, XVRESP,
283*5f757f3fSDimitry Andric    XVTDIVSP, XVTSQRTSP, XVCMPEQSP, XVCMPEQSP_rec, XVCMPGESP, XVCMPGESP_rec,
284*5f757f3fSDimitry Andric    XVCMPGTSP, XVCMPGTSP_rec, XVCVSXDSP, XVCVSXWSP, XVCVUXDSP, XVCVUXWSP,
285*5f757f3fSDimitry Andric    XVCPSGNSP, XVCVDPSP, VADDCUW, VADDFP, VAND, VANDC, VAVGSB, VAVGSH,
286*5f757f3fSDimitry Andric    VAVGSW, VAVGUB, VAVGUH, VAVGUW, VCFSX, VCFUX, VCMPBFP, VCMPBFP_rec,
287*5f757f3fSDimitry Andric    VCMPEQFP, VCMPEQFP_rec, VCMPEQUB, VCMPEQUB_rec, VCMPEQUH, VCMPEQUH_rec,
288*5f757f3fSDimitry Andric    VCMPEQUW, VCMPEQUW_rec, VCMPGEFP, VCMPGEFP_rec, VCMPGTFP, VCMPGTFP_rec,
289*5f757f3fSDimitry Andric    VCMPGTSB, VCMPGTSB_rec, VCMPGTSH, VCMPGTSH_rec, VCMPGTSW, VCMPGTSW_rec,
290*5f757f3fSDimitry Andric    VCMPGTUB, VCMPGTUB_rec, VCMPGTUH, VCMPGTUH_rec, VCMPGTUW, VCMPGTUW_rec,
291*5f757f3fSDimitry Andric    VCTSXS, VCTUXS, VEXPTEFP, VLOGEFP, VNOR, VOR,
292*5f757f3fSDimitry Andric    VMADDFP, VMHADDSHS, VMHRADDSHS, VMLADDUHM, VNMSUBFP, VMAXFP, VMINFP,
293*5f757f3fSDimitry Andric    VMSUMMBM, VMSUMSHM, VMSUMSHS, VMSUMUBM, VMSUMUDM, VMSUMUHM, VMSUMUHS,
294*5f757f3fSDimitry Andric    VMULESB, VMULESH, VMULEUB, VMULEUH, VMULOSB, VMULOSH, VMULOUB, VMULOUH,
295*5f757f3fSDimitry Andric    VREFP, VRFIM, VRFIN, VRFIP, VRFIZ, VRLB, VRLH, VRLW, VRSQRTEFP,
296*5f757f3fSDimitry Andric    VSR, VSRAB, VSRAH, VSRAW, VSRB, VSRH, VSRO, VSRW, VSUBCUW, VSL, VSLB,
297*5f757f3fSDimitry Andric    VSLDOI, VSLH, VSLO, VSLW, VSUBFP, VSUBSBS, VSUBSHS, VSUBSWS, VSUBUBM,
298*5f757f3fSDimitry Andric    VSUBUBS, VSUBUHM, VSUBUHS, VSUBUWM, VSUBUWS, VSUM2SWS, VSUM4SBS, VSUM4SHS,
299*5f757f3fSDimitry Andric    VSUM4UBS, VSUMSWS, VXOR, XXLAND, XXLANDC, XXLNOR, XXLOR, XXLXOR
300*5f757f3fSDimitry Andric  )>;
301*5f757f3fSDimitry Andric
302*5f757f3fSDimitry Andric  def : InstRW<[P7_ScalarFPU_8C, P7_DISP_FP],
303*5f757f3fSDimitry Andric    (instrs FCMPOD, FCMPOS, FCMPUD, FCMPUS)>;
304*5f757f3fSDimitry Andric  def : InstRW<[P7_ScalarFPU_27C, P7_DISP_FP], (instrs FDIVS, FDIVS_rec)>;
305*5f757f3fSDimitry Andric  def : InstRW<[P7_ScalarFPU_31C, P7_DISP_FP], (instrs XSDIVDP)>;
306*5f757f3fSDimitry Andric  def : InstRW<[P7_ScalarFPU_32C, P7_DISP_FP], (instrs FSQRTS, XSSQRTSP, FSQRTS_rec)>;
307*5f757f3fSDimitry Andric  def : InstRW<[P7_ScalarFPU_33C, P7_DISP_FP], (instrs FDIV, FDIV_rec)>;
308*5f757f3fSDimitry Andric  def : InstRW<[P7_ScalarFPU_42C, P7_DISP_FP], (instrs XSSQRTDP)>;
309*5f757f3fSDimitry Andric  def : InstRW<[P7_ScalarFPU_44C, P7_DISP_FP], (instrs FSQRT, FSQRT_rec)>;
310*5f757f3fSDimitry Andric
311*5f757f3fSDimitry Andric  def : InstRW<[P7_VectorFPU_25C, P7_DISP_FP], (instrs XVDIVSP)>;
312*5f757f3fSDimitry Andric  def : InstRW<[P7_VectorFPU_30C, P7_DISP_FP], (instrs XVSQRTSP)>;
313*5f757f3fSDimitry Andric  def : InstRW<[P7_VectorFPU_31C, P7_DISP_FP], (instrs XVDIVDP)>;
314*5f757f3fSDimitry Andric  def : InstRW<[P7_VectorFPU_42C, P7_DISP_FP], (instrs XVSQRTDP)>;
315*5f757f3fSDimitry Andric}
316