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