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