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