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