xref: /src/contrib/llvm-project/llvm/lib/Target/SystemZ/SystemZInstrSystem.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
19df3605dSDimitry Andric//==- SystemZInstrSystem.td - SystemZ system instructions -*- tblgen-*-----==//
29df3605dSDimitry Andric//
3e6d15924SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69df3605dSDimitry Andric//
79df3605dSDimitry Andric//===----------------------------------------------------------------------===//
89df3605dSDimitry Andric//
99df3605dSDimitry Andric// The instructions in this file implement SystemZ system-level instructions.
109df3605dSDimitry Andric// Most of these instructions are privileged or semi-privileged.  They are
119df3605dSDimitry Andric// not used for code generation, but are provided for use with the assembler
129df3605dSDimitry Andric// and disassembler only.
139df3605dSDimitry Andric//
149df3605dSDimitry Andric//===----------------------------------------------------------------------===//
159df3605dSDimitry Andric
169df3605dSDimitry Andric//===----------------------------------------------------------------------===//
179df3605dSDimitry Andric// Program-Status Word Instructions.
189df3605dSDimitry Andric//===----------------------------------------------------------------------===//
199df3605dSDimitry Andric
209df3605dSDimitry Andric// Extract PSW.
219df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [CC] in
229df3605dSDimitry Andric  def EPSW : InherentDualRRE<"epsw", 0xB98D, GR32>;
239df3605dSDimitry Andric
249df3605dSDimitry Andric// Load PSW (extended).
25044eb2f6SDimitry Andriclet hasSideEffects = 1, Defs = [CC] in {
269df3605dSDimitry Andric  def LPSW : SideEffectUnaryS<"lpsw", 0x8200, null_frag, 8>;
279df3605dSDimitry Andric  def LPSWE : SideEffectUnaryS<"lpswe", 0xB2B2, null_frag, 16>;
289df3605dSDimitry Andric}
29344a3780SDimitry Andriclet Predicates = [FeatureBEAREnhancement], hasSideEffects = 1, Defs = [CC] in
30344a3780SDimitry Andric  def LPSWEY : SideEffectUnarySIY<"lpswey", 0xEB71, 16>;
319df3605dSDimitry Andric
329df3605dSDimitry Andric// Insert PSW key.
339df3605dSDimitry Andriclet Uses = [R2L], Defs = [R2L] in
349df3605dSDimitry Andric  def IPK : SideEffectInherentS<"ipk", 0xB20B, null_frag>;
359df3605dSDimitry Andric
369df3605dSDimitry Andric// Set PSW key from address.
379df3605dSDimitry Andriclet hasSideEffects = 1 in
389df3605dSDimitry Andric  def SPKA : SideEffectAddressS<"spka", 0xB20A, null_frag>;
399df3605dSDimitry Andric
409df3605dSDimitry Andric// Set system mask.
41044eb2f6SDimitry Andriclet hasSideEffects = 1 in
429df3605dSDimitry Andric  def SSM : SideEffectUnaryS<"ssm", 0x8000, null_frag, 1>;
439df3605dSDimitry Andric
449df3605dSDimitry Andric// Store then AND/OR system mask.
459df3605dSDimitry Andriclet hasSideEffects = 1 in {
469df3605dSDimitry Andric  def STNSM : StoreSI<"stnsm", 0xAC, null_frag, imm32zx8>;
479df3605dSDimitry Andric  def STOSM : StoreSI<"stosm", 0xAD, null_frag, imm32zx8>;
489df3605dSDimitry Andric}
499df3605dSDimitry Andric
509df3605dSDimitry Andric// Insert address space control.
519df3605dSDimitry Andriclet hasSideEffects = 1 in
529df3605dSDimitry Andric  def IAC : InherentRRE<"iac", 0xB224, GR32, null_frag>;
539df3605dSDimitry Andric
549df3605dSDimitry Andric// Set address space control (fast).
559df3605dSDimitry Andriclet hasSideEffects = 1 in {
569df3605dSDimitry Andric  def SAC : SideEffectAddressS<"sac", 0xB219, null_frag>;
579df3605dSDimitry Andric  def SACF : SideEffectAddressS<"sacf", 0xB279, null_frag>;
589df3605dSDimitry Andric}
599df3605dSDimitry Andric
609df3605dSDimitry Andric//===----------------------------------------------------------------------===//
619df3605dSDimitry Andric// Control Register Instructions.
629df3605dSDimitry Andric//===----------------------------------------------------------------------===//
639df3605dSDimitry Andric
64044eb2f6SDimitry Andriclet hasSideEffects = 1 in {
659df3605dSDimitry Andric  // Load control.
669df3605dSDimitry Andric  def LCTL : LoadMultipleRS<"lctl", 0xB7, CR64>;
679df3605dSDimitry Andric  def LCTLG : LoadMultipleRSY<"lctlg", 0xEB2F, CR64>;
689df3605dSDimitry Andric
699df3605dSDimitry Andric  // Store control.
709df3605dSDimitry Andric  def STCTL : StoreMultipleRS<"stctl", 0xB6, CR64>;
719df3605dSDimitry Andric  def STCTG : StoreMultipleRSY<"stctg", 0xEB25, CR64>;
72044eb2f6SDimitry Andric}
739df3605dSDimitry Andric
749df3605dSDimitry Andric// Extract primary ASN (and instance).
759df3605dSDimitry Andriclet hasSideEffects = 1 in {
769df3605dSDimitry Andric  def EPAR : InherentRRE<"epar", 0xB226, GR32, null_frag>;
779df3605dSDimitry Andric  def EPAIR : InherentRRE<"epair", 0xB99A, GR64, null_frag>;
789df3605dSDimitry Andric}
799df3605dSDimitry Andric
809df3605dSDimitry Andric// Extract secondary ASN (and instance).
819df3605dSDimitry Andriclet hasSideEffects = 1 in {
829df3605dSDimitry Andric  def ESAR : InherentRRE<"esar", 0xB227, GR32, null_frag>;
839df3605dSDimitry Andric  def ESAIR : InherentRRE<"esair", 0xB99B, GR64, null_frag>;
849df3605dSDimitry Andric}
859df3605dSDimitry Andric
869df3605dSDimitry Andric// Set secondary ASN (and instance).
879df3605dSDimitry Andriclet hasSideEffects = 1 in {
889df3605dSDimitry Andric  def SSAR : SideEffectUnaryRRE<"ssar", 0xB225, GR32, null_frag>;
899df3605dSDimitry Andric  def SSAIR : SideEffectUnaryRRE<"ssair", 0xB99F, GR64, null_frag>;
909df3605dSDimitry Andric}
919df3605dSDimitry Andric
929df3605dSDimitry Andric// Extract and set extended authority.
939df3605dSDimitry Andriclet hasSideEffects = 1 in
949df3605dSDimitry Andric  def ESEA : UnaryTiedRRE<"esea", 0xB99D, GR32>;
959df3605dSDimitry Andric
969df3605dSDimitry Andric//===----------------------------------------------------------------------===//
979df3605dSDimitry Andric// Prefix-Register Instructions.
989df3605dSDimitry Andric//===----------------------------------------------------------------------===//
999df3605dSDimitry Andric
1009df3605dSDimitry Andric// Set prefix.
1019df3605dSDimitry Andriclet hasSideEffects = 1 in
1029df3605dSDimitry Andric  def SPX : SideEffectUnaryS<"spx", 0xB210, null_frag, 4>;
1039df3605dSDimitry Andric
1049df3605dSDimitry Andric// Store prefix.
1059df3605dSDimitry Andriclet hasSideEffects = 1 in
1069df3605dSDimitry Andric  def STPX : StoreInherentS<"stpx", 0xB211, null_frag, 4>;
1079df3605dSDimitry Andric
1089df3605dSDimitry Andric//===----------------------------------------------------------------------===//
109344a3780SDimitry Andric// Breaking-Event-Address-Register Instructions.
110344a3780SDimitry Andric//===----------------------------------------------------------------------===//
111344a3780SDimitry Andric
112344a3780SDimitry Andriclet Predicates = [FeatureBEAREnhancement] in {
113344a3780SDimitry Andric  // Load BEAR.
114344a3780SDimitry Andric  let hasSideEffects = 1 in
115344a3780SDimitry Andric    def LBEAR : SideEffectUnaryS<"lbear", 0xB200, null_frag, 8>;
116344a3780SDimitry Andric
117344a3780SDimitry Andric  // Store BEAR.
118344a3780SDimitry Andric  let hasSideEffects = 1 in
119344a3780SDimitry Andric    def STBEAR : StoreInherentS<"stbear", 0xB201, null_frag, 8>;
120344a3780SDimitry Andric}
121344a3780SDimitry Andric
122344a3780SDimitry Andric//===----------------------------------------------------------------------===//
1239df3605dSDimitry Andric// Storage-Key and Real Memory Instructions.
1249df3605dSDimitry Andric//===----------------------------------------------------------------------===//
1259df3605dSDimitry Andric
1269df3605dSDimitry Andric// Insert storage key extended.
1279df3605dSDimitry Andriclet hasSideEffects = 1 in
1289df3605dSDimitry Andric  def ISKE : BinaryRRE<"iske", 0xB229, null_frag, GR32, GR64>;
1299df3605dSDimitry Andric
1309df3605dSDimitry Andric// Insert virtual storage key.
1319df3605dSDimitry Andriclet hasSideEffects = 1 in
1329df3605dSDimitry Andric  def IVSK : BinaryRRE<"ivsk", 0xB223, null_frag, GR32, GR64>;
1339df3605dSDimitry Andric
1349df3605dSDimitry Andric// Set storage key extended.
1359df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
1369df3605dSDimitry Andric  defm SSKE : SideEffectTernaryRRFcOpt<"sske", 0xB22B, GR32, GR64>;
1379df3605dSDimitry Andric
1389df3605dSDimitry Andric// Reset reference bit extended.
1399df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
1409df3605dSDimitry Andric  def RRBE : SideEffectBinaryRRE<"rrbe", 0xB22A, GR32, GR64>;
1419df3605dSDimitry Andric
1429df3605dSDimitry Andric// Reset reference bits multiple.
1439df3605dSDimitry Andriclet Predicates = [FeatureResetReferenceBitsMultiple], hasSideEffects = 1 in
1449df3605dSDimitry Andric  def RRBM : UnaryRRE<"rrbm", 0xB9AE, null_frag, GR64, GR64>;
1459df3605dSDimitry Andric
14693c91e39SDimitry Andric// Insert reference bits multiple.
14793c91e39SDimitry Andriclet Predicates = [FeatureInsertReferenceBitsMultiple], hasSideEffects = 1 in
14893c91e39SDimitry Andric  def IRBM : UnaryRRE<"irbm", 0xB9AC, null_frag, GR64, GR64>;
14993c91e39SDimitry Andric
1509df3605dSDimitry Andric// Perform frame management function.
1519df3605dSDimitry Andriclet hasSideEffects = 1 in
1529df3605dSDimitry Andric  def PFMF : SideEffectBinaryMemRRE<"pfmf", 0xB9AF, GR32, GR64>;
1539df3605dSDimitry Andric
1549df3605dSDimitry Andric// Test block.
1559df3605dSDimitry Andriclet hasSideEffects = 1, mayStore = 1, Uses = [R0D], Defs = [R0D, CC] in
1569df3605dSDimitry Andric  def TB : SideEffectBinaryRRE<"tb", 0xB22C, GR64, GR64>;
1579df3605dSDimitry Andric
1589df3605dSDimitry Andric// Page in / out.
1599df3605dSDimitry Andriclet mayLoad = 1, mayStore = 1, Defs = [CC] in {
1609df3605dSDimitry Andric  def PGIN : SideEffectBinaryRRE<"pgin", 0xB22E, GR64, GR64>;
1619df3605dSDimitry Andric  def PGOUT : SideEffectBinaryRRE<"pgout", 0xB22F, GR64, GR64>;
1629df3605dSDimitry Andric}
1639df3605dSDimitry Andric
1649df3605dSDimitry Andric//===----------------------------------------------------------------------===//
1659df3605dSDimitry Andric// Dynamic-Address-Translation Instructions.
1669df3605dSDimitry Andric//===----------------------------------------------------------------------===//
1679df3605dSDimitry Andric
1689df3605dSDimitry Andric// Invalidate page table entry.
1699df3605dSDimitry Andriclet hasSideEffects = 1 in
1709df3605dSDimitry Andric  defm IPTE : SideEffectQuaternaryRRFaOptOpt<"ipte", 0xB221, GR64, GR32, GR32>;
1719df3605dSDimitry Andric
1729df3605dSDimitry Andric// Invalidate DAT table entry.
1739df3605dSDimitry Andriclet hasSideEffects = 1 in
1749df3605dSDimitry Andric  defm IDTE : SideEffectQuaternaryRRFbOpt<"idte", 0xB98E, GR64, GR64, GR64>;
1759df3605dSDimitry Andric
176344a3780SDimitry Andric// Reset DAT protection.
177344a3780SDimitry Andriclet Predicates = [FeatureResetDATProtection], hasSideEffects = 1 in
178344a3780SDimitry Andric  defm RDP : SideEffectQuaternaryRRFbOpt<"rdp", 0xB98B, GR64, GR64, GR64>;
179344a3780SDimitry Andric
1809df3605dSDimitry Andric// Compare and replace DAT table entry.
1819df3605dSDimitry Andriclet Predicates = [FeatureEnhancedDAT2], hasSideEffects = 1, Defs = [CC] in
1829df3605dSDimitry Andric  defm CRDTE : SideEffectQuaternaryRRFbOpt<"crdte", 0xB98F, GR128, GR128, GR64>;
1839df3605dSDimitry Andric
1849df3605dSDimitry Andric// Purge TLB.
1859df3605dSDimitry Andriclet hasSideEffects = 1 in
1869df3605dSDimitry Andric  def PTLB : SideEffectInherentS<"ptlb", 0xB20D, null_frag>;
1879df3605dSDimitry Andric
1889df3605dSDimitry Andric// Compare and swap and purge.
1899df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in {
1909df3605dSDimitry Andric  def CSP : CmpSwapRRE<"csp", 0xB250, GR128, GR64>;
1919df3605dSDimitry Andric  def CSPG : CmpSwapRRE<"cspg", 0xB98A, GR128, GR64>;
1929df3605dSDimitry Andric}
1939df3605dSDimitry Andric
1949df3605dSDimitry Andric// Load page-table-entry address.
1959df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
1969df3605dSDimitry Andric  def LPTEA : TernaryRRFb<"lptea", 0xB9AA, GR64, GR64, GR64>;
1979df3605dSDimitry Andric
1989df3605dSDimitry Andric// Load real address.
1999df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in {
2009df3605dSDimitry Andric  defm LRA : LoadAddressRXPair<"lra", 0xB1, 0xE313, null_frag>;
2019df3605dSDimitry Andric  def LRAG : LoadAddressRXY<"lrag", 0xE303, null_frag, laaddr20pair>;
2029df3605dSDimitry Andric}
2039df3605dSDimitry Andric
2049df3605dSDimitry Andric// Store real address.
2059df3605dSDimitry Andricdef STRAG : StoreSSE<"strag", 0xE502>;
2069df3605dSDimitry Andric
2079df3605dSDimitry Andric// Load using real address.
2089df3605dSDimitry Andriclet mayLoad = 1 in {
2099df3605dSDimitry Andric def LURA : UnaryRRE<"lura", 0xB24B, null_frag, GR32, GR64>;
2109df3605dSDimitry Andric def LURAG : UnaryRRE<"lurag", 0xB905, null_frag, GR64, GR64>;
2119df3605dSDimitry Andric}
2129df3605dSDimitry Andric
2139df3605dSDimitry Andric// Store using real address.
2149df3605dSDimitry Andriclet mayStore = 1 in {
2159df3605dSDimitry Andric def STURA : SideEffectBinaryRRE<"stura", 0xB246, GR32, GR64>;
2169df3605dSDimitry Andric def STURG : SideEffectBinaryRRE<"sturg", 0xB925, GR64, GR64>;
2179df3605dSDimitry Andric}
2189df3605dSDimitry Andric
2199df3605dSDimitry Andric// Test protection.
2209df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
2219df3605dSDimitry Andric  def TPROT : SideEffectBinarySSE<"tprot", 0xE501>;
2229df3605dSDimitry Andric
2239df3605dSDimitry Andric//===----------------------------------------------------------------------===//
2249df3605dSDimitry Andric// Memory-move Instructions.
2259df3605dSDimitry Andric//===----------------------------------------------------------------------===//
2269df3605dSDimitry Andric
2279df3605dSDimitry Andric// Move with key.
2289df3605dSDimitry Andriclet mayLoad = 1, mayStore = 1, Defs = [CC] in
2299df3605dSDimitry Andric  def MVCK : MemoryBinarySSd<"mvck", 0xD9, GR64>;
2309df3605dSDimitry Andric
2319df3605dSDimitry Andric// Move to primary / secondary.
2329df3605dSDimitry Andriclet mayLoad = 1, mayStore = 1, Defs = [CC] in {
2339df3605dSDimitry Andric  def MVCP : MemoryBinarySSd<"mvcp", 0xDA, GR64>;
2349df3605dSDimitry Andric  def MVCS : MemoryBinarySSd<"mvcs", 0xDB, GR64>;
2359df3605dSDimitry Andric}
2369df3605dSDimitry Andric
2379df3605dSDimitry Andric// Move with source / destination key.
2389df3605dSDimitry Andriclet mayLoad = 1, mayStore = 1, Uses = [R0L, R1L] in {
2399df3605dSDimitry Andric  def MVCSK : SideEffectBinarySSE<"mvcsk", 0xE50E>;
2409df3605dSDimitry Andric  def MVCDK : SideEffectBinarySSE<"mvcdk", 0xE50F>;
2419df3605dSDimitry Andric}
2429df3605dSDimitry Andric
2439df3605dSDimitry Andric// Move with optional specifications.
2449df3605dSDimitry Andriclet mayLoad = 1, mayStore = 1, Uses = [R0L] in
2459df3605dSDimitry Andric  def MVCOS : SideEffectTernarySSF<"mvcos", 0xC80, GR64>;
2469df3605dSDimitry Andric
2479df3605dSDimitry Andric// Move page.
2489df3605dSDimitry Andriclet mayLoad = 1, mayStore = 1, Uses = [R0L], Defs = [CC] in
2499df3605dSDimitry Andric  def MVPG : SideEffectBinaryRRE<"mvpg", 0xB254, GR64, GR64>;
2509df3605dSDimitry Andric
2519df3605dSDimitry Andric//===----------------------------------------------------------------------===//
2529df3605dSDimitry Andric// Address-Space Instructions.
2539df3605dSDimitry Andric//===----------------------------------------------------------------------===//
2549df3605dSDimitry Andric
2559df3605dSDimitry Andric// Load address space parameters.
2569df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
2579df3605dSDimitry Andric  def LASP : SideEffectBinarySSE<"lasp", 0xE500>;
2589df3605dSDimitry Andric
2599df3605dSDimitry Andric// Purge ALB.
2609df3605dSDimitry Andriclet hasSideEffects = 1 in
2619df3605dSDimitry Andric  def PALB : SideEffectInherentRRE<"palb", 0xB248>;
2629df3605dSDimitry Andric
2639df3605dSDimitry Andric// Program call.
2649df3605dSDimitry Andriclet hasSideEffects = 1 in
2659df3605dSDimitry Andric  def PC : SideEffectAddressS<"pc", 0xB218, null_frag>;
2669df3605dSDimitry Andric
2679df3605dSDimitry Andric// Program return.
2689df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
2699df3605dSDimitry Andric  def PR : SideEffectInherentE<"pr", 0x0101>;
2709df3605dSDimitry Andric
2719df3605dSDimitry Andric// Program transfer (with instance).
2729df3605dSDimitry Andriclet hasSideEffects = 1 in {
2739df3605dSDimitry Andric  def PT : SideEffectBinaryRRE<"pt", 0xB228, GR32, GR64>;
2749df3605dSDimitry Andric  def PTI : SideEffectBinaryRRE<"pti", 0xB99E, GR64, GR64>;
2759df3605dSDimitry Andric}
2769df3605dSDimitry Andric
2779df3605dSDimitry Andric// Resume program.
2789df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
2799df3605dSDimitry Andric  def RP : SideEffectAddressS<"rp", 0xB277, null_frag>;
2809df3605dSDimitry Andric
2819df3605dSDimitry Andric// Branch in subspace group.
2829df3605dSDimitry Andriclet hasSideEffects = 1 in
2839df3605dSDimitry Andric  def BSG : UnaryRRE<"bsg", 0xB258, null_frag, GR64, GR64>;
2849df3605dSDimitry Andric
2859df3605dSDimitry Andric// Branch and set authority.
2869df3605dSDimitry Andriclet hasSideEffects = 1 in
2879df3605dSDimitry Andric  def BSA : UnaryRRE<"bsa", 0xB25A, null_frag, GR64, GR64>;
2889df3605dSDimitry Andric
2899df3605dSDimitry Andric// Test access.
2909df3605dSDimitry Andriclet Defs = [CC] in
2919df3605dSDimitry Andric  def TAR : SideEffectBinaryRRE<"tar", 0xB24C, AR32, GR32>;
2929df3605dSDimitry Andric
2939df3605dSDimitry Andric//===----------------------------------------------------------------------===//
2949df3605dSDimitry Andric// Linkage-Stack Instructions.
2959df3605dSDimitry Andric//===----------------------------------------------------------------------===//
2969df3605dSDimitry Andric
2979df3605dSDimitry Andric// Branch and stack.
2989df3605dSDimitry Andriclet hasSideEffects = 1 in
2999df3605dSDimitry Andric  def BAKR : SideEffectBinaryRRE<"bakr", 0xB240, GR64, GR64>;
3009df3605dSDimitry Andric
3019df3605dSDimitry Andric// Extract stacked registers.
3029df3605dSDimitry Andriclet hasSideEffects = 1 in {
3039df3605dSDimitry Andric  def EREG : SideEffectBinaryRRE<"ereg", 0xB249, GR32, GR32>;
3049df3605dSDimitry Andric  def EREGG : SideEffectBinaryRRE<"eregg", 0xB90E, GR64, GR64>;
3059df3605dSDimitry Andric}
3069df3605dSDimitry Andric
3079df3605dSDimitry Andric// Extract stacked state.
3089df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
3099df3605dSDimitry Andric  def ESTA : UnaryRRE<"esta", 0xB24A, null_frag, GR128, GR32>;
3109df3605dSDimitry Andric
3119df3605dSDimitry Andric// Modify stacked state.
3129df3605dSDimitry Andriclet hasSideEffects = 1 in
3139df3605dSDimitry Andric  def MSTA : SideEffectUnaryRRE<"msta", 0xB247, GR128, null_frag>;
3149df3605dSDimitry Andric
3159df3605dSDimitry Andric//===----------------------------------------------------------------------===//
3169df3605dSDimitry Andric// Time-Related Instructions.
3179df3605dSDimitry Andric//===----------------------------------------------------------------------===//
3189df3605dSDimitry Andric
3199df3605dSDimitry Andric// Perform timing facility function.
3209df3605dSDimitry Andriclet hasSideEffects = 1, mayLoad = 1, Uses = [R0L, R1D], Defs = [CC] in
3219df3605dSDimitry Andric  def PTFF : SideEffectInherentE<"ptff", 0x0104>;
3229df3605dSDimitry Andric
3239df3605dSDimitry Andric// Set clock.
3249df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
3259df3605dSDimitry Andric  def SCK : SideEffectUnaryS<"sck", 0xB204, null_frag, 8>;
3269df3605dSDimitry Andric
3279df3605dSDimitry Andric// Set clock programmable field.
3289df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R0L] in
3299df3605dSDimitry Andric  def SCKPF : SideEffectInherentE<"sckpf", 0x0107>;
3309df3605dSDimitry Andric
3319df3605dSDimitry Andric// Set clock comparator.
3329df3605dSDimitry Andriclet hasSideEffects = 1 in
3339df3605dSDimitry Andric  def SCKC : SideEffectUnaryS<"sckc", 0xB206, null_frag, 8>;
3349df3605dSDimitry Andric
3359df3605dSDimitry Andric// Set CPU timer.
3369df3605dSDimitry Andriclet hasSideEffects = 1 in
3379df3605dSDimitry Andric  def SPT : SideEffectUnaryS<"spt", 0xB208, null_frag, 8>;
3389df3605dSDimitry Andric
3399df3605dSDimitry Andric// Store clock (fast / extended).
3409df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in {
3419df3605dSDimitry Andric  def STCK  : StoreInherentS<"stck",  0xB205, null_frag, 8>;
342ac9a064cSDimitry Andric  def STCKF : StoreInherentS<"stckf", 0xB27C, z_stckf, 8>;
3439df3605dSDimitry Andric  def STCKE : StoreInherentS<"stcke", 0xB278, null_frag, 16>;
3449df3605dSDimitry Andric}
3459df3605dSDimitry Andric
3469df3605dSDimitry Andric// Store clock comparator.
3479df3605dSDimitry Andriclet hasSideEffects = 1 in
3489df3605dSDimitry Andric  def STCKC : StoreInherentS<"stckc", 0xB207, null_frag, 8>;
3499df3605dSDimitry Andric
3509df3605dSDimitry Andric// Store CPU timer.
3519df3605dSDimitry Andriclet hasSideEffects = 1 in
3529df3605dSDimitry Andric  def STPT : StoreInherentS<"stpt", 0xB209, null_frag, 8>;
3539df3605dSDimitry Andric
3549df3605dSDimitry Andric//===----------------------------------------------------------------------===//
3559df3605dSDimitry Andric// CPU-Related Instructions.
3569df3605dSDimitry Andric//===----------------------------------------------------------------------===//
3579df3605dSDimitry Andric
3589df3605dSDimitry Andric// Store CPU address.
3599df3605dSDimitry Andriclet hasSideEffects = 1 in
3609df3605dSDimitry Andric  def STAP : StoreInherentS<"stap", 0xB212, null_frag, 2>;
3619df3605dSDimitry Andric
3629df3605dSDimitry Andric// Store CPU ID.
3639df3605dSDimitry Andriclet hasSideEffects = 1 in
3649df3605dSDimitry Andric  def STIDP : StoreInherentS<"stidp", 0xB202, null_frag, 8>;
3659df3605dSDimitry Andric
3669df3605dSDimitry Andric// Store system information.
3679df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R0L, R1L], Defs = [R0L, CC] in
3689df3605dSDimitry Andric  def STSI : StoreInherentS<"stsi", 0xB27D, null_frag, 0>;
3699df3605dSDimitry Andric
3709df3605dSDimitry Andric// Store facility list.
3719df3605dSDimitry Andriclet hasSideEffects = 1 in
3729df3605dSDimitry Andric  def STFL : StoreInherentS<"stfl", 0xB2B1, null_frag, 4>;
3739df3605dSDimitry Andric
3749df3605dSDimitry Andric// Store facility list extended.
3759df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R0D], Defs = [R0D, CC] in
3769df3605dSDimitry Andric  def STFLE : StoreInherentS<"stfle", 0xB2B0, null_frag, 0>;
3779df3605dSDimitry Andric
3789df3605dSDimitry Andric// Extract CPU attribute.
3799df3605dSDimitry Andriclet hasSideEffects = 1 in
3809df3605dSDimitry Andric  def ECAG : BinaryRSY<"ecag", 0xEB4C, null_frag, GR64>;
3819df3605dSDimitry Andric
3829df3605dSDimitry Andric// Extract CPU time.
3839df3605dSDimitry Andriclet hasSideEffects = 1, mayLoad = 1, Defs = [R0D, R1D] in
3849df3605dSDimitry Andric  def ECTG : SideEffectTernarySSF<"ectg", 0xC81, GR64>;
3859df3605dSDimitry Andric
3869df3605dSDimitry Andric// Perform topology function.
3879df3605dSDimitry Andriclet hasSideEffects = 1 in
3889df3605dSDimitry Andric  def PTF : UnaryTiedRRE<"ptf", 0xB9A2, GR64>;
3899df3605dSDimitry Andric
3909df3605dSDimitry Andric// Perform cryptographic key management operation.
3919df3605dSDimitry Andriclet Predicates = [FeatureMessageSecurityAssist3],
3929df3605dSDimitry Andric    hasSideEffects = 1, Uses = [R0L, R1D] in
3939df3605dSDimitry Andric  def PCKMO : SideEffectInherentRRE<"pckmo", 0xB928>;
3949df3605dSDimitry Andric
395344a3780SDimitry Andric// Query processor activity counter information.
396344a3780SDimitry Andriclet Predicates = [FeatureProcessorActivityInstrumentation],
397344a3780SDimitry Andric    hasSideEffects = 1, Uses = [R0D], Defs = [R0D, CC] in
398344a3780SDimitry Andric  def QPACI : StoreInherentS<"qpaci", 0xB28F, null_frag, 0>;
399344a3780SDimitry Andric
4009df3605dSDimitry Andric//===----------------------------------------------------------------------===//
4019df3605dSDimitry Andric// Miscellaneous Instructions.
4029df3605dSDimitry Andric//===----------------------------------------------------------------------===//
4039df3605dSDimitry Andric
4049df3605dSDimitry Andric// Supervisor call.
4059df3605dSDimitry Andriclet hasSideEffects = 1, isCall = 1, Defs = [CC] in
4069df3605dSDimitry Andric  def SVC : SideEffectUnaryI<"svc", 0x0A, imm32zx8>;
4079df3605dSDimitry Andric
4089df3605dSDimitry Andric// Monitor call.
4099df3605dSDimitry Andriclet hasSideEffects = 1, isCall = 1 in
4109df3605dSDimitry Andric  def MC : SideEffectBinarySI<"mc", 0xAF, imm32zx8>;
4119df3605dSDimitry Andric
4129df3605dSDimitry Andric// Diagnose.
4139df3605dSDimitry Andriclet hasSideEffects = 1, isCall = 1 in
4149df3605dSDimitry Andric  def DIAG : SideEffectTernaryRS<"diag", 0x83, GR32, GR32>;
4159df3605dSDimitry Andric
4169df3605dSDimitry Andric// Trace.
4179df3605dSDimitry Andriclet hasSideEffects = 1, mayLoad = 1 in {
4189df3605dSDimitry Andric  def TRACE : SideEffectTernaryRS<"trace", 0x99, GR32, GR32>;
4199df3605dSDimitry Andric  def TRACG : SideEffectTernaryRSY<"tracg", 0xEB0F, GR64, GR64>;
4209df3605dSDimitry Andric}
4219df3605dSDimitry Andric
4229df3605dSDimitry Andric// Trap.
4239df3605dSDimitry Andriclet hasSideEffects = 1 in {
4249df3605dSDimitry Andric  def TRAP2 : SideEffectInherentE<"trap2", 0x01FF>;
4259df3605dSDimitry Andric  def TRAP4 : SideEffectAddressS<"trap4", 0xB2FF, null_frag>;
4269df3605dSDimitry Andric}
4279df3605dSDimitry Andric
4289df3605dSDimitry Andric// Signal processor.
4299df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4309df3605dSDimitry Andric  def SIGP : SideEffectTernaryRS<"sigp", 0xAE, GR64, GR64>;
4319df3605dSDimitry Andric
4329df3605dSDimitry Andric// Signal adapter.
4339df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R0D, R1D, R2D, R3D], Defs = [CC] in
4349df3605dSDimitry Andric  def SIGA : SideEffectAddressS<"siga", 0xB274, null_frag>;
4359df3605dSDimitry Andric
4369df3605dSDimitry Andric// Start interpretive execution.
4379df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4389df3605dSDimitry Andric  def SIE : SideEffectUnaryS<"sie", 0xB214, null_frag, 0>;
4399df3605dSDimitry Andric
4409df3605dSDimitry Andric//===----------------------------------------------------------------------===//
4419df3605dSDimitry Andric// CPU-Measurement Facility Instructions (SA23-2260).
4429df3605dSDimitry Andric//===----------------------------------------------------------------------===//
4439df3605dSDimitry Andric
4449df3605dSDimitry Andric// Load program parameter
4459df3605dSDimitry Andriclet hasSideEffects = 1 in
4469df3605dSDimitry Andric  def LPP : SideEffectUnaryS<"lpp", 0xB280, null_frag, 8>;
4479df3605dSDimitry Andric
4489df3605dSDimitry Andric// Extract coprocessor-group address.
4499df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4509df3605dSDimitry Andric  def ECPGA : UnaryRRE<"ecpga", 0xB2ED, null_frag, GR32, GR64>;
4519df3605dSDimitry Andric
4529df3605dSDimitry Andric// Extract CPU counter.
4539df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4549df3605dSDimitry Andric  def ECCTR : UnaryRRE<"ecctr", 0xB2E4, null_frag, GR64, GR64>;
4559df3605dSDimitry Andric
4569df3605dSDimitry Andric// Extract peripheral counter.
4579df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4589df3605dSDimitry Andric  def EPCTR : UnaryRRE<"epctr", 0xB2E5, null_frag, GR64, GR64>;
4599df3605dSDimitry Andric
4609df3605dSDimitry Andric// Load CPU-counter-set controls.
4619df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4629df3605dSDimitry Andric  def LCCTL : SideEffectUnaryS<"lcctl", 0xB284, null_frag, 8>;
4639df3605dSDimitry Andric
4649df3605dSDimitry Andric// Load peripheral-counter-set controls.
4659df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4669df3605dSDimitry Andric  def LPCTL : SideEffectUnaryS<"lpctl", 0xB285, null_frag, 8>;
4679df3605dSDimitry Andric
4689df3605dSDimitry Andric// Load sampling controls.
4699df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4709df3605dSDimitry Andric  def LSCTL : SideEffectUnaryS<"lsctl", 0xB287, null_frag, 0>;
4719df3605dSDimitry Andric
4729df3605dSDimitry Andric// Query sampling information.
4739df3605dSDimitry Andriclet hasSideEffects = 1 in
4749df3605dSDimitry Andric  def QSI : StoreInherentS<"qsi", 0xB286, null_frag, 0>;
4759df3605dSDimitry Andric
4769df3605dSDimitry Andric// Query counter information.
4779df3605dSDimitry Andriclet hasSideEffects = 1 in
4789df3605dSDimitry Andric  def QCTRI : StoreInherentS<"qctri", 0xB28E, null_frag, 0>;
4799df3605dSDimitry Andric
4809df3605dSDimitry Andric// Set CPU counter.
4819df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4829df3605dSDimitry Andric  def SCCTR : SideEffectBinaryRRE<"scctr", 0xB2E0, GR64, GR64>;
4839df3605dSDimitry Andric
4849df3605dSDimitry Andric// Set peripheral counter.
4859df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
4869df3605dSDimitry Andric  def SPCTR : SideEffectBinaryRRE<"spctr", 0xB2E1, GR64, GR64>;
4879df3605dSDimitry Andric
4889df3605dSDimitry Andric//===----------------------------------------------------------------------===//
4899df3605dSDimitry Andric// I/O Instructions (Principles of Operation, Chapter 14).
4909df3605dSDimitry Andric//===----------------------------------------------------------------------===//
4919df3605dSDimitry Andric
4929df3605dSDimitry Andric// Clear subchannel.
4939df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
4949df3605dSDimitry Andric  def CSCH : SideEffectInherentS<"csch", 0xB230, null_frag>;
4959df3605dSDimitry Andric
4969df3605dSDimitry Andric// Halt subchannel.
4979df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
4989df3605dSDimitry Andric  def HSCH : SideEffectInherentS<"hsch", 0xB231, null_frag>;
4999df3605dSDimitry Andric
5009df3605dSDimitry Andric// Modify subchannel.
5019df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5029df3605dSDimitry Andric  def MSCH : SideEffectUnaryS<"msch", 0xB232, null_frag, 0>;
5039df3605dSDimitry Andric
5049df3605dSDimitry Andric// Resume subchannel.
5059df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5069df3605dSDimitry Andric  def RSCH : SideEffectInherentS<"rsch", 0xB238, null_frag>;
5079df3605dSDimitry Andric
5089df3605dSDimitry Andric// Start subchannel.
5099df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5109df3605dSDimitry Andric  def SSCH : SideEffectUnaryS<"ssch", 0xB233, null_frag, 0>;
5119df3605dSDimitry Andric
5129df3605dSDimitry Andric// Store subchannel.
5139df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5149df3605dSDimitry Andric  def STSCH : StoreInherentS<"stsch", 0xB234, null_frag, 0>;
5159df3605dSDimitry Andric
5169df3605dSDimitry Andric// Test subchannel.
5179df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5189df3605dSDimitry Andric  def TSCH : StoreInherentS<"tsch", 0xB235, null_frag, 0>;
5199df3605dSDimitry Andric
5209df3605dSDimitry Andric// Cancel subchannel.
5219df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5229df3605dSDimitry Andric  def XSCH : SideEffectInherentS<"xsch", 0xB276, null_frag>;
5239df3605dSDimitry Andric
5249df3605dSDimitry Andric// Reset channel path.
5259df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R1L], Defs = [CC] in
5269df3605dSDimitry Andric  def RCHP : SideEffectInherentS<"rchp", 0xB23B, null_frag>;
5279df3605dSDimitry Andric
5289df3605dSDimitry Andric// Set channel monitor.
5299df3605dSDimitry Andriclet hasSideEffects = 1, mayLoad = 1, Uses = [R1L, R2D] in
5309df3605dSDimitry Andric  def SCHM : SideEffectInherentS<"schm", 0xB23C, null_frag>;
5319df3605dSDimitry Andric
5329df3605dSDimitry Andric// Store channel path status.
5339df3605dSDimitry Andriclet hasSideEffects = 1 in
5349df3605dSDimitry Andric  def STCPS : StoreInherentS<"stcps", 0xB23A, null_frag, 0>;
5359df3605dSDimitry Andric
5369df3605dSDimitry Andric// Store channel report word.
5379df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
5389df3605dSDimitry Andric  def STCRW : StoreInherentS<"stcrw", 0xB239, null_frag, 0>;
5399df3605dSDimitry Andric
5409df3605dSDimitry Andric// Test pending interruption.
5419df3605dSDimitry Andriclet hasSideEffects = 1, Defs = [CC] in
5429df3605dSDimitry Andric  def TPI : StoreInherentS<"tpi", 0xB236, null_frag, 0>;
5439df3605dSDimitry Andric
544ac9a064cSDimitry Andric// Test pending external interruption.
545ac9a064cSDimitry Andriclet hasSideEffects = 1, Defs = [CC], Predicates = [FeatureTestPendingExternalInterruption] in
546ac9a064cSDimitry Andric  def TPEI : UnaryRRE<"tpei", 0xB9A1, null_frag, GR64, GR64>;
547ac9a064cSDimitry Andric
5489df3605dSDimitry Andric// Set address limit.
5499df3605dSDimitry Andriclet hasSideEffects = 1, Uses = [R1L] in
5509df3605dSDimitry Andric  def SAL : SideEffectInherentS<"sal", 0xB237, null_frag>;
5519df3605dSDimitry Andric
552