1*0b57cec5SDimitry Andric//==- SystemZInstrSystem.td - SystemZ system instructions -*- tblgen-*-----==// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric// 9*0b57cec5SDimitry Andric// The instructions in this file implement SystemZ system-level instructions. 10*0b57cec5SDimitry Andric// Most of these instructions are privileged or semi-privileged. They are 11*0b57cec5SDimitry Andric// not used for code generation, but are provided for use with the assembler 12*0b57cec5SDimitry Andric// and disassembler only. 13*0b57cec5SDimitry Andric// 14*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 15*0b57cec5SDimitry Andric 16*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 17*0b57cec5SDimitry Andric// Program-Status Word Instructions. 18*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 19*0b57cec5SDimitry Andric 20*0b57cec5SDimitry Andric// Extract PSW. 21*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [CC] in 22*0b57cec5SDimitry Andric def EPSW : InherentDualRRE<"epsw", 0xB98D, GR32>; 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andric// Load PSW (extended). 25*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in { 26*0b57cec5SDimitry Andric def LPSW : SideEffectUnaryS<"lpsw", 0x8200, null_frag, 8>; 27*0b57cec5SDimitry Andric def LPSWE : SideEffectUnaryS<"lpswe", 0xB2B2, null_frag, 16>; 28*0b57cec5SDimitry Andric} 29*0b57cec5SDimitry Andriclet Predicates = [FeatureBEAREnhancement], hasSideEffects = 1, Defs = [CC] in 30*0b57cec5SDimitry Andric def LPSWEY : SideEffectUnarySIY<"lpswey", 0xEB71, 16>; 31*0b57cec5SDimitry Andric 32*0b57cec5SDimitry Andric// Insert PSW key. 33*0b57cec5SDimitry Andriclet Uses = [R2L], Defs = [R2L] in 34*0b57cec5SDimitry Andric def IPK : SideEffectInherentS<"ipk", 0xB20B, null_frag>; 35*0b57cec5SDimitry Andric 36*0b57cec5SDimitry Andric// Set PSW key from address. 37*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 38*0b57cec5SDimitry Andric def SPKA : SideEffectAddressS<"spka", 0xB20A, null_frag>; 39*0b57cec5SDimitry Andric 40*0b57cec5SDimitry Andric// Set system mask. 41*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 42*0b57cec5SDimitry Andric def SSM : SideEffectUnaryS<"ssm", 0x8000, null_frag, 1>; 43*0b57cec5SDimitry Andric 44*0b57cec5SDimitry Andric// Store then AND/OR system mask. 45*0b57cec5SDimitry Andriclet hasSideEffects = 1 in { 46*0b57cec5SDimitry Andric def STNSM : StoreSI<"stnsm", 0xAC, null_frag, imm32zx8>; 47*0b57cec5SDimitry Andric def STOSM : StoreSI<"stosm", 0xAD, null_frag, imm32zx8>; 48*0b57cec5SDimitry Andric} 49*0b57cec5SDimitry Andric 50*0b57cec5SDimitry Andric// Insert address space control. 51*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 52*0b57cec5SDimitry Andric def IAC : InherentRRE<"iac", 0xB224, GR32, null_frag>; 53*0b57cec5SDimitry Andric 54*0b57cec5SDimitry Andric// Set address space control (fast). 55*0b57cec5SDimitry Andriclet hasSideEffects = 1 in { 56*0b57cec5SDimitry Andric def SAC : SideEffectAddressS<"sac", 0xB219, null_frag>; 57*0b57cec5SDimitry Andric def SACF : SideEffectAddressS<"sacf", 0xB279, null_frag>; 58*0b57cec5SDimitry Andric} 59*0b57cec5SDimitry Andric 60*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 61*0b57cec5SDimitry Andric// Control Register Instructions. 62*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 63*0b57cec5SDimitry Andric 64*0b57cec5SDimitry Andriclet hasSideEffects = 1 in { 65*0b57cec5SDimitry Andric // Load control. 66*0b57cec5SDimitry Andric def LCTL : LoadMultipleRS<"lctl", 0xB7, CR64>; 67*0b57cec5SDimitry Andric def LCTLG : LoadMultipleRSY<"lctlg", 0xEB2F, CR64>; 68*0b57cec5SDimitry Andric 69*0b57cec5SDimitry Andric // Store control. 70*0b57cec5SDimitry Andric def STCTL : StoreMultipleRS<"stctl", 0xB6, CR64>; 71*0b57cec5SDimitry Andric def STCTG : StoreMultipleRSY<"stctg", 0xEB25, CR64>; 72*0b57cec5SDimitry Andric} 73*0b57cec5SDimitry Andric 74*0b57cec5SDimitry Andric// Extract primary ASN (and instance). 75*0b57cec5SDimitry Andriclet hasSideEffects = 1 in { 76*0b57cec5SDimitry Andric def EPAR : InherentRRE<"epar", 0xB226, GR32, null_frag>; 77*0b57cec5SDimitry Andric def EPAIR : InherentRRE<"epair", 0xB99A, GR64, null_frag>; 78*0b57cec5SDimitry Andric} 79*0b57cec5SDimitry Andric 80*0b57cec5SDimitry Andric// Extract secondary ASN (and instance). 81*0b57cec5SDimitry Andriclet hasSideEffects = 1 in { 82*0b57cec5SDimitry Andric def ESAR : InherentRRE<"esar", 0xB227, GR32, null_frag>; 83*0b57cec5SDimitry Andric def ESAIR : InherentRRE<"esair", 0xB99B, GR64, null_frag>; 84*0b57cec5SDimitry Andric} 85*0b57cec5SDimitry Andric 86*0b57cec5SDimitry Andric// Set secondary ASN (and instance). 87*0b57cec5SDimitry Andriclet hasSideEffects = 1 in { 88*0b57cec5SDimitry Andric def SSAR : SideEffectUnaryRRE<"ssar", 0xB225, GR32, null_frag>; 89*0b57cec5SDimitry Andric def SSAIR : SideEffectUnaryRRE<"ssair", 0xB99F, GR64, null_frag>; 90*0b57cec5SDimitry Andric} 91*0b57cec5SDimitry Andric 92*0b57cec5SDimitry Andric// Extract and set extended authority. 93*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 94*0b57cec5SDimitry Andric def ESEA : UnaryTiedRRE<"esea", 0xB99D, GR32>; 95*0b57cec5SDimitry Andric 96*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 97*0b57cec5SDimitry Andric// Prefix-Register Instructions. 98*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 99*0b57cec5SDimitry Andric 100*0b57cec5SDimitry Andric// Set prefix. 101*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 102*0b57cec5SDimitry Andric def SPX : SideEffectUnaryS<"spx", 0xB210, null_frag, 4>; 103*0b57cec5SDimitry Andric 104*0b57cec5SDimitry Andric// Store prefix. 105*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 106*0b57cec5SDimitry Andric def STPX : StoreInherentS<"stpx", 0xB211, null_frag, 4>; 107*0b57cec5SDimitry Andric 108*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 109*0b57cec5SDimitry Andric// Breaking-Event-Address-Register Instructions. 110*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 111*0b57cec5SDimitry Andric 112*0b57cec5SDimitry Andriclet Predicates = [FeatureBEAREnhancement] in { 113*0b57cec5SDimitry Andric // Load BEAR. 114*0b57cec5SDimitry Andric let hasSideEffects = 1 in 115*0b57cec5SDimitry Andric def LBEAR : SideEffectUnaryS<"lbear", 0xB200, null_frag, 8>; 116*0b57cec5SDimitry Andric 117*0b57cec5SDimitry Andric // Store BEAR. 118*0b57cec5SDimitry Andric let hasSideEffects = 1 in 119*0b57cec5SDimitry Andric def STBEAR : StoreInherentS<"stbear", 0xB201, null_frag, 8>; 120*0b57cec5SDimitry Andric} 121*0b57cec5SDimitry Andric 122*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 123*0b57cec5SDimitry Andric// Storage-Key and Real Memory Instructions. 124*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 125*0b57cec5SDimitry Andric 126*0b57cec5SDimitry Andric// Insert storage key extended. 127*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 128*0b57cec5SDimitry Andric def ISKE : BinaryRRE<"iske", 0xB229, null_frag, GR32, GR64>; 129*0b57cec5SDimitry Andric 130*0b57cec5SDimitry Andric// Insert virtual storage key. 131*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 132*0b57cec5SDimitry Andric def IVSK : BinaryRRE<"ivsk", 0xB223, null_frag, GR32, GR64>; 133*0b57cec5SDimitry Andric 134*0b57cec5SDimitry Andric// Set storage key extended. 135*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 136*0b57cec5SDimitry Andric defm SSKE : SideEffectTernaryRRFcOpt<"sske", 0xB22B, GR32, GR64>; 137*0b57cec5SDimitry Andric 138*0b57cec5SDimitry Andric// Reset reference bit extended. 139*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 140*0b57cec5SDimitry Andric def RRBE : SideEffectBinaryRRE<"rrbe", 0xB22A, GR32, GR64>; 141*0b57cec5SDimitry Andric 142*0b57cec5SDimitry Andric// Reset reference bits multiple. 143*0b57cec5SDimitry Andriclet Predicates = [FeatureResetReferenceBitsMultiple], hasSideEffects = 1 in 144*0b57cec5SDimitry Andric def RRBM : UnaryRRE<"rrbm", 0xB9AE, null_frag, GR64, GR64>; 145*0b57cec5SDimitry Andric 146*0b57cec5SDimitry Andric// Insert reference bits multiple. 147*0b57cec5SDimitry Andriclet Predicates = [FeatureInsertReferenceBitsMultiple], hasSideEffects = 1 in 148*0b57cec5SDimitry Andric def IRBM : UnaryRRE<"irbm", 0xB9AC, null_frag, GR64, GR64>; 149*0b57cec5SDimitry Andric 150*0b57cec5SDimitry Andric// Perform frame management function. 151*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 152*0b57cec5SDimitry Andric def PFMF : SideEffectBinaryMemRRE<"pfmf", 0xB9AF, GR32, GR64>; 153*0b57cec5SDimitry Andric 154*0b57cec5SDimitry Andric// Test block. 155*0b57cec5SDimitry Andriclet hasSideEffects = 1, mayStore = 1, Uses = [R0D], Defs = [R0D, CC] in 156*0b57cec5SDimitry Andric def TB : SideEffectBinaryRRE<"tb", 0xB22C, GR64, GR64>; 157*0b57cec5SDimitry Andric 158*0b57cec5SDimitry Andric// Page in / out. 159*0b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Defs = [CC] in { 160*0b57cec5SDimitry Andric def PGIN : SideEffectBinaryRRE<"pgin", 0xB22E, GR64, GR64>; 161*0b57cec5SDimitry Andric def PGOUT : SideEffectBinaryRRE<"pgout", 0xB22F, GR64, GR64>; 162*0b57cec5SDimitry Andric} 163*0b57cec5SDimitry Andric 164*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 165*0b57cec5SDimitry Andric// Dynamic-Address-Translation Instructions. 166*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 167*0b57cec5SDimitry Andric 168*0b57cec5SDimitry Andric// Invalidate page table entry. 169*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 170*0b57cec5SDimitry Andric defm IPTE : SideEffectQuaternaryRRFaOptOpt<"ipte", 0xB221, GR64, GR32, GR32>; 171*0b57cec5SDimitry Andric 172*0b57cec5SDimitry Andric// Invalidate DAT table entry. 173*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 174*0b57cec5SDimitry Andric defm IDTE : SideEffectQuaternaryRRFbOpt<"idte", 0xB98E, GR64, GR64, GR64>; 175*0b57cec5SDimitry Andric 176*0b57cec5SDimitry Andric// Reset DAT protection. 177*0b57cec5SDimitry Andriclet Predicates = [FeatureResetDATProtection], hasSideEffects = 1 in 178*0b57cec5SDimitry Andric defm RDP : SideEffectQuaternaryRRFbOpt<"rdp", 0xB98B, GR64, GR64, GR64>; 179*0b57cec5SDimitry Andric 180*0b57cec5SDimitry Andric// Compare and replace DAT table entry. 181*0b57cec5SDimitry Andriclet Predicates = [FeatureEnhancedDAT2], hasSideEffects = 1, Defs = [CC] in 182*0b57cec5SDimitry Andric defm CRDTE : SideEffectQuaternaryRRFbOpt<"crdte", 0xB98F, GR128, GR128, GR64>; 183*0b57cec5SDimitry Andric 184*0b57cec5SDimitry Andric// Purge TLB. 185*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 186*0b57cec5SDimitry Andric def PTLB : SideEffectInherentS<"ptlb", 0xB20D, null_frag>; 187*0b57cec5SDimitry Andric 188*0b57cec5SDimitry Andric// Compare and swap and purge. 189*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in { 190*0b57cec5SDimitry Andric def CSP : CmpSwapRRE<"csp", 0xB250, GR128, GR64>; 191*0b57cec5SDimitry Andric def CSPG : CmpSwapRRE<"cspg", 0xB98A, GR128, GR64>; 192*0b57cec5SDimitry Andric} 193*0b57cec5SDimitry Andric 194*0b57cec5SDimitry Andric// Load page-table-entry address. 195*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 196*0b57cec5SDimitry Andric def LPTEA : TernaryRRFb<"lptea", 0xB9AA, GR64, GR64, GR64>; 197*0b57cec5SDimitry Andric 198*0b57cec5SDimitry Andric// Load real address. 199*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in { 200*0b57cec5SDimitry Andric defm LRA : LoadAddressRXPair<"lra", 0xB1, 0xE313, null_frag>; 201*0b57cec5SDimitry Andric def LRAG : LoadAddressRXY<"lrag", 0xE303, null_frag, laaddr20pair>; 202*0b57cec5SDimitry Andric} 203*0b57cec5SDimitry Andric 204*0b57cec5SDimitry Andric// Store real address. 205*0b57cec5SDimitry Andricdef STRAG : StoreSSE<"strag", 0xE502>; 206*0b57cec5SDimitry Andric 207*0b57cec5SDimitry Andric// Load using real address. 208*0b57cec5SDimitry Andriclet mayLoad = 1 in { 209*0b57cec5SDimitry Andric def LURA : UnaryRRE<"lura", 0xB24B, null_frag, GR32, GR64>; 210*0b57cec5SDimitry Andric def LURAG : UnaryRRE<"lurag", 0xB905, null_frag, GR64, GR64>; 211*0b57cec5SDimitry Andric} 212*0b57cec5SDimitry Andric 213*0b57cec5SDimitry Andric// Store using real address. 214*0b57cec5SDimitry Andriclet mayStore = 1 in { 215*0b57cec5SDimitry Andric def STURA : SideEffectBinaryRRE<"stura", 0xB246, GR32, GR64>; 216*0b57cec5SDimitry Andric def STURG : SideEffectBinaryRRE<"sturg", 0xB925, GR64, GR64>; 217*0b57cec5SDimitry Andric} 218*0b57cec5SDimitry Andric 219*0b57cec5SDimitry Andric// Test protection. 220*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 221*0b57cec5SDimitry Andric def TPROT : SideEffectBinarySSE<"tprot", 0xE501>; 222*0b57cec5SDimitry Andric 223*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 224*0b57cec5SDimitry Andric// Memory-move Instructions. 225*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 226*0b57cec5SDimitry Andric 227*0b57cec5SDimitry Andric// Move with key. 228*0b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Defs = [CC] in 229*0b57cec5SDimitry Andric def MVCK : MemoryBinarySSd<"mvck", 0xD9, GR64>; 230*0b57cec5SDimitry Andric 231*0b57cec5SDimitry Andric// Move to primary / secondary. 232*0b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Defs = [CC] in { 233*0b57cec5SDimitry Andric def MVCP : MemoryBinarySSd<"mvcp", 0xDA, GR64>; 234*0b57cec5SDimitry Andric def MVCS : MemoryBinarySSd<"mvcs", 0xDB, GR64>; 235*0b57cec5SDimitry Andric} 236*0b57cec5SDimitry Andric 237*0b57cec5SDimitry Andric// Move with source / destination key. 238*0b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Uses = [R0L, R1L] in { 239*0b57cec5SDimitry Andric def MVCSK : SideEffectBinarySSE<"mvcsk", 0xE50E>; 240*0b57cec5SDimitry Andric def MVCDK : SideEffectBinarySSE<"mvcdk", 0xE50F>; 241*0b57cec5SDimitry Andric} 242*0b57cec5SDimitry Andric 243*0b57cec5SDimitry Andric// Move with optional specifications. 244*0b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Uses = [R0L] in 245*0b57cec5SDimitry Andric def MVCOS : SideEffectTernarySSF<"mvcos", 0xC80, GR64>; 246*0b57cec5SDimitry Andric 247*0b57cec5SDimitry Andric// Move page. 248*0b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Uses = [R0L], Defs = [CC] in 249*0b57cec5SDimitry Andric def MVPG : SideEffectBinaryRRE<"mvpg", 0xB254, GR64, GR64>; 250*0b57cec5SDimitry Andric 251*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 252*0b57cec5SDimitry Andric// Address-Space Instructions. 253*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 254*0b57cec5SDimitry Andric 255*0b57cec5SDimitry Andric// Load address space parameters. 256*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 257*0b57cec5SDimitry Andric def LASP : SideEffectBinarySSE<"lasp", 0xE500>; 258*0b57cec5SDimitry Andric 259*0b57cec5SDimitry Andric// Purge ALB. 260*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 261*0b57cec5SDimitry Andric def PALB : SideEffectInherentRRE<"palb", 0xB248>; 262*0b57cec5SDimitry Andric 263*0b57cec5SDimitry Andric// Program call. 264*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 265*0b57cec5SDimitry Andric def PC : SideEffectAddressS<"pc", 0xB218, null_frag>; 266*0b57cec5SDimitry Andric 267*0b57cec5SDimitry Andric// Program return. 268*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 269*0b57cec5SDimitry Andric def PR : SideEffectInherentE<"pr", 0x0101>; 270*0b57cec5SDimitry Andric 271*0b57cec5SDimitry Andric// Program transfer (with instance). 272*0b57cec5SDimitry Andriclet hasSideEffects = 1 in { 273*0b57cec5SDimitry Andric def PT : SideEffectBinaryRRE<"pt", 0xB228, GR32, GR64>; 274*0b57cec5SDimitry Andric def PTI : SideEffectBinaryRRE<"pti", 0xB99E, GR64, GR64>; 275*0b57cec5SDimitry Andric} 276*0b57cec5SDimitry Andric 277*0b57cec5SDimitry Andric// Resume program. 278*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 279*0b57cec5SDimitry Andric def RP : SideEffectAddressS<"rp", 0xB277, null_frag>; 280*0b57cec5SDimitry Andric 281*0b57cec5SDimitry Andric// Branch in subspace group. 282*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 283*0b57cec5SDimitry Andric def BSG : UnaryRRE<"bsg", 0xB258, null_frag, GR64, GR64>; 284*0b57cec5SDimitry Andric 285*0b57cec5SDimitry Andric// Branch and set authority. 286*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 287*0b57cec5SDimitry Andric def BSA : UnaryRRE<"bsa", 0xB25A, null_frag, GR64, GR64>; 288*0b57cec5SDimitry Andric 289*0b57cec5SDimitry Andric// Test access. 290*0b57cec5SDimitry Andriclet Defs = [CC] in 291*0b57cec5SDimitry Andric def TAR : SideEffectBinaryRRE<"tar", 0xB24C, AR32, GR32>; 292*0b57cec5SDimitry Andric 293*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 294*0b57cec5SDimitry Andric// Linkage-Stack Instructions. 295*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 296*0b57cec5SDimitry Andric 297*0b57cec5SDimitry Andric// Branch and stack. 298*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 299*0b57cec5SDimitry Andric def BAKR : SideEffectBinaryRRE<"bakr", 0xB240, GR64, GR64>; 300*0b57cec5SDimitry Andric 301*0b57cec5SDimitry Andric// Extract stacked registers. 302*0b57cec5SDimitry Andriclet hasSideEffects = 1 in { 303*0b57cec5SDimitry Andric def EREG : SideEffectBinaryRRE<"ereg", 0xB249, GR32, GR32>; 304*0b57cec5SDimitry Andric def EREGG : SideEffectBinaryRRE<"eregg", 0xB90E, GR64, GR64>; 305*0b57cec5SDimitry Andric} 306*0b57cec5SDimitry Andric 307*0b57cec5SDimitry Andric// Extract stacked state. 308*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 309*0b57cec5SDimitry Andric def ESTA : UnaryRRE<"esta", 0xB24A, null_frag, GR128, GR32>; 310*0b57cec5SDimitry Andric 311*0b57cec5SDimitry Andric// Modify stacked state. 312*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 313*0b57cec5SDimitry Andric def MSTA : SideEffectUnaryRRE<"msta", 0xB247, GR128, null_frag>; 314*0b57cec5SDimitry Andric 315*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 316*0b57cec5SDimitry Andric// Time-Related Instructions. 317*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 318*0b57cec5SDimitry Andric 319*0b57cec5SDimitry Andric// Perform timing facility function. 320*0b57cec5SDimitry Andriclet hasSideEffects = 1, mayLoad = 1, Uses = [R0L, R1D], Defs = [CC] in 321*0b57cec5SDimitry Andric def PTFF : SideEffectInherentE<"ptff", 0x0104>; 322*0b57cec5SDimitry Andric 323*0b57cec5SDimitry Andric// Set clock. 324*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 325*0b57cec5SDimitry Andric def SCK : SideEffectUnaryS<"sck", 0xB204, null_frag, 8>; 326*0b57cec5SDimitry Andric 327*0b57cec5SDimitry Andric// Set clock programmable field. 328*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R0L] in 329*0b57cec5SDimitry Andric def SCKPF : SideEffectInherentE<"sckpf", 0x0107>; 330*0b57cec5SDimitry Andric 331*0b57cec5SDimitry Andric// Set clock comparator. 332*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 333*0b57cec5SDimitry Andric def SCKC : SideEffectUnaryS<"sckc", 0xB206, null_frag, 8>; 334*0b57cec5SDimitry Andric 335*0b57cec5SDimitry Andric// Set CPU timer. 336*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 337*0b57cec5SDimitry Andric def SPT : SideEffectUnaryS<"spt", 0xB208, null_frag, 8>; 338*0b57cec5SDimitry Andric 339*0b57cec5SDimitry Andric// Store clock (fast / extended). 340*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in { 341*0b57cec5SDimitry Andric def STCK : StoreInherentS<"stck", 0xB205, null_frag, 8>; 342*0b57cec5SDimitry Andric def STCKF : StoreInherentS<"stckf", 0xB27C, null_frag, 8>; 343*0b57cec5SDimitry Andric def STCKE : StoreInherentS<"stcke", 0xB278, null_frag, 16>; 344*0b57cec5SDimitry Andric} 345*0b57cec5SDimitry Andric 346*0b57cec5SDimitry Andric// Store clock comparator. 347*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 348*0b57cec5SDimitry Andric def STCKC : StoreInherentS<"stckc", 0xB207, null_frag, 8>; 349*0b57cec5SDimitry Andric 350*0b57cec5SDimitry Andric// Store CPU timer. 351*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 352*0b57cec5SDimitry Andric def STPT : StoreInherentS<"stpt", 0xB209, null_frag, 8>; 353*0b57cec5SDimitry Andric 354*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 355*0b57cec5SDimitry Andric// CPU-Related Instructions. 356*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 357*0b57cec5SDimitry Andric 358*0b57cec5SDimitry Andric// Store CPU address. 359*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 360*0b57cec5SDimitry Andric def STAP : StoreInherentS<"stap", 0xB212, null_frag, 2>; 361*0b57cec5SDimitry Andric 362*0b57cec5SDimitry Andric// Store CPU ID. 363*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 364*0b57cec5SDimitry Andric def STIDP : StoreInherentS<"stidp", 0xB202, null_frag, 8>; 365*0b57cec5SDimitry Andric 366*0b57cec5SDimitry Andric// Store system information. 367*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R0L, R1L], Defs = [R0L, CC] in 368*0b57cec5SDimitry Andric def STSI : StoreInherentS<"stsi", 0xB27D, null_frag, 0>; 369*0b57cec5SDimitry Andric 370*0b57cec5SDimitry Andric// Store facility list. 371*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 372*0b57cec5SDimitry Andric def STFL : StoreInherentS<"stfl", 0xB2B1, null_frag, 4>; 373*0b57cec5SDimitry Andric 374*0b57cec5SDimitry Andric// Store facility list extended. 375*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R0D], Defs = [R0D, CC] in 376*0b57cec5SDimitry Andric def STFLE : StoreInherentS<"stfle", 0xB2B0, null_frag, 0>; 377*0b57cec5SDimitry Andric 378*0b57cec5SDimitry Andric// Extract CPU attribute. 379*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 380*0b57cec5SDimitry Andric def ECAG : BinaryRSY<"ecag", 0xEB4C, null_frag, GR64>; 381*0b57cec5SDimitry Andric 382*0b57cec5SDimitry Andric// Extract CPU time. 383*0b57cec5SDimitry Andriclet hasSideEffects = 1, mayLoad = 1, Defs = [R0D, R1D] in 384*0b57cec5SDimitry Andric def ECTG : SideEffectTernarySSF<"ectg", 0xC81, GR64>; 385*0b57cec5SDimitry Andric 386*0b57cec5SDimitry Andric// Perform topology function. 387*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 388*0b57cec5SDimitry Andric def PTF : UnaryTiedRRE<"ptf", 0xB9A2, GR64>; 389*0b57cec5SDimitry Andric 390*0b57cec5SDimitry Andric// Perform cryptographic key management operation. 391*0b57cec5SDimitry Andriclet Predicates = [FeatureMessageSecurityAssist3], 392*0b57cec5SDimitry Andric hasSideEffects = 1, Uses = [R0L, R1D] in 393*0b57cec5SDimitry Andric def PCKMO : SideEffectInherentRRE<"pckmo", 0xB928>; 394*0b57cec5SDimitry Andric 395*0b57cec5SDimitry Andric// Query processor activity counter information. 396*0b57cec5SDimitry Andriclet Predicates = [FeatureProcessorActivityInstrumentation], 397*0b57cec5SDimitry Andric hasSideEffects = 1, Uses = [R0D], Defs = [R0D, CC] in 398*0b57cec5SDimitry Andric def QPACI : StoreInherentS<"qpaci", 0xB28F, null_frag, 0>; 399*0b57cec5SDimitry Andric 400*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 401*0b57cec5SDimitry Andric// Miscellaneous Instructions. 402*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 403*0b57cec5SDimitry Andric 404*0b57cec5SDimitry Andric// Supervisor call. 405*0b57cec5SDimitry Andriclet hasSideEffects = 1, isCall = 1, Defs = [CC] in 406*0b57cec5SDimitry Andric def SVC : SideEffectUnaryI<"svc", 0x0A, imm32zx8>; 407*0b57cec5SDimitry Andric 408*0b57cec5SDimitry Andric// Monitor call. 409*0b57cec5SDimitry Andriclet hasSideEffects = 1, isCall = 1 in 410*0b57cec5SDimitry Andric def MC : SideEffectBinarySI<"mc", 0xAF, imm32zx8>; 411*0b57cec5SDimitry Andric 412*0b57cec5SDimitry Andric// Diagnose. 413*0b57cec5SDimitry Andriclet hasSideEffects = 1, isCall = 1 in 414*0b57cec5SDimitry Andric def DIAG : SideEffectTernaryRS<"diag", 0x83, GR32, GR32>; 415*0b57cec5SDimitry Andric 416*0b57cec5SDimitry Andric// Trace. 417*0b57cec5SDimitry Andriclet hasSideEffects = 1, mayLoad = 1 in { 418*0b57cec5SDimitry Andric def TRACE : SideEffectTernaryRS<"trace", 0x99, GR32, GR32>; 419*0b57cec5SDimitry Andric def TRACG : SideEffectTernaryRSY<"tracg", 0xEB0F, GR64, GR64>; 420*0b57cec5SDimitry Andric} 421*0b57cec5SDimitry Andric 422*0b57cec5SDimitry Andric// Trap. 423*0b57cec5SDimitry Andriclet hasSideEffects = 1 in { 424*0b57cec5SDimitry Andric def TRAP2 : SideEffectInherentE<"trap2", 0x01FF>; 425*0b57cec5SDimitry Andric def TRAP4 : SideEffectAddressS<"trap4", 0xB2FF, null_frag>; 426*0b57cec5SDimitry Andric} 427*0b57cec5SDimitry Andric 428*0b57cec5SDimitry Andric// Signal processor. 429*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 430*0b57cec5SDimitry Andric def SIGP : SideEffectTernaryRS<"sigp", 0xAE, GR64, GR64>; 431*0b57cec5SDimitry Andric 432*0b57cec5SDimitry Andric// Signal adapter. 433*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R0D, R1D, R2D, R3D], Defs = [CC] in 434*0b57cec5SDimitry Andric def SIGA : SideEffectAddressS<"siga", 0xB274, null_frag>; 435*0b57cec5SDimitry Andric 436*0b57cec5SDimitry Andric// Start interpretive execution. 437*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 438*0b57cec5SDimitry Andric def SIE : SideEffectUnaryS<"sie", 0xB214, null_frag, 0>; 439*0b57cec5SDimitry Andric 440*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 441*0b57cec5SDimitry Andric// CPU-Measurement Facility Instructions (SA23-2260). 442*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 443*0b57cec5SDimitry Andric 444*0b57cec5SDimitry Andric// Load program parameter 445*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 446*0b57cec5SDimitry Andric def LPP : SideEffectUnaryS<"lpp", 0xB280, null_frag, 8>; 447*0b57cec5SDimitry Andric 448*0b57cec5SDimitry Andric// Extract coprocessor-group address. 449*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 450*0b57cec5SDimitry Andric def ECPGA : UnaryRRE<"ecpga", 0xB2ED, null_frag, GR32, GR64>; 451*0b57cec5SDimitry Andric 452*0b57cec5SDimitry Andric// Extract CPU counter. 453*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 454*0b57cec5SDimitry Andric def ECCTR : UnaryRRE<"ecctr", 0xB2E4, null_frag, GR64, GR64>; 455*0b57cec5SDimitry Andric 456*0b57cec5SDimitry Andric// Extract peripheral counter. 457*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 458*0b57cec5SDimitry Andric def EPCTR : UnaryRRE<"epctr", 0xB2E5, null_frag, GR64, GR64>; 459*0b57cec5SDimitry Andric 460*0b57cec5SDimitry Andric// Load CPU-counter-set controls. 461*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 462*0b57cec5SDimitry Andric def LCCTL : SideEffectUnaryS<"lcctl", 0xB284, null_frag, 8>; 463*0b57cec5SDimitry Andric 464*0b57cec5SDimitry Andric// Load peripheral-counter-set controls. 465*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 466*0b57cec5SDimitry Andric def LPCTL : SideEffectUnaryS<"lpctl", 0xB285, null_frag, 8>; 467*0b57cec5SDimitry Andric 468*0b57cec5SDimitry Andric// Load sampling controls. 469*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 470*0b57cec5SDimitry Andric def LSCTL : SideEffectUnaryS<"lsctl", 0xB287, null_frag, 0>; 471*0b57cec5SDimitry Andric 472*0b57cec5SDimitry Andric// Query sampling information. 473*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 474*0b57cec5SDimitry Andric def QSI : StoreInherentS<"qsi", 0xB286, null_frag, 0>; 475*0b57cec5SDimitry Andric 476*0b57cec5SDimitry Andric// Query counter information. 477*0b57cec5SDimitry Andriclet hasSideEffects = 1 in 478*0b57cec5SDimitry Andric def QCTRI : StoreInherentS<"qctri", 0xB28E, null_frag, 0>; 479*0b57cec5SDimitry Andric 480*0b57cec5SDimitry Andric// Set CPU counter. 481*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 482*0b57cec5SDimitry Andric def SCCTR : SideEffectBinaryRRE<"scctr", 0xB2E0, GR64, GR64>; 483*0b57cec5SDimitry Andric 484*0b57cec5SDimitry Andric// Set peripheral counter. 485*0b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in 486*0b57cec5SDimitry Andric def SPCTR : SideEffectBinaryRRE<"spctr", 0xB2E1, GR64, GR64>; 487*0b57cec5SDimitry Andric 488*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 489*0b57cec5SDimitry Andric// I/O Instructions (Principles of Operation, Chapter 14). 490*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 491*0b57cec5SDimitry Andric 492*0b57cec5SDimitry Andric// Clear subchannel. 493*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in 494*0b57cec5SDimitry Andric def CSCH : SideEffectInherentS<"csch", 0xB230, null_frag>; 495*0b57cec5SDimitry Andric 496*0b57cec5SDimitry Andric// Halt subchannel. 497*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in 498*0b57cec5SDimitry Andric def HSCH : SideEffectInherentS<"hsch", 0xB231, null_frag>; 499*0b57cec5SDimitry Andric 500*0b57cec5SDimitry Andric// Modify subchannel. 501*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in 502*0b57cec5SDimitry Andric def MSCH : SideEffectUnaryS<"msch", 0xB232, null_frag, 0>; 503*0b57cec5SDimitry Andric 504*0b57cec5SDimitry Andric// Resume subchannel. 505*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in 506*0b57cec5SDimitry Andric def RSCH : SideEffectInherentS<"rsch", 0xB238, null_frag>; 507*0b57cec5SDimitry Andric 508*0b57cec5SDimitry Andric// Start subchannel. 509*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in 510*0b57cec5SDimitry Andric def SSCH : SideEffectUnaryS<"ssch", 0xB233, null_frag, 0>; 511*0b57cec5SDimitry Andric 512*0b57cec5SDimitry Andric// Store subchannel. 513*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in 514*0b57cec5SDimitry Andric def STSCH : StoreInherentS<"stsch", 0xB234, null_frag, 0>; 515*0b57cec5SDimitry Andric 516*0b57cec5SDimitry Andric// Test subchannel. 517*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in 518*0b57cec5SDimitry Andric def TSCH : StoreInherentS<"tsch", 0xB235, null_frag, 0>; 519*0b57cec5SDimitry Andric 520*0b57cec5SDimitry Andric// Cancel subchannel. 521*0b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in 522*0b57cec5SDimitry Andric def XSCH : SideEffectInherentS<"xsch", 0xB276, null_frag>; 523 524// Reset channel path. 525let hasSideEffects = 1, Uses = [R1L], Defs = [CC] in 526 def RCHP : SideEffectInherentS<"rchp", 0xB23B, null_frag>; 527 528// Set channel monitor. 529let hasSideEffects = 1, mayLoad = 1, Uses = [R1L, R2D] in 530 def SCHM : SideEffectInherentS<"schm", 0xB23C, null_frag>; 531 532// Store channel path status. 533let hasSideEffects = 1 in 534 def STCPS : StoreInherentS<"stcps", 0xB23A, null_frag, 0>; 535 536// Store channel report word. 537let hasSideEffects = 1, Defs = [CC] in 538 def STCRW : StoreInherentS<"stcrw", 0xB239, null_frag, 0>; 539 540// Test pending interruption. 541let hasSideEffects = 1, Defs = [CC] in 542 def TPI : StoreInherentS<"tpi", 0xB236, null_frag, 0>; 543 544// Set address limit. 545let hasSideEffects = 1, Uses = [R1L] in 546 def SAL : SideEffectInherentS<"sal", 0xB237, null_frag>; 547 548