1//-- SystemZScheduleZ13.td - SystemZ Scheduling Definitions ----*- tblgen -*-=// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the machine model for Z13 to support instruction 11// scheduling and other instruction cost heuristics. 12// 13//===----------------------------------------------------------------------===// 14 15def Z13Model : SchedMachineModel { 16 17 let UnsupportedFeatures = Arch11UnsupportedFeatures.List; 18 19 let IssueWidth = 8; 20 let MicroOpBufferSize = 60; // Issue queues 21 let LoadLatency = 1; // Optimistic load latency. 22 23 let PostRAScheduler = 1; 24 25 // Extra cycles for a mispredicted branch. 26 let MispredictPenalty = 20; 27} 28 29let SchedModel = Z13Model in { 30 31// These definitions could be put in a subtarget common include file, 32// but it seems the include system in Tablegen currently rejects 33// multiple includes of same file. 34def : WriteRes<GroupAlone, []> { 35 let NumMicroOps = 0; 36 let BeginGroup = 1; 37 let EndGroup = 1; 38} 39def : WriteRes<BeginGroup, []> { 40 let NumMicroOps = 0; 41 let BeginGroup = 1; 42} 43def : WriteRes<EndGroup, []> { 44 let NumMicroOps = 0; 45 let EndGroup = 1; 46} 47def : WriteRes<Lat2, []> { let Latency = 2; let NumMicroOps = 0;} 48def : WriteRes<Lat3, []> { let Latency = 3; let NumMicroOps = 0;} 49def : WriteRes<Lat4, []> { let Latency = 4; let NumMicroOps = 0;} 50def : WriteRes<Lat5, []> { let Latency = 5; let NumMicroOps = 0;} 51def : WriteRes<Lat6, []> { let Latency = 6; let NumMicroOps = 0;} 52def : WriteRes<Lat7, []> { let Latency = 7; let NumMicroOps = 0;} 53def : WriteRes<Lat8, []> { let Latency = 8; let NumMicroOps = 0;} 54def : WriteRes<Lat9, []> { let Latency = 9; let NumMicroOps = 0;} 55def : WriteRes<Lat10, []> { let Latency = 10; let NumMicroOps = 0;} 56def : WriteRes<Lat11, []> { let Latency = 11; let NumMicroOps = 0;} 57def : WriteRes<Lat12, []> { let Latency = 12; let NumMicroOps = 0;} 58def : WriteRes<Lat15, []> { let Latency = 15; let NumMicroOps = 0;} 59def : WriteRes<Lat20, []> { let Latency = 20; let NumMicroOps = 0;} 60def : WriteRes<Lat30, []> { let Latency = 30; let NumMicroOps = 0;} 61 62// Execution units. 63def Z13_FXaUnit : ProcResource<2>; 64def Z13_FXbUnit : ProcResource<2>; 65def Z13_LSUnit : ProcResource<2>; 66def Z13_VecUnit : ProcResource<2>; 67def Z13_VecFPdUnit : ProcResource<2> { let BufferSize = 1; /* blocking */ } 68def Z13_VBUnit : ProcResource<2>; 69 70// Subtarget specific definitions of scheduling resources. 71def : WriteRes<FXa, [Z13_FXaUnit]> { let Latency = 1; } 72def : WriteRes<FXa2, [Z13_FXaUnit, Z13_FXaUnit]> { let Latency = 2; } 73def : WriteRes<FXb, [Z13_FXbUnit]> { let Latency = 1; } 74def : WriteRes<LSU, [Z13_LSUnit]> { let Latency = 4; } 75def : WriteRes<VecBF, [Z13_VecUnit]> { let Latency = 8; } 76def : WriteRes<VecBF2, [Z13_VecUnit, Z13_VecUnit]> { let Latency = 9; } 77def : WriteRes<VecDF, [Z13_VecUnit]> { let Latency = 8; } 78def : WriteRes<VecDF2, [Z13_VecUnit, Z13_VecUnit]> { let Latency = 9; } 79def : WriteRes<VecFPd, [Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit, 80 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit, 81 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit, 82 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit, 83 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit, 84 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit, 85 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit, 86 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit, 87 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit, 88 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit]> 89 { let Latency = 30; } 90def : WriteRes<VecMul, [Z13_VecUnit]> { let Latency = 5; } 91def : WriteRes<VecStr, [Z13_VecUnit]> { let Latency = 4; } 92def : WriteRes<VecXsPm, [Z13_VecUnit]> { let Latency = 3; } 93def : WriteRes<VBU, [Z13_VBUnit]>; // Virtual Branching Unit 94 95// -------------------------- INSTRUCTIONS ---------------------------------- // 96 97// InstRW constructs have been used in order to preserve the 98// readability of the InstrInfo files. 99 100// For each instruction, as matched by a regexp, provide a list of 101// resources that it needs. These will be combined into a SchedClass. 102 103//===----------------------------------------------------------------------===// 104// Stack allocation 105//===----------------------------------------------------------------------===// 106 107def : InstRW<[FXa], (instregex "ADJDYNALLOC$")>; // Pseudo -> LA / LAY 108 109//===----------------------------------------------------------------------===// 110// Branch instructions 111//===----------------------------------------------------------------------===// 112 113// Branch 114def : InstRW<[VBU], (instregex "(Call)?BRC(L)?(Asm.*)?$")>; 115def : InstRW<[VBU], (instregex "(Call)?J(G)?(Asm.*)?$")>; 116def : InstRW<[FXb], (instregex "(Call)?BC(R)?(Asm.*)?$")>; 117def : InstRW<[FXb], (instregex "(Call)?B(R)?(Asm.*)?$")>; 118def : InstRW<[FXa, EndGroup], (instregex "BRCT(G)?$")>; 119def : InstRW<[FXb, FXa, Lat2, GroupAlone], (instregex "BRCTH$")>; 120def : InstRW<[FXb, FXa, Lat2, GroupAlone], (instregex "BCT(G)?(R)?$")>; 121def : InstRW<[FXa, FXa, FXb, FXb, Lat4, GroupAlone], 122 (instregex "B(R)?X(H|L).*$")>; 123 124// Compare and branch 125def : InstRW<[FXb], (instregex "C(L)?(G)?(I|R)J(Asm.*)?$")>; 126def : InstRW<[FXb, FXb, Lat2, GroupAlone], 127 (instregex "C(L)?(G)?(I|R)B(Call|Return|Asm.*)?$")>; 128 129//===----------------------------------------------------------------------===// 130// Trap instructions 131//===----------------------------------------------------------------------===// 132 133// Trap 134def : InstRW<[VBU], (instregex "(Cond)?Trap$")>; 135 136// Compare and trap 137def : InstRW<[FXb], (instregex "C(G)?(I|R)T(Asm.*)?$")>; 138def : InstRW<[FXb], (instregex "CL(G)?RT(Asm.*)?$")>; 139def : InstRW<[FXb], (instregex "CL(F|G)IT(Asm.*)?$")>; 140def : InstRW<[FXb, LSU, Lat5], (instregex "CL(G)?T(Asm.*)?$")>; 141 142//===----------------------------------------------------------------------===// 143// Call and return instructions 144//===----------------------------------------------------------------------===// 145 146// Call 147def : InstRW<[VBU, FXa, FXa, Lat3, GroupAlone], (instregex "(Call)?BRAS$")>; 148def : InstRW<[FXa, FXa, FXb, Lat3, GroupAlone], (instregex "(Call)?BRASL$")>; 149def : InstRW<[FXa, FXa, FXb, Lat3, GroupAlone], (instregex "(Call)?BAS(R)?$")>; 150def : InstRW<[FXa, FXa, FXb, Lat3, GroupAlone], (instregex "TLS_(G|L)DCALL$")>; 151 152// Return 153def : InstRW<[FXb, EndGroup], (instregex "Return$")>; 154def : InstRW<[FXb], (instregex "CondReturn$")>; 155 156//===----------------------------------------------------------------------===// 157// Select instructions 158//===----------------------------------------------------------------------===// 159 160// Select pseudo 161def : InstRW<[FXa], (instregex "Select(32|64|32Mux)$")>; 162 163// CondStore pseudos 164def : InstRW<[FXa], (instregex "CondStore16(Inv)?$")>; 165def : InstRW<[FXa], (instregex "CondStore16Mux(Inv)?$")>; 166def : InstRW<[FXa], (instregex "CondStore32(Inv)?$")>; 167def : InstRW<[FXa], (instregex "CondStore32Mux(Inv)?$")>; 168def : InstRW<[FXa], (instregex "CondStore64(Inv)?$")>; 169def : InstRW<[FXa], (instregex "CondStore8(Inv)?$")>; 170def : InstRW<[FXa], (instregex "CondStore8Mux(Inv)?$")>; 171 172//===----------------------------------------------------------------------===// 173// Move instructions 174//===----------------------------------------------------------------------===// 175 176// Moves 177def : InstRW<[FXb, LSU, Lat5], (instregex "MV(G|H)?HI$")>; 178def : InstRW<[FXb, LSU, Lat5], (instregex "MVI(Y)?$")>; 179 180// Move character 181def : InstRW<[FXb, LSU, LSU, LSU, Lat8, GroupAlone], (instregex "MVC$")>; 182 183// Pseudo -> reg move 184def : InstRW<[FXa], (instregex "COPY(_TO_REGCLASS)?$")>; 185def : InstRW<[FXa], (instregex "EXTRACT_SUBREG$")>; 186def : InstRW<[FXa], (instregex "INSERT_SUBREG$")>; 187def : InstRW<[FXa], (instregex "REG_SEQUENCE$")>; 188def : InstRW<[FXa], (instregex "SUBREG_TO_REG$")>; 189 190// Loads 191def : InstRW<[LSU], (instregex "L(Y|FH|RL|Mux|CBB)?$")>; 192def : InstRW<[LSU], (instregex "LG(RL)?$")>; 193def : InstRW<[LSU], (instregex "L128$")>; 194 195def : InstRW<[FXa], (instregex "LLIH(F|H|L)$")>; 196def : InstRW<[FXa], (instregex "LLIL(F|H|L)$")>; 197 198def : InstRW<[FXa], (instregex "LG(F|H)I$")>; 199def : InstRW<[FXa], (instregex "LHI(Mux)?$")>; 200def : InstRW<[FXa], (instregex "LR(Mux)?$")>; 201 202// Load and zero rightmost byte 203def : InstRW<[LSU], (instregex "LZR(F|G)$")>; 204 205// Load and trap 206def : InstRW<[FXb, LSU, Lat5], (instregex "L(FH|G)?AT$")>; 207 208// Load and test 209def : InstRW<[FXa, LSU, Lat5], (instregex "LT(G)?$")>; 210def : InstRW<[FXa], (instregex "LT(G)?R$")>; 211 212// Stores 213def : InstRW<[FXb, LSU, Lat5], (instregex "STG(RL)?$")>; 214def : InstRW<[FXb, LSU, Lat5], (instregex "ST128$")>; 215def : InstRW<[FXb, LSU, Lat5], (instregex "ST(Y|FH|RL|Mux)?$")>; 216 217// String moves. 218def : InstRW<[LSU, Lat30, GroupAlone], (instregex "MVST$")>; 219 220//===----------------------------------------------------------------------===// 221// Conditional move instructions 222//===----------------------------------------------------------------------===// 223 224def : InstRW<[FXa, Lat2], (instregex "LOCRMux$")>; 225def : InstRW<[FXa, Lat2], (instregex "LOC(G|FH)?R(Asm.*)?$")>; 226def : InstRW<[FXa, Lat2], (instregex "LOC(G|H)?HI(Asm.*)?$")>; 227def : InstRW<[FXa, LSU, Lat6], (instregex "LOC(G|FH|Mux)?(Asm.*)?$")>; 228def : InstRW<[FXb, LSU, Lat5], (instregex "STOC(G|FH|Mux)?(Asm.*)?$")>; 229 230//===----------------------------------------------------------------------===// 231// Sign extensions 232//===----------------------------------------------------------------------===// 233 234def : InstRW<[FXa], (instregex "L(B|H|G)R$")>; 235def : InstRW<[FXa], (instregex "LG(B|H|F)R$")>; 236 237def : InstRW<[FXa, LSU, Lat5], (instregex "LTGF$")>; 238def : InstRW<[FXa], (instregex "LTGFR$")>; 239 240def : InstRW<[FXa, LSU, Lat5], (instregex "LB(H|Mux)?$")>; 241def : InstRW<[FXa, LSU, Lat5], (instregex "LH(Y)?$")>; 242def : InstRW<[FXa, LSU, Lat5], (instregex "LH(H|Mux|RL)$")>; 243def : InstRW<[FXa, LSU, Lat5], (instregex "LG(B|H|F)$")>; 244def : InstRW<[FXa, LSU, Lat5], (instregex "LG(H|F)RL$")>; 245 246//===----------------------------------------------------------------------===// 247// Zero extensions 248//===----------------------------------------------------------------------===// 249 250def : InstRW<[FXa], (instregex "LLCR(Mux)?$")>; 251def : InstRW<[FXa], (instregex "LLHR(Mux)?$")>; 252def : InstRW<[FXa], (instregex "LLG(C|H|F|T)R$")>; 253def : InstRW<[LSU], (instregex "LLC(Mux)?$")>; 254def : InstRW<[LSU], (instregex "LLH(Mux)?$")>; 255def : InstRW<[FXa, LSU, Lat5], (instregex "LL(C|H)H$")>; 256def : InstRW<[LSU], (instregex "LLHRL$")>; 257def : InstRW<[LSU], (instregex "LLG(C|H|F|T|HRL|FRL)$")>; 258 259// Load and zero rightmost byte 260def : InstRW<[LSU], (instregex "LLZRGF$")>; 261 262// Load and trap 263def : InstRW<[FXb, LSU, Lat5], (instregex "LLG(F|T)?AT$")>; 264 265//===----------------------------------------------------------------------===// 266// Truncations 267//===----------------------------------------------------------------------===// 268 269def : InstRW<[FXb, LSU, Lat5], (instregex "STC(H|Y|Mux)?$")>; 270def : InstRW<[FXb, LSU, Lat5], (instregex "STH(H|Y|RL|Mux)?$")>; 271 272//===----------------------------------------------------------------------===// 273// Multi-register moves 274//===----------------------------------------------------------------------===// 275 276// Load multiple (estimated average of 5 ops) 277def : InstRW<[LSU, LSU, LSU, LSU, LSU, Lat10, GroupAlone], 278 (instregex "LM(H|Y|G)?$")>; 279 280// Store multiple (estimated average of ceil(5/2) FXb ops) 281def : InstRW<[LSU, LSU, FXb, FXb, FXb, Lat10, 282 GroupAlone], (instregex "STM(G|H|Y)?$")>; 283 284//===----------------------------------------------------------------------===// 285// Byte swaps 286//===----------------------------------------------------------------------===// 287 288def : InstRW<[FXa], (instregex "LRV(G)?R$")>; 289def : InstRW<[FXa, LSU, Lat5], (instregex "LRV(G|H)?$")>; 290def : InstRW<[FXb, LSU, Lat5], (instregex "STRV(G|H)?$")>; 291 292//===----------------------------------------------------------------------===// 293// Load address instructions 294//===----------------------------------------------------------------------===// 295 296def : InstRW<[FXa], (instregex "LA(Y|RL)?$")>; 297 298// Load the Global Offset Table address ( -> larl ) 299def : InstRW<[FXa], (instregex "GOT$")>; 300 301//===----------------------------------------------------------------------===// 302// Absolute and Negation 303//===----------------------------------------------------------------------===// 304 305def : InstRW<[FXa, Lat2], (instregex "LP(G)?R$")>; 306def : InstRW<[FXa, FXa, Lat3, BeginGroup], (instregex "L(N|P)GFR$")>; 307def : InstRW<[FXa, Lat2], (instregex "LN(R|GR)$")>; 308def : InstRW<[FXa], (instregex "LC(R|GR)$")>; 309def : InstRW<[FXa, FXa, Lat2, BeginGroup], (instregex "LCGFR$")>; 310 311//===----------------------------------------------------------------------===// 312// Insertion 313//===----------------------------------------------------------------------===// 314 315def : InstRW<[FXa, LSU, Lat5], (instregex "IC(Y)?$")>; 316def : InstRW<[FXa, LSU, Lat5], (instregex "IC32(Y)?$")>; 317def : InstRW<[FXa, LSU, Lat5], (instregex "ICM(H|Y)?$")>; 318def : InstRW<[FXa], (instregex "II(F|H|L)Mux$")>; 319def : InstRW<[FXa], (instregex "IIHF(64)?$")>; 320def : InstRW<[FXa], (instregex "IIHH(64)?$")>; 321def : InstRW<[FXa], (instregex "IIHL(64)?$")>; 322def : InstRW<[FXa], (instregex "IILF(64)?$")>; 323def : InstRW<[FXa], (instregex "IILH(64)?$")>; 324def : InstRW<[FXa], (instregex "IILL(64)?$")>; 325 326//===----------------------------------------------------------------------===// 327// Addition 328//===----------------------------------------------------------------------===// 329 330def : InstRW<[FXa, LSU, Lat5], (instregex "A(Y)?$")>; 331def : InstRW<[FXa, LSU, Lat6], (instregex "AH(Y)?$")>; 332def : InstRW<[FXa], (instregex "AIH$")>; 333def : InstRW<[FXa], (instregex "AFI(Mux)?$")>; 334def : InstRW<[FXa, LSU, Lat5], (instregex "AG$")>; 335def : InstRW<[FXa], (instregex "AGFI$")>; 336def : InstRW<[FXa], (instregex "AGHI(K)?$")>; 337def : InstRW<[FXa], (instregex "AGR(K)?$")>; 338def : InstRW<[FXa], (instregex "AHI(K)?$")>; 339def : InstRW<[FXa], (instregex "AHIMux(K)?$")>; 340def : InstRW<[FXa, LSU, Lat5], (instregex "AL(Y)?$")>; 341def : InstRW<[FXa], (instregex "AL(FI|HSIK)$")>; 342def : InstRW<[FXa, LSU, Lat5], (instregex "ALG(F)?$")>; 343def : InstRW<[FXa], (instregex "ALGHSIK$")>; 344def : InstRW<[FXa], (instregex "ALGF(I|R)$")>; 345def : InstRW<[FXa], (instregex "ALGR(K)?$")>; 346def : InstRW<[FXa], (instregex "ALR(K)?$")>; 347def : InstRW<[FXa], (instregex "AR(K)?$")>; 348def : InstRW<[FXb, LSU, Lat5], (instregex "A(G)?SI$")>; 349 350// Logical addition with carry 351def : InstRW<[FXa, LSU, Lat6, GroupAlone], (instregex "ALC(G)?$")>; 352def : InstRW<[FXa, Lat2, GroupAlone], (instregex "ALC(G)?R$")>; 353 354// Add with sign extension (32 -> 64) 355def : InstRW<[FXa, LSU, Lat6], (instregex "AGF$")>; 356def : InstRW<[FXa, Lat2], (instregex "AGFR$")>; 357 358//===----------------------------------------------------------------------===// 359// Subtraction 360//===----------------------------------------------------------------------===// 361 362def : InstRW<[FXa, LSU, Lat5], (instregex "S(G|Y)?$")>; 363def : InstRW<[FXa, LSU, Lat6], (instregex "SH(Y)?$")>; 364def : InstRW<[FXa], (instregex "SGR(K)?$")>; 365def : InstRW<[FXa], (instregex "SLFI$")>; 366def : InstRW<[FXa, LSU, Lat5], (instregex "SL(G|GF|Y)?$")>; 367def : InstRW<[FXa], (instregex "SLGF(I|R)$")>; 368def : InstRW<[FXa], (instregex "SLGR(K)?$")>; 369def : InstRW<[FXa], (instregex "SLR(K)?$")>; 370def : InstRW<[FXa], (instregex "SR(K)?$")>; 371 372// Subtraction with borrow 373def : InstRW<[FXa, LSU, Lat6, GroupAlone], (instregex "SLB(G)?$")>; 374def : InstRW<[FXa, Lat2, GroupAlone], (instregex "SLB(G)?R$")>; 375 376// Subtraction with sign extension (32 -> 64) 377def : InstRW<[FXa, LSU, Lat6], (instregex "SGF$")>; 378def : InstRW<[FXa, Lat2], (instregex "SGFR$")>; 379 380//===----------------------------------------------------------------------===// 381// AND 382//===----------------------------------------------------------------------===// 383 384def : InstRW<[FXa, LSU, Lat5], (instregex "N(G|Y)?$")>; 385def : InstRW<[FXa], (instregex "NGR(K)?$")>; 386def : InstRW<[FXa], (instregex "NI(FMux|HMux|LMux)$")>; 387def : InstRW<[FXb, LSU, Lat5], (instregex "NI(Y)?$")>; 388def : InstRW<[FXa], (instregex "NIHF(64)?$")>; 389def : InstRW<[FXa], (instregex "NIHH(64)?$")>; 390def : InstRW<[FXa], (instregex "NIHL(64)?$")>; 391def : InstRW<[FXa], (instregex "NILF(64)?$")>; 392def : InstRW<[FXa], (instregex "NILH(64)?$")>; 393def : InstRW<[FXa], (instregex "NILL(64)?$")>; 394def : InstRW<[FXa], (instregex "NR(K)?$")>; 395def : InstRW<[LSU, LSU, FXb, Lat9, BeginGroup], (instregex "NC$")>; 396 397//===----------------------------------------------------------------------===// 398// OR 399//===----------------------------------------------------------------------===// 400 401def : InstRW<[FXa, LSU, Lat5], (instregex "O(G|Y)?$")>; 402def : InstRW<[FXa], (instregex "OGR(K)?$")>; 403def : InstRW<[FXb, LSU, Lat5], (instregex "OI(Y)?$")>; 404def : InstRW<[FXa], (instregex "OI(FMux|HMux|LMux)$")>; 405def : InstRW<[FXa], (instregex "OIHF(64)?$")>; 406def : InstRW<[FXa], (instregex "OIHH(64)?$")>; 407def : InstRW<[FXa], (instregex "OIHL(64)?$")>; 408def : InstRW<[FXa], (instregex "OILF(64)?$")>; 409def : InstRW<[FXa], (instregex "OILH(64)?$")>; 410def : InstRW<[FXa], (instregex "OILL(64)?$")>; 411def : InstRW<[FXa], (instregex "OR(K)?$")>; 412def : InstRW<[LSU, LSU, FXb, Lat9, BeginGroup], (instregex "OC$")>; 413 414//===----------------------------------------------------------------------===// 415// XOR 416//===----------------------------------------------------------------------===// 417 418def : InstRW<[FXa, LSU, Lat5], (instregex "X(G|Y)?$")>; 419def : InstRW<[FXb, LSU, Lat5], (instregex "XI(Y)?$")>; 420def : InstRW<[FXa], (instregex "XIFMux$")>; 421def : InstRW<[FXa], (instregex "XGR(K)?$")>; 422def : InstRW<[FXa], (instregex "XIHF(64)?$")>; 423def : InstRW<[FXa], (instregex "XILF(64)?$")>; 424def : InstRW<[FXa], (instregex "XR(K)?$")>; 425def : InstRW<[LSU, LSU, FXb, Lat9, BeginGroup], (instregex "XC$")>; 426 427//===----------------------------------------------------------------------===// 428// Multiplication 429//===----------------------------------------------------------------------===// 430 431def : InstRW<[FXa, LSU, Lat10], (instregex "MS(GF|Y)?$")>; 432def : InstRW<[FXa, Lat6], (instregex "MS(R|FI)$")>; 433def : InstRW<[FXa, LSU, Lat12], (instregex "MSG$")>; 434def : InstRW<[FXa, Lat8], (instregex "MSGR$")>; 435def : InstRW<[FXa, Lat6], (instregex "MSGF(I|R)$")>; 436def : InstRW<[FXa, LSU, Lat15, GroupAlone], (instregex "MLG$")>; 437def : InstRW<[FXa, Lat9, GroupAlone], (instregex "MLGR$")>; 438def : InstRW<[FXa, Lat5], (instregex "MGHI$")>; 439def : InstRW<[FXa, Lat5], (instregex "MHI$")>; 440def : InstRW<[FXa, LSU, Lat9], (instregex "MH(Y)?$")>; 441 442//===----------------------------------------------------------------------===// 443// Division and remainder 444//===----------------------------------------------------------------------===// 445 446def : InstRW<[FXa, Lat30, GroupAlone], (instregex "DSG(F)?R$")>; 447def : InstRW<[LSU, FXa, Lat30, GroupAlone], (instregex "DSG(F)?$")>; 448def : InstRW<[FXa2, FXa2, Lat20, GroupAlone], (instregex "DLR$")>; 449def : InstRW<[FXa2, FXa2, Lat30, GroupAlone], (instregex "DLGR$")>; 450def : InstRW<[FXa2, FXa2, LSU, Lat30, GroupAlone], (instregex "DL(G)?$")>; 451 452//===----------------------------------------------------------------------===// 453// Shifts 454//===----------------------------------------------------------------------===// 455 456def : InstRW<[FXa], (instregex "SLL(G|K)?$")>; 457def : InstRW<[FXa], (instregex "SRL(G|K)?$")>; 458def : InstRW<[FXa], (instregex "SRA(G|K)?$")>; 459def : InstRW<[FXa], (instregex "SLA(K)?$")>; 460 461// Rotate 462def : InstRW<[FXa, LSU, Lat6], (instregex "RLL(G)?$")>; 463 464// Rotate and insert 465def : InstRW<[FXa], (instregex "RISBG(N|32)?$")>; 466def : InstRW<[FXa], (instregex "RISBH(G|H|L)$")>; 467def : InstRW<[FXa], (instregex "RISBL(G|H|L)$")>; 468def : InstRW<[FXa], (instregex "RISBMux$")>; 469 470// Rotate and Select 471def : InstRW<[FXa, FXa, Lat3, BeginGroup], (instregex "R(N|O|X)SBG$")>; 472 473//===----------------------------------------------------------------------===// 474// Comparison 475//===----------------------------------------------------------------------===// 476 477def : InstRW<[FXb, LSU, Lat5], (instregex "C(G|Y|Mux|RL)?$")>; 478def : InstRW<[FXb], (instregex "C(F|H)I(Mux)?$")>; 479def : InstRW<[FXb], (instregex "CG(F|H)I$")>; 480def : InstRW<[FXb, LSU, Lat5], (instregex "CG(HSI|RL)$")>; 481def : InstRW<[FXb], (instregex "C(G)?R$")>; 482def : InstRW<[FXb], (instregex "CIH$")>; 483def : InstRW<[FXb, LSU, Lat5], (instregex "CH(F|SI)$")>; 484def : InstRW<[FXb, LSU, Lat5], (instregex "CL(Y|Mux|FHSI)?$")>; 485def : InstRW<[FXb], (instregex "CLFI(Mux)?$")>; 486def : InstRW<[FXb, LSU, Lat5], (instregex "CLG(HRL|HSI)?$")>; 487def : InstRW<[FXb, LSU, Lat5], (instregex "CLGF(RL)?$")>; 488def : InstRW<[FXb], (instregex "CLGF(I|R)$")>; 489def : InstRW<[FXb], (instregex "CLGR$")>; 490def : InstRW<[FXb, LSU, Lat5], (instregex "CLGRL$")>; 491def : InstRW<[FXb, LSU, Lat5], (instregex "CLH(F|RL|HSI)$")>; 492def : InstRW<[FXb], (instregex "CLIH$")>; 493def : InstRW<[FXb, LSU, Lat5], (instregex "CLI(Y)?$")>; 494def : InstRW<[FXb], (instregex "CLR$")>; 495def : InstRW<[FXb, LSU, Lat5], (instregex "CLRL$")>; 496 497// Compare halfword 498def : InstRW<[FXb, LSU, Lat6], (instregex "CH(Y|RL)?$")>; 499def : InstRW<[FXb, LSU, Lat6], (instregex "CGH(RL)?$")>; 500def : InstRW<[FXa, FXb, LSU, Lat6, BeginGroup], (instregex "CHHSI$")>; 501 502// Compare with sign extension (32 -> 64) 503def : InstRW<[FXb, LSU, Lat6], (instregex "CGF(RL)?$")>; 504def : InstRW<[FXb, Lat2], (instregex "CGFR$")>; 505 506// Compare logical character 507def : InstRW<[FXb, LSU, LSU, Lat9, BeginGroup], (instregex "CLC$")>; 508 509def : InstRW<[LSU, Lat30, GroupAlone], (instregex "CLST$")>; 510 511// Test under mask 512def : InstRW<[FXb, LSU, Lat5], (instregex "TM(Y)?$")>; 513def : InstRW<[FXb], (instregex "TM(H|L)Mux$")>; 514def : InstRW<[FXb], (instregex "TMHH(64)?$")>; 515def : InstRW<[FXb], (instregex "TMHL(64)?$")>; 516def : InstRW<[FXb], (instregex "TMLH(64)?$")>; 517def : InstRW<[FXb], (instregex "TMLL(64)?$")>; 518 519//===----------------------------------------------------------------------===// 520// Prefetch and execution hint 521//===----------------------------------------------------------------------===// 522 523def : InstRW<[LSU], (instregex "PFD(RL)?$")>; 524def : InstRW<[FXb, Lat2], (instregex "BPP$")>; 525def : InstRW<[FXb, EndGroup], (instregex "BPRP$")>; 526def : InstRW<[FXb], (instregex "NIAI$")>; 527 528//===----------------------------------------------------------------------===// 529// Atomic operations 530//===----------------------------------------------------------------------===// 531 532def : InstRW<[FXb, EndGroup], (instregex "Serialize$")>; 533 534def : InstRW<[FXb, LSU, Lat5], (instregex "LAA(G)?$")>; 535def : InstRW<[FXb, LSU, Lat5], (instregex "LAAL(G)?$")>; 536def : InstRW<[FXb, LSU, Lat5], (instregex "LAN(G)?$")>; 537def : InstRW<[FXb, LSU, Lat5], (instregex "LAO(G)?$")>; 538def : InstRW<[FXb, LSU, Lat5], (instregex "LAX(G)?$")>; 539 540// Test and set 541def : InstRW<[FXb, LSU, Lat5, EndGroup], (instregex "TS$")>; 542 543// Compare and swap 544def : InstRW<[FXa, FXb, LSU, Lat6, GroupAlone], (instregex "CS(G|Y)?$")>; 545 546// Compare double and swap 547def : InstRW<[FXa, FXa, FXb, FXb, FXa, LSU, Lat10, GroupAlone], 548 (instregex "CDS(Y)?$")>; 549def : InstRW<[FXa, FXa, FXb, FXb, LSU, FXb, FXb, LSU, LSU, Lat20, GroupAlone], 550 (instregex "CDSG$")>; 551 552// Compare and swap and store 553def : InstRW<[FXa, Lat30, GroupAlone], (instregex "CSST$")>; 554 555// Perform locked operation 556def : InstRW<[LSU, Lat30, GroupAlone], (instregex "PLO$")>; 557 558// Load/store pair from/to quadword 559def : InstRW<[LSU, LSU, Lat5, GroupAlone], (instregex "LPQ$")>; 560def : InstRW<[FXb, FXb, LSU, Lat6, GroupAlone], (instregex "STPQ$")>; 561 562// Load pair disjoint 563def : InstRW<[LSU, LSU, Lat5, GroupAlone], (instregex "LPD(G)?$")>; 564 565//===----------------------------------------------------------------------===// 566// Access registers 567//===----------------------------------------------------------------------===// 568 569// Extract/set/copy access register 570def : InstRW<[LSU], (instregex "(EAR|SAR|CPYA)$")>; 571 572// Load address extended 573def : InstRW<[LSU, FXa, Lat5, BeginGroup], (instregex "LAE(Y)?$")>; 574 575// Load/store access multiple (not modeled precisely) 576def : InstRW<[LSU, Lat30, GroupAlone], (instregex "(L|ST)AM(Y)?$")>; 577 578//===----------------------------------------------------------------------===// 579// Program mask and addressing mode 580//===----------------------------------------------------------------------===// 581 582// Insert Program Mask 583def : InstRW<[FXa, Lat3, EndGroup], (instregex "IPM$")>; 584 585// Set Program Mask 586def : InstRW<[LSU, EndGroup], (instregex "SPM$")>; 587 588// Branch and link 589def : InstRW<[FXa, FXa, FXb, Lat5, GroupAlone], (instregex "BAL(R)?$")>; 590 591// Test addressing mode 592def : InstRW<[FXb], (instregex "TAM$")>; 593 594// Set addressing mode 595def : InstRW<[FXb, Lat2, EndGroup], (instregex "SAM(24|31|64)$")>; 596 597// Branch (and save) and set mode. 598def : InstRW<[FXa, FXb, Lat2, GroupAlone], (instregex "BSM$")>; 599def : InstRW<[FXa, FXa, FXb, Lat3, GroupAlone], (instregex "BASSM$")>; 600 601//===----------------------------------------------------------------------===// 602// Transactional execution 603//===----------------------------------------------------------------------===// 604 605// Transaction begin 606def : InstRW<[LSU, LSU, FXb, FXb, FXb, FXb, FXb, Lat15, GroupAlone], 607 (instregex "TBEGIN(C|_nofloat)?$")>; 608 609// Transaction end 610def : InstRW<[FXb, GroupAlone], (instregex "TEND$")>; 611 612// Transaction abort 613def : InstRW<[LSU, GroupAlone], (instregex "TABORT$")>; 614 615// Extract Transaction Nesting Depth 616def : InstRW<[FXa], (instregex "ETND$")>; 617 618// Nontransactional store 619def : InstRW<[FXb, LSU, Lat5], (instregex "NTSTG$")>; 620 621//===----------------------------------------------------------------------===// 622// Processor assist 623//===----------------------------------------------------------------------===// 624 625def : InstRW<[FXb], (instregex "PPA$")>; 626 627//===----------------------------------------------------------------------===// 628// Miscellaneous Instructions. 629//===----------------------------------------------------------------------===// 630 631// Find leftmost one 632def : InstRW<[FXa, Lat6, GroupAlone], (instregex "FLOGR$")>; 633 634// Population count 635def : InstRW<[FXa, Lat3], (instregex "POPCNT$")>; 636 637// Extend 638def : InstRW<[FXa], (instregex "AEXT128_64$")>; 639def : InstRW<[FXa], (instregex "ZEXT128_(32|64)$")>; 640 641// String instructions 642def : InstRW<[FXa, LSU, Lat30], (instregex "SRST$")>; 643 644// Move with key 645def : InstRW<[FXa, FXa, FXb, LSU, Lat8, GroupAlone], (instregex "MVCK$")>; 646 647// Extract CPU Time 648def : InstRW<[FXa, Lat5, LSU], (instregex "ECTG$")>; 649 650// Execute 651def : InstRW<[FXb, GroupAlone], (instregex "EX(RL)?$")>; 652 653// Program return 654def : InstRW<[FXb, Lat30], (instregex "PR$")>; 655 656// Inline assembly 657def : InstRW<[LSU, LSU, LSU, FXa, FXa, FXb, Lat9, GroupAlone], 658 (instregex "STCK(F)?$")>; 659def : InstRW<[LSU, LSU, LSU, LSU, FXa, FXa, FXb, FXb, Lat11, GroupAlone], 660 (instregex "STCKE$")>; 661def : InstRW<[FXa, LSU, Lat5], (instregex "STFLE$")>; 662def : InstRW<[FXb, Lat30], (instregex "SVC$")>; 663 664// Store real address 665def : InstRW<[FXb, LSU, Lat5], (instregex "STRAG$")>; 666 667//===----------------------------------------------------------------------===// 668// .insn directive instructions 669//===----------------------------------------------------------------------===// 670 671// An "empty" sched-class will be assigned instead of the "invalid sched-class". 672// getNumDecoderSlots() will then return 1 instead of 0. 673def : InstRW<[], (instregex "Insn.*")>; 674 675 676// ----------------------------- Floating point ----------------------------- // 677 678//===----------------------------------------------------------------------===// 679// FP: Select instructions 680//===----------------------------------------------------------------------===// 681 682def : InstRW<[FXa], (instregex "SelectF(32|64|128)$")>; 683def : InstRW<[FXa], (instregex "CondStoreF32(Inv)?$")>; 684def : InstRW<[FXa], (instregex "CondStoreF64(Inv)?$")>; 685 686//===----------------------------------------------------------------------===// 687// FP: Move instructions 688//===----------------------------------------------------------------------===// 689 690// Load zero 691def : InstRW<[FXb], (instregex "LZ(DR|ER)$")>; 692def : InstRW<[FXb, FXb, Lat2, BeginGroup], (instregex "LZXR$")>; 693 694// Load 695def : InstRW<[VecXsPm], (instregex "LER$")>; 696def : InstRW<[FXb], (instregex "LD(R|R32|GR)$")>; 697def : InstRW<[FXb, Lat3], (instregex "LGDR$")>; 698def : InstRW<[FXb, FXb, Lat2, GroupAlone], (instregex "LXR$")>; 699 700// Load and Test 701def : InstRW<[VecXsPm, Lat4], (instregex "LT(D|E)BR$")>; 702def : InstRW<[VecXsPm, Lat4], (instregex "LTEBRCompare(_VecPseudo)?$")>; 703def : InstRW<[VecXsPm, Lat4], (instregex "LTDBRCompare(_VecPseudo)?$")>; 704def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "LTXBR$")>; 705def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], 706 (instregex "LTXBRCompare(_VecPseudo)?$")>; 707 708// Copy sign 709def : InstRW<[VecXsPm], (instregex "CPSDRd(d|s)$")>; 710def : InstRW<[VecXsPm], (instregex "CPSDRs(d|s)$")>; 711 712//===----------------------------------------------------------------------===// 713// FP: Load instructions 714//===----------------------------------------------------------------------===// 715 716def : InstRW<[VecXsPm, LSU, Lat7], (instregex "LE(Y)?$")>; 717def : InstRW<[LSU], (instregex "LD(Y|E32)?$")>; 718def : InstRW<[LSU], (instregex "LX$")>; 719 720//===----------------------------------------------------------------------===// 721// FP: Store instructions 722//===----------------------------------------------------------------------===// 723 724def : InstRW<[FXb, LSU, Lat7], (instregex "STD(Y)?$")>; 725def : InstRW<[FXb, LSU, Lat7], (instregex "STE(Y)?$")>; 726def : InstRW<[FXb, LSU, Lat5], (instregex "STX$")>; 727 728//===----------------------------------------------------------------------===// 729// FP: Conversion instructions 730//===----------------------------------------------------------------------===// 731 732// Load rounded 733def : InstRW<[VecBF], (instregex "LEDBR(A)?$")>; 734def : InstRW<[VecDF, VecDF, Lat20], (instregex "LEXBR(A)?$")>; 735def : InstRW<[VecDF, VecDF, Lat20], (instregex "LDXBR(A)?$")>; 736 737// Load lengthened 738def : InstRW<[VecBF, LSU, Lat12], (instregex "LDEB$")>; 739def : InstRW<[VecBF], (instregex "LDEBR$")>; 740def : InstRW<[VecBF2, VecBF2, LSU, Lat12 , GroupAlone], (instregex "LX(D|E)B$")>; 741def : InstRW<[VecBF2, VecBF2, GroupAlone], (instregex "LX(D|E)BR$")>; 742 743// Convert from fixed / logical 744def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CE(F|G)BR(A)?$")>; 745def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CD(F|G)BR(A)?$")>; 746def : InstRW<[FXb, VecDF2, VecDF2, Lat12, GroupAlone], (instregex "CX(F|G)BR(A)?$")>; 747def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CEL(F|G)BR$")>; 748def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CDL(F|G)BR$")>; 749def : InstRW<[FXb, VecDF2, VecDF2, Lat12, GroupAlone], (instregex "CXL(F|G)BR$")>; 750 751// Convert to fixed / logical 752def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CF(E|D)BR(A)?$")>; 753def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CG(E|D)BR(A)?$")>; 754def : InstRW<[FXb, VecDF, VecDF, Lat20, BeginGroup], (instregex "C(F|G)XBR(A)?$")>; 755def : InstRW<[FXb, VecBF, Lat11, GroupAlone], (instregex "CLFEBR$")>; 756def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CLFDBR$")>; 757def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CLG(E|D)BR$")>; 758def : InstRW<[FXb, VecDF, VecDF, Lat20, BeginGroup], (instregex "CL(F|G)XBR$")>; 759 760//===----------------------------------------------------------------------===// 761// FP: Unary arithmetic 762//===----------------------------------------------------------------------===// 763 764// Load Complement / Negative / Positive 765def : InstRW<[VecXsPm, Lat4], (instregex "L(C|N|P)DBR$")>; 766def : InstRW<[VecXsPm, Lat4], (instregex "L(C|N|P)EBR$")>; 767def : InstRW<[FXb], (instregex "LCDFR(_32)?$")>; 768def : InstRW<[FXb], (instregex "LNDFR(_32)?$")>; 769def : InstRW<[FXb], (instregex "LPDFR(_32)?$")>; 770def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "L(C|N|P)XBR$")>; 771 772// Square root 773def : InstRW<[VecFPd, LSU], (instregex "SQ(E|D)B$")>; 774def : InstRW<[VecFPd], (instregex "SQ(E|D)BR$")>; 775def : InstRW<[VecFPd, VecFPd, GroupAlone], (instregex "SQXBR$")>; 776 777// Load FP integer 778def : InstRW<[VecBF], (instregex "FIEBR(A)?$")>; 779def : InstRW<[VecBF], (instregex "FIDBR(A)?$")>; 780def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "FIXBR(A)?$")>; 781 782//===----------------------------------------------------------------------===// 783// FP: Binary arithmetic 784//===----------------------------------------------------------------------===// 785 786// Addition 787def : InstRW<[VecBF, LSU, Lat12], (instregex "A(E|D)B$")>; 788def : InstRW<[VecBF], (instregex "A(E|D)BR$")>; 789def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "AXBR$")>; 790 791// Subtraction 792def : InstRW<[VecBF, LSU, Lat12], (instregex "S(E|D)B$")>; 793def : InstRW<[VecBF], (instregex "S(E|D)BR$")>; 794def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "SXBR$")>; 795 796// Multiply 797def : InstRW<[VecBF, LSU, Lat12], (instregex "M(D|DE|EE)B$")>; 798def : InstRW<[VecBF], (instregex "M(D|DE|EE)BR$")>; 799def : InstRW<[VecBF2, VecBF2, LSU, Lat12, GroupAlone], (instregex "MXDB$")>; 800def : InstRW<[VecBF2, VecBF2, GroupAlone], (instregex "MXDBR$")>; 801def : InstRW<[VecDF2, VecDF2, Lat20, GroupAlone], (instregex "MXBR$")>; 802 803// Multiply and add / subtract 804def : InstRW<[VecBF, LSU, Lat12, GroupAlone], (instregex "M(A|S)EB$")>; 805def : InstRW<[VecBF, GroupAlone], (instregex "M(A|S)EBR$")>; 806def : InstRW<[VecBF, LSU, Lat12, GroupAlone], (instregex "M(A|S)DB$")>; 807def : InstRW<[VecBF], (instregex "M(A|S)DBR$")>; 808 809// Division 810def : InstRW<[VecFPd, LSU], (instregex "D(E|D)B$")>; 811def : InstRW<[VecFPd], (instregex "D(E|D)BR$")>; 812def : InstRW<[VecFPd, VecFPd, GroupAlone], (instregex "DXBR$")>; 813 814//===----------------------------------------------------------------------===// 815// FP: Comparisons 816//===----------------------------------------------------------------------===// 817 818// Compare 819def : InstRW<[VecXsPm, LSU, Lat8], (instregex "C(E|D)B$")>; 820def : InstRW<[VecXsPm, Lat4], (instregex "C(E|D)BR?$")>; 821def : InstRW<[VecDF, VecDF, Lat20, GroupAlone], (instregex "CXBR$")>; 822 823// Test Data Class 824def : InstRW<[LSU, VecXsPm, Lat9], (instregex "TC(E|D)B$")>; 825def : InstRW<[LSU, VecDF2, VecDF2, Lat15, GroupAlone], (instregex "TCXB$")>; 826 827//===----------------------------------------------------------------------===// 828// FP: Floating-point control register instructions 829//===----------------------------------------------------------------------===// 830 831def : InstRW<[FXa, LSU, Lat4, GroupAlone], (instregex "EFPC$")>; 832def : InstRW<[FXb, LSU, Lat5, GroupAlone], (instregex "STFPC$")>; 833def : InstRW<[LSU, Lat3, GroupAlone], (instregex "SFPC$")>; 834def : InstRW<[LSU, LSU, Lat6, GroupAlone], (instregex "LFPC$")>; 835def : InstRW<[FXa, Lat30, GroupAlone], (instregex "SFASR$")>; 836def : InstRW<[FXa, LSU, Lat30, GroupAlone], (instregex "LFAS$")>; 837def : InstRW<[FXb, Lat3, GroupAlone], (instregex "SRNM(B|T)?$")>; 838 839// --------------------------------- Vector --------------------------------- // 840 841//===----------------------------------------------------------------------===// 842// Vector: Move instructions 843//===----------------------------------------------------------------------===// 844 845def : InstRW<[FXb], (instregex "VLR(32|64)?$")>; 846def : InstRW<[FXb, Lat4], (instregex "VLGV(B|F|G|H)?$")>; 847def : InstRW<[FXb], (instregex "VLVG(B|F|G|H)?$")>; 848def : InstRW<[FXb, Lat2], (instregex "VLVGP(32)?$")>; 849 850//===----------------------------------------------------------------------===// 851// Vector: Immediate instructions 852//===----------------------------------------------------------------------===// 853 854def : InstRW<[VecXsPm], (instregex "VZERO$")>; 855def : InstRW<[VecXsPm], (instregex "VONE$")>; 856def : InstRW<[VecXsPm], (instregex "VGBM$")>; 857def : InstRW<[VecXsPm], (instregex "VGM(B|F|G|H)?$")>; 858def : InstRW<[VecXsPm], (instregex "VLEI(B|F|G|H)$")>; 859def : InstRW<[VecXsPm], (instregex "VREPI(B|F|G|H)?$")>; 860 861//===----------------------------------------------------------------------===// 862// Vector: Loads 863//===----------------------------------------------------------------------===// 864 865def : InstRW<[LSU], (instregex "VL(L|BB)?$")>; 866def : InstRW<[LSU], (instregex "VL(32|64)$")>; 867def : InstRW<[LSU], (instregex "VLLEZ(B|F|G|H)?$")>; 868def : InstRW<[LSU], (instregex "VLREP(B|F|G|H)?$")>; 869def : InstRW<[VecXsPm, LSU, Lat7], (instregex "VLE(B|F|G|H)$")>; 870def : InstRW<[FXb, LSU, VecXsPm, Lat11, BeginGroup], (instregex "VGE(F|G)$")>; 871def : InstRW<[LSU, LSU, LSU, LSU, LSU, Lat10, GroupAlone], 872 (instregex "VLM$")>; 873 874//===----------------------------------------------------------------------===// 875// Vector: Stores 876//===----------------------------------------------------------------------===// 877 878def : InstRW<[FXb, LSU, Lat8], (instregex "VST(L|32|64)?$")>; 879def : InstRW<[FXb, LSU, Lat8], (instregex "VSTE(F|G)$")>; 880def : InstRW<[FXb, LSU, VecXsPm, Lat11, BeginGroup], (instregex "VSTE(B|H)$")>; 881def : InstRW<[LSU, LSU, FXb, FXb, FXb, FXb, FXb, Lat20, GroupAlone], 882 (instregex "VSTM$")>; 883def : InstRW<[FXb, FXb, LSU, Lat12, BeginGroup], (instregex "VSCE(F|G)$")>; 884 885//===----------------------------------------------------------------------===// 886// Vector: Selects and permutes 887//===----------------------------------------------------------------------===// 888 889def : InstRW<[VecXsPm], (instregex "VMRH(B|F|G|H)?$")>; 890def : InstRW<[VecXsPm], (instregex "VMRL(B|F|G|H)?$")>; 891def : InstRW<[VecXsPm], (instregex "VPERM$")>; 892def : InstRW<[VecXsPm], (instregex "VPDI$")>; 893def : InstRW<[VecXsPm], (instregex "VREP(B|F|G|H)?$")>; 894def : InstRW<[VecXsPm], (instregex "VSEL$")>; 895 896//===----------------------------------------------------------------------===// 897// Vector: Widening and narrowing 898//===----------------------------------------------------------------------===// 899 900def : InstRW<[VecXsPm], (instregex "VPK(F|G|H)?$")>; 901def : InstRW<[VecXsPm], (instregex "VPKS(F|G|H)?$")>; 902def : InstRW<[VecXsPm, Lat4], (instregex "VPKS(F|G|H)S$")>; 903def : InstRW<[VecXsPm], (instregex "VPKLS(F|G|H)?$")>; 904def : InstRW<[VecXsPm, Lat4], (instregex "VPKLS(F|G|H)S$")>; 905def : InstRW<[VecXsPm], (instregex "VSEG(B|F|H)?$")>; 906def : InstRW<[VecXsPm], (instregex "VUPH(B|F|H)?$")>; 907def : InstRW<[VecXsPm], (instregex "VUPL(B|F)?$")>; 908def : InstRW<[VecXsPm], (instregex "VUPLH(B|F|H|W)?$")>; 909def : InstRW<[VecXsPm], (instregex "VUPLL(B|F|H)?$")>; 910 911//===----------------------------------------------------------------------===// 912// Vector: Integer arithmetic 913//===----------------------------------------------------------------------===// 914 915def : InstRW<[VecXsPm], (instregex "VA(B|F|G|H|Q|C|CQ)?$")>; 916def : InstRW<[VecXsPm], (instregex "VACC(B|F|G|H|Q|C|CQ)?$")>; 917def : InstRW<[VecXsPm], (instregex "VAVG(B|F|G|H)?$")>; 918def : InstRW<[VecXsPm], (instregex "VAVGL(B|F|G|H)?$")>; 919def : InstRW<[VecXsPm], (instregex "VN(C|O)?$")>; 920def : InstRW<[VecXsPm], (instregex "VO$")>; 921def : InstRW<[VecMul], (instregex "VCKSM$")>; 922def : InstRW<[VecXsPm], (instregex "VCLZ(B|F|G|H)?$")>; 923def : InstRW<[VecXsPm], (instregex "VCTZ(B|F|G|H)?$")>; 924def : InstRW<[VecXsPm], (instregex "VX$")>; 925def : InstRW<[VecMul], (instregex "VGFM?$")>; 926def : InstRW<[VecMul], (instregex "VGFMA(B|F|G|H)?$")>; 927def : InstRW<[VecMul], (instregex "VGFM(B|F|G|H)$")>; 928def : InstRW<[VecXsPm], (instregex "VLC(B|F|G|H)?$")>; 929def : InstRW<[VecXsPm], (instregex "VLP(B|F|G|H)?$")>; 930def : InstRW<[VecXsPm], (instregex "VMX(B|F|G|H)?$")>; 931def : InstRW<[VecXsPm], (instregex "VMXL(B|F|G|H)?$")>; 932def : InstRW<[VecXsPm], (instregex "VMN(B|F|G|H)?$")>; 933def : InstRW<[VecXsPm], (instregex "VMNL(B|F|G|H)?$")>; 934def : InstRW<[VecMul], (instregex "VMAL(B|F)?$")>; 935def : InstRW<[VecMul], (instregex "VMALE(B|F|H)?$")>; 936def : InstRW<[VecMul], (instregex "VMALH(B|F|H|W)?$")>; 937def : InstRW<[VecMul], (instregex "VMALO(B|F|H)?$")>; 938def : InstRW<[VecMul], (instregex "VMAO(B|F|H)?$")>; 939def : InstRW<[VecMul], (instregex "VMAE(B|F|H)?$")>; 940def : InstRW<[VecMul], (instregex "VMAH(B|F|H)?$")>; 941def : InstRW<[VecMul], (instregex "VME(B|F|H)?$")>; 942def : InstRW<[VecMul], (instregex "VMH(B|F|H)?$")>; 943def : InstRW<[VecMul], (instregex "VML(B|F)?$")>; 944def : InstRW<[VecMul], (instregex "VMLE(B|F|H)?$")>; 945def : InstRW<[VecMul], (instregex "VMLH(B|F|H|W)?$")>; 946def : InstRW<[VecMul], (instregex "VMLO(B|F|H)?$")>; 947def : InstRW<[VecMul], (instregex "VMO(B|F|H)?$")>; 948 949def : InstRW<[VecXsPm], (instregex "VPOPCT$")>; 950 951def : InstRW<[VecXsPm], (instregex "VERLL(B|F|G|H)?$")>; 952def : InstRW<[VecXsPm], (instregex "VERLLV(B|F|G|H)?$")>; 953def : InstRW<[VecXsPm], (instregex "VERIM(B|F|G|H)?$")>; 954def : InstRW<[VecXsPm], (instregex "VESL(B|F|G|H)?$")>; 955def : InstRW<[VecXsPm], (instregex "VESLV(B|F|G|H)?$")>; 956def : InstRW<[VecXsPm], (instregex "VESRA(B|F|G|H)?$")>; 957def : InstRW<[VecXsPm], (instregex "VESRAV(B|F|G|H)?$")>; 958def : InstRW<[VecXsPm], (instregex "VESRL(B|F|G|H)?$")>; 959def : InstRW<[VecXsPm], (instregex "VESRLV(B|F|G|H)?$")>; 960 961def : InstRW<[VecXsPm], (instregex "VSL(DB)?$")>; 962def : InstRW<[VecXsPm, VecXsPm, Lat8], (instregex "VSLB$")>; 963def : InstRW<[VecXsPm], (instregex "VSR(A|L)$")>; 964def : InstRW<[VecXsPm, VecXsPm, Lat8], (instregex "VSR(A|L)B$")>; 965 966def : InstRW<[VecXsPm], (instregex "VSB(I|IQ|CBI|CBIQ)?$")>; 967def : InstRW<[VecXsPm], (instregex "VSCBI(B|F|G|H|Q)?$")>; 968def : InstRW<[VecXsPm], (instregex "VS(F|G|H|Q)?$")>; 969 970def : InstRW<[VecMul], (instregex "VSUM(B|H)?$")>; 971def : InstRW<[VecMul], (instregex "VSUMG(F|H)?$")>; 972def : InstRW<[VecMul], (instregex "VSUMQ(F|G)?$")>; 973 974//===----------------------------------------------------------------------===// 975// Vector: Integer comparison 976//===----------------------------------------------------------------------===// 977 978def : InstRW<[VecXsPm, Lat4], (instregex "VEC(B|F|G|H)?$")>; 979def : InstRW<[VecXsPm, Lat4], (instregex "VECL(B|F|G|H)?$")>; 980def : InstRW<[VecXsPm], (instregex "VCEQ(B|F|G|H)?$")>; 981def : InstRW<[VecXsPm, Lat4], (instregex "VCEQ(B|F|G|H)S$")>; 982def : InstRW<[VecXsPm], (instregex "VCH(B|F|G|H)?$")>; 983def : InstRW<[VecXsPm, Lat4], (instregex "VCH(B|F|G|H)S$")>; 984def : InstRW<[VecXsPm], (instregex "VCHL(B|F|G|H)?$")>; 985def : InstRW<[VecXsPm, Lat4], (instregex "VCHL(B|F|G|H)S$")>; 986def : InstRW<[VecStr, Lat5], (instregex "VTM$")>; 987 988//===----------------------------------------------------------------------===// 989// Vector: Floating-point arithmetic 990//===----------------------------------------------------------------------===// 991 992def : InstRW<[VecBF2], (instregex "VCD(G|GB|LG|LGB)$")>; 993def : InstRW<[VecBF], (instregex "WCD(GB|LGB)$")>; 994def : InstRW<[VecBF2], (instregex "VC(L)?GD$")>; 995def : InstRW<[VecBF2], (instregex "VFADB$")>; 996def : InstRW<[VecBF], (instregex "WFADB$")>; 997def : InstRW<[VecBF2], (instregex "VCGDB$")>; 998def : InstRW<[VecBF], (instregex "WCGDB$")>; 999def : InstRW<[VecBF2], (instregex "VF(I|M|A|S)$")>; 1000def : InstRW<[VecBF2], (instregex "VF(I|M|S)DB$")>; 1001def : InstRW<[VecBF], (instregex "WF(I|M|S)DB$")>; 1002def : InstRW<[VecBF2], (instregex "VCLGDB$")>; 1003def : InstRW<[VecBF], (instregex "WCLGDB$")>; 1004def : InstRW<[VecXsPm], (instregex "VFL(C|N|P)DB$")>; 1005def : InstRW<[VecXsPm], (instregex "WFL(C|N|P)DB$")>; 1006def : InstRW<[VecBF2], (instregex "VFM(A|S)$")>; 1007def : InstRW<[VecBF2], (instregex "VFM(A|S)DB$")>; 1008def : InstRW<[VecBF], (instregex "WFM(A|S)DB$")>; 1009def : InstRW<[VecXsPm], (instregex "VFPSO$")>; 1010def : InstRW<[VecXsPm], (instregex "(V|W)FPSODB$")>; 1011def : InstRW<[VecXsPm, Lat4], (instregex "VFTCI(DB)?$")>; 1012def : InstRW<[VecXsPm, Lat4], (instregex "WFTCIDB$")>; 1013def : InstRW<[VecBF2], (instregex "VL(DE|ED)$")>; 1014def : InstRW<[VecBF2], (instregex "VL(DE|ED)B$")>; 1015def : InstRW<[VecBF], (instregex "WL(DE|ED)B$")>; 1016 1017// divide / square root 1018def : InstRW<[VecFPd], (instregex "VFD$")>; 1019def : InstRW<[VecFPd], (instregex "(V|W)FDDB$")>; 1020def : InstRW<[VecFPd], (instregex "VFSQ$")>; 1021def : InstRW<[VecFPd], (instregex "(V|W)FSQDB$")>; 1022 1023//===----------------------------------------------------------------------===// 1024// Vector: Floating-point comparison 1025//===----------------------------------------------------------------------===// 1026 1027def : InstRW<[VecXsPm], (instregex "VFC(E|H|HE)$")>; 1028def : InstRW<[VecXsPm], (instregex "VFC(E|H|HE)DB$")>; 1029def : InstRW<[VecXsPm, Lat4], (instregex "WF(C|K)$")>; 1030def : InstRW<[VecXsPm], (instregex "WFC(E|H|HE)DB$")>; 1031def : InstRW<[VecXsPm, Lat4], (instregex "VFC(E|H|HE)DBS$")>; 1032def : InstRW<[VecXsPm, Lat4], (instregex "WFC(E|H|HE)DBS$")>; 1033def : InstRW<[VecXsPm, Lat4], (instregex "WF(C|K)DB$")>; 1034 1035//===----------------------------------------------------------------------===// 1036// Vector: Floating-point insertion and extraction 1037//===----------------------------------------------------------------------===// 1038 1039def : InstRW<[FXb], (instregex "LEFR$")>; 1040def : InstRW<[FXb, Lat4], (instregex "LFER$")>; 1041 1042//===----------------------------------------------------------------------===// 1043// Vector: String instructions 1044//===----------------------------------------------------------------------===// 1045 1046def : InstRW<[VecStr], (instregex "VFAE(B)?$")>; 1047def : InstRW<[VecStr, Lat5], (instregex "VFAEBS$")>; 1048def : InstRW<[VecStr], (instregex "VFAE(F|H)$")>; 1049def : InstRW<[VecStr, Lat5], (instregex "VFAE(F|H)S$")>; 1050def : InstRW<[VecStr], (instregex "VFAEZ(B|F|H)$")>; 1051def : InstRW<[VecStr, Lat5], (instregex "VFAEZ(B|F|H)S$")>; 1052def : InstRW<[VecStr], (instregex "VFEE(B|F|H|ZB|ZF|ZH)?$")>; 1053def : InstRW<[VecStr, Lat5], (instregex "VFEE(B|F|H|ZB|ZF|ZH)S$")>; 1054def : InstRW<[VecStr], (instregex "VFENE(B|F|H|ZB|ZF|ZH)?$")>; 1055def : InstRW<[VecStr, Lat5], (instregex "VFENE(B|F|H|ZB|ZF|ZH)S$")>; 1056def : InstRW<[VecStr], (instregex "VISTR(B|F|H)?$")>; 1057def : InstRW<[VecStr, Lat5], (instregex "VISTR(B|F|H)S$")>; 1058def : InstRW<[VecStr], (instregex "VSTRC(B|F|H)?$")>; 1059def : InstRW<[VecStr, Lat5], (instregex "VSTRC(B|F|H)S$")>; 1060def : InstRW<[VecStr], (instregex "VSTRCZ(B|F|H)$")>; 1061def : InstRW<[VecStr, Lat5], (instregex "VSTRCZ(B|F|H)S$")>; 1062 1063} 1064 1065