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