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