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