xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCScheduleP8.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric//===-- PPCScheduleP8.td - PPC P8 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 POWER8 processor.
100b57cec5SDimitry Andric//
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andricdef P8Model : SchedMachineModel {
14*5f757f3fSDimitry Andric  let IssueWidth = 8;
15*5f757f3fSDimitry Andric  let LoadLatency = 3;
160b57cec5SDimitry Andric  let MispredictPenalty = 16;
170b57cec5SDimitry Andric  let LoopMicroOpBufferSize = 60;
18*5f757f3fSDimitry Andric  let MicroOpBufferSize = 64;
19*5f757f3fSDimitry Andric  // TODO: Due to limitation of instruction definitions, non-P8 instructions
20*5f757f3fSDimitry Andric  // are required to be listed here. Change this after it got fixed.
210b57cec5SDimitry Andric  let CompleteModel = 0;
22*5f757f3fSDimitry Andric  let UnsupportedFeatures = [HasSPE, PrefixInstrs, MMA,
23*5f757f3fSDimitry Andric                             PairedVectorMemops, PCRelativeMemops,
24*5f757f3fSDimitry Andric                             IsISA3_0, IsISA3_1, IsISAFuture];
250b57cec5SDimitry Andric}
260b57cec5SDimitry Andric
27*5f757f3fSDimitry Andriclet SchedModel = P8Model in {
28*5f757f3fSDimitry Andric  // Power8 Pipeline Units:
29*5f757f3fSDimitry Andric
30*5f757f3fSDimitry Andric  def P8_LU_LS_FX : ProcResource<6>;
31*5f757f3fSDimitry Andric  def P8_LU_LS : ProcResource<4> { let Super = P8_LU_LS_FX; }
32*5f757f3fSDimitry Andric  def P8_LS : ProcResource<2> { let Super = P8_LU_LS; }
33*5f757f3fSDimitry Andric  def P8_LU : ProcResource<2> { let Super = P8_LU_LS; }
34*5f757f3fSDimitry Andric  def P8_FX : ProcResource<2> { let Super = P8_LU_LS_FX; }
35*5f757f3fSDimitry Andric  def P8_DFU : ProcResource<1>;
36*5f757f3fSDimitry Andric  def P8_BR : ProcResource<1> { let BufferSize = 16; }
37*5f757f3fSDimitry Andric  def P8_CY : ProcResource<1>;
38*5f757f3fSDimitry Andric  def P8_CRL : ProcResource<1>;
39*5f757f3fSDimitry Andric  def P8_VMX : ProcResource<2>;
40*5f757f3fSDimitry Andric  def P8_PM : ProcResource<2> {
41*5f757f3fSDimitry Andric    // This is workaround for scheduler to respect latency of long permute chain.
42*5f757f3fSDimitry Andric    let BufferSize = 1;
43*5f757f3fSDimitry Andric    let Super = P8_VMX;
44*5f757f3fSDimitry Andric  }
45*5f757f3fSDimitry Andric  def P8_XS : ProcResource<2> { let Super = P8_VMX; }
46*5f757f3fSDimitry Andric  def P8_VX : ProcResource<2> { let Super = P8_VMX; }
47*5f757f3fSDimitry Andric  def P8_FPU : ProcResource<4>;
48*5f757f3fSDimitry Andric  // Units for scalar, 2xDouble and 4xSingle
49*5f757f3fSDimitry Andric  def P8_FP_Scal : ProcResource<2> { let Super = P8_FPU; }
50*5f757f3fSDimitry Andric  def P8_FP_2x64 : ProcResource<2> { let Super = P8_FPU; }
51*5f757f3fSDimitry Andric  def P8_FP_4x32 : ProcResource<2> { let Super = P8_FPU; }
52*5f757f3fSDimitry Andric
53*5f757f3fSDimitry Andric  // Power8 Dispatch Ports:
54*5f757f3fSDimitry Andric  // Two ports to do loads or fixed-point operations.
55*5f757f3fSDimitry Andric  // Two ports to do stores, fixed-point loads, or fixed-point operations.
56*5f757f3fSDimitry Andric  // Two ports for fixed-point operations.
57*5f757f3fSDimitry Andric  // Two issue ports shared by 2 DFP/2 VSX/2 VMX/1 CY/1 DFP operations.
58*5f757f3fSDimitry Andric  // One for branch operations.
59*5f757f3fSDimitry Andric  // One for condition register operations.
60*5f757f3fSDimitry Andric
61*5f757f3fSDimitry Andric  // TODO: Model dispatch of cracked instructions.
62*5f757f3fSDimitry Andric
63*5f757f3fSDimitry Andric  // Six ports in total are available for fixed-point operations.
64*5f757f3fSDimitry Andric  def P8_PORT_ALLFX : ProcResource<6>;
65*5f757f3fSDimitry Andric  // Four ports in total are available for fixed-point load operations.
66*5f757f3fSDimitry Andric  def P8_PORT_FXLD : ProcResource<4> { let Super = P8_PORT_ALLFX; }
67*5f757f3fSDimitry Andric  // Two ports to do loads or fixed-point operations.
68*5f757f3fSDimitry Andric  def P8_PORT_LD_FX : ProcResource<2> { let Super = P8_PORT_FXLD; }
69*5f757f3fSDimitry Andric  // Two ports to do stores, fixed-point loads, or fixed-point operations.
70*5f757f3fSDimitry Andric  def P8_PORT_ST_FXLD_FX : ProcResource<2> { let Super = P8_PORT_FXLD; }
71*5f757f3fSDimitry Andric  // Two issue ports shared by two floating-point, two VSX, two VMX, one crypto,
72*5f757f3fSDimitry Andric  // and one DFP operations.
73*5f757f3fSDimitry Andric  def P8_PORT_VMX_FP : ProcResource<2>;
74*5f757f3fSDimitry Andric  // One port for branch operation.
75*5f757f3fSDimitry Andric  def P8_PORT_BR : ProcResource<1>;
76*5f757f3fSDimitry Andric  // One port for condition register operation.
77*5f757f3fSDimitry Andric  def P8_PORT_CR : ProcResource<1>;
78*5f757f3fSDimitry Andric
79*5f757f3fSDimitry Andric  def P8_ISSUE_FX : SchedWriteRes<[P8_PORT_ALLFX]>;
80*5f757f3fSDimitry Andric  def P8_ISSUE_FXLD : SchedWriteRes<[P8_PORT_FXLD]>;
81*5f757f3fSDimitry Andric  def P8_ISSUE_LD : SchedWriteRes<[P8_PORT_LD_FX]>;
82*5f757f3fSDimitry Andric  def P8_ISSUE_ST : SchedWriteRes<[P8_PORT_ST_FXLD_FX]>;
83*5f757f3fSDimitry Andric  def P8_ISSUE_VSX : SchedWriteRes<[P8_PORT_VMX_FP]>;
84*5f757f3fSDimitry Andric  def P8_ISSUE_BR : SchedWriteRes<[P8_PORT_BR]>;
85*5f757f3fSDimitry Andric  def P8_ISSUE_CR : SchedWriteRes<[P8_PORT_CR]>;
86*5f757f3fSDimitry Andric
87*5f757f3fSDimitry Andric  // Power8 Instruction Latency & Port Groups:
88*5f757f3fSDimitry Andric
89*5f757f3fSDimitry Andric  def P8_LS_LU_NONE : SchedWriteRes<[P8_LU, P8_LS]>;
90*5f757f3fSDimitry Andric  def P8_LS_FP_NONE : SchedWriteRes<[P8_LS, P8_FPU]>;
91*5f757f3fSDimitry Andric  def P8_LU_or_LS_3C : SchedWriteRes<[P8_LU_LS]> { let Latency = 3; }
92*5f757f3fSDimitry Andric  def P8_LS_FX_3C : SchedWriteRes<[P8_LS, P8_FX]> { let Latency = 3; }
93*5f757f3fSDimitry Andric  def P8_LU_or_LS_or_FX_2C : SchedWriteRes<[P8_LU_LS_FX]> { let Latency = 2; }
94*5f757f3fSDimitry Andric  def P8_LU_or_LS_FX_3C : SchedWriteRes<[P8_LU_LS, P8_FX]> { let Latency = 3; }
95*5f757f3fSDimitry Andric  def P8_FX_NONE : SchedWriteRes<[P8_FX]>;
96*5f757f3fSDimitry Andric  def P8_FX_1C : SchedWriteRes<[P8_FX]> { let Latency = 1; }
97*5f757f3fSDimitry Andric  def P8_FX_2C : SchedWriteRes<[P8_FX]> { let Latency = 2; }
98*5f757f3fSDimitry Andric  def P8_FX_3C : SchedWriteRes<[P8_FX]> { let Latency = 3; }
99*5f757f3fSDimitry Andric  def P8_FX_5C : SchedWriteRes<[P8_FX]> { let Latency = 5; }
100*5f757f3fSDimitry Andric  def P8_FX_10C : SchedWriteRes<[P8_FX]> { let Latency = 10; }
101*5f757f3fSDimitry Andric  def P8_FX_23C : SchedWriteRes<[P8_FX]> { let Latency = 23; }
102*5f757f3fSDimitry Andric  def P8_FX_15C : SchedWriteRes<[P8_FX]> { let Latency = 15; }
103*5f757f3fSDimitry Andric  def P8_FX_41C : SchedWriteRes<[P8_FX]> { let Latency = 41; }
104*5f757f3fSDimitry Andric  def P8_BR_2C : SchedWriteRes<[P8_BR]> { let Latency = 2; }
105*5f757f3fSDimitry Andric  def P8_CR_NONE : SchedWriteRes<[P8_CRL]>;
106*5f757f3fSDimitry Andric  def P8_CR_3C : SchedWriteRes<[P8_CRL]> { let Latency = 3; }
107*5f757f3fSDimitry Andric  def P8_CR_5C : SchedWriteRes<[P8_CRL]> { let Latency = 5; }
108*5f757f3fSDimitry Andric  def P8_LU_5C : SchedWriteRes<[P8_LU]> { let Latency = 5; }
109*5f757f3fSDimitry Andric  def P8_LU_FX_5C : SchedWriteRes<[P8_LU, P8_FX]> { let Latency = 5; }
110*5f757f3fSDimitry Andric  def P8_LS_FP_FX_2C : SchedWriteRes<[P8_LS, P8_FPU, P8_FX]> { let Latency = 2; }
111*5f757f3fSDimitry Andric  def P8_LS_FP_FX_3C : SchedWriteRes<[P8_LS, P8_FPU, P8_FX]> { let Latency = 3; }
112*5f757f3fSDimitry Andric  def P8_LS_3C : SchedWriteRes<[P8_LS]> { let Latency = 3; }
113*5f757f3fSDimitry Andric  def P8_FP_3C : SchedWriteRes<[P8_FPU]> { let Latency = 3; }
114*5f757f3fSDimitry Andric  def P8_FP_Scal_6C : SchedWriteRes<[P8_FP_Scal]> { let Latency = 6; }
115*5f757f3fSDimitry Andric  def P8_FP_4x32_6C : SchedWriteRes<[P8_FP_4x32]> { let Latency = 6; }
116*5f757f3fSDimitry Andric  def P8_FP_2x64_6C : SchedWriteRes<[P8_FP_2x64]> { let Latency = 6; }
117*5f757f3fSDimitry Andric  def P8_FP_26C : SchedWriteRes<[P8_FP_Scal]> { let Latency = 26; }
118*5f757f3fSDimitry Andric  def P8_FP_28C : SchedWriteRes<[P8_FP_4x32]> { let Latency = 28; }
119*5f757f3fSDimitry Andric  def P8_FP_31C : SchedWriteRes<[P8_FP_Scal]> { let Latency = 31; }
120*5f757f3fSDimitry Andric  def P8_FP_Scal_32C : SchedWriteRes<[P8_FP_Scal]> { let Latency = 32; }
121*5f757f3fSDimitry Andric  def P8_FP_2x64_32C : SchedWriteRes<[P8_FP_2x64]> { let Latency = 32; }
122*5f757f3fSDimitry Andric  def P8_FP_4x32_32C : SchedWriteRes<[P8_FP_4x32]> { let Latency = 32; }
123*5f757f3fSDimitry Andric  def P8_FP_Scal_43C : SchedWriteRes<[P8_FP_Scal]> { let Latency = 43; }
124*5f757f3fSDimitry Andric  def P8_FP_2x64_43C : SchedWriteRes<[P8_FP_2x64]> { let Latency = 43; }
125*5f757f3fSDimitry Andric  def P8_XS_2C : SchedWriteRes<[P8_XS]> { let Latency = 2; }
126*5f757f3fSDimitry Andric  def P8_PM_2C : SchedWriteRes<[P8_PM]> { let Latency = 2; }
127*5f757f3fSDimitry Andric  def P8_XS_4C : SchedWriteRes<[P8_XS]> { let Latency = 4; }
128*5f757f3fSDimitry Andric  def P8_VX_7C : SchedWriteRes<[P8_VX]> { let Latency = 7; }
129*5f757f3fSDimitry Andric  def P8_XS_9C : SchedWriteRes<[P8_XS]> { let Latency = 9; }
130*5f757f3fSDimitry Andric  def P8_CY_6C : SchedWriteRes<[P8_CY]> { let Latency = 6; }
131*5f757f3fSDimitry Andric  def P8_DFU_13C : SchedWriteRes<[P8_DFU]> { let Latency = 13; }
132*5f757f3fSDimitry Andric  def P8_DFU_15C : SchedWriteRes<[P8_DFU]> { let Latency = 15; }
133*5f757f3fSDimitry Andric  def P8_DFU_17C : SchedWriteRes<[P8_DFU]> { let Latency = 17; }
134*5f757f3fSDimitry Andric  def P8_DFU_25C : SchedWriteRes<[P8_DFU]> { let Latency = 25; }
135*5f757f3fSDimitry Andric  def P8_DFU_32C : SchedWriteRes<[P8_DFU]> { let Latency = 32; }
136*5f757f3fSDimitry Andric  def P8_DFU_34C : SchedWriteRes<[P8_DFU]> { let Latency = 34; }
137*5f757f3fSDimitry Andric  def P8_DFU_40C : SchedWriteRes<[P8_DFU]> { let Latency = 40; }
138*5f757f3fSDimitry Andric  def P8_DFU_90C : SchedWriteRes<[P8_DFU]> { let Latency = 90; }
139*5f757f3fSDimitry Andric  def P8_DFU_96C : SchedWriteRes<[P8_DFU]> { let Latency = 96; }
140*5f757f3fSDimitry Andric  def P8_DFU_172C : SchedWriteRes<[P8_DFU]> { let Latency = 172; }
141*5f757f3fSDimitry Andric  // Direct move instructions
142*5f757f3fSDimitry Andric  def P8_DM_5C : SchedWriteRes<[]> { let Latency = 5; }
143*5f757f3fSDimitry Andric
144*5f757f3fSDimitry Andric  // Instructions of CR pipeline
145*5f757f3fSDimitry Andric
146*5f757f3fSDimitry Andric  def : InstRW<[P8_CR_NONE, P8_ISSUE_CR], (instrs MFCR, MFCR8)>;
147*5f757f3fSDimitry Andric  def : InstRW<[P8_CR_3C, P8_ISSUE_CR], (instrs MFOCRF, MFOCRF8)>;
148*5f757f3fSDimitry Andric  def : InstRW<[P8_CR_5C, P8_ISSUE_CR], (instrs MFLR, MFLR8, MFCTR, MFCTR8)>;
149*5f757f3fSDimitry Andric
150*5f757f3fSDimitry Andric  // Instructions of CY pipeline
151*5f757f3fSDimitry Andric
152*5f757f3fSDimitry Andric  def : InstRW<[P8_CY_6C, P8_ISSUE_VSX], (instrs
153*5f757f3fSDimitry Andric    VCIPHER, VCIPHERLAST, VNCIPHER, VNCIPHERLAST, VPMSUMB, VPMSUMD, VPMSUMH, VPMSUMW, VSBOX)>;
154*5f757f3fSDimitry Andric
155*5f757f3fSDimitry Andric  // Instructions of FPU pipeline
156*5f757f3fSDimitry Andric
157*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_26C, P8_ISSUE_VSX], (instrs (instregex "^FDIVS(_rec)?$"), XSDIVSP)>;
158*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_28C, P8_ISSUE_VSX], (instrs XVDIVSP)>;
159*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_31C, P8_ISSUE_VSX], (instregex "^FSQRTS(_rec)?$")>;
160*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_Scal_32C, P8_ISSUE_VSX], (instrs FDIV, FDIV_rec, XSDIVDP)>;
161*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_2x64_32C, P8_ISSUE_VSX], (instrs XVDIVDP)>;
162*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_4x32_32C, P8_ISSUE_VSX], (instrs XVSQRTSP)>;
163*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_Scal_43C, P8_ISSUE_VSX], (instrs FSQRT, FSQRT_rec, XSSQRTDP)>;
164*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_2x64_43C, P8_ISSUE_VSX], (instrs XVSQRTDP)>;
165*5f757f3fSDimitry Andric
166*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_3C, P8_ISSUE_VSX], (instrs
167*5f757f3fSDimitry Andric    MTFSFI_rec, MTFSF_rec, MTFSFI, MTFSFIb, MTFSF, MTFSFb, MTFSB0, MTFSB1)>;
168*5f757f3fSDimitry Andric
169*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_Scal_6C, P8_ISSUE_VSX], (instrs
170*5f757f3fSDimitry Andric    (instregex "^F(N)?M(ADD|SUB)(S)?(_rec)?$"),
171*5f757f3fSDimitry Andric    (instregex "^XS(N)?M(ADD|SUB)(A|M)(D|S)P$"),
172*5f757f3fSDimitry Andric    (instregex "^FC(F|T)I(D|W)(U)?(S|Z)?(_rec)?$"),
173*5f757f3fSDimitry Andric    (instregex "^(F|XS)(ABS|CPSGN|ADD|MUL|NABS|RE|NEG|SUB|SEL|RSQRTE)(D|S)?(P)?(s)?(_rec)?$"),
174*5f757f3fSDimitry Andric    (instregex "^FRI(M|N|P|Z)(D|S)(_rec)?$"),
175*5f757f3fSDimitry Andric    (instregex "^XSCVDP(S|U)X(W|D)S(s)?$"),
176*5f757f3fSDimitry Andric    (instregex "^XSCV(S|U)XD(D|S)P$"),
177*5f757f3fSDimitry Andric    (instregex "^XSCV(D|S)P(S|D)P(N)?$"),
178*5f757f3fSDimitry Andric    (instregex "^XSRDPI(C|M|P|Z)?$"),
179*5f757f3fSDimitry Andric    FMR, FRSP, FMR_rec, FRSP_rec, XSRSP)>;
180*5f757f3fSDimitry Andric
181*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_4x32_6C, P8_ISSUE_VSX], (instrs
182*5f757f3fSDimitry Andric    (instregex "^XV(N)?M(ADD|SUB)(A|M)SP$"),
183*5f757f3fSDimitry Andric    (instregex "^VRFI(M|N|P|Z)$"),
184*5f757f3fSDimitry Andric    XVRSQRTESP, XVSUBSP, VADDFP, VEXPTEFP, VLOGEFP, VMADDFP, VNMSUBFP, VREFP,
185*5f757f3fSDimitry Andric    VRSQRTEFP, VSUBFP, XVCVSXWSP, XVCVUXWSP, XVMULSP, XVNABSSP, XVNEGSP, XVRESP,
186*5f757f3fSDimitry Andric    XVCVDPSP, XVCVSXDSP, XVCVUXDSP, XVABSSP, XVADDSP, XVCPSGNSP)>;
187*5f757f3fSDimitry Andric
188*5f757f3fSDimitry Andric  def : InstRW<[P8_FP_2x64_6C, P8_ISSUE_VSX], (instrs
189*5f757f3fSDimitry Andric    (instregex "^XVR(D|S)PI(C|M|P|Z)?$"),
190*5f757f3fSDimitry Andric    (instregex "^XVCV(S|U)X(D|W)DP$"),
191*5f757f3fSDimitry Andric    (instregex "^XVCV(D|W|S)P(S|U)X(D|W)S$"),
192*5f757f3fSDimitry Andric    (instregex "^XV(N)?(M)?(RSQRTE|CPSGN|SUB|ADD|ABS|UL|NEG|RE)(A|M)?DP$"),
193*5f757f3fSDimitry Andric    XVCVSPDP)>;
194*5f757f3fSDimitry Andric
195*5f757f3fSDimitry Andric  // Instructions of FX, LU or LS pipeline
196*5f757f3fSDimitry Andric
197*5f757f3fSDimitry Andric  def : InstRW<[P8_FX_NONE, P8_ISSUE_FX], (instrs TDI, TWI, TD, TW, MTCRF, MTCRF8, MTOCRF, MTOCRF8)>;
198*5f757f3fSDimitry Andric  def : InstRW<[P8_FX_1C, P8_ISSUE_FX], (instregex "^RLWIMI(8)?$")>;
199*5f757f3fSDimitry Andric  // TODO: Pipeline of logical instructions might be LS or FX
200*5f757f3fSDimitry Andric  def : InstRW<[P8_FX_2C, P8_ISSUE_FX], (instrs
201*5f757f3fSDimitry Andric    (instregex "^(N|X)?(EQV|AND|OR)(I)?(S|C)?(8)?(_rec)?$"),
202*5f757f3fSDimitry Andric    (instregex "^EXTS(B|H|W)(8)?(_32)?(_64)?(_rec)?$"),
203*5f757f3fSDimitry Andric    (instregex "^RL(D|W)(I)?(NM|C)(L|R)?(8)?(_32)?(_64)?(_rec)?$"),
204*5f757f3fSDimitry Andric    (instregex "^S(L|R)(A)?(W|D)(I)?(8)?(_rec|_32)?$"),
205*5f757f3fSDimitry Andric    (instregex "^(ADD|SUBF)(M|Z)?(C|E)?(4|8)?O(_rec)?$"),
206*5f757f3fSDimitry Andric    (instregex "^(ADD|SUBF)(M|Z)?E(8)?_rec$"),
207*5f757f3fSDimitry Andric    (instregex "^(ADD|SUBF|NEG)(4|8)?_rec$"),
208*5f757f3fSDimitry Andric    NOP, ADDG6S, ADDG6S8, ADDZE, ADDZE8, ADDIC_rec, NEGO_rec, ADDC, ADDC8, SUBFC, SUBFC8,
209*5f757f3fSDimitry Andric    ADDC_rec, ADDC8_rec, SUBFC_rec, SUBFC8_rec, COPY, NEG8O_rec,
210*5f757f3fSDimitry Andric    RLDIMI, RLDIMI_rec, RLWIMI8_rec, RLWIMI_rec)>;
211*5f757f3fSDimitry Andric
212*5f757f3fSDimitry Andric  def : InstRW<[P8_FX_3C], (instregex "^(POP)?CNT(LZ)?(B|W|D)(8)?(_rec)?$")>;
213*5f757f3fSDimitry Andric  def : InstRW<[P8_FX_5C, P8_ISSUE_FX], (instrs
214*5f757f3fSDimitry Andric    (instregex "^MUL(H|L)(I|W|D)(8)?(U|O)?(_rec)?$"),
215*5f757f3fSDimitry Andric    CMPDI,CMPWI,CMPD,CMPW,CMPLDI,CMPLWI,CMPLD,CMPLW,
216*5f757f3fSDimitry Andric    ISEL, ISEL8, MTLR, MTLR8, MTCTR, MTCTR8, MTCTR8loop, MTCTRloop)>;
217*5f757f3fSDimitry Andric
218*5f757f3fSDimitry Andric  def : InstRW<[P8_FX_10C, P8_ISSUE_VSX], (instregex "^MFTB(8)?$")>;
219*5f757f3fSDimitry Andric  def : InstRW<[P8_FX_15C, P8_ISSUE_FX], (instregex "^DIVW(U)?$")>;
220*5f757f3fSDimitry Andric
221*5f757f3fSDimitry Andric  def : InstRW<[P8_FX_23C, P8_ISSUE_FX], (instregex "^DIV(D|WE)(U)?$")>;
222*5f757f3fSDimitry Andric  def : InstRW<[P8_FX_41C], (instrs
223*5f757f3fSDimitry Andric    (instregex "^DIV(D|W)(E)?(U)?O(_rec)?$"),
224*5f757f3fSDimitry Andric    (instregex "^DIV(D|W)(E)?(U)?_rec$"),
225*5f757f3fSDimitry Andric    DIVDE, DIVDEU)>;
226*5f757f3fSDimitry Andric
227*5f757f3fSDimitry Andric  def : InstRW<[P8_LS_3C, P8_ISSUE_FX], (instrs MFSR, MFSRIN)>;
228*5f757f3fSDimitry Andric
229*5f757f3fSDimitry Andric  def : InstRW<[P8_LU_5C, P8_ISSUE_LD], (instrs
230*5f757f3fSDimitry Andric    LFS, LFSX, LFD, LFDX, LFDXTLS, LFDXTLS_, LXVD2X, LXVW4X, LXVDSX, LVEBX, LVEHX, LVEWX,
231*5f757f3fSDimitry Andric    LVX, LVXL, LXSDX, LFIWAX, LFIWZX, LFSXTLS, LFSXTLS_, LXVB16X, LXVD2X, LXSIWZX,
232*5f757f3fSDimitry Andric    DFLOADf64, XFLOADf64, LIWZX)>;
233*5f757f3fSDimitry Andric
234*5f757f3fSDimitry Andric  def : InstRW<[P8_LS_FX_3C, P8_ISSUE_FXLD], (instrs LQ)>;
235*5f757f3fSDimitry Andric  def : InstRW<[P8_LU_FX_5C, P8_ISSUE_LD], (instregex "^LF(D|S)U(X)?$")>;
236*5f757f3fSDimitry Andric
237*5f757f3fSDimitry Andric  def : InstRW<[P8_LS_FP_NONE, P8_ISSUE_ST], (instrs
238*5f757f3fSDimitry Andric    STXSDX, STXVD2X, STXVW4X, STFIWX, STFS, STFSX, STFD, STFDX,
239*5f757f3fSDimitry Andric    STFDEPX, STFDXTLS, STFDXTLS_, STFSXTLS, STFSXTLS_, STXSIWX, STXSSP, STXSSPX)>;
240*5f757f3fSDimitry Andric
241*5f757f3fSDimitry Andric  def : InstRW<[P8_LS_FP_FX_2C, P8_ISSUE_ST], (instrs STVEBX, STVEHX, STVEWX, STVX, STVXL)>;
242*5f757f3fSDimitry Andric  def : InstRW<[P8_LS_FP_FX_3C, P8_ISSUE_ST], (instregex "^STF(D|S)U(X)?$")>;
243*5f757f3fSDimitry Andric
244*5f757f3fSDimitry Andric  def : InstRW<[P8_LS_LU_NONE, P8_ISSUE_ST], (instrs
245*5f757f3fSDimitry Andric    (instregex "^ST(B|H|W|D)(U)?(X)?(8|TLS)?(_)?(32)?$"),
246*5f757f3fSDimitry Andric    STBCIX, STBCX, STBEPX, STDBRX, STDCIX, STDCX, STHBRX, STHCIX, STHCX, STHEPX,
247*5f757f3fSDimitry Andric    STMW, STSWI, STWBRX, STWCIX, STWCX, STWEPX)>;
248*5f757f3fSDimitry Andric
249*5f757f3fSDimitry Andric  def : InstRW<[P8_LU_or_LS_FX_3C, P8_ISSUE_FXLD],
250*5f757f3fSDimitry Andric    (instregex "^L(B|H|W|D)(A|Z)?(U)?(X)?(8|TLS)?(_)?(32)?$")>;
251*5f757f3fSDimitry Andric
252*5f757f3fSDimitry Andric  def : InstRW<[P8_LU_or_LS_3C, P8_ISSUE_FXLD], (instrs
253*5f757f3fSDimitry Andric    LBARX, LBARXL, LBEPX, LBZCIX, LDARX, LDARXL, LDBRX, LDCIX, LFDEPX, LHARX, LHARXL, LHBRX, LXSIWAX,
254*5f757f3fSDimitry Andric    LHBRX8, LHEPX, LHZCIX, LMW, LSWI, LVSL, LVSR, LWARX, LWARXL, LWBRX, LWBRX8, LWEPX, LWZCIX)>;
255*5f757f3fSDimitry Andric
256*5f757f3fSDimitry Andric  def : InstRW<[P8_LU_or_LS_or_FX_2C, P8_ISSUE_FX], (instrs
257*5f757f3fSDimitry Andric    (instregex "^ADDI(C)?(dtprel|tlsgd|toc)?(L)?(ADDR)?(32|8)?$"),
258*5f757f3fSDimitry Andric    (instregex "^ADDIS(dtprel|tlsgd|toc|gotTprel)?(HA)?(32|8)?$"),
259*5f757f3fSDimitry Andric    (instregex "^LI(S)?(8)?$"),
260*5f757f3fSDimitry Andric    (instregex "^ADD(M)?(E)?(4|8)?(TLS)?(_)?$"),
261*5f757f3fSDimitry Andric    (instregex "^SUBF(M|Z)?(E)?(IC)?(4|8)?$"),
262*5f757f3fSDimitry Andric    (instregex "^NEG(8)?(O)?$"))>;
263*5f757f3fSDimitry Andric
264*5f757f3fSDimitry Andric  // Instructions of PM pipeline
265*5f757f3fSDimitry Andric
266*5f757f3fSDimitry Andric  def : InstRW<[P8_PM_2C, P8_ISSUE_VSX], (instrs
267*5f757f3fSDimitry Andric    (instregex "^VPK(S|U)(H|W|D)(S|U)(M|S)$"),
268*5f757f3fSDimitry Andric    (instregex "^VUPK(H|L)(P|S)(H|B|W|X)$"),
269*5f757f3fSDimitry Andric    (instregex "^VSPLT(IS)?(B|H|W)(s)?$"),
270*5f757f3fSDimitry Andric    (instregex "^(XX|V)MRG(E|O|H|L)(B|H|W)$"),
271*5f757f3fSDimitry Andric    XXPERMDI, XXPERMDIs, XXSEL, XXSLDWI, XXSLDWIs, XXSPLTW, XXSPLTWs, VPERMXOR,
272*5f757f3fSDimitry Andric    VPKPX, VPERM, VBPERMQ, VGBBD, VSEL, VSL, VSLDOI, VSLO, VSR, VSRO)>;
273*5f757f3fSDimitry Andric
274*5f757f3fSDimitry Andric  def : InstRW<[P8_XS_2C, P8_ISSUE_VSX], (instrs
275*5f757f3fSDimitry Andric    (instregex "^V(ADD|SUB)(S|U)(B|H|W|D)(M|S)$"),
276*5f757f3fSDimitry Andric    (instregex "^X(S|V)(MAX|MIN)(D|S)P$"),
277*5f757f3fSDimitry Andric    (instregex "^V(S)?(R)?(L)?(A)?(B|D|H|W)$"),
278*5f757f3fSDimitry Andric    (instregex "^VAVG(S|U)(B|H|W)$"),
279*5f757f3fSDimitry Andric    (instregex "^VM(AX|IN)(S|U)(B|H|W|D)$"),
280*5f757f3fSDimitry Andric    (instregex "^(XX|V)(L)?(N)?(X)?(AND|OR|EQV)(C)?$"),
281*5f757f3fSDimitry Andric    (instregex "^(X)?VCMP(EQ|GT|GE|B)(F|S|U)?(B|H|W|D|P|S)(P)?(_rec)?$"),
282*5f757f3fSDimitry Andric    (instregex "^VCLZ(B|H|W|D)$"),
283*5f757f3fSDimitry Andric    (instregex "^VPOPCNT(B|H|W)$"),
284*5f757f3fSDimitry Andric    XXLORf, XXLXORdpz, XXLXORspz, XXLXORz, VEQV, VMAXFP, VMINFP,
285*5f757f3fSDimitry Andric    VSHASIGMAD, VSHASIGMAW, VSUBCUW, VADDCUW, MFVSCR, MTVSCR)>;
286*5f757f3fSDimitry Andric
287*5f757f3fSDimitry Andric  def : InstRW<[P8_XS_4C, P8_ISSUE_VSX], (instrs
288*5f757f3fSDimitry Andric    (instregex "^V(ADD|SUB)(E)?(C)?UQ(M)?$"),
289*5f757f3fSDimitry Andric    VPOPCNTD)>;
290*5f757f3fSDimitry Andric
291*5f757f3fSDimitry Andric  def : InstRW<[P8_XS_9C, P8_ISSUE_CR], (instrs
292*5f757f3fSDimitry Andric    (instregex "^(F|XS)CMP(O|U)(D|S)(P)?$"),
293*5f757f3fSDimitry Andric    (instregex "^(F|XS|XV)T(DIV|SQRT)((D|S)P)?$"))>;
294*5f757f3fSDimitry Andric
295*5f757f3fSDimitry Andric  // Instructions of VX pipeline
296*5f757f3fSDimitry Andric
297*5f757f3fSDimitry Andric  def : InstRW<[P8_VX_7C, P8_ISSUE_VSX], (instrs
298*5f757f3fSDimitry Andric    (instregex "^V(M)?SUM(2|4)?(M|S|U)(B|H|W)(M|S)$"),
299*5f757f3fSDimitry Andric    (instregex "^VMUL(E|O)?(S|U)(B|H|W)(M)?$"),
300*5f757f3fSDimitry Andric    VMHADDSHS, VMHRADDSHS, VMLADDUHM)>;
301*5f757f3fSDimitry Andric
302*5f757f3fSDimitry Andric  // Instructions of BR pipeline
303*5f757f3fSDimitry Andric
304*5f757f3fSDimitry Andric  def : InstRW<[P8_BR_2C, P8_ISSUE_BR], (instrs
305*5f757f3fSDimitry Andric    (instregex "^(g)?B(C)?(C)?(CTR)?(L)?(A)?(R)?(L)?(8)?(_LD|_LWZ)?(always|into_toc|at)?(_RM)?(n)?$"),
306*5f757f3fSDimitry Andric    (instregex "^BD(N)?Z(L)?(R|A)?(L)?(m|p|8)?$"),
307*5f757f3fSDimitry Andric    (instregex "^BL(R|A)?(8)?(_NOP)?(_TLS)?(_)?(RM)?$"))>;
308*5f757f3fSDimitry Andric
309*5f757f3fSDimitry Andric  // Instructions of DFP pipeline
310*5f757f3fSDimitry Andric  // DFP operations also use float/vector/crypto issue ports.
311*5f757f3fSDimitry Andric  def : InstRW<[P8_DFU_13C, P8_ISSUE_VSX], (instrs
312*5f757f3fSDimitry Andric    (instregex "^DTST(D|S)(C|F|G)(Q)?$"),
313*5f757f3fSDimitry Andric    (instregex "^D(Q|X)EX(Q)?(_rec)?$"),
314*5f757f3fSDimitry Andric    (instregex "^D(ADD|SUB|IEX|QUA|RRND|RINTX|RINTN|CTDP|DEDPD|ENBCD)(_rec)?$"),
315*5f757f3fSDimitry Andric    (instregex "^DSC(L|R)I(_rec)?$"),
316*5f757f3fSDimitry Andric    BCDADD_rec, BCDSUB_rec, DCMPO, DCMPU, DTSTEX, DQUAI)>;
317*5f757f3fSDimitry Andric
318*5f757f3fSDimitry Andric  def : InstRW<[P8_DFU_15C, P8_ISSUE_VSX], (instrs
319*5f757f3fSDimitry Andric    (instregex "^DRINT(N|X)Q(_rec)?$"),
320*5f757f3fSDimitry Andric    DCMPOQ, DCMPUQ, DRRNDQ, DRRNDQ_rec, DIEXQ, DIEXQ_rec, DQUAIQ, DQUAIQ_rec,
321*5f757f3fSDimitry Andric    DTSTEXQ, DDEDPDQ, DDEDPDQ_rec, DENBCDQ, DENBCDQ_rec, DSCLIQ, DSCLIQ_rec,
322*5f757f3fSDimitry Andric    DSCRIQ, DSCRIQ_rec, DCTQPQ, DCTQPQ_rec)>;
323*5f757f3fSDimitry Andric
324*5f757f3fSDimitry Andric  def : InstRW<[P8_DFU_17C, P8_ISSUE_VSX], (instregex "^D(ADD|SUB|QUA)Q(_rec)?$")>;
325*5f757f3fSDimitry Andric  def : InstRW<[P8_DFU_25C, P8_ISSUE_VSX], (instrs DRSP, DRSP_rec, DCTFIX, DCTFIX_rec)>;
326*5f757f3fSDimitry Andric  def : InstRW<[P8_DFU_32C, P8_ISSUE_VSX], (instrs DCFFIX, DCFFIX_rec)>;
327*5f757f3fSDimitry Andric  def : InstRW<[P8_DFU_34C, P8_ISSUE_VSX], (instrs DCFFIXQ, DCFFIXQ_rec)>;
328*5f757f3fSDimitry Andric  def : InstRW<[P8_DFU_40C, P8_ISSUE_VSX], (instrs DMUL, DMUL_rec)>;
329*5f757f3fSDimitry Andric  def : InstRW<[P8_DFU_90C, P8_ISSUE_VSX], (instrs DMULQ, DMULQ_rec)>;
330*5f757f3fSDimitry Andric  def : InstRW<[P8_DFU_96C, P8_ISSUE_VSX], (instrs DDIV, DDIV_rec)>;
331*5f757f3fSDimitry Andric  def : InstRW<[P8_DFU_172C, P8_ISSUE_VSX], (instrs DDIVQ, DDIVQ_rec)>;
332*5f757f3fSDimitry Andric
333*5f757f3fSDimitry Andric  // Direct move instructions
334*5f757f3fSDimitry Andric
335*5f757f3fSDimitry Andric   def : InstRW<[P8_DM_5C, P8_ISSUE_VSX], (instrs
336*5f757f3fSDimitry Andric     MFVRD, MFVSRD, MFVRWZ, MFVSRWZ, MTVRD, MTVSRD, MTVRWA, MTVSRWA, MTVRWZ, MTVSRWZ)>;
337*5f757f3fSDimitry Andric}
338