103ab2e2bSUlrich Weigand//==- SystemZInstrSystem.td - SystemZ system instructions -*- tblgen-*-----==//
203ab2e2bSUlrich Weigand//
32946cd70SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
603ab2e2bSUlrich Weigand//
703ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
803ab2e2bSUlrich Weigand//
903ab2e2bSUlrich Weigand// The instructions in this file implement SystemZ system-level instructions.
1003ab2e2bSUlrich Weigand// Most of these instructions are privileged or semi-privileged.  They are
1103ab2e2bSUlrich Weigand// not used for code generation, but are provided for use with the assembler
1203ab2e2bSUlrich Weigand// and disassembler only.
1303ab2e2bSUlrich Weigand//
1403ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
1503ab2e2bSUlrich Weigand
1603ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
1703ab2e2bSUlrich Weigand// Program-Status Word Instructions.
1803ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
1903ab2e2bSUlrich Weigand
2003ab2e2bSUlrich Weigand// Extract PSW.
2103ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [CC] in
2203ab2e2bSUlrich Weigand  def EPSW : InherentDualRRE<"epsw", 0xB98D, GR32>;
2303ab2e2bSUlrich Weigand
2403ab2e2bSUlrich Weigand// Load PSW (extended).
25b5b91cd4SJonas Paulssonlet hasSideEffects = 1, Defs = [CC] in {
2603ab2e2bSUlrich Weigand  def LPSW : SideEffectUnaryS<"lpsw", 0x8200, null_frag, 8>;
2703ab2e2bSUlrich Weigand  def LPSWE : SideEffectUnaryS<"lpswe", 0xB2B2, null_frag, 16>;
2803ab2e2bSUlrich Weigand}
29*8cd8120aSUlrich Weigandlet Predicates = [FeatureBEAREnhancement], hasSideEffects = 1, Defs = [CC] in
30*8cd8120aSUlrich Weigand  def LPSWEY : SideEffectUnarySIY<"lpswey", 0xEB71, 16>;
3103ab2e2bSUlrich Weigand
3203ab2e2bSUlrich Weigand// Insert PSW key.
3303ab2e2bSUlrich Weigandlet Uses = [R2L], Defs = [R2L] in
3403ab2e2bSUlrich Weigand  def IPK : SideEffectInherentS<"ipk", 0xB20B, null_frag>;
3503ab2e2bSUlrich Weigand
3603ab2e2bSUlrich Weigand// Set PSW key from address.
3703ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
3803ab2e2bSUlrich Weigand  def SPKA : SideEffectAddressS<"spka", 0xB20A, null_frag>;
3903ab2e2bSUlrich Weigand
4003ab2e2bSUlrich Weigand// Set system mask.
41b5b91cd4SJonas Paulssonlet hasSideEffects = 1 in
4203ab2e2bSUlrich Weigand  def SSM : SideEffectUnaryS<"ssm", 0x8000, null_frag, 1>;
4303ab2e2bSUlrich Weigand
4403ab2e2bSUlrich Weigand// Store then AND/OR system mask.
4503ab2e2bSUlrich Weigandlet hasSideEffects = 1 in {
4603ab2e2bSUlrich Weigand  def STNSM : StoreSI<"stnsm", 0xAC, null_frag, imm32zx8>;
4703ab2e2bSUlrich Weigand  def STOSM : StoreSI<"stosm", 0xAD, null_frag, imm32zx8>;
4803ab2e2bSUlrich Weigand}
4903ab2e2bSUlrich Weigand
5003ab2e2bSUlrich Weigand// Insert address space control.
5103ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
5203ab2e2bSUlrich Weigand  def IAC : InherentRRE<"iac", 0xB224, GR32, null_frag>;
5303ab2e2bSUlrich Weigand
5403ab2e2bSUlrich Weigand// Set address space control (fast).
5503ab2e2bSUlrich Weigandlet hasSideEffects = 1 in {
5603ab2e2bSUlrich Weigand  def SAC : SideEffectAddressS<"sac", 0xB219, null_frag>;
5703ab2e2bSUlrich Weigand  def SACF : SideEffectAddressS<"sacf", 0xB279, null_frag>;
5803ab2e2bSUlrich Weigand}
5903ab2e2bSUlrich Weigand
6003ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
6103ab2e2bSUlrich Weigand// Control Register Instructions.
6203ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
6303ab2e2bSUlrich Weigand
64b5b91cd4SJonas Paulssonlet hasSideEffects = 1 in {
6503ab2e2bSUlrich Weigand  // Load control.
6603ab2e2bSUlrich Weigand  def LCTL : LoadMultipleRS<"lctl", 0xB7, CR64>;
6703ab2e2bSUlrich Weigand  def LCTLG : LoadMultipleRSY<"lctlg", 0xEB2F, CR64>;
6803ab2e2bSUlrich Weigand
6903ab2e2bSUlrich Weigand  // Store control.
7003ab2e2bSUlrich Weigand  def STCTL : StoreMultipleRS<"stctl", 0xB6, CR64>;
7103ab2e2bSUlrich Weigand  def STCTG : StoreMultipleRSY<"stctg", 0xEB25, CR64>;
72b5b91cd4SJonas Paulsson}
7303ab2e2bSUlrich Weigand
7403ab2e2bSUlrich Weigand// Extract primary ASN (and instance).
7503ab2e2bSUlrich Weigandlet hasSideEffects = 1 in {
7603ab2e2bSUlrich Weigand  def EPAR : InherentRRE<"epar", 0xB226, GR32, null_frag>;
7703ab2e2bSUlrich Weigand  def EPAIR : InherentRRE<"epair", 0xB99A, GR64, null_frag>;
7803ab2e2bSUlrich Weigand}
7903ab2e2bSUlrich Weigand
8003ab2e2bSUlrich Weigand// Extract secondary ASN (and instance).
8103ab2e2bSUlrich Weigandlet hasSideEffects = 1 in {
8203ab2e2bSUlrich Weigand  def ESAR : InherentRRE<"esar", 0xB227, GR32, null_frag>;
8303ab2e2bSUlrich Weigand  def ESAIR : InherentRRE<"esair", 0xB99B, GR64, null_frag>;
8403ab2e2bSUlrich Weigand}
8503ab2e2bSUlrich Weigand
8603ab2e2bSUlrich Weigand// Set secondary ASN (and instance).
8703ab2e2bSUlrich Weigandlet hasSideEffects = 1 in {
8803ab2e2bSUlrich Weigand  def SSAR : SideEffectUnaryRRE<"ssar", 0xB225, GR32, null_frag>;
8903ab2e2bSUlrich Weigand  def SSAIR : SideEffectUnaryRRE<"ssair", 0xB99F, GR64, null_frag>;
9003ab2e2bSUlrich Weigand}
9103ab2e2bSUlrich Weigand
9203ab2e2bSUlrich Weigand// Extract and set extended authority.
9303ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
9403ab2e2bSUlrich Weigand  def ESEA : UnaryTiedRRE<"esea", 0xB99D, GR32>;
9503ab2e2bSUlrich Weigand
9603ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
9703ab2e2bSUlrich Weigand// Prefix-Register Instructions.
9803ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
9903ab2e2bSUlrich Weigand
10003ab2e2bSUlrich Weigand// Set prefix.
10103ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
10203ab2e2bSUlrich Weigand  def SPX : SideEffectUnaryS<"spx", 0xB210, null_frag, 4>;
10303ab2e2bSUlrich Weigand
10403ab2e2bSUlrich Weigand// Store prefix.
10503ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
10603ab2e2bSUlrich Weigand  def STPX : StoreInherentS<"stpx", 0xB211, null_frag, 4>;
10703ab2e2bSUlrich Weigand
10803ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
109*8cd8120aSUlrich Weigand// Breaking-Event-Address-Register Instructions.
110*8cd8120aSUlrich Weigand//===----------------------------------------------------------------------===//
111*8cd8120aSUlrich Weigand
112*8cd8120aSUlrich Weigandlet Predicates = [FeatureBEAREnhancement] in {
113*8cd8120aSUlrich Weigand  // Load BEAR.
114*8cd8120aSUlrich Weigand  let hasSideEffects = 1 in
115*8cd8120aSUlrich Weigand    def LBEAR : SideEffectUnaryS<"lbear", 0xB200, null_frag, 8>;
116*8cd8120aSUlrich Weigand
117*8cd8120aSUlrich Weigand  // Store BEAR.
118*8cd8120aSUlrich Weigand  let hasSideEffects = 1 in
119*8cd8120aSUlrich Weigand    def STBEAR : StoreInherentS<"stbear", 0xB201, null_frag, 8>;
120*8cd8120aSUlrich Weigand}
121*8cd8120aSUlrich Weigand
122*8cd8120aSUlrich Weigand//===----------------------------------------------------------------------===//
12303ab2e2bSUlrich Weigand// Storage-Key and Real Memory Instructions.
12403ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
12503ab2e2bSUlrich Weigand
12603ab2e2bSUlrich Weigand// Insert storage key extended.
12703ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
12803ab2e2bSUlrich Weigand  def ISKE : BinaryRRE<"iske", 0xB229, null_frag, GR32, GR64>;
12903ab2e2bSUlrich Weigand
13003ab2e2bSUlrich Weigand// Insert virtual storage key.
13103ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
13203ab2e2bSUlrich Weigand  def IVSK : BinaryRRE<"ivsk", 0xB223, null_frag, GR32, GR64>;
13303ab2e2bSUlrich Weigand
13403ab2e2bSUlrich Weigand// Set storage key extended.
13503ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
13603ab2e2bSUlrich Weigand  defm SSKE : SideEffectTernaryRRFcOpt<"sske", 0xB22B, GR32, GR64>;
13703ab2e2bSUlrich Weigand
13803ab2e2bSUlrich Weigand// Reset reference bit extended.
13903ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
14003ab2e2bSUlrich Weigand  def RRBE : SideEffectBinaryRRE<"rrbe", 0xB22A, GR32, GR64>;
14103ab2e2bSUlrich Weigand
14203ab2e2bSUlrich Weigand// Reset reference bits multiple.
14303ab2e2bSUlrich Weigandlet Predicates = [FeatureResetReferenceBitsMultiple], hasSideEffects = 1 in
14403ab2e2bSUlrich Weigand  def RRBM : UnaryRRE<"rrbm", 0xB9AE, null_frag, GR64, GR64>;
14503ab2e2bSUlrich Weigand
1462b3482feSUlrich Weigand// Insert reference bits multiple.
1472b3482feSUlrich Weigandlet Predicates = [FeatureInsertReferenceBitsMultiple], hasSideEffects = 1 in
1482b3482feSUlrich Weigand  def IRBM : UnaryRRE<"irbm", 0xB9AC, null_frag, GR64, GR64>;
1492b3482feSUlrich Weigand
15003ab2e2bSUlrich Weigand// Perform frame management function.
15103ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
15203ab2e2bSUlrich Weigand  def PFMF : SideEffectBinaryMemRRE<"pfmf", 0xB9AF, GR32, GR64>;
15303ab2e2bSUlrich Weigand
15403ab2e2bSUlrich Weigand// Test block.
15503ab2e2bSUlrich Weigandlet hasSideEffects = 1, mayStore = 1, Uses = [R0D], Defs = [R0D, CC] in
15603ab2e2bSUlrich Weigand  def TB : SideEffectBinaryRRE<"tb", 0xB22C, GR64, GR64>;
15703ab2e2bSUlrich Weigand
15803ab2e2bSUlrich Weigand// Page in / out.
15903ab2e2bSUlrich Weigandlet mayLoad = 1, mayStore = 1, Defs = [CC] in {
16003ab2e2bSUlrich Weigand  def PGIN : SideEffectBinaryRRE<"pgin", 0xB22E, GR64, GR64>;
16103ab2e2bSUlrich Weigand  def PGOUT : SideEffectBinaryRRE<"pgout", 0xB22F, GR64, GR64>;
16203ab2e2bSUlrich Weigand}
16303ab2e2bSUlrich Weigand
16403ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
16503ab2e2bSUlrich Weigand// Dynamic-Address-Translation Instructions.
16603ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
16703ab2e2bSUlrich Weigand
16803ab2e2bSUlrich Weigand// Invalidate page table entry.
16903ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
17003ab2e2bSUlrich Weigand  defm IPTE : SideEffectQuaternaryRRFaOptOpt<"ipte", 0xB221, GR64, GR32, GR32>;
17103ab2e2bSUlrich Weigand
17203ab2e2bSUlrich Weigand// Invalidate DAT table entry.
17303ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
17403ab2e2bSUlrich Weigand  defm IDTE : SideEffectQuaternaryRRFbOpt<"idte", 0xB98E, GR64, GR64, GR64>;
17503ab2e2bSUlrich Weigand
176*8cd8120aSUlrich Weigand// Reset DAT protection.
177*8cd8120aSUlrich Weigandlet Predicates = [FeatureResetDATProtection], hasSideEffects = 1 in
178*8cd8120aSUlrich Weigand  defm RDP : SideEffectQuaternaryRRFbOpt<"rdp", 0xB98B, GR64, GR64, GR64>;
179*8cd8120aSUlrich Weigand
18003ab2e2bSUlrich Weigand// Compare and replace DAT table entry.
18103ab2e2bSUlrich Weigandlet Predicates = [FeatureEnhancedDAT2], hasSideEffects = 1, Defs = [CC] in
18203ab2e2bSUlrich Weigand  defm CRDTE : SideEffectQuaternaryRRFbOpt<"crdte", 0xB98F, GR128, GR128, GR64>;
18303ab2e2bSUlrich Weigand
18403ab2e2bSUlrich Weigand// Purge TLB.
18503ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
18603ab2e2bSUlrich Weigand  def PTLB : SideEffectInherentS<"ptlb", 0xB20D, null_frag>;
18703ab2e2bSUlrich Weigand
18803ab2e2bSUlrich Weigand// Compare and swap and purge.
18903ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in {
19003ab2e2bSUlrich Weigand  def CSP : CmpSwapRRE<"csp", 0xB250, GR128, GR64>;
19103ab2e2bSUlrich Weigand  def CSPG : CmpSwapRRE<"cspg", 0xB98A, GR128, GR64>;
19203ab2e2bSUlrich Weigand}
19303ab2e2bSUlrich Weigand
19403ab2e2bSUlrich Weigand// Load page-table-entry address.
19503ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
19603ab2e2bSUlrich Weigand  def LPTEA : TernaryRRFb<"lptea", 0xB9AA, GR64, GR64, GR64>;
19703ab2e2bSUlrich Weigand
19803ab2e2bSUlrich Weigand// Load real address.
19903ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in {
20003ab2e2bSUlrich Weigand  defm LRA : LoadAddressRXPair<"lra", 0xB1, 0xE313, null_frag>;
20103ab2e2bSUlrich Weigand  def LRAG : LoadAddressRXY<"lrag", 0xE303, null_frag, laaddr20pair>;
20203ab2e2bSUlrich Weigand}
20303ab2e2bSUlrich Weigand
20403ab2e2bSUlrich Weigand// Store real address.
20503ab2e2bSUlrich Weiganddef STRAG : StoreSSE<"strag", 0xE502>;
20603ab2e2bSUlrich Weigand
20703ab2e2bSUlrich Weigand// Load using real address.
20803ab2e2bSUlrich Weigandlet mayLoad = 1 in {
20903ab2e2bSUlrich Weigand def LURA : UnaryRRE<"lura", 0xB24B, null_frag, GR32, GR64>;
21003ab2e2bSUlrich Weigand def LURAG : UnaryRRE<"lurag", 0xB905, null_frag, GR64, GR64>;
21103ab2e2bSUlrich Weigand}
21203ab2e2bSUlrich Weigand
21303ab2e2bSUlrich Weigand// Store using real address.
21403ab2e2bSUlrich Weigandlet mayStore = 1 in {
21503ab2e2bSUlrich Weigand def STURA : SideEffectBinaryRRE<"stura", 0xB246, GR32, GR64>;
21603ab2e2bSUlrich Weigand def STURG : SideEffectBinaryRRE<"sturg", 0xB925, GR64, GR64>;
21703ab2e2bSUlrich Weigand}
21803ab2e2bSUlrich Weigand
21903ab2e2bSUlrich Weigand// Test protection.
22003ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
22103ab2e2bSUlrich Weigand  def TPROT : SideEffectBinarySSE<"tprot", 0xE501>;
22203ab2e2bSUlrich Weigand
22303ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
22403ab2e2bSUlrich Weigand// Memory-move Instructions.
22503ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
22603ab2e2bSUlrich Weigand
22703ab2e2bSUlrich Weigand// Move with key.
22803ab2e2bSUlrich Weigandlet mayLoad = 1, mayStore = 1, Defs = [CC] in
22903ab2e2bSUlrich Weigand  def MVCK : MemoryBinarySSd<"mvck", 0xD9, GR64>;
23003ab2e2bSUlrich Weigand
23103ab2e2bSUlrich Weigand// Move to primary / secondary.
23203ab2e2bSUlrich Weigandlet mayLoad = 1, mayStore = 1, Defs = [CC] in {
23303ab2e2bSUlrich Weigand  def MVCP : MemoryBinarySSd<"mvcp", 0xDA, GR64>;
23403ab2e2bSUlrich Weigand  def MVCS : MemoryBinarySSd<"mvcs", 0xDB, GR64>;
23503ab2e2bSUlrich Weigand}
23603ab2e2bSUlrich Weigand
23703ab2e2bSUlrich Weigand// Move with source / destination key.
23803ab2e2bSUlrich Weigandlet mayLoad = 1, mayStore = 1, Uses = [R0L, R1L] in {
23903ab2e2bSUlrich Weigand  def MVCSK : SideEffectBinarySSE<"mvcsk", 0xE50E>;
24003ab2e2bSUlrich Weigand  def MVCDK : SideEffectBinarySSE<"mvcdk", 0xE50F>;
24103ab2e2bSUlrich Weigand}
24203ab2e2bSUlrich Weigand
24303ab2e2bSUlrich Weigand// Move with optional specifications.
24403ab2e2bSUlrich Weigandlet mayLoad = 1, mayStore = 1, Uses = [R0L] in
24503ab2e2bSUlrich Weigand  def MVCOS : SideEffectTernarySSF<"mvcos", 0xC80, GR64>;
24603ab2e2bSUlrich Weigand
24703ab2e2bSUlrich Weigand// Move page.
24803ab2e2bSUlrich Weigandlet mayLoad = 1, mayStore = 1, Uses = [R0L], Defs = [CC] in
24903ab2e2bSUlrich Weigand  def MVPG : SideEffectBinaryRRE<"mvpg", 0xB254, GR64, GR64>;
25003ab2e2bSUlrich Weigand
25103ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
25203ab2e2bSUlrich Weigand// Address-Space Instructions.
25303ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
25403ab2e2bSUlrich Weigand
25503ab2e2bSUlrich Weigand// Load address space parameters.
25603ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
25703ab2e2bSUlrich Weigand  def LASP : SideEffectBinarySSE<"lasp", 0xE500>;
25803ab2e2bSUlrich Weigand
25903ab2e2bSUlrich Weigand// Purge ALB.
26003ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
26103ab2e2bSUlrich Weigand  def PALB : SideEffectInherentRRE<"palb", 0xB248>;
26203ab2e2bSUlrich Weigand
26303ab2e2bSUlrich Weigand// Program call.
26403ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
26503ab2e2bSUlrich Weigand  def PC : SideEffectAddressS<"pc", 0xB218, null_frag>;
26603ab2e2bSUlrich Weigand
26703ab2e2bSUlrich Weigand// Program return.
26803ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
26903ab2e2bSUlrich Weigand  def PR : SideEffectInherentE<"pr", 0x0101>;
27003ab2e2bSUlrich Weigand
27103ab2e2bSUlrich Weigand// Program transfer (with instance).
27203ab2e2bSUlrich Weigandlet hasSideEffects = 1 in {
27303ab2e2bSUlrich Weigand  def PT : SideEffectBinaryRRE<"pt", 0xB228, GR32, GR64>;
27403ab2e2bSUlrich Weigand  def PTI : SideEffectBinaryRRE<"pti", 0xB99E, GR64, GR64>;
27503ab2e2bSUlrich Weigand}
27603ab2e2bSUlrich Weigand
27703ab2e2bSUlrich Weigand// Resume program.
27803ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
27903ab2e2bSUlrich Weigand  def RP : SideEffectAddressS<"rp", 0xB277, null_frag>;
28003ab2e2bSUlrich Weigand
28103ab2e2bSUlrich Weigand// Branch in subspace group.
28203ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
28303ab2e2bSUlrich Weigand  def BSG : UnaryRRE<"bsg", 0xB258, null_frag, GR64, GR64>;
28403ab2e2bSUlrich Weigand
28503ab2e2bSUlrich Weigand// Branch and set authority.
28603ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
28703ab2e2bSUlrich Weigand  def BSA : UnaryRRE<"bsa", 0xB25A, null_frag, GR64, GR64>;
28803ab2e2bSUlrich Weigand
28903ab2e2bSUlrich Weigand// Test access.
29003ab2e2bSUlrich Weigandlet Defs = [CC] in
29103ab2e2bSUlrich Weigand  def TAR : SideEffectBinaryRRE<"tar", 0xB24C, AR32, GR32>;
29203ab2e2bSUlrich Weigand
29303ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
29403ab2e2bSUlrich Weigand// Linkage-Stack Instructions.
29503ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
29603ab2e2bSUlrich Weigand
29703ab2e2bSUlrich Weigand// Branch and stack.
29803ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
29903ab2e2bSUlrich Weigand  def BAKR : SideEffectBinaryRRE<"bakr", 0xB240, GR64, GR64>;
30003ab2e2bSUlrich Weigand
30103ab2e2bSUlrich Weigand// Extract stacked registers.
30203ab2e2bSUlrich Weigandlet hasSideEffects = 1 in {
30303ab2e2bSUlrich Weigand  def EREG : SideEffectBinaryRRE<"ereg", 0xB249, GR32, GR32>;
30403ab2e2bSUlrich Weigand  def EREGG : SideEffectBinaryRRE<"eregg", 0xB90E, GR64, GR64>;
30503ab2e2bSUlrich Weigand}
30603ab2e2bSUlrich Weigand
30703ab2e2bSUlrich Weigand// Extract stacked state.
30803ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
30903ab2e2bSUlrich Weigand  def ESTA : UnaryRRE<"esta", 0xB24A, null_frag, GR128, GR32>;
31003ab2e2bSUlrich Weigand
31103ab2e2bSUlrich Weigand// Modify stacked state.
31203ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
31303ab2e2bSUlrich Weigand  def MSTA : SideEffectUnaryRRE<"msta", 0xB247, GR128, null_frag>;
31403ab2e2bSUlrich Weigand
31503ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
31603ab2e2bSUlrich Weigand// Time-Related Instructions.
31703ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
31803ab2e2bSUlrich Weigand
31903ab2e2bSUlrich Weigand// Perform timing facility function.
32003ab2e2bSUlrich Weigandlet hasSideEffects = 1, mayLoad = 1, Uses = [R0L, R1D], Defs = [CC] in
32103ab2e2bSUlrich Weigand  def PTFF : SideEffectInherentE<"ptff", 0x0104>;
32203ab2e2bSUlrich Weigand
32303ab2e2bSUlrich Weigand// Set clock.
32403ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
32503ab2e2bSUlrich Weigand  def SCK : SideEffectUnaryS<"sck", 0xB204, null_frag, 8>;
32603ab2e2bSUlrich Weigand
32703ab2e2bSUlrich Weigand// Set clock programmable field.
32803ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R0L] in
32903ab2e2bSUlrich Weigand  def SCKPF : SideEffectInherentE<"sckpf", 0x0107>;
33003ab2e2bSUlrich Weigand
33103ab2e2bSUlrich Weigand// Set clock comparator.
33203ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
33303ab2e2bSUlrich Weigand  def SCKC : SideEffectUnaryS<"sckc", 0xB206, null_frag, 8>;
33403ab2e2bSUlrich Weigand
33503ab2e2bSUlrich Weigand// Set CPU timer.
33603ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
33703ab2e2bSUlrich Weigand  def SPT : SideEffectUnaryS<"spt", 0xB208, null_frag, 8>;
33803ab2e2bSUlrich Weigand
33903ab2e2bSUlrich Weigand// Store clock (fast / extended).
34003ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in {
34103ab2e2bSUlrich Weigand  def STCK  : StoreInherentS<"stck",  0xB205, null_frag, 8>;
34203ab2e2bSUlrich Weigand  def STCKF : StoreInherentS<"stckf", 0xB27C, null_frag, 8>;
34303ab2e2bSUlrich Weigand  def STCKE : StoreInherentS<"stcke", 0xB278, null_frag, 16>;
34403ab2e2bSUlrich Weigand}
34503ab2e2bSUlrich Weigand
34603ab2e2bSUlrich Weigand// Store clock comparator.
34703ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
34803ab2e2bSUlrich Weigand  def STCKC : StoreInherentS<"stckc", 0xB207, null_frag, 8>;
34903ab2e2bSUlrich Weigand
35003ab2e2bSUlrich Weigand// Store CPU timer.
35103ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
35203ab2e2bSUlrich Weigand  def STPT : StoreInherentS<"stpt", 0xB209, null_frag, 8>;
35303ab2e2bSUlrich Weigand
35403ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
35503ab2e2bSUlrich Weigand// CPU-Related Instructions.
35603ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
35703ab2e2bSUlrich Weigand
35803ab2e2bSUlrich Weigand// Store CPU address.
35903ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
36003ab2e2bSUlrich Weigand  def STAP : StoreInherentS<"stap", 0xB212, null_frag, 2>;
36103ab2e2bSUlrich Weigand
36203ab2e2bSUlrich Weigand// Store CPU ID.
36303ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
36403ab2e2bSUlrich Weigand  def STIDP : StoreInherentS<"stidp", 0xB202, null_frag, 8>;
36503ab2e2bSUlrich Weigand
36603ab2e2bSUlrich Weigand// Store system information.
36703ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R0L, R1L], Defs = [R0L, CC] in
36803ab2e2bSUlrich Weigand  def STSI : StoreInherentS<"stsi", 0xB27D, null_frag, 0>;
36903ab2e2bSUlrich Weigand
37003ab2e2bSUlrich Weigand// Store facility list.
37103ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
37203ab2e2bSUlrich Weigand  def STFL : StoreInherentS<"stfl", 0xB2B1, null_frag, 4>;
37303ab2e2bSUlrich Weigand
37403ab2e2bSUlrich Weigand// Store facility list extended.
37503ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R0D], Defs = [R0D, CC] in
37603ab2e2bSUlrich Weigand  def STFLE : StoreInherentS<"stfle", 0xB2B0, null_frag, 0>;
37703ab2e2bSUlrich Weigand
37803ab2e2bSUlrich Weigand// Extract CPU attribute.
37903ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
38003ab2e2bSUlrich Weigand  def ECAG : BinaryRSY<"ecag", 0xEB4C, null_frag, GR64>;
38103ab2e2bSUlrich Weigand
38203ab2e2bSUlrich Weigand// Extract CPU time.
38303ab2e2bSUlrich Weigandlet hasSideEffects = 1, mayLoad = 1, Defs = [R0D, R1D] in
38403ab2e2bSUlrich Weigand  def ECTG : SideEffectTernarySSF<"ectg", 0xC81, GR64>;
38503ab2e2bSUlrich Weigand
38603ab2e2bSUlrich Weigand// Perform topology function.
38703ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
38803ab2e2bSUlrich Weigand  def PTF : UnaryTiedRRE<"ptf", 0xB9A2, GR64>;
38903ab2e2bSUlrich Weigand
39003ab2e2bSUlrich Weigand// Perform cryptographic key management operation.
39103ab2e2bSUlrich Weigandlet Predicates = [FeatureMessageSecurityAssist3],
39203ab2e2bSUlrich Weigand    hasSideEffects = 1, Uses = [R0L, R1D] in
39303ab2e2bSUlrich Weigand  def PCKMO : SideEffectInherentRRE<"pckmo", 0xB928>;
39403ab2e2bSUlrich Weigand
395*8cd8120aSUlrich Weigand// Query processor activity counter information.
396*8cd8120aSUlrich Weigandlet Predicates = [FeatureProcessorActivityInstrumentation],
397*8cd8120aSUlrich Weigand    hasSideEffects = 1, Uses = [R0D], Defs = [R0D, CC] in
398*8cd8120aSUlrich Weigand  def QPACI : StoreInherentS<"qpaci", 0xB28F, null_frag, 0>;
399*8cd8120aSUlrich Weigand
40003ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
40103ab2e2bSUlrich Weigand// Miscellaneous Instructions.
40203ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
40303ab2e2bSUlrich Weigand
40403ab2e2bSUlrich Weigand// Supervisor call.
40503ab2e2bSUlrich Weigandlet hasSideEffects = 1, isCall = 1, Defs = [CC] in
40603ab2e2bSUlrich Weigand  def SVC : SideEffectUnaryI<"svc", 0x0A, imm32zx8>;
40703ab2e2bSUlrich Weigand
40803ab2e2bSUlrich Weigand// Monitor call.
40903ab2e2bSUlrich Weigandlet hasSideEffects = 1, isCall = 1 in
41003ab2e2bSUlrich Weigand  def MC : SideEffectBinarySI<"mc", 0xAF, imm32zx8>;
41103ab2e2bSUlrich Weigand
41203ab2e2bSUlrich Weigand// Diagnose.
41303ab2e2bSUlrich Weigandlet hasSideEffects = 1, isCall = 1 in
41403ab2e2bSUlrich Weigand  def DIAG : SideEffectTernaryRS<"diag", 0x83, GR32, GR32>;
41503ab2e2bSUlrich Weigand
41603ab2e2bSUlrich Weigand// Trace.
41703ab2e2bSUlrich Weigandlet hasSideEffects = 1, mayLoad = 1 in {
41803ab2e2bSUlrich Weigand  def TRACE : SideEffectTernaryRS<"trace", 0x99, GR32, GR32>;
41903ab2e2bSUlrich Weigand  def TRACG : SideEffectTernaryRSY<"tracg", 0xEB0F, GR64, GR64>;
42003ab2e2bSUlrich Weigand}
42103ab2e2bSUlrich Weigand
42203ab2e2bSUlrich Weigand// Trap.
42303ab2e2bSUlrich Weigandlet hasSideEffects = 1 in {
42403ab2e2bSUlrich Weigand  def TRAP2 : SideEffectInherentE<"trap2", 0x01FF>;
42503ab2e2bSUlrich Weigand  def TRAP4 : SideEffectAddressS<"trap4", 0xB2FF, null_frag>;
42603ab2e2bSUlrich Weigand}
42703ab2e2bSUlrich Weigand
42803ab2e2bSUlrich Weigand// Signal processor.
42903ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
43003ab2e2bSUlrich Weigand  def SIGP : SideEffectTernaryRS<"sigp", 0xAE, GR64, GR64>;
43103ab2e2bSUlrich Weigand
43203ab2e2bSUlrich Weigand// Signal adapter.
43303ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R0D, R1D, R2D, R3D], Defs = [CC] in
43403ab2e2bSUlrich Weigand  def SIGA : SideEffectAddressS<"siga", 0xB274, null_frag>;
43503ab2e2bSUlrich Weigand
43603ab2e2bSUlrich Weigand// Start interpretive execution.
43703ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
43803ab2e2bSUlrich Weigand  def SIE : SideEffectUnaryS<"sie", 0xB214, null_frag, 0>;
43903ab2e2bSUlrich Weigand
44003ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
44103ab2e2bSUlrich Weigand// CPU-Measurement Facility Instructions (SA23-2260).
44203ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
44303ab2e2bSUlrich Weigand
44403ab2e2bSUlrich Weigand// Load program parameter
44503ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
44603ab2e2bSUlrich Weigand  def LPP : SideEffectUnaryS<"lpp", 0xB280, null_frag, 8>;
44703ab2e2bSUlrich Weigand
44803ab2e2bSUlrich Weigand// Extract coprocessor-group address.
44903ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
45003ab2e2bSUlrich Weigand  def ECPGA : UnaryRRE<"ecpga", 0xB2ED, null_frag, GR32, GR64>;
45103ab2e2bSUlrich Weigand
45203ab2e2bSUlrich Weigand// Extract CPU counter.
45303ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
45403ab2e2bSUlrich Weigand  def ECCTR : UnaryRRE<"ecctr", 0xB2E4, null_frag, GR64, GR64>;
45503ab2e2bSUlrich Weigand
45603ab2e2bSUlrich Weigand// Extract peripheral counter.
45703ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
45803ab2e2bSUlrich Weigand  def EPCTR : UnaryRRE<"epctr", 0xB2E5, null_frag, GR64, GR64>;
45903ab2e2bSUlrich Weigand
46003ab2e2bSUlrich Weigand// Load CPU-counter-set controls.
46103ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
46203ab2e2bSUlrich Weigand  def LCCTL : SideEffectUnaryS<"lcctl", 0xB284, null_frag, 8>;
46303ab2e2bSUlrich Weigand
46403ab2e2bSUlrich Weigand// Load peripheral-counter-set controls.
46503ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
46603ab2e2bSUlrich Weigand  def LPCTL : SideEffectUnaryS<"lpctl", 0xB285, null_frag, 8>;
46703ab2e2bSUlrich Weigand
46803ab2e2bSUlrich Weigand// Load sampling controls.
46903ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
47003ab2e2bSUlrich Weigand  def LSCTL : SideEffectUnaryS<"lsctl", 0xB287, null_frag, 0>;
47103ab2e2bSUlrich Weigand
47203ab2e2bSUlrich Weigand// Query sampling information.
47303ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
47403ab2e2bSUlrich Weigand  def QSI : StoreInherentS<"qsi", 0xB286, null_frag, 0>;
47503ab2e2bSUlrich Weigand
47603ab2e2bSUlrich Weigand// Query counter information.
47703ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
47803ab2e2bSUlrich Weigand  def QCTRI : StoreInherentS<"qctri", 0xB28E, null_frag, 0>;
47903ab2e2bSUlrich Weigand
48003ab2e2bSUlrich Weigand// Set CPU counter.
48103ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
48203ab2e2bSUlrich Weigand  def SCCTR : SideEffectBinaryRRE<"scctr", 0xB2E0, GR64, GR64>;
48303ab2e2bSUlrich Weigand
48403ab2e2bSUlrich Weigand// Set peripheral counter.
48503ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
48603ab2e2bSUlrich Weigand  def SPCTR : SideEffectBinaryRRE<"spctr", 0xB2E1, GR64, GR64>;
48703ab2e2bSUlrich Weigand
48803ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
48903ab2e2bSUlrich Weigand// I/O Instructions (Principles of Operation, Chapter 14).
49003ab2e2bSUlrich Weigand//===----------------------------------------------------------------------===//
49103ab2e2bSUlrich Weigand
49203ab2e2bSUlrich Weigand// Clear subchannel.
49303ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
49403ab2e2bSUlrich Weigand  def CSCH : SideEffectInherentS<"csch", 0xB230, null_frag>;
49503ab2e2bSUlrich Weigand
49603ab2e2bSUlrich Weigand// Halt subchannel.
49703ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
49803ab2e2bSUlrich Weigand  def HSCH : SideEffectInherentS<"hsch", 0xB231, null_frag>;
49903ab2e2bSUlrich Weigand
50003ab2e2bSUlrich Weigand// Modify subchannel.
50103ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
50203ab2e2bSUlrich Weigand  def MSCH : SideEffectUnaryS<"msch", 0xB232, null_frag, 0>;
50303ab2e2bSUlrich Weigand
50403ab2e2bSUlrich Weigand// Resume subchannel.
50503ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
50603ab2e2bSUlrich Weigand  def RSCH : SideEffectInherentS<"rsch", 0xB238, null_frag>;
50703ab2e2bSUlrich Weigand
50803ab2e2bSUlrich Weigand// Start subchannel.
50903ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
51003ab2e2bSUlrich Weigand  def SSCH : SideEffectUnaryS<"ssch", 0xB233, null_frag, 0>;
51103ab2e2bSUlrich Weigand
51203ab2e2bSUlrich Weigand// Store subchannel.
51303ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
51403ab2e2bSUlrich Weigand  def STSCH : StoreInherentS<"stsch", 0xB234, null_frag, 0>;
51503ab2e2bSUlrich Weigand
51603ab2e2bSUlrich Weigand// Test subchannel.
51703ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
51803ab2e2bSUlrich Weigand  def TSCH : StoreInherentS<"tsch", 0xB235, null_frag, 0>;
51903ab2e2bSUlrich Weigand
52003ab2e2bSUlrich Weigand// Cancel subchannel.
52103ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
52203ab2e2bSUlrich Weigand  def XSCH : SideEffectInherentS<"xsch", 0xB276, null_frag>;
52303ab2e2bSUlrich Weigand
52403ab2e2bSUlrich Weigand// Reset channel path.
52503ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
52603ab2e2bSUlrich Weigand  def RCHP : SideEffectInherentS<"rchp", 0xB23B, null_frag>;
52703ab2e2bSUlrich Weigand
52803ab2e2bSUlrich Weigand// Set channel monitor.
52903ab2e2bSUlrich Weigandlet hasSideEffects = 1, mayLoad = 1, Uses = [R1L, R2D] in
53003ab2e2bSUlrich Weigand  def SCHM : SideEffectInherentS<"schm", 0xB23C, null_frag>;
53103ab2e2bSUlrich Weigand
53203ab2e2bSUlrich Weigand// Store channel path status.
53303ab2e2bSUlrich Weigandlet hasSideEffects = 1 in
53403ab2e2bSUlrich Weigand  def STCPS : StoreInherentS<"stcps", 0xB23A, null_frag, 0>;
53503ab2e2bSUlrich Weigand
53603ab2e2bSUlrich Weigand// Store channel report word.
53703ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
53803ab2e2bSUlrich Weigand  def STCRW : StoreInherentS<"stcrw", 0xB239, null_frag, 0>;
53903ab2e2bSUlrich Weigand
54003ab2e2bSUlrich Weigand// Test pending interruption.
54103ab2e2bSUlrich Weigandlet hasSideEffects = 1, Defs = [CC] in
54203ab2e2bSUlrich Weigand  def TPI : StoreInherentS<"tpi", 0xB236, null_frag, 0>;
54303ab2e2bSUlrich Weigand
54403ab2e2bSUlrich Weigand// Set address limit.
54503ab2e2bSUlrich Weigandlet hasSideEffects = 1, Uses = [R1L] in
54603ab2e2bSUlrich Weigand  def SAL : SideEffectInherentS<"sal", 0xB237, null_frag>;
54703ab2e2bSUlrich Weigand
548