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<VecDFX, [Z13_VecUnit]> { let Latency = 1; } 80def : WriteRes<VecDFX2, [Z13_VecUnit, Z13_VecUnit]> { let Latency = 2; } 81def : WriteRes<VecFPd, [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 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit, 90 Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit]> 91 { let Latency = 30; } 92def : WriteRes<VecMul, [Z13_VecUnit]> { let Latency = 5; } 93def : WriteRes<VecStr, [Z13_VecUnit]> { let Latency = 4; } 94def : WriteRes<VecXsPm, [Z13_VecUnit]> { let Latency = 3; } 95def : WriteRes<VBU, [Z13_VBUnit]>; // Virtual Branching Unit 96 97// -------------------------- INSTRUCTIONS ---------------------------------- // 98 99// InstRW constructs have been used in order to preserve the 100// readability of the InstrInfo files. 101 102// For each instruction, as matched by a regexp, provide a list of 103// resources that it needs. These will be combined into a SchedClass. 104 105//===----------------------------------------------------------------------===// 106// Stack allocation 107//===----------------------------------------------------------------------===// 108 109def : InstRW<[FXa], (instregex "ADJDYNALLOC$")>; // Pseudo -> LA / LAY 110 111//===----------------------------------------------------------------------===// 112// Branch instructions 113//===----------------------------------------------------------------------===// 114 115// Branch 116def : InstRW<[VBU], (instregex "(Call)?BRC(L)?(Asm.*)?$")>; 117def : InstRW<[VBU], (instregex "(Call)?J(G)?(Asm.*)?$")>; 118def : InstRW<[FXb], (instregex "(Call)?BC(R)?(Asm.*)?$")>; 119def : InstRW<[FXb], (instregex "(Call)?B(R)?(Asm.*)?$")>; 120def : InstRW<[FXa, EndGroup], (instregex "BRCT(G)?$")>; 121def : InstRW<[FXb, FXa, Lat2, GroupAlone], (instregex "BRCTH$")>; 122def : InstRW<[FXb, FXa, Lat2, GroupAlone], (instregex "BCT(G)?(R)?$")>; 123def : InstRW<[FXa, FXa, FXb, FXb, Lat4, GroupAlone], 124 (instregex "B(R)?X(H|L).*$")>; 125 126// Compare and branch 127def : InstRW<[FXb], (instregex "C(L)?(G)?(I|R)J(Asm.*)?$")>; 128def : InstRW<[FXb, FXb, Lat2, GroupAlone], 129 (instregex "C(L)?(G)?(I|R)B(Call|Return|Asm.*)?$")>; 130 131//===----------------------------------------------------------------------===// 132// Trap instructions 133//===----------------------------------------------------------------------===// 134 135// Trap 136def : InstRW<[VBU], (instregex "(Cond)?Trap$")>; 137 138// Compare and trap 139def : InstRW<[FXb], (instregex "C(G)?(I|R)T(Asm.*)?$")>; 140def : InstRW<[FXb], (instregex "CL(G)?RT(Asm.*)?$")>; 141def : InstRW<[FXb], (instregex "CL(F|G)IT(Asm.*)?$")>; 142def : InstRW<[FXb, LSU, Lat5], (instregex "CL(G)?T(Asm.*)?$")>; 143 144//===----------------------------------------------------------------------===// 145// Call and return instructions 146//===----------------------------------------------------------------------===// 147 148// Call 149def : InstRW<[VBU, FXa, FXa, Lat3, GroupAlone], (instregex "(Call)?BRAS$")>; 150def : InstRW<[FXa, FXa, FXb, Lat3, GroupAlone], (instregex "(Call)?BRASL$")>; 151def : InstRW<[FXa, FXa, FXb, Lat3, GroupAlone], (instregex "(Call)?BAS(R)?$")>; 152def : InstRW<[FXa, FXa, FXb, Lat3, GroupAlone], (instregex "TLS_(G|L)DCALL$")>; 153 154// Return 155def : InstRW<[FXb, EndGroup], (instregex "Return$")>; 156def : InstRW<[FXb], (instregex "CondReturn$")>; 157 158//===----------------------------------------------------------------------===// 159// Select instructions 160//===----------------------------------------------------------------------===// 161 162// Select pseudo 163def : InstRW<[FXa], (instregex "Select(32|64|32Mux)$")>; 164 165// CondStore pseudos 166def : InstRW<[FXa], (instregex "CondStore16(Inv)?$")>; 167def : InstRW<[FXa], (instregex "CondStore16Mux(Inv)?$")>; 168def : InstRW<[FXa], (instregex "CondStore32(Inv)?$")>; 169def : InstRW<[FXa], (instregex "CondStore32Mux(Inv)?$")>; 170def : InstRW<[FXa], (instregex "CondStore64(Inv)?$")>; 171def : InstRW<[FXa], (instregex "CondStore8(Inv)?$")>; 172def : InstRW<[FXa], (instregex "CondStore8Mux(Inv)?$")>; 173 174//===----------------------------------------------------------------------===// 175// Move instructions 176//===----------------------------------------------------------------------===// 177 178// Moves 179def : InstRW<[FXb, LSU, Lat5], (instregex "MV(G|H)?HI$")>; 180def : InstRW<[FXb, LSU, Lat5], (instregex "MVI(Y)?$")>; 181 182// Move character 183def : InstRW<[FXb, LSU, LSU, LSU, Lat8, GroupAlone], (instregex "MVC$")>; 184def : InstRW<[LSU, Lat30, GroupAlone], (instregex "MVCL(E|U)?$")>; 185 186// Pseudo -> reg move 187def : InstRW<[FXa], (instregex "COPY(_TO_REGCLASS)?$")>; 188def : InstRW<[FXa], (instregex "EXTRACT_SUBREG$")>; 189def : InstRW<[FXa], (instregex "INSERT_SUBREG$")>; 190def : InstRW<[FXa], (instregex "REG_SEQUENCE$")>; 191def : InstRW<[FXa], (instregex "SUBREG_TO_REG$")>; 192 193// Loads 194def : InstRW<[LSU], (instregex "L(Y|FH|RL|Mux|CBB)?$")>; 195def : InstRW<[LSU], (instregex "LG(RL)?$")>; 196def : InstRW<[LSU], (instregex "L128$")>; 197 198def : InstRW<[FXa], (instregex "LLIH(F|H|L)$")>; 199def : InstRW<[FXa], (instregex "LLIL(F|H|L)$")>; 200 201def : InstRW<[FXa], (instregex "LG(F|H)I$")>; 202def : InstRW<[FXa], (instregex "LHI(Mux)?$")>; 203def : InstRW<[FXa], (instregex "LR(Mux)?$")>; 204 205// Load and zero rightmost byte 206def : InstRW<[LSU], (instregex "LZR(F|G)$")>; 207 208// Load and trap 209def : InstRW<[FXb, LSU, Lat5], (instregex "L(FH|G)?AT$")>; 210 211// Load and test 212def : InstRW<[FXa, LSU, Lat5], (instregex "LT(G)?$")>; 213def : InstRW<[FXa], (instregex "LT(G)?R$")>; 214 215// Stores 216def : InstRW<[FXb, LSU, Lat5], (instregex "STG(RL)?$")>; 217def : InstRW<[FXb, LSU, Lat5], (instregex "ST128$")>; 218def : InstRW<[FXb, LSU, Lat5], (instregex "ST(Y|FH|RL|Mux)?$")>; 219 220// String moves. 221def : InstRW<[LSU, Lat30, GroupAlone], (instregex "MVST$")>; 222 223//===----------------------------------------------------------------------===// 224// Conditional move instructions 225//===----------------------------------------------------------------------===// 226 227def : InstRW<[FXa, Lat2], (instregex "LOCRMux$")>; 228def : InstRW<[FXa, Lat2], (instregex "LOC(G|FH)?R(Asm.*)?$")>; 229def : InstRW<[FXa, Lat2], (instregex "LOC(G|H)?HI(Mux|(Asm.*))?$")>; 230def : InstRW<[FXa, LSU, Lat6], (instregex "LOC(G|FH|Mux)?(Asm.*)?$")>; 231def : InstRW<[FXb, LSU, Lat5], (instregex "STOC(G|FH|Mux)?(Asm.*)?$")>; 232 233//===----------------------------------------------------------------------===// 234// Sign extensions 235//===----------------------------------------------------------------------===// 236 237def : InstRW<[FXa], (instregex "L(B|H|G)R$")>; 238def : InstRW<[FXa], (instregex "LG(B|H|F)R$")>; 239 240def : InstRW<[FXa, LSU, Lat5], (instregex "LTGF$")>; 241def : InstRW<[FXa], (instregex "LTGFR$")>; 242 243def : InstRW<[FXa, LSU, Lat5], (instregex "LB(H|Mux)?$")>; 244def : InstRW<[FXa, LSU, Lat5], (instregex "LH(Y)?$")>; 245def : InstRW<[FXa, LSU, Lat5], (instregex "LH(H|Mux|RL)$")>; 246def : InstRW<[FXa, LSU, Lat5], (instregex "LG(B|H|F)$")>; 247def : InstRW<[FXa, LSU, Lat5], (instregex "LG(H|F)RL$")>; 248 249//===----------------------------------------------------------------------===// 250// Zero extensions 251//===----------------------------------------------------------------------===// 252 253def : InstRW<[FXa], (instregex "LLCR(Mux)?$")>; 254def : InstRW<[FXa], (instregex "LLHR(Mux)?$")>; 255def : InstRW<[FXa], (instregex "LLG(C|H|F|T)R$")>; 256def : InstRW<[LSU], (instregex "LLC(Mux)?$")>; 257def : InstRW<[LSU], (instregex "LLH(Mux)?$")>; 258def : InstRW<[FXa, LSU, Lat5], (instregex "LL(C|H)H$")>; 259def : InstRW<[LSU], (instregex "LLHRL$")>; 260def : InstRW<[LSU], (instregex "LLG(C|H|F|T|HRL|FRL)$")>; 261 262// Load and zero rightmost byte 263def : InstRW<[LSU], (instregex "LLZRGF$")>; 264 265// Load and trap 266def : InstRW<[FXb, LSU, Lat5], (instregex "LLG(F|T)?AT$")>; 267 268//===----------------------------------------------------------------------===// 269// Truncations 270//===----------------------------------------------------------------------===// 271 272def : InstRW<[FXb, LSU, Lat5], (instregex "STC(H|Y|Mux)?$")>; 273def : InstRW<[FXb, LSU, Lat5], (instregex "STH(H|Y|RL|Mux)?$")>; 274def : InstRW<[FXb, LSU, Lat5], (instregex "STCM(H|Y)?$")>; 275 276//===----------------------------------------------------------------------===// 277// Multi-register moves 278//===----------------------------------------------------------------------===// 279 280// Load multiple (estimated average of 5 ops) 281def : InstRW<[LSU, LSU, LSU, LSU, LSU, Lat10, GroupAlone], 282 (instregex "LM(H|Y|G)?$")>; 283 284// Load multiple disjoint 285def : InstRW<[LSU, Lat30, GroupAlone], (instregex "LMD$")>; 286 287// Store multiple (estimated average of ceil(5/2) FXb ops) 288def : InstRW<[LSU, LSU, FXb, FXb, FXb, Lat10, 289 GroupAlone], (instregex "STM(G|H|Y)?$")>; 290 291//===----------------------------------------------------------------------===// 292// Byte swaps 293//===----------------------------------------------------------------------===// 294 295def : InstRW<[FXa], (instregex "LRV(G)?R$")>; 296def : InstRW<[FXa, LSU, Lat5], (instregex "LRV(G|H)?$")>; 297def : InstRW<[FXb, LSU, Lat5], (instregex "STRV(G|H)?$")>; 298def : InstRW<[LSU, Lat30, GroupAlone], (instregex "MVCIN$")>; 299 300//===----------------------------------------------------------------------===// 301// Load address instructions 302//===----------------------------------------------------------------------===// 303 304def : InstRW<[FXa], (instregex "LA(Y|RL)?$")>; 305 306// Load the Global Offset Table address ( -> larl ) 307def : InstRW<[FXa], (instregex "GOT$")>; 308 309//===----------------------------------------------------------------------===// 310// Absolute and Negation 311//===----------------------------------------------------------------------===// 312 313def : InstRW<[FXa, Lat2], (instregex "LP(G)?R$")>; 314def : InstRW<[FXa, FXa, Lat3, BeginGroup], (instregex "L(N|P)GFR$")>; 315def : InstRW<[FXa, Lat2], (instregex "LN(R|GR)$")>; 316def : InstRW<[FXa], (instregex "LC(R|GR)$")>; 317def : InstRW<[FXa, FXa, Lat2, BeginGroup], (instregex "LCGFR$")>; 318 319//===----------------------------------------------------------------------===// 320// Insertion 321//===----------------------------------------------------------------------===// 322 323def : InstRW<[FXa, LSU, Lat5], (instregex "IC(Y)?$")>; 324def : InstRW<[FXa, LSU, Lat5], (instregex "IC32(Y)?$")>; 325def : InstRW<[FXa, LSU, Lat5], (instregex "ICM(H|Y)?$")>; 326def : InstRW<[FXa], (instregex "II(F|H|L)Mux$")>; 327def : InstRW<[FXa], (instregex "IIHF(64)?$")>; 328def : InstRW<[FXa], (instregex "IIHH(64)?$")>; 329def : InstRW<[FXa], (instregex "IIHL(64)?$")>; 330def : InstRW<[FXa], (instregex "IILF(64)?$")>; 331def : InstRW<[FXa], (instregex "IILH(64)?$")>; 332def : InstRW<[FXa], (instregex "IILL(64)?$")>; 333 334//===----------------------------------------------------------------------===// 335// Addition 336//===----------------------------------------------------------------------===// 337 338def : InstRW<[FXa, LSU, Lat5], (instregex "A(Y)?$")>; 339def : InstRW<[FXa, LSU, Lat6], (instregex "AH(Y)?$")>; 340def : InstRW<[FXa], (instregex "AIH$")>; 341def : InstRW<[FXa], (instregex "AFI(Mux)?$")>; 342def : InstRW<[FXa, LSU, Lat5], (instregex "AG$")>; 343def : InstRW<[FXa], (instregex "AGFI$")>; 344def : InstRW<[FXa], (instregex "AGHI(K)?$")>; 345def : InstRW<[FXa], (instregex "AGR(K)?$")>; 346def : InstRW<[FXa], (instregex "AHI(K)?$")>; 347def : InstRW<[FXa], (instregex "AHIMux(K)?$")>; 348def : InstRW<[FXa, LSU, Lat5], (instregex "AL(Y)?$")>; 349def : InstRW<[FXa], (instregex "AL(FI|HSIK)$")>; 350def : InstRW<[FXa, LSU, Lat5], (instregex "ALG(F)?$")>; 351def : InstRW<[FXa], (instregex "ALGHSIK$")>; 352def : InstRW<[FXa], (instregex "ALGF(I|R)$")>; 353def : InstRW<[FXa], (instregex "ALGR(K)?$")>; 354def : InstRW<[FXa], (instregex "ALR(K)?$")>; 355def : InstRW<[FXa], (instregex "AR(K)?$")>; 356def : InstRW<[FXa], (instregex "A(L)?HHHR$")>; 357def : InstRW<[FXa, Lat2], (instregex "A(L)?HHLR$")>; 358def : InstRW<[FXa], (instregex "ALSIH(N)?$")>; 359def : InstRW<[FXb, LSU, Lat5], (instregex "A(L)?(G)?SI$")>; 360 361// Logical addition with carry 362def : InstRW<[FXa, LSU, Lat6, GroupAlone], (instregex "ALC(G)?$")>; 363def : InstRW<[FXa, Lat2, GroupAlone], (instregex "ALC(G)?R$")>; 364 365// Add with sign extension (32 -> 64) 366def : InstRW<[FXa, LSU, Lat6], (instregex "AGF$")>; 367def : InstRW<[FXa, Lat2], (instregex "AGFR$")>; 368 369//===----------------------------------------------------------------------===// 370// Subtraction 371//===----------------------------------------------------------------------===// 372 373def : InstRW<[FXa, LSU, Lat5], (instregex "S(G|Y)?$")>; 374def : InstRW<[FXa, LSU, Lat6], (instregex "SH(Y)?$")>; 375def : InstRW<[FXa], (instregex "SGR(K)?$")>; 376def : InstRW<[FXa], (instregex "SLFI$")>; 377def : InstRW<[FXa, LSU, Lat5], (instregex "SL(G|GF|Y)?$")>; 378def : InstRW<[FXa], (instregex "SLGF(I|R)$")>; 379def : InstRW<[FXa], (instregex "SLGR(K)?$")>; 380def : InstRW<[FXa], (instregex "SLR(K)?$")>; 381def : InstRW<[FXa], (instregex "SR(K)?$")>; 382def : InstRW<[FXa], (instregex "S(L)?HHHR$")>; 383def : InstRW<[FXa, Lat2], (instregex "S(L)?HHLR$")>; 384 385// Subtraction with borrow 386def : InstRW<[FXa, LSU, Lat6, GroupAlone], (instregex "SLB(G)?$")>; 387def : InstRW<[FXa, Lat2, GroupAlone], (instregex "SLB(G)?R$")>; 388 389// Subtraction with sign extension (32 -> 64) 390def : InstRW<[FXa, LSU, Lat6], (instregex "SGF$")>; 391def : InstRW<[FXa, Lat2], (instregex "SGFR$")>; 392 393//===----------------------------------------------------------------------===// 394// AND 395//===----------------------------------------------------------------------===// 396 397def : InstRW<[FXa, LSU, Lat5], (instregex "N(G|Y)?$")>; 398def : InstRW<[FXa], (instregex "NGR(K)?$")>; 399def : InstRW<[FXa], (instregex "NI(FMux|HMux|LMux)$")>; 400def : InstRW<[FXb, LSU, Lat5], (instregex "NI(Y)?$")>; 401def : InstRW<[FXa], (instregex "NIHF(64)?$")>; 402def : InstRW<[FXa], (instregex "NIHH(64)?$")>; 403def : InstRW<[FXa], (instregex "NIHL(64)?$")>; 404def : InstRW<[FXa], (instregex "NILF(64)?$")>; 405def : InstRW<[FXa], (instregex "NILH(64)?$")>; 406def : InstRW<[FXa], (instregex "NILL(64)?$")>; 407def : InstRW<[FXa], (instregex "NR(K)?$")>; 408def : InstRW<[LSU, LSU, FXb, Lat9, BeginGroup], (instregex "NC$")>; 409 410//===----------------------------------------------------------------------===// 411// OR 412//===----------------------------------------------------------------------===// 413 414def : InstRW<[FXa, LSU, Lat5], (instregex "O(G|Y)?$")>; 415def : InstRW<[FXa], (instregex "OGR(K)?$")>; 416def : InstRW<[FXb, LSU, Lat5], (instregex "OI(Y)?$")>; 417def : InstRW<[FXa], (instregex "OI(FMux|HMux|LMux)$")>; 418def : InstRW<[FXa], (instregex "OIHF(64)?$")>; 419def : InstRW<[FXa], (instregex "OIHH(64)?$")>; 420def : InstRW<[FXa], (instregex "OIHL(64)?$")>; 421def : InstRW<[FXa], (instregex "OILF(64)?$")>; 422def : InstRW<[FXa], (instregex "OILH(64)?$")>; 423def : InstRW<[FXa], (instregex "OILL(64)?$")>; 424def : InstRW<[FXa], (instregex "OR(K)?$")>; 425def : InstRW<[LSU, LSU, FXb, Lat9, BeginGroup], (instregex "OC$")>; 426 427//===----------------------------------------------------------------------===// 428// XOR 429//===----------------------------------------------------------------------===// 430 431def : InstRW<[FXa, LSU, Lat5], (instregex "X(G|Y)?$")>; 432def : InstRW<[FXb, LSU, Lat5], (instregex "XI(Y)?$")>; 433def : InstRW<[FXa], (instregex "XIFMux$")>; 434def : InstRW<[FXa], (instregex "XGR(K)?$")>; 435def : InstRW<[FXa], (instregex "XIHF(64)?$")>; 436def : InstRW<[FXa], (instregex "XILF(64)?$")>; 437def : InstRW<[FXa], (instregex "XR(K)?$")>; 438def : InstRW<[LSU, LSU, FXb, Lat9, BeginGroup], (instregex "XC$")>; 439 440//===----------------------------------------------------------------------===// 441// Multiplication 442//===----------------------------------------------------------------------===// 443 444def : InstRW<[FXa, LSU, Lat10], (instregex "MS(GF|Y)?$")>; 445def : InstRW<[FXa, Lat6], (instregex "MS(R|FI)$")>; 446def : InstRW<[FXa, LSU, Lat12], (instregex "MSG$")>; 447def : InstRW<[FXa, Lat8], (instregex "MSGR$")>; 448def : InstRW<[FXa, Lat6], (instregex "MSGF(I|R)$")>; 449def : InstRW<[FXa2, LSU, Lat15, GroupAlone], (instregex "MLG$")>; 450def : InstRW<[FXa2, Lat9, GroupAlone], (instregex "MLGR$")>; 451def : InstRW<[FXa, Lat5], (instregex "MGHI$")>; 452def : InstRW<[FXa, Lat5], (instregex "MHI$")>; 453def : InstRW<[FXa, LSU, Lat9], (instregex "MH(Y)?$")>; 454def : InstRW<[FXa2, Lat7, GroupAlone], (instregex "M(L)?R$")>; 455def : InstRW<[FXa2, LSU, Lat7, GroupAlone], (instregex "M(FY|L)?$")>; 456 457//===----------------------------------------------------------------------===// 458// Division and remainder 459//===----------------------------------------------------------------------===// 460 461def : InstRW<[FXa2, FXa2, Lat20, GroupAlone], (instregex "DR$")>; 462def : InstRW<[FXa2, FXa2, LSU, Lat30, GroupAlone], (instregex "D$")>; 463def : InstRW<[FXa2, Lat30, GroupAlone], (instregex "DSG(F)?R$")>; 464def : InstRW<[LSU, FXa2, Lat30, GroupAlone], (instregex "DSG(F)?$")>; 465def : InstRW<[FXa2, FXa2, Lat20, GroupAlone], (instregex "DLR$")>; 466def : InstRW<[FXa2, FXa2, Lat30, GroupAlone], (instregex "DLGR$")>; 467def : InstRW<[FXa2, FXa2, LSU, Lat30, GroupAlone], (instregex "DL(G)?$")>; 468 469//===----------------------------------------------------------------------===// 470// Shifts 471//===----------------------------------------------------------------------===// 472 473def : InstRW<[FXa], (instregex "SLL(G|K)?$")>; 474def : InstRW<[FXa], (instregex "SRL(G|K)?$")>; 475def : InstRW<[FXa], (instregex "SRA(G|K)?$")>; 476def : InstRW<[FXa], (instregex "SLA(G|K)?$")>; 477def : InstRW<[FXa, FXa, FXa, FXa, LSU, Lat8, GroupAlone], 478 (instregex "S(L|R)D(A|L)$")>; 479 480// Rotate 481def : InstRW<[FXa, LSU, Lat6], (instregex "RLL(G)?$")>; 482 483// Rotate and insert 484def : InstRW<[FXa], (instregex "RISBG(N|32)?$")>; 485def : InstRW<[FXa], (instregex "RISBH(G|H|L)$")>; 486def : InstRW<[FXa], (instregex "RISBL(G|H|L)$")>; 487def : InstRW<[FXa], (instregex "RISBMux$")>; 488 489// Rotate and Select 490def : InstRW<[FXa, FXa, Lat3, BeginGroup], (instregex "R(N|O|X)SBG$")>; 491 492//===----------------------------------------------------------------------===// 493// Comparison 494//===----------------------------------------------------------------------===// 495 496def : InstRW<[FXb, LSU, Lat5], (instregex "C(G|Y|Mux|RL)?$")>; 497def : InstRW<[FXb], (instregex "C(F|H)I(Mux)?$")>; 498def : InstRW<[FXb], (instregex "CG(F|H)I$")>; 499def : InstRW<[FXb, LSU, Lat5], (instregex "CG(HSI|RL)$")>; 500def : InstRW<[FXb], (instregex "C(G)?R$")>; 501def : InstRW<[FXb], (instregex "CIH$")>; 502def : InstRW<[FXb, LSU, Lat5], (instregex "CH(F|SI)$")>; 503def : InstRW<[FXb, LSU, Lat5], (instregex "CL(Y|Mux|FHSI)?$")>; 504def : InstRW<[FXb], (instregex "CLFI(Mux)?$")>; 505def : InstRW<[FXb, LSU, Lat5], (instregex "CLG(HRL|HSI)?$")>; 506def : InstRW<[FXb, LSU, Lat5], (instregex "CLGF(RL)?$")>; 507def : InstRW<[FXb], (instregex "CLGF(I|R)$")>; 508def : InstRW<[FXb], (instregex "CLGR$")>; 509def : InstRW<[FXb, LSU, Lat5], (instregex "CLGRL$")>; 510def : InstRW<[FXb, LSU, Lat5], (instregex "CLH(F|RL|HSI)$")>; 511def : InstRW<[FXb], (instregex "CLIH$")>; 512def : InstRW<[FXb, LSU, Lat5], (instregex "CLI(Y)?$")>; 513def : InstRW<[FXb], (instregex "CLR$")>; 514def : InstRW<[FXb, LSU, Lat5], (instregex "CLRL$")>; 515def : InstRW<[FXb], (instregex "C(L)?HHR$")>; 516def : InstRW<[FXb, Lat2], (instregex "C(L)?HLR$")>; 517 518// Compare halfword 519def : InstRW<[FXb, LSU, Lat6], (instregex "CH(Y|RL)?$")>; 520def : InstRW<[FXb, LSU, Lat6], (instregex "CGH(RL)?$")>; 521def : InstRW<[FXa, FXb, LSU, Lat6, BeginGroup], (instregex "CHHSI$")>; 522 523// Compare with sign extension (32 -> 64) 524def : InstRW<[FXb, LSU, Lat6], (instregex "CGF(RL)?$")>; 525def : InstRW<[FXb, Lat2], (instregex "CGFR$")>; 526 527// Compare logical character 528def : InstRW<[FXb, LSU, LSU, Lat9, BeginGroup], (instregex "CLC$")>; 529def : InstRW<[LSU, Lat30, GroupAlone], (instregex "CLCL(E|U)?$")>; 530def : InstRW<[LSU, Lat30, GroupAlone], (instregex "CLST$")>; 531 532// Test under mask 533def : InstRW<[FXb, LSU, Lat5], (instregex "TM(Y)?$")>; 534def : InstRW<[FXb], (instregex "TM(H|L)Mux$")>; 535def : InstRW<[FXb], (instregex "TMHH(64)?$")>; 536def : InstRW<[FXb], (instregex "TMHL(64)?$")>; 537def : InstRW<[FXb], (instregex "TMLH(64)?$")>; 538def : InstRW<[FXb], (instregex "TMLL(64)?$")>; 539 540// Compare logical characters under mask 541def : InstRW<[FXb, LSU, Lat6], (instregex "CLM(H|Y)?$")>; 542 543//===----------------------------------------------------------------------===// 544// Prefetch and execution hint 545//===----------------------------------------------------------------------===// 546 547def : InstRW<[LSU], (instregex "PFD(RL)?$")>; 548def : InstRW<[FXb, Lat2], (instregex "BPP$")>; 549def : InstRW<[FXb, EndGroup], (instregex "BPRP$")>; 550def : InstRW<[FXb], (instregex "NIAI$")>; 551 552//===----------------------------------------------------------------------===// 553// Atomic operations 554//===----------------------------------------------------------------------===// 555 556def : InstRW<[FXb, EndGroup], (instregex "Serialize$")>; 557 558def : InstRW<[FXb, LSU, Lat5], (instregex "LAA(G)?$")>; 559def : InstRW<[FXb, LSU, Lat5], (instregex "LAAL(G)?$")>; 560def : InstRW<[FXb, LSU, Lat5], (instregex "LAN(G)?$")>; 561def : InstRW<[FXb, LSU, Lat5], (instregex "LAO(G)?$")>; 562def : InstRW<[FXb, LSU, Lat5], (instregex "LAX(G)?$")>; 563 564// Test and set 565def : InstRW<[FXb, LSU, Lat5, EndGroup], (instregex "TS$")>; 566 567// Compare and swap 568def : InstRW<[FXa, FXb, LSU, Lat6, GroupAlone], (instregex "CS(G|Y)?$")>; 569 570// Compare double and swap 571def : InstRW<[FXa, FXa, FXb, FXb, FXa, LSU, Lat10, GroupAlone], 572 (instregex "CDS(Y)?$")>; 573def : InstRW<[FXa, FXa, FXb, FXb, LSU, FXb, FXb, LSU, LSU, Lat20, GroupAlone], 574 (instregex "CDSG$")>; 575 576// Compare and swap and store 577def : InstRW<[FXa, LSU, Lat30], (instregex "CSST$")>; 578 579// Perform locked operation 580def : InstRW<[LSU, Lat30, GroupAlone], (instregex "PLO$")>; 581 582// Load/store pair from/to quadword 583def : InstRW<[LSU, LSU, Lat5, GroupAlone], (instregex "LPQ$")>; 584def : InstRW<[FXb, FXb, LSU, Lat6, GroupAlone], (instregex "STPQ$")>; 585 586// Load pair disjoint 587def : InstRW<[LSU, LSU, Lat5, GroupAlone], (instregex "LPD(G)?$")>; 588 589//===----------------------------------------------------------------------===// 590// Translate and convert 591//===----------------------------------------------------------------------===// 592 593def : InstRW<[LSU, Lat30, GroupAlone], (instregex "TR$")>; 594def : InstRW<[FXa, FXa, FXa, LSU, LSU, Lat30, GroupAlone], (instregex "TRT$")>; 595def : InstRW<[FXa, LSU, Lat30], (instregex "TRTR$")>; 596def : InstRW<[FXa, Lat30], (instregex "TR(TR)?(T)?(E|EOpt)?$")>; 597def : InstRW<[LSU, Lat30], (instregex "TR(T|O)(T|O)(Opt)?$")>; 598def : InstRW<[FXa, Lat30], (instregex "CU(12|14|21|24|41|42)(Opt)?$")>; 599def : InstRW<[FXa, Lat30], (instregex "(CUUTF|CUTFU)(Opt)?$")>; 600 601//===----------------------------------------------------------------------===// 602// Message-security assist 603//===----------------------------------------------------------------------===// 604 605def : InstRW<[FXa, Lat30], (instregex "KM(C|F|O|CTR)?$")>; 606def : InstRW<[FXa, Lat30], (instregex "(KIMD|KLMD|KMAC|PCC|PPNO)$")>; 607 608//===----------------------------------------------------------------------===// 609// Decimal arithmetic 610//===----------------------------------------------------------------------===// 611 612def : InstRW<[FXb, VecDF, VecDF, LSU, LSU, Lat30, GroupAlone], 613 (instregex "CVBG$")>; 614def : InstRW<[FXb, VecDF, LSU, Lat30, GroupAlone], (instregex "CVB(Y)?$")>; 615def : InstRW<[FXb, FXb, FXb, VecDF2, VecDF2, LSU, Lat30, GroupAlone], 616 (instregex "CVDG$")>; 617def : InstRW<[FXb, VecDF, FXb, LSU, Lat30, GroupAlone], (instregex "CVD(Y)?$")>; 618def : InstRW<[LSU, Lat10, GroupAlone], (instregex "MVO$")>; 619def : InstRW<[LSU, Lat30, GroupAlone], (instregex "MV(N|Z)$")>; 620def : InstRW<[LSU, Lat30, GroupAlone], (instregex "(PACK|PKA|PKU)$")>; 621def : InstRW<[LSU, Lat12, GroupAlone], (instregex "UNPK(A|U)$")>; 622def : InstRW<[FXb, LSU, LSU, Lat9, BeginGroup], (instregex "UNPK$")>; 623 624def : InstRW<[FXb, VecDFX, LSU, LSU, LSU, Lat9, GroupAlone], 625 (instregex "(A|S|ZA)P$")>; 626def : InstRW<[FXb, VecDFX2, VecDFX2, LSU, LSU, LSU, Lat30, GroupAlone], 627 (instregex "(M|D)P$")>; 628def : InstRW<[FXb, VecDFX, VecDFX, LSU, LSU, Lat15, GroupAlone], 629 (instregex "SRP$")>; 630def : InstRW<[VecDFX, LSU, LSU, Lat5, GroupAlone], (instregex "CP$")>; 631def : InstRW<[VecDFX, LSU, Lat4, BeginGroup], (instregex "TP$")>; 632def : InstRW<[LSU, Lat30, GroupAlone], (instregex "ED(MK)?$")>; 633 634//===----------------------------------------------------------------------===// 635// Access registers 636//===----------------------------------------------------------------------===// 637 638// Extract/set/copy access register 639def : InstRW<[LSU], (instregex "(EAR|SAR|CPYA)$")>; 640 641// Load address extended 642def : InstRW<[LSU, FXa, Lat5, BeginGroup], (instregex "LAE(Y)?$")>; 643 644// Load/store access multiple (not modeled precisely) 645def : InstRW<[LSU, Lat30, GroupAlone], (instregex "(L|ST)AM(Y)?$")>; 646 647//===----------------------------------------------------------------------===// 648// Program mask and addressing mode 649//===----------------------------------------------------------------------===// 650 651// Insert Program Mask 652def : InstRW<[FXa, Lat3, EndGroup], (instregex "IPM$")>; 653 654// Set Program Mask 655def : InstRW<[LSU, EndGroup], (instregex "SPM$")>; 656 657// Branch and link 658def : InstRW<[FXa, FXa, FXb, Lat5, GroupAlone], (instregex "BAL(R)?$")>; 659 660// Test addressing mode 661def : InstRW<[FXb], (instregex "TAM$")>; 662 663// Set addressing mode 664def : InstRW<[FXb, Lat2, EndGroup], (instregex "SAM(24|31|64)$")>; 665 666// Branch (and save) and set mode. 667def : InstRW<[FXa, FXb, Lat2, GroupAlone], (instregex "BSM$")>; 668def : InstRW<[FXa, FXa, FXb, Lat3, GroupAlone], (instregex "BASSM$")>; 669 670//===----------------------------------------------------------------------===// 671// Transactional execution 672//===----------------------------------------------------------------------===// 673 674// Transaction begin 675def : InstRW<[LSU, LSU, FXb, FXb, FXb, FXb, FXb, Lat15, GroupAlone], 676 (instregex "TBEGIN(C|_nofloat)?$")>; 677 678// Transaction end 679def : InstRW<[FXb, GroupAlone], (instregex "TEND$")>; 680 681// Transaction abort 682def : InstRW<[LSU, GroupAlone], (instregex "TABORT$")>; 683 684// Extract Transaction Nesting Depth 685def : InstRW<[FXa], (instregex "ETND$")>; 686 687// Nontransactional store 688def : InstRW<[FXb, LSU, Lat5], (instregex "NTSTG$")>; 689 690//===----------------------------------------------------------------------===// 691// Processor assist 692//===----------------------------------------------------------------------===// 693 694def : InstRW<[FXb], (instregex "PPA$")>; 695 696//===----------------------------------------------------------------------===// 697// Miscellaneous Instructions. 698//===----------------------------------------------------------------------===// 699 700// Find leftmost one 701def : InstRW<[FXa, FXa, Lat6, GroupAlone], (instregex "FLOGR$")>; 702 703// Population count 704def : InstRW<[FXa, Lat3], (instregex "POPCNT$")>; 705 706// Extend 707def : InstRW<[FXa], (instregex "AEXT128$")>; 708def : InstRW<[FXa], (instregex "ZEXT128$")>; 709 710// String instructions 711def : InstRW<[FXa, LSU, Lat30], (instregex "SRST$")>; 712def : InstRW<[FXa, Lat30], (instregex "SRSTU$")>; 713def : InstRW<[LSU, Lat30, GroupAlone], (instregex "CUSE$")>; 714 715// Various complex instructions 716def : InstRW<[LSU, Lat30], (instregex "CFC$")>; 717def : InstRW<[FXb, LSU, Lat30], (instregex "UPT$")>; 718def : InstRW<[LSU, Lat30], (instregex "CKSM$")>; 719def : InstRW<[FXa, Lat30], (instregex "CMPSC$")>; 720 721// Execute 722def : InstRW<[FXb, GroupAlone], (instregex "EX(RL)?$")>; 723 724//===----------------------------------------------------------------------===// 725// .insn directive instructions 726//===----------------------------------------------------------------------===// 727 728// An "empty" sched-class will be assigned instead of the "invalid sched-class". 729// getNumDecoderSlots() will then return 1 instead of 0. 730def : InstRW<[], (instregex "Insn.*")>; 731 732 733// ----------------------------- Floating point ----------------------------- // 734 735//===----------------------------------------------------------------------===// 736// FP: Select instructions 737//===----------------------------------------------------------------------===// 738 739def : InstRW<[FXa], (instregex "SelectF(32|64|128)$")>; 740def : InstRW<[FXa], (instregex "CondStoreF32(Inv)?$")>; 741def : InstRW<[FXa], (instregex "CondStoreF64(Inv)?$")>; 742 743//===----------------------------------------------------------------------===// 744// FP: Move instructions 745//===----------------------------------------------------------------------===// 746 747// Load zero 748def : InstRW<[FXb], (instregex "LZ(DR|ER)$")>; 749def : InstRW<[FXb, FXb, Lat2, BeginGroup], (instregex "LZXR$")>; 750 751// Load 752def : InstRW<[VecXsPm], (instregex "LER$")>; 753def : InstRW<[FXb], (instregex "LD(R|R32|GR)$")>; 754def : InstRW<[FXb, Lat3], (instregex "LGDR$")>; 755def : InstRW<[FXb, FXb, Lat2, GroupAlone], (instregex "LXR$")>; 756 757// Load and Test 758def : InstRW<[VecXsPm, Lat4], (instregex "LT(D|E)BR$")>; 759def : InstRW<[VecXsPm, Lat4], (instregex "LTEBRCompare(_VecPseudo)?$")>; 760def : InstRW<[VecXsPm, Lat4], (instregex "LTDBRCompare(_VecPseudo)?$")>; 761def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "LTXBR$")>; 762def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], 763 (instregex "LTXBRCompare(_VecPseudo)?$")>; 764 765// Copy sign 766def : InstRW<[VecXsPm], (instregex "CPSDRd(d|s)$")>; 767def : InstRW<[VecXsPm], (instregex "CPSDRs(d|s)$")>; 768 769//===----------------------------------------------------------------------===// 770// FP: Load instructions 771//===----------------------------------------------------------------------===// 772 773def : InstRW<[VecXsPm, LSU, Lat7], (instregex "LE(Y)?$")>; 774def : InstRW<[LSU], (instregex "LD(Y|E32)?$")>; 775def : InstRW<[LSU], (instregex "LX$")>; 776 777//===----------------------------------------------------------------------===// 778// FP: Store instructions 779//===----------------------------------------------------------------------===// 780 781def : InstRW<[FXb, LSU, Lat7], (instregex "STD(Y)?$")>; 782def : InstRW<[FXb, LSU, Lat7], (instregex "STE(Y)?$")>; 783def : InstRW<[FXb, LSU, Lat5], (instregex "STX$")>; 784 785//===----------------------------------------------------------------------===// 786// FP: Conversion instructions 787//===----------------------------------------------------------------------===// 788 789// Load rounded 790def : InstRW<[VecBF], (instregex "LEDBR(A)?$")>; 791def : InstRW<[VecDF, VecDF, Lat20], (instregex "LEXBR(A)?$")>; 792def : InstRW<[VecDF, VecDF, Lat20], (instregex "LDXBR(A)?$")>; 793 794// Load lengthened 795def : InstRW<[VecBF, LSU, Lat12], (instregex "LDEB$")>; 796def : InstRW<[VecBF], (instregex "LDEBR$")>; 797def : InstRW<[VecBF2, VecBF2, LSU, Lat12 , GroupAlone], (instregex "LX(D|E)B$")>; 798def : InstRW<[VecBF2, VecBF2, GroupAlone], (instregex "LX(D|E)BR$")>; 799 800// Convert from fixed / logical 801def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CE(F|G)BR(A)?$")>; 802def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CD(F|G)BR(A)?$")>; 803def : InstRW<[FXb, VecDF2, VecDF2, Lat12, GroupAlone], (instregex "CX(F|G)BR(A)?$")>; 804def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CEL(F|G)BR$")>; 805def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CDL(F|G)BR$")>; 806def : InstRW<[FXb, VecDF2, VecDF2, Lat12, GroupAlone], (instregex "CXL(F|G)BR$")>; 807 808// Convert to fixed / logical 809def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CF(E|D)BR(A)?$")>; 810def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CG(E|D)BR(A)?$")>; 811def : InstRW<[FXb, VecDF, VecDF, Lat20, BeginGroup], (instregex "C(F|G)XBR(A)?$")>; 812def : InstRW<[FXb, VecBF, Lat11, GroupAlone], (instregex "CLFEBR$")>; 813def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CLFDBR$")>; 814def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CLG(E|D)BR$")>; 815def : InstRW<[FXb, VecDF, VecDF, Lat20, BeginGroup], (instregex "CL(F|G)XBR$")>; 816 817//===----------------------------------------------------------------------===// 818// FP: Unary arithmetic 819//===----------------------------------------------------------------------===// 820 821// Load Complement / Negative / Positive 822def : InstRW<[VecXsPm, Lat4], (instregex "L(C|N|P)DBR$")>; 823def : InstRW<[VecXsPm, Lat4], (instregex "L(C|N|P)EBR$")>; 824def : InstRW<[FXb], (instregex "LCDFR(_32)?$")>; 825def : InstRW<[FXb], (instregex "LNDFR(_32)?$")>; 826def : InstRW<[FXb], (instregex "LPDFR(_32)?$")>; 827def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "L(C|N|P)XBR$")>; 828 829// Square root 830def : InstRW<[VecFPd, LSU], (instregex "SQ(E|D)B$")>; 831def : InstRW<[VecFPd], (instregex "SQ(E|D)BR$")>; 832def : InstRW<[VecFPd, VecFPd, GroupAlone], (instregex "SQXBR$")>; 833 834// Load FP integer 835def : InstRW<[VecBF], (instregex "FIEBR(A)?$")>; 836def : InstRW<[VecBF], (instregex "FIDBR(A)?$")>; 837def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "FIXBR(A)?$")>; 838 839//===----------------------------------------------------------------------===// 840// FP: Binary arithmetic 841//===----------------------------------------------------------------------===// 842 843// Addition 844def : InstRW<[VecBF, LSU, Lat12], (instregex "A(E|D)B$")>; 845def : InstRW<[VecBF], (instregex "A(E|D)BR$")>; 846def : InstRW<[VecDF2, VecDF2, Lat10, GroupAlone], (instregex "AXBR$")>; 847 848// Subtraction 849def : InstRW<[VecBF, LSU, Lat12], (instregex "S(E|D)B$")>; 850def : InstRW<[VecBF], (instregex "S(E|D)BR$")>; 851def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "SXBR$")>; 852 853// Multiply 854def : InstRW<[VecBF, LSU, Lat12], (instregex "M(D|DE|EE)B$")>; 855def : InstRW<[VecBF], (instregex "M(D|DE|EE)BR$")>; 856def : InstRW<[VecBF2, VecBF2, LSU, Lat12, GroupAlone], (instregex "MXDB$")>; 857def : InstRW<[VecBF2, VecBF2, GroupAlone], (instregex "MXDBR$")>; 858def : InstRW<[VecDF2, VecDF2, Lat20, GroupAlone], (instregex "MXBR$")>; 859 860// Multiply and add / subtract 861def : InstRW<[VecBF2, LSU, Lat12, GroupAlone], (instregex "M(A|S)EB$")>; 862def : InstRW<[VecBF, GroupAlone], (instregex "M(A|S)EBR$")>; 863def : InstRW<[VecBF2, LSU, Lat12, GroupAlone], (instregex "M(A|S)DB$")>; 864def : InstRW<[VecBF], (instregex "M(A|S)DBR$")>; 865 866// Division 867def : InstRW<[VecFPd, LSU], (instregex "D(E|D)B$")>; 868def : InstRW<[VecFPd], (instregex "D(E|D)BR$")>; 869def : InstRW<[VecFPd, VecFPd, GroupAlone], (instregex "DXBR$")>; 870 871// Divide to integer 872def : InstRW<[VecFPd, Lat30], (instregex "DI(E|D)BR$")>; 873 874//===----------------------------------------------------------------------===// 875// FP: Comparisons 876//===----------------------------------------------------------------------===// 877 878// Compare 879def : InstRW<[VecXsPm, LSU, Lat8], (instregex "(K|C)(E|D)B$")>; 880def : InstRW<[VecXsPm, Lat4], (instregex "(K|C)(E|D)BR?$")>; 881def : InstRW<[VecDF, VecDF, Lat20, GroupAlone], (instregex "(K|C)XBR$")>; 882 883// Test Data Class 884def : InstRW<[LSU, VecXsPm, Lat9], (instregex "TC(E|D)B$")>; 885def : InstRW<[LSU, VecDF2, VecDF2, Lat15, GroupAlone], (instregex "TCXB$")>; 886 887//===----------------------------------------------------------------------===// 888// FP: Floating-point control register instructions 889//===----------------------------------------------------------------------===// 890 891def : InstRW<[FXa, LSU, Lat4, GroupAlone], (instregex "EFPC$")>; 892def : InstRW<[FXb, LSU, Lat5, GroupAlone], (instregex "STFPC$")>; 893def : InstRW<[LSU, Lat3, GroupAlone], (instregex "SFPC$")>; 894def : InstRW<[LSU, LSU, Lat6, GroupAlone], (instregex "LFPC$")>; 895def : InstRW<[FXa, Lat30], (instregex "SFASR$")>; 896def : InstRW<[FXa, LSU, Lat30], (instregex "LFAS$")>; 897def : InstRW<[FXb, Lat3, GroupAlone], (instregex "SRNM(B|T)?$")>; 898 899 900// --------------------- Hexadecimal floating point ------------------------- // 901 902//===----------------------------------------------------------------------===// 903// HFP: Move instructions 904//===----------------------------------------------------------------------===// 905 906// Load and Test 907def : InstRW<[VecXsPm, Lat4], (instregex "LT(D|E)R$")>; 908def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "LTXR$")>; 909 910//===----------------------------------------------------------------------===// 911// HFP: Conversion instructions 912//===----------------------------------------------------------------------===// 913 914// Load rounded 915def : InstRW<[VecBF], (instregex "(LEDR|LRER)$")>; 916def : InstRW<[VecBF], (instregex "LEXR$")>; 917def : InstRW<[VecDF2], (instregex "(LDXR|LRDR)$")>; 918 919// Load lengthened 920def : InstRW<[LSU], (instregex "LDE$")>; 921def : InstRW<[FXb], (instregex "LDER$")>; 922def : InstRW<[VecBF2, VecBF2, LSU, Lat12, GroupAlone], (instregex "LX(D|E)$")>; 923def : InstRW<[VecBF2, VecBF2, GroupAlone], (instregex "LX(D|E)R$")>; 924 925// Convert from fixed 926def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CE(F|G)R$")>; 927def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CD(F|G)R$")>; 928def : InstRW<[FXb, VecDF2, VecDF2, Lat12, GroupAlone], (instregex "CX(F|G)R$")>; 929 930// Convert to fixed 931def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CF(E|D)R$")>; 932def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CG(E|D)R$")>; 933def : InstRW<[FXb, VecDF, VecDF, Lat20, BeginGroup], (instregex "C(F|G)XR$")>; 934 935// Convert BFP to HFP / HFP to BFP. 936def : InstRW<[VecBF], (instregex "THD(E)?R$")>; 937def : InstRW<[VecBF], (instregex "TB(E)?DR$")>; 938 939//===----------------------------------------------------------------------===// 940// HFP: Unary arithmetic 941//===----------------------------------------------------------------------===// 942 943// Load Complement / Negative / Positive 944def : InstRW<[VecXsPm, Lat4], (instregex "L(C|N|P)DR$")>; 945def : InstRW<[VecXsPm, Lat4], (instregex "L(C|N|P)ER$")>; 946def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "L(C|N|P)XR$")>; 947 948// Halve 949def : InstRW<[VecBF], (instregex "H(E|D)R$")>; 950 951// Square root 952def : InstRW<[VecFPd, LSU], (instregex "SQ(E|D)$")>; 953def : InstRW<[VecFPd], (instregex "SQ(E|D)R$")>; 954def : InstRW<[VecFPd, VecFPd, GroupAlone], (instregex "SQXR$")>; 955 956// Load FP integer 957def : InstRW<[VecBF], (instregex "FIER$")>; 958def : InstRW<[VecBF], (instregex "FIDR$")>; 959def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "FIXR$")>; 960 961//===----------------------------------------------------------------------===// 962// HFP: Binary arithmetic 963//===----------------------------------------------------------------------===// 964 965// Addition 966def : InstRW<[VecBF, LSU, Lat12], (instregex "A(E|D|U|W)$")>; 967def : InstRW<[VecBF], (instregex "A(E|D|U|W)R$")>; 968def : InstRW<[VecDF2, VecDF2, Lat10, GroupAlone], (instregex "AXR$")>; 969 970// Subtraction 971def : InstRW<[VecBF, LSU, Lat12], (instregex "S(E|D|U|W)$")>; 972def : InstRW<[VecBF], (instregex "S(E|D|U|W)R$")>; 973def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "SXR$")>; 974 975// Multiply 976def : InstRW<[VecBF, LSU, Lat12], (instregex "M(D|DE|E|EE)$")>; 977def : InstRW<[VecBF], (instregex "M(D|DE|E|EE)R$")>; 978def : InstRW<[VecBF2, VecBF2, LSU, Lat12, GroupAlone], (instregex "MXD$")>; 979def : InstRW<[VecBF2, VecBF2, GroupAlone], (instregex "MXDR$")>; 980def : InstRW<[VecDF2, VecDF2, Lat20, GroupAlone], (instregex "MXR$")>; 981def : InstRW<[VecBF2, VecBF2, LSU, Lat12, GroupAlone], (instregex "MY$")>; 982def : InstRW<[VecBF2, LSU, Lat12, GroupAlone], (instregex "MY(H|L)$")>; 983def : InstRW<[VecBF2, VecBF2, GroupAlone], (instregex "MYR$")>; 984def : InstRW<[VecBF, GroupAlone], (instregex "MY(H|L)R$")>; 985 986// Multiply and add / subtract 987def : InstRW<[VecBF2, LSU, Lat12, GroupAlone], (instregex "M(A|S)E$")>; 988def : InstRW<[VecBF, GroupAlone], (instregex "M(A|S)ER$")>; 989def : InstRW<[VecBF2, LSU, Lat12, GroupAlone], (instregex "M(A|S)D$")>; 990def : InstRW<[VecBF, GroupAlone], (instregex "M(A|S)DR$")>; 991def : InstRW<[VecBF2, LSU, Lat12, GroupAlone], (instregex "MAY(H|L)$")>; 992def : InstRW<[VecBF2, VecBF2, LSU, Lat12, GroupAlone], (instregex "MAY$")>; 993def : InstRW<[VecBF, GroupAlone], (instregex "MAY(H|L)R$")>; 994def : InstRW<[VecBF2, VecBF2, GroupAlone], (instregex "MAYR$")>; 995 996// Division 997def : InstRW<[VecFPd, LSU], (instregex "D(E|D)$")>; 998def : InstRW<[VecFPd], (instregex "D(E|D)R$")>; 999def : InstRW<[VecFPd, VecFPd, GroupAlone], (instregex "DXR$")>; 1000 1001//===----------------------------------------------------------------------===// 1002// HFP: Comparisons 1003//===----------------------------------------------------------------------===// 1004 1005// Compare 1006def : InstRW<[VecBF, LSU, Lat12], (instregex "C(E|D)$")>; 1007def : InstRW<[VecBF], (instregex "C(E|D)R$")>; 1008def : InstRW<[VecDF, VecDF, Lat20, GroupAlone], (instregex "CXR$")>; 1009 1010 1011// ------------------------ Decimal floating point -------------------------- // 1012 1013//===----------------------------------------------------------------------===// 1014// DFP: Move instructions 1015//===----------------------------------------------------------------------===// 1016 1017// Load and Test 1018def : InstRW<[VecDF], (instregex "LTDTR$")>; 1019def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "LTXTR$")>; 1020 1021//===----------------------------------------------------------------------===// 1022// DFP: Conversion instructions 1023//===----------------------------------------------------------------------===// 1024 1025// Load rounded 1026def : InstRW<[VecDF, Lat15], (instregex "LEDTR$")>; 1027def : InstRW<[VecDF, VecDF, Lat20], (instregex "LDXTR$")>; 1028 1029// Load lengthened 1030def : InstRW<[VecDF], (instregex "LDETR$")>; 1031def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "LXDTR$")>; 1032 1033// Convert from fixed / logical 1034def : InstRW<[FXb, VecDF, Lat30, BeginGroup], (instregex "CD(F|G)TR(A)?$")>; 1035def : InstRW<[FXb, VecDF2, VecDF2, Lat30, GroupAlone], (instregex "CX(F|G)TR(A)?$")>; 1036def : InstRW<[FXb, VecDF, Lat30, BeginGroup], (instregex "CDL(F|G)TR$")>; 1037def : InstRW<[FXb, VecDF2, VecDF2, Lat30, GroupAlone], (instregex "CXL(F|G)TR$")>; 1038 1039// Convert to fixed / logical 1040def : InstRW<[FXb, VecDF, Lat30, BeginGroup], (instregex "C(F|G)DTR(A)?$")>; 1041def : InstRW<[FXb, VecDF, VecDF, Lat30, BeginGroup], (instregex "C(F|G)XTR(A)?$")>; 1042def : InstRW<[FXb, VecDF, Lat30, BeginGroup], (instregex "CL(F|G)DTR$")>; 1043def : InstRW<[FXb, VecDF, VecDF, Lat30, BeginGroup], (instregex "CL(F|G)XTR$")>; 1044 1045// Convert from / to signed / unsigned packed 1046def : InstRW<[FXb, VecDF, Lat9, BeginGroup], (instregex "CD(S|U)TR$")>; 1047def : InstRW<[FXb, FXb, VecDF2, VecDF2, Lat15, GroupAlone], (instregex "CX(S|U)TR$")>; 1048def : InstRW<[FXb, VecDF, Lat12, BeginGroup], (instregex "C(S|U)DTR$")>; 1049def : InstRW<[FXb, FXb, VecDF2, VecDF2, Lat15, GroupAlone], (instregex "C(S|U)XTR$")>; 1050 1051// Convert from / to zoned 1052def : InstRW<[LSU, VecDF, Lat11, BeginGroup], (instregex "CDZT$")>; 1053def : InstRW<[LSU, LSU, VecDF2, VecDF2, Lat15, GroupAlone], (instregex "CXZT$")>; 1054def : InstRW<[FXb, LSU, VecDF, Lat11, BeginGroup], (instregex "CZDT$")>; 1055def : InstRW<[FXb, LSU, VecDF, VecDF, Lat15, GroupAlone], (instregex "CZXT$")>; 1056 1057// Convert from / to packed 1058def : InstRW<[LSU, VecDF, Lat11, BeginGroup], (instregex "CDPT$")>; 1059def : InstRW<[LSU, LSU, VecDF2, VecDF2, Lat15, GroupAlone], (instregex "CXPT$")>; 1060def : InstRW<[FXb, LSU, VecDF, Lat11, BeginGroup], (instregex "CPDT$")>; 1061def : InstRW<[FXb, LSU, VecDF, VecDF, Lat15, GroupAlone], (instregex "CPXT$")>; 1062 1063// Perform floating-point operation 1064def : InstRW<[FXb, Lat30], (instregex "PFPO$")>; 1065 1066//===----------------------------------------------------------------------===// 1067// DFP: Unary arithmetic 1068//===----------------------------------------------------------------------===// 1069 1070// Load FP integer 1071def : InstRW<[VecDF], (instregex "FIDTR$")>; 1072def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "FIXTR$")>; 1073 1074// Extract biased exponent 1075def : InstRW<[FXb, VecDF, Lat12, BeginGroup], (instregex "EEDTR$")>; 1076def : InstRW<[FXb, VecDF, Lat12, BeginGroup], (instregex "EEXTR$")>; 1077 1078// Extract significance 1079def : InstRW<[FXb, VecDF, Lat12, BeginGroup], (instregex "ESDTR$")>; 1080def : InstRW<[FXb, VecDF, VecDF, Lat15, BeginGroup], (instregex "ESXTR$")>; 1081 1082//===----------------------------------------------------------------------===// 1083// DFP: Binary arithmetic 1084//===----------------------------------------------------------------------===// 1085 1086// Addition 1087def : InstRW<[VecDF], (instregex "ADTR(A)?$")>; 1088def : InstRW<[VecDF2, VecDF2, Lat10, GroupAlone], (instregex "AXTR(A)?$")>; 1089 1090// Subtraction 1091def : InstRW<[VecDF], (instregex "SDTR(A)?$")>; 1092def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "SXTR(A)?$")>; 1093 1094// Multiply 1095def : InstRW<[VecDF, Lat30], (instregex "MDTR(A)?$")>; 1096def : InstRW<[VecDF2, VecDF2, Lat30, GroupAlone], (instregex "MXTR(A)?$")>; 1097 1098// Division 1099def : InstRW<[VecDF, Lat30], (instregex "DDTR(A)?$")>; 1100def : InstRW<[VecDF2, VecDF2, Lat30, GroupAlone], (instregex "DXTR(A)?$")>; 1101 1102// Quantize 1103def : InstRW<[VecDF], (instregex "QADTR$")>; 1104def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "QAXTR$")>; 1105 1106// Reround 1107def : InstRW<[FXb, VecDF, Lat11, BeginGroup], (instregex "RRDTR$")>; 1108def : InstRW<[FXb, VecDF2, VecDF2, Lat15, GroupAlone], (instregex "RRXTR$")>; 1109 1110// Shift significand left/right 1111def : InstRW<[LSU, VecDF, Lat11, GroupAlone], (instregex "S(L|R)DT$")>; 1112def : InstRW<[LSU, VecDF2, VecDF2, Lat15, GroupAlone], (instregex "S(L|R)XT$")>; 1113 1114// Insert biased exponent 1115def : InstRW<[FXb, VecDF, Lat11, BeginGroup], (instregex "IEDTR$")>; 1116def : InstRW<[FXb, VecDF2, VecDF2, Lat15, GroupAlone], (instregex "IEXTR$")>; 1117 1118//===----------------------------------------------------------------------===// 1119// DFP: Comparisons 1120//===----------------------------------------------------------------------===// 1121 1122// Compare 1123def : InstRW<[VecDF], (instregex "(K|C)DTR$")>; 1124def : InstRW<[VecDF, VecDF, Lat11, GroupAlone], (instregex "(K|C)XTR$")>; 1125 1126// Compare biased exponent 1127def : InstRW<[VecDF], (instregex "CEDTR$")>; 1128def : InstRW<[VecDF], (instregex "CEXTR$")>; 1129 1130// Test Data Class/Group 1131def : InstRW<[LSU, VecDF, Lat11], (instregex "TD(C|G)(E|D)T$")>; 1132def : InstRW<[LSU, VecDF, VecDF, Lat15, GroupAlone], (instregex "TD(C|G)XT$")>; 1133 1134 1135// --------------------------------- Vector --------------------------------- // 1136 1137//===----------------------------------------------------------------------===// 1138// Vector: Move instructions 1139//===----------------------------------------------------------------------===// 1140 1141def : InstRW<[FXb], (instregex "VLR(32|64)?$")>; 1142def : InstRW<[FXb, Lat4], (instregex "VLGV(B|F|G|H)?$")>; 1143def : InstRW<[FXb], (instregex "VLVG(B|F|G|H)?$")>; 1144def : InstRW<[FXb, Lat2], (instregex "VLVGP(32)?$")>; 1145 1146//===----------------------------------------------------------------------===// 1147// Vector: Immediate instructions 1148//===----------------------------------------------------------------------===// 1149 1150def : InstRW<[VecXsPm], (instregex "VZERO$")>; 1151def : InstRW<[VecXsPm], (instregex "VONE$")>; 1152def : InstRW<[VecXsPm], (instregex "VGBM$")>; 1153def : InstRW<[VecXsPm], (instregex "VGM(B|F|G|H)?$")>; 1154def : InstRW<[VecXsPm], (instregex "VREPI(B|F|G|H)?$")>; 1155def : InstRW<[VecXsPm], (instregex "VLEI(B|F|G|H)$")>; 1156 1157//===----------------------------------------------------------------------===// 1158// Vector: Loads 1159//===----------------------------------------------------------------------===// 1160 1161def : InstRW<[LSU], (instregex "VL(L|BB)?$")>; 1162def : InstRW<[LSU], (instregex "VL(32|64)$")>; 1163def : InstRW<[LSU], (instregex "VLLEZ(B|F|G|H)?$")>; 1164def : InstRW<[LSU], (instregex "VLREP(B|F|G|H)?$")>; 1165def : InstRW<[VecXsPm, LSU, Lat7], (instregex "VLE(B|F|G|H)$")>; 1166def : InstRW<[FXb, LSU, VecXsPm, Lat11, BeginGroup], (instregex "VGE(F|G)$")>; 1167def : InstRW<[LSU, LSU, LSU, LSU, LSU, Lat10, GroupAlone], 1168 (instregex "VLM$")>; 1169 1170//===----------------------------------------------------------------------===// 1171// Vector: Stores 1172//===----------------------------------------------------------------------===// 1173 1174def : InstRW<[FXb, LSU, Lat8], (instregex "VST(L|32|64)?$")>; 1175def : InstRW<[FXb, LSU, Lat8], (instregex "VSTE(F|G)$")>; 1176def : InstRW<[FXb, LSU, VecXsPm, Lat11, BeginGroup], (instregex "VSTE(B|H)$")>; 1177def : InstRW<[LSU, LSU, FXb, FXb, FXb, FXb, FXb, Lat20, GroupAlone], 1178 (instregex "VSTM$")>; 1179def : InstRW<[FXb, FXb, LSU, Lat12, BeginGroup], (instregex "VSCE(F|G)$")>; 1180 1181//===----------------------------------------------------------------------===// 1182// Vector: Selects and permutes 1183//===----------------------------------------------------------------------===// 1184 1185def : InstRW<[VecXsPm], (instregex "VMRH(B|F|G|H)?$")>; 1186def : InstRW<[VecXsPm], (instregex "VMRL(B|F|G|H)?$")>; 1187def : InstRW<[VecXsPm], (instregex "VPERM$")>; 1188def : InstRW<[VecXsPm], (instregex "VPDI$")>; 1189def : InstRW<[VecXsPm], (instregex "VREP(B|F|G|H)?$")>; 1190def : InstRW<[VecXsPm], (instregex "VSEL$")>; 1191 1192//===----------------------------------------------------------------------===// 1193// Vector: Widening and narrowing 1194//===----------------------------------------------------------------------===// 1195 1196def : InstRW<[VecXsPm], (instregex "VPK(F|G|H)?$")>; 1197def : InstRW<[VecXsPm], (instregex "VPKS(F|G|H)?$")>; 1198def : InstRW<[VecXsPm, Lat4], (instregex "VPKS(F|G|H)S$")>; 1199def : InstRW<[VecXsPm], (instregex "VPKLS(F|G|H)?$")>; 1200def : InstRW<[VecXsPm, Lat4], (instregex "VPKLS(F|G|H)S$")>; 1201def : InstRW<[VecXsPm], (instregex "VSEG(B|F|H)?$")>; 1202def : InstRW<[VecXsPm], (instregex "VUPH(B|F|H)?$")>; 1203def : InstRW<[VecXsPm], (instregex "VUPL(B|F)?$")>; 1204def : InstRW<[VecXsPm], (instregex "VUPLH(B|F|H|W)?$")>; 1205def : InstRW<[VecXsPm], (instregex "VUPLL(B|F|H)?$")>; 1206 1207//===----------------------------------------------------------------------===// 1208// Vector: Integer arithmetic 1209//===----------------------------------------------------------------------===// 1210 1211def : InstRW<[VecXsPm], (instregex "VA(B|F|G|H|Q|C|CQ)?$")>; 1212def : InstRW<[VecXsPm], (instregex "VACC(B|F|G|H|Q|C|CQ)?$")>; 1213def : InstRW<[VecXsPm], (instregex "VAVG(B|F|G|H)?$")>; 1214def : InstRW<[VecXsPm], (instregex "VAVGL(B|F|G|H)?$")>; 1215def : InstRW<[VecXsPm], (instregex "VN(C|O)?$")>; 1216def : InstRW<[VecXsPm], (instregex "VO$")>; 1217def : InstRW<[VecMul], (instregex "VCKSM$")>; 1218def : InstRW<[VecXsPm], (instregex "VCLZ(B|F|G|H)?$")>; 1219def : InstRW<[VecXsPm], (instregex "VCTZ(B|F|G|H)?$")>; 1220def : InstRW<[VecXsPm], (instregex "VX$")>; 1221def : InstRW<[VecMul], (instregex "VGFM?$")>; 1222def : InstRW<[VecMul], (instregex "VGFMA(B|F|G|H)?$")>; 1223def : InstRW<[VecMul], (instregex "VGFM(B|F|G|H)$")>; 1224def : InstRW<[VecXsPm], (instregex "VLC(B|F|G|H)?$")>; 1225def : InstRW<[VecXsPm], (instregex "VLP(B|F|G|H)?$")>; 1226def : InstRW<[VecXsPm], (instregex "VMX(B|F|G|H)?$")>; 1227def : InstRW<[VecXsPm], (instregex "VMXL(B|F|G|H)?$")>; 1228def : InstRW<[VecXsPm], (instregex "VMN(B|F|G|H)?$")>; 1229def : InstRW<[VecXsPm], (instregex "VMNL(B|F|G|H)?$")>; 1230def : InstRW<[VecMul], (instregex "VMAL(B|F)?$")>; 1231def : InstRW<[VecMul], (instregex "VMALE(B|F|H)?$")>; 1232def : InstRW<[VecMul], (instregex "VMALH(B|F|H|W)?$")>; 1233def : InstRW<[VecMul], (instregex "VMALO(B|F|H)?$")>; 1234def : InstRW<[VecMul], (instregex "VMAO(B|F|H)?$")>; 1235def : InstRW<[VecMul], (instregex "VMAE(B|F|H)?$")>; 1236def : InstRW<[VecMul], (instregex "VMAH(B|F|H)?$")>; 1237def : InstRW<[VecMul], (instregex "VME(B|F|H)?$")>; 1238def : InstRW<[VecMul], (instregex "VMH(B|F|H)?$")>; 1239def : InstRW<[VecMul], (instregex "VML(B|F)?$")>; 1240def : InstRW<[VecMul], (instregex "VMLE(B|F|H)?$")>; 1241def : InstRW<[VecMul], (instregex "VMLH(B|F|H|W)?$")>; 1242def : InstRW<[VecMul], (instregex "VMLO(B|F|H)?$")>; 1243def : InstRW<[VecMul], (instregex "VMO(B|F|H)?$")>; 1244 1245def : InstRW<[VecXsPm], (instregex "VPOPCT$")>; 1246 1247def : InstRW<[VecXsPm], (instregex "VERLL(B|F|G|H)?$")>; 1248def : InstRW<[VecXsPm], (instregex "VERLLV(B|F|G|H)?$")>; 1249def : InstRW<[VecXsPm], (instregex "VERIM(B|F|G|H)?$")>; 1250def : InstRW<[VecXsPm], (instregex "VESL(B|F|G|H)?$")>; 1251def : InstRW<[VecXsPm], (instregex "VESLV(B|F|G|H)?$")>; 1252def : InstRW<[VecXsPm], (instregex "VESRA(B|F|G|H)?$")>; 1253def : InstRW<[VecXsPm], (instregex "VESRAV(B|F|G|H)?$")>; 1254def : InstRW<[VecXsPm], (instregex "VESRL(B|F|G|H)?$")>; 1255def : InstRW<[VecXsPm], (instregex "VESRLV(B|F|G|H)?$")>; 1256 1257def : InstRW<[VecXsPm], (instregex "VSL(DB)?$")>; 1258def : InstRW<[VecXsPm, VecXsPm, Lat8], (instregex "VSLB$")>; 1259def : InstRW<[VecXsPm], (instregex "VSR(A|L)$")>; 1260def : InstRW<[VecXsPm, VecXsPm, Lat8], (instregex "VSR(A|L)B$")>; 1261 1262def : InstRW<[VecXsPm], (instregex "VSB(I|IQ|CBI|CBIQ)?$")>; 1263def : InstRW<[VecXsPm], (instregex "VSCBI(B|F|G|H|Q)?$")>; 1264def : InstRW<[VecXsPm], (instregex "VS(F|G|H|Q)?$")>; 1265 1266def : InstRW<[VecMul], (instregex "VSUM(B|H)?$")>; 1267def : InstRW<[VecMul], (instregex "VSUMG(F|H)?$")>; 1268def : InstRW<[VecMul], (instregex "VSUMQ(F|G)?$")>; 1269 1270//===----------------------------------------------------------------------===// 1271// Vector: Integer comparison 1272//===----------------------------------------------------------------------===// 1273 1274def : InstRW<[VecXsPm, Lat4], (instregex "VEC(B|F|G|H)?$")>; 1275def : InstRW<[VecXsPm, Lat4], (instregex "VECL(B|F|G|H)?$")>; 1276def : InstRW<[VecXsPm], (instregex "VCEQ(B|F|G|H)?$")>; 1277def : InstRW<[VecXsPm, Lat4], (instregex "VCEQ(B|F|G|H)S$")>; 1278def : InstRW<[VecXsPm], (instregex "VCH(B|F|G|H)?$")>; 1279def : InstRW<[VecXsPm, Lat4], (instregex "VCH(B|F|G|H)S$")>; 1280def : InstRW<[VecXsPm], (instregex "VCHL(B|F|G|H)?$")>; 1281def : InstRW<[VecXsPm, Lat4], (instregex "VCHL(B|F|G|H)S$")>; 1282def : InstRW<[VecStr, Lat5], (instregex "VTM$")>; 1283 1284//===----------------------------------------------------------------------===// 1285// Vector: Floating-point arithmetic 1286//===----------------------------------------------------------------------===// 1287 1288// Conversion and rounding 1289def : InstRW<[VecBF2], (instregex "VCD(L)?G$")>; 1290def : InstRW<[VecBF2], (instregex "VCD(L)?GB$")>; 1291def : InstRW<[VecBF], (instregex "WCD(L)?GB$")>; 1292def : InstRW<[VecBF2], (instregex "VC(L)?GD$")>; 1293def : InstRW<[VecBF2], (instregex "VC(L)?GDB$")>; 1294def : InstRW<[VecBF], (instregex "WC(L)?GDB$")>; 1295def : InstRW<[VecBF2], (instregex "VL(DE|ED)$")>; 1296def : InstRW<[VecBF2], (instregex "VL(DE|ED)B$")>; 1297def : InstRW<[VecBF], (instregex "WL(DE|ED)B$")>; 1298def : InstRW<[VecBF2], (instregex "VFI$")>; 1299def : InstRW<[VecBF2], (instregex "VFIDB$")>; 1300def : InstRW<[VecBF], (instregex "WFIDB$")>; 1301 1302// Sign operations 1303def : InstRW<[VecXsPm], (instregex "VFPSO$")>; 1304def : InstRW<[VecXsPm], (instregex "(V|W)FPSODB$")>; 1305def : InstRW<[VecXsPm], (instregex "(V|W)FL(C|N|P)DB$")>; 1306 1307// Test data class 1308def : InstRW<[VecXsPm, Lat4], (instregex "VFTCI$")>; 1309def : InstRW<[VecXsPm, Lat4], (instregex "(V|W)FTCIDB$")>; 1310 1311// Add / subtract 1312def : InstRW<[VecBF2], (instregex "VF(A|S)$")>; 1313def : InstRW<[VecBF2], (instregex "VF(A|S)DB$")>; 1314def : InstRW<[VecBF], (instregex "WF(A|S)DB$")>; 1315 1316// Multiply / multiply-and-add/subtract 1317def : InstRW<[VecBF2], (instregex "VFM$")>; 1318def : InstRW<[VecBF2], (instregex "VFMDB$")>; 1319def : InstRW<[VecBF], (instregex "WFMDB$")>; 1320def : InstRW<[VecBF2], (instregex "VFM(A|S)$")>; 1321def : InstRW<[VecBF2], (instregex "VFM(A|S)DB$")>; 1322def : InstRW<[VecBF], (instregex "WFM(A|S)DB$")>; 1323 1324// Divide / square root 1325def : InstRW<[VecFPd], (instregex "VFD$")>; 1326def : InstRW<[VecFPd], (instregex "(V|W)FDDB$")>; 1327def : InstRW<[VecFPd], (instregex "VFSQ$")>; 1328def : InstRW<[VecFPd], (instregex "(V|W)FSQDB$")>; 1329 1330//===----------------------------------------------------------------------===// 1331// Vector: Floating-point comparison 1332//===----------------------------------------------------------------------===// 1333 1334def : InstRW<[VecXsPm], (instregex "VFC(E|H|HE)$")>; 1335def : InstRW<[VecXsPm], (instregex "VFC(E|H|HE)DB$")>; 1336def : InstRW<[VecXsPm], (instregex "WFC(E|H|HE)DB$")>; 1337def : InstRW<[VecXsPm, Lat4], (instregex "VFC(E|H|HE)DBS$")>; 1338def : InstRW<[VecXsPm, Lat4], (instregex "WFC(E|H|HE)DBS$")>; 1339def : InstRW<[VecXsPm, Lat4], (instregex "WF(C|K)$")>; 1340def : InstRW<[VecXsPm, Lat4], (instregex "WF(C|K)DB$")>; 1341 1342//===----------------------------------------------------------------------===// 1343// Vector: Floating-point insertion and extraction 1344//===----------------------------------------------------------------------===// 1345 1346def : InstRW<[FXb], (instregex "LEFR$")>; 1347def : InstRW<[FXb, Lat4], (instregex "LFER$")>; 1348 1349//===----------------------------------------------------------------------===// 1350// Vector: String instructions 1351//===----------------------------------------------------------------------===// 1352 1353def : InstRW<[VecStr], (instregex "VFAE(B)?$")>; 1354def : InstRW<[VecStr, Lat5], (instregex "VFAEBS$")>; 1355def : InstRW<[VecStr], (instregex "VFAE(F|H)$")>; 1356def : InstRW<[VecStr, Lat5], (instregex "VFAE(F|H)S$")>; 1357def : InstRW<[VecStr], (instregex "VFAEZ(B|F|H)$")>; 1358def : InstRW<[VecStr, Lat5], (instregex "VFAEZ(B|F|H)S$")>; 1359def : InstRW<[VecStr], (instregex "VFEE(B|F|H|ZB|ZF|ZH)?$")>; 1360def : InstRW<[VecStr, Lat5], (instregex "VFEE(B|F|H|ZB|ZF|ZH)S$")>; 1361def : InstRW<[VecStr], (instregex "VFENE(B|F|H|ZB|ZF|ZH)?$")>; 1362def : InstRW<[VecStr, Lat5], (instregex "VFENE(B|F|H|ZB|ZF|ZH)S$")>; 1363def : InstRW<[VecStr], (instregex "VISTR(B|F|H)?$")>; 1364def : InstRW<[VecStr, Lat5], (instregex "VISTR(B|F|H)S$")>; 1365def : InstRW<[VecStr], (instregex "VSTRC(B|F|H)?$")>; 1366def : InstRW<[VecStr, Lat5], (instregex "VSTRC(B|F|H)S$")>; 1367def : InstRW<[VecStr], (instregex "VSTRCZ(B|F|H)$")>; 1368def : InstRW<[VecStr, Lat5], (instregex "VSTRCZ(B|F|H)S$")>; 1369 1370 1371// -------------------------------- System ---------------------------------- // 1372 1373//===----------------------------------------------------------------------===// 1374// System: Program-Status Word Instructions 1375//===----------------------------------------------------------------------===// 1376 1377def : InstRW<[FXb, Lat30], (instregex "EPSW$")>; 1378def : InstRW<[FXb, LSU, Lat30], (instregex "LPSW(E)?$")>; 1379def : InstRW<[FXa, Lat3, GroupAlone], (instregex "IPK$")>; 1380def : InstRW<[LSU, EndGroup], (instregex "SPKA$")>; 1381def : InstRW<[LSU, EndGroup], (instregex "SSM$")>; 1382def : InstRW<[FXb, LSU, GroupAlone], (instregex "ST(N|O)SM$")>; 1383def : InstRW<[FXa, Lat3], (instregex "IAC$")>; 1384def : InstRW<[LSU, EndGroup], (instregex "SAC(F)?$")>; 1385 1386//===----------------------------------------------------------------------===// 1387// System: Control Register Instructions 1388//===----------------------------------------------------------------------===// 1389 1390def : InstRW<[FXb, LSU, Lat30], (instregex "LCTL(G)?$")>; 1391def : InstRW<[LSU, Lat30], (instregex "STCT(L|G)$")>; 1392def : InstRW<[LSU], (instregex "E(P|S)A(I)?R$")>; 1393def : InstRW<[FXb, Lat30], (instregex "SSA(I)?R$")>; 1394def : InstRW<[FXb, Lat30], (instregex "ESEA$")>; 1395 1396//===----------------------------------------------------------------------===// 1397// System: Prefix-Register Instructions 1398//===----------------------------------------------------------------------===// 1399 1400def : InstRW<[FXb, LSU, Lat30], (instregex "SPX$")>; 1401def : InstRW<[FXb, LSU, Lat30], (instregex "STPX$")>; 1402 1403//===----------------------------------------------------------------------===// 1404// System: Storage-Key and Real Memory Instructions 1405//===----------------------------------------------------------------------===// 1406 1407def : InstRW<[FXb, Lat30], (instregex "ISKE$")>; 1408def : InstRW<[FXb, Lat30], (instregex "IVSK$")>; 1409def : InstRW<[FXb, Lat30], (instregex "SSKE(Opt)?$")>; 1410def : InstRW<[FXb, Lat30], (instregex "RRB(E|M)$")>; 1411def : InstRW<[FXb, Lat30], (instregex "PFMF$")>; 1412def : InstRW<[FXb, Lat30], (instregex "TB$")>; 1413def : InstRW<[FXb, LSU, Lat30], (instregex "PGIN$")>; 1414def : InstRW<[FXb, LSU, Lat30], (instregex "PGOUT$")>; 1415 1416//===----------------------------------------------------------------------===// 1417// System: Dynamic-Address-Translation Instructions 1418//===----------------------------------------------------------------------===// 1419 1420def : InstRW<[FXb, LSU, Lat30], (instregex "IPTE(Opt)?(Opt)?$")>; 1421def : InstRW<[FXb, Lat30], (instregex "IDTE(Opt)?$")>; 1422def : InstRW<[FXb, Lat30], (instregex "CRDTE(Opt)?$")>; 1423def : InstRW<[FXb, Lat30], (instregex "PTLB$")>; 1424def : InstRW<[FXb, LSU, Lat30], (instregex "CSP(G)?$")>; 1425def : InstRW<[FXb, LSU, Lat30], (instregex "LPTEA$")>; 1426def : InstRW<[FXb, LSU, Lat30], (instregex "LRA(Y|G)?$")>; 1427def : InstRW<[FXb, LSU, Lat30], (instregex "STRAG$")>; 1428def : InstRW<[FXb, LSU, Lat30], (instregex "LURA(G)?$")>; 1429def : InstRW<[FXb, LSU, Lat30], (instregex "STUR(A|G)$")>; 1430def : InstRW<[FXb, LSU, Lat30], (instregex "TPROT$")>; 1431 1432//===----------------------------------------------------------------------===// 1433// System: Memory-move Instructions 1434//===----------------------------------------------------------------------===// 1435 1436def : InstRW<[FXa, FXa, FXb, LSU, Lat8, GroupAlone], (instregex "MVC(K|P|S)$")>; 1437def : InstRW<[FXa, LSU, Lat6, GroupAlone], (instregex "MVC(S|D)K$")>; 1438def : InstRW<[FXb, LSU, Lat30], (instregex "MVCOS$")>; 1439def : InstRW<[LSU, Lat30, GroupAlone], (instregex "MVPG$")>; 1440 1441//===----------------------------------------------------------------------===// 1442// System: Address-Space Instructions 1443//===----------------------------------------------------------------------===// 1444 1445def : InstRW<[FXb, LSU, Lat30], (instregex "LASP$")>; 1446def : InstRW<[LSU, GroupAlone], (instregex "PALB$")>; 1447def : InstRW<[FXb, LSU, Lat30], (instregex "PC$")>; 1448def : InstRW<[FXb, Lat30], (instregex "PR$")>; 1449def : InstRW<[FXb, Lat30], (instregex "PT(I)?$")>; 1450def : InstRW<[FXb, LSU, Lat30], (instregex "RP$")>; 1451def : InstRW<[FXb, Lat30], (instregex "BS(G|A)$")>; 1452def : InstRW<[FXb, Lat20], (instregex "TAR$")>; 1453 1454//===----------------------------------------------------------------------===// 1455// System: Linkage-Stack Instructions 1456//===----------------------------------------------------------------------===// 1457 1458def : InstRW<[FXb, Lat30, EndGroup], (instregex "BAKR$")>; 1459def : InstRW<[FXb, Lat30], (instregex "EREG(G)?$")>; 1460def : InstRW<[FXb, Lat30], (instregex "(E|M)STA$")>; 1461 1462//===----------------------------------------------------------------------===// 1463// System: Time-Related Instructions 1464//===----------------------------------------------------------------------===// 1465 1466def : InstRW<[FXb, Lat30], (instregex "PTFF$")>; 1467def : InstRW<[FXb, LSU, Lat20], (instregex "SCK$")>; 1468def : InstRW<[FXb, Lat30], (instregex "SCKPF$")>; 1469def : InstRW<[FXb, LSU, Lat20], (instregex "SCKC$")>; 1470def : InstRW<[LSU, LSU, GroupAlone], (instregex "SPT$")>; 1471def : InstRW<[LSU, LSU, LSU, FXa, FXa, FXb, Lat9, GroupAlone], 1472 (instregex "STCK(F)?$")>; 1473def : InstRW<[LSU, LSU, LSU, LSU, FXa, FXa, FXb, FXb, Lat11, GroupAlone], 1474 (instregex "STCKE$")>; 1475def : InstRW<[FXb, LSU, Lat9], (instregex "STCKC$")>; 1476def : InstRW<[LSU, LSU, FXb, Lat5, BeginGroup], (instregex "STPT$")>; 1477 1478//===----------------------------------------------------------------------===// 1479// System: CPU-Related Instructions 1480//===----------------------------------------------------------------------===// 1481 1482def : InstRW<[FXb, LSU, Lat30], (instregex "STAP$")>; 1483def : InstRW<[FXb, LSU, Lat30], (instregex "STIDP$")>; 1484def : InstRW<[FXb, LSU, Lat30], (instregex "STSI$")>; 1485def : InstRW<[FXb, LSU, Lat30], (instregex "STFL(E)?$")>; 1486def : InstRW<[FXb, LSU, Lat30], (instregex "ECAG$")>; 1487def : InstRW<[FXa, LSU, Lat30], (instregex "ECTG$")>; 1488def : InstRW<[FXb, Lat30], (instregex "PTF$")>; 1489def : InstRW<[FXb, Lat30], (instregex "PCKMO$")>; 1490 1491//===----------------------------------------------------------------------===// 1492// System: Miscellaneous Instructions 1493//===----------------------------------------------------------------------===// 1494 1495def : InstRW<[FXb, Lat30], (instregex "SVC$")>; 1496def : InstRW<[FXb, GroupAlone], (instregex "MC$")>; 1497def : InstRW<[FXb, Lat30], (instregex "DIAG$")>; 1498def : InstRW<[FXb], (instregex "TRAC(E|G)$")>; 1499def : InstRW<[FXb, Lat30], (instregex "TRAP(2|4)$")>; 1500def : InstRW<[FXb, Lat30], (instregex "SIGP$")>; 1501def : InstRW<[FXb, LSU, Lat30], (instregex "SIGA$")>; 1502def : InstRW<[FXb, LSU, Lat30], (instregex "SIE$")>; 1503 1504//===----------------------------------------------------------------------===// 1505// System: CPU-Measurement Facility Instructions 1506//===----------------------------------------------------------------------===// 1507 1508def : InstRW<[FXb], (instregex "LPP$")>; 1509def : InstRW<[FXb, Lat30], (instregex "ECPGA$")>; 1510def : InstRW<[FXb, Lat30], (instregex "E(C|P)CTR$")>; 1511def : InstRW<[FXb, Lat30], (instregex "LCCTL$")>; 1512def : InstRW<[FXb, LSU, Lat30], (instregex "L(P|S)CTL$")>; 1513def : InstRW<[FXb, LSU, Lat30], (instregex "Q(S|CTR)I$")>; 1514def : InstRW<[FXb, Lat30], (instregex "S(C|P)CTR$")>; 1515 1516//===----------------------------------------------------------------------===// 1517// System: I/O Instructions 1518//===----------------------------------------------------------------------===// 1519 1520def : InstRW<[FXb, Lat30], (instregex "(C|H|R|X)SCH$")>; 1521def : InstRW<[FXb, LSU, Lat30], (instregex "(M|S|ST|T)SCH$")>; 1522def : InstRW<[FXb, Lat30], (instregex "RCHP$")>; 1523def : InstRW<[FXb, Lat30], (instregex "SCHM$")>; 1524def : InstRW<[FXb, LSU, Lat30], (instregex "STC(PS|RW)$")>; 1525def : InstRW<[FXb, LSU, Lat30], (instregex "TPI$")>; 1526def : InstRW<[FXb, Lat30], (instregex "SAL$")>; 1527 1528} 1529 1530