xref: /freebsd/contrib/llvm-project/llvm/lib/Target/SystemZ/SystemZInstrSystem.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric//==- SystemZInstrSystem.td - SystemZ system instructions -*- tblgen-*-----==//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric//
90b57cec5SDimitry Andric// The instructions in this file implement SystemZ system-level instructions.
100b57cec5SDimitry Andric// Most of these instructions are privileged or semi-privileged.  They are
110b57cec5SDimitry Andric// not used for code generation, but are provided for use with the assembler
120b57cec5SDimitry Andric// and disassembler only.
130b57cec5SDimitry Andric//
140b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
150b57cec5SDimitry Andric
160b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
170b57cec5SDimitry Andric// Program-Status Word Instructions.
180b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
190b57cec5SDimitry Andric
200b57cec5SDimitry Andric// Extract PSW.
210b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [CC] in
220b57cec5SDimitry Andric  def EPSW : InherentDualRRE<"epsw", 0xB98D, GR32>;
230b57cec5SDimitry Andric
240b57cec5SDimitry Andric// Load PSW (extended).
250b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in {
260b57cec5SDimitry Andric  def LPSW : SideEffectUnaryS<"lpsw", 0x8200, null_frag, 8>;
270b57cec5SDimitry Andric  def LPSWE : SideEffectUnaryS<"lpswe", 0xB2B2, null_frag, 16>;
280b57cec5SDimitry Andric}
29fe6060f1SDimitry Andriclet Predicates = [FeatureBEAREnhancement], hasSideEffects = 1, Defs = [CC] in
30fe6060f1SDimitry Andric  def LPSWEY : SideEffectUnarySIY<"lpswey", 0xEB71, 16>;
310b57cec5SDimitry Andric
320b57cec5SDimitry Andric// Insert PSW key.
330b57cec5SDimitry Andriclet Uses = [R2L], Defs = [R2L] in
340b57cec5SDimitry Andric  def IPK : SideEffectInherentS<"ipk", 0xB20B, null_frag>;
350b57cec5SDimitry Andric
360b57cec5SDimitry Andric// Set PSW key from address.
370b57cec5SDimitry Andriclet hasSideEffects = 1 in
380b57cec5SDimitry Andric  def SPKA : SideEffectAddressS<"spka", 0xB20A, null_frag>;
390b57cec5SDimitry Andric
400b57cec5SDimitry Andric// Set system mask.
410b57cec5SDimitry Andriclet hasSideEffects = 1 in
420b57cec5SDimitry Andric  def SSM : SideEffectUnaryS<"ssm", 0x8000, null_frag, 1>;
430b57cec5SDimitry Andric
440b57cec5SDimitry Andric// Store then AND/OR system mask.
450b57cec5SDimitry Andriclet hasSideEffects = 1 in {
460b57cec5SDimitry Andric  def STNSM : StoreSI<"stnsm", 0xAC, null_frag, imm32zx8>;
470b57cec5SDimitry Andric  def STOSM : StoreSI<"stosm", 0xAD, null_frag, imm32zx8>;
480b57cec5SDimitry Andric}
490b57cec5SDimitry Andric
500b57cec5SDimitry Andric// Insert address space control.
510b57cec5SDimitry Andriclet hasSideEffects = 1 in
520b57cec5SDimitry Andric  def IAC : InherentRRE<"iac", 0xB224, GR32, null_frag>;
530b57cec5SDimitry Andric
540b57cec5SDimitry Andric// Set address space control (fast).
550b57cec5SDimitry Andriclet hasSideEffects = 1 in {
560b57cec5SDimitry Andric  def SAC : SideEffectAddressS<"sac", 0xB219, null_frag>;
570b57cec5SDimitry Andric  def SACF : SideEffectAddressS<"sacf", 0xB279, null_frag>;
580b57cec5SDimitry Andric}
590b57cec5SDimitry Andric
600b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
610b57cec5SDimitry Andric// Control Register Instructions.
620b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
630b57cec5SDimitry Andric
640b57cec5SDimitry Andriclet hasSideEffects = 1 in {
650b57cec5SDimitry Andric  // Load control.
660b57cec5SDimitry Andric  def LCTL : LoadMultipleRS<"lctl", 0xB7, CR64>;
670b57cec5SDimitry Andric  def LCTLG : LoadMultipleRSY<"lctlg", 0xEB2F, CR64>;
680b57cec5SDimitry Andric
690b57cec5SDimitry Andric  // Store control.
700b57cec5SDimitry Andric  def STCTL : StoreMultipleRS<"stctl", 0xB6, CR64>;
710b57cec5SDimitry Andric  def STCTG : StoreMultipleRSY<"stctg", 0xEB25, CR64>;
720b57cec5SDimitry Andric}
730b57cec5SDimitry Andric
740b57cec5SDimitry Andric// Extract primary ASN (and instance).
750b57cec5SDimitry Andriclet hasSideEffects = 1 in {
760b57cec5SDimitry Andric  def EPAR : InherentRRE<"epar", 0xB226, GR32, null_frag>;
770b57cec5SDimitry Andric  def EPAIR : InherentRRE<"epair", 0xB99A, GR64, null_frag>;
780b57cec5SDimitry Andric}
790b57cec5SDimitry Andric
800b57cec5SDimitry Andric// Extract secondary ASN (and instance).
810b57cec5SDimitry Andriclet hasSideEffects = 1 in {
820b57cec5SDimitry Andric  def ESAR : InherentRRE<"esar", 0xB227, GR32, null_frag>;
830b57cec5SDimitry Andric  def ESAIR : InherentRRE<"esair", 0xB99B, GR64, null_frag>;
840b57cec5SDimitry Andric}
850b57cec5SDimitry Andric
860b57cec5SDimitry Andric// Set secondary ASN (and instance).
870b57cec5SDimitry Andriclet hasSideEffects = 1 in {
880b57cec5SDimitry Andric  def SSAR : SideEffectUnaryRRE<"ssar", 0xB225, GR32, null_frag>;
890b57cec5SDimitry Andric  def SSAIR : SideEffectUnaryRRE<"ssair", 0xB99F, GR64, null_frag>;
900b57cec5SDimitry Andric}
910b57cec5SDimitry Andric
920b57cec5SDimitry Andric// Extract and set extended authority.
930b57cec5SDimitry Andriclet hasSideEffects = 1 in
940b57cec5SDimitry Andric  def ESEA : UnaryTiedRRE<"esea", 0xB99D, GR32>;
950b57cec5SDimitry Andric
960b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
970b57cec5SDimitry Andric// Prefix-Register Instructions.
980b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
990b57cec5SDimitry Andric
1000b57cec5SDimitry Andric// Set prefix.
1010b57cec5SDimitry Andriclet hasSideEffects = 1 in
1020b57cec5SDimitry Andric  def SPX : SideEffectUnaryS<"spx", 0xB210, null_frag, 4>;
1030b57cec5SDimitry Andric
1040b57cec5SDimitry Andric// Store prefix.
1050b57cec5SDimitry Andriclet hasSideEffects = 1 in
1060b57cec5SDimitry Andric  def STPX : StoreInherentS<"stpx", 0xB211, null_frag, 4>;
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
109fe6060f1SDimitry Andric// Breaking-Event-Address-Register Instructions.
110fe6060f1SDimitry Andric//===----------------------------------------------------------------------===//
111fe6060f1SDimitry Andric
112fe6060f1SDimitry Andriclet Predicates = [FeatureBEAREnhancement] in {
113fe6060f1SDimitry Andric  // Load BEAR.
114fe6060f1SDimitry Andric  let hasSideEffects = 1 in
115fe6060f1SDimitry Andric    def LBEAR : SideEffectUnaryS<"lbear", 0xB200, null_frag, 8>;
116fe6060f1SDimitry Andric
117fe6060f1SDimitry Andric  // Store BEAR.
118fe6060f1SDimitry Andric  let hasSideEffects = 1 in
119fe6060f1SDimitry Andric    def STBEAR : StoreInherentS<"stbear", 0xB201, null_frag, 8>;
120fe6060f1SDimitry Andric}
121fe6060f1SDimitry Andric
122fe6060f1SDimitry Andric//===----------------------------------------------------------------------===//
1230b57cec5SDimitry Andric// Storage-Key and Real Memory Instructions.
1240b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1250b57cec5SDimitry Andric
1260b57cec5SDimitry Andric// Insert storage key extended.
1270b57cec5SDimitry Andriclet hasSideEffects = 1 in
1280b57cec5SDimitry Andric  def ISKE : BinaryRRE<"iske", 0xB229, null_frag, GR32, GR64>;
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andric// Insert virtual storage key.
1310b57cec5SDimitry Andriclet hasSideEffects = 1 in
1320b57cec5SDimitry Andric  def IVSK : BinaryRRE<"ivsk", 0xB223, null_frag, GR32, GR64>;
1330b57cec5SDimitry Andric
1340b57cec5SDimitry Andric// Set storage key extended.
1350b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
1360b57cec5SDimitry Andric  defm SSKE : SideEffectTernaryRRFcOpt<"sske", 0xB22B, GR32, GR64>;
1370b57cec5SDimitry Andric
1380b57cec5SDimitry Andric// Reset reference bit extended.
1390b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
1400b57cec5SDimitry Andric  def RRBE : SideEffectBinaryRRE<"rrbe", 0xB22A, GR32, GR64>;
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric// Reset reference bits multiple.
1430b57cec5SDimitry Andriclet Predicates = [FeatureResetReferenceBitsMultiple], hasSideEffects = 1 in
1440b57cec5SDimitry Andric  def RRBM : UnaryRRE<"rrbm", 0xB9AE, null_frag, GR64, GR64>;
1450b57cec5SDimitry Andric
1460b57cec5SDimitry Andric// Insert reference bits multiple.
1470b57cec5SDimitry Andriclet Predicates = [FeatureInsertReferenceBitsMultiple], hasSideEffects = 1 in
1480b57cec5SDimitry Andric  def IRBM : UnaryRRE<"irbm", 0xB9AC, null_frag, GR64, GR64>;
1490b57cec5SDimitry Andric
1500b57cec5SDimitry Andric// Perform frame management function.
1510b57cec5SDimitry Andriclet hasSideEffects = 1 in
1520b57cec5SDimitry Andric  def PFMF : SideEffectBinaryMemRRE<"pfmf", 0xB9AF, GR32, GR64>;
1530b57cec5SDimitry Andric
1540b57cec5SDimitry Andric// Test block.
1550b57cec5SDimitry Andriclet hasSideEffects = 1, mayStore = 1, Uses = [R0D], Defs = [R0D, CC] in
1560b57cec5SDimitry Andric  def TB : SideEffectBinaryRRE<"tb", 0xB22C, GR64, GR64>;
1570b57cec5SDimitry Andric
1580b57cec5SDimitry Andric// Page in / out.
1590b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Defs = [CC] in {
1600b57cec5SDimitry Andric  def PGIN : SideEffectBinaryRRE<"pgin", 0xB22E, GR64, GR64>;
1610b57cec5SDimitry Andric  def PGOUT : SideEffectBinaryRRE<"pgout", 0xB22F, GR64, GR64>;
1620b57cec5SDimitry Andric}
1630b57cec5SDimitry Andric
1640b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1650b57cec5SDimitry Andric// Dynamic-Address-Translation Instructions.
1660b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1670b57cec5SDimitry Andric
1680b57cec5SDimitry Andric// Invalidate page table entry.
1690b57cec5SDimitry Andriclet hasSideEffects = 1 in
1700b57cec5SDimitry Andric  defm IPTE : SideEffectQuaternaryRRFaOptOpt<"ipte", 0xB221, GR64, GR32, GR32>;
1710b57cec5SDimitry Andric
1720b57cec5SDimitry Andric// Invalidate DAT table entry.
1730b57cec5SDimitry Andriclet hasSideEffects = 1 in
1740b57cec5SDimitry Andric  defm IDTE : SideEffectQuaternaryRRFbOpt<"idte", 0xB98E, GR64, GR64, GR64>;
1750b57cec5SDimitry Andric
176fe6060f1SDimitry Andric// Reset DAT protection.
177fe6060f1SDimitry Andriclet Predicates = [FeatureResetDATProtection], hasSideEffects = 1 in
178fe6060f1SDimitry Andric  defm RDP : SideEffectQuaternaryRRFbOpt<"rdp", 0xB98B, GR64, GR64, GR64>;
179fe6060f1SDimitry Andric
1800b57cec5SDimitry Andric// Compare and replace DAT table entry.
1810b57cec5SDimitry Andriclet Predicates = [FeatureEnhancedDAT2], hasSideEffects = 1, Defs = [CC] in
1820b57cec5SDimitry Andric  defm CRDTE : SideEffectQuaternaryRRFbOpt<"crdte", 0xB98F, GR128, GR128, GR64>;
1830b57cec5SDimitry Andric
1840b57cec5SDimitry Andric// Purge TLB.
1850b57cec5SDimitry Andriclet hasSideEffects = 1 in
1860b57cec5SDimitry Andric  def PTLB : SideEffectInherentS<"ptlb", 0xB20D, null_frag>;
1870b57cec5SDimitry Andric
1880b57cec5SDimitry Andric// Compare and swap and purge.
1890b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in {
1900b57cec5SDimitry Andric  def CSP : CmpSwapRRE<"csp", 0xB250, GR128, GR64>;
1910b57cec5SDimitry Andric  def CSPG : CmpSwapRRE<"cspg", 0xB98A, GR128, GR64>;
1920b57cec5SDimitry Andric}
1930b57cec5SDimitry Andric
1940b57cec5SDimitry Andric// Load page-table-entry address.
1950b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
1960b57cec5SDimitry Andric  def LPTEA : TernaryRRFb<"lptea", 0xB9AA, GR64, GR64, GR64>;
1970b57cec5SDimitry Andric
1980b57cec5SDimitry Andric// Load real address.
1990b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in {
2000b57cec5SDimitry Andric  defm LRA : LoadAddressRXPair<"lra", 0xB1, 0xE313, null_frag>;
2010b57cec5SDimitry Andric  def LRAG : LoadAddressRXY<"lrag", 0xE303, null_frag, laaddr20pair>;
2020b57cec5SDimitry Andric}
2030b57cec5SDimitry Andric
2040b57cec5SDimitry Andric// Store real address.
2050b57cec5SDimitry Andricdef STRAG : StoreSSE<"strag", 0xE502>;
2060b57cec5SDimitry Andric
2070b57cec5SDimitry Andric// Load using real address.
2080b57cec5SDimitry Andriclet mayLoad = 1 in {
2090b57cec5SDimitry Andric def LURA : UnaryRRE<"lura", 0xB24B, null_frag, GR32, GR64>;
2100b57cec5SDimitry Andric def LURAG : UnaryRRE<"lurag", 0xB905, null_frag, GR64, GR64>;
2110b57cec5SDimitry Andric}
2120b57cec5SDimitry Andric
2130b57cec5SDimitry Andric// Store using real address.
2140b57cec5SDimitry Andriclet mayStore = 1 in {
2150b57cec5SDimitry Andric def STURA : SideEffectBinaryRRE<"stura", 0xB246, GR32, GR64>;
2160b57cec5SDimitry Andric def STURG : SideEffectBinaryRRE<"sturg", 0xB925, GR64, GR64>;
2170b57cec5SDimitry Andric}
2180b57cec5SDimitry Andric
2190b57cec5SDimitry Andric// Test protection.
2200b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
2210b57cec5SDimitry Andric  def TPROT : SideEffectBinarySSE<"tprot", 0xE501>;
2220b57cec5SDimitry Andric
2230b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2240b57cec5SDimitry Andric// Memory-move Instructions.
2250b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andric// Move with key.
2280b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Defs = [CC] in
2290b57cec5SDimitry Andric  def MVCK : MemoryBinarySSd<"mvck", 0xD9, GR64>;
2300b57cec5SDimitry Andric
2310b57cec5SDimitry Andric// Move to primary / secondary.
2320b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Defs = [CC] in {
2330b57cec5SDimitry Andric  def MVCP : MemoryBinarySSd<"mvcp", 0xDA, GR64>;
2340b57cec5SDimitry Andric  def MVCS : MemoryBinarySSd<"mvcs", 0xDB, GR64>;
2350b57cec5SDimitry Andric}
2360b57cec5SDimitry Andric
2370b57cec5SDimitry Andric// Move with source / destination key.
2380b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Uses = [R0L, R1L] in {
2390b57cec5SDimitry Andric  def MVCSK : SideEffectBinarySSE<"mvcsk", 0xE50E>;
2400b57cec5SDimitry Andric  def MVCDK : SideEffectBinarySSE<"mvcdk", 0xE50F>;
2410b57cec5SDimitry Andric}
2420b57cec5SDimitry Andric
2430b57cec5SDimitry Andric// Move with optional specifications.
2440b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Uses = [R0L] in
2450b57cec5SDimitry Andric  def MVCOS : SideEffectTernarySSF<"mvcos", 0xC80, GR64>;
2460b57cec5SDimitry Andric
2470b57cec5SDimitry Andric// Move page.
2480b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 1, Uses = [R0L], Defs = [CC] in
2490b57cec5SDimitry Andric  def MVPG : SideEffectBinaryRRE<"mvpg", 0xB254, GR64, GR64>;
2500b57cec5SDimitry Andric
2510b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2520b57cec5SDimitry Andric// Address-Space Instructions.
2530b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2540b57cec5SDimitry Andric
2550b57cec5SDimitry Andric// Load address space parameters.
2560b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
2570b57cec5SDimitry Andric  def LASP : SideEffectBinarySSE<"lasp", 0xE500>;
2580b57cec5SDimitry Andric
2590b57cec5SDimitry Andric// Purge ALB.
2600b57cec5SDimitry Andriclet hasSideEffects = 1 in
2610b57cec5SDimitry Andric  def PALB : SideEffectInherentRRE<"palb", 0xB248>;
2620b57cec5SDimitry Andric
2630b57cec5SDimitry Andric// Program call.
2640b57cec5SDimitry Andriclet hasSideEffects = 1 in
2650b57cec5SDimitry Andric  def PC : SideEffectAddressS<"pc", 0xB218, null_frag>;
2660b57cec5SDimitry Andric
2670b57cec5SDimitry Andric// Program return.
2680b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
2690b57cec5SDimitry Andric  def PR : SideEffectInherentE<"pr", 0x0101>;
2700b57cec5SDimitry Andric
2710b57cec5SDimitry Andric// Program transfer (with instance).
2720b57cec5SDimitry Andriclet hasSideEffects = 1 in {
2730b57cec5SDimitry Andric  def PT : SideEffectBinaryRRE<"pt", 0xB228, GR32, GR64>;
2740b57cec5SDimitry Andric  def PTI : SideEffectBinaryRRE<"pti", 0xB99E, GR64, GR64>;
2750b57cec5SDimitry Andric}
2760b57cec5SDimitry Andric
2770b57cec5SDimitry Andric// Resume program.
2780b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
2790b57cec5SDimitry Andric  def RP : SideEffectAddressS<"rp", 0xB277, null_frag>;
2800b57cec5SDimitry Andric
2810b57cec5SDimitry Andric// Branch in subspace group.
2820b57cec5SDimitry Andriclet hasSideEffects = 1 in
2830b57cec5SDimitry Andric  def BSG : UnaryRRE<"bsg", 0xB258, null_frag, GR64, GR64>;
2840b57cec5SDimitry Andric
2850b57cec5SDimitry Andric// Branch and set authority.
2860b57cec5SDimitry Andriclet hasSideEffects = 1 in
2870b57cec5SDimitry Andric  def BSA : UnaryRRE<"bsa", 0xB25A, null_frag, GR64, GR64>;
2880b57cec5SDimitry Andric
2890b57cec5SDimitry Andric// Test access.
2900b57cec5SDimitry Andriclet Defs = [CC] in
2910b57cec5SDimitry Andric  def TAR : SideEffectBinaryRRE<"tar", 0xB24C, AR32, GR32>;
2920b57cec5SDimitry Andric
2930b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2940b57cec5SDimitry Andric// Linkage-Stack Instructions.
2950b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2960b57cec5SDimitry Andric
2970b57cec5SDimitry Andric// Branch and stack.
2980b57cec5SDimitry Andriclet hasSideEffects = 1 in
2990b57cec5SDimitry Andric  def BAKR : SideEffectBinaryRRE<"bakr", 0xB240, GR64, GR64>;
3000b57cec5SDimitry Andric
3010b57cec5SDimitry Andric// Extract stacked registers.
3020b57cec5SDimitry Andriclet hasSideEffects = 1 in {
3030b57cec5SDimitry Andric  def EREG : SideEffectBinaryRRE<"ereg", 0xB249, GR32, GR32>;
3040b57cec5SDimitry Andric  def EREGG : SideEffectBinaryRRE<"eregg", 0xB90E, GR64, GR64>;
3050b57cec5SDimitry Andric}
3060b57cec5SDimitry Andric
3070b57cec5SDimitry Andric// Extract stacked state.
3080b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
3090b57cec5SDimitry Andric  def ESTA : UnaryRRE<"esta", 0xB24A, null_frag, GR128, GR32>;
3100b57cec5SDimitry Andric
3110b57cec5SDimitry Andric// Modify stacked state.
3120b57cec5SDimitry Andriclet hasSideEffects = 1 in
3130b57cec5SDimitry Andric  def MSTA : SideEffectUnaryRRE<"msta", 0xB247, GR128, null_frag>;
3140b57cec5SDimitry Andric
3150b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
3160b57cec5SDimitry Andric// Time-Related Instructions.
3170b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
3180b57cec5SDimitry Andric
3190b57cec5SDimitry Andric// Perform timing facility function.
3200b57cec5SDimitry Andriclet hasSideEffects = 1, mayLoad = 1, Uses = [R0L, R1D], Defs = [CC] in
3210b57cec5SDimitry Andric  def PTFF : SideEffectInherentE<"ptff", 0x0104>;
3220b57cec5SDimitry Andric
3230b57cec5SDimitry Andric// Set clock.
3240b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
3250b57cec5SDimitry Andric  def SCK : SideEffectUnaryS<"sck", 0xB204, null_frag, 8>;
3260b57cec5SDimitry Andric
3270b57cec5SDimitry Andric// Set clock programmable field.
3280b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R0L] in
3290b57cec5SDimitry Andric  def SCKPF : SideEffectInherentE<"sckpf", 0x0107>;
3300b57cec5SDimitry Andric
3310b57cec5SDimitry Andric// Set clock comparator.
3320b57cec5SDimitry Andriclet hasSideEffects = 1 in
3330b57cec5SDimitry Andric  def SCKC : SideEffectUnaryS<"sckc", 0xB206, null_frag, 8>;
3340b57cec5SDimitry Andric
3350b57cec5SDimitry Andric// Set CPU timer.
3360b57cec5SDimitry Andriclet hasSideEffects = 1 in
3370b57cec5SDimitry Andric  def SPT : SideEffectUnaryS<"spt", 0xB208, null_frag, 8>;
3380b57cec5SDimitry Andric
3390b57cec5SDimitry Andric// Store clock (fast / extended).
3400b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in {
3410b57cec5SDimitry Andric  def STCK  : StoreInherentS<"stck",  0xB205, null_frag, 8>;
342*0fca6ea1SDimitry Andric  def STCKF : StoreInherentS<"stckf", 0xB27C, z_stckf, 8>;
3430b57cec5SDimitry Andric  def STCKE : StoreInherentS<"stcke", 0xB278, null_frag, 16>;
3440b57cec5SDimitry Andric}
3450b57cec5SDimitry Andric
3460b57cec5SDimitry Andric// Store clock comparator.
3470b57cec5SDimitry Andriclet hasSideEffects = 1 in
3480b57cec5SDimitry Andric  def STCKC : StoreInherentS<"stckc", 0xB207, null_frag, 8>;
3490b57cec5SDimitry Andric
3500b57cec5SDimitry Andric// Store CPU timer.
3510b57cec5SDimitry Andriclet hasSideEffects = 1 in
3520b57cec5SDimitry Andric  def STPT : StoreInherentS<"stpt", 0xB209, null_frag, 8>;
3530b57cec5SDimitry Andric
3540b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
3550b57cec5SDimitry Andric// CPU-Related Instructions.
3560b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
3570b57cec5SDimitry Andric
3580b57cec5SDimitry Andric// Store CPU address.
3590b57cec5SDimitry Andriclet hasSideEffects = 1 in
3600b57cec5SDimitry Andric  def STAP : StoreInherentS<"stap", 0xB212, null_frag, 2>;
3610b57cec5SDimitry Andric
3620b57cec5SDimitry Andric// Store CPU ID.
3630b57cec5SDimitry Andriclet hasSideEffects = 1 in
3640b57cec5SDimitry Andric  def STIDP : StoreInherentS<"stidp", 0xB202, null_frag, 8>;
3650b57cec5SDimitry Andric
3660b57cec5SDimitry Andric// Store system information.
3670b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R0L, R1L], Defs = [R0L, CC] in
3680b57cec5SDimitry Andric  def STSI : StoreInherentS<"stsi", 0xB27D, null_frag, 0>;
3690b57cec5SDimitry Andric
3700b57cec5SDimitry Andric// Store facility list.
3710b57cec5SDimitry Andriclet hasSideEffects = 1 in
3720b57cec5SDimitry Andric  def STFL : StoreInherentS<"stfl", 0xB2B1, null_frag, 4>;
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andric// Store facility list extended.
3750b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R0D], Defs = [R0D, CC] in
3760b57cec5SDimitry Andric  def STFLE : StoreInherentS<"stfle", 0xB2B0, null_frag, 0>;
3770b57cec5SDimitry Andric
3780b57cec5SDimitry Andric// Extract CPU attribute.
3790b57cec5SDimitry Andriclet hasSideEffects = 1 in
3800b57cec5SDimitry Andric  def ECAG : BinaryRSY<"ecag", 0xEB4C, null_frag, GR64>;
3810b57cec5SDimitry Andric
3820b57cec5SDimitry Andric// Extract CPU time.
3830b57cec5SDimitry Andriclet hasSideEffects = 1, mayLoad = 1, Defs = [R0D, R1D] in
3840b57cec5SDimitry Andric  def ECTG : SideEffectTernarySSF<"ectg", 0xC81, GR64>;
3850b57cec5SDimitry Andric
3860b57cec5SDimitry Andric// Perform topology function.
3870b57cec5SDimitry Andriclet hasSideEffects = 1 in
3880b57cec5SDimitry Andric  def PTF : UnaryTiedRRE<"ptf", 0xB9A2, GR64>;
3890b57cec5SDimitry Andric
3900b57cec5SDimitry Andric// Perform cryptographic key management operation.
3910b57cec5SDimitry Andriclet Predicates = [FeatureMessageSecurityAssist3],
3920b57cec5SDimitry Andric    hasSideEffects = 1, Uses = [R0L, R1D] in
3930b57cec5SDimitry Andric  def PCKMO : SideEffectInherentRRE<"pckmo", 0xB928>;
3940b57cec5SDimitry Andric
395fe6060f1SDimitry Andric// Query processor activity counter information.
396fe6060f1SDimitry Andriclet Predicates = [FeatureProcessorActivityInstrumentation],
397fe6060f1SDimitry Andric    hasSideEffects = 1, Uses = [R0D], Defs = [R0D, CC] in
398fe6060f1SDimitry Andric  def QPACI : StoreInherentS<"qpaci", 0xB28F, null_frag, 0>;
399fe6060f1SDimitry Andric
4000b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4010b57cec5SDimitry Andric// Miscellaneous Instructions.
4020b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4030b57cec5SDimitry Andric
4040b57cec5SDimitry Andric// Supervisor call.
4050b57cec5SDimitry Andriclet hasSideEffects = 1, isCall = 1, Defs = [CC] in
4060b57cec5SDimitry Andric  def SVC : SideEffectUnaryI<"svc", 0x0A, imm32zx8>;
4070b57cec5SDimitry Andric
4080b57cec5SDimitry Andric// Monitor call.
4090b57cec5SDimitry Andriclet hasSideEffects = 1, isCall = 1 in
4100b57cec5SDimitry Andric  def MC : SideEffectBinarySI<"mc", 0xAF, imm32zx8>;
4110b57cec5SDimitry Andric
4120b57cec5SDimitry Andric// Diagnose.
4130b57cec5SDimitry Andriclet hasSideEffects = 1, isCall = 1 in
4140b57cec5SDimitry Andric  def DIAG : SideEffectTernaryRS<"diag", 0x83, GR32, GR32>;
4150b57cec5SDimitry Andric
4160b57cec5SDimitry Andric// Trace.
4170b57cec5SDimitry Andriclet hasSideEffects = 1, mayLoad = 1 in {
4180b57cec5SDimitry Andric  def TRACE : SideEffectTernaryRS<"trace", 0x99, GR32, GR32>;
4190b57cec5SDimitry Andric  def TRACG : SideEffectTernaryRSY<"tracg", 0xEB0F, GR64, GR64>;
4200b57cec5SDimitry Andric}
4210b57cec5SDimitry Andric
4220b57cec5SDimitry Andric// Trap.
4230b57cec5SDimitry Andriclet hasSideEffects = 1 in {
4240b57cec5SDimitry Andric  def TRAP2 : SideEffectInherentE<"trap2", 0x01FF>;
4250b57cec5SDimitry Andric  def TRAP4 : SideEffectAddressS<"trap4", 0xB2FF, null_frag>;
4260b57cec5SDimitry Andric}
4270b57cec5SDimitry Andric
4280b57cec5SDimitry Andric// Signal processor.
4290b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4300b57cec5SDimitry Andric  def SIGP : SideEffectTernaryRS<"sigp", 0xAE, GR64, GR64>;
4310b57cec5SDimitry Andric
4320b57cec5SDimitry Andric// Signal adapter.
4330b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R0D, R1D, R2D, R3D], Defs = [CC] in
4340b57cec5SDimitry Andric  def SIGA : SideEffectAddressS<"siga", 0xB274, null_frag>;
4350b57cec5SDimitry Andric
4360b57cec5SDimitry Andric// Start interpretive execution.
4370b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4380b57cec5SDimitry Andric  def SIE : SideEffectUnaryS<"sie", 0xB214, null_frag, 0>;
4390b57cec5SDimitry Andric
4400b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4410b57cec5SDimitry Andric// CPU-Measurement Facility Instructions (SA23-2260).
4420b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4430b57cec5SDimitry Andric
4440b57cec5SDimitry Andric// Load program parameter
4450b57cec5SDimitry Andriclet hasSideEffects = 1 in
4460b57cec5SDimitry Andric  def LPP : SideEffectUnaryS<"lpp", 0xB280, null_frag, 8>;
4470b57cec5SDimitry Andric
4480b57cec5SDimitry Andric// Extract coprocessor-group address.
4490b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4500b57cec5SDimitry Andric  def ECPGA : UnaryRRE<"ecpga", 0xB2ED, null_frag, GR32, GR64>;
4510b57cec5SDimitry Andric
4520b57cec5SDimitry Andric// Extract CPU counter.
4530b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4540b57cec5SDimitry Andric  def ECCTR : UnaryRRE<"ecctr", 0xB2E4, null_frag, GR64, GR64>;
4550b57cec5SDimitry Andric
4560b57cec5SDimitry Andric// Extract peripheral counter.
4570b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4580b57cec5SDimitry Andric  def EPCTR : UnaryRRE<"epctr", 0xB2E5, null_frag, GR64, GR64>;
4590b57cec5SDimitry Andric
4600b57cec5SDimitry Andric// Load CPU-counter-set controls.
4610b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4620b57cec5SDimitry Andric  def LCCTL : SideEffectUnaryS<"lcctl", 0xB284, null_frag, 8>;
4630b57cec5SDimitry Andric
4640b57cec5SDimitry Andric// Load peripheral-counter-set controls.
4650b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4660b57cec5SDimitry Andric  def LPCTL : SideEffectUnaryS<"lpctl", 0xB285, null_frag, 8>;
4670b57cec5SDimitry Andric
4680b57cec5SDimitry Andric// Load sampling controls.
4690b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4700b57cec5SDimitry Andric  def LSCTL : SideEffectUnaryS<"lsctl", 0xB287, null_frag, 0>;
4710b57cec5SDimitry Andric
4720b57cec5SDimitry Andric// Query sampling information.
4730b57cec5SDimitry Andriclet hasSideEffects = 1 in
4740b57cec5SDimitry Andric  def QSI : StoreInherentS<"qsi", 0xB286, null_frag, 0>;
4750b57cec5SDimitry Andric
4760b57cec5SDimitry Andric// Query counter information.
4770b57cec5SDimitry Andriclet hasSideEffects = 1 in
4780b57cec5SDimitry Andric  def QCTRI : StoreInherentS<"qctri", 0xB28E, null_frag, 0>;
4790b57cec5SDimitry Andric
4800b57cec5SDimitry Andric// Set CPU counter.
4810b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4820b57cec5SDimitry Andric  def SCCTR : SideEffectBinaryRRE<"scctr", 0xB2E0, GR64, GR64>;
4830b57cec5SDimitry Andric
4840b57cec5SDimitry Andric// Set peripheral counter.
4850b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4860b57cec5SDimitry Andric  def SPCTR : SideEffectBinaryRRE<"spctr", 0xB2E1, GR64, GR64>;
4870b57cec5SDimitry Andric
4880b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4890b57cec5SDimitry Andric// I/O Instructions (Principles of Operation, Chapter 14).
4900b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4910b57cec5SDimitry Andric
4920b57cec5SDimitry Andric// Clear subchannel.
4930b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
4940b57cec5SDimitry Andric  def CSCH : SideEffectInherentS<"csch", 0xB230, null_frag>;
4950b57cec5SDimitry Andric
4960b57cec5SDimitry Andric// Halt subchannel.
4970b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
4980b57cec5SDimitry Andric  def HSCH : SideEffectInherentS<"hsch", 0xB231, null_frag>;
4990b57cec5SDimitry Andric
5000b57cec5SDimitry Andric// Modify subchannel.
5010b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5020b57cec5SDimitry Andric  def MSCH : SideEffectUnaryS<"msch", 0xB232, null_frag, 0>;
5030b57cec5SDimitry Andric
5040b57cec5SDimitry Andric// Resume subchannel.
5050b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5060b57cec5SDimitry Andric  def RSCH : SideEffectInherentS<"rsch", 0xB238, null_frag>;
5070b57cec5SDimitry Andric
5080b57cec5SDimitry Andric// Start subchannel.
5090b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5100b57cec5SDimitry Andric  def SSCH : SideEffectUnaryS<"ssch", 0xB233, null_frag, 0>;
5110b57cec5SDimitry Andric
5120b57cec5SDimitry Andric// Store subchannel.
5130b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5140b57cec5SDimitry Andric  def STSCH : StoreInherentS<"stsch", 0xB234, null_frag, 0>;
5150b57cec5SDimitry Andric
5160b57cec5SDimitry Andric// Test subchannel.
5170b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5180b57cec5SDimitry Andric  def TSCH : StoreInherentS<"tsch", 0xB235, null_frag, 0>;
5190b57cec5SDimitry Andric
5200b57cec5SDimitry Andric// Cancel subchannel.
5210b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5220b57cec5SDimitry Andric  def XSCH : SideEffectInherentS<"xsch", 0xB276, null_frag>;
5230b57cec5SDimitry Andric
5240b57cec5SDimitry Andric// Reset channel path.
5250b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5260b57cec5SDimitry Andric  def RCHP : SideEffectInherentS<"rchp", 0xB23B, null_frag>;
5270b57cec5SDimitry Andric
5280b57cec5SDimitry Andric// Set channel monitor.
5290b57cec5SDimitry Andriclet hasSideEffects = 1, mayLoad = 1, Uses = [R1L, R2D] in
5300b57cec5SDimitry Andric  def SCHM : SideEffectInherentS<"schm", 0xB23C, null_frag>;
5310b57cec5SDimitry Andric
5320b57cec5SDimitry Andric// Store channel path status.
5330b57cec5SDimitry Andriclet hasSideEffects = 1 in
5340b57cec5SDimitry Andric  def STCPS : StoreInherentS<"stcps", 0xB23A, null_frag, 0>;
5350b57cec5SDimitry Andric
5360b57cec5SDimitry Andric// Store channel report word.
5370b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
5380b57cec5SDimitry Andric  def STCRW : StoreInherentS<"stcrw", 0xB239, null_frag, 0>;
5390b57cec5SDimitry Andric
5400b57cec5SDimitry Andric// Test pending interruption.
5410b57cec5SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
5420b57cec5SDimitry Andric  def TPI : StoreInherentS<"tpi", 0xB236, null_frag, 0>;
5430b57cec5SDimitry Andric
544*0fca6ea1SDimitry Andric// Test pending external interruption.
545*0fca6ea1SDimitry Andriclet hasSideEffects = 1, Defs = [CC], Predicates = [FeatureTestPendingExternalInterruption] in
546*0fca6ea1SDimitry Andric  def TPEI : UnaryRRE<"tpei", 0xB9A1, null_frag, GR64, GR64>;
547*0fca6ea1SDimitry Andric
5480b57cec5SDimitry Andric// Set address limit.
5490b57cec5SDimitry Andriclet hasSideEffects = 1, Uses = [R1L] in
5500b57cec5SDimitry Andric  def SAL : SideEffectInherentS<"sal", 0xB237, null_frag>;
5510b57cec5SDimitry Andric
552