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