podman
5043 строки · 173.8 Кб
1// Based on cmd/internal/obj/ppc64/asm9.go.
2//
3// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
4// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
5// Portions Copyright © 1997-1999 Vita Nuova Limited
6// Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com)
7// Portions Copyright © 2004,2006 Bruce Ellis
8// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
9// Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others
10// Portions Copyright © 2009 The Go Authors. All rights reserved.
11//
12// Permission is hereby granted, free of charge, to any person obtaining a copy
13// of this software and associated documentation files (the "Software"), to deal
14// in the Software without restriction, including without limitation the rights
15// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16// copies of the Software, and to permit persons to whom the Software is
17// furnished to do so, subject to the following conditions:
18//
19// The above copyright notice and this permission notice shall be included in
20// all copies or substantial portions of the Software.
21//
22// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28// THE SOFTWARE.
29
30package s390x
31
32import (
33"github.com/twitchyliquid64/golang-asm/obj"
34"github.com/twitchyliquid64/golang-asm/objabi"
35"fmt"
36"log"
37"math"
38"sort"
39)
40
41// ctxtz holds state while assembling a single function.
42// Each function gets a fresh ctxtz.
43// This allows for multiple functions to be safely concurrently assembled.
44type ctxtz struct {
45ctxt *obj.Link
46newprog obj.ProgAlloc
47cursym *obj.LSym
48autosize int32
49instoffset int64
50pc int64
51}
52
53// instruction layout.
54const (
55funcAlign = 16
56)
57
58type Optab struct {
59as obj.As // opcode
60i uint8 // handler index
61a1 uint8 // From
62a2 uint8 // Reg
63a3 uint8 // RestArgs[0]
64a4 uint8 // RestArgs[1]
65a5 uint8 // RestArgs[2]
66a6 uint8 // To
67}
68
69var optab = []Optab{
70// zero-length instructions
71{i: 0, as: obj.ATEXT, a1: C_ADDR, a6: C_TEXTSIZE},
72{i: 0, as: obj.ATEXT, a1: C_ADDR, a3: C_LCON, a6: C_TEXTSIZE},
73{i: 0, as: obj.APCDATA, a1: C_LCON, a6: C_LCON},
74{i: 0, as: obj.AFUNCDATA, a1: C_SCON, a6: C_ADDR},
75{i: 0, as: obj.ANOP},
76{i: 0, as: obj.ANOP, a1: C_SAUTO},
77
78// move register
79{i: 1, as: AMOVD, a1: C_REG, a6: C_REG},
80{i: 1, as: AMOVB, a1: C_REG, a6: C_REG},
81{i: 1, as: AMOVBZ, a1: C_REG, a6: C_REG},
82{i: 1, as: AMOVW, a1: C_REG, a6: C_REG},
83{i: 1, as: AMOVWZ, a1: C_REG, a6: C_REG},
84{i: 1, as: AFMOVD, a1: C_FREG, a6: C_FREG},
85{i: 1, as: AMOVDBR, a1: C_REG, a6: C_REG},
86
87// load constant
88{i: 26, as: AMOVD, a1: C_LACON, a6: C_REG},
89{i: 26, as: AMOVW, a1: C_LACON, a6: C_REG},
90{i: 26, as: AMOVWZ, a1: C_LACON, a6: C_REG},
91{i: 3, as: AMOVD, a1: C_DCON, a6: C_REG},
92{i: 3, as: AMOVW, a1: C_DCON, a6: C_REG},
93{i: 3, as: AMOVWZ, a1: C_DCON, a6: C_REG},
94{i: 3, as: AMOVB, a1: C_DCON, a6: C_REG},
95{i: 3, as: AMOVBZ, a1: C_DCON, a6: C_REG},
96
97// store constant
98{i: 72, as: AMOVD, a1: C_SCON, a6: C_LAUTO},
99{i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LAUTO},
100{i: 72, as: AMOVW, a1: C_SCON, a6: C_LAUTO},
101{i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LAUTO},
102{i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LAUTO},
103{i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LAUTO},
104{i: 72, as: AMOVB, a1: C_SCON, a6: C_LAUTO},
105{i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LAUTO},
106{i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LAUTO},
107{i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LAUTO},
108{i: 72, as: AMOVD, a1: C_SCON, a6: C_LOREG},
109{i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LOREG},
110{i: 72, as: AMOVW, a1: C_SCON, a6: C_LOREG},
111{i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LOREG},
112{i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LOREG},
113{i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LOREG},
114{i: 72, as: AMOVB, a1: C_SCON, a6: C_LOREG},
115{i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LOREG},
116{i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LOREG},
117{i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LOREG},
118
119// store
120{i: 35, as: AMOVD, a1: C_REG, a6: C_LAUTO},
121{i: 35, as: AMOVW, a1: C_REG, a6: C_LAUTO},
122{i: 35, as: AMOVWZ, a1: C_REG, a6: C_LAUTO},
123{i: 35, as: AMOVBZ, a1: C_REG, a6: C_LAUTO},
124{i: 35, as: AMOVB, a1: C_REG, a6: C_LAUTO},
125{i: 35, as: AMOVDBR, a1: C_REG, a6: C_LAUTO},
126{i: 35, as: AMOVHBR, a1: C_REG, a6: C_LAUTO},
127{i: 35, as: AMOVD, a1: C_REG, a6: C_LOREG},
128{i: 35, as: AMOVW, a1: C_REG, a6: C_LOREG},
129{i: 35, as: AMOVWZ, a1: C_REG, a6: C_LOREG},
130{i: 35, as: AMOVBZ, a1: C_REG, a6: C_LOREG},
131{i: 35, as: AMOVB, a1: C_REG, a6: C_LOREG},
132{i: 35, as: AMOVDBR, a1: C_REG, a6: C_LOREG},
133{i: 35, as: AMOVHBR, a1: C_REG, a6: C_LOREG},
134{i: 74, as: AMOVD, a1: C_REG, a6: C_ADDR},
135{i: 74, as: AMOVW, a1: C_REG, a6: C_ADDR},
136{i: 74, as: AMOVWZ, a1: C_REG, a6: C_ADDR},
137{i: 74, as: AMOVBZ, a1: C_REG, a6: C_ADDR},
138{i: 74, as: AMOVB, a1: C_REG, a6: C_ADDR},
139
140// load
141{i: 36, as: AMOVD, a1: C_LAUTO, a6: C_REG},
142{i: 36, as: AMOVW, a1: C_LAUTO, a6: C_REG},
143{i: 36, as: AMOVWZ, a1: C_LAUTO, a6: C_REG},
144{i: 36, as: AMOVBZ, a1: C_LAUTO, a6: C_REG},
145{i: 36, as: AMOVB, a1: C_LAUTO, a6: C_REG},
146{i: 36, as: AMOVDBR, a1: C_LAUTO, a6: C_REG},
147{i: 36, as: AMOVHBR, a1: C_LAUTO, a6: C_REG},
148{i: 36, as: AMOVD, a1: C_LOREG, a6: C_REG},
149{i: 36, as: AMOVW, a1: C_LOREG, a6: C_REG},
150{i: 36, as: AMOVWZ, a1: C_LOREG, a6: C_REG},
151{i: 36, as: AMOVBZ, a1: C_LOREG, a6: C_REG},
152{i: 36, as: AMOVB, a1: C_LOREG, a6: C_REG},
153{i: 36, as: AMOVDBR, a1: C_LOREG, a6: C_REG},
154{i: 36, as: AMOVHBR, a1: C_LOREG, a6: C_REG},
155{i: 75, as: AMOVD, a1: C_ADDR, a6: C_REG},
156{i: 75, as: AMOVW, a1: C_ADDR, a6: C_REG},
157{i: 75, as: AMOVWZ, a1: C_ADDR, a6: C_REG},
158{i: 75, as: AMOVBZ, a1: C_ADDR, a6: C_REG},
159{i: 75, as: AMOVB, a1: C_ADDR, a6: C_REG},
160
161// interlocked load and op
162{i: 99, as: ALAAG, a1: C_REG, a2: C_REG, a6: C_LOREG},
163
164// integer arithmetic
165{i: 2, as: AADD, a1: C_REG, a2: C_REG, a6: C_REG},
166{i: 2, as: AADD, a1: C_REG, a6: C_REG},
167{i: 22, as: AADD, a1: C_LCON, a2: C_REG, a6: C_REG},
168{i: 22, as: AADD, a1: C_LCON, a6: C_REG},
169{i: 12, as: AADD, a1: C_LOREG, a6: C_REG},
170{i: 12, as: AADD, a1: C_LAUTO, a6: C_REG},
171{i: 21, as: ASUB, a1: C_LCON, a2: C_REG, a6: C_REG},
172{i: 21, as: ASUB, a1: C_LCON, a6: C_REG},
173{i: 12, as: ASUB, a1: C_LOREG, a6: C_REG},
174{i: 12, as: ASUB, a1: C_LAUTO, a6: C_REG},
175{i: 4, as: AMULHD, a1: C_REG, a6: C_REG},
176{i: 4, as: AMULHD, a1: C_REG, a2: C_REG, a6: C_REG},
177{i: 62, as: AMLGR, a1: C_REG, a6: C_REG},
178{i: 2, as: ADIVW, a1: C_REG, a2: C_REG, a6: C_REG},
179{i: 2, as: ADIVW, a1: C_REG, a6: C_REG},
180{i: 10, as: ASUB, a1: C_REG, a2: C_REG, a6: C_REG},
181{i: 10, as: ASUB, a1: C_REG, a6: C_REG},
182{i: 47, as: ANEG, a1: C_REG, a6: C_REG},
183{i: 47, as: ANEG, a6: C_REG},
184
185// integer logical
186{i: 6, as: AAND, a1: C_REG, a2: C_REG, a6: C_REG},
187{i: 6, as: AAND, a1: C_REG, a6: C_REG},
188{i: 23, as: AAND, a1: C_LCON, a6: C_REG},
189{i: 12, as: AAND, a1: C_LOREG, a6: C_REG},
190{i: 12, as: AAND, a1: C_LAUTO, a6: C_REG},
191{i: 6, as: AANDW, a1: C_REG, a2: C_REG, a6: C_REG},
192{i: 6, as: AANDW, a1: C_REG, a6: C_REG},
193{i: 24, as: AANDW, a1: C_LCON, a6: C_REG},
194{i: 12, as: AANDW, a1: C_LOREG, a6: C_REG},
195{i: 12, as: AANDW, a1: C_LAUTO, a6: C_REG},
196{i: 7, as: ASLD, a1: C_REG, a6: C_REG},
197{i: 7, as: ASLD, a1: C_REG, a2: C_REG, a6: C_REG},
198{i: 7, as: ASLD, a1: C_SCON, a2: C_REG, a6: C_REG},
199{i: 7, as: ASLD, a1: C_SCON, a6: C_REG},
200{i: 13, as: ARNSBG, a1: C_SCON, a3: C_SCON, a4: C_SCON, a5: C_REG, a6: C_REG},
201
202// compare and swap
203{i: 79, as: ACSG, a1: C_REG, a2: C_REG, a6: C_SOREG},
204
205// floating point
206{i: 32, as: AFADD, a1: C_FREG, a6: C_FREG},
207{i: 33, as: AFABS, a1: C_FREG, a6: C_FREG},
208{i: 33, as: AFABS, a6: C_FREG},
209{i: 34, as: AFMADD, a1: C_FREG, a2: C_FREG, a6: C_FREG},
210{i: 32, as: AFMUL, a1: C_FREG, a6: C_FREG},
211{i: 36, as: AFMOVD, a1: C_LAUTO, a6: C_FREG},
212{i: 36, as: AFMOVD, a1: C_LOREG, a6: C_FREG},
213{i: 75, as: AFMOVD, a1: C_ADDR, a6: C_FREG},
214{i: 35, as: AFMOVD, a1: C_FREG, a6: C_LAUTO},
215{i: 35, as: AFMOVD, a1: C_FREG, a6: C_LOREG},
216{i: 74, as: AFMOVD, a1: C_FREG, a6: C_ADDR},
217{i: 67, as: AFMOVD, a1: C_ZCON, a6: C_FREG},
218{i: 81, as: ALDGR, a1: C_REG, a6: C_FREG},
219{i: 81, as: ALGDR, a1: C_FREG, a6: C_REG},
220{i: 82, as: ACEFBRA, a1: C_REG, a6: C_FREG},
221{i: 83, as: ACFEBRA, a1: C_FREG, a6: C_REG},
222{i: 48, as: AFIEBR, a1: C_SCON, a2: C_FREG, a6: C_FREG},
223{i: 49, as: ACPSDR, a1: C_FREG, a2: C_FREG, a6: C_FREG},
224{i: 50, as: ALTDBR, a1: C_FREG, a6: C_FREG},
225{i: 51, as: ATCDB, a1: C_FREG, a6: C_SCON},
226
227// load symbol address (plus offset)
228{i: 19, as: AMOVD, a1: C_SYMADDR, a6: C_REG},
229{i: 93, as: AMOVD, a1: C_GOTADDR, a6: C_REG},
230{i: 94, as: AMOVD, a1: C_TLS_LE, a6: C_REG},
231{i: 95, as: AMOVD, a1: C_TLS_IE, a6: C_REG},
232
233// system call
234{i: 5, as: ASYSCALL},
235{i: 77, as: ASYSCALL, a1: C_SCON},
236
237// branch
238{i: 16, as: ABEQ, a6: C_SBRA},
239{i: 16, as: ABRC, a1: C_SCON, a6: C_SBRA},
240{i: 11, as: ABR, a6: C_LBRA},
241{i: 16, as: ABC, a1: C_SCON, a2: C_REG, a6: C_LBRA},
242{i: 18, as: ABR, a6: C_REG},
243{i: 18, as: ABR, a1: C_REG, a6: C_REG},
244{i: 15, as: ABR, a6: C_ZOREG},
245{i: 15, as: ABC, a6: C_ZOREG},
246
247// compare and branch
248{i: 89, as: ACGRJ, a1: C_SCON, a2: C_REG, a3: C_REG, a6: C_SBRA},
249{i: 89, as: ACMPBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA},
250{i: 89, as: ACLGRJ, a1: C_SCON, a2: C_REG, a3: C_REG, a6: C_SBRA},
251{i: 89, as: ACMPUBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA},
252{i: 90, as: ACGIJ, a1: C_SCON, a2: C_REG, a3: C_ADDCON, a6: C_SBRA},
253{i: 90, as: ACGIJ, a1: C_SCON, a2: C_REG, a3: C_SCON, a6: C_SBRA},
254{i: 90, as: ACMPBEQ, a1: C_REG, a3: C_ADDCON, a6: C_SBRA},
255{i: 90, as: ACMPBEQ, a1: C_REG, a3: C_SCON, a6: C_SBRA},
256{i: 90, as: ACLGIJ, a1: C_SCON, a2: C_REG, a3: C_ADDCON, a6: C_SBRA},
257{i: 90, as: ACMPUBEQ, a1: C_REG, a3: C_ANDCON, a6: C_SBRA},
258
259// branch on count
260{i: 41, as: ABRCT, a1: C_REG, a6: C_SBRA},
261{i: 41, as: ABRCTG, a1: C_REG, a6: C_SBRA},
262
263// move on condition
264{i: 17, as: AMOVDEQ, a1: C_REG, a6: C_REG},
265
266// load on condition
267{i: 25, as: ALOCGR, a1: C_SCON, a2: C_REG, a6: C_REG},
268
269// find leftmost one
270{i: 8, as: AFLOGR, a1: C_REG, a6: C_REG},
271
272// population count
273{i: 9, as: APOPCNT, a1: C_REG, a6: C_REG},
274
275// compare
276{i: 70, as: ACMP, a1: C_REG, a6: C_REG},
277{i: 71, as: ACMP, a1: C_REG, a6: C_LCON},
278{i: 70, as: ACMPU, a1: C_REG, a6: C_REG},
279{i: 71, as: ACMPU, a1: C_REG, a6: C_LCON},
280{i: 70, as: AFCMPO, a1: C_FREG, a6: C_FREG},
281{i: 70, as: AFCMPO, a1: C_FREG, a2: C_REG, a6: C_FREG},
282
283// test under mask
284{i: 91, as: ATMHH, a1: C_REG, a6: C_ANDCON},
285
286// insert program mask
287{i: 92, as: AIPM, a1: C_REG},
288
289// set program mask
290{i: 76, as: ASPM, a1: C_REG},
291
292// 32-bit access registers
293{i: 68, as: AMOVW, a1: C_AREG, a6: C_REG},
294{i: 68, as: AMOVWZ, a1: C_AREG, a6: C_REG},
295{i: 69, as: AMOVW, a1: C_REG, a6: C_AREG},
296{i: 69, as: AMOVWZ, a1: C_REG, a6: C_AREG},
297
298// macros
299{i: 96, as: ACLEAR, a1: C_LCON, a6: C_LOREG},
300{i: 96, as: ACLEAR, a1: C_LCON, a6: C_LAUTO},
301
302// load/store multiple
303{i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LOREG},
304{i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LAUTO},
305{i: 98, as: ALMG, a1: C_LOREG, a2: C_REG, a6: C_REG},
306{i: 98, as: ALMG, a1: C_LAUTO, a2: C_REG, a6: C_REG},
307
308// bytes
309{i: 40, as: ABYTE, a1: C_SCON},
310{i: 40, as: AWORD, a1: C_LCON},
311{i: 31, as: ADWORD, a1: C_LCON},
312{i: 31, as: ADWORD, a1: C_DCON},
313
314// fast synchronization
315{i: 80, as: ASYNC},
316
317// store clock
318{i: 88, as: ASTCK, a6: C_SAUTO},
319{i: 88, as: ASTCK, a6: C_SOREG},
320
321// storage and storage
322{i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LOREG},
323{i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LAUTO},
324{i: 84, as: AMVC, a1: C_SCON, a3: C_LAUTO, a6: C_LAUTO},
325
326// address
327{i: 85, as: ALARL, a1: C_LCON, a6: C_REG},
328{i: 85, as: ALARL, a1: C_SYMADDR, a6: C_REG},
329{i: 86, as: ALA, a1: C_SOREG, a6: C_REG},
330{i: 86, as: ALA, a1: C_SAUTO, a6: C_REG},
331{i: 87, as: AEXRL, a1: C_SYMADDR, a6: C_REG},
332
333// undefined (deliberate illegal instruction)
334{i: 78, as: obj.AUNDEF},
335
336// 2 byte no-operation
337{i: 66, as: ANOPH},
338
339// vector instructions
340
341// VRX store
342{i: 100, as: AVST, a1: C_VREG, a6: C_SOREG},
343{i: 100, as: AVST, a1: C_VREG, a6: C_SAUTO},
344{i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG},
345{i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO},
346
347// VRX load
348{i: 101, as: AVL, a1: C_SOREG, a6: C_VREG},
349{i: 101, as: AVL, a1: C_SAUTO, a6: C_VREG},
350{i: 101, as: AVLEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG},
351{i: 101, as: AVLEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG},
352
353// VRV scatter
354{i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG},
355{i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO},
356
357// VRV gather
358{i: 103, as: AVGEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG},
359{i: 103, as: AVGEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG},
360
361// VRS element shift/rotate and load gr to/from vr element
362{i: 104, as: AVESLG, a1: C_SCON, a2: C_VREG, a6: C_VREG},
363{i: 104, as: AVESLG, a1: C_REG, a2: C_VREG, a6: C_VREG},
364{i: 104, as: AVESLG, a1: C_SCON, a6: C_VREG},
365{i: 104, as: AVESLG, a1: C_REG, a6: C_VREG},
366{i: 104, as: AVLGVG, a1: C_SCON, a2: C_VREG, a6: C_REG},
367{i: 104, as: AVLGVG, a1: C_REG, a2: C_VREG, a6: C_REG},
368{i: 104, as: AVLVGG, a1: C_SCON, a2: C_REG, a6: C_VREG},
369{i: 104, as: AVLVGG, a1: C_REG, a2: C_REG, a6: C_VREG},
370
371// VRS store multiple
372{i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SOREG},
373{i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SAUTO},
374
375// VRS load multiple
376{i: 106, as: AVLM, a1: C_SOREG, a2: C_VREG, a6: C_VREG},
377{i: 106, as: AVLM, a1: C_SAUTO, a2: C_VREG, a6: C_VREG},
378
379// VRS store with length
380{i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SOREG},
381{i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SAUTO},
382
383// VRS load with length
384{i: 108, as: AVLL, a1: C_REG, a3: C_SOREG, a6: C_VREG},
385{i: 108, as: AVLL, a1: C_REG, a3: C_SAUTO, a6: C_VREG},
386
387// VRI-a
388{i: 109, as: AVGBM, a1: C_ANDCON, a6: C_VREG},
389{i: 109, as: AVZERO, a6: C_VREG},
390{i: 109, as: AVREPIG, a1: C_ADDCON, a6: C_VREG},
391{i: 109, as: AVREPIG, a1: C_SCON, a6: C_VREG},
392{i: 109, as: AVLEIG, a1: C_SCON, a3: C_ADDCON, a6: C_VREG},
393{i: 109, as: AVLEIG, a1: C_SCON, a3: C_SCON, a6: C_VREG},
394
395// VRI-b generate mask
396{i: 110, as: AVGMG, a1: C_SCON, a3: C_SCON, a6: C_VREG},
397
398// VRI-c replicate
399{i: 111, as: AVREPG, a1: C_UCON, a2: C_VREG, a6: C_VREG},
400
401// VRI-d element rotate and insert under mask and
402// shift left double by byte
403{i: 112, as: AVERIMG, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
404{i: 112, as: AVSLDB, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
405
406// VRI-d fp test data class immediate
407{i: 113, as: AVFTCIDB, a1: C_SCON, a2: C_VREG, a6: C_VREG},
408
409// VRR-a load reg
410{i: 114, as: AVLR, a1: C_VREG, a6: C_VREG},
411
412// VRR-a compare
413{i: 115, as: AVECG, a1: C_VREG, a6: C_VREG},
414
415// VRR-b
416{i: 117, as: AVCEQG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
417{i: 117, as: AVFAEF, a1: C_VREG, a2: C_VREG, a6: C_VREG},
418{i: 117, as: AVPKSG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
419
420// VRR-c
421{i: 118, as: AVAQ, a1: C_VREG, a2: C_VREG, a6: C_VREG},
422{i: 118, as: AVAQ, a1: C_VREG, a6: C_VREG},
423{i: 118, as: AVNOT, a1: C_VREG, a6: C_VREG},
424{i: 123, as: AVPDI, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
425
426// VRR-c shifts
427{i: 119, as: AVERLLVG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
428{i: 119, as: AVERLLVG, a1: C_VREG, a6: C_VREG},
429
430// VRR-d
431{i: 120, as: AVACQ, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
432
433// VRR-e
434{i: 121, as: AVSEL, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
435
436// VRR-f
437{i: 122, as: AVLVGP, a1: C_REG, a2: C_REG, a6: C_VREG},
438}
439
440var oprange [ALAST & obj.AMask][]Optab
441
442var xcmp [C_NCLASS][C_NCLASS]bool
443
444func spanz(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
445if ctxt.Retpoline {
446ctxt.Diag("-spectre=ret not supported on s390x")
447ctxt.Retpoline = false // don't keep printing
448}
449
450p := cursym.Func.Text
451if p == nil || p.Link == nil { // handle external functions and ELF section symbols
452return
453}
454
455if oprange[AORW&obj.AMask] == nil {
456ctxt.Diag("s390x ops not initialized, call s390x.buildop first")
457}
458
459c := ctxtz{ctxt: ctxt, newprog: newprog, cursym: cursym, autosize: int32(p.To.Offset)}
460
461buffer := make([]byte, 0)
462changed := true
463loop := 0
464for changed {
465if loop > 100 {
466c.ctxt.Diag("stuck in spanz loop")
467break
468}
469changed = false
470buffer = buffer[:0]
471c.cursym.R = make([]obj.Reloc, 0)
472for p := c.cursym.Func.Text; p != nil; p = p.Link {
473pc := int64(len(buffer))
474if pc != p.Pc {
475changed = true
476}
477p.Pc = pc
478c.pc = p.Pc
479c.asmout(p, &buffer)
480if pc == int64(len(buffer)) {
481switch p.As {
482case obj.ANOP, obj.AFUNCDATA, obj.APCDATA, obj.ATEXT:
483// ok
484default:
485c.ctxt.Diag("zero-width instruction\n%v", p)
486}
487}
488}
489loop++
490}
491
492c.cursym.Size = int64(len(buffer))
493if c.cursym.Size%funcAlign != 0 {
494c.cursym.Size += funcAlign - (c.cursym.Size % funcAlign)
495}
496c.cursym.Grow(c.cursym.Size)
497copy(c.cursym.P, buffer)
498
499// Mark nonpreemptible instruction sequences.
500// We use REGTMP as a scratch register during call injection,
501// so instruction sequences that use REGTMP are unsafe to
502// preempt asynchronously.
503obj.MarkUnsafePoints(c.ctxt, c.cursym.Func.Text, c.newprog, c.isUnsafePoint, nil)
504}
505
506// Return whether p is an unsafe point.
507func (c *ctxtz) isUnsafePoint(p *obj.Prog) bool {
508if p.From.Reg == REGTMP || p.To.Reg == REGTMP || p.Reg == REGTMP {
509return true
510}
511for _, a := range p.RestArgs {
512if a.Reg == REGTMP {
513return true
514}
515}
516return p.Mark&USETMP != 0
517}
518
519func isint32(v int64) bool {
520return int64(int32(v)) == v
521}
522
523func isuint32(v uint64) bool {
524return uint64(uint32(v)) == v
525}
526
527func (c *ctxtz) aclass(a *obj.Addr) int {
528switch a.Type {
529case obj.TYPE_NONE:
530return C_NONE
531
532case obj.TYPE_REG:
533if REG_R0 <= a.Reg && a.Reg <= REG_R15 {
534return C_REG
535}
536if REG_F0 <= a.Reg && a.Reg <= REG_F15 {
537return C_FREG
538}
539if REG_AR0 <= a.Reg && a.Reg <= REG_AR15 {
540return C_AREG
541}
542if REG_V0 <= a.Reg && a.Reg <= REG_V31 {
543return C_VREG
544}
545return C_GOK
546
547case obj.TYPE_MEM:
548switch a.Name {
549case obj.NAME_EXTERN,
550obj.NAME_STATIC:
551if a.Sym == nil {
552// must have a symbol
553break
554}
555c.instoffset = a.Offset
556if a.Sym.Type == objabi.STLSBSS {
557if c.ctxt.Flag_shared {
558return C_TLS_IE // initial exec model
559}
560return C_TLS_LE // local exec model
561}
562return C_ADDR
563
564case obj.NAME_GOTREF:
565return C_GOTADDR
566
567case obj.NAME_AUTO:
568if a.Reg == REGSP {
569// unset base register for better printing, since
570// a.Offset is still relative to pseudo-SP.
571a.Reg = obj.REG_NONE
572}
573c.instoffset = int64(c.autosize) + a.Offset
574if c.instoffset >= -BIG && c.instoffset < BIG {
575return C_SAUTO
576}
577return C_LAUTO
578
579case obj.NAME_PARAM:
580if a.Reg == REGSP {
581// unset base register for better printing, since
582// a.Offset is still relative to pseudo-FP.
583a.Reg = obj.REG_NONE
584}
585c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
586if c.instoffset >= -BIG && c.instoffset < BIG {
587return C_SAUTO
588}
589return C_LAUTO
590
591case obj.NAME_NONE:
592c.instoffset = a.Offset
593if c.instoffset == 0 {
594return C_ZOREG
595}
596if c.instoffset >= -BIG && c.instoffset < BIG {
597return C_SOREG
598}
599return C_LOREG
600}
601
602return C_GOK
603
604case obj.TYPE_TEXTSIZE:
605return C_TEXTSIZE
606
607case obj.TYPE_FCONST:
608if f64, ok := a.Val.(float64); ok && math.Float64bits(f64) == 0 {
609return C_ZCON
610}
611c.ctxt.Diag("cannot handle the floating point constant %v", a.Val)
612
613case obj.TYPE_CONST,
614obj.TYPE_ADDR:
615switch a.Name {
616case obj.NAME_NONE:
617c.instoffset = a.Offset
618if a.Reg != 0 {
619if -BIG <= c.instoffset && c.instoffset <= BIG {
620return C_SACON
621}
622if isint32(c.instoffset) {
623return C_LACON
624}
625return C_DACON
626}
627
628case obj.NAME_EXTERN,
629obj.NAME_STATIC:
630s := a.Sym
631if s == nil {
632return C_GOK
633}
634c.instoffset = a.Offset
635
636return C_SYMADDR
637
638case obj.NAME_AUTO:
639if a.Reg == REGSP {
640// unset base register for better printing, since
641// a.Offset is still relative to pseudo-SP.
642a.Reg = obj.REG_NONE
643}
644c.instoffset = int64(c.autosize) + a.Offset
645if c.instoffset >= -BIG && c.instoffset < BIG {
646return C_SACON
647}
648return C_LACON
649
650case obj.NAME_PARAM:
651if a.Reg == REGSP {
652// unset base register for better printing, since
653// a.Offset is still relative to pseudo-FP.
654a.Reg = obj.REG_NONE
655}
656c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
657if c.instoffset >= -BIG && c.instoffset < BIG {
658return C_SACON
659}
660return C_LACON
661
662default:
663return C_GOK
664}
665
666if c.instoffset == 0 {
667return C_ZCON
668}
669if c.instoffset >= 0 {
670if c.instoffset <= 0x7fff {
671return C_SCON
672}
673if c.instoffset <= 0xffff {
674return C_ANDCON
675}
676if c.instoffset&0xffff == 0 && isuint32(uint64(c.instoffset)) { /* && (instoffset & (1<<31)) == 0) */
677return C_UCON
678}
679if isint32(c.instoffset) || isuint32(uint64(c.instoffset)) {
680return C_LCON
681}
682return C_DCON
683}
684
685if c.instoffset >= -0x8000 {
686return C_ADDCON
687}
688if c.instoffset&0xffff == 0 && isint32(c.instoffset) {
689return C_UCON
690}
691if isint32(c.instoffset) {
692return C_LCON
693}
694return C_DCON
695
696case obj.TYPE_BRANCH:
697return C_SBRA
698}
699
700return C_GOK
701}
702
703func (c *ctxtz) oplook(p *obj.Prog) *Optab {
704// Return cached optab entry if available.
705if p.Optab != 0 {
706return &optab[p.Optab-1]
707}
708if len(p.RestArgs) > 3 {
709c.ctxt.Diag("too many RestArgs: got %v, maximum is 3\n", len(p.RestArgs))
710return nil
711}
712
713// Initialize classes for all arguments.
714p.From.Class = int8(c.aclass(&p.From) + 1)
715p.To.Class = int8(c.aclass(&p.To) + 1)
716for i := range p.RestArgs {
717p.RestArgs[i].Class = int8(c.aclass(&p.RestArgs[i]) + 1)
718}
719
720// Mirrors the argument list in Optab.
721args := [...]int8{
722p.From.Class - 1,
723C_NONE, // p.Reg
724C_NONE, // p.RestArgs[0]
725C_NONE, // p.RestArgs[1]
726C_NONE, // p.RestArgs[2]
727p.To.Class - 1,
728}
729// Fill in argument class for p.Reg.
730switch {
731case REG_R0 <= p.Reg && p.Reg <= REG_R15:
732args[1] = C_REG
733case REG_V0 <= p.Reg && p.Reg <= REG_V31:
734args[1] = C_VREG
735case REG_F0 <= p.Reg && p.Reg <= REG_F15:
736args[1] = C_FREG
737case REG_AR0 <= p.Reg && p.Reg <= REG_AR15:
738args[1] = C_AREG
739}
740// Fill in argument classes for p.RestArgs.
741for i, a := range p.RestArgs {
742args[2+i] = a.Class - 1
743}
744
745// Lookup op in optab.
746ops := oprange[p.As&obj.AMask]
747cmp := [len(args)]*[C_NCLASS]bool{}
748for i := range cmp {
749cmp[i] = &xcmp[args[i]]
750}
751for i := range ops {
752op := &ops[i]
753if cmp[0][op.a1] && cmp[1][op.a2] &&
754cmp[2][op.a3] && cmp[3][op.a4] &&
755cmp[4][op.a5] && cmp[5][op.a6] {
756p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
757return op
758}
759}
760
761// Cannot find a case; abort.
762s := ""
763for _, a := range args {
764s += fmt.Sprintf(" %v", DRconv(int(a)))
765}
766c.ctxt.Diag("illegal combination %v%v\n", p.As, s)
767c.ctxt.Diag("prog: %v\n", p)
768return nil
769}
770
771func cmp(a int, b int) bool {
772if a == b {
773return true
774}
775switch a {
776case C_DCON:
777if b == C_LCON {
778return true
779}
780fallthrough
781case C_LCON:
782if b == C_ZCON || b == C_SCON || b == C_UCON || b == C_ADDCON || b == C_ANDCON {
783return true
784}
785
786case C_ADDCON:
787if b == C_ZCON || b == C_SCON {
788return true
789}
790
791case C_ANDCON:
792if b == C_ZCON || b == C_SCON {
793return true
794}
795
796case C_UCON:
797if b == C_ZCON || b == C_SCON {
798return true
799}
800
801case C_SCON:
802if b == C_ZCON {
803return true
804}
805
806case C_LACON:
807if b == C_SACON {
808return true
809}
810
811case C_LBRA:
812if b == C_SBRA {
813return true
814}
815
816case C_LAUTO:
817if b == C_SAUTO {
818return true
819}
820
821case C_LOREG:
822if b == C_ZOREG || b == C_SOREG {
823return true
824}
825
826case C_SOREG:
827if b == C_ZOREG {
828return true
829}
830
831case C_ANY:
832return true
833}
834
835return false
836}
837
838type ocmp []Optab
839
840func (x ocmp) Len() int {
841return len(x)
842}
843
844func (x ocmp) Swap(i, j int) {
845x[i], x[j] = x[j], x[i]
846}
847
848func (x ocmp) Less(i, j int) bool {
849p1 := &x[i]
850p2 := &x[j]
851n := int(p1.as) - int(p2.as)
852if n != 0 {
853return n < 0
854}
855n = int(p1.a1) - int(p2.a1)
856if n != 0 {
857return n < 0
858}
859n = int(p1.a2) - int(p2.a2)
860if n != 0 {
861return n < 0
862}
863n = int(p1.a3) - int(p2.a3)
864if n != 0 {
865return n < 0
866}
867n = int(p1.a4) - int(p2.a4)
868if n != 0 {
869return n < 0
870}
871return false
872}
873func opset(a, b obj.As) {
874oprange[a&obj.AMask] = oprange[b&obj.AMask]
875}
876
877func buildop(ctxt *obj.Link) {
878if oprange[AORW&obj.AMask] != nil {
879// Already initialized; stop now.
880// This happens in the cmd/asm tests,
881// each of which re-initializes the arch.
882return
883}
884
885for i := 0; i < C_NCLASS; i++ {
886for n := 0; n < C_NCLASS; n++ {
887if cmp(n, i) {
888xcmp[i][n] = true
889}
890}
891}
892sort.Sort(ocmp(optab))
893for i := 0; i < len(optab); i++ {
894r := optab[i].as
895start := i
896for ; i+1 < len(optab); i++ {
897if optab[i+1].as != r {
898break
899}
900}
901oprange[r&obj.AMask] = optab[start : i+1]
902
903// opset() aliases optab ranges for similar instructions, to reduce the number of optabs in the array.
904// oprange[] is used by oplook() to find the Optab entry that applies to a given Prog.
905switch r {
906case AADD:
907opset(AADDC, r)
908opset(AADDW, r)
909opset(AADDE, r)
910opset(AMULLD, r)
911opset(AMULLW, r)
912case ADIVW:
913opset(ADIVD, r)
914opset(ADIVDU, r)
915opset(ADIVWU, r)
916opset(AMODD, r)
917opset(AMODDU, r)
918opset(AMODW, r)
919opset(AMODWU, r)
920case AMULHD:
921opset(AMULHDU, r)
922case AMOVBZ:
923opset(AMOVH, r)
924opset(AMOVHZ, r)
925case ALA:
926opset(ALAY, r)
927case AMVC:
928opset(AMVCIN, r)
929opset(ACLC, r)
930opset(AXC, r)
931opset(AOC, r)
932opset(ANC, r)
933case ASTCK:
934opset(ASTCKC, r)
935opset(ASTCKE, r)
936opset(ASTCKF, r)
937case ALAAG:
938opset(ALAA, r)
939opset(ALAAL, r)
940opset(ALAALG, r)
941opset(ALAN, r)
942opset(ALANG, r)
943opset(ALAX, r)
944opset(ALAXG, r)
945opset(ALAO, r)
946opset(ALAOG, r)
947case ASTMG:
948opset(ASTMY, r)
949case ALMG:
950opset(ALMY, r)
951case ABEQ:
952opset(ABGE, r)
953opset(ABGT, r)
954opset(ABLE, r)
955opset(ABLT, r)
956opset(ABNE, r)
957opset(ABVC, r)
958opset(ABVS, r)
959opset(ABLEU, r)
960opset(ABLTU, r)
961case ABR:
962opset(ABL, r)
963case ABC:
964opset(ABCL, r)
965case AFABS:
966opset(AFNABS, r)
967opset(ALPDFR, r)
968opset(ALNDFR, r)
969opset(AFNEG, r)
970opset(AFNEGS, r)
971opset(ALEDBR, r)
972opset(ALDEBR, r)
973opset(AFSQRT, r)
974opset(AFSQRTS, r)
975case AFADD:
976opset(AFADDS, r)
977opset(AFDIV, r)
978opset(AFDIVS, r)
979opset(AFSUB, r)
980opset(AFSUBS, r)
981case AFMADD:
982opset(AFMADDS, r)
983opset(AFMSUB, r)
984opset(AFMSUBS, r)
985case AFMUL:
986opset(AFMULS, r)
987case AFCMPO:
988opset(AFCMPU, r)
989opset(ACEBR, r)
990case AAND:
991opset(AOR, r)
992opset(AXOR, r)
993case AANDW:
994opset(AORW, r)
995opset(AXORW, r)
996case ASLD:
997opset(ASRD, r)
998opset(ASLW, r)
999opset(ASRW, r)
1000opset(ASRAD, r)
1001opset(ASRAW, r)
1002opset(ARLL, r)
1003opset(ARLLG, r)
1004case ARNSBG:
1005opset(ARXSBG, r)
1006opset(AROSBG, r)
1007opset(ARNSBGT, r)
1008opset(ARXSBGT, r)
1009opset(AROSBGT, r)
1010opset(ARISBG, r)
1011opset(ARISBGN, r)
1012opset(ARISBGZ, r)
1013opset(ARISBGNZ, r)
1014opset(ARISBHG, r)
1015opset(ARISBLG, r)
1016opset(ARISBHGZ, r)
1017opset(ARISBLGZ, r)
1018case ACSG:
1019opset(ACS, r)
1020case ASUB:
1021opset(ASUBC, r)
1022opset(ASUBE, r)
1023opset(ASUBW, r)
1024case ANEG:
1025opset(ANEGW, r)
1026case AFMOVD:
1027opset(AFMOVS, r)
1028case AMOVDBR:
1029opset(AMOVWBR, r)
1030case ACMP:
1031opset(ACMPW, r)
1032case ACMPU:
1033opset(ACMPWU, r)
1034case ATMHH:
1035opset(ATMHL, r)
1036opset(ATMLH, r)
1037opset(ATMLL, r)
1038case ACEFBRA:
1039opset(ACDFBRA, r)
1040opset(ACEGBRA, r)
1041opset(ACDGBRA, r)
1042opset(ACELFBR, r)
1043opset(ACDLFBR, r)
1044opset(ACELGBR, r)
1045opset(ACDLGBR, r)
1046case ACFEBRA:
1047opset(ACFDBRA, r)
1048opset(ACGEBRA, r)
1049opset(ACGDBRA, r)
1050opset(ACLFEBR, r)
1051opset(ACLFDBR, r)
1052opset(ACLGEBR, r)
1053opset(ACLGDBR, r)
1054case AFIEBR:
1055opset(AFIDBR, r)
1056case ACMPBEQ:
1057opset(ACMPBGE, r)
1058opset(ACMPBGT, r)
1059opset(ACMPBLE, r)
1060opset(ACMPBLT, r)
1061opset(ACMPBNE, r)
1062case ACMPUBEQ:
1063opset(ACMPUBGE, r)
1064opset(ACMPUBGT, r)
1065opset(ACMPUBLE, r)
1066opset(ACMPUBLT, r)
1067opset(ACMPUBNE, r)
1068case ACGRJ:
1069opset(ACRJ, r)
1070case ACLGRJ:
1071opset(ACLRJ, r)
1072case ACGIJ:
1073opset(ACIJ, r)
1074case ACLGIJ:
1075opset(ACLIJ, r)
1076case AMOVDEQ:
1077opset(AMOVDGE, r)
1078opset(AMOVDGT, r)
1079opset(AMOVDLE, r)
1080opset(AMOVDLT, r)
1081opset(AMOVDNE, r)
1082case ALOCGR:
1083opset(ALOCR, r)
1084case ALTDBR:
1085opset(ALTEBR, r)
1086case ATCDB:
1087opset(ATCEB, r)
1088case AVL:
1089opset(AVLLEZB, r)
1090opset(AVLLEZH, r)
1091opset(AVLLEZF, r)
1092opset(AVLLEZG, r)
1093opset(AVLREPB, r)
1094opset(AVLREPH, r)
1095opset(AVLREPF, r)
1096opset(AVLREPG, r)
1097case AVLEG:
1098opset(AVLBB, r)
1099opset(AVLEB, r)
1100opset(AVLEH, r)
1101opset(AVLEF, r)
1102opset(AVLEG, r)
1103opset(AVLREP, r)
1104case AVSTEG:
1105opset(AVSTEB, r)
1106opset(AVSTEH, r)
1107opset(AVSTEF, r)
1108case AVSCEG:
1109opset(AVSCEF, r)
1110case AVGEG:
1111opset(AVGEF, r)
1112case AVESLG:
1113opset(AVESLB, r)
1114opset(AVESLH, r)
1115opset(AVESLF, r)
1116opset(AVERLLB, r)
1117opset(AVERLLH, r)
1118opset(AVERLLF, r)
1119opset(AVERLLG, r)
1120opset(AVESRAB, r)
1121opset(AVESRAH, r)
1122opset(AVESRAF, r)
1123opset(AVESRAG, r)
1124opset(AVESRLB, r)
1125opset(AVESRLH, r)
1126opset(AVESRLF, r)
1127opset(AVESRLG, r)
1128case AVLGVG:
1129opset(AVLGVB, r)
1130opset(AVLGVH, r)
1131opset(AVLGVF, r)
1132case AVLVGG:
1133opset(AVLVGB, r)
1134opset(AVLVGH, r)
1135opset(AVLVGF, r)
1136case AVZERO:
1137opset(AVONE, r)
1138case AVREPIG:
1139opset(AVREPIB, r)
1140opset(AVREPIH, r)
1141opset(AVREPIF, r)
1142case AVLEIG:
1143opset(AVLEIB, r)
1144opset(AVLEIH, r)
1145opset(AVLEIF, r)
1146case AVGMG:
1147opset(AVGMB, r)
1148opset(AVGMH, r)
1149opset(AVGMF, r)
1150case AVREPG:
1151opset(AVREPB, r)
1152opset(AVREPH, r)
1153opset(AVREPF, r)
1154case AVERIMG:
1155opset(AVERIMB, r)
1156opset(AVERIMH, r)
1157opset(AVERIMF, r)
1158case AVFTCIDB:
1159opset(AWFTCIDB, r)
1160case AVLR:
1161opset(AVUPHB, r)
1162opset(AVUPHH, r)
1163opset(AVUPHF, r)
1164opset(AVUPLHB, r)
1165opset(AVUPLHH, r)
1166opset(AVUPLHF, r)
1167opset(AVUPLB, r)
1168opset(AVUPLHW, r)
1169opset(AVUPLF, r)
1170opset(AVUPLLB, r)
1171opset(AVUPLLH, r)
1172opset(AVUPLLF, r)
1173opset(AVCLZB, r)
1174opset(AVCLZH, r)
1175opset(AVCLZF, r)
1176opset(AVCLZG, r)
1177opset(AVCTZB, r)
1178opset(AVCTZH, r)
1179opset(AVCTZF, r)
1180opset(AVCTZG, r)
1181opset(AVLDEB, r)
1182opset(AWLDEB, r)
1183opset(AVFLCDB, r)
1184opset(AWFLCDB, r)
1185opset(AVFLNDB, r)
1186opset(AWFLNDB, r)
1187opset(AVFLPDB, r)
1188opset(AWFLPDB, r)
1189opset(AVFSQDB, r)
1190opset(AWFSQDB, r)
1191opset(AVISTRB, r)
1192opset(AVISTRH, r)
1193opset(AVISTRF, r)
1194opset(AVISTRBS, r)
1195opset(AVISTRHS, r)
1196opset(AVISTRFS, r)
1197opset(AVLCB, r)
1198opset(AVLCH, r)
1199opset(AVLCF, r)
1200opset(AVLCG, r)
1201opset(AVLPB, r)
1202opset(AVLPH, r)
1203opset(AVLPF, r)
1204opset(AVLPG, r)
1205opset(AVPOPCT, r)
1206opset(AVSEGB, r)
1207opset(AVSEGH, r)
1208opset(AVSEGF, r)
1209case AVECG:
1210opset(AVECB, r)
1211opset(AVECH, r)
1212opset(AVECF, r)
1213opset(AVECLB, r)
1214opset(AVECLH, r)
1215opset(AVECLF, r)
1216opset(AVECLG, r)
1217opset(AWFCDB, r)
1218opset(AWFKDB, r)
1219case AVCEQG:
1220opset(AVCEQB, r)
1221opset(AVCEQH, r)
1222opset(AVCEQF, r)
1223opset(AVCEQBS, r)
1224opset(AVCEQHS, r)
1225opset(AVCEQFS, r)
1226opset(AVCEQGS, r)
1227opset(AVCHB, r)
1228opset(AVCHH, r)
1229opset(AVCHF, r)
1230opset(AVCHG, r)
1231opset(AVCHBS, r)
1232opset(AVCHHS, r)
1233opset(AVCHFS, r)
1234opset(AVCHGS, r)
1235opset(AVCHLB, r)
1236opset(AVCHLH, r)
1237opset(AVCHLF, r)
1238opset(AVCHLG, r)
1239opset(AVCHLBS, r)
1240opset(AVCHLHS, r)
1241opset(AVCHLFS, r)
1242opset(AVCHLGS, r)
1243case AVFAEF:
1244opset(AVFAEB, r)
1245opset(AVFAEH, r)
1246opset(AVFAEBS, r)
1247opset(AVFAEHS, r)
1248opset(AVFAEFS, r)
1249opset(AVFAEZB, r)
1250opset(AVFAEZH, r)
1251opset(AVFAEZF, r)
1252opset(AVFAEZBS, r)
1253opset(AVFAEZHS, r)
1254opset(AVFAEZFS, r)
1255opset(AVFEEB, r)
1256opset(AVFEEH, r)
1257opset(AVFEEF, r)
1258opset(AVFEEBS, r)
1259opset(AVFEEHS, r)
1260opset(AVFEEFS, r)
1261opset(AVFEEZB, r)
1262opset(AVFEEZH, r)
1263opset(AVFEEZF, r)
1264opset(AVFEEZBS, r)
1265opset(AVFEEZHS, r)
1266opset(AVFEEZFS, r)
1267opset(AVFENEB, r)
1268opset(AVFENEH, r)
1269opset(AVFENEF, r)
1270opset(AVFENEBS, r)
1271opset(AVFENEHS, r)
1272opset(AVFENEFS, r)
1273opset(AVFENEZB, r)
1274opset(AVFENEZH, r)
1275opset(AVFENEZF, r)
1276opset(AVFENEZBS, r)
1277opset(AVFENEZHS, r)
1278opset(AVFENEZFS, r)
1279case AVPKSG:
1280opset(AVPKSH, r)
1281opset(AVPKSF, r)
1282opset(AVPKSHS, r)
1283opset(AVPKSFS, r)
1284opset(AVPKSGS, r)
1285opset(AVPKLSH, r)
1286opset(AVPKLSF, r)
1287opset(AVPKLSG, r)
1288opset(AVPKLSHS, r)
1289opset(AVPKLSFS, r)
1290opset(AVPKLSGS, r)
1291case AVAQ:
1292opset(AVAB, r)
1293opset(AVAH, r)
1294opset(AVAF, r)
1295opset(AVAG, r)
1296opset(AVACCB, r)
1297opset(AVACCH, r)
1298opset(AVACCF, r)
1299opset(AVACCG, r)
1300opset(AVACCQ, r)
1301opset(AVN, r)
1302opset(AVNC, r)
1303opset(AVAVGB, r)
1304opset(AVAVGH, r)
1305opset(AVAVGF, r)
1306opset(AVAVGG, r)
1307opset(AVAVGLB, r)
1308opset(AVAVGLH, r)
1309opset(AVAVGLF, r)
1310opset(AVAVGLG, r)
1311opset(AVCKSM, r)
1312opset(AVX, r)
1313opset(AVFADB, r)
1314opset(AWFADB, r)
1315opset(AVFCEDB, r)
1316opset(AVFCEDBS, r)
1317opset(AWFCEDB, r)
1318opset(AWFCEDBS, r)
1319opset(AVFCHDB, r)
1320opset(AVFCHDBS, r)
1321opset(AWFCHDB, r)
1322opset(AWFCHDBS, r)
1323opset(AVFCHEDB, r)
1324opset(AVFCHEDBS, r)
1325opset(AWFCHEDB, r)
1326opset(AWFCHEDBS, r)
1327opset(AVFMDB, r)
1328opset(AWFMDB, r)
1329opset(AVGFMB, r)
1330opset(AVGFMH, r)
1331opset(AVGFMF, r)
1332opset(AVGFMG, r)
1333opset(AVMXB, r)
1334opset(AVMXH, r)
1335opset(AVMXF, r)
1336opset(AVMXG, r)
1337opset(AVMXLB, r)
1338opset(AVMXLH, r)
1339opset(AVMXLF, r)
1340opset(AVMXLG, r)
1341opset(AVMNB, r)
1342opset(AVMNH, r)
1343opset(AVMNF, r)
1344opset(AVMNG, r)
1345opset(AVMNLB, r)
1346opset(AVMNLH, r)
1347opset(AVMNLF, r)
1348opset(AVMNLG, r)
1349opset(AVMRHB, r)
1350opset(AVMRHH, r)
1351opset(AVMRHF, r)
1352opset(AVMRHG, r)
1353opset(AVMRLB, r)
1354opset(AVMRLH, r)
1355opset(AVMRLF, r)
1356opset(AVMRLG, r)
1357opset(AVMEB, r)
1358opset(AVMEH, r)
1359opset(AVMEF, r)
1360opset(AVMLEB, r)
1361opset(AVMLEH, r)
1362opset(AVMLEF, r)
1363opset(AVMOB, r)
1364opset(AVMOH, r)
1365opset(AVMOF, r)
1366opset(AVMLOB, r)
1367opset(AVMLOH, r)
1368opset(AVMLOF, r)
1369opset(AVMHB, r)
1370opset(AVMHH, r)
1371opset(AVMHF, r)
1372opset(AVMLHB, r)
1373opset(AVMLHH, r)
1374opset(AVMLHF, r)
1375opset(AVMLH, r)
1376opset(AVMLHW, r)
1377opset(AVMLF, r)
1378opset(AVNO, r)
1379opset(AVO, r)
1380opset(AVPKH, r)
1381opset(AVPKF, r)
1382opset(AVPKG, r)
1383opset(AVSUMGH, r)
1384opset(AVSUMGF, r)
1385opset(AVSUMQF, r)
1386opset(AVSUMQG, r)
1387opset(AVSUMB, r)
1388opset(AVSUMH, r)
1389case AVERLLVG:
1390opset(AVERLLVB, r)
1391opset(AVERLLVH, r)
1392opset(AVERLLVF, r)
1393opset(AVESLVB, r)
1394opset(AVESLVH, r)
1395opset(AVESLVF, r)
1396opset(AVESLVG, r)
1397opset(AVESRAVB, r)
1398opset(AVESRAVH, r)
1399opset(AVESRAVF, r)
1400opset(AVESRAVG, r)
1401opset(AVESRLVB, r)
1402opset(AVESRLVH, r)
1403opset(AVESRLVF, r)
1404opset(AVESRLVG, r)
1405opset(AVFDDB, r)
1406opset(AWFDDB, r)
1407opset(AVFSDB, r)
1408opset(AWFSDB, r)
1409opset(AVSL, r)
1410opset(AVSLB, r)
1411opset(AVSRA, r)
1412opset(AVSRAB, r)
1413opset(AVSRL, r)
1414opset(AVSRLB, r)
1415opset(AVSB, r)
1416opset(AVSH, r)
1417opset(AVSF, r)
1418opset(AVSG, r)
1419opset(AVSQ, r)
1420opset(AVSCBIB, r)
1421opset(AVSCBIH, r)
1422opset(AVSCBIF, r)
1423opset(AVSCBIG, r)
1424opset(AVSCBIQ, r)
1425case AVACQ:
1426opset(AVACCCQ, r)
1427opset(AVGFMAB, r)
1428opset(AVGFMAH, r)
1429opset(AVGFMAF, r)
1430opset(AVGFMAG, r)
1431opset(AVMALB, r)
1432opset(AVMALHW, r)
1433opset(AVMALF, r)
1434opset(AVMAHB, r)
1435opset(AVMAHH, r)
1436opset(AVMAHF, r)
1437opset(AVMALHB, r)
1438opset(AVMALHH, r)
1439opset(AVMALHF, r)
1440opset(AVMAEB, r)
1441opset(AVMAEH, r)
1442opset(AVMAEF, r)
1443opset(AVMALEB, r)
1444opset(AVMALEH, r)
1445opset(AVMALEF, r)
1446opset(AVMAOB, r)
1447opset(AVMAOH, r)
1448opset(AVMAOF, r)
1449opset(AVMALOB, r)
1450opset(AVMALOH, r)
1451opset(AVMALOF, r)
1452opset(AVSTRCB, r)
1453opset(AVSTRCH, r)
1454opset(AVSTRCF, r)
1455opset(AVSTRCBS, r)
1456opset(AVSTRCHS, r)
1457opset(AVSTRCFS, r)
1458opset(AVSTRCZB, r)
1459opset(AVSTRCZH, r)
1460opset(AVSTRCZF, r)
1461opset(AVSTRCZBS, r)
1462opset(AVSTRCZHS, r)
1463opset(AVSTRCZFS, r)
1464opset(AVSBCBIQ, r)
1465opset(AVSBIQ, r)
1466opset(AVMSLG, r)
1467opset(AVMSLEG, r)
1468opset(AVMSLOG, r)
1469opset(AVMSLEOG, r)
1470case AVSEL:
1471opset(AVFMADB, r)
1472opset(AWFMADB, r)
1473opset(AVFMSDB, r)
1474opset(AWFMSDB, r)
1475opset(AVPERM, r)
1476}
1477}
1478}
1479
1480const (
1481op_A uint32 = 0x5A00 // FORMAT_RX1 ADD (32)
1482op_AD uint32 = 0x6A00 // FORMAT_RX1 ADD NORMALIZED (long HFP)
1483op_ADB uint32 = 0xED1A // FORMAT_RXE ADD (long BFP)
1484op_ADBR uint32 = 0xB31A // FORMAT_RRE ADD (long BFP)
1485op_ADR uint32 = 0x2A00 // FORMAT_RR ADD NORMALIZED (long HFP)
1486op_ADTR uint32 = 0xB3D2 // FORMAT_RRF1 ADD (long DFP)
1487op_ADTRA uint32 = 0xB3D2 // FORMAT_RRF1 ADD (long DFP)
1488op_AE uint32 = 0x7A00 // FORMAT_RX1 ADD NORMALIZED (short HFP)
1489op_AEB uint32 = 0xED0A // FORMAT_RXE ADD (short BFP)
1490op_AEBR uint32 = 0xB30A // FORMAT_RRE ADD (short BFP)
1491op_AER uint32 = 0x3A00 // FORMAT_RR ADD NORMALIZED (short HFP)
1492op_AFI uint32 = 0xC209 // FORMAT_RIL1 ADD IMMEDIATE (32)
1493op_AG uint32 = 0xE308 // FORMAT_RXY1 ADD (64)
1494op_AGF uint32 = 0xE318 // FORMAT_RXY1 ADD (64<-32)
1495op_AGFI uint32 = 0xC208 // FORMAT_RIL1 ADD IMMEDIATE (64<-32)
1496op_AGFR uint32 = 0xB918 // FORMAT_RRE ADD (64<-32)
1497op_AGHI uint32 = 0xA70B // FORMAT_RI1 ADD HALFWORD IMMEDIATE (64)
1498op_AGHIK uint32 = 0xECD9 // FORMAT_RIE4 ADD IMMEDIATE (64<-16)
1499op_AGR uint32 = 0xB908 // FORMAT_RRE ADD (64)
1500op_AGRK uint32 = 0xB9E8 // FORMAT_RRF1 ADD (64)
1501op_AGSI uint32 = 0xEB7A // FORMAT_SIY ADD IMMEDIATE (64<-8)
1502op_AH uint32 = 0x4A00 // FORMAT_RX1 ADD HALFWORD
1503op_AHHHR uint32 = 0xB9C8 // FORMAT_RRF1 ADD HIGH (32)
1504op_AHHLR uint32 = 0xB9D8 // FORMAT_RRF1 ADD HIGH (32)
1505op_AHI uint32 = 0xA70A // FORMAT_RI1 ADD HALFWORD IMMEDIATE (32)
1506op_AHIK uint32 = 0xECD8 // FORMAT_RIE4 ADD IMMEDIATE (32<-16)
1507op_AHY uint32 = 0xE37A // FORMAT_RXY1 ADD HALFWORD
1508op_AIH uint32 = 0xCC08 // FORMAT_RIL1 ADD IMMEDIATE HIGH (32)
1509op_AL uint32 = 0x5E00 // FORMAT_RX1 ADD LOGICAL (32)
1510op_ALC uint32 = 0xE398 // FORMAT_RXY1 ADD LOGICAL WITH CARRY (32)
1511op_ALCG uint32 = 0xE388 // FORMAT_RXY1 ADD LOGICAL WITH CARRY (64)
1512op_ALCGR uint32 = 0xB988 // FORMAT_RRE ADD LOGICAL WITH CARRY (64)
1513op_ALCR uint32 = 0xB998 // FORMAT_RRE ADD LOGICAL WITH CARRY (32)
1514op_ALFI uint32 = 0xC20B // FORMAT_RIL1 ADD LOGICAL IMMEDIATE (32)
1515op_ALG uint32 = 0xE30A // FORMAT_RXY1 ADD LOGICAL (64)
1516op_ALGF uint32 = 0xE31A // FORMAT_RXY1 ADD LOGICAL (64<-32)
1517op_ALGFI uint32 = 0xC20A // FORMAT_RIL1 ADD LOGICAL IMMEDIATE (64<-32)
1518op_ALGFR uint32 = 0xB91A // FORMAT_RRE ADD LOGICAL (64<-32)
1519op_ALGHSIK uint32 = 0xECDB // FORMAT_RIE4 ADD LOGICAL WITH SIGNED IMMEDIATE (64<-16)
1520op_ALGR uint32 = 0xB90A // FORMAT_RRE ADD LOGICAL (64)
1521op_ALGRK uint32 = 0xB9EA // FORMAT_RRF1 ADD LOGICAL (64)
1522op_ALGSI uint32 = 0xEB7E // FORMAT_SIY ADD LOGICAL WITH SIGNED IMMEDIATE (64<-8)
1523op_ALHHHR uint32 = 0xB9CA // FORMAT_RRF1 ADD LOGICAL HIGH (32)
1524op_ALHHLR uint32 = 0xB9DA // FORMAT_RRF1 ADD LOGICAL HIGH (32)
1525op_ALHSIK uint32 = 0xECDA // FORMAT_RIE4 ADD LOGICAL WITH SIGNED IMMEDIATE (32<-16)
1526op_ALR uint32 = 0x1E00 // FORMAT_RR ADD LOGICAL (32)
1527op_ALRK uint32 = 0xB9FA // FORMAT_RRF1 ADD LOGICAL (32)
1528op_ALSI uint32 = 0xEB6E // FORMAT_SIY ADD LOGICAL WITH SIGNED IMMEDIATE (32<-8)
1529op_ALSIH uint32 = 0xCC0A // FORMAT_RIL1 ADD LOGICAL WITH SIGNED IMMEDIATE HIGH (32)
1530op_ALSIHN uint32 = 0xCC0B // FORMAT_RIL1 ADD LOGICAL WITH SIGNED IMMEDIATE HIGH (32)
1531op_ALY uint32 = 0xE35E // FORMAT_RXY1 ADD LOGICAL (32)
1532op_AP uint32 = 0xFA00 // FORMAT_SS2 ADD DECIMAL
1533op_AR uint32 = 0x1A00 // FORMAT_RR ADD (32)
1534op_ARK uint32 = 0xB9F8 // FORMAT_RRF1 ADD (32)
1535op_ASI uint32 = 0xEB6A // FORMAT_SIY ADD IMMEDIATE (32<-8)
1536op_AU uint32 = 0x7E00 // FORMAT_RX1 ADD UNNORMALIZED (short HFP)
1537op_AUR uint32 = 0x3E00 // FORMAT_RR ADD UNNORMALIZED (short HFP)
1538op_AW uint32 = 0x6E00 // FORMAT_RX1 ADD UNNORMALIZED (long HFP)
1539op_AWR uint32 = 0x2E00 // FORMAT_RR ADD UNNORMALIZED (long HFP)
1540op_AXBR uint32 = 0xB34A // FORMAT_RRE ADD (extended BFP)
1541op_AXR uint32 = 0x3600 // FORMAT_RR ADD NORMALIZED (extended HFP)
1542op_AXTR uint32 = 0xB3DA // FORMAT_RRF1 ADD (extended DFP)
1543op_AXTRA uint32 = 0xB3DA // FORMAT_RRF1 ADD (extended DFP)
1544op_AY uint32 = 0xE35A // FORMAT_RXY1 ADD (32)
1545op_BAKR uint32 = 0xB240 // FORMAT_RRE BRANCH AND STACK
1546op_BAL uint32 = 0x4500 // FORMAT_RX1 BRANCH AND LINK
1547op_BALR uint32 = 0x0500 // FORMAT_RR BRANCH AND LINK
1548op_BAS uint32 = 0x4D00 // FORMAT_RX1 BRANCH AND SAVE
1549op_BASR uint32 = 0x0D00 // FORMAT_RR BRANCH AND SAVE
1550op_BASSM uint32 = 0x0C00 // FORMAT_RR BRANCH AND SAVE AND SET MODE
1551op_BC uint32 = 0x4700 // FORMAT_RX2 BRANCH ON CONDITION
1552op_BCR uint32 = 0x0700 // FORMAT_RR BRANCH ON CONDITION
1553op_BCT uint32 = 0x4600 // FORMAT_RX1 BRANCH ON COUNT (32)
1554op_BCTG uint32 = 0xE346 // FORMAT_RXY1 BRANCH ON COUNT (64)
1555op_BCTGR uint32 = 0xB946 // FORMAT_RRE BRANCH ON COUNT (64)
1556op_BCTR uint32 = 0x0600 // FORMAT_RR BRANCH ON COUNT (32)
1557op_BPP uint32 = 0xC700 // FORMAT_SMI BRANCH PREDICTION PRELOAD
1558op_BPRP uint32 = 0xC500 // FORMAT_MII BRANCH PREDICTION RELATIVE PRELOAD
1559op_BRAS uint32 = 0xA705 // FORMAT_RI2 BRANCH RELATIVE AND SAVE
1560op_BRASL uint32 = 0xC005 // FORMAT_RIL2 BRANCH RELATIVE AND SAVE LONG
1561op_BRC uint32 = 0xA704 // FORMAT_RI3 BRANCH RELATIVE ON CONDITION
1562op_BRCL uint32 = 0xC004 // FORMAT_RIL3 BRANCH RELATIVE ON CONDITION LONG
1563op_BRCT uint32 = 0xA706 // FORMAT_RI2 BRANCH RELATIVE ON COUNT (32)
1564op_BRCTG uint32 = 0xA707 // FORMAT_RI2 BRANCH RELATIVE ON COUNT (64)
1565op_BRCTH uint32 = 0xCC06 // FORMAT_RIL2 BRANCH RELATIVE ON COUNT HIGH (32)
1566op_BRXH uint32 = 0x8400 // FORMAT_RSI BRANCH RELATIVE ON INDEX HIGH (32)
1567op_BRXHG uint32 = 0xEC44 // FORMAT_RIE5 BRANCH RELATIVE ON INDEX HIGH (64)
1568op_BRXLE uint32 = 0x8500 // FORMAT_RSI BRANCH RELATIVE ON INDEX LOW OR EQ. (32)
1569op_BRXLG uint32 = 0xEC45 // FORMAT_RIE5 BRANCH RELATIVE ON INDEX LOW OR EQ. (64)
1570op_BSA uint32 = 0xB25A // FORMAT_RRE BRANCH AND SET AUTHORITY
1571op_BSG uint32 = 0xB258 // FORMAT_RRE BRANCH IN SUBSPACE GROUP
1572op_BSM uint32 = 0x0B00 // FORMAT_RR BRANCH AND SET MODE
1573op_BXH uint32 = 0x8600 // FORMAT_RS1 BRANCH ON INDEX HIGH (32)
1574op_BXHG uint32 = 0xEB44 // FORMAT_RSY1 BRANCH ON INDEX HIGH (64)
1575op_BXLE uint32 = 0x8700 // FORMAT_RS1 BRANCH ON INDEX LOW OR EQUAL (32)
1576op_BXLEG uint32 = 0xEB45 // FORMAT_RSY1 BRANCH ON INDEX LOW OR EQUAL (64)
1577op_C uint32 = 0x5900 // FORMAT_RX1 COMPARE (32)
1578op_CD uint32 = 0x6900 // FORMAT_RX1 COMPARE (long HFP)
1579op_CDB uint32 = 0xED19 // FORMAT_RXE COMPARE (long BFP)
1580op_CDBR uint32 = 0xB319 // FORMAT_RRE COMPARE (long BFP)
1581op_CDFBR uint32 = 0xB395 // FORMAT_RRE CONVERT FROM FIXED (32 to long BFP)
1582op_CDFBRA uint32 = 0xB395 // FORMAT_RRF5 CONVERT FROM FIXED (32 to long BFP)
1583op_CDFR uint32 = 0xB3B5 // FORMAT_RRE CONVERT FROM FIXED (32 to long HFP)
1584op_CDFTR uint32 = 0xB951 // FORMAT_RRE CONVERT FROM FIXED (32 to long DFP)
1585op_CDGBR uint32 = 0xB3A5 // FORMAT_RRE CONVERT FROM FIXED (64 to long BFP)
1586op_CDGBRA uint32 = 0xB3A5 // FORMAT_RRF5 CONVERT FROM FIXED (64 to long BFP)
1587op_CDGR uint32 = 0xB3C5 // FORMAT_RRE CONVERT FROM FIXED (64 to long HFP)
1588op_CDGTR uint32 = 0xB3F1 // FORMAT_RRE CONVERT FROM FIXED (64 to long DFP)
1589op_CDGTRA uint32 = 0xB3F1 // FORMAT_RRF5 CONVERT FROM FIXED (64 to long DFP)
1590op_CDLFBR uint32 = 0xB391 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to long BFP)
1591op_CDLFTR uint32 = 0xB953 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to long DFP)
1592op_CDLGBR uint32 = 0xB3A1 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to long BFP)
1593op_CDLGTR uint32 = 0xB952 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to long DFP)
1594op_CDR uint32 = 0x2900 // FORMAT_RR COMPARE (long HFP)
1595op_CDS uint32 = 0xBB00 // FORMAT_RS1 COMPARE DOUBLE AND SWAP (32)
1596op_CDSG uint32 = 0xEB3E // FORMAT_RSY1 COMPARE DOUBLE AND SWAP (64)
1597op_CDSTR uint32 = 0xB3F3 // FORMAT_RRE CONVERT FROM SIGNED PACKED (64 to long DFP)
1598op_CDSY uint32 = 0xEB31 // FORMAT_RSY1 COMPARE DOUBLE AND SWAP (32)
1599op_CDTR uint32 = 0xB3E4 // FORMAT_RRE COMPARE (long DFP)
1600op_CDUTR uint32 = 0xB3F2 // FORMAT_RRE CONVERT FROM UNSIGNED PACKED (64 to long DFP)
1601op_CDZT uint32 = 0xEDAA // FORMAT_RSL CONVERT FROM ZONED (to long DFP)
1602op_CE uint32 = 0x7900 // FORMAT_RX1 COMPARE (short HFP)
1603op_CEB uint32 = 0xED09 // FORMAT_RXE COMPARE (short BFP)
1604op_CEBR uint32 = 0xB309 // FORMAT_RRE COMPARE (short BFP)
1605op_CEDTR uint32 = 0xB3F4 // FORMAT_RRE COMPARE BIASED EXPONENT (long DFP)
1606op_CEFBR uint32 = 0xB394 // FORMAT_RRE CONVERT FROM FIXED (32 to short BFP)
1607op_CEFBRA uint32 = 0xB394 // FORMAT_RRF5 CONVERT FROM FIXED (32 to short BFP)
1608op_CEFR uint32 = 0xB3B4 // FORMAT_RRE CONVERT FROM FIXED (32 to short HFP)
1609op_CEGBR uint32 = 0xB3A4 // FORMAT_RRE CONVERT FROM FIXED (64 to short BFP)
1610op_CEGBRA uint32 = 0xB3A4 // FORMAT_RRF5 CONVERT FROM FIXED (64 to short BFP)
1611op_CEGR uint32 = 0xB3C4 // FORMAT_RRE CONVERT FROM FIXED (64 to short HFP)
1612op_CELFBR uint32 = 0xB390 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to short BFP)
1613op_CELGBR uint32 = 0xB3A0 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to short BFP)
1614op_CER uint32 = 0x3900 // FORMAT_RR COMPARE (short HFP)
1615op_CEXTR uint32 = 0xB3FC // FORMAT_RRE COMPARE BIASED EXPONENT (extended DFP)
1616op_CFC uint32 = 0xB21A // FORMAT_S COMPARE AND FORM CODEWORD
1617op_CFDBR uint32 = 0xB399 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 32)
1618op_CFDBRA uint32 = 0xB399 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 32)
1619op_CFDR uint32 = 0xB3B9 // FORMAT_RRF5 CONVERT TO FIXED (long HFP to 32)
1620op_CFDTR uint32 = 0xB941 // FORMAT_RRF5 CONVERT TO FIXED (long DFP to 32)
1621op_CFEBR uint32 = 0xB398 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 32)
1622op_CFEBRA uint32 = 0xB398 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 32)
1623op_CFER uint32 = 0xB3B8 // FORMAT_RRF5 CONVERT TO FIXED (short HFP to 32)
1624op_CFI uint32 = 0xC20D // FORMAT_RIL1 COMPARE IMMEDIATE (32)
1625op_CFXBR uint32 = 0xB39A // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 32)
1626op_CFXBRA uint32 = 0xB39A // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 32)
1627op_CFXR uint32 = 0xB3BA // FORMAT_RRF5 CONVERT TO FIXED (extended HFP to 32)
1628op_CFXTR uint32 = 0xB949 // FORMAT_RRF5 CONVERT TO FIXED (extended DFP to 32)
1629op_CG uint32 = 0xE320 // FORMAT_RXY1 COMPARE (64)
1630op_CGDBR uint32 = 0xB3A9 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 64)
1631op_CGDBRA uint32 = 0xB3A9 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 64)
1632op_CGDR uint32 = 0xB3C9 // FORMAT_RRF5 CONVERT TO FIXED (long HFP to 64)
1633op_CGDTR uint32 = 0xB3E1 // FORMAT_RRF5 CONVERT TO FIXED (long DFP to 64)
1634op_CGDTRA uint32 = 0xB3E1 // FORMAT_RRF5 CONVERT TO FIXED (long DFP to 64)
1635op_CGEBR uint32 = 0xB3A8 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 64)
1636op_CGEBRA uint32 = 0xB3A8 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 64)
1637op_CGER uint32 = 0xB3C8 // FORMAT_RRF5 CONVERT TO FIXED (short HFP to 64)
1638op_CGF uint32 = 0xE330 // FORMAT_RXY1 COMPARE (64<-32)
1639op_CGFI uint32 = 0xC20C // FORMAT_RIL1 COMPARE IMMEDIATE (64<-32)
1640op_CGFR uint32 = 0xB930 // FORMAT_RRE COMPARE (64<-32)
1641op_CGFRL uint32 = 0xC60C // FORMAT_RIL2 COMPARE RELATIVE LONG (64<-32)
1642op_CGH uint32 = 0xE334 // FORMAT_RXY1 COMPARE HALFWORD (64<-16)
1643op_CGHI uint32 = 0xA70F // FORMAT_RI1 COMPARE HALFWORD IMMEDIATE (64<-16)
1644op_CGHRL uint32 = 0xC604 // FORMAT_RIL2 COMPARE HALFWORD RELATIVE LONG (64<-16)
1645op_CGHSI uint32 = 0xE558 // FORMAT_SIL COMPARE HALFWORD IMMEDIATE (64<-16)
1646op_CGIB uint32 = 0xECFC // FORMAT_RIS COMPARE IMMEDIATE AND BRANCH (64<-8)
1647op_CGIJ uint32 = 0xEC7C // FORMAT_RIE3 COMPARE IMMEDIATE AND BRANCH RELATIVE (64<-8)
1648op_CGIT uint32 = 0xEC70 // FORMAT_RIE1 COMPARE IMMEDIATE AND TRAP (64<-16)
1649op_CGR uint32 = 0xB920 // FORMAT_RRE COMPARE (64)
1650op_CGRB uint32 = 0xECE4 // FORMAT_RRS COMPARE AND BRANCH (64)
1651op_CGRJ uint32 = 0xEC64 // FORMAT_RIE2 COMPARE AND BRANCH RELATIVE (64)
1652op_CGRL uint32 = 0xC608 // FORMAT_RIL2 COMPARE RELATIVE LONG (64)
1653op_CGRT uint32 = 0xB960 // FORMAT_RRF3 COMPARE AND TRAP (64)
1654op_CGXBR uint32 = 0xB3AA // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 64)
1655op_CGXBRA uint32 = 0xB3AA // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 64)
1656op_CGXR uint32 = 0xB3CA // FORMAT_RRF5 CONVERT TO FIXED (extended HFP to 64)
1657op_CGXTR uint32 = 0xB3E9 // FORMAT_RRF5 CONVERT TO FIXED (extended DFP to 64)
1658op_CGXTRA uint32 = 0xB3E9 // FORMAT_RRF5 CONVERT TO FIXED (extended DFP to 64)
1659op_CH uint32 = 0x4900 // FORMAT_RX1 COMPARE HALFWORD (32<-16)
1660op_CHF uint32 = 0xE3CD // FORMAT_RXY1 COMPARE HIGH (32)
1661op_CHHR uint32 = 0xB9CD // FORMAT_RRE COMPARE HIGH (32)
1662op_CHHSI uint32 = 0xE554 // FORMAT_SIL COMPARE HALFWORD IMMEDIATE (16)
1663op_CHI uint32 = 0xA70E // FORMAT_RI1 COMPARE HALFWORD IMMEDIATE (32<-16)
1664op_CHLR uint32 = 0xB9DD // FORMAT_RRE COMPARE HIGH (32)
1665op_CHRL uint32 = 0xC605 // FORMAT_RIL2 COMPARE HALFWORD RELATIVE LONG (32<-16)
1666op_CHSI uint32 = 0xE55C // FORMAT_SIL COMPARE HALFWORD IMMEDIATE (32<-16)
1667op_CHY uint32 = 0xE379 // FORMAT_RXY1 COMPARE HALFWORD (32<-16)
1668op_CIB uint32 = 0xECFE // FORMAT_RIS COMPARE IMMEDIATE AND BRANCH (32<-8)
1669op_CIH uint32 = 0xCC0D // FORMAT_RIL1 COMPARE IMMEDIATE HIGH (32)
1670op_CIJ uint32 = 0xEC7E // FORMAT_RIE3 COMPARE IMMEDIATE AND BRANCH RELATIVE (32<-8)
1671op_CIT uint32 = 0xEC72 // FORMAT_RIE1 COMPARE IMMEDIATE AND TRAP (32<-16)
1672op_CKSM uint32 = 0xB241 // FORMAT_RRE CHECKSUM
1673op_CL uint32 = 0x5500 // FORMAT_RX1 COMPARE LOGICAL (32)
1674op_CLC uint32 = 0xD500 // FORMAT_SS1 COMPARE LOGICAL (character)
1675op_CLCL uint32 = 0x0F00 // FORMAT_RR COMPARE LOGICAL LONG
1676op_CLCLE uint32 = 0xA900 // FORMAT_RS1 COMPARE LOGICAL LONG EXTENDED
1677op_CLCLU uint32 = 0xEB8F // FORMAT_RSY1 COMPARE LOGICAL LONG UNICODE
1678op_CLFDBR uint32 = 0xB39D // FORMAT_RRF5 CONVERT TO LOGICAL (long BFP to 32)
1679op_CLFDTR uint32 = 0xB943 // FORMAT_RRF5 CONVERT TO LOGICAL (long DFP to 32)
1680op_CLFEBR uint32 = 0xB39C // FORMAT_RRF5 CONVERT TO LOGICAL (short BFP to 32)
1681op_CLFHSI uint32 = 0xE55D // FORMAT_SIL COMPARE LOGICAL IMMEDIATE (32<-16)
1682op_CLFI uint32 = 0xC20F // FORMAT_RIL1 COMPARE LOGICAL IMMEDIATE (32)
1683op_CLFIT uint32 = 0xEC73 // FORMAT_RIE1 COMPARE LOGICAL IMMEDIATE AND TRAP (32<-16)
1684op_CLFXBR uint32 = 0xB39E // FORMAT_RRF5 CONVERT TO LOGICAL (extended BFP to 32)
1685op_CLFXTR uint32 = 0xB94B // FORMAT_RRF5 CONVERT TO LOGICAL (extended DFP to 32)
1686op_CLG uint32 = 0xE321 // FORMAT_RXY1 COMPARE LOGICAL (64)
1687op_CLGDBR uint32 = 0xB3AD // FORMAT_RRF5 CONVERT TO LOGICAL (long BFP to 64)
1688op_CLGDTR uint32 = 0xB942 // FORMAT_RRF5 CONVERT TO LOGICAL (long DFP to 64)
1689op_CLGEBR uint32 = 0xB3AC // FORMAT_RRF5 CONVERT TO LOGICAL (short BFP to 64)
1690op_CLGF uint32 = 0xE331 // FORMAT_RXY1 COMPARE LOGICAL (64<-32)
1691op_CLGFI uint32 = 0xC20E // FORMAT_RIL1 COMPARE LOGICAL IMMEDIATE (64<-32)
1692op_CLGFR uint32 = 0xB931 // FORMAT_RRE COMPARE LOGICAL (64<-32)
1693op_CLGFRL uint32 = 0xC60E // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (64<-32)
1694op_CLGHRL uint32 = 0xC606 // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (64<-16)
1695op_CLGHSI uint32 = 0xE559 // FORMAT_SIL COMPARE LOGICAL IMMEDIATE (64<-16)
1696op_CLGIB uint32 = 0xECFD // FORMAT_RIS COMPARE LOGICAL IMMEDIATE AND BRANCH (64<-8)
1697op_CLGIJ uint32 = 0xEC7D // FORMAT_RIE3 COMPARE LOGICAL IMMEDIATE AND BRANCH RELATIVE (64<-8)
1698op_CLGIT uint32 = 0xEC71 // FORMAT_RIE1 COMPARE LOGICAL IMMEDIATE AND TRAP (64<-16)
1699op_CLGR uint32 = 0xB921 // FORMAT_RRE COMPARE LOGICAL (64)
1700op_CLGRB uint32 = 0xECE5 // FORMAT_RRS COMPARE LOGICAL AND BRANCH (64)
1701op_CLGRJ uint32 = 0xEC65 // FORMAT_RIE2 COMPARE LOGICAL AND BRANCH RELATIVE (64)
1702op_CLGRL uint32 = 0xC60A // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (64)
1703op_CLGRT uint32 = 0xB961 // FORMAT_RRF3 COMPARE LOGICAL AND TRAP (64)
1704op_CLGT uint32 = 0xEB2B // FORMAT_RSY2 COMPARE LOGICAL AND TRAP (64)
1705op_CLGXBR uint32 = 0xB3AE // FORMAT_RRF5 CONVERT TO LOGICAL (extended BFP to 64)
1706op_CLGXTR uint32 = 0xB94A // FORMAT_RRF5 CONVERT TO LOGICAL (extended DFP to 64)
1707op_CLHF uint32 = 0xE3CF // FORMAT_RXY1 COMPARE LOGICAL HIGH (32)
1708op_CLHHR uint32 = 0xB9CF // FORMAT_RRE COMPARE LOGICAL HIGH (32)
1709op_CLHHSI uint32 = 0xE555 // FORMAT_SIL COMPARE LOGICAL IMMEDIATE (16)
1710op_CLHLR uint32 = 0xB9DF // FORMAT_RRE COMPARE LOGICAL HIGH (32)
1711op_CLHRL uint32 = 0xC607 // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (32<-16)
1712op_CLI uint32 = 0x9500 // FORMAT_SI COMPARE LOGICAL (immediate)
1713op_CLIB uint32 = 0xECFF // FORMAT_RIS COMPARE LOGICAL IMMEDIATE AND BRANCH (32<-8)
1714op_CLIH uint32 = 0xCC0F // FORMAT_RIL1 COMPARE LOGICAL IMMEDIATE HIGH (32)
1715op_CLIJ uint32 = 0xEC7F // FORMAT_RIE3 COMPARE LOGICAL IMMEDIATE AND BRANCH RELATIVE (32<-8)
1716op_CLIY uint32 = 0xEB55 // FORMAT_SIY COMPARE LOGICAL (immediate)
1717op_CLM uint32 = 0xBD00 // FORMAT_RS2 COMPARE LOGICAL CHAR. UNDER MASK (low)
1718op_CLMH uint32 = 0xEB20 // FORMAT_RSY2 COMPARE LOGICAL CHAR. UNDER MASK (high)
1719op_CLMY uint32 = 0xEB21 // FORMAT_RSY2 COMPARE LOGICAL CHAR. UNDER MASK (low)
1720op_CLR uint32 = 0x1500 // FORMAT_RR COMPARE LOGICAL (32)
1721op_CLRB uint32 = 0xECF7 // FORMAT_RRS COMPARE LOGICAL AND BRANCH (32)
1722op_CLRJ uint32 = 0xEC77 // FORMAT_RIE2 COMPARE LOGICAL AND BRANCH RELATIVE (32)
1723op_CLRL uint32 = 0xC60F // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (32)
1724op_CLRT uint32 = 0xB973 // FORMAT_RRF3 COMPARE LOGICAL AND TRAP (32)
1725op_CLST uint32 = 0xB25D // FORMAT_RRE COMPARE LOGICAL STRING
1726op_CLT uint32 = 0xEB23 // FORMAT_RSY2 COMPARE LOGICAL AND TRAP (32)
1727op_CLY uint32 = 0xE355 // FORMAT_RXY1 COMPARE LOGICAL (32)
1728op_CMPSC uint32 = 0xB263 // FORMAT_RRE COMPRESSION CALL
1729op_CP uint32 = 0xF900 // FORMAT_SS2 COMPARE DECIMAL
1730op_CPSDR uint32 = 0xB372 // FORMAT_RRF2 COPY SIGN (long)
1731op_CPYA uint32 = 0xB24D // FORMAT_RRE COPY ACCESS
1732op_CR uint32 = 0x1900 // FORMAT_RR COMPARE (32)
1733op_CRB uint32 = 0xECF6 // FORMAT_RRS COMPARE AND BRANCH (32)
1734op_CRDTE uint32 = 0xB98F // FORMAT_RRF2 COMPARE AND REPLACE DAT TABLE ENTRY
1735op_CRJ uint32 = 0xEC76 // FORMAT_RIE2 COMPARE AND BRANCH RELATIVE (32)
1736op_CRL uint32 = 0xC60D // FORMAT_RIL2 COMPARE RELATIVE LONG (32)
1737op_CRT uint32 = 0xB972 // FORMAT_RRF3 COMPARE AND TRAP (32)
1738op_CS uint32 = 0xBA00 // FORMAT_RS1 COMPARE AND SWAP (32)
1739op_CSCH uint32 = 0xB230 // FORMAT_S CLEAR SUBCHANNEL
1740op_CSDTR uint32 = 0xB3E3 // FORMAT_RRF4 CONVERT TO SIGNED PACKED (long DFP to 64)
1741op_CSG uint32 = 0xEB30 // FORMAT_RSY1 COMPARE AND SWAP (64)
1742op_CSP uint32 = 0xB250 // FORMAT_RRE COMPARE AND SWAP AND PURGE
1743op_CSPG uint32 = 0xB98A // FORMAT_RRE COMPARE AND SWAP AND PURGE
1744op_CSST uint32 = 0xC802 // FORMAT_SSF COMPARE AND SWAP AND STORE
1745op_CSXTR uint32 = 0xB3EB // FORMAT_RRF4 CONVERT TO SIGNED PACKED (extended DFP to 128)
1746op_CSY uint32 = 0xEB14 // FORMAT_RSY1 COMPARE AND SWAP (32)
1747op_CU12 uint32 = 0xB2A7 // FORMAT_RRF3 CONVERT UTF-8 TO UTF-16
1748op_CU14 uint32 = 0xB9B0 // FORMAT_RRF3 CONVERT UTF-8 TO UTF-32
1749op_CU21 uint32 = 0xB2A6 // FORMAT_RRF3 CONVERT UTF-16 TO UTF-8
1750op_CU24 uint32 = 0xB9B1 // FORMAT_RRF3 CONVERT UTF-16 TO UTF-32
1751op_CU41 uint32 = 0xB9B2 // FORMAT_RRE CONVERT UTF-32 TO UTF-8
1752op_CU42 uint32 = 0xB9B3 // FORMAT_RRE CONVERT UTF-32 TO UTF-16
1753op_CUDTR uint32 = 0xB3E2 // FORMAT_RRE CONVERT TO UNSIGNED PACKED (long DFP to 64)
1754op_CUSE uint32 = 0xB257 // FORMAT_RRE COMPARE UNTIL SUBSTRING EQUAL
1755op_CUTFU uint32 = 0xB2A7 // FORMAT_RRF3 CONVERT UTF-8 TO UNICODE
1756op_CUUTF uint32 = 0xB2A6 // FORMAT_RRF3 CONVERT UNICODE TO UTF-8
1757op_CUXTR uint32 = 0xB3EA // FORMAT_RRE CONVERT TO UNSIGNED PACKED (extended DFP to 128)
1758op_CVB uint32 = 0x4F00 // FORMAT_RX1 CONVERT TO BINARY (32)
1759op_CVBG uint32 = 0xE30E // FORMAT_RXY1 CONVERT TO BINARY (64)
1760op_CVBY uint32 = 0xE306 // FORMAT_RXY1 CONVERT TO BINARY (32)
1761op_CVD uint32 = 0x4E00 // FORMAT_RX1 CONVERT TO DECIMAL (32)
1762op_CVDG uint32 = 0xE32E // FORMAT_RXY1 CONVERT TO DECIMAL (64)
1763op_CVDY uint32 = 0xE326 // FORMAT_RXY1 CONVERT TO DECIMAL (32)
1764op_CXBR uint32 = 0xB349 // FORMAT_RRE COMPARE (extended BFP)
1765op_CXFBR uint32 = 0xB396 // FORMAT_RRE CONVERT FROM FIXED (32 to extended BFP)
1766op_CXFBRA uint32 = 0xB396 // FORMAT_RRF5 CONVERT FROM FIXED (32 to extended BFP)
1767op_CXFR uint32 = 0xB3B6 // FORMAT_RRE CONVERT FROM FIXED (32 to extended HFP)
1768op_CXFTR uint32 = 0xB959 // FORMAT_RRE CONVERT FROM FIXED (32 to extended DFP)
1769op_CXGBR uint32 = 0xB3A6 // FORMAT_RRE CONVERT FROM FIXED (64 to extended BFP)
1770op_CXGBRA uint32 = 0xB3A6 // FORMAT_RRF5 CONVERT FROM FIXED (64 to extended BFP)
1771op_CXGR uint32 = 0xB3C6 // FORMAT_RRE CONVERT FROM FIXED (64 to extended HFP)
1772op_CXGTR uint32 = 0xB3F9 // FORMAT_RRE CONVERT FROM FIXED (64 to extended DFP)
1773op_CXGTRA uint32 = 0xB3F9 // FORMAT_RRF5 CONVERT FROM FIXED (64 to extended DFP)
1774op_CXLFBR uint32 = 0xB392 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to extended BFP)
1775op_CXLFTR uint32 = 0xB95B // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to extended DFP)
1776op_CXLGBR uint32 = 0xB3A2 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to extended BFP)
1777op_CXLGTR uint32 = 0xB95A // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to extended DFP)
1778op_CXR uint32 = 0xB369 // FORMAT_RRE COMPARE (extended HFP)
1779op_CXSTR uint32 = 0xB3FB // FORMAT_RRE CONVERT FROM SIGNED PACKED (128 to extended DFP)
1780op_CXTR uint32 = 0xB3EC // FORMAT_RRE COMPARE (extended DFP)
1781op_CXUTR uint32 = 0xB3FA // FORMAT_RRE CONVERT FROM UNSIGNED PACKED (128 to ext. DFP)
1782op_CXZT uint32 = 0xEDAB // FORMAT_RSL CONVERT FROM ZONED (to extended DFP)
1783op_CY uint32 = 0xE359 // FORMAT_RXY1 COMPARE (32)
1784op_CZDT uint32 = 0xEDA8 // FORMAT_RSL CONVERT TO ZONED (from long DFP)
1785op_CZXT uint32 = 0xEDA9 // FORMAT_RSL CONVERT TO ZONED (from extended DFP)
1786op_D uint32 = 0x5D00 // FORMAT_RX1 DIVIDE (32<-64)
1787op_DD uint32 = 0x6D00 // FORMAT_RX1 DIVIDE (long HFP)
1788op_DDB uint32 = 0xED1D // FORMAT_RXE DIVIDE (long BFP)
1789op_DDBR uint32 = 0xB31D // FORMAT_RRE DIVIDE (long BFP)
1790op_DDR uint32 = 0x2D00 // FORMAT_RR DIVIDE (long HFP)
1791op_DDTR uint32 = 0xB3D1 // FORMAT_RRF1 DIVIDE (long DFP)
1792op_DDTRA uint32 = 0xB3D1 // FORMAT_RRF1 DIVIDE (long DFP)
1793op_DE uint32 = 0x7D00 // FORMAT_RX1 DIVIDE (short HFP)
1794op_DEB uint32 = 0xED0D // FORMAT_RXE DIVIDE (short BFP)
1795op_DEBR uint32 = 0xB30D // FORMAT_RRE DIVIDE (short BFP)
1796op_DER uint32 = 0x3D00 // FORMAT_RR DIVIDE (short HFP)
1797op_DIDBR uint32 = 0xB35B // FORMAT_RRF2 DIVIDE TO INTEGER (long BFP)
1798op_DIEBR uint32 = 0xB353 // FORMAT_RRF2 DIVIDE TO INTEGER (short BFP)
1799op_DL uint32 = 0xE397 // FORMAT_RXY1 DIVIDE LOGICAL (32<-64)
1800op_DLG uint32 = 0xE387 // FORMAT_RXY1 DIVIDE LOGICAL (64<-128)
1801op_DLGR uint32 = 0xB987 // FORMAT_RRE DIVIDE LOGICAL (64<-128)
1802op_DLR uint32 = 0xB997 // FORMAT_RRE DIVIDE LOGICAL (32<-64)
1803op_DP uint32 = 0xFD00 // FORMAT_SS2 DIVIDE DECIMAL
1804op_DR uint32 = 0x1D00 // FORMAT_RR DIVIDE (32<-64)
1805op_DSG uint32 = 0xE30D // FORMAT_RXY1 DIVIDE SINGLE (64)
1806op_DSGF uint32 = 0xE31D // FORMAT_RXY1 DIVIDE SINGLE (64<-32)
1807op_DSGFR uint32 = 0xB91D // FORMAT_RRE DIVIDE SINGLE (64<-32)
1808op_DSGR uint32 = 0xB90D // FORMAT_RRE DIVIDE SINGLE (64)
1809op_DXBR uint32 = 0xB34D // FORMAT_RRE DIVIDE (extended BFP)
1810op_DXR uint32 = 0xB22D // FORMAT_RRE DIVIDE (extended HFP)
1811op_DXTR uint32 = 0xB3D9 // FORMAT_RRF1 DIVIDE (extended DFP)
1812op_DXTRA uint32 = 0xB3D9 // FORMAT_RRF1 DIVIDE (extended DFP)
1813op_EAR uint32 = 0xB24F // FORMAT_RRE EXTRACT ACCESS
1814op_ECAG uint32 = 0xEB4C // FORMAT_RSY1 EXTRACT CACHE ATTRIBUTE
1815op_ECTG uint32 = 0xC801 // FORMAT_SSF EXTRACT CPU TIME
1816op_ED uint32 = 0xDE00 // FORMAT_SS1 EDIT
1817op_EDMK uint32 = 0xDF00 // FORMAT_SS1 EDIT AND MARK
1818op_EEDTR uint32 = 0xB3E5 // FORMAT_RRE EXTRACT BIASED EXPONENT (long DFP to 64)
1819op_EEXTR uint32 = 0xB3ED // FORMAT_RRE EXTRACT BIASED EXPONENT (extended DFP to 64)
1820op_EFPC uint32 = 0xB38C // FORMAT_RRE EXTRACT FPC
1821op_EPAIR uint32 = 0xB99A // FORMAT_RRE EXTRACT PRIMARY ASN AND INSTANCE
1822op_EPAR uint32 = 0xB226 // FORMAT_RRE EXTRACT PRIMARY ASN
1823op_EPSW uint32 = 0xB98D // FORMAT_RRE EXTRACT PSW
1824op_EREG uint32 = 0xB249 // FORMAT_RRE EXTRACT STACKED REGISTERS (32)
1825op_EREGG uint32 = 0xB90E // FORMAT_RRE EXTRACT STACKED REGISTERS (64)
1826op_ESAIR uint32 = 0xB99B // FORMAT_RRE EXTRACT SECONDARY ASN AND INSTANCE
1827op_ESAR uint32 = 0xB227 // FORMAT_RRE EXTRACT SECONDARY ASN
1828op_ESDTR uint32 = 0xB3E7 // FORMAT_RRE EXTRACT SIGNIFICANCE (long DFP)
1829op_ESEA uint32 = 0xB99D // FORMAT_RRE EXTRACT AND SET EXTENDED AUTHORITY
1830op_ESTA uint32 = 0xB24A // FORMAT_RRE EXTRACT STACKED STATE
1831op_ESXTR uint32 = 0xB3EF // FORMAT_RRE EXTRACT SIGNIFICANCE (extended DFP)
1832op_ETND uint32 = 0xB2EC // FORMAT_RRE EXTRACT TRANSACTION NESTING DEPTH
1833op_EX uint32 = 0x4400 // FORMAT_RX1 EXECUTE
1834op_EXRL uint32 = 0xC600 // FORMAT_RIL2 EXECUTE RELATIVE LONG
1835op_FIDBR uint32 = 0xB35F // FORMAT_RRF5 LOAD FP INTEGER (long BFP)
1836op_FIDBRA uint32 = 0xB35F // FORMAT_RRF5 LOAD FP INTEGER (long BFP)
1837op_FIDR uint32 = 0xB37F // FORMAT_RRE LOAD FP INTEGER (long HFP)
1838op_FIDTR uint32 = 0xB3D7 // FORMAT_RRF5 LOAD FP INTEGER (long DFP)
1839op_FIEBR uint32 = 0xB357 // FORMAT_RRF5 LOAD FP INTEGER (short BFP)
1840op_FIEBRA uint32 = 0xB357 // FORMAT_RRF5 LOAD FP INTEGER (short BFP)
1841op_FIER uint32 = 0xB377 // FORMAT_RRE LOAD FP INTEGER (short HFP)
1842op_FIXBR uint32 = 0xB347 // FORMAT_RRF5 LOAD FP INTEGER (extended BFP)
1843op_FIXBRA uint32 = 0xB347 // FORMAT_RRF5 LOAD FP INTEGER (extended BFP)
1844op_FIXR uint32 = 0xB367 // FORMAT_RRE LOAD FP INTEGER (extended HFP)
1845op_FIXTR uint32 = 0xB3DF // FORMAT_RRF5 LOAD FP INTEGER (extended DFP)
1846op_FLOGR uint32 = 0xB983 // FORMAT_RRE FIND LEFTMOST ONE
1847op_HDR uint32 = 0x2400 // FORMAT_RR HALVE (long HFP)
1848op_HER uint32 = 0x3400 // FORMAT_RR HALVE (short HFP)
1849op_HSCH uint32 = 0xB231 // FORMAT_S HALT SUBCHANNEL
1850op_IAC uint32 = 0xB224 // FORMAT_RRE INSERT ADDRESS SPACE CONTROL
1851op_IC uint32 = 0x4300 // FORMAT_RX1 INSERT CHARACTER
1852op_ICM uint32 = 0xBF00 // FORMAT_RS2 INSERT CHARACTERS UNDER MASK (low)
1853op_ICMH uint32 = 0xEB80 // FORMAT_RSY2 INSERT CHARACTERS UNDER MASK (high)
1854op_ICMY uint32 = 0xEB81 // FORMAT_RSY2 INSERT CHARACTERS UNDER MASK (low)
1855op_ICY uint32 = 0xE373 // FORMAT_RXY1 INSERT CHARACTER
1856op_IDTE uint32 = 0xB98E // FORMAT_RRF2 INVALIDATE DAT TABLE ENTRY
1857op_IEDTR uint32 = 0xB3F6 // FORMAT_RRF2 INSERT BIASED EXPONENT (64 to long DFP)
1858op_IEXTR uint32 = 0xB3FE // FORMAT_RRF2 INSERT BIASED EXPONENT (64 to extended DFP)
1859op_IIHF uint32 = 0xC008 // FORMAT_RIL1 INSERT IMMEDIATE (high)
1860op_IIHH uint32 = 0xA500 // FORMAT_RI1 INSERT IMMEDIATE (high high)
1861op_IIHL uint32 = 0xA501 // FORMAT_RI1 INSERT IMMEDIATE (high low)
1862op_IILF uint32 = 0xC009 // FORMAT_RIL1 INSERT IMMEDIATE (low)
1863op_IILH uint32 = 0xA502 // FORMAT_RI1 INSERT IMMEDIATE (low high)
1864op_IILL uint32 = 0xA503 // FORMAT_RI1 INSERT IMMEDIATE (low low)
1865op_IPK uint32 = 0xB20B // FORMAT_S INSERT PSW KEY
1866op_IPM uint32 = 0xB222 // FORMAT_RRE INSERT PROGRAM MASK
1867op_IPTE uint32 = 0xB221 // FORMAT_RRF1 INVALIDATE PAGE TABLE ENTRY
1868op_ISKE uint32 = 0xB229 // FORMAT_RRE INSERT STORAGE KEY EXTENDED
1869op_IVSK uint32 = 0xB223 // FORMAT_RRE INSERT VIRTUAL STORAGE KEY
1870op_KDB uint32 = 0xED18 // FORMAT_RXE COMPARE AND SIGNAL (long BFP)
1871op_KDBR uint32 = 0xB318 // FORMAT_RRE COMPARE AND SIGNAL (long BFP)
1872op_KDTR uint32 = 0xB3E0 // FORMAT_RRE COMPARE AND SIGNAL (long DFP)
1873op_KEB uint32 = 0xED08 // FORMAT_RXE COMPARE AND SIGNAL (short BFP)
1874op_KEBR uint32 = 0xB308 // FORMAT_RRE COMPARE AND SIGNAL (short BFP)
1875op_KIMD uint32 = 0xB93E // FORMAT_RRE COMPUTE INTERMEDIATE MESSAGE DIGEST
1876op_KLMD uint32 = 0xB93F // FORMAT_RRE COMPUTE LAST MESSAGE DIGEST
1877op_KM uint32 = 0xB92E // FORMAT_RRE CIPHER MESSAGE
1878op_KMAC uint32 = 0xB91E // FORMAT_RRE COMPUTE MESSAGE AUTHENTICATION CODE
1879op_KMC uint32 = 0xB92F // FORMAT_RRE CIPHER MESSAGE WITH CHAINING
1880op_KMCTR uint32 = 0xB92D // FORMAT_RRF2 CIPHER MESSAGE WITH COUNTER
1881op_KMF uint32 = 0xB92A // FORMAT_RRE CIPHER MESSAGE WITH CFB
1882op_KMO uint32 = 0xB92B // FORMAT_RRE CIPHER MESSAGE WITH OFB
1883op_KXBR uint32 = 0xB348 // FORMAT_RRE COMPARE AND SIGNAL (extended BFP)
1884op_KXTR uint32 = 0xB3E8 // FORMAT_RRE COMPARE AND SIGNAL (extended DFP)
1885op_L uint32 = 0x5800 // FORMAT_RX1 LOAD (32)
1886op_LA uint32 = 0x4100 // FORMAT_RX1 LOAD ADDRESS
1887op_LAA uint32 = 0xEBF8 // FORMAT_RSY1 LOAD AND ADD (32)
1888op_LAAG uint32 = 0xEBE8 // FORMAT_RSY1 LOAD AND ADD (64)
1889op_LAAL uint32 = 0xEBFA // FORMAT_RSY1 LOAD AND ADD LOGICAL (32)
1890op_LAALG uint32 = 0xEBEA // FORMAT_RSY1 LOAD AND ADD LOGICAL (64)
1891op_LAE uint32 = 0x5100 // FORMAT_RX1 LOAD ADDRESS EXTENDED
1892op_LAEY uint32 = 0xE375 // FORMAT_RXY1 LOAD ADDRESS EXTENDED
1893op_LAM uint32 = 0x9A00 // FORMAT_RS1 LOAD ACCESS MULTIPLE
1894op_LAMY uint32 = 0xEB9A // FORMAT_RSY1 LOAD ACCESS MULTIPLE
1895op_LAN uint32 = 0xEBF4 // FORMAT_RSY1 LOAD AND AND (32)
1896op_LANG uint32 = 0xEBE4 // FORMAT_RSY1 LOAD AND AND (64)
1897op_LAO uint32 = 0xEBF6 // FORMAT_RSY1 LOAD AND OR (32)
1898op_LAOG uint32 = 0xEBE6 // FORMAT_RSY1 LOAD AND OR (64)
1899op_LARL uint32 = 0xC000 // FORMAT_RIL2 LOAD ADDRESS RELATIVE LONG
1900op_LASP uint32 = 0xE500 // FORMAT_SSE LOAD ADDRESS SPACE PARAMETERS
1901op_LAT uint32 = 0xE39F // FORMAT_RXY1 LOAD AND TRAP (32L<-32)
1902op_LAX uint32 = 0xEBF7 // FORMAT_RSY1 LOAD AND EXCLUSIVE OR (32)
1903op_LAXG uint32 = 0xEBE7 // FORMAT_RSY1 LOAD AND EXCLUSIVE OR (64)
1904op_LAY uint32 = 0xE371 // FORMAT_RXY1 LOAD ADDRESS
1905op_LB uint32 = 0xE376 // FORMAT_RXY1 LOAD BYTE (32)
1906op_LBH uint32 = 0xE3C0 // FORMAT_RXY1 LOAD BYTE HIGH (32<-8)
1907op_LBR uint32 = 0xB926 // FORMAT_RRE LOAD BYTE (32)
1908op_LCDBR uint32 = 0xB313 // FORMAT_RRE LOAD COMPLEMENT (long BFP)
1909op_LCDFR uint32 = 0xB373 // FORMAT_RRE LOAD COMPLEMENT (long)
1910op_LCDR uint32 = 0x2300 // FORMAT_RR LOAD COMPLEMENT (long HFP)
1911op_LCEBR uint32 = 0xB303 // FORMAT_RRE LOAD COMPLEMENT (short BFP)
1912op_LCER uint32 = 0x3300 // FORMAT_RR LOAD COMPLEMENT (short HFP)
1913op_LCGFR uint32 = 0xB913 // FORMAT_RRE LOAD COMPLEMENT (64<-32)
1914op_LCGR uint32 = 0xB903 // FORMAT_RRE LOAD COMPLEMENT (64)
1915op_LCR uint32 = 0x1300 // FORMAT_RR LOAD COMPLEMENT (32)
1916op_LCTL uint32 = 0xB700 // FORMAT_RS1 LOAD CONTROL (32)
1917op_LCTLG uint32 = 0xEB2F // FORMAT_RSY1 LOAD CONTROL (64)
1918op_LCXBR uint32 = 0xB343 // FORMAT_RRE LOAD COMPLEMENT (extended BFP)
1919op_LCXR uint32 = 0xB363 // FORMAT_RRE LOAD COMPLEMENT (extended HFP)
1920op_LD uint32 = 0x6800 // FORMAT_RX1 LOAD (long)
1921op_LDE uint32 = 0xED24 // FORMAT_RXE LOAD LENGTHENED (short to long HFP)
1922op_LDEB uint32 = 0xED04 // FORMAT_RXE LOAD LENGTHENED (short to long BFP)
1923op_LDEBR uint32 = 0xB304 // FORMAT_RRE LOAD LENGTHENED (short to long BFP)
1924op_LDER uint32 = 0xB324 // FORMAT_RRE LOAD LENGTHENED (short to long HFP)
1925op_LDETR uint32 = 0xB3D4 // FORMAT_RRF4 LOAD LENGTHENED (short to long DFP)
1926op_LDGR uint32 = 0xB3C1 // FORMAT_RRE LOAD FPR FROM GR (64 to long)
1927op_LDR uint32 = 0x2800 // FORMAT_RR LOAD (long)
1928op_LDXBR uint32 = 0xB345 // FORMAT_RRE LOAD ROUNDED (extended to long BFP)
1929op_LDXBRA uint32 = 0xB345 // FORMAT_RRF5 LOAD ROUNDED (extended to long BFP)
1930op_LDXR uint32 = 0x2500 // FORMAT_RR LOAD ROUNDED (extended to long HFP)
1931op_LDXTR uint32 = 0xB3DD // FORMAT_RRF5 LOAD ROUNDED (extended to long DFP)
1932op_LDY uint32 = 0xED65 // FORMAT_RXY1 LOAD (long)
1933op_LE uint32 = 0x7800 // FORMAT_RX1 LOAD (short)
1934op_LEDBR uint32 = 0xB344 // FORMAT_RRE LOAD ROUNDED (long to short BFP)
1935op_LEDBRA uint32 = 0xB344 // FORMAT_RRF5 LOAD ROUNDED (long to short BFP)
1936op_LEDR uint32 = 0x3500 // FORMAT_RR LOAD ROUNDED (long to short HFP)
1937op_LEDTR uint32 = 0xB3D5 // FORMAT_RRF5 LOAD ROUNDED (long to short DFP)
1938op_LER uint32 = 0x3800 // FORMAT_RR LOAD (short)
1939op_LEXBR uint32 = 0xB346 // FORMAT_RRE LOAD ROUNDED (extended to short BFP)
1940op_LEXBRA uint32 = 0xB346 // FORMAT_RRF5 LOAD ROUNDED (extended to short BFP)
1941op_LEXR uint32 = 0xB366 // FORMAT_RRE LOAD ROUNDED (extended to short HFP)
1942op_LEY uint32 = 0xED64 // FORMAT_RXY1 LOAD (short)
1943op_LFAS uint32 = 0xB2BD // FORMAT_S LOAD FPC AND SIGNAL
1944op_LFH uint32 = 0xE3CA // FORMAT_RXY1 LOAD HIGH (32)
1945op_LFHAT uint32 = 0xE3C8 // FORMAT_RXY1 LOAD HIGH AND TRAP (32H<-32)
1946op_LFPC uint32 = 0xB29D // FORMAT_S LOAD FPC
1947op_LG uint32 = 0xE304 // FORMAT_RXY1 LOAD (64)
1948op_LGAT uint32 = 0xE385 // FORMAT_RXY1 LOAD AND TRAP (64)
1949op_LGB uint32 = 0xE377 // FORMAT_RXY1 LOAD BYTE (64)
1950op_LGBR uint32 = 0xB906 // FORMAT_RRE LOAD BYTE (64)
1951op_LGDR uint32 = 0xB3CD // FORMAT_RRE LOAD GR FROM FPR (long to 64)
1952op_LGF uint32 = 0xE314 // FORMAT_RXY1 LOAD (64<-32)
1953op_LGFI uint32 = 0xC001 // FORMAT_RIL1 LOAD IMMEDIATE (64<-32)
1954op_LGFR uint32 = 0xB914 // FORMAT_RRE LOAD (64<-32)
1955op_LGFRL uint32 = 0xC40C // FORMAT_RIL2 LOAD RELATIVE LONG (64<-32)
1956op_LGH uint32 = 0xE315 // FORMAT_RXY1 LOAD HALFWORD (64)
1957op_LGHI uint32 = 0xA709 // FORMAT_RI1 LOAD HALFWORD IMMEDIATE (64)
1958op_LGHR uint32 = 0xB907 // FORMAT_RRE LOAD HALFWORD (64)
1959op_LGHRL uint32 = 0xC404 // FORMAT_RIL2 LOAD HALFWORD RELATIVE LONG (64<-16)
1960op_LGR uint32 = 0xB904 // FORMAT_RRE LOAD (64)
1961op_LGRL uint32 = 0xC408 // FORMAT_RIL2 LOAD RELATIVE LONG (64)
1962op_LH uint32 = 0x4800 // FORMAT_RX1 LOAD HALFWORD (32)
1963op_LHH uint32 = 0xE3C4 // FORMAT_RXY1 LOAD HALFWORD HIGH (32<-16)
1964op_LHI uint32 = 0xA708 // FORMAT_RI1 LOAD HALFWORD IMMEDIATE (32)
1965op_LHR uint32 = 0xB927 // FORMAT_RRE LOAD HALFWORD (32)
1966op_LHRL uint32 = 0xC405 // FORMAT_RIL2 LOAD HALFWORD RELATIVE LONG (32<-16)
1967op_LHY uint32 = 0xE378 // FORMAT_RXY1 LOAD HALFWORD (32)
1968op_LLC uint32 = 0xE394 // FORMAT_RXY1 LOAD LOGICAL CHARACTER (32)
1969op_LLCH uint32 = 0xE3C2 // FORMAT_RXY1 LOAD LOGICAL CHARACTER HIGH (32<-8)
1970op_LLCR uint32 = 0xB994 // FORMAT_RRE LOAD LOGICAL CHARACTER (32)
1971op_LLGC uint32 = 0xE390 // FORMAT_RXY1 LOAD LOGICAL CHARACTER (64)
1972op_LLGCR uint32 = 0xB984 // FORMAT_RRE LOAD LOGICAL CHARACTER (64)
1973op_LLGF uint32 = 0xE316 // FORMAT_RXY1 LOAD LOGICAL (64<-32)
1974op_LLGFAT uint32 = 0xE39D // FORMAT_RXY1 LOAD LOGICAL AND TRAP (64<-32)
1975op_LLGFR uint32 = 0xB916 // FORMAT_RRE LOAD LOGICAL (64<-32)
1976op_LLGFRL uint32 = 0xC40E // FORMAT_RIL2 LOAD LOGICAL RELATIVE LONG (64<-32)
1977op_LLGH uint32 = 0xE391 // FORMAT_RXY1 LOAD LOGICAL HALFWORD (64)
1978op_LLGHR uint32 = 0xB985 // FORMAT_RRE LOAD LOGICAL HALFWORD (64)
1979op_LLGHRL uint32 = 0xC406 // FORMAT_RIL2 LOAD LOGICAL HALFWORD RELATIVE LONG (64<-16)
1980op_LLGT uint32 = 0xE317 // FORMAT_RXY1 LOAD LOGICAL THIRTY ONE BITS
1981op_LLGTAT uint32 = 0xE39C // FORMAT_RXY1 LOAD LOGICAL THIRTY ONE BITS AND TRAP (64<-31)
1982op_LLGTR uint32 = 0xB917 // FORMAT_RRE LOAD LOGICAL THIRTY ONE BITS
1983op_LLH uint32 = 0xE395 // FORMAT_RXY1 LOAD LOGICAL HALFWORD (32)
1984op_LLHH uint32 = 0xE3C6 // FORMAT_RXY1 LOAD LOGICAL HALFWORD HIGH (32<-16)
1985op_LLHR uint32 = 0xB995 // FORMAT_RRE LOAD LOGICAL HALFWORD (32)
1986op_LLHRL uint32 = 0xC402 // FORMAT_RIL2 LOAD LOGICAL HALFWORD RELATIVE LONG (32<-16)
1987op_LLIHF uint32 = 0xC00E // FORMAT_RIL1 LOAD LOGICAL IMMEDIATE (high)
1988op_LLIHH uint32 = 0xA50C // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (high high)
1989op_LLIHL uint32 = 0xA50D // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (high low)
1990op_LLILF uint32 = 0xC00F // FORMAT_RIL1 LOAD LOGICAL IMMEDIATE (low)
1991op_LLILH uint32 = 0xA50E // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (low high)
1992op_LLILL uint32 = 0xA50F // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (low low)
1993op_LM uint32 = 0x9800 // FORMAT_RS1 LOAD MULTIPLE (32)
1994op_LMD uint32 = 0xEF00 // FORMAT_SS5 LOAD MULTIPLE DISJOINT
1995op_LMG uint32 = 0xEB04 // FORMAT_RSY1 LOAD MULTIPLE (64)
1996op_LMH uint32 = 0xEB96 // FORMAT_RSY1 LOAD MULTIPLE HIGH
1997op_LMY uint32 = 0xEB98 // FORMAT_RSY1 LOAD MULTIPLE (32)
1998op_LNDBR uint32 = 0xB311 // FORMAT_RRE LOAD NEGATIVE (long BFP)
1999op_LNDFR uint32 = 0xB371 // FORMAT_RRE LOAD NEGATIVE (long)
2000op_LNDR uint32 = 0x2100 // FORMAT_RR LOAD NEGATIVE (long HFP)
2001op_LNEBR uint32 = 0xB301 // FORMAT_RRE LOAD NEGATIVE (short BFP)
2002op_LNER uint32 = 0x3100 // FORMAT_RR LOAD NEGATIVE (short HFP)
2003op_LNGFR uint32 = 0xB911 // FORMAT_RRE LOAD NEGATIVE (64<-32)
2004op_LNGR uint32 = 0xB901 // FORMAT_RRE LOAD NEGATIVE (64)
2005op_LNR uint32 = 0x1100 // FORMAT_RR LOAD NEGATIVE (32)
2006op_LNXBR uint32 = 0xB341 // FORMAT_RRE LOAD NEGATIVE (extended BFP)
2007op_LNXR uint32 = 0xB361 // FORMAT_RRE LOAD NEGATIVE (extended HFP)
2008op_LOC uint32 = 0xEBF2 // FORMAT_RSY2 LOAD ON CONDITION (32)
2009op_LOCG uint32 = 0xEBE2 // FORMAT_RSY2 LOAD ON CONDITION (64)
2010op_LOCGR uint32 = 0xB9E2 // FORMAT_RRF3 LOAD ON CONDITION (64)
2011op_LOCR uint32 = 0xB9F2 // FORMAT_RRF3 LOAD ON CONDITION (32)
2012op_LPD uint32 = 0xC804 // FORMAT_SSF LOAD PAIR DISJOINT (32)
2013op_LPDBR uint32 = 0xB310 // FORMAT_RRE LOAD POSITIVE (long BFP)
2014op_LPDFR uint32 = 0xB370 // FORMAT_RRE LOAD POSITIVE (long)
2015op_LPDG uint32 = 0xC805 // FORMAT_SSF LOAD PAIR DISJOINT (64)
2016op_LPDR uint32 = 0x2000 // FORMAT_RR LOAD POSITIVE (long HFP)
2017op_LPEBR uint32 = 0xB300 // FORMAT_RRE LOAD POSITIVE (short BFP)
2018op_LPER uint32 = 0x3000 // FORMAT_RR LOAD POSITIVE (short HFP)
2019op_LPGFR uint32 = 0xB910 // FORMAT_RRE LOAD POSITIVE (64<-32)
2020op_LPGR uint32 = 0xB900 // FORMAT_RRE LOAD POSITIVE (64)
2021op_LPQ uint32 = 0xE38F // FORMAT_RXY1 LOAD PAIR FROM QUADWORD
2022op_LPR uint32 = 0x1000 // FORMAT_RR LOAD POSITIVE (32)
2023op_LPSW uint32 = 0x8200 // FORMAT_S LOAD PSW
2024op_LPSWE uint32 = 0xB2B2 // FORMAT_S LOAD PSW EXTENDED
2025op_LPTEA uint32 = 0xB9AA // FORMAT_RRF2 LOAD PAGE TABLE ENTRY ADDRESS
2026op_LPXBR uint32 = 0xB340 // FORMAT_RRE LOAD POSITIVE (extended BFP)
2027op_LPXR uint32 = 0xB360 // FORMAT_RRE LOAD POSITIVE (extended HFP)
2028op_LR uint32 = 0x1800 // FORMAT_RR LOAD (32)
2029op_LRA uint32 = 0xB100 // FORMAT_RX1 LOAD REAL ADDRESS (32)
2030op_LRAG uint32 = 0xE303 // FORMAT_RXY1 LOAD REAL ADDRESS (64)
2031op_LRAY uint32 = 0xE313 // FORMAT_RXY1 LOAD REAL ADDRESS (32)
2032op_LRDR uint32 = 0x2500 // FORMAT_RR LOAD ROUNDED (extended to long HFP)
2033op_LRER uint32 = 0x3500 // FORMAT_RR LOAD ROUNDED (long to short HFP)
2034op_LRL uint32 = 0xC40D // FORMAT_RIL2 LOAD RELATIVE LONG (32)
2035op_LRV uint32 = 0xE31E // FORMAT_RXY1 LOAD REVERSED (32)
2036op_LRVG uint32 = 0xE30F // FORMAT_RXY1 LOAD REVERSED (64)
2037op_LRVGR uint32 = 0xB90F // FORMAT_RRE LOAD REVERSED (64)
2038op_LRVH uint32 = 0xE31F // FORMAT_RXY1 LOAD REVERSED (16)
2039op_LRVR uint32 = 0xB91F // FORMAT_RRE LOAD REVERSED (32)
2040op_LT uint32 = 0xE312 // FORMAT_RXY1 LOAD AND TEST (32)
2041op_LTDBR uint32 = 0xB312 // FORMAT_RRE LOAD AND TEST (long BFP)
2042op_LTDR uint32 = 0x2200 // FORMAT_RR LOAD AND TEST (long HFP)
2043op_LTDTR uint32 = 0xB3D6 // FORMAT_RRE LOAD AND TEST (long DFP)
2044op_LTEBR uint32 = 0xB302 // FORMAT_RRE LOAD AND TEST (short BFP)
2045op_LTER uint32 = 0x3200 // FORMAT_RR LOAD AND TEST (short HFP)
2046op_LTG uint32 = 0xE302 // FORMAT_RXY1 LOAD AND TEST (64)
2047op_LTGF uint32 = 0xE332 // FORMAT_RXY1 LOAD AND TEST (64<-32)
2048op_LTGFR uint32 = 0xB912 // FORMAT_RRE LOAD AND TEST (64<-32)
2049op_LTGR uint32 = 0xB902 // FORMAT_RRE LOAD AND TEST (64)
2050op_LTR uint32 = 0x1200 // FORMAT_RR LOAD AND TEST (32)
2051op_LTXBR uint32 = 0xB342 // FORMAT_RRE LOAD AND TEST (extended BFP)
2052op_LTXR uint32 = 0xB362 // FORMAT_RRE LOAD AND TEST (extended HFP)
2053op_LTXTR uint32 = 0xB3DE // FORMAT_RRE LOAD AND TEST (extended DFP)
2054op_LURA uint32 = 0xB24B // FORMAT_RRE LOAD USING REAL ADDRESS (32)
2055op_LURAG uint32 = 0xB905 // FORMAT_RRE LOAD USING REAL ADDRESS (64)
2056op_LXD uint32 = 0xED25 // FORMAT_RXE LOAD LENGTHENED (long to extended HFP)
2057op_LXDB uint32 = 0xED05 // FORMAT_RXE LOAD LENGTHENED (long to extended BFP)
2058op_LXDBR uint32 = 0xB305 // FORMAT_RRE LOAD LENGTHENED (long to extended BFP)
2059op_LXDR uint32 = 0xB325 // FORMAT_RRE LOAD LENGTHENED (long to extended HFP)
2060op_LXDTR uint32 = 0xB3DC // FORMAT_RRF4 LOAD LENGTHENED (long to extended DFP)
2061op_LXE uint32 = 0xED26 // FORMAT_RXE LOAD LENGTHENED (short to extended HFP)
2062op_LXEB uint32 = 0xED06 // FORMAT_RXE LOAD LENGTHENED (short to extended BFP)
2063op_LXEBR uint32 = 0xB306 // FORMAT_RRE LOAD LENGTHENED (short to extended BFP)
2064op_LXER uint32 = 0xB326 // FORMAT_RRE LOAD LENGTHENED (short to extended HFP)
2065op_LXR uint32 = 0xB365 // FORMAT_RRE LOAD (extended)
2066op_LY uint32 = 0xE358 // FORMAT_RXY1 LOAD (32)
2067op_LZDR uint32 = 0xB375 // FORMAT_RRE LOAD ZERO (long)
2068op_LZER uint32 = 0xB374 // FORMAT_RRE LOAD ZERO (short)
2069op_LZXR uint32 = 0xB376 // FORMAT_RRE LOAD ZERO (extended)
2070op_M uint32 = 0x5C00 // FORMAT_RX1 MULTIPLY (64<-32)
2071op_MAD uint32 = 0xED3E // FORMAT_RXF MULTIPLY AND ADD (long HFP)
2072op_MADB uint32 = 0xED1E // FORMAT_RXF MULTIPLY AND ADD (long BFP)
2073op_MADBR uint32 = 0xB31E // FORMAT_RRD MULTIPLY AND ADD (long BFP)
2074op_MADR uint32 = 0xB33E // FORMAT_RRD MULTIPLY AND ADD (long HFP)
2075op_MAE uint32 = 0xED2E // FORMAT_RXF MULTIPLY AND ADD (short HFP)
2076op_MAEB uint32 = 0xED0E // FORMAT_RXF MULTIPLY AND ADD (short BFP)
2077op_MAEBR uint32 = 0xB30E // FORMAT_RRD MULTIPLY AND ADD (short BFP)
2078op_MAER uint32 = 0xB32E // FORMAT_RRD MULTIPLY AND ADD (short HFP)
2079op_MAY uint32 = 0xED3A // FORMAT_RXF MULTIPLY & ADD UNNORMALIZED (long to ext. HFP)
2080op_MAYH uint32 = 0xED3C // FORMAT_RXF MULTIPLY AND ADD UNNRM. (long to ext. high HFP)
2081op_MAYHR uint32 = 0xB33C // FORMAT_RRD MULTIPLY AND ADD UNNRM. (long to ext. high HFP)
2082op_MAYL uint32 = 0xED38 // FORMAT_RXF MULTIPLY AND ADD UNNRM. (long to ext. low HFP)
2083op_MAYLR uint32 = 0xB338 // FORMAT_RRD MULTIPLY AND ADD UNNRM. (long to ext. low HFP)
2084op_MAYR uint32 = 0xB33A // FORMAT_RRD MULTIPLY & ADD UNNORMALIZED (long to ext. HFP)
2085op_MC uint32 = 0xAF00 // FORMAT_SI MONITOR CALL
2086op_MD uint32 = 0x6C00 // FORMAT_RX1 MULTIPLY (long HFP)
2087op_MDB uint32 = 0xED1C // FORMAT_RXE MULTIPLY (long BFP)
2088op_MDBR uint32 = 0xB31C // FORMAT_RRE MULTIPLY (long BFP)
2089op_MDE uint32 = 0x7C00 // FORMAT_RX1 MULTIPLY (short to long HFP)
2090op_MDEB uint32 = 0xED0C // FORMAT_RXE MULTIPLY (short to long BFP)
2091op_MDEBR uint32 = 0xB30C // FORMAT_RRE MULTIPLY (short to long BFP)
2092op_MDER uint32 = 0x3C00 // FORMAT_RR MULTIPLY (short to long HFP)
2093op_MDR uint32 = 0x2C00 // FORMAT_RR MULTIPLY (long HFP)
2094op_MDTR uint32 = 0xB3D0 // FORMAT_RRF1 MULTIPLY (long DFP)
2095op_MDTRA uint32 = 0xB3D0 // FORMAT_RRF1 MULTIPLY (long DFP)
2096op_ME uint32 = 0x7C00 // FORMAT_RX1 MULTIPLY (short to long HFP)
2097op_MEE uint32 = 0xED37 // FORMAT_RXE MULTIPLY (short HFP)
2098op_MEEB uint32 = 0xED17 // FORMAT_RXE MULTIPLY (short BFP)
2099op_MEEBR uint32 = 0xB317 // FORMAT_RRE MULTIPLY (short BFP)
2100op_MEER uint32 = 0xB337 // FORMAT_RRE MULTIPLY (short HFP)
2101op_MER uint32 = 0x3C00 // FORMAT_RR MULTIPLY (short to long HFP)
2102op_MFY uint32 = 0xE35C // FORMAT_RXY1 MULTIPLY (64<-32)
2103op_MGHI uint32 = 0xA70D // FORMAT_RI1 MULTIPLY HALFWORD IMMEDIATE (64)
2104op_MH uint32 = 0x4C00 // FORMAT_RX1 MULTIPLY HALFWORD (32)
2105op_MHI uint32 = 0xA70C // FORMAT_RI1 MULTIPLY HALFWORD IMMEDIATE (32)
2106op_MHY uint32 = 0xE37C // FORMAT_RXY1 MULTIPLY HALFWORD (32)
2107op_ML uint32 = 0xE396 // FORMAT_RXY1 MULTIPLY LOGICAL (64<-32)
2108op_MLG uint32 = 0xE386 // FORMAT_RXY1 MULTIPLY LOGICAL (128<-64)
2109op_MLGR uint32 = 0xB986 // FORMAT_RRE MULTIPLY LOGICAL (128<-64)
2110op_MLR uint32 = 0xB996 // FORMAT_RRE MULTIPLY LOGICAL (64<-32)
2111op_MP uint32 = 0xFC00 // FORMAT_SS2 MULTIPLY DECIMAL
2112op_MR uint32 = 0x1C00 // FORMAT_RR MULTIPLY (64<-32)
2113op_MS uint32 = 0x7100 // FORMAT_RX1 MULTIPLY SINGLE (32)
2114op_MSCH uint32 = 0xB232 // FORMAT_S MODIFY SUBCHANNEL
2115op_MSD uint32 = 0xED3F // FORMAT_RXF MULTIPLY AND SUBTRACT (long HFP)
2116op_MSDB uint32 = 0xED1F // FORMAT_RXF MULTIPLY AND SUBTRACT (long BFP)
2117op_MSDBR uint32 = 0xB31F // FORMAT_RRD MULTIPLY AND SUBTRACT (long BFP)
2118op_MSDR uint32 = 0xB33F // FORMAT_RRD MULTIPLY AND SUBTRACT (long HFP)
2119op_MSE uint32 = 0xED2F // FORMAT_RXF MULTIPLY AND SUBTRACT (short HFP)
2120op_MSEB uint32 = 0xED0F // FORMAT_RXF MULTIPLY AND SUBTRACT (short BFP)
2121op_MSEBR uint32 = 0xB30F // FORMAT_RRD MULTIPLY AND SUBTRACT (short BFP)
2122op_MSER uint32 = 0xB32F // FORMAT_RRD MULTIPLY AND SUBTRACT (short HFP)
2123op_MSFI uint32 = 0xC201 // FORMAT_RIL1 MULTIPLY SINGLE IMMEDIATE (32)
2124op_MSG uint32 = 0xE30C // FORMAT_RXY1 MULTIPLY SINGLE (64)
2125op_MSGF uint32 = 0xE31C // FORMAT_RXY1 MULTIPLY SINGLE (64<-32)
2126op_MSGFI uint32 = 0xC200 // FORMAT_RIL1 MULTIPLY SINGLE IMMEDIATE (64<-32)
2127op_MSGFR uint32 = 0xB91C // FORMAT_RRE MULTIPLY SINGLE (64<-32)
2128op_MSGR uint32 = 0xB90C // FORMAT_RRE MULTIPLY SINGLE (64)
2129op_MSR uint32 = 0xB252 // FORMAT_RRE MULTIPLY SINGLE (32)
2130op_MSTA uint32 = 0xB247 // FORMAT_RRE MODIFY STACKED STATE
2131op_MSY uint32 = 0xE351 // FORMAT_RXY1 MULTIPLY SINGLE (32)
2132op_MVC uint32 = 0xD200 // FORMAT_SS1 MOVE (character)
2133op_MVCDK uint32 = 0xE50F // FORMAT_SSE MOVE WITH DESTINATION KEY
2134op_MVCIN uint32 = 0xE800 // FORMAT_SS1 MOVE INVERSE
2135op_MVCK uint32 = 0xD900 // FORMAT_SS4 MOVE WITH KEY
2136op_MVCL uint32 = 0x0E00 // FORMAT_RR MOVE LONG
2137op_MVCLE uint32 = 0xA800 // FORMAT_RS1 MOVE LONG EXTENDED
2138op_MVCLU uint32 = 0xEB8E // FORMAT_RSY1 MOVE LONG UNICODE
2139op_MVCOS uint32 = 0xC800 // FORMAT_SSF MOVE WITH OPTIONAL SPECIFICATIONS
2140op_MVCP uint32 = 0xDA00 // FORMAT_SS4 MOVE TO PRIMARY
2141op_MVCS uint32 = 0xDB00 // FORMAT_SS4 MOVE TO SECONDARY
2142op_MVCSK uint32 = 0xE50E // FORMAT_SSE MOVE WITH SOURCE KEY
2143op_MVGHI uint32 = 0xE548 // FORMAT_SIL MOVE (64<-16)
2144op_MVHHI uint32 = 0xE544 // FORMAT_SIL MOVE (16<-16)
2145op_MVHI uint32 = 0xE54C // FORMAT_SIL MOVE (32<-16)
2146op_MVI uint32 = 0x9200 // FORMAT_SI MOVE (immediate)
2147op_MVIY uint32 = 0xEB52 // FORMAT_SIY MOVE (immediate)
2148op_MVN uint32 = 0xD100 // FORMAT_SS1 MOVE NUMERICS
2149op_MVO uint32 = 0xF100 // FORMAT_SS2 MOVE WITH OFFSET
2150op_MVPG uint32 = 0xB254 // FORMAT_RRE MOVE PAGE
2151op_MVST uint32 = 0xB255 // FORMAT_RRE MOVE STRING
2152op_MVZ uint32 = 0xD300 // FORMAT_SS1 MOVE ZONES
2153op_MXBR uint32 = 0xB34C // FORMAT_RRE MULTIPLY (extended BFP)
2154op_MXD uint32 = 0x6700 // FORMAT_RX1 MULTIPLY (long to extended HFP)
2155op_MXDB uint32 = 0xED07 // FORMAT_RXE MULTIPLY (long to extended BFP)
2156op_MXDBR uint32 = 0xB307 // FORMAT_RRE MULTIPLY (long to extended BFP)
2157op_MXDR uint32 = 0x2700 // FORMAT_RR MULTIPLY (long to extended HFP)
2158op_MXR uint32 = 0x2600 // FORMAT_RR MULTIPLY (extended HFP)
2159op_MXTR uint32 = 0xB3D8 // FORMAT_RRF1 MULTIPLY (extended DFP)
2160op_MXTRA uint32 = 0xB3D8 // FORMAT_RRF1 MULTIPLY (extended DFP)
2161op_MY uint32 = 0xED3B // FORMAT_RXF MULTIPLY UNNORMALIZED (long to ext. HFP)
2162op_MYH uint32 = 0xED3D // FORMAT_RXF MULTIPLY UNNORM. (long to ext. high HFP)
2163op_MYHR uint32 = 0xB33D // FORMAT_RRD MULTIPLY UNNORM. (long to ext. high HFP)
2164op_MYL uint32 = 0xED39 // FORMAT_RXF MULTIPLY UNNORM. (long to ext. low HFP)
2165op_MYLR uint32 = 0xB339 // FORMAT_RRD MULTIPLY UNNORM. (long to ext. low HFP)
2166op_MYR uint32 = 0xB33B // FORMAT_RRD MULTIPLY UNNORMALIZED (long to ext. HFP)
2167op_N uint32 = 0x5400 // FORMAT_RX1 AND (32)
2168op_NC uint32 = 0xD400 // FORMAT_SS1 AND (character)
2169op_NG uint32 = 0xE380 // FORMAT_RXY1 AND (64)
2170op_NGR uint32 = 0xB980 // FORMAT_RRE AND (64)
2171op_NGRK uint32 = 0xB9E4 // FORMAT_RRF1 AND (64)
2172op_NI uint32 = 0x9400 // FORMAT_SI AND (immediate)
2173op_NIAI uint32 = 0xB2FA // FORMAT_IE NEXT INSTRUCTION ACCESS INTENT
2174op_NIHF uint32 = 0xC00A // FORMAT_RIL1 AND IMMEDIATE (high)
2175op_NIHH uint32 = 0xA504 // FORMAT_RI1 AND IMMEDIATE (high high)
2176op_NIHL uint32 = 0xA505 // FORMAT_RI1 AND IMMEDIATE (high low)
2177op_NILF uint32 = 0xC00B // FORMAT_RIL1 AND IMMEDIATE (low)
2178op_NILH uint32 = 0xA506 // FORMAT_RI1 AND IMMEDIATE (low high)
2179op_NILL uint32 = 0xA507 // FORMAT_RI1 AND IMMEDIATE (low low)
2180op_NIY uint32 = 0xEB54 // FORMAT_SIY AND (immediate)
2181op_NR uint32 = 0x1400 // FORMAT_RR AND (32)
2182op_NRK uint32 = 0xB9F4 // FORMAT_RRF1 AND (32)
2183op_NTSTG uint32 = 0xE325 // FORMAT_RXY1 NONTRANSACTIONAL STORE
2184op_NY uint32 = 0xE354 // FORMAT_RXY1 AND (32)
2185op_O uint32 = 0x5600 // FORMAT_RX1 OR (32)
2186op_OC uint32 = 0xD600 // FORMAT_SS1 OR (character)
2187op_OG uint32 = 0xE381 // FORMAT_RXY1 OR (64)
2188op_OGR uint32 = 0xB981 // FORMAT_RRE OR (64)
2189op_OGRK uint32 = 0xB9E6 // FORMAT_RRF1 OR (64)
2190op_OI uint32 = 0x9600 // FORMAT_SI OR (immediate)
2191op_OIHF uint32 = 0xC00C // FORMAT_RIL1 OR IMMEDIATE (high)
2192op_OIHH uint32 = 0xA508 // FORMAT_RI1 OR IMMEDIATE (high high)
2193op_OIHL uint32 = 0xA509 // FORMAT_RI1 OR IMMEDIATE (high low)
2194op_OILF uint32 = 0xC00D // FORMAT_RIL1 OR IMMEDIATE (low)
2195op_OILH uint32 = 0xA50A // FORMAT_RI1 OR IMMEDIATE (low high)
2196op_OILL uint32 = 0xA50B // FORMAT_RI1 OR IMMEDIATE (low low)
2197op_OIY uint32 = 0xEB56 // FORMAT_SIY OR (immediate)
2198op_OR uint32 = 0x1600 // FORMAT_RR OR (32)
2199op_ORK uint32 = 0xB9F6 // FORMAT_RRF1 OR (32)
2200op_OY uint32 = 0xE356 // FORMAT_RXY1 OR (32)
2201op_PACK uint32 = 0xF200 // FORMAT_SS2 PACK
2202op_PALB uint32 = 0xB248 // FORMAT_RRE PURGE ALB
2203op_PC uint32 = 0xB218 // FORMAT_S PROGRAM CALL
2204op_PCC uint32 = 0xB92C // FORMAT_RRE PERFORM CRYPTOGRAPHIC COMPUTATION
2205op_PCKMO uint32 = 0xB928 // FORMAT_RRE PERFORM CRYPTOGRAPHIC KEY MGMT. OPERATIONS
2206op_PFD uint32 = 0xE336 // FORMAT_RXY2 PREFETCH DATA
2207op_PFDRL uint32 = 0xC602 // FORMAT_RIL3 PREFETCH DATA RELATIVE LONG
2208op_PFMF uint32 = 0xB9AF // FORMAT_RRE PERFORM FRAME MANAGEMENT FUNCTION
2209op_PFPO uint32 = 0x010A // FORMAT_E PERFORM FLOATING-POINT OPERATION
2210op_PGIN uint32 = 0xB22E // FORMAT_RRE PAGE IN
2211op_PGOUT uint32 = 0xB22F // FORMAT_RRE PAGE OUT
2212op_PKA uint32 = 0xE900 // FORMAT_SS6 PACK ASCII
2213op_PKU uint32 = 0xE100 // FORMAT_SS6 PACK UNICODE
2214op_PLO uint32 = 0xEE00 // FORMAT_SS5 PERFORM LOCKED OPERATION
2215op_POPCNT uint32 = 0xB9E1 // FORMAT_RRE POPULATION COUNT
2216op_PPA uint32 = 0xB2E8 // FORMAT_RRF3 PERFORM PROCESSOR ASSIST
2217op_PR uint32 = 0x0101 // FORMAT_E PROGRAM RETURN
2218op_PT uint32 = 0xB228 // FORMAT_RRE PROGRAM TRANSFER
2219op_PTF uint32 = 0xB9A2 // FORMAT_RRE PERFORM TOPOLOGY FUNCTION
2220op_PTFF uint32 = 0x0104 // FORMAT_E PERFORM TIMING FACILITY FUNCTION
2221op_PTI uint32 = 0xB99E // FORMAT_RRE PROGRAM TRANSFER WITH INSTANCE
2222op_PTLB uint32 = 0xB20D // FORMAT_S PURGE TLB
2223op_QADTR uint32 = 0xB3F5 // FORMAT_RRF2 QUANTIZE (long DFP)
2224op_QAXTR uint32 = 0xB3FD // FORMAT_RRF2 QUANTIZE (extended DFP)
2225op_RCHP uint32 = 0xB23B // FORMAT_S RESET CHANNEL PATH
2226op_RISBG uint32 = 0xEC55 // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS
2227op_RISBGN uint32 = 0xEC59 // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS
2228op_RISBHG uint32 = 0xEC5D // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS HIGH
2229op_RISBLG uint32 = 0xEC51 // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS LOW
2230op_RLL uint32 = 0xEB1D // FORMAT_RSY1 ROTATE LEFT SINGLE LOGICAL (32)
2231op_RLLG uint32 = 0xEB1C // FORMAT_RSY1 ROTATE LEFT SINGLE LOGICAL (64)
2232op_RNSBG uint32 = 0xEC54 // FORMAT_RIE6 ROTATE THEN AND SELECTED BITS
2233op_ROSBG uint32 = 0xEC56 // FORMAT_RIE6 ROTATE THEN OR SELECTED BITS
2234op_RP uint32 = 0xB277 // FORMAT_S RESUME PROGRAM
2235op_RRBE uint32 = 0xB22A // FORMAT_RRE RESET REFERENCE BIT EXTENDED
2236op_RRBM uint32 = 0xB9AE // FORMAT_RRE RESET REFERENCE BITS MULTIPLE
2237op_RRDTR uint32 = 0xB3F7 // FORMAT_RRF2 REROUND (long DFP)
2238op_RRXTR uint32 = 0xB3FF // FORMAT_RRF2 REROUND (extended DFP)
2239op_RSCH uint32 = 0xB238 // FORMAT_S RESUME SUBCHANNEL
2240op_RXSBG uint32 = 0xEC57 // FORMAT_RIE6 ROTATE THEN EXCLUSIVE OR SELECTED BITS
2241op_S uint32 = 0x5B00 // FORMAT_RX1 SUBTRACT (32)
2242op_SAC uint32 = 0xB219 // FORMAT_S SET ADDRESS SPACE CONTROL
2243op_SACF uint32 = 0xB279 // FORMAT_S SET ADDRESS SPACE CONTROL FAST
2244op_SAL uint32 = 0xB237 // FORMAT_S SET ADDRESS LIMIT
2245op_SAM24 uint32 = 0x010C // FORMAT_E SET ADDRESSING MODE (24)
2246op_SAM31 uint32 = 0x010D // FORMAT_E SET ADDRESSING MODE (31)
2247op_SAM64 uint32 = 0x010E // FORMAT_E SET ADDRESSING MODE (64)
2248op_SAR uint32 = 0xB24E // FORMAT_RRE SET ACCESS
2249op_SCHM uint32 = 0xB23C // FORMAT_S SET CHANNEL MONITOR
2250op_SCK uint32 = 0xB204 // FORMAT_S SET CLOCK
2251op_SCKC uint32 = 0xB206 // FORMAT_S SET CLOCK COMPARATOR
2252op_SCKPF uint32 = 0x0107 // FORMAT_E SET CLOCK PROGRAMMABLE FIELD
2253op_SD uint32 = 0x6B00 // FORMAT_RX1 SUBTRACT NORMALIZED (long HFP)
2254op_SDB uint32 = 0xED1B // FORMAT_RXE SUBTRACT (long BFP)
2255op_SDBR uint32 = 0xB31B // FORMAT_RRE SUBTRACT (long BFP)
2256op_SDR uint32 = 0x2B00 // FORMAT_RR SUBTRACT NORMALIZED (long HFP)
2257op_SDTR uint32 = 0xB3D3 // FORMAT_RRF1 SUBTRACT (long DFP)
2258op_SDTRA uint32 = 0xB3D3 // FORMAT_RRF1 SUBTRACT (long DFP)
2259op_SE uint32 = 0x7B00 // FORMAT_RX1 SUBTRACT NORMALIZED (short HFP)
2260op_SEB uint32 = 0xED0B // FORMAT_RXE SUBTRACT (short BFP)
2261op_SEBR uint32 = 0xB30B // FORMAT_RRE SUBTRACT (short BFP)
2262op_SER uint32 = 0x3B00 // FORMAT_RR SUBTRACT NORMALIZED (short HFP)
2263op_SFASR uint32 = 0xB385 // FORMAT_RRE SET FPC AND SIGNAL
2264op_SFPC uint32 = 0xB384 // FORMAT_RRE SET FPC
2265op_SG uint32 = 0xE309 // FORMAT_RXY1 SUBTRACT (64)
2266op_SGF uint32 = 0xE319 // FORMAT_RXY1 SUBTRACT (64<-32)
2267op_SGFR uint32 = 0xB919 // FORMAT_RRE SUBTRACT (64<-32)
2268op_SGR uint32 = 0xB909 // FORMAT_RRE SUBTRACT (64)
2269op_SGRK uint32 = 0xB9E9 // FORMAT_RRF1 SUBTRACT (64)
2270op_SH uint32 = 0x4B00 // FORMAT_RX1 SUBTRACT HALFWORD
2271op_SHHHR uint32 = 0xB9C9 // FORMAT_RRF1 SUBTRACT HIGH (32)
2272op_SHHLR uint32 = 0xB9D9 // FORMAT_RRF1 SUBTRACT HIGH (32)
2273op_SHY uint32 = 0xE37B // FORMAT_RXY1 SUBTRACT HALFWORD
2274op_SIGP uint32 = 0xAE00 // FORMAT_RS1 SIGNAL PROCESSOR
2275op_SL uint32 = 0x5F00 // FORMAT_RX1 SUBTRACT LOGICAL (32)
2276op_SLA uint32 = 0x8B00 // FORMAT_RS1 SHIFT LEFT SINGLE (32)
2277op_SLAG uint32 = 0xEB0B // FORMAT_RSY1 SHIFT LEFT SINGLE (64)
2278op_SLAK uint32 = 0xEBDD // FORMAT_RSY1 SHIFT LEFT SINGLE (32)
2279op_SLB uint32 = 0xE399 // FORMAT_RXY1 SUBTRACT LOGICAL WITH BORROW (32)
2280op_SLBG uint32 = 0xE389 // FORMAT_RXY1 SUBTRACT LOGICAL WITH BORROW (64)
2281op_SLBGR uint32 = 0xB989 // FORMAT_RRE SUBTRACT LOGICAL WITH BORROW (64)
2282op_SLBR uint32 = 0xB999 // FORMAT_RRE SUBTRACT LOGICAL WITH BORROW (32)
2283op_SLDA uint32 = 0x8F00 // FORMAT_RS1 SHIFT LEFT DOUBLE
2284op_SLDL uint32 = 0x8D00 // FORMAT_RS1 SHIFT LEFT DOUBLE LOGICAL
2285op_SLDT uint32 = 0xED40 // FORMAT_RXF SHIFT SIGNIFICAND LEFT (long DFP)
2286op_SLFI uint32 = 0xC205 // FORMAT_RIL1 SUBTRACT LOGICAL IMMEDIATE (32)
2287op_SLG uint32 = 0xE30B // FORMAT_RXY1 SUBTRACT LOGICAL (64)
2288op_SLGF uint32 = 0xE31B // FORMAT_RXY1 SUBTRACT LOGICAL (64<-32)
2289op_SLGFI uint32 = 0xC204 // FORMAT_RIL1 SUBTRACT LOGICAL IMMEDIATE (64<-32)
2290op_SLGFR uint32 = 0xB91B // FORMAT_RRE SUBTRACT LOGICAL (64<-32)
2291op_SLGR uint32 = 0xB90B // FORMAT_RRE SUBTRACT LOGICAL (64)
2292op_SLGRK uint32 = 0xB9EB // FORMAT_RRF1 SUBTRACT LOGICAL (64)
2293op_SLHHHR uint32 = 0xB9CB // FORMAT_RRF1 SUBTRACT LOGICAL HIGH (32)
2294op_SLHHLR uint32 = 0xB9DB // FORMAT_RRF1 SUBTRACT LOGICAL HIGH (32)
2295op_SLL uint32 = 0x8900 // FORMAT_RS1 SHIFT LEFT SINGLE LOGICAL (32)
2296op_SLLG uint32 = 0xEB0D // FORMAT_RSY1 SHIFT LEFT SINGLE LOGICAL (64)
2297op_SLLK uint32 = 0xEBDF // FORMAT_RSY1 SHIFT LEFT SINGLE LOGICAL (32)
2298op_SLR uint32 = 0x1F00 // FORMAT_RR SUBTRACT LOGICAL (32)
2299op_SLRK uint32 = 0xB9FB // FORMAT_RRF1 SUBTRACT LOGICAL (32)
2300op_SLXT uint32 = 0xED48 // FORMAT_RXF SHIFT SIGNIFICAND LEFT (extended DFP)
2301op_SLY uint32 = 0xE35F // FORMAT_RXY1 SUBTRACT LOGICAL (32)
2302op_SP uint32 = 0xFB00 // FORMAT_SS2 SUBTRACT DECIMAL
2303op_SPKA uint32 = 0xB20A // FORMAT_S SET PSW KEY FROM ADDRESS
2304op_SPM uint32 = 0x0400 // FORMAT_RR SET PROGRAM MASK
2305op_SPT uint32 = 0xB208 // FORMAT_S SET CPU TIMER
2306op_SPX uint32 = 0xB210 // FORMAT_S SET PREFIX
2307op_SQD uint32 = 0xED35 // FORMAT_RXE SQUARE ROOT (long HFP)
2308op_SQDB uint32 = 0xED15 // FORMAT_RXE SQUARE ROOT (long BFP)
2309op_SQDBR uint32 = 0xB315 // FORMAT_RRE SQUARE ROOT (long BFP)
2310op_SQDR uint32 = 0xB244 // FORMAT_RRE SQUARE ROOT (long HFP)
2311op_SQE uint32 = 0xED34 // FORMAT_RXE SQUARE ROOT (short HFP)
2312op_SQEB uint32 = 0xED14 // FORMAT_RXE SQUARE ROOT (short BFP)
2313op_SQEBR uint32 = 0xB314 // FORMAT_RRE SQUARE ROOT (short BFP)
2314op_SQER uint32 = 0xB245 // FORMAT_RRE SQUARE ROOT (short HFP)
2315op_SQXBR uint32 = 0xB316 // FORMAT_RRE SQUARE ROOT (extended BFP)
2316op_SQXR uint32 = 0xB336 // FORMAT_RRE SQUARE ROOT (extended HFP)
2317op_SR uint32 = 0x1B00 // FORMAT_RR SUBTRACT (32)
2318op_SRA uint32 = 0x8A00 // FORMAT_RS1 SHIFT RIGHT SINGLE (32)
2319op_SRAG uint32 = 0xEB0A // FORMAT_RSY1 SHIFT RIGHT SINGLE (64)
2320op_SRAK uint32 = 0xEBDC // FORMAT_RSY1 SHIFT RIGHT SINGLE (32)
2321op_SRDA uint32 = 0x8E00 // FORMAT_RS1 SHIFT RIGHT DOUBLE
2322op_SRDL uint32 = 0x8C00 // FORMAT_RS1 SHIFT RIGHT DOUBLE LOGICAL
2323op_SRDT uint32 = 0xED41 // FORMAT_RXF SHIFT SIGNIFICAND RIGHT (long DFP)
2324op_SRK uint32 = 0xB9F9 // FORMAT_RRF1 SUBTRACT (32)
2325op_SRL uint32 = 0x8800 // FORMAT_RS1 SHIFT RIGHT SINGLE LOGICAL (32)
2326op_SRLG uint32 = 0xEB0C // FORMAT_RSY1 SHIFT RIGHT SINGLE LOGICAL (64)
2327op_SRLK uint32 = 0xEBDE // FORMAT_RSY1 SHIFT RIGHT SINGLE LOGICAL (32)
2328op_SRNM uint32 = 0xB299 // FORMAT_S SET BFP ROUNDING MODE (2 bit)
2329op_SRNMB uint32 = 0xB2B8 // FORMAT_S SET BFP ROUNDING MODE (3 bit)
2330op_SRNMT uint32 = 0xB2B9 // FORMAT_S SET DFP ROUNDING MODE
2331op_SRP uint32 = 0xF000 // FORMAT_SS3 SHIFT AND ROUND DECIMAL
2332op_SRST uint32 = 0xB25E // FORMAT_RRE SEARCH STRING
2333op_SRSTU uint32 = 0xB9BE // FORMAT_RRE SEARCH STRING UNICODE
2334op_SRXT uint32 = 0xED49 // FORMAT_RXF SHIFT SIGNIFICAND RIGHT (extended DFP)
2335op_SSAIR uint32 = 0xB99F // FORMAT_RRE SET SECONDARY ASN WITH INSTANCE
2336op_SSAR uint32 = 0xB225 // FORMAT_RRE SET SECONDARY ASN
2337op_SSCH uint32 = 0xB233 // FORMAT_S START SUBCHANNEL
2338op_SSKE uint32 = 0xB22B // FORMAT_RRF3 SET STORAGE KEY EXTENDED
2339op_SSM uint32 = 0x8000 // FORMAT_S SET SYSTEM MASK
2340op_ST uint32 = 0x5000 // FORMAT_RX1 STORE (32)
2341op_STAM uint32 = 0x9B00 // FORMAT_RS1 STORE ACCESS MULTIPLE
2342op_STAMY uint32 = 0xEB9B // FORMAT_RSY1 STORE ACCESS MULTIPLE
2343op_STAP uint32 = 0xB212 // FORMAT_S STORE CPU ADDRESS
2344op_STC uint32 = 0x4200 // FORMAT_RX1 STORE CHARACTER
2345op_STCH uint32 = 0xE3C3 // FORMAT_RXY1 STORE CHARACTER HIGH (8)
2346op_STCK uint32 = 0xB205 // FORMAT_S STORE CLOCK
2347op_STCKC uint32 = 0xB207 // FORMAT_S STORE CLOCK COMPARATOR
2348op_STCKE uint32 = 0xB278 // FORMAT_S STORE CLOCK EXTENDED
2349op_STCKF uint32 = 0xB27C // FORMAT_S STORE CLOCK FAST
2350op_STCM uint32 = 0xBE00 // FORMAT_RS2 STORE CHARACTERS UNDER MASK (low)
2351op_STCMH uint32 = 0xEB2C // FORMAT_RSY2 STORE CHARACTERS UNDER MASK (high)
2352op_STCMY uint32 = 0xEB2D // FORMAT_RSY2 STORE CHARACTERS UNDER MASK (low)
2353op_STCPS uint32 = 0xB23A // FORMAT_S STORE CHANNEL PATH STATUS
2354op_STCRW uint32 = 0xB239 // FORMAT_S STORE CHANNEL REPORT WORD
2355op_STCTG uint32 = 0xEB25 // FORMAT_RSY1 STORE CONTROL (64)
2356op_STCTL uint32 = 0xB600 // FORMAT_RS1 STORE CONTROL (32)
2357op_STCY uint32 = 0xE372 // FORMAT_RXY1 STORE CHARACTER
2358op_STD uint32 = 0x6000 // FORMAT_RX1 STORE (long)
2359op_STDY uint32 = 0xED67 // FORMAT_RXY1 STORE (long)
2360op_STE uint32 = 0x7000 // FORMAT_RX1 STORE (short)
2361op_STEY uint32 = 0xED66 // FORMAT_RXY1 STORE (short)
2362op_STFH uint32 = 0xE3CB // FORMAT_RXY1 STORE HIGH (32)
2363op_STFL uint32 = 0xB2B1 // FORMAT_S STORE FACILITY LIST
2364op_STFLE uint32 = 0xB2B0 // FORMAT_S STORE FACILITY LIST EXTENDED
2365op_STFPC uint32 = 0xB29C // FORMAT_S STORE FPC
2366op_STG uint32 = 0xE324 // FORMAT_RXY1 STORE (64)
2367op_STGRL uint32 = 0xC40B // FORMAT_RIL2 STORE RELATIVE LONG (64)
2368op_STH uint32 = 0x4000 // FORMAT_RX1 STORE HALFWORD
2369op_STHH uint32 = 0xE3C7 // FORMAT_RXY1 STORE HALFWORD HIGH (16)
2370op_STHRL uint32 = 0xC407 // FORMAT_RIL2 STORE HALFWORD RELATIVE LONG
2371op_STHY uint32 = 0xE370 // FORMAT_RXY1 STORE HALFWORD
2372op_STIDP uint32 = 0xB202 // FORMAT_S STORE CPU ID
2373op_STM uint32 = 0x9000 // FORMAT_RS1 STORE MULTIPLE (32)
2374op_STMG uint32 = 0xEB24 // FORMAT_RSY1 STORE MULTIPLE (64)
2375op_STMH uint32 = 0xEB26 // FORMAT_RSY1 STORE MULTIPLE HIGH
2376op_STMY uint32 = 0xEB90 // FORMAT_RSY1 STORE MULTIPLE (32)
2377op_STNSM uint32 = 0xAC00 // FORMAT_SI STORE THEN AND SYSTEM MASK
2378op_STOC uint32 = 0xEBF3 // FORMAT_RSY2 STORE ON CONDITION (32)
2379op_STOCG uint32 = 0xEBE3 // FORMAT_RSY2 STORE ON CONDITION (64)
2380op_STOSM uint32 = 0xAD00 // FORMAT_SI STORE THEN OR SYSTEM MASK
2381op_STPQ uint32 = 0xE38E // FORMAT_RXY1 STORE PAIR TO QUADWORD
2382op_STPT uint32 = 0xB209 // FORMAT_S STORE CPU TIMER
2383op_STPX uint32 = 0xB211 // FORMAT_S STORE PREFIX
2384op_STRAG uint32 = 0xE502 // FORMAT_SSE STORE REAL ADDRESS
2385op_STRL uint32 = 0xC40F // FORMAT_RIL2 STORE RELATIVE LONG (32)
2386op_STRV uint32 = 0xE33E // FORMAT_RXY1 STORE REVERSED (32)
2387op_STRVG uint32 = 0xE32F // FORMAT_RXY1 STORE REVERSED (64)
2388op_STRVH uint32 = 0xE33F // FORMAT_RXY1 STORE REVERSED (16)
2389op_STSCH uint32 = 0xB234 // FORMAT_S STORE SUBCHANNEL
2390op_STSI uint32 = 0xB27D // FORMAT_S STORE SYSTEM INFORMATION
2391op_STURA uint32 = 0xB246 // FORMAT_RRE STORE USING REAL ADDRESS (32)
2392op_STURG uint32 = 0xB925 // FORMAT_RRE STORE USING REAL ADDRESS (64)
2393op_STY uint32 = 0xE350 // FORMAT_RXY1 STORE (32)
2394op_SU uint32 = 0x7F00 // FORMAT_RX1 SUBTRACT UNNORMALIZED (short HFP)
2395op_SUR uint32 = 0x3F00 // FORMAT_RR SUBTRACT UNNORMALIZED (short HFP)
2396op_SVC uint32 = 0x0A00 // FORMAT_I SUPERVISOR CALL
2397op_SW uint32 = 0x6F00 // FORMAT_RX1 SUBTRACT UNNORMALIZED (long HFP)
2398op_SWR uint32 = 0x2F00 // FORMAT_RR SUBTRACT UNNORMALIZED (long HFP)
2399op_SXBR uint32 = 0xB34B // FORMAT_RRE SUBTRACT (extended BFP)
2400op_SXR uint32 = 0x3700 // FORMAT_RR SUBTRACT NORMALIZED (extended HFP)
2401op_SXTR uint32 = 0xB3DB // FORMAT_RRF1 SUBTRACT (extended DFP)
2402op_SXTRA uint32 = 0xB3DB // FORMAT_RRF1 SUBTRACT (extended DFP)
2403op_SY uint32 = 0xE35B // FORMAT_RXY1 SUBTRACT (32)
2404op_TABORT uint32 = 0xB2FC // FORMAT_S TRANSACTION ABORT
2405op_TAM uint32 = 0x010B // FORMAT_E TEST ADDRESSING MODE
2406op_TAR uint32 = 0xB24C // FORMAT_RRE TEST ACCESS
2407op_TB uint32 = 0xB22C // FORMAT_RRE TEST BLOCK
2408op_TBDR uint32 = 0xB351 // FORMAT_RRF5 CONVERT HFP TO BFP (long)
2409op_TBEDR uint32 = 0xB350 // FORMAT_RRF5 CONVERT HFP TO BFP (long to short)
2410op_TBEGIN uint32 = 0xE560 // FORMAT_SIL TRANSACTION BEGIN
2411op_TBEGINC uint32 = 0xE561 // FORMAT_SIL TRANSACTION BEGIN
2412op_TCDB uint32 = 0xED11 // FORMAT_RXE TEST DATA CLASS (long BFP)
2413op_TCEB uint32 = 0xED10 // FORMAT_RXE TEST DATA CLASS (short BFP)
2414op_TCXB uint32 = 0xED12 // FORMAT_RXE TEST DATA CLASS (extended BFP)
2415op_TDCDT uint32 = 0xED54 // FORMAT_RXE TEST DATA CLASS (long DFP)
2416op_TDCET uint32 = 0xED50 // FORMAT_RXE TEST DATA CLASS (short DFP)
2417op_TDCXT uint32 = 0xED58 // FORMAT_RXE TEST DATA CLASS (extended DFP)
2418op_TDGDT uint32 = 0xED55 // FORMAT_RXE TEST DATA GROUP (long DFP)
2419op_TDGET uint32 = 0xED51 // FORMAT_RXE TEST DATA GROUP (short DFP)
2420op_TDGXT uint32 = 0xED59 // FORMAT_RXE TEST DATA GROUP (extended DFP)
2421op_TEND uint32 = 0xB2F8 // FORMAT_S TRANSACTION END
2422op_THDER uint32 = 0xB358 // FORMAT_RRE CONVERT BFP TO HFP (short to long)
2423op_THDR uint32 = 0xB359 // FORMAT_RRE CONVERT BFP TO HFP (long)
2424op_TM uint32 = 0x9100 // FORMAT_SI TEST UNDER MASK
2425op_TMH uint32 = 0xA700 // FORMAT_RI1 TEST UNDER MASK HIGH
2426op_TMHH uint32 = 0xA702 // FORMAT_RI1 TEST UNDER MASK (high high)
2427op_TMHL uint32 = 0xA703 // FORMAT_RI1 TEST UNDER MASK (high low)
2428op_TML uint32 = 0xA701 // FORMAT_RI1 TEST UNDER MASK LOW
2429op_TMLH uint32 = 0xA700 // FORMAT_RI1 TEST UNDER MASK (low high)
2430op_TMLL uint32 = 0xA701 // FORMAT_RI1 TEST UNDER MASK (low low)
2431op_TMY uint32 = 0xEB51 // FORMAT_SIY TEST UNDER MASK
2432op_TP uint32 = 0xEBC0 // FORMAT_RSL TEST DECIMAL
2433op_TPI uint32 = 0xB236 // FORMAT_S TEST PENDING INTERRUPTION
2434op_TPROT uint32 = 0xE501 // FORMAT_SSE TEST PROTECTION
2435op_TR uint32 = 0xDC00 // FORMAT_SS1 TRANSLATE
2436op_TRACE uint32 = 0x9900 // FORMAT_RS1 TRACE (32)
2437op_TRACG uint32 = 0xEB0F // FORMAT_RSY1 TRACE (64)
2438op_TRAP2 uint32 = 0x01FF // FORMAT_E TRAP
2439op_TRAP4 uint32 = 0xB2FF // FORMAT_S TRAP
2440op_TRE uint32 = 0xB2A5 // FORMAT_RRE TRANSLATE EXTENDED
2441op_TROO uint32 = 0xB993 // FORMAT_RRF3 TRANSLATE ONE TO ONE
2442op_TROT uint32 = 0xB992 // FORMAT_RRF3 TRANSLATE ONE TO TWO
2443op_TRT uint32 = 0xDD00 // FORMAT_SS1 TRANSLATE AND TEST
2444op_TRTE uint32 = 0xB9BF // FORMAT_RRF3 TRANSLATE AND TEST EXTENDED
2445op_TRTO uint32 = 0xB991 // FORMAT_RRF3 TRANSLATE TWO TO ONE
2446op_TRTR uint32 = 0xD000 // FORMAT_SS1 TRANSLATE AND TEST REVERSE
2447op_TRTRE uint32 = 0xB9BD // FORMAT_RRF3 TRANSLATE AND TEST REVERSE EXTENDED
2448op_TRTT uint32 = 0xB990 // FORMAT_RRF3 TRANSLATE TWO TO TWO
2449op_TS uint32 = 0x9300 // FORMAT_S TEST AND SET
2450op_TSCH uint32 = 0xB235 // FORMAT_S TEST SUBCHANNEL
2451op_UNPK uint32 = 0xF300 // FORMAT_SS2 UNPACK
2452op_UNPKA uint32 = 0xEA00 // FORMAT_SS1 UNPACK ASCII
2453op_UNPKU uint32 = 0xE200 // FORMAT_SS1 UNPACK UNICODE
2454op_UPT uint32 = 0x0102 // FORMAT_E UPDATE TREE
2455op_X uint32 = 0x5700 // FORMAT_RX1 EXCLUSIVE OR (32)
2456op_XC uint32 = 0xD700 // FORMAT_SS1 EXCLUSIVE OR (character)
2457op_XG uint32 = 0xE382 // FORMAT_RXY1 EXCLUSIVE OR (64)
2458op_XGR uint32 = 0xB982 // FORMAT_RRE EXCLUSIVE OR (64)
2459op_XGRK uint32 = 0xB9E7 // FORMAT_RRF1 EXCLUSIVE OR (64)
2460op_XI uint32 = 0x9700 // FORMAT_SI EXCLUSIVE OR (immediate)
2461op_XIHF uint32 = 0xC006 // FORMAT_RIL1 EXCLUSIVE OR IMMEDIATE (high)
2462op_XILF uint32 = 0xC007 // FORMAT_RIL1 EXCLUSIVE OR IMMEDIATE (low)
2463op_XIY uint32 = 0xEB57 // FORMAT_SIY EXCLUSIVE OR (immediate)
2464op_XR uint32 = 0x1700 // FORMAT_RR EXCLUSIVE OR (32)
2465op_XRK uint32 = 0xB9F7 // FORMAT_RRF1 EXCLUSIVE OR (32)
2466op_XSCH uint32 = 0xB276 // FORMAT_S CANCEL SUBCHANNEL
2467op_XY uint32 = 0xE357 // FORMAT_RXY1 EXCLUSIVE OR (32)
2468op_ZAP uint32 = 0xF800 // FORMAT_SS2 ZERO AND ADD
2469
2470// added in z13
2471op_CXPT uint32 = 0xEDAF // RSL-b CONVERT FROM PACKED (to extended DFP)
2472op_CDPT uint32 = 0xEDAE // RSL-b CONVERT FROM PACKED (to long DFP)
2473op_CPXT uint32 = 0xEDAD // RSL-b CONVERT TO PACKED (from extended DFP)
2474op_CPDT uint32 = 0xEDAC // RSL-b CONVERT TO PACKED (from long DFP)
2475op_LZRF uint32 = 0xE33B // RXY-a LOAD AND ZERO RIGHTMOST BYTE (32)
2476op_LZRG uint32 = 0xE32A // RXY-a LOAD AND ZERO RIGHTMOST BYTE (64)
2477op_LCCB uint32 = 0xE727 // RXE LOAD COUNT TO BLOCK BOUNDARY
2478op_LOCHHI uint32 = 0xEC4E // RIE-g LOAD HALFWORD HIGH IMMEDIATE ON CONDITION (32←16)
2479op_LOCHI uint32 = 0xEC42 // RIE-g LOAD HALFWORD IMMEDIATE ON CONDITION (32←16)
2480op_LOCGHI uint32 = 0xEC46 // RIE-g LOAD HALFWORD IMMEDIATE ON CONDITION (64←16)
2481op_LOCFH uint32 = 0xEBE0 // RSY-b LOAD HIGH ON CONDITION (32)
2482op_LOCFHR uint32 = 0xB9E0 // RRF-c LOAD HIGH ON CONDITION (32)
2483op_LLZRGF uint32 = 0xE33A // RXY-a LOAD LOGICAL AND ZERO RIGHTMOST BYTE (64←32)
2484op_STOCFH uint32 = 0xEBE1 // RSY-b STORE HIGH ON CONDITION
2485op_VA uint32 = 0xE7F3 // VRR-c VECTOR ADD
2486op_VACC uint32 = 0xE7F1 // VRR-c VECTOR ADD COMPUTE CARRY
2487op_VAC uint32 = 0xE7BB // VRR-d VECTOR ADD WITH CARRY
2488op_VACCC uint32 = 0xE7B9 // VRR-d VECTOR ADD WITH CARRY COMPUTE CARRY
2489op_VN uint32 = 0xE768 // VRR-c VECTOR AND
2490op_VNC uint32 = 0xE769 // VRR-c VECTOR AND WITH COMPLEMENT
2491op_VAVG uint32 = 0xE7F2 // VRR-c VECTOR AVERAGE
2492op_VAVGL uint32 = 0xE7F0 // VRR-c VECTOR AVERAGE LOGICAL
2493op_VCKSM uint32 = 0xE766 // VRR-c VECTOR CHECKSUM
2494op_VCEQ uint32 = 0xE7F8 // VRR-b VECTOR COMPARE EQUAL
2495op_VCH uint32 = 0xE7FB // VRR-b VECTOR COMPARE HIGH
2496op_VCHL uint32 = 0xE7F9 // VRR-b VECTOR COMPARE HIGH LOGICAL
2497op_VCLZ uint32 = 0xE753 // VRR-a VECTOR COUNT LEADING ZEROS
2498op_VCTZ uint32 = 0xE752 // VRR-a VECTOR COUNT TRAILING ZEROS
2499op_VEC uint32 = 0xE7DB // VRR-a VECTOR ELEMENT COMPARE
2500op_VECL uint32 = 0xE7D9 // VRR-a VECTOR ELEMENT COMPARE LOGICAL
2501op_VERIM uint32 = 0xE772 // VRI-d VECTOR ELEMENT ROTATE AND INSERT UNDER MASK
2502op_VERLL uint32 = 0xE733 // VRS-a VECTOR ELEMENT ROTATE LEFT LOGICAL
2503op_VERLLV uint32 = 0xE773 // VRR-c VECTOR ELEMENT ROTATE LEFT LOGICAL
2504op_VESLV uint32 = 0xE770 // VRR-c VECTOR ELEMENT SHIFT LEFT
2505op_VESL uint32 = 0xE730 // VRS-a VECTOR ELEMENT SHIFT LEFT
2506op_VESRA uint32 = 0xE73A // VRS-a VECTOR ELEMENT SHIFT RIGHT ARITHMETIC
2507op_VESRAV uint32 = 0xE77A // VRR-c VECTOR ELEMENT SHIFT RIGHT ARITHMETIC
2508op_VESRL uint32 = 0xE738 // VRS-a VECTOR ELEMENT SHIFT RIGHT LOGICAL
2509op_VESRLV uint32 = 0xE778 // VRR-c VECTOR ELEMENT SHIFT RIGHT LOGICAL
2510op_VX uint32 = 0xE76D // VRR-c VECTOR EXCLUSIVE OR
2511op_VFAE uint32 = 0xE782 // VRR-b VECTOR FIND ANY ELEMENT EQUAL
2512op_VFEE uint32 = 0xE780 // VRR-b VECTOR FIND ELEMENT EQUAL
2513op_VFENE uint32 = 0xE781 // VRR-b VECTOR FIND ELEMENT NOT EQUAL
2514op_VFA uint32 = 0xE7E3 // VRR-c VECTOR FP ADD
2515op_WFK uint32 = 0xE7CA // VRR-a VECTOR FP COMPARE AND SIGNAL SCALAR
2516op_VFCE uint32 = 0xE7E8 // VRR-c VECTOR FP COMPARE EQUAL
2517op_VFCH uint32 = 0xE7EB // VRR-c VECTOR FP COMPARE HIGH
2518op_VFCHE uint32 = 0xE7EA // VRR-c VECTOR FP COMPARE HIGH OR EQUAL
2519op_WFC uint32 = 0xE7CB // VRR-a VECTOR FP COMPARE SCALAR
2520op_VCDG uint32 = 0xE7C3 // VRR-a VECTOR FP CONVERT FROM FIXED 64-BIT
2521op_VCDLG uint32 = 0xE7C1 // VRR-a VECTOR FP CONVERT FROM LOGICAL 64-BIT
2522op_VCGD uint32 = 0xE7C2 // VRR-a VECTOR FP CONVERT TO FIXED 64-BIT
2523op_VCLGD uint32 = 0xE7C0 // VRR-a VECTOR FP CONVERT TO LOGICAL 64-BIT
2524op_VFD uint32 = 0xE7E5 // VRR-c VECTOR FP DIVIDE
2525op_VLDE uint32 = 0xE7C4 // VRR-a VECTOR FP LOAD LENGTHENED
2526op_VLED uint32 = 0xE7C5 // VRR-a VECTOR FP LOAD ROUNDED
2527op_VFM uint32 = 0xE7E7 // VRR-c VECTOR FP MULTIPLY
2528op_VFMA uint32 = 0xE78F // VRR-e VECTOR FP MULTIPLY AND ADD
2529op_VFMS uint32 = 0xE78E // VRR-e VECTOR FP MULTIPLY AND SUBTRACT
2530op_VFPSO uint32 = 0xE7CC // VRR-a VECTOR FP PERFORM SIGN OPERATION
2531op_VFSQ uint32 = 0xE7CE // VRR-a VECTOR FP SQUARE ROOT
2532op_VFS uint32 = 0xE7E2 // VRR-c VECTOR FP SUBTRACT
2533op_VFTCI uint32 = 0xE74A // VRI-e VECTOR FP TEST DATA CLASS IMMEDIATE
2534op_VGFM uint32 = 0xE7B4 // VRR-c VECTOR GALOIS FIELD MULTIPLY SUM
2535op_VGFMA uint32 = 0xE7BC // VRR-d VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE
2536op_VGEF uint32 = 0xE713 // VRV VECTOR GATHER ELEMENT (32)
2537op_VGEG uint32 = 0xE712 // VRV VECTOR GATHER ELEMENT (64)
2538op_VGBM uint32 = 0xE744 // VRI-a VECTOR GENERATE BYTE MASK
2539op_VGM uint32 = 0xE746 // VRI-b VECTOR GENERATE MASK
2540op_VISTR uint32 = 0xE75C // VRR-a VECTOR ISOLATE STRING
2541op_VL uint32 = 0xE706 // VRX VECTOR LOAD
2542op_VLR uint32 = 0xE756 // VRR-a VECTOR LOAD
2543op_VLREP uint32 = 0xE705 // VRX VECTOR LOAD AND REPLICATE
2544op_VLC uint32 = 0xE7DE // VRR-a VECTOR LOAD COMPLEMENT
2545op_VLEH uint32 = 0xE701 // VRX VECTOR LOAD ELEMENT (16)
2546op_VLEF uint32 = 0xE703 // VRX VECTOR LOAD ELEMENT (32)
2547op_VLEG uint32 = 0xE702 // VRX VECTOR LOAD ELEMENT (64)
2548op_VLEB uint32 = 0xE700 // VRX VECTOR LOAD ELEMENT (8)
2549op_VLEIH uint32 = 0xE741 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (16)
2550op_VLEIF uint32 = 0xE743 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (32)
2551op_VLEIG uint32 = 0xE742 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (64)
2552op_VLEIB uint32 = 0xE740 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (8)
2553op_VFI uint32 = 0xE7C7 // VRR-a VECTOR LOAD FP INTEGER
2554op_VLGV uint32 = 0xE721 // VRS-c VECTOR LOAD GR FROM VR ELEMENT
2555op_VLLEZ uint32 = 0xE704 // VRX VECTOR LOAD LOGICAL ELEMENT AND ZERO
2556op_VLM uint32 = 0xE736 // VRS-a VECTOR LOAD MULTIPLE
2557op_VLP uint32 = 0xE7DF // VRR-a VECTOR LOAD POSITIVE
2558op_VLBB uint32 = 0xE707 // VRX VECTOR LOAD TO BLOCK BOUNDARY
2559op_VLVG uint32 = 0xE722 // VRS-b VECTOR LOAD VR ELEMENT FROM GR
2560op_VLVGP uint32 = 0xE762 // VRR-f VECTOR LOAD VR FROM GRS DISJOINT
2561op_VLL uint32 = 0xE737 // VRS-b VECTOR LOAD WITH LENGTH
2562op_VMX uint32 = 0xE7FF // VRR-c VECTOR MAXIMUM
2563op_VMXL uint32 = 0xE7FD // VRR-c VECTOR MAXIMUM LOGICAL
2564op_VMRH uint32 = 0xE761 // VRR-c VECTOR MERGE HIGH
2565op_VMRL uint32 = 0xE760 // VRR-c VECTOR MERGE LOW
2566op_VMN uint32 = 0xE7FE // VRR-c VECTOR MINIMUM
2567op_VMNL uint32 = 0xE7FC // VRR-c VECTOR MINIMUM LOGICAL
2568op_VMAE uint32 = 0xE7AE // VRR-d VECTOR MULTIPLY AND ADD EVEN
2569op_VMAH uint32 = 0xE7AB // VRR-d VECTOR MULTIPLY AND ADD HIGH
2570op_VMALE uint32 = 0xE7AC // VRR-d VECTOR MULTIPLY AND ADD LOGICAL EVEN
2571op_VMALH uint32 = 0xE7A9 // VRR-d VECTOR MULTIPLY AND ADD LOGICAL HIGH
2572op_VMALO uint32 = 0xE7AD // VRR-d VECTOR MULTIPLY AND ADD LOGICAL ODD
2573op_VMAL uint32 = 0xE7AA // VRR-d VECTOR MULTIPLY AND ADD LOW
2574op_VMAO uint32 = 0xE7AF // VRR-d VECTOR MULTIPLY AND ADD ODD
2575op_VME uint32 = 0xE7A6 // VRR-c VECTOR MULTIPLY EVEN
2576op_VMH uint32 = 0xE7A3 // VRR-c VECTOR MULTIPLY HIGH
2577op_VMLE uint32 = 0xE7A4 // VRR-c VECTOR MULTIPLY EVEN LOGICAL
2578op_VMLH uint32 = 0xE7A1 // VRR-c VECTOR MULTIPLY HIGH LOGICAL
2579op_VMLO uint32 = 0xE7A5 // VRR-c VECTOR MULTIPLY ODD LOGICAL
2580op_VML uint32 = 0xE7A2 // VRR-c VECTOR MULTIPLY LOW
2581op_VMO uint32 = 0xE7A7 // VRR-c VECTOR MULTIPLY ODD
2582op_VNO uint32 = 0xE76B // VRR-c VECTOR NOR
2583op_VO uint32 = 0xE76A // VRR-c VECTOR OR
2584op_VPK uint32 = 0xE794 // VRR-c VECTOR PACK
2585op_VPKLS uint32 = 0xE795 // VRR-b VECTOR PACK LOGICAL SATURATE
2586op_VPKS uint32 = 0xE797 // VRR-b VECTOR PACK SATURATE
2587op_VPERM uint32 = 0xE78C // VRR-e VECTOR PERMUTE
2588op_VPDI uint32 = 0xE784 // VRR-c VECTOR PERMUTE DOUBLEWORD IMMEDIATE
2589op_VPOPCT uint32 = 0xE750 // VRR-a VECTOR POPULATION COUNT
2590op_VREP uint32 = 0xE74D // VRI-c VECTOR REPLICATE
2591op_VREPI uint32 = 0xE745 // VRI-a VECTOR REPLICATE IMMEDIATE
2592op_VSCEF uint32 = 0xE71B // VRV VECTOR SCATTER ELEMENT (32)
2593op_VSCEG uint32 = 0xE71A // VRV VECTOR SCATTER ELEMENT (64)
2594op_VSEL uint32 = 0xE78D // VRR-e VECTOR SELECT
2595op_VSL uint32 = 0xE774 // VRR-c VECTOR SHIFT LEFT
2596op_VSLB uint32 = 0xE775 // VRR-c VECTOR SHIFT LEFT BY BYTE
2597op_VSLDB uint32 = 0xE777 // VRI-d VECTOR SHIFT LEFT DOUBLE BY BYTE
2598op_VSRA uint32 = 0xE77E // VRR-c VECTOR SHIFT RIGHT ARITHMETIC
2599op_VSRAB uint32 = 0xE77F // VRR-c VECTOR SHIFT RIGHT ARITHMETIC BY BYTE
2600op_VSRL uint32 = 0xE77C // VRR-c VECTOR SHIFT RIGHT LOGICAL
2601op_VSRLB uint32 = 0xE77D // VRR-c VECTOR SHIFT RIGHT LOGICAL BY BYTE
2602op_VSEG uint32 = 0xE75F // VRR-a VECTOR SIGN EXTEND TO DOUBLEWORD
2603op_VST uint32 = 0xE70E // VRX VECTOR STORE
2604op_VSTEH uint32 = 0xE709 // VRX VECTOR STORE ELEMENT (16)
2605op_VSTEF uint32 = 0xE70B // VRX VECTOR STORE ELEMENT (32)
2606op_VSTEG uint32 = 0xE70A // VRX VECTOR STORE ELEMENT (64)
2607op_VSTEB uint32 = 0xE708 // VRX VECTOR STORE ELEMENT (8)
2608op_VSTM uint32 = 0xE73E // VRS-a VECTOR STORE MULTIPLE
2609op_VSTL uint32 = 0xE73F // VRS-b VECTOR STORE WITH LENGTH
2610op_VSTRC uint32 = 0xE78A // VRR-d VECTOR STRING RANGE COMPARE
2611op_VS uint32 = 0xE7F7 // VRR-c VECTOR SUBTRACT
2612op_VSCBI uint32 = 0xE7F5 // VRR-c VECTOR SUBTRACT COMPUTE BORROW INDICATION
2613op_VSBCBI uint32 = 0xE7BD // VRR-d VECTOR SUBTRACT WITH BORROW COMPUTE BORROW INDICATION
2614op_VSBI uint32 = 0xE7BF // VRR-d VECTOR SUBTRACT WITH BORROW INDICATION
2615op_VSUMG uint32 = 0xE765 // VRR-c VECTOR SUM ACROSS DOUBLEWORD
2616op_VSUMQ uint32 = 0xE767 // VRR-c VECTOR SUM ACROSS QUADWORD
2617op_VSUM uint32 = 0xE764 // VRR-c VECTOR SUM ACROSS WORD
2618op_VTM uint32 = 0xE7D8 // VRR-a VECTOR TEST UNDER MASK
2619op_VUPH uint32 = 0xE7D7 // VRR-a VECTOR UNPACK HIGH
2620op_VUPLH uint32 = 0xE7D5 // VRR-a VECTOR UNPACK LOGICAL HIGH
2621op_VUPLL uint32 = 0xE7D4 // VRR-a VECTOR UNPACK LOGICAL LOW
2622op_VUPL uint32 = 0xE7D6 // VRR-a VECTOR UNPACK LOW
2623op_VMSL uint32 = 0xE7B8 // VRR-d VECTOR MULTIPLY SUM LOGICAL
2624)
2625
2626func oclass(a *obj.Addr) int {
2627return int(a.Class) - 1
2628}
2629
2630// Add a relocation for the immediate in a RIL style instruction.
2631// The addend will be adjusted as required.
2632func (c *ctxtz) addrilreloc(sym *obj.LSym, add int64) *obj.Reloc {
2633if sym == nil {
2634c.ctxt.Diag("require symbol to apply relocation")
2635}
2636offset := int64(2) // relocation offset from start of instruction
2637rel := obj.Addrel(c.cursym)
2638rel.Off = int32(c.pc + offset)
2639rel.Siz = 4
2640rel.Sym = sym
2641rel.Add = add + offset + int64(rel.Siz)
2642rel.Type = objabi.R_PCRELDBL
2643return rel
2644}
2645
2646func (c *ctxtz) addrilrelocoffset(sym *obj.LSym, add, offset int64) *obj.Reloc {
2647if sym == nil {
2648c.ctxt.Diag("require symbol to apply relocation")
2649}
2650offset += int64(2) // relocation offset from start of instruction
2651rel := obj.Addrel(c.cursym)
2652rel.Off = int32(c.pc + offset)
2653rel.Siz = 4
2654rel.Sym = sym
2655rel.Add = add + offset + int64(rel.Siz)
2656rel.Type = objabi.R_PCRELDBL
2657return rel
2658}
2659
2660// Add a CALL relocation for the immediate in a RIL style instruction.
2661// The addend will be adjusted as required.
2662func (c *ctxtz) addcallreloc(sym *obj.LSym, add int64) *obj.Reloc {
2663if sym == nil {
2664c.ctxt.Diag("require symbol to apply relocation")
2665}
2666offset := int64(2) // relocation offset from start of instruction
2667rel := obj.Addrel(c.cursym)
2668rel.Off = int32(c.pc + offset)
2669rel.Siz = 4
2670rel.Sym = sym
2671rel.Add = add + offset + int64(rel.Siz)
2672rel.Type = objabi.R_CALL
2673return rel
2674}
2675
2676func (c *ctxtz) branchMask(p *obj.Prog) CCMask {
2677switch p.As {
2678case ABRC, ALOCR, ALOCGR,
2679ACRJ, ACGRJ, ACIJ, ACGIJ,
2680ACLRJ, ACLGRJ, ACLIJ, ACLGIJ:
2681return CCMask(p.From.Offset)
2682case ABEQ, ACMPBEQ, ACMPUBEQ, AMOVDEQ:
2683return Equal
2684case ABGE, ACMPBGE, ACMPUBGE, AMOVDGE:
2685return GreaterOrEqual
2686case ABGT, ACMPBGT, ACMPUBGT, AMOVDGT:
2687return Greater
2688case ABLE, ACMPBLE, ACMPUBLE, AMOVDLE:
2689return LessOrEqual
2690case ABLT, ACMPBLT, ACMPUBLT, AMOVDLT:
2691return Less
2692case ABNE, ACMPBNE, ACMPUBNE, AMOVDNE:
2693return NotEqual
2694case ABLEU: // LE or unordered
2695return NotGreater
2696case ABLTU: // LT or unordered
2697return LessOrUnordered
2698case ABVC:
2699return Never // needs extra instruction
2700case ABVS:
2701return Unordered
2702}
2703c.ctxt.Diag("unknown conditional branch %v", p.As)
2704return Always
2705}
2706
2707func regtmp(p *obj.Prog) uint32 {
2708p.Mark |= USETMP
2709return REGTMP
2710}
2711
2712func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) {
2713o := c.oplook(p)
2714
2715if o == nil {
2716return
2717}
2718
2719// If REGTMP is used in generated code, we need to set USETMP on p.Mark.
2720// So we use regtmp(p) for REGTMP.
2721
2722switch o.i {
2723default:
2724c.ctxt.Diag("unknown index %d", o.i)
2725
2726case 0: // PSEUDO OPS
2727break
2728
2729case 1: // mov reg reg
2730switch p.As {
2731default:
2732c.ctxt.Diag("unhandled operation: %v", p.As)
2733case AMOVD:
2734zRRE(op_LGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2735// sign extend
2736case AMOVW:
2737zRRE(op_LGFR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2738case AMOVH:
2739zRRE(op_LGHR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2740case AMOVB:
2741zRRE(op_LGBR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2742// zero extend
2743case AMOVWZ:
2744zRRE(op_LLGFR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2745case AMOVHZ:
2746zRRE(op_LLGHR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2747case AMOVBZ:
2748zRRE(op_LLGCR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2749// reverse bytes
2750case AMOVDBR:
2751zRRE(op_LRVGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2752case AMOVWBR:
2753zRRE(op_LRVR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2754// floating point
2755case AFMOVD, AFMOVS:
2756zRR(op_LDR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2757}
2758
2759case 2: // arithmetic op reg [reg] reg
2760r := p.Reg
2761if r == 0 {
2762r = p.To.Reg
2763}
2764
2765var opcode uint32
2766
2767switch p.As {
2768default:
2769c.ctxt.Diag("invalid opcode")
2770case AADD:
2771opcode = op_AGRK
2772case AADDC:
2773opcode = op_ALGRK
2774case AADDE:
2775opcode = op_ALCGR
2776case AADDW:
2777opcode = op_ARK
2778case AMULLW:
2779opcode = op_MSGFR
2780case AMULLD:
2781opcode = op_MSGR
2782case ADIVW, AMODW:
2783opcode = op_DSGFR
2784case ADIVWU, AMODWU:
2785opcode = op_DLR
2786case ADIVD, AMODD:
2787opcode = op_DSGR
2788case ADIVDU, AMODDU:
2789opcode = op_DLGR
2790}
2791
2792switch p.As {
2793default:
2794
2795case AADD, AADDC, AADDW:
2796if p.As == AADDW && r == p.To.Reg {
2797zRR(op_AR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2798} else {
2799zRRF(opcode, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
2800}
2801
2802case AADDE, AMULLW, AMULLD:
2803if r == p.To.Reg {
2804zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2805} else if p.From.Reg == p.To.Reg {
2806zRRE(opcode, uint32(p.To.Reg), uint32(r), asm)
2807} else {
2808zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
2809zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2810}
2811
2812case ADIVW, ADIVWU, ADIVD, ADIVDU:
2813if p.As == ADIVWU || p.As == ADIVDU {
2814zRI(op_LGHI, regtmp(p), 0, asm)
2815}
2816zRRE(op_LGR, REGTMP2, uint32(r), asm)
2817zRRE(opcode, regtmp(p), uint32(p.From.Reg), asm)
2818zRRE(op_LGR, uint32(p.To.Reg), REGTMP2, asm)
2819
2820case AMODW, AMODWU, AMODD, AMODDU:
2821if p.As == AMODWU || p.As == AMODDU {
2822zRI(op_LGHI, regtmp(p), 0, asm)
2823}
2824zRRE(op_LGR, REGTMP2, uint32(r), asm)
2825zRRE(opcode, regtmp(p), uint32(p.From.Reg), asm)
2826zRRE(op_LGR, uint32(p.To.Reg), regtmp(p), asm)
2827
2828}
2829
2830case 3: // mov $constant reg
2831v := c.vregoff(&p.From)
2832switch p.As {
2833case AMOVBZ:
2834v = int64(uint8(v))
2835case AMOVHZ:
2836v = int64(uint16(v))
2837case AMOVWZ:
2838v = int64(uint32(v))
2839case AMOVB:
2840v = int64(int8(v))
2841case AMOVH:
2842v = int64(int16(v))
2843case AMOVW:
2844v = int64(int32(v))
2845}
2846if int64(int16(v)) == v {
2847zRI(op_LGHI, uint32(p.To.Reg), uint32(v), asm)
2848} else if v&0xffff0000 == v {
2849zRI(op_LLILH, uint32(p.To.Reg), uint32(v>>16), asm)
2850} else if v&0xffff00000000 == v {
2851zRI(op_LLIHL, uint32(p.To.Reg), uint32(v>>32), asm)
2852} else if uint64(v)&0xffff000000000000 == uint64(v) {
2853zRI(op_LLIHH, uint32(p.To.Reg), uint32(v>>48), asm)
2854} else if int64(int32(v)) == v {
2855zRIL(_a, op_LGFI, uint32(p.To.Reg), uint32(v), asm)
2856} else if int64(uint32(v)) == v {
2857zRIL(_a, op_LLILF, uint32(p.To.Reg), uint32(v), asm)
2858} else if uint64(v)&0xffffffff00000000 == uint64(v) {
2859zRIL(_a, op_LLIHF, uint32(p.To.Reg), uint32(v>>32), asm)
2860} else {
2861zRIL(_a, op_LLILF, uint32(p.To.Reg), uint32(v), asm)
2862zRIL(_a, op_IIHF, uint32(p.To.Reg), uint32(v>>32), asm)
2863}
2864
2865case 4: // multiply high (a*b)>>64
2866r := p.Reg
2867if r == 0 {
2868r = p.To.Reg
2869}
2870zRRE(op_LGR, REGTMP2, uint32(r), asm)
2871zRRE(op_MLGR, regtmp(p), uint32(p.From.Reg), asm)
2872switch p.As {
2873case AMULHDU:
2874// Unsigned: move result into correct register.
2875zRRE(op_LGR, uint32(p.To.Reg), regtmp(p), asm)
2876case AMULHD:
2877// Signed: need to convert result.
2878// See Hacker's Delight 8-3.
2879zRSY(op_SRAG, REGTMP2, uint32(p.From.Reg), 0, 63, asm)
2880zRRE(op_NGR, REGTMP2, uint32(r), asm)
2881zRRE(op_SGR, regtmp(p), REGTMP2, asm)
2882zRSY(op_SRAG, REGTMP2, uint32(r), 0, 63, asm)
2883zRRE(op_NGR, REGTMP2, uint32(p.From.Reg), asm)
2884zRRF(op_SGRK, REGTMP2, 0, uint32(p.To.Reg), regtmp(p), asm)
2885}
2886
2887case 5: // syscall
2888zI(op_SVC, 0, asm)
2889
2890case 6: // logical op reg [reg] reg
2891var oprr, oprre, oprrf uint32
2892switch p.As {
2893case AAND:
2894oprre = op_NGR
2895oprrf = op_NGRK
2896case AANDW:
2897oprr = op_NR
2898oprrf = op_NRK
2899case AOR:
2900oprre = op_OGR
2901oprrf = op_OGRK
2902case AORW:
2903oprr = op_OR
2904oprrf = op_ORK
2905case AXOR:
2906oprre = op_XGR
2907oprrf = op_XGRK
2908case AXORW:
2909oprr = op_XR
2910oprrf = op_XRK
2911}
2912if p.Reg == 0 {
2913if oprr != 0 {
2914zRR(oprr, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2915} else {
2916zRRE(oprre, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2917}
2918} else {
2919zRRF(oprrf, uint32(p.Reg), 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2920}
2921
2922case 7: // shift/rotate reg [reg] reg
2923d2 := c.vregoff(&p.From)
2924b2 := p.From.Reg
2925r3 := p.Reg
2926if r3 == 0 {
2927r3 = p.To.Reg
2928}
2929r1 := p.To.Reg
2930var opcode uint32
2931switch p.As {
2932default:
2933case ASLD:
2934opcode = op_SLLG
2935case ASRD:
2936opcode = op_SRLG
2937case ASLW:
2938opcode = op_SLLK
2939case ASRW:
2940opcode = op_SRLK
2941case ARLL:
2942opcode = op_RLL
2943case ARLLG:
2944opcode = op_RLLG
2945case ASRAW:
2946opcode = op_SRAK
2947case ASRAD:
2948opcode = op_SRAG
2949}
2950zRSY(opcode, uint32(r1), uint32(r3), uint32(b2), uint32(d2), asm)
2951
2952case 8: // find leftmost one
2953if p.To.Reg&1 != 0 {
2954c.ctxt.Diag("target must be an even-numbered register")
2955}
2956// FLOGR also writes a mask to p.To.Reg+1.
2957zRRE(op_FLOGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2958
2959case 9: // population count
2960zRRE(op_POPCNT, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2961
2962case 10: // subtract reg [reg] reg
2963r := int(p.Reg)
2964
2965switch p.As {
2966default:
2967case ASUB:
2968if r == 0 {
2969zRRE(op_SGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2970} else {
2971zRRF(op_SGRK, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
2972}
2973case ASUBC:
2974if r == 0 {
2975zRRE(op_SLGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2976} else {
2977zRRF(op_SLGRK, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
2978}
2979case ASUBE:
2980if r == 0 {
2981r = int(p.To.Reg)
2982}
2983if r == int(p.To.Reg) {
2984zRRE(op_SLBGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2985} else if p.From.Reg == p.To.Reg {
2986zRRE(op_LGR, regtmp(p), uint32(p.From.Reg), asm)
2987zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
2988zRRE(op_SLBGR, uint32(p.To.Reg), regtmp(p), asm)
2989} else {
2990zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
2991zRRE(op_SLBGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2992}
2993case ASUBW:
2994if r == 0 {
2995zRR(op_SR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
2996} else {
2997zRRF(op_SRK, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
2998}
2999}
3000
3001case 11: // br/bl
3002v := int32(0)
3003
3004if p.To.Target() != nil {
3005v = int32((p.To.Target().Pc - p.Pc) >> 1)
3006}
3007
3008if p.As == ABR && p.To.Sym == nil && int32(int16(v)) == v {
3009zRI(op_BRC, 0xF, uint32(v), asm)
3010} else {
3011if p.As == ABL {
3012zRIL(_b, op_BRASL, uint32(REG_LR), uint32(v), asm)
3013} else {
3014zRIL(_c, op_BRCL, 0xF, uint32(v), asm)
3015}
3016if p.To.Sym != nil {
3017c.addcallreloc(p.To.Sym, p.To.Offset)
3018}
3019}
3020
3021case 12:
3022r1 := p.To.Reg
3023d2 := c.vregoff(&p.From)
3024b2 := p.From.Reg
3025if b2 == 0 {
3026b2 = REGSP
3027}
3028x2 := p.From.Index
3029if -DISP20/2 > d2 || d2 >= DISP20/2 {
3030zRIL(_a, op_LGFI, regtmp(p), uint32(d2), asm)
3031if x2 != 0 {
3032zRX(op_LA, regtmp(p), regtmp(p), uint32(x2), 0, asm)
3033}
3034x2 = int16(regtmp(p))
3035d2 = 0
3036}
3037var opx, opxy uint32
3038switch p.As {
3039case AADD:
3040opxy = op_AG
3041case AADDC:
3042opxy = op_ALG
3043case AADDE:
3044opxy = op_ALCG
3045case AADDW:
3046opx = op_A
3047opxy = op_AY
3048case AMULLW:
3049opx = op_MS
3050opxy = op_MSY
3051case AMULLD:
3052opxy = op_MSG
3053case ASUB:
3054opxy = op_SG
3055case ASUBC:
3056opxy = op_SLG
3057case ASUBE:
3058opxy = op_SLBG
3059case ASUBW:
3060opx = op_S
3061opxy = op_SY
3062case AAND:
3063opxy = op_NG
3064case AANDW:
3065opx = op_N
3066opxy = op_NY
3067case AOR:
3068opxy = op_OG
3069case AORW:
3070opx = op_O
3071opxy = op_OY
3072case AXOR:
3073opxy = op_XG
3074case AXORW:
3075opx = op_X
3076opxy = op_XY
3077}
3078if opx != 0 && 0 <= d2 && d2 < DISP12 {
3079zRX(opx, uint32(r1), uint32(x2), uint32(b2), uint32(d2), asm)
3080} else {
3081zRXY(opxy, uint32(r1), uint32(x2), uint32(b2), uint32(d2), asm)
3082}
3083
3084case 13: // rotate, followed by operation
3085r1 := p.To.Reg
3086r2 := p.RestArgs[2].Reg
3087i3 := uint8(p.From.Offset) // start
3088i4 := uint8(p.RestArgs[0].Offset) // end
3089i5 := uint8(p.RestArgs[1].Offset) // rotate amount
3090switch p.As {
3091case ARNSBGT, ARXSBGT, AROSBGT:
3092i3 |= 0x80 // test-results
3093case ARISBGZ, ARISBGNZ, ARISBHGZ, ARISBLGZ:
3094i4 |= 0x80 // zero-remaining-bits
3095}
3096var opcode uint32
3097switch p.As {
3098case ARNSBG, ARNSBGT:
3099opcode = op_RNSBG
3100case ARXSBG, ARXSBGT:
3101opcode = op_RXSBG
3102case AROSBG, AROSBGT:
3103opcode = op_ROSBG
3104case ARISBG, ARISBGZ:
3105opcode = op_RISBG
3106case ARISBGN, ARISBGNZ:
3107opcode = op_RISBGN
3108case ARISBHG, ARISBHGZ:
3109opcode = op_RISBHG
3110case ARISBLG, ARISBLGZ:
3111opcode = op_RISBLG
3112}
3113zRIE(_f, uint32(opcode), uint32(r1), uint32(r2), 0, uint32(i3), uint32(i4), 0, uint32(i5), asm)
3114
3115case 15: // br/bl (reg)
3116r := p.To.Reg
3117if p.As == ABCL || p.As == ABL {
3118zRR(op_BASR, uint32(REG_LR), uint32(r), asm)
3119} else {
3120zRR(op_BCR, uint32(Always), uint32(r), asm)
3121}
3122
3123case 16: // conditional branch
3124v := int32(0)
3125if p.To.Target() != nil {
3126v = int32((p.To.Target().Pc - p.Pc) >> 1)
3127}
3128mask := uint32(c.branchMask(p))
3129if p.To.Sym == nil && int32(int16(v)) == v {
3130zRI(op_BRC, mask, uint32(v), asm)
3131} else {
3132zRIL(_c, op_BRCL, mask, uint32(v), asm)
3133}
3134if p.To.Sym != nil {
3135c.addrilreloc(p.To.Sym, p.To.Offset)
3136}
3137
3138case 17: // move on condition
3139m3 := uint32(c.branchMask(p))
3140zRRF(op_LOCGR, m3, 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
3141
3142case 18: // br/bl reg
3143if p.As == ABL {
3144zRR(op_BASR, uint32(REG_LR), uint32(p.To.Reg), asm)
3145} else {
3146zRR(op_BCR, uint32(Always), uint32(p.To.Reg), asm)
3147}
3148
3149case 19: // mov $sym+n(SB) reg
3150d := c.vregoff(&p.From)
3151zRIL(_b, op_LARL, uint32(p.To.Reg), 0, asm)
3152if d&1 != 0 {
3153zRX(op_LA, uint32(p.To.Reg), uint32(p.To.Reg), 0, 1, asm)
3154d -= 1
3155}
3156c.addrilreloc(p.From.Sym, d)
3157
3158case 21: // subtract $constant [reg] reg
3159v := c.vregoff(&p.From)
3160r := p.Reg
3161if r == 0 {
3162r = p.To.Reg
3163}
3164switch p.As {
3165case ASUB:
3166zRIL(_a, op_LGFI, uint32(regtmp(p)), uint32(v), asm)
3167zRRF(op_SLGRK, uint32(regtmp(p)), 0, uint32(p.To.Reg), uint32(r), asm)
3168case ASUBC:
3169if r != p.To.Reg {
3170zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
3171}
3172zRIL(_a, op_SLGFI, uint32(p.To.Reg), uint32(v), asm)
3173case ASUBW:
3174if r != p.To.Reg {
3175zRR(op_LR, uint32(p.To.Reg), uint32(r), asm)
3176}
3177zRIL(_a, op_SLFI, uint32(p.To.Reg), uint32(v), asm)
3178}
3179
3180case 22: // add/multiply $constant [reg] reg
3181v := c.vregoff(&p.From)
3182r := p.Reg
3183if r == 0 {
3184r = p.To.Reg
3185}
3186var opri, opril, oprie uint32
3187switch p.As {
3188case AADD:
3189opri = op_AGHI
3190opril = op_AGFI
3191oprie = op_AGHIK
3192case AADDC:
3193opril = op_ALGFI
3194oprie = op_ALGHSIK
3195case AADDW:
3196opri = op_AHI
3197opril = op_AFI
3198oprie = op_AHIK
3199case AMULLW:
3200opri = op_MHI
3201opril = op_MSFI
3202case AMULLD:
3203opri = op_MGHI
3204opril = op_MSGFI
3205}
3206if r != p.To.Reg && (oprie == 0 || int64(int16(v)) != v) {
3207switch p.As {
3208case AADD, AADDC, AMULLD:
3209zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
3210case AADDW, AMULLW:
3211zRR(op_LR, uint32(p.To.Reg), uint32(r), asm)
3212}
3213r = p.To.Reg
3214}
3215if opri != 0 && r == p.To.Reg && int64(int16(v)) == v {
3216zRI(opri, uint32(p.To.Reg), uint32(v), asm)
3217} else if oprie != 0 && int64(int16(v)) == v {
3218zRIE(_d, oprie, uint32(p.To.Reg), uint32(r), uint32(v), 0, 0, 0, 0, asm)
3219} else {
3220zRIL(_a, opril, uint32(p.To.Reg), uint32(v), asm)
3221}
3222
3223case 23: // 64-bit logical op $constant reg
3224// TODO(mundaym): merge with case 24.
3225v := c.vregoff(&p.From)
3226switch p.As {
3227default:
3228c.ctxt.Diag("%v is not supported", p)
3229case AAND:
3230if v >= 0 { // needs zero extend
3231zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
3232zRRE(op_NGR, uint32(p.To.Reg), regtmp(p), asm)
3233} else if int64(int16(v)) == v {
3234zRI(op_NILL, uint32(p.To.Reg), uint32(v), asm)
3235} else { // r.To.Reg & 0xffffffff00000000 & uint32(v)
3236zRIL(_a, op_NILF, uint32(p.To.Reg), uint32(v), asm)
3237}
3238case AOR:
3239if int64(uint32(v)) != v { // needs sign extend
3240zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
3241zRRE(op_OGR, uint32(p.To.Reg), regtmp(p), asm)
3242} else if int64(uint16(v)) == v {
3243zRI(op_OILL, uint32(p.To.Reg), uint32(v), asm)
3244} else {
3245zRIL(_a, op_OILF, uint32(p.To.Reg), uint32(v), asm)
3246}
3247case AXOR:
3248if int64(uint32(v)) != v { // needs sign extend
3249zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
3250zRRE(op_XGR, uint32(p.To.Reg), regtmp(p), asm)
3251} else {
3252zRIL(_a, op_XILF, uint32(p.To.Reg), uint32(v), asm)
3253}
3254}
3255
3256case 24: // 32-bit logical op $constant reg
3257v := c.vregoff(&p.From)
3258switch p.As {
3259case AANDW:
3260if uint32(v&0xffff0000) == 0xffff0000 {
3261zRI(op_NILL, uint32(p.To.Reg), uint32(v), asm)
3262} else if uint32(v&0x0000ffff) == 0x0000ffff {
3263zRI(op_NILH, uint32(p.To.Reg), uint32(v)>>16, asm)
3264} else {
3265zRIL(_a, op_NILF, uint32(p.To.Reg), uint32(v), asm)
3266}
3267case AORW:
3268if uint32(v&0xffff0000) == 0 {
3269zRI(op_OILL, uint32(p.To.Reg), uint32(v), asm)
3270} else if uint32(v&0x0000ffff) == 0 {
3271zRI(op_OILH, uint32(p.To.Reg), uint32(v)>>16, asm)
3272} else {
3273zRIL(_a, op_OILF, uint32(p.To.Reg), uint32(v), asm)
3274}
3275case AXORW:
3276zRIL(_a, op_XILF, uint32(p.To.Reg), uint32(v), asm)
3277}
3278
3279case 25: // load on condition (register)
3280m3 := uint32(c.branchMask(p))
3281var opcode uint32
3282switch p.As {
3283case ALOCR:
3284opcode = op_LOCR
3285case ALOCGR:
3286opcode = op_LOCGR
3287}
3288zRRF(opcode, m3, 0, uint32(p.To.Reg), uint32(p.Reg), asm)
3289
3290case 26: // MOVD $offset(base)(index), reg
3291v := c.regoff(&p.From)
3292r := p.From.Reg
3293if r == 0 {
3294r = REGSP
3295}
3296i := p.From.Index
3297if v >= 0 && v < DISP12 {
3298zRX(op_LA, uint32(p.To.Reg), uint32(r), uint32(i), uint32(v), asm)
3299} else if v >= -DISP20/2 && v < DISP20/2 {
3300zRXY(op_LAY, uint32(p.To.Reg), uint32(r), uint32(i), uint32(v), asm)
3301} else {
3302zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
3303zRX(op_LA, uint32(p.To.Reg), uint32(r), regtmp(p), uint32(i), asm)
3304}
3305
3306case 31: // dword
3307wd := uint64(c.vregoff(&p.From))
3308*asm = append(*asm,
3309uint8(wd>>56),
3310uint8(wd>>48),
3311uint8(wd>>40),
3312uint8(wd>>32),
3313uint8(wd>>24),
3314uint8(wd>>16),
3315uint8(wd>>8),
3316uint8(wd))
3317
3318case 32: // float op freg freg
3319var opcode uint32
3320switch p.As {
3321default:
3322c.ctxt.Diag("invalid opcode")
3323case AFADD:
3324opcode = op_ADBR
3325case AFADDS:
3326opcode = op_AEBR
3327case AFDIV:
3328opcode = op_DDBR
3329case AFDIVS:
3330opcode = op_DEBR
3331case AFMUL:
3332opcode = op_MDBR
3333case AFMULS:
3334opcode = op_MEEBR
3335case AFSUB:
3336opcode = op_SDBR
3337case AFSUBS:
3338opcode = op_SEBR
3339}
3340zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
3341
3342case 33: // float op [freg] freg
3343r := p.From.Reg
3344if oclass(&p.From) == C_NONE {
3345r = p.To.Reg
3346}
3347var opcode uint32
3348switch p.As {
3349default:
3350case AFABS:
3351opcode = op_LPDBR
3352case AFNABS:
3353opcode = op_LNDBR
3354case ALPDFR:
3355opcode = op_LPDFR
3356case ALNDFR:
3357opcode = op_LNDFR
3358case AFNEG:
3359opcode = op_LCDFR
3360case AFNEGS:
3361opcode = op_LCEBR
3362case ALEDBR:
3363opcode = op_LEDBR
3364case ALDEBR:
3365opcode = op_LDEBR
3366case AFSQRT:
3367opcode = op_SQDBR
3368case AFSQRTS:
3369opcode = op_SQEBR
3370}
3371zRRE(opcode, uint32(p.To.Reg), uint32(r), asm)
3372
3373case 34: // float multiply-add freg freg freg
3374var opcode uint32
3375switch p.As {
3376default:
3377c.ctxt.Diag("invalid opcode")
3378case AFMADD:
3379opcode = op_MADBR
3380case AFMADDS:
3381opcode = op_MAEBR
3382case AFMSUB:
3383opcode = op_MSDBR
3384case AFMSUBS:
3385opcode = op_MSEBR
3386}
3387zRRD(opcode, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), asm)
3388
3389case 35: // mov reg mem (no relocation)
3390d2 := c.regoff(&p.To)
3391b2 := p.To.Reg
3392if b2 == 0 {
3393b2 = REGSP
3394}
3395x2 := p.To.Index
3396if d2 < -DISP20/2 || d2 >= DISP20/2 {
3397zRIL(_a, op_LGFI, regtmp(p), uint32(d2), asm)
3398if x2 != 0 {
3399zRX(op_LA, regtmp(p), regtmp(p), uint32(x2), 0, asm)
3400}
3401x2 = int16(regtmp(p))
3402d2 = 0
3403}
3404// Emits an RX instruction if an appropriate one exists and the displacement fits in 12 bits. Otherwise use an RXY instruction.
3405if op, ok := c.zopstore12(p.As); ok && isU12(d2) {
3406zRX(op, uint32(p.From.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
3407} else {
3408zRXY(c.zopstore(p.As), uint32(p.From.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
3409}
3410
3411case 36: // mov mem reg (no relocation)
3412d2 := c.regoff(&p.From)
3413b2 := p.From.Reg
3414if b2 == 0 {
3415b2 = REGSP
3416}
3417x2 := p.From.Index
3418if d2 < -DISP20/2 || d2 >= DISP20/2 {
3419zRIL(_a, op_LGFI, regtmp(p), uint32(d2), asm)
3420if x2 != 0 {
3421zRX(op_LA, regtmp(p), regtmp(p), uint32(x2), 0, asm)
3422}
3423x2 = int16(regtmp(p))
3424d2 = 0
3425}
3426// Emits an RX instruction if an appropriate one exists and the displacement fits in 12 bits. Otherwise use an RXY instruction.
3427if op, ok := c.zopload12(p.As); ok && isU12(d2) {
3428zRX(op, uint32(p.To.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
3429} else {
3430zRXY(c.zopload(p.As), uint32(p.To.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
3431}
3432
3433case 40: // word/byte
3434wd := uint32(c.regoff(&p.From))
3435if p.As == AWORD { //WORD
3436*asm = append(*asm, uint8(wd>>24), uint8(wd>>16), uint8(wd>>8), uint8(wd))
3437} else { //BYTE
3438*asm = append(*asm, uint8(wd))
3439}
3440
3441case 41: // branch on count
3442r1 := p.From.Reg
3443ri2 := (p.To.Target().Pc - p.Pc) >> 1
3444if int64(int16(ri2)) != ri2 {
3445c.ctxt.Diag("branch target too far away")
3446}
3447var opcode uint32
3448switch p.As {
3449case ABRCT:
3450opcode = op_BRCT
3451case ABRCTG:
3452opcode = op_BRCTG
3453}
3454zRI(opcode, uint32(r1), uint32(ri2), asm)
3455
3456case 47: // negate [reg] reg
3457r := p.From.Reg
3458if r == 0 {
3459r = p.To.Reg
3460}
3461switch p.As {
3462case ANEG:
3463zRRE(op_LCGR, uint32(p.To.Reg), uint32(r), asm)
3464case ANEGW:
3465zRRE(op_LCGFR, uint32(p.To.Reg), uint32(r), asm)
3466}
3467
3468case 48: // floating-point round to integer
3469m3 := c.vregoff(&p.From)
3470if 0 > m3 || m3 > 7 {
3471c.ctxt.Diag("mask (%v) must be in the range [0, 7]", m3)
3472}
3473var opcode uint32
3474switch p.As {
3475case AFIEBR:
3476opcode = op_FIEBR
3477case AFIDBR:
3478opcode = op_FIDBR
3479}
3480zRRF(opcode, uint32(m3), 0, uint32(p.To.Reg), uint32(p.Reg), asm)
3481
3482case 49: // copysign
3483zRRF(op_CPSDR, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(p.Reg), asm)
3484
3485case 50: // load and test
3486var opcode uint32
3487switch p.As {
3488case ALTEBR:
3489opcode = op_LTEBR
3490case ALTDBR:
3491opcode = op_LTDBR
3492}
3493zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
3494
3495case 51: // test data class (immediate only)
3496var opcode uint32
3497switch p.As {
3498case ATCEB:
3499opcode = op_TCEB
3500case ATCDB:
3501opcode = op_TCDB
3502}
3503d2 := c.regoff(&p.To)
3504zRXE(opcode, uint32(p.From.Reg), 0, 0, uint32(d2), 0, asm)
3505
3506case 62: // equivalent of Mul64 in math/bits
3507zRRE(op_MLGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
3508
3509case 66:
3510zRR(op_BCR, uint32(Never), 0, asm)
3511
3512case 67: // fmov $0 freg
3513var opcode uint32
3514switch p.As {
3515case AFMOVS:
3516opcode = op_LZER
3517case AFMOVD:
3518opcode = op_LZDR
3519}
3520zRRE(opcode, uint32(p.To.Reg), 0, asm)
3521
3522case 68: // movw areg reg
3523zRRE(op_EAR, uint32(p.To.Reg), uint32(p.From.Reg-REG_AR0), asm)
3524
3525case 69: // movw reg areg
3526zRRE(op_SAR, uint32(p.To.Reg-REG_AR0), uint32(p.From.Reg), asm)
3527
3528case 70: // cmp reg reg
3529if p.As == ACMPW || p.As == ACMPWU {
3530zRR(c.zoprr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), asm)
3531} else {
3532zRRE(c.zoprre(p.As), uint32(p.From.Reg), uint32(p.To.Reg), asm)
3533}
3534
3535case 71: // cmp reg $constant
3536v := c.vregoff(&p.To)
3537switch p.As {
3538case ACMP, ACMPW:
3539if int64(int32(v)) != v {
3540c.ctxt.Diag("%v overflows an int32", v)
3541}
3542case ACMPU, ACMPWU:
3543if int64(uint32(v)) != v {
3544c.ctxt.Diag("%v overflows a uint32", v)
3545}
3546}
3547if p.As == ACMP && int64(int16(v)) == v {
3548zRI(op_CGHI, uint32(p.From.Reg), uint32(v), asm)
3549} else if p.As == ACMPW && int64(int16(v)) == v {
3550zRI(op_CHI, uint32(p.From.Reg), uint32(v), asm)
3551} else {
3552zRIL(_a, c.zopril(p.As), uint32(p.From.Reg), uint32(v), asm)
3553}
3554
3555case 72: // mov $constant mem
3556v := c.regoff(&p.From)
3557d := c.regoff(&p.To)
3558r := p.To.Reg
3559if p.To.Index != 0 {
3560c.ctxt.Diag("cannot use index register")
3561}
3562if r == 0 {
3563r = REGSP
3564}
3565var opcode uint32
3566switch p.As {
3567case AMOVD:
3568opcode = op_MVGHI
3569case AMOVW, AMOVWZ:
3570opcode = op_MVHI
3571case AMOVH, AMOVHZ:
3572opcode = op_MVHHI
3573case AMOVB, AMOVBZ:
3574opcode = op_MVI
3575}
3576if d < 0 || d >= DISP12 {
3577if r == int16(regtmp(p)) {
3578c.ctxt.Diag("displacement must be in range [0, 4096) to use %v", r)
3579}
3580if d >= -DISP20/2 && d < DISP20/2 {
3581if opcode == op_MVI {
3582opcode = op_MVIY
3583} else {
3584zRXY(op_LAY, uint32(regtmp(p)), 0, uint32(r), uint32(d), asm)
3585r = int16(regtmp(p))
3586d = 0
3587}
3588} else {
3589zRIL(_a, op_LGFI, regtmp(p), uint32(d), asm)
3590zRX(op_LA, regtmp(p), regtmp(p), uint32(r), 0, asm)
3591r = int16(regtmp(p))
3592d = 0
3593}
3594}
3595switch opcode {
3596case op_MVI:
3597zSI(opcode, uint32(v), uint32(r), uint32(d), asm)
3598case op_MVIY:
3599zSIY(opcode, uint32(v), uint32(r), uint32(d), asm)
3600default:
3601zSIL(opcode, uint32(r), uint32(d), uint32(v), asm)
3602}
3603
3604case 74: // mov reg addr (including relocation)
3605i2 := c.regoff(&p.To)
3606switch p.As {
3607case AMOVD:
3608zRIL(_b, op_STGRL, uint32(p.From.Reg), 0, asm)
3609case AMOVW, AMOVWZ: // The zero extension doesn't affect store instructions
3610zRIL(_b, op_STRL, uint32(p.From.Reg), 0, asm)
3611case AMOVH, AMOVHZ: // The zero extension doesn't affect store instructions
3612zRIL(_b, op_STHRL, uint32(p.From.Reg), 0, asm)
3613case AMOVB, AMOVBZ: // The zero extension doesn't affect store instructions
3614zRIL(_b, op_LARL, regtmp(p), 0, asm)
3615adj := uint32(0) // adjustment needed for odd addresses
3616if i2&1 != 0 {
3617i2 -= 1
3618adj = 1
3619}
3620zRX(op_STC, uint32(p.From.Reg), 0, regtmp(p), adj, asm)
3621case AFMOVD:
3622zRIL(_b, op_LARL, regtmp(p), 0, asm)
3623zRX(op_STD, uint32(p.From.Reg), 0, regtmp(p), 0, asm)
3624case AFMOVS:
3625zRIL(_b, op_LARL, regtmp(p), 0, asm)
3626zRX(op_STE, uint32(p.From.Reg), 0, regtmp(p), 0, asm)
3627}
3628c.addrilreloc(p.To.Sym, int64(i2))
3629
3630case 75: // mov addr reg (including relocation)
3631i2 := c.regoff(&p.From)
3632switch p.As {
3633case AMOVD:
3634if i2&1 != 0 {
3635zRIL(_b, op_LARL, regtmp(p), 0, asm)
3636zRXY(op_LG, uint32(p.To.Reg), regtmp(p), 0, 1, asm)
3637i2 -= 1
3638} else {
3639zRIL(_b, op_LGRL, uint32(p.To.Reg), 0, asm)
3640}
3641case AMOVW:
3642zRIL(_b, op_LGFRL, uint32(p.To.Reg), 0, asm)
3643case AMOVWZ:
3644zRIL(_b, op_LLGFRL, uint32(p.To.Reg), 0, asm)
3645case AMOVH:
3646zRIL(_b, op_LGHRL, uint32(p.To.Reg), 0, asm)
3647case AMOVHZ:
3648zRIL(_b, op_LLGHRL, uint32(p.To.Reg), 0, asm)
3649case AMOVB, AMOVBZ:
3650zRIL(_b, op_LARL, regtmp(p), 0, asm)
3651adj := uint32(0) // adjustment needed for odd addresses
3652if i2&1 != 0 {
3653i2 -= 1
3654adj = 1
3655}
3656switch p.As {
3657case AMOVB:
3658zRXY(op_LGB, uint32(p.To.Reg), 0, regtmp(p), adj, asm)
3659case AMOVBZ:
3660zRXY(op_LLGC, uint32(p.To.Reg), 0, regtmp(p), adj, asm)
3661}
3662case AFMOVD:
3663zRIL(_a, op_LARL, regtmp(p), 0, asm)
3664zRX(op_LD, uint32(p.To.Reg), 0, regtmp(p), 0, asm)
3665case AFMOVS:
3666zRIL(_a, op_LARL, regtmp(p), 0, asm)
3667zRX(op_LE, uint32(p.To.Reg), 0, regtmp(p), 0, asm)
3668}
3669c.addrilreloc(p.From.Sym, int64(i2))
3670
3671case 76: // set program mask
3672zRR(op_SPM, uint32(p.From.Reg), 0, asm)
3673
3674case 77: // syscall $constant
3675if p.From.Offset > 255 || p.From.Offset < 1 {
3676c.ctxt.Diag("illegal system call; system call number out of range: %v", p)
3677zE(op_TRAP2, asm) // trap always
3678} else {
3679zI(op_SVC, uint32(p.From.Offset), asm)
3680}
3681
3682case 78: // undef
3683// "An instruction consisting entirely of binary 0s is guaranteed
3684// always to be an illegal instruction."
3685*asm = append(*asm, 0, 0, 0, 0)
3686
3687case 79: // compare and swap reg reg reg
3688v := c.regoff(&p.To)
3689if v < 0 {
3690v = 0
3691}
3692if p.As == ACS {
3693zRS(op_CS, uint32(p.From.Reg), uint32(p.Reg), uint32(p.To.Reg), uint32(v), asm)
3694} else if p.As == ACSG {
3695zRSY(op_CSG, uint32(p.From.Reg), uint32(p.Reg), uint32(p.To.Reg), uint32(v), asm)
3696}
3697
3698case 80: // sync
3699zRR(op_BCR, uint32(NotEqual), 0, asm)
3700
3701case 81: // float to fixed and fixed to float moves (no conversion)
3702switch p.As {
3703case ALDGR:
3704zRRE(op_LDGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
3705case ALGDR:
3706zRRE(op_LGDR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
3707}
3708
3709case 82: // fixed to float conversion
3710var opcode uint32
3711switch p.As {
3712default:
3713log.Fatalf("unexpected opcode %v", p.As)
3714case ACEFBRA:
3715opcode = op_CEFBRA
3716case ACDFBRA:
3717opcode = op_CDFBRA
3718case ACEGBRA:
3719opcode = op_CEGBRA
3720case ACDGBRA:
3721opcode = op_CDGBRA
3722case ACELFBR:
3723opcode = op_CELFBR
3724case ACDLFBR:
3725opcode = op_CDLFBR
3726case ACELGBR:
3727opcode = op_CELGBR
3728case ACDLGBR:
3729opcode = op_CDLGBR
3730}
3731// set immediate operand M3 to 0 to use the default BFP rounding mode
3732// (usually round to nearest, ties to even)
3733// TODO(mundaym): should this be fixed at round to nearest, ties to even?
3734// M4 is reserved and must be 0
3735zRRF(opcode, 0, 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
3736
3737case 83: // float to fixed conversion
3738var opcode uint32
3739switch p.As {
3740default:
3741log.Fatalf("unexpected opcode %v", p.As)
3742case ACFEBRA:
3743opcode = op_CFEBRA
3744case ACFDBRA:
3745opcode = op_CFDBRA
3746case ACGEBRA:
3747opcode = op_CGEBRA
3748case ACGDBRA:
3749opcode = op_CGDBRA
3750case ACLFEBR:
3751opcode = op_CLFEBR
3752case ACLFDBR:
3753opcode = op_CLFDBR
3754case ACLGEBR:
3755opcode = op_CLGEBR
3756case ACLGDBR:
3757opcode = op_CLGDBR
3758}
3759// set immediate operand M3 to 5 for rounding toward zero (required by Go spec)
3760// M4 is reserved and must be 0
3761zRRF(opcode, 5, 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
3762
3763case 84: // storage-and-storage operations $length mem mem
3764l := c.regoff(&p.From)
3765if l < 1 || l > 256 {
3766c.ctxt.Diag("number of bytes (%v) not in range [1,256]", l)
3767}
3768if p.GetFrom3().Index != 0 || p.To.Index != 0 {
3769c.ctxt.Diag("cannot use index reg")
3770}
3771b1 := p.To.Reg
3772b2 := p.GetFrom3().Reg
3773if b1 == 0 {
3774b1 = REGSP
3775}
3776if b2 == 0 {
3777b2 = REGSP
3778}
3779d1 := c.regoff(&p.To)
3780d2 := c.regoff(p.GetFrom3())
3781if d1 < 0 || d1 >= DISP12 {
3782if b2 == int16(regtmp(p)) {
3783c.ctxt.Diag("regtmp(p) conflict")
3784}
3785if b1 != int16(regtmp(p)) {
3786zRRE(op_LGR, regtmp(p), uint32(b1), asm)
3787}
3788zRIL(_a, op_AGFI, regtmp(p), uint32(d1), asm)
3789if d1 == d2 && b1 == b2 {
3790d2 = 0
3791b2 = int16(regtmp(p))
3792}
3793d1 = 0
3794b1 = int16(regtmp(p))
3795}
3796if d2 < 0 || d2 >= DISP12 {
3797if b1 == REGTMP2 {
3798c.ctxt.Diag("REGTMP2 conflict")
3799}
3800if b2 != REGTMP2 {
3801zRRE(op_LGR, REGTMP2, uint32(b2), asm)
3802}
3803zRIL(_a, op_AGFI, REGTMP2, uint32(d2), asm)
3804d2 = 0
3805b2 = REGTMP2
3806}
3807var opcode uint32
3808switch p.As {
3809default:
3810c.ctxt.Diag("unexpected opcode %v", p.As)
3811case AMVC:
3812opcode = op_MVC
3813case AMVCIN:
3814opcode = op_MVCIN
3815case ACLC:
3816opcode = op_CLC
3817// swap operand order for CLC so that it matches CMP
3818b1, b2 = b2, b1
3819d1, d2 = d2, d1
3820case AXC:
3821opcode = op_XC
3822case AOC:
3823opcode = op_OC
3824case ANC:
3825opcode = op_NC
3826}
3827zSS(_a, opcode, uint32(l-1), 0, uint32(b1), uint32(d1), uint32(b2), uint32(d2), asm)
3828
3829case 85: // load address relative long
3830v := c.regoff(&p.From)
3831if p.From.Sym == nil {
3832if (v & 1) != 0 {
3833c.ctxt.Diag("cannot use LARL with odd offset: %v", v)
3834}
3835} else {
3836c.addrilreloc(p.From.Sym, int64(v))
3837v = 0
3838}
3839zRIL(_b, op_LARL, uint32(p.To.Reg), uint32(v>>1), asm)
3840
3841case 86: // load address
3842d := c.vregoff(&p.From)
3843x := p.From.Index
3844b := p.From.Reg
3845if b == 0 {
3846b = REGSP
3847}
3848switch p.As {
3849case ALA:
3850zRX(op_LA, uint32(p.To.Reg), uint32(x), uint32(b), uint32(d), asm)
3851case ALAY:
3852zRXY(op_LAY, uint32(p.To.Reg), uint32(x), uint32(b), uint32(d), asm)
3853}
3854
3855case 87: // execute relative long
3856v := c.vregoff(&p.From)
3857if p.From.Sym == nil {
3858if v&1 != 0 {
3859c.ctxt.Diag("cannot use EXRL with odd offset: %v", v)
3860}
3861} else {
3862c.addrilreloc(p.From.Sym, v)
3863v = 0
3864}
3865zRIL(_b, op_EXRL, uint32(p.To.Reg), uint32(v>>1), asm)
3866
3867case 88: // store clock
3868var opcode uint32
3869switch p.As {
3870case ASTCK:
3871opcode = op_STCK
3872case ASTCKC:
3873opcode = op_STCKC
3874case ASTCKE:
3875opcode = op_STCKE
3876case ASTCKF:
3877opcode = op_STCKF
3878}
3879v := c.vregoff(&p.To)
3880r := p.To.Reg
3881if r == 0 {
3882r = REGSP
3883}
3884zS(opcode, uint32(r), uint32(v), asm)
3885
3886case 89: // compare and branch reg reg
3887var v int32
3888if p.To.Target() != nil {
3889v = int32((p.To.Target().Pc - p.Pc) >> 1)
3890}
3891
3892// Some instructions take a mask as the first argument.
3893r1, r2 := p.From.Reg, p.Reg
3894if p.From.Type == obj.TYPE_CONST {
3895r1, r2 = p.Reg, p.RestArgs[0].Reg
3896}
3897m3 := uint32(c.branchMask(p))
3898
3899var opcode uint32
3900switch p.As {
3901case ACRJ:
3902// COMPARE AND BRANCH RELATIVE (32)
3903opcode = op_CRJ
3904case ACGRJ, ACMPBEQ, ACMPBGE, ACMPBGT, ACMPBLE, ACMPBLT, ACMPBNE:
3905// COMPARE AND BRANCH RELATIVE (64)
3906opcode = op_CGRJ
3907case ACLRJ:
3908// COMPARE LOGICAL AND BRANCH RELATIVE (32)
3909opcode = op_CLRJ
3910case ACLGRJ, ACMPUBEQ, ACMPUBGE, ACMPUBGT, ACMPUBLE, ACMPUBLT, ACMPUBNE:
3911// COMPARE LOGICAL AND BRANCH RELATIVE (64)
3912opcode = op_CLGRJ
3913}
3914
3915if int32(int16(v)) != v {
3916// The branch is too far for one instruction so crack
3917// `CMPBEQ x, y, target` into:
3918//
3919// CMPBNE x, y, 2(PC)
3920// BR target
3921//
3922// Note that the instruction sequence MUST NOT clobber
3923// the condition code.
3924m3 ^= 0xe // invert 3-bit mask
3925zRIE(_b, opcode, uint32(r1), uint32(r2), uint32(sizeRIE+sizeRIL)/2, 0, 0, m3, 0, asm)
3926zRIL(_c, op_BRCL, uint32(Always), uint32(v-sizeRIE/2), asm)
3927} else {
3928zRIE(_b, opcode, uint32(r1), uint32(r2), uint32(v), 0, 0, m3, 0, asm)
3929}
3930
3931case 90: // compare and branch reg $constant
3932var v int32
3933if p.To.Target() != nil {
3934v = int32((p.To.Target().Pc - p.Pc) >> 1)
3935}
3936
3937// Some instructions take a mask as the first argument.
3938r1, i2 := p.From.Reg, p.RestArgs[0].Offset
3939if p.From.Type == obj.TYPE_CONST {
3940r1 = p.Reg
3941}
3942m3 := uint32(c.branchMask(p))
3943
3944var opcode uint32
3945switch p.As {
3946case ACIJ:
3947opcode = op_CIJ
3948case ACGIJ, ACMPBEQ, ACMPBGE, ACMPBGT, ACMPBLE, ACMPBLT, ACMPBNE:
3949opcode = op_CGIJ
3950case ACLIJ:
3951opcode = op_CLIJ
3952case ACLGIJ, ACMPUBEQ, ACMPUBGE, ACMPUBGT, ACMPUBLE, ACMPUBLT, ACMPUBNE:
3953opcode = op_CLGIJ
3954}
3955if int32(int16(v)) != v {
3956// The branch is too far for one instruction so crack
3957// `CMPBEQ x, $0, target` into:
3958//
3959// CMPBNE x, $0, 2(PC)
3960// BR target
3961//
3962// Note that the instruction sequence MUST NOT clobber
3963// the condition code.
3964m3 ^= 0xe // invert 3-bit mask
3965zRIE(_c, opcode, uint32(r1), m3, uint32(sizeRIE+sizeRIL)/2, 0, 0, 0, uint32(i2), asm)
3966zRIL(_c, op_BRCL, uint32(Always), uint32(v-sizeRIE/2), asm)
3967} else {
3968zRIE(_c, opcode, uint32(r1), m3, uint32(v), 0, 0, 0, uint32(i2), asm)
3969}
3970
3971case 91: // test under mask (immediate)
3972var opcode uint32
3973switch p.As {
3974case ATMHH:
3975opcode = op_TMHH
3976case ATMHL:
3977opcode = op_TMHL
3978case ATMLH:
3979opcode = op_TMLH
3980case ATMLL:
3981opcode = op_TMLL
3982}
3983zRI(opcode, uint32(p.From.Reg), uint32(c.vregoff(&p.To)), asm)
3984
3985case 92: // insert program mask
3986zRRE(op_IPM, uint32(p.From.Reg), 0, asm)
3987
3988case 93: // GOT lookup
3989v := c.vregoff(&p.To)
3990if v != 0 {
3991c.ctxt.Diag("invalid offset against GOT slot %v", p)
3992}
3993zRIL(_b, op_LGRL, uint32(p.To.Reg), 0, asm)
3994rel := obj.Addrel(c.cursym)
3995rel.Off = int32(c.pc + 2)
3996rel.Siz = 4
3997rel.Sym = p.From.Sym
3998rel.Type = objabi.R_GOTPCREL
3999rel.Add = 2 + int64(rel.Siz)
4000
4001case 94: // TLS local exec model
4002zRIL(_b, op_LARL, regtmp(p), (sizeRIL+sizeRXY+sizeRI)>>1, asm)
4003zRXY(op_LG, uint32(p.To.Reg), regtmp(p), 0, 0, asm)
4004zRI(op_BRC, 0xF, (sizeRI+8)>>1, asm)
4005*asm = append(*asm, 0, 0, 0, 0, 0, 0, 0, 0)
4006rel := obj.Addrel(c.cursym)
4007rel.Off = int32(c.pc + sizeRIL + sizeRXY + sizeRI)
4008rel.Siz = 8
4009rel.Sym = p.From.Sym
4010rel.Type = objabi.R_TLS_LE
4011rel.Add = 0
4012
4013case 95: // TLS initial exec model
4014// Assembly | Relocation symbol | Done Here?
4015// --------------------------------------------------------------
4016// ear %r11, %a0 | |
4017// sllg %r11, %r11, 32 | |
4018// ear %r11, %a1 | |
4019// larl %r10, <var>@indntpoff | R_390_TLS_IEENT | Y
4020// lg %r10, 0(%r10) | R_390_TLS_LOAD (tag) | Y
4021// la %r10, 0(%r10, %r11) | |
4022// --------------------------------------------------------------
4023
4024// R_390_TLS_IEENT
4025zRIL(_b, op_LARL, regtmp(p), 0, asm)
4026ieent := obj.Addrel(c.cursym)
4027ieent.Off = int32(c.pc + 2)
4028ieent.Siz = 4
4029ieent.Sym = p.From.Sym
4030ieent.Type = objabi.R_TLS_IE
4031ieent.Add = 2 + int64(ieent.Siz)
4032
4033// R_390_TLS_LOAD
4034zRXY(op_LGF, uint32(p.To.Reg), regtmp(p), 0, 0, asm)
4035// TODO(mundaym): add R_390_TLS_LOAD relocation here
4036// not strictly required but might allow the linker to optimize
4037
4038case 96: // clear macro
4039length := c.vregoff(&p.From)
4040offset := c.vregoff(&p.To)
4041reg := p.To.Reg
4042if reg == 0 {
4043reg = REGSP
4044}
4045if length <= 0 {
4046c.ctxt.Diag("cannot CLEAR %d bytes, must be greater than 0", length)
4047}
4048for length > 0 {
4049if offset < 0 || offset >= DISP12 {
4050if offset >= -DISP20/2 && offset < DISP20/2 {
4051zRXY(op_LAY, regtmp(p), uint32(reg), 0, uint32(offset), asm)
4052} else {
4053if reg != int16(regtmp(p)) {
4054zRRE(op_LGR, regtmp(p), uint32(reg), asm)
4055}
4056zRIL(_a, op_AGFI, regtmp(p), uint32(offset), asm)
4057}
4058reg = int16(regtmp(p))
4059offset = 0
4060}
4061size := length
4062if size > 256 {
4063size = 256
4064}
4065
4066switch size {
4067case 1:
4068zSI(op_MVI, 0, uint32(reg), uint32(offset), asm)
4069case 2:
4070zSIL(op_MVHHI, uint32(reg), uint32(offset), 0, asm)
4071case 4:
4072zSIL(op_MVHI, uint32(reg), uint32(offset), 0, asm)
4073case 8:
4074zSIL(op_MVGHI, uint32(reg), uint32(offset), 0, asm)
4075default:
4076zSS(_a, op_XC, uint32(size-1), 0, uint32(reg), uint32(offset), uint32(reg), uint32(offset), asm)
4077}
4078
4079length -= size
4080offset += size
4081}
4082
4083case 97: // store multiple
4084rstart := p.From.Reg
4085rend := p.Reg
4086offset := c.regoff(&p.To)
4087reg := p.To.Reg
4088if reg == 0 {
4089reg = REGSP
4090}
4091if offset < -DISP20/2 || offset >= DISP20/2 {
4092if reg != int16(regtmp(p)) {
4093zRRE(op_LGR, regtmp(p), uint32(reg), asm)
4094}
4095zRIL(_a, op_AGFI, regtmp(p), uint32(offset), asm)
4096reg = int16(regtmp(p))
4097offset = 0
4098}
4099switch p.As {
4100case ASTMY:
4101if offset >= 0 && offset < DISP12 {
4102zRS(op_STM, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
4103} else {
4104zRSY(op_STMY, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
4105}
4106case ASTMG:
4107zRSY(op_STMG, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
4108}
4109
4110case 98: // load multiple
4111rstart := p.Reg
4112rend := p.To.Reg
4113offset := c.regoff(&p.From)
4114reg := p.From.Reg
4115if reg == 0 {
4116reg = REGSP
4117}
4118if offset < -DISP20/2 || offset >= DISP20/2 {
4119if reg != int16(regtmp(p)) {
4120zRRE(op_LGR, regtmp(p), uint32(reg), asm)
4121}
4122zRIL(_a, op_AGFI, regtmp(p), uint32(offset), asm)
4123reg = int16(regtmp(p))
4124offset = 0
4125}
4126switch p.As {
4127case ALMY:
4128if offset >= 0 && offset < DISP12 {
4129zRS(op_LM, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
4130} else {
4131zRSY(op_LMY, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
4132}
4133case ALMG:
4134zRSY(op_LMG, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
4135}
4136
4137case 99: // interlocked load and op
4138if p.To.Index != 0 {
4139c.ctxt.Diag("cannot use indexed address")
4140}
4141offset := c.regoff(&p.To)
4142if offset < -DISP20/2 || offset >= DISP20/2 {
4143c.ctxt.Diag("%v does not fit into 20-bit signed integer", offset)
4144}
4145var opcode uint32
4146switch p.As {
4147case ALAA:
4148opcode = op_LAA
4149case ALAAG:
4150opcode = op_LAAG
4151case ALAAL:
4152opcode = op_LAAL
4153case ALAALG:
4154opcode = op_LAALG
4155case ALAN:
4156opcode = op_LAN
4157case ALANG:
4158opcode = op_LANG
4159case ALAX:
4160opcode = op_LAX
4161case ALAXG:
4162opcode = op_LAXG
4163case ALAO:
4164opcode = op_LAO
4165case ALAOG:
4166opcode = op_LAOG
4167}
4168zRSY(opcode, uint32(p.Reg), uint32(p.From.Reg), uint32(p.To.Reg), uint32(offset), asm)
4169
4170case 100: // VRX STORE
4171op, m3, _ := vop(p.As)
4172v1 := p.From.Reg
4173if p.Reg != 0 {
4174m3 = uint32(c.vregoff(&p.From))
4175v1 = p.Reg
4176}
4177b2 := p.To.Reg
4178if b2 == 0 {
4179b2 = REGSP
4180}
4181d2 := uint32(c.vregoff(&p.To))
4182zVRX(op, uint32(v1), uint32(p.To.Index), uint32(b2), d2, m3, asm)
4183
4184case 101: // VRX LOAD
4185op, m3, _ := vop(p.As)
4186src := &p.From
4187if p.GetFrom3() != nil {
4188m3 = uint32(c.vregoff(&p.From))
4189src = p.GetFrom3()
4190}
4191b2 := src.Reg
4192if b2 == 0 {
4193b2 = REGSP
4194}
4195d2 := uint32(c.vregoff(src))
4196zVRX(op, uint32(p.To.Reg), uint32(src.Index), uint32(b2), d2, m3, asm)
4197
4198case 102: // VRV SCATTER
4199op, _, _ := vop(p.As)
4200m3 := uint32(c.vregoff(&p.From))
4201b2 := p.To.Reg
4202if b2 == 0 {
4203b2 = REGSP
4204}
4205d2 := uint32(c.vregoff(&p.To))
4206zVRV(op, uint32(p.Reg), uint32(p.To.Index), uint32(b2), d2, m3, asm)
4207
4208case 103: // VRV GATHER
4209op, _, _ := vop(p.As)
4210m3 := uint32(c.vregoff(&p.From))
4211b2 := p.GetFrom3().Reg
4212if b2 == 0 {
4213b2 = REGSP
4214}
4215d2 := uint32(c.vregoff(p.GetFrom3()))
4216zVRV(op, uint32(p.To.Reg), uint32(p.GetFrom3().Index), uint32(b2), d2, m3, asm)
4217
4218case 104: // VRS SHIFT/ROTATE and LOAD GR FROM VR ELEMENT
4219op, m4, _ := vop(p.As)
4220fr := p.Reg
4221if fr == 0 {
4222fr = p.To.Reg
4223}
4224bits := uint32(c.vregoff(&p.From))
4225zVRS(op, uint32(p.To.Reg), uint32(fr), uint32(p.From.Reg), bits, m4, asm)
4226
4227case 105: // VRS STORE MULTIPLE
4228op, _, _ := vop(p.As)
4229offset := uint32(c.vregoff(&p.To))
4230reg := p.To.Reg
4231if reg == 0 {
4232reg = REGSP
4233}
4234zVRS(op, uint32(p.From.Reg), uint32(p.Reg), uint32(reg), offset, 0, asm)
4235
4236case 106: // VRS LOAD MULTIPLE
4237op, _, _ := vop(p.As)
4238offset := uint32(c.vregoff(&p.From))
4239reg := p.From.Reg
4240if reg == 0 {
4241reg = REGSP
4242}
4243zVRS(op, uint32(p.Reg), uint32(p.To.Reg), uint32(reg), offset, 0, asm)
4244
4245case 107: // VRS STORE WITH LENGTH
4246op, _, _ := vop(p.As)
4247offset := uint32(c.vregoff(&p.To))
4248reg := p.To.Reg
4249if reg == 0 {
4250reg = REGSP
4251}
4252zVRS(op, uint32(p.Reg), uint32(p.From.Reg), uint32(reg), offset, 0, asm)
4253
4254case 108: // VRS LOAD WITH LENGTH
4255op, _, _ := vop(p.As)
4256offset := uint32(c.vregoff(p.GetFrom3()))
4257reg := p.GetFrom3().Reg
4258if reg == 0 {
4259reg = REGSP
4260}
4261zVRS(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(reg), offset, 0, asm)
4262
4263case 109: // VRI-a
4264op, m3, _ := vop(p.As)
4265i2 := uint32(c.vregoff(&p.From))
4266if p.GetFrom3() != nil {
4267m3 = uint32(c.vregoff(&p.From))
4268i2 = uint32(c.vregoff(p.GetFrom3()))
4269}
4270switch p.As {
4271case AVZERO:
4272i2 = 0
4273case AVONE:
4274i2 = 0xffff
4275}
4276zVRIa(op, uint32(p.To.Reg), i2, m3, asm)
4277
4278case 110:
4279op, m4, _ := vop(p.As)
4280i2 := uint32(c.vregoff(&p.From))
4281i3 := uint32(c.vregoff(p.GetFrom3()))
4282zVRIb(op, uint32(p.To.Reg), i2, i3, m4, asm)
4283
4284case 111:
4285op, m4, _ := vop(p.As)
4286i2 := uint32(c.vregoff(&p.From))
4287zVRIc(op, uint32(p.To.Reg), uint32(p.Reg), i2, m4, asm)
4288
4289case 112:
4290op, m5, _ := vop(p.As)
4291i4 := uint32(c.vregoff(&p.From))
4292zVRId(op, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), i4, m5, asm)
4293
4294case 113:
4295op, m4, _ := vop(p.As)
4296m5 := singleElementMask(p.As)
4297i3 := uint32(c.vregoff(&p.From))
4298zVRIe(op, uint32(p.To.Reg), uint32(p.Reg), i3, m5, m4, asm)
4299
4300case 114: // VRR-a
4301op, m3, m5 := vop(p.As)
4302m4 := singleElementMask(p.As)
4303zVRRa(op, uint32(p.To.Reg), uint32(p.From.Reg), m5, m4, m3, asm)
4304
4305case 115: // VRR-a COMPARE
4306op, m3, m5 := vop(p.As)
4307m4 := singleElementMask(p.As)
4308zVRRa(op, uint32(p.From.Reg), uint32(p.To.Reg), m5, m4, m3, asm)
4309
4310case 117: // VRR-b
4311op, m4, m5 := vop(p.As)
4312zVRRb(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), m5, m4, asm)
4313
4314case 118: // VRR-c
4315op, m4, m6 := vop(p.As)
4316m5 := singleElementMask(p.As)
4317v3 := p.Reg
4318if v3 == 0 {
4319v3 = p.To.Reg
4320}
4321zVRRc(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(v3), m6, m5, m4, asm)
4322
4323case 119: // VRR-c SHIFT/ROTATE/DIVIDE/SUB (rhs value on the left, like SLD, DIV etc.)
4324op, m4, m6 := vop(p.As)
4325m5 := singleElementMask(p.As)
4326v2 := p.Reg
4327if v2 == 0 {
4328v2 = p.To.Reg
4329}
4330zVRRc(op, uint32(p.To.Reg), uint32(v2), uint32(p.From.Reg), m6, m5, m4, asm)
4331
4332case 120: // VRR-d
4333op, m6, _ := vop(p.As)
4334m5 := singleElementMask(p.As)
4335v1 := uint32(p.To.Reg)
4336v2 := uint32(p.From.Reg)
4337v3 := uint32(p.Reg)
4338v4 := uint32(p.GetFrom3().Reg)
4339zVRRd(op, v1, v2, v3, m6, m5, v4, asm)
4340
4341case 121: // VRR-e
4342op, m6, _ := vop(p.As)
4343m5 := singleElementMask(p.As)
4344v1 := uint32(p.To.Reg)
4345v2 := uint32(p.From.Reg)
4346v3 := uint32(p.Reg)
4347v4 := uint32(p.GetFrom3().Reg)
4348zVRRe(op, v1, v2, v3, m6, m5, v4, asm)
4349
4350case 122: // VRR-f LOAD VRS FROM GRS DISJOINT
4351op, _, _ := vop(p.As)
4352zVRRf(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), asm)
4353
4354case 123: // VPDI $m4, V2, V3, V1
4355op, _, _ := vop(p.As)
4356m4 := c.regoff(&p.From)
4357zVRRc(op, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), 0, 0, uint32(m4), asm)
4358}
4359}
4360
4361func (c *ctxtz) vregoff(a *obj.Addr) int64 {
4362c.instoffset = 0
4363if a != nil {
4364c.aclass(a)
4365}
4366return c.instoffset
4367}
4368
4369func (c *ctxtz) regoff(a *obj.Addr) int32 {
4370return int32(c.vregoff(a))
4371}
4372
4373// find if the displacement is within 12 bit
4374func isU12(displacement int32) bool {
4375return displacement >= 0 && displacement < DISP12
4376}
4377
4378// zopload12 returns the RX op with 12 bit displacement for the given load
4379func (c *ctxtz) zopload12(a obj.As) (uint32, bool) {
4380switch a {
4381case AFMOVD:
4382return op_LD, true
4383case AFMOVS:
4384return op_LE, true
4385}
4386return 0, false
4387}
4388
4389// zopload returns the RXY op for the given load
4390func (c *ctxtz) zopload(a obj.As) uint32 {
4391switch a {
4392// fixed point load
4393case AMOVD:
4394return op_LG
4395case AMOVW:
4396return op_LGF
4397case AMOVWZ:
4398return op_LLGF
4399case AMOVH:
4400return op_LGH
4401case AMOVHZ:
4402return op_LLGH
4403case AMOVB:
4404return op_LGB
4405case AMOVBZ:
4406return op_LLGC
4407
4408// floating point load
4409case AFMOVD:
4410return op_LDY
4411case AFMOVS:
4412return op_LEY
4413
4414// byte reversed load
4415case AMOVDBR:
4416return op_LRVG
4417case AMOVWBR:
4418return op_LRV
4419case AMOVHBR:
4420return op_LRVH
4421}
4422
4423c.ctxt.Diag("unknown store opcode %v", a)
4424return 0
4425}
4426
4427// zopstore12 returns the RX op with 12 bit displacement for the given store
4428func (c *ctxtz) zopstore12(a obj.As) (uint32, bool) {
4429switch a {
4430case AFMOVD:
4431return op_STD, true
4432case AFMOVS:
4433return op_STE, true
4434case AMOVW, AMOVWZ:
4435return op_ST, true
4436case AMOVH, AMOVHZ:
4437return op_STH, true
4438case AMOVB, AMOVBZ:
4439return op_STC, true
4440}
4441return 0, false
4442}
4443
4444// zopstore returns the RXY op for the given store
4445func (c *ctxtz) zopstore(a obj.As) uint32 {
4446switch a {
4447// fixed point store
4448case AMOVD:
4449return op_STG
4450case AMOVW, AMOVWZ:
4451return op_STY
4452case AMOVH, AMOVHZ:
4453return op_STHY
4454case AMOVB, AMOVBZ:
4455return op_STCY
4456
4457// floating point store
4458case AFMOVD:
4459return op_STDY
4460case AFMOVS:
4461return op_STEY
4462
4463// byte reversed store
4464case AMOVDBR:
4465return op_STRVG
4466case AMOVWBR:
4467return op_STRV
4468case AMOVHBR:
4469return op_STRVH
4470}
4471
4472c.ctxt.Diag("unknown store opcode %v", a)
4473return 0
4474}
4475
4476// zoprre returns the RRE op for the given a
4477func (c *ctxtz) zoprre(a obj.As) uint32 {
4478switch a {
4479case ACMP:
4480return op_CGR
4481case ACMPU:
4482return op_CLGR
4483case AFCMPO: //ordered
4484return op_KDBR
4485case AFCMPU: //unordered
4486return op_CDBR
4487case ACEBR:
4488return op_CEBR
4489}
4490c.ctxt.Diag("unknown rre opcode %v", a)
4491return 0
4492}
4493
4494// zoprr returns the RR op for the given a
4495func (c *ctxtz) zoprr(a obj.As) uint32 {
4496switch a {
4497case ACMPW:
4498return op_CR
4499case ACMPWU:
4500return op_CLR
4501}
4502c.ctxt.Diag("unknown rr opcode %v", a)
4503return 0
4504}
4505
4506// zopril returns the RIL op for the given a
4507func (c *ctxtz) zopril(a obj.As) uint32 {
4508switch a {
4509case ACMP:
4510return op_CGFI
4511case ACMPU:
4512return op_CLGFI
4513case ACMPW:
4514return op_CFI
4515case ACMPWU:
4516return op_CLFI
4517}
4518c.ctxt.Diag("unknown ril opcode %v", a)
4519return 0
4520}
4521
4522// z instructions sizes
4523const (
4524sizeE = 2
4525sizeI = 2
4526sizeIE = 4
4527sizeMII = 6
4528sizeRI = 4
4529sizeRI1 = 4
4530sizeRI2 = 4
4531sizeRI3 = 4
4532sizeRIE = 6
4533sizeRIE1 = 6
4534sizeRIE2 = 6
4535sizeRIE3 = 6
4536sizeRIE4 = 6
4537sizeRIE5 = 6
4538sizeRIE6 = 6
4539sizeRIL = 6
4540sizeRIL1 = 6
4541sizeRIL2 = 6
4542sizeRIL3 = 6
4543sizeRIS = 6
4544sizeRR = 2
4545sizeRRD = 4
4546sizeRRE = 4
4547sizeRRF = 4
4548sizeRRF1 = 4
4549sizeRRF2 = 4
4550sizeRRF3 = 4
4551sizeRRF4 = 4
4552sizeRRF5 = 4
4553sizeRRR = 2
4554sizeRRS = 6
4555sizeRS = 4
4556sizeRS1 = 4
4557sizeRS2 = 4
4558sizeRSI = 4
4559sizeRSL = 6
4560sizeRSY = 6
4561sizeRSY1 = 6
4562sizeRSY2 = 6
4563sizeRX = 4
4564sizeRX1 = 4
4565sizeRX2 = 4
4566sizeRXE = 6
4567sizeRXF = 6
4568sizeRXY = 6
4569sizeRXY1 = 6
4570sizeRXY2 = 6
4571sizeS = 4
4572sizeSI = 4
4573sizeSIL = 6
4574sizeSIY = 6
4575sizeSMI = 6
4576sizeSS = 6
4577sizeSS1 = 6
4578sizeSS2 = 6
4579sizeSS3 = 6
4580sizeSS4 = 6
4581sizeSS5 = 6
4582sizeSS6 = 6
4583sizeSSE = 6
4584sizeSSF = 6
4585)
4586
4587// instruction format variations
4588type form int
4589
4590const (
4591_a form = iota
4592_b
4593_c
4594_d
4595_e
4596_f
4597)
4598
4599func zE(op uint32, asm *[]byte) {
4600*asm = append(*asm, uint8(op>>8), uint8(op))
4601}
4602
4603func zI(op, i1 uint32, asm *[]byte) {
4604*asm = append(*asm, uint8(op>>8), uint8(i1))
4605}
4606
4607func zMII(op, m1, ri2, ri3 uint32, asm *[]byte) {
4608*asm = append(*asm,
4609uint8(op>>8),
4610(uint8(m1)<<4)|uint8((ri2>>8)&0x0F),
4611uint8(ri2),
4612uint8(ri3>>16),
4613uint8(ri3>>8),
4614uint8(ri3))
4615}
4616
4617func zRI(op, r1_m1, i2_ri2 uint32, asm *[]byte) {
4618*asm = append(*asm,
4619uint8(op>>8),
4620(uint8(r1_m1)<<4)|(uint8(op)&0x0F),
4621uint8(i2_ri2>>8),
4622uint8(i2_ri2))
4623}
4624
4625// Expected argument values for the instruction formats.
4626//
4627// Format a1 a2 a3 a4 a5 a6 a7
4628// ------------------------------------
4629// a r1, 0, i2, 0, 0, m3, 0
4630// b r1, r2, ri4, 0, 0, m3, 0
4631// c r1, m3, ri4, 0, 0, 0, i2
4632// d r1, r3, i2, 0, 0, 0, 0
4633// e r1, r3, ri2, 0, 0, 0, 0
4634// f r1, r2, 0, i3, i4, 0, i5
4635// g r1, m3, i2, 0, 0, 0, 0
4636func zRIE(f form, op, r1, r2_m3_r3, i2_ri4_ri2, i3, i4, m3, i2_i5 uint32, asm *[]byte) {
4637*asm = append(*asm, uint8(op>>8), uint8(r1)<<4|uint8(r2_m3_r3&0x0F))
4638
4639switch f {
4640default:
4641*asm = append(*asm, uint8(i2_ri4_ri2>>8), uint8(i2_ri4_ri2))
4642case _f:
4643*asm = append(*asm, uint8(i3), uint8(i4))
4644}
4645
4646switch f {
4647case _a, _b:
4648*asm = append(*asm, uint8(m3)<<4)
4649default:
4650*asm = append(*asm, uint8(i2_i5))
4651}
4652
4653*asm = append(*asm, uint8(op))
4654}
4655
4656func zRIL(f form, op, r1_m1, i2_ri2 uint32, asm *[]byte) {
4657if f == _a || f == _b {
4658r1_m1 = r1_m1 - obj.RBaseS390X // this is a register base
4659}
4660*asm = append(*asm,
4661uint8(op>>8),
4662(uint8(r1_m1)<<4)|(uint8(op)&0x0F),
4663uint8(i2_ri2>>24),
4664uint8(i2_ri2>>16),
4665uint8(i2_ri2>>8),
4666uint8(i2_ri2))
4667}
4668
4669func zRIS(op, r1, m3, b4, d4, i2 uint32, asm *[]byte) {
4670*asm = append(*asm,
4671uint8(op>>8),
4672(uint8(r1)<<4)|uint8(m3&0x0F),
4673(uint8(b4)<<4)|(uint8(d4>>8)&0x0F),
4674uint8(d4),
4675uint8(i2),
4676uint8(op))
4677}
4678
4679func zRR(op, r1, r2 uint32, asm *[]byte) {
4680*asm = append(*asm, uint8(op>>8), (uint8(r1)<<4)|uint8(r2&0x0F))
4681}
4682
4683func zRRD(op, r1, r3, r2 uint32, asm *[]byte) {
4684*asm = append(*asm,
4685uint8(op>>8),
4686uint8(op),
4687uint8(r1)<<4,
4688(uint8(r3)<<4)|uint8(r2&0x0F))
4689}
4690
4691func zRRE(op, r1, r2 uint32, asm *[]byte) {
4692*asm = append(*asm,
4693uint8(op>>8),
4694uint8(op),
46950,
4696(uint8(r1)<<4)|uint8(r2&0x0F))
4697}
4698
4699func zRRF(op, r3_m3, m4, r1, r2 uint32, asm *[]byte) {
4700*asm = append(*asm,
4701uint8(op>>8),
4702uint8(op),
4703(uint8(r3_m3)<<4)|uint8(m4&0x0F),
4704(uint8(r1)<<4)|uint8(r2&0x0F))
4705}
4706
4707func zRRS(op, r1, r2, b4, d4, m3 uint32, asm *[]byte) {
4708*asm = append(*asm,
4709uint8(op>>8),
4710(uint8(r1)<<4)|uint8(r2&0x0F),
4711(uint8(b4)<<4)|uint8((d4>>8)&0x0F),
4712uint8(d4),
4713uint8(m3)<<4,
4714uint8(op))
4715}
4716
4717func zRS(op, r1, r3_m3, b2, d2 uint32, asm *[]byte) {
4718*asm = append(*asm,
4719uint8(op>>8),
4720(uint8(r1)<<4)|uint8(r3_m3&0x0F),
4721(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
4722uint8(d2))
4723}
4724
4725func zRSI(op, r1, r3, ri2 uint32, asm *[]byte) {
4726*asm = append(*asm,
4727uint8(op>>8),
4728(uint8(r1)<<4)|uint8(r3&0x0F),
4729uint8(ri2>>8),
4730uint8(ri2))
4731}
4732
4733func zRSL(op, l1, b2, d2 uint32, asm *[]byte) {
4734*asm = append(*asm,
4735uint8(op>>8),
4736uint8(l1),
4737(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
4738uint8(d2),
4739uint8(op))
4740}
4741
4742func zRSY(op, r1, r3_m3, b2, d2 uint32, asm *[]byte) {
4743dl2 := uint16(d2) & 0x0FFF
4744*asm = append(*asm,
4745uint8(op>>8),
4746(uint8(r1)<<4)|uint8(r3_m3&0x0F),
4747(uint8(b2)<<4)|(uint8(dl2>>8)&0x0F),
4748uint8(dl2),
4749uint8(d2>>12),
4750uint8(op))
4751}
4752
4753func zRX(op, r1_m1, x2, b2, d2 uint32, asm *[]byte) {
4754*asm = append(*asm,
4755uint8(op>>8),
4756(uint8(r1_m1)<<4)|uint8(x2&0x0F),
4757(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
4758uint8(d2))
4759}
4760
4761func zRXE(op, r1, x2, b2, d2, m3 uint32, asm *[]byte) {
4762*asm = append(*asm,
4763uint8(op>>8),
4764(uint8(r1)<<4)|uint8(x2&0x0F),
4765(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
4766uint8(d2),
4767uint8(m3)<<4,
4768uint8(op))
4769}
4770
4771func zRXF(op, r3, x2, b2, d2, m1 uint32, asm *[]byte) {
4772*asm = append(*asm,
4773uint8(op>>8),
4774(uint8(r3)<<4)|uint8(x2&0x0F),
4775(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
4776uint8(d2),
4777uint8(m1)<<4,
4778uint8(op))
4779}
4780
4781func zRXY(op, r1_m1, x2, b2, d2 uint32, asm *[]byte) {
4782dl2 := uint16(d2) & 0x0FFF
4783*asm = append(*asm,
4784uint8(op>>8),
4785(uint8(r1_m1)<<4)|uint8(x2&0x0F),
4786(uint8(b2)<<4)|(uint8(dl2>>8)&0x0F),
4787uint8(dl2),
4788uint8(d2>>12),
4789uint8(op))
4790}
4791
4792func zS(op, b2, d2 uint32, asm *[]byte) {
4793*asm = append(*asm,
4794uint8(op>>8),
4795uint8(op),
4796(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
4797uint8(d2))
4798}
4799
4800func zSI(op, i2, b1, d1 uint32, asm *[]byte) {
4801*asm = append(*asm,
4802uint8(op>>8),
4803uint8(i2),
4804(uint8(b1)<<4)|uint8((d1>>8)&0x0F),
4805uint8(d1))
4806}
4807
4808func zSIL(op, b1, d1, i2 uint32, asm *[]byte) {
4809*asm = append(*asm,
4810uint8(op>>8),
4811uint8(op),
4812(uint8(b1)<<4)|uint8((d1>>8)&0x0F),
4813uint8(d1),
4814uint8(i2>>8),
4815uint8(i2))
4816}
4817
4818func zSIY(op, i2, b1, d1 uint32, asm *[]byte) {
4819dl1 := uint16(d1) & 0x0FFF
4820*asm = append(*asm,
4821uint8(op>>8),
4822uint8(i2),
4823(uint8(b1)<<4)|(uint8(dl1>>8)&0x0F),
4824uint8(dl1),
4825uint8(d1>>12),
4826uint8(op))
4827}
4828
4829func zSMI(op, m1, b3, d3, ri2 uint32, asm *[]byte) {
4830*asm = append(*asm,
4831uint8(op>>8),
4832uint8(m1)<<4,
4833(uint8(b3)<<4)|uint8((d3>>8)&0x0F),
4834uint8(d3),
4835uint8(ri2>>8),
4836uint8(ri2))
4837}
4838
4839// Expected argument values for the instruction formats.
4840//
4841// Format a1 a2 a3 a4 a5 a6
4842// -------------------------------
4843// a l1, 0, b1, d1, b2, d2
4844// b l1, l2, b1, d1, b2, d2
4845// c l1, i3, b1, d1, b2, d2
4846// d r1, r3, b1, d1, b2, d2
4847// e r1, r3, b2, d2, b4, d4
4848// f 0, l2, b1, d1, b2, d2
4849func zSS(f form, op, l1_r1, l2_i3_r3, b1_b2, d1_d2, b2_b4, d2_d4 uint32, asm *[]byte) {
4850*asm = append(*asm, uint8(op>>8))
4851
4852switch f {
4853case _a:
4854*asm = append(*asm, uint8(l1_r1))
4855case _b, _c, _d, _e:
4856*asm = append(*asm, (uint8(l1_r1)<<4)|uint8(l2_i3_r3&0x0F))
4857case _f:
4858*asm = append(*asm, uint8(l2_i3_r3))
4859}
4860
4861*asm = append(*asm,
4862(uint8(b1_b2)<<4)|uint8((d1_d2>>8)&0x0F),
4863uint8(d1_d2),
4864(uint8(b2_b4)<<4)|uint8((d2_d4>>8)&0x0F),
4865uint8(d2_d4))
4866}
4867
4868func zSSE(op, b1, d1, b2, d2 uint32, asm *[]byte) {
4869*asm = append(*asm,
4870uint8(op>>8),
4871uint8(op),
4872(uint8(b1)<<4)|uint8((d1>>8)&0x0F),
4873uint8(d1),
4874(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
4875uint8(d2))
4876}
4877
4878func zSSF(op, r3, b1, d1, b2, d2 uint32, asm *[]byte) {
4879*asm = append(*asm,
4880uint8(op>>8),
4881(uint8(r3)<<4)|(uint8(op)&0x0F),
4882(uint8(b1)<<4)|uint8((d1>>8)&0x0F),
4883uint8(d1),
4884(uint8(b2)<<4)|uint8((d2>>8)&0x0F),
4885uint8(d2))
4886}
4887
4888func rxb(va, vb, vc, vd uint32) uint8 {
4889mask := uint8(0)
4890if va >= REG_V16 && va <= REG_V31 {
4891mask |= 0x8
4892}
4893if vb >= REG_V16 && vb <= REG_V31 {
4894mask |= 0x4
4895}
4896if vc >= REG_V16 && vc <= REG_V31 {
4897mask |= 0x2
4898}
4899if vd >= REG_V16 && vd <= REG_V31 {
4900mask |= 0x1
4901}
4902return mask
4903}
4904
4905func zVRX(op, v1, x2, b2, d2, m3 uint32, asm *[]byte) {
4906*asm = append(*asm,
4907uint8(op>>8),
4908(uint8(v1)<<4)|(uint8(x2)&0xf),
4909(uint8(b2)<<4)|(uint8(d2>>8)&0xf),
4910uint8(d2),
4911(uint8(m3)<<4)|rxb(v1, 0, 0, 0),
4912uint8(op))
4913}
4914
4915func zVRV(op, v1, v2, b2, d2, m3 uint32, asm *[]byte) {
4916*asm = append(*asm,
4917uint8(op>>8),
4918(uint8(v1)<<4)|(uint8(v2)&0xf),
4919(uint8(b2)<<4)|(uint8(d2>>8)&0xf),
4920uint8(d2),
4921(uint8(m3)<<4)|rxb(v1, v2, 0, 0),
4922uint8(op))
4923}
4924
4925func zVRS(op, v1, v3_r3, b2, d2, m4 uint32, asm *[]byte) {
4926*asm = append(*asm,
4927uint8(op>>8),
4928(uint8(v1)<<4)|(uint8(v3_r3)&0xf),
4929(uint8(b2)<<4)|(uint8(d2>>8)&0xf),
4930uint8(d2),
4931(uint8(m4)<<4)|rxb(v1, v3_r3, 0, 0),
4932uint8(op))
4933}
4934
4935func zVRRa(op, v1, v2, m5, m4, m3 uint32, asm *[]byte) {
4936*asm = append(*asm,
4937uint8(op>>8),
4938(uint8(v1)<<4)|(uint8(v2)&0xf),
49390,
4940(uint8(m5)<<4)|(uint8(m4)&0xf),
4941(uint8(m3)<<4)|rxb(v1, v2, 0, 0),
4942uint8(op))
4943}
4944
4945func zVRRb(op, v1, v2, v3, m5, m4 uint32, asm *[]byte) {
4946*asm = append(*asm,
4947uint8(op>>8),
4948(uint8(v1)<<4)|(uint8(v2)&0xf),
4949uint8(v3)<<4,
4950uint8(m5)<<4,
4951(uint8(m4)<<4)|rxb(v1, v2, v3, 0),
4952uint8(op))
4953}
4954
4955func zVRRc(op, v1, v2, v3, m6, m5, m4 uint32, asm *[]byte) {
4956*asm = append(*asm,
4957uint8(op>>8),
4958(uint8(v1)<<4)|(uint8(v2)&0xf),
4959uint8(v3)<<4,
4960(uint8(m6)<<4)|(uint8(m5)&0xf),
4961(uint8(m4)<<4)|rxb(v1, v2, v3, 0),
4962uint8(op))
4963}
4964
4965func zVRRd(op, v1, v2, v3, m5, m6, v4 uint32, asm *[]byte) {
4966*asm = append(*asm,
4967uint8(op>>8),
4968(uint8(v1)<<4)|(uint8(v2)&0xf),
4969(uint8(v3)<<4)|(uint8(m5)&0xf),
4970uint8(m6)<<4,
4971(uint8(v4)<<4)|rxb(v1, v2, v3, v4),
4972uint8(op))
4973}
4974
4975func zVRRe(op, v1, v2, v3, m6, m5, v4 uint32, asm *[]byte) {
4976*asm = append(*asm,
4977uint8(op>>8),
4978(uint8(v1)<<4)|(uint8(v2)&0xf),
4979(uint8(v3)<<4)|(uint8(m6)&0xf),
4980uint8(m5),
4981(uint8(v4)<<4)|rxb(v1, v2, v3, v4),
4982uint8(op))
4983}
4984
4985func zVRRf(op, v1, r2, r3 uint32, asm *[]byte) {
4986*asm = append(*asm,
4987uint8(op>>8),
4988(uint8(v1)<<4)|(uint8(r2)&0xf),
4989uint8(r3)<<4,
49900,
4991rxb(v1, 0, 0, 0),
4992uint8(op))
4993}
4994
4995func zVRIa(op, v1, i2, m3 uint32, asm *[]byte) {
4996*asm = append(*asm,
4997uint8(op>>8),
4998uint8(v1)<<4,
4999uint8(i2>>8),
5000uint8(i2),
5001(uint8(m3)<<4)|rxb(v1, 0, 0, 0),
5002uint8(op))
5003}
5004
5005func zVRIb(op, v1, i2, i3, m4 uint32, asm *[]byte) {
5006*asm = append(*asm,
5007uint8(op>>8),
5008uint8(v1)<<4,
5009uint8(i2),
5010uint8(i3),
5011(uint8(m4)<<4)|rxb(v1, 0, 0, 0),
5012uint8(op))
5013}
5014
5015func zVRIc(op, v1, v3, i2, m4 uint32, asm *[]byte) {
5016*asm = append(*asm,
5017uint8(op>>8),
5018(uint8(v1)<<4)|(uint8(v3)&0xf),
5019uint8(i2>>8),
5020uint8(i2),
5021(uint8(m4)<<4)|rxb(v1, v3, 0, 0),
5022uint8(op))
5023}
5024
5025func zVRId(op, v1, v2, v3, i4, m5 uint32, asm *[]byte) {
5026*asm = append(*asm,
5027uint8(op>>8),
5028(uint8(v1)<<4)|(uint8(v2)&0xf),
5029uint8(v3)<<4,
5030uint8(i4),
5031(uint8(m5)<<4)|rxb(v1, v2, v3, 0),
5032uint8(op))
5033}
5034
5035func zVRIe(op, v1, v2, i3, m5, m4 uint32, asm *[]byte) {
5036*asm = append(*asm,
5037uint8(op>>8),
5038(uint8(v1)<<4)|(uint8(v2)&0xf),
5039uint8(i3>>4),
5040(uint8(i3)<<4)|(uint8(m5)&0xf),
5041(uint8(m4)<<4)|rxb(v1, v2, 0, 0),
5042uint8(op))
5043}
5044