1429b31a2SRichard Henderson /* Disassembler for the PA-RISC. Somewhat derived from sparc-pinsn.c.
2429b31a2SRichard Henderson Copyright 1989, 1990, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2003,
3429b31a2SRichard Henderson 2005 Free Software Foundation, Inc.
4429b31a2SRichard Henderson
5429b31a2SRichard Henderson Contributed by the Center for Software Science at the
6429b31a2SRichard Henderson University of Utah (pa-gdb-bugs@cs.utah.edu).
7429b31a2SRichard Henderson
8429b31a2SRichard Henderson This program is free software; you can redistribute it and/or modify
9429b31a2SRichard Henderson it under the terms of the GNU General Public License as published by
10429b31a2SRichard Henderson the Free Software Foundation; either version 2 of the License, or
11429b31a2SRichard Henderson (at your option) any later version.
12429b31a2SRichard Henderson
13429b31a2SRichard Henderson This program is distributed in the hope that it will be useful,
14429b31a2SRichard Henderson but WITHOUT ANY WARRANTY; without even the implied warranty of
15429b31a2SRichard Henderson MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16429b31a2SRichard Henderson GNU General Public License for more details.
17429b31a2SRichard Henderson
18429b31a2SRichard Henderson You should have received a copy of the GNU General Public License
19429b31a2SRichard Henderson along with this program; if not, see <http://www.gnu.org/licenses/>. */
20429b31a2SRichard Henderson
21429b31a2SRichard Henderson #include "qemu/osdep.h"
223979fca4SMarkus Armbruster #include "disas/dis-asm.h"
23429b31a2SRichard Henderson
24429b31a2SRichard Henderson /* HP PA-RISC SOM object file format: definitions internal to BFD.
25429b31a2SRichard Henderson Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
26429b31a2SRichard Henderson 2003 Free Software Foundation, Inc.
27429b31a2SRichard Henderson
28429b31a2SRichard Henderson Contributed by the Center for Software Science at the
29429b31a2SRichard Henderson University of Utah (pa-gdb-bugs@cs.utah.edu).
30429b31a2SRichard Henderson
31429b31a2SRichard Henderson This file is part of BFD, the Binary File Descriptor library.
32429b31a2SRichard Henderson
33429b31a2SRichard Henderson This program is free software; you can redistribute it and/or modify
34429b31a2SRichard Henderson it under the terms of the GNU General Public License as published by
35429b31a2SRichard Henderson the Free Software Foundation; either version 2 of the License, or
36429b31a2SRichard Henderson (at your option) any later version.
37429b31a2SRichard Henderson
38429b31a2SRichard Henderson This program is distributed in the hope that it will be useful,
39429b31a2SRichard Henderson but WITHOUT ANY WARRANTY; without even the implied warranty of
40429b31a2SRichard Henderson MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
41429b31a2SRichard Henderson GNU General Public License for more details.
42429b31a2SRichard Henderson
43429b31a2SRichard Henderson You should have received a copy of the GNU General Public License
44429b31a2SRichard Henderson along with this program; if not, see <http://www.gnu.org/licenses/>. */
45429b31a2SRichard Henderson
46429b31a2SRichard Henderson #ifndef _LIBHPPA_H
47429b31a2SRichard Henderson #define _LIBHPPA_H
48429b31a2SRichard Henderson
49429b31a2SRichard Henderson #define BYTES_IN_WORD 4
50429b31a2SRichard Henderson #define PA_PAGESIZE 0x1000
51429b31a2SRichard Henderson
52429b31a2SRichard Henderson /* The PA instruction set variants. */
53429b31a2SRichard Henderson enum pa_arch {pa10 = 10, pa11 = 11, pa20 = 20, pa20w = 25};
54429b31a2SRichard Henderson
55429b31a2SRichard Henderson /* HP PA-RISC relocation types */
56429b31a2SRichard Henderson
57429b31a2SRichard Henderson enum hppa_reloc_field_selector_type
58429b31a2SRichard Henderson {
59429b31a2SRichard Henderson R_HPPA_FSEL = 0x0,
60429b31a2SRichard Henderson R_HPPA_LSSEL = 0x1,
61429b31a2SRichard Henderson R_HPPA_RSSEL = 0x2,
62429b31a2SRichard Henderson R_HPPA_LSEL = 0x3,
63429b31a2SRichard Henderson R_HPPA_RSEL = 0x4,
64429b31a2SRichard Henderson R_HPPA_LDSEL = 0x5,
65429b31a2SRichard Henderson R_HPPA_RDSEL = 0x6,
66429b31a2SRichard Henderson R_HPPA_LRSEL = 0x7,
67429b31a2SRichard Henderson R_HPPA_RRSEL = 0x8,
68429b31a2SRichard Henderson R_HPPA_NSEL = 0x9,
69429b31a2SRichard Henderson R_HPPA_NLSEL = 0xa,
70429b31a2SRichard Henderson R_HPPA_NLRSEL = 0xb,
71429b31a2SRichard Henderson R_HPPA_PSEL = 0xc,
72429b31a2SRichard Henderson R_HPPA_LPSEL = 0xd,
73429b31a2SRichard Henderson R_HPPA_RPSEL = 0xe,
74429b31a2SRichard Henderson R_HPPA_TSEL = 0xf,
75429b31a2SRichard Henderson R_HPPA_LTSEL = 0x10,
76429b31a2SRichard Henderson R_HPPA_RTSEL = 0x11,
77429b31a2SRichard Henderson R_HPPA_LTPSEL = 0x12,
78429b31a2SRichard Henderson R_HPPA_RTPSEL = 0x13
79429b31a2SRichard Henderson };
80429b31a2SRichard Henderson
81429b31a2SRichard Henderson /* /usr/include/reloc.h defines these to constants. We want to use
82429b31a2SRichard Henderson them in enums, so #undef them before we start using them. We might
83429b31a2SRichard Henderson be able to fix this another way by simply managing not to include
84429b31a2SRichard Henderson /usr/include/reloc.h, but currently GDB picks up these defines
85429b31a2SRichard Henderson somewhere. */
86429b31a2SRichard Henderson #undef e_fsel
87429b31a2SRichard Henderson #undef e_lssel
88429b31a2SRichard Henderson #undef e_rssel
89429b31a2SRichard Henderson #undef e_lsel
90429b31a2SRichard Henderson #undef e_rsel
91429b31a2SRichard Henderson #undef e_ldsel
92429b31a2SRichard Henderson #undef e_rdsel
93429b31a2SRichard Henderson #undef e_lrsel
94429b31a2SRichard Henderson #undef e_rrsel
95429b31a2SRichard Henderson #undef e_nsel
96429b31a2SRichard Henderson #undef e_nlsel
97429b31a2SRichard Henderson #undef e_nlrsel
98429b31a2SRichard Henderson #undef e_psel
99429b31a2SRichard Henderson #undef e_lpsel
100429b31a2SRichard Henderson #undef e_rpsel
101429b31a2SRichard Henderson #undef e_tsel
102429b31a2SRichard Henderson #undef e_ltsel
103429b31a2SRichard Henderson #undef e_rtsel
104429b31a2SRichard Henderson #undef e_one
105429b31a2SRichard Henderson #undef e_two
106429b31a2SRichard Henderson #undef e_pcrel
107429b31a2SRichard Henderson #undef e_con
108429b31a2SRichard Henderson #undef e_plabel
109429b31a2SRichard Henderson #undef e_abs
110429b31a2SRichard Henderson
111429b31a2SRichard Henderson /* for compatibility */
112429b31a2SRichard Henderson enum hppa_reloc_field_selector_type_alt
113429b31a2SRichard Henderson {
114429b31a2SRichard Henderson e_fsel = R_HPPA_FSEL,
115429b31a2SRichard Henderson e_lssel = R_HPPA_LSSEL,
116429b31a2SRichard Henderson e_rssel = R_HPPA_RSSEL,
117429b31a2SRichard Henderson e_lsel = R_HPPA_LSEL,
118429b31a2SRichard Henderson e_rsel = R_HPPA_RSEL,
119429b31a2SRichard Henderson e_ldsel = R_HPPA_LDSEL,
120429b31a2SRichard Henderson e_rdsel = R_HPPA_RDSEL,
121429b31a2SRichard Henderson e_lrsel = R_HPPA_LRSEL,
122429b31a2SRichard Henderson e_rrsel = R_HPPA_RRSEL,
123429b31a2SRichard Henderson e_nsel = R_HPPA_NSEL,
124429b31a2SRichard Henderson e_nlsel = R_HPPA_NLSEL,
125429b31a2SRichard Henderson e_nlrsel = R_HPPA_NLRSEL,
126429b31a2SRichard Henderson e_psel = R_HPPA_PSEL,
127429b31a2SRichard Henderson e_lpsel = R_HPPA_LPSEL,
128429b31a2SRichard Henderson e_rpsel = R_HPPA_RPSEL,
129429b31a2SRichard Henderson e_tsel = R_HPPA_TSEL,
130429b31a2SRichard Henderson e_ltsel = R_HPPA_LTSEL,
131429b31a2SRichard Henderson e_rtsel = R_HPPA_RTSEL,
132429b31a2SRichard Henderson e_ltpsel = R_HPPA_LTPSEL,
133429b31a2SRichard Henderson e_rtpsel = R_HPPA_RTPSEL
134429b31a2SRichard Henderson };
135429b31a2SRichard Henderson
136429b31a2SRichard Henderson enum hppa_reloc_expr_type
137429b31a2SRichard Henderson {
138429b31a2SRichard Henderson R_HPPA_E_ONE = 0,
139429b31a2SRichard Henderson R_HPPA_E_TWO = 1,
140429b31a2SRichard Henderson R_HPPA_E_PCREL = 2,
141429b31a2SRichard Henderson R_HPPA_E_CON = 3,
142429b31a2SRichard Henderson R_HPPA_E_PLABEL = 7,
143429b31a2SRichard Henderson R_HPPA_E_ABS = 18
144429b31a2SRichard Henderson };
145429b31a2SRichard Henderson
146429b31a2SRichard Henderson /* for compatibility */
147429b31a2SRichard Henderson enum hppa_reloc_expr_type_alt
148429b31a2SRichard Henderson {
149429b31a2SRichard Henderson e_one = R_HPPA_E_ONE,
150429b31a2SRichard Henderson e_two = R_HPPA_E_TWO,
151429b31a2SRichard Henderson e_pcrel = R_HPPA_E_PCREL,
152429b31a2SRichard Henderson e_con = R_HPPA_E_CON,
153429b31a2SRichard Henderson e_plabel = R_HPPA_E_PLABEL,
154429b31a2SRichard Henderson e_abs = R_HPPA_E_ABS
155429b31a2SRichard Henderson };
156429b31a2SRichard Henderson
157429b31a2SRichard Henderson
158429b31a2SRichard Henderson /* Relocations for function calls must be accompanied by parameter
159429b31a2SRichard Henderson relocation bits. These bits describe exactly where the caller has
160429b31a2SRichard Henderson placed the function's arguments and where it expects to find a return
161429b31a2SRichard Henderson value.
162429b31a2SRichard Henderson
163429b31a2SRichard Henderson Both ELF and SOM encode this information within the addend field
164429b31a2SRichard Henderson of the call relocation. (Note this could break very badly if one
165429b31a2SRichard Henderson was to make a call like bl foo + 0x12345678).
166429b31a2SRichard Henderson
167429b31a2SRichard Henderson The high order 10 bits contain parameter relocation information,
168429b31a2SRichard Henderson the low order 22 bits contain the constant offset. */
169429b31a2SRichard Henderson
170429b31a2SRichard Henderson #define HPPA_R_ARG_RELOC(a) \
171429b31a2SRichard Henderson (((a) >> 22) & 0x3ff)
172429b31a2SRichard Henderson #define HPPA_R_CONSTANT(a) \
173429b31a2SRichard Henderson ((((bfd_signed_vma)(a)) << (BFD_ARCH_SIZE-22)) >> (BFD_ARCH_SIZE-22))
174429b31a2SRichard Henderson #define HPPA_R_ADDEND(r, c) \
175429b31a2SRichard Henderson (((r) << 22) + ((c) & 0x3fffff))
176429b31a2SRichard Henderson
177429b31a2SRichard Henderson
178429b31a2SRichard Henderson /* Some functions to manipulate PA instructions. */
179429b31a2SRichard Henderson
180429b31a2SRichard Henderson /* Declare the functions with the unused attribute to avoid warnings. */
181429b31a2SRichard Henderson static inline int sign_extend (int, int) ATTRIBUTE_UNUSED;
182429b31a2SRichard Henderson static inline int low_sign_extend (int, int) ATTRIBUTE_UNUSED;
183429b31a2SRichard Henderson static inline int sign_unext (int, int) ATTRIBUTE_UNUSED;
184429b31a2SRichard Henderson static inline int low_sign_unext (int, int) ATTRIBUTE_UNUSED;
185429b31a2SRichard Henderson static inline int re_assemble_3 (int) ATTRIBUTE_UNUSED;
186429b31a2SRichard Henderson static inline int re_assemble_12 (int) ATTRIBUTE_UNUSED;
187429b31a2SRichard Henderson static inline int re_assemble_14 (int) ATTRIBUTE_UNUSED;
188429b31a2SRichard Henderson static inline int re_assemble_16 (int) ATTRIBUTE_UNUSED;
189429b31a2SRichard Henderson static inline int re_assemble_17 (int) ATTRIBUTE_UNUSED;
190429b31a2SRichard Henderson static inline int re_assemble_21 (int) ATTRIBUTE_UNUSED;
191429b31a2SRichard Henderson static inline int re_assemble_22 (int) ATTRIBUTE_UNUSED;
192429b31a2SRichard Henderson static inline bfd_signed_vma hppa_field_adjust
193429b31a2SRichard Henderson (bfd_vma, bfd_signed_vma, enum hppa_reloc_field_selector_type_alt)
194429b31a2SRichard Henderson ATTRIBUTE_UNUSED;
195429b31a2SRichard Henderson static inline int hppa_rebuild_insn (int, int, int) ATTRIBUTE_UNUSED;
196429b31a2SRichard Henderson
197429b31a2SRichard Henderson
198429b31a2SRichard Henderson /* The *sign_extend functions are used to assemble various bitfields
199429b31a2SRichard Henderson taken from an instruction and return the resulting immediate
200429b31a2SRichard Henderson value. */
201429b31a2SRichard Henderson
202429b31a2SRichard Henderson static inline int
sign_extend(int x,int len)203429b31a2SRichard Henderson sign_extend (int x, int len)
204429b31a2SRichard Henderson {
205429b31a2SRichard Henderson int signbit = (1 << (len - 1));
206429b31a2SRichard Henderson int mask = (signbit << 1) - 1;
207429b31a2SRichard Henderson return ((x & mask) ^ signbit) - signbit;
208429b31a2SRichard Henderson }
209429b31a2SRichard Henderson
210429b31a2SRichard Henderson static inline int
low_sign_extend(int x,int len)211429b31a2SRichard Henderson low_sign_extend (int x, int len)
212429b31a2SRichard Henderson {
213429b31a2SRichard Henderson return (x >> 1) - ((x & 1) << (len - 1));
214429b31a2SRichard Henderson }
215429b31a2SRichard Henderson
216429b31a2SRichard Henderson
217429b31a2SRichard Henderson /* The re_assemble_* functions prepare an immediate value for
218429b31a2SRichard Henderson insertion into an opcode. pa-risc uses all sorts of weird bitfields
219429b31a2SRichard Henderson in the instruction to hold the value. */
220429b31a2SRichard Henderson
221429b31a2SRichard Henderson static inline int
sign_unext(int x,int len)222429b31a2SRichard Henderson sign_unext (int x, int len)
223429b31a2SRichard Henderson {
224429b31a2SRichard Henderson int len_ones;
225429b31a2SRichard Henderson
226429b31a2SRichard Henderson len_ones = (1 << len) - 1;
227429b31a2SRichard Henderson
228429b31a2SRichard Henderson return x & len_ones;
229429b31a2SRichard Henderson }
230429b31a2SRichard Henderson
231429b31a2SRichard Henderson static inline int
low_sign_unext(int x,int len)232429b31a2SRichard Henderson low_sign_unext (int x, int len)
233429b31a2SRichard Henderson {
234429b31a2SRichard Henderson int temp;
235429b31a2SRichard Henderson int sign;
236429b31a2SRichard Henderson
237429b31a2SRichard Henderson sign = (x >> (len-1)) & 1;
238429b31a2SRichard Henderson
239429b31a2SRichard Henderson temp = sign_unext (x, len-1);
240429b31a2SRichard Henderson
241429b31a2SRichard Henderson return (temp << 1) | sign;
242429b31a2SRichard Henderson }
243429b31a2SRichard Henderson
244429b31a2SRichard Henderson static inline int
re_assemble_3(int as3)245429b31a2SRichard Henderson re_assemble_3 (int as3)
246429b31a2SRichard Henderson {
247429b31a2SRichard Henderson return (( (as3 & 4) << (13-2))
248429b31a2SRichard Henderson | ((as3 & 3) << (13+1)));
249429b31a2SRichard Henderson }
250429b31a2SRichard Henderson
251429b31a2SRichard Henderson static inline int
re_assemble_12(int as12)252429b31a2SRichard Henderson re_assemble_12 (int as12)
253429b31a2SRichard Henderson {
254429b31a2SRichard Henderson return (( (as12 & 0x800) >> 11)
255429b31a2SRichard Henderson | ((as12 & 0x400) >> (10 - 2))
256429b31a2SRichard Henderson | ((as12 & 0x3ff) << (1 + 2)));
257429b31a2SRichard Henderson }
258429b31a2SRichard Henderson
259429b31a2SRichard Henderson static inline int
re_assemble_14(int as14)260429b31a2SRichard Henderson re_assemble_14 (int as14)
261429b31a2SRichard Henderson {
262429b31a2SRichard Henderson return (( (as14 & 0x1fff) << 1)
263429b31a2SRichard Henderson | ((as14 & 0x2000) >> 13));
264429b31a2SRichard Henderson }
265429b31a2SRichard Henderson
266429b31a2SRichard Henderson static inline int
re_assemble_16(int as16)267429b31a2SRichard Henderson re_assemble_16 (int as16)
268429b31a2SRichard Henderson {
269429b31a2SRichard Henderson int s, t;
270429b31a2SRichard Henderson
271429b31a2SRichard Henderson /* Unusual 16-bit encoding, for wide mode only. */
272429b31a2SRichard Henderson t = (as16 << 1) & 0xffff;
273429b31a2SRichard Henderson s = (as16 & 0x8000);
274429b31a2SRichard Henderson return (t ^ s ^ (s >> 1)) | (s >> 15);
275429b31a2SRichard Henderson }
276429b31a2SRichard Henderson
277429b31a2SRichard Henderson static inline int
re_assemble_17(int as17)278429b31a2SRichard Henderson re_assemble_17 (int as17)
279429b31a2SRichard Henderson {
280429b31a2SRichard Henderson return (( (as17 & 0x10000) >> 16)
281429b31a2SRichard Henderson | ((as17 & 0x0f800) << (16 - 11))
282429b31a2SRichard Henderson | ((as17 & 0x00400) >> (10 - 2))
283429b31a2SRichard Henderson | ((as17 & 0x003ff) << (1 + 2)));
284429b31a2SRichard Henderson }
285429b31a2SRichard Henderson
286429b31a2SRichard Henderson static inline int
re_assemble_21(int as21)287429b31a2SRichard Henderson re_assemble_21 (int as21)
288429b31a2SRichard Henderson {
289429b31a2SRichard Henderson return (( (as21 & 0x100000) >> 20)
290429b31a2SRichard Henderson | ((as21 & 0x0ffe00) >> 8)
291429b31a2SRichard Henderson | ((as21 & 0x000180) << 7)
292429b31a2SRichard Henderson | ((as21 & 0x00007c) << 14)
293429b31a2SRichard Henderson | ((as21 & 0x000003) << 12));
294429b31a2SRichard Henderson }
295429b31a2SRichard Henderson
296429b31a2SRichard Henderson static inline int
re_assemble_22(int as22)297429b31a2SRichard Henderson re_assemble_22 (int as22)
298429b31a2SRichard Henderson {
299429b31a2SRichard Henderson return (( (as22 & 0x200000) >> 21)
300429b31a2SRichard Henderson | ((as22 & 0x1f0000) << (21 - 16))
301429b31a2SRichard Henderson | ((as22 & 0x00f800) << (16 - 11))
302429b31a2SRichard Henderson | ((as22 & 0x000400) >> (10 - 2))
303429b31a2SRichard Henderson | ((as22 & 0x0003ff) << (1 + 2)));
304429b31a2SRichard Henderson }
305429b31a2SRichard Henderson
306429b31a2SRichard Henderson
307429b31a2SRichard Henderson /* Handle field selectors for PA instructions.
308429b31a2SRichard Henderson The L and R (and LS, RS etc.) selectors are used in pairs to form a
309429b31a2SRichard Henderson full 32 bit address. eg.
310429b31a2SRichard Henderson
311429b31a2SRichard Henderson LDIL L'start,%r1 ; put left part into r1
312429b31a2SRichard Henderson LDW R'start(%r1),%r2 ; add r1 and right part to form address
313429b31a2SRichard Henderson
314429b31a2SRichard Henderson This function returns sign extended values in all cases.
315429b31a2SRichard Henderson */
316429b31a2SRichard Henderson
317429b31a2SRichard Henderson static inline bfd_signed_vma
hppa_field_adjust(bfd_vma sym_val,bfd_signed_vma addend,enum hppa_reloc_field_selector_type_alt r_field)318429b31a2SRichard Henderson hppa_field_adjust (bfd_vma sym_val,
319429b31a2SRichard Henderson bfd_signed_vma addend,
320429b31a2SRichard Henderson enum hppa_reloc_field_selector_type_alt r_field)
321429b31a2SRichard Henderson {
322429b31a2SRichard Henderson bfd_signed_vma value;
323429b31a2SRichard Henderson
324429b31a2SRichard Henderson value = sym_val + addend;
325429b31a2SRichard Henderson switch (r_field)
326429b31a2SRichard Henderson {
327429b31a2SRichard Henderson case e_fsel:
328429b31a2SRichard Henderson /* F: No change. */
329429b31a2SRichard Henderson break;
330429b31a2SRichard Henderson
331429b31a2SRichard Henderson case e_nsel:
332429b31a2SRichard Henderson /* N: null selector. I don't really understand what this is all
333429b31a2SRichard Henderson about, but HP's documentation says "this indicates that zero
334429b31a2SRichard Henderson bits are to be used for the displacement on the instruction.
335429b31a2SRichard Henderson This fixup is used to identify three-instruction sequences to
336429b31a2SRichard Henderson access data (for importing shared library data)." */
337429b31a2SRichard Henderson value = 0;
338429b31a2SRichard Henderson break;
339429b31a2SRichard Henderson
340429b31a2SRichard Henderson case e_lsel:
341429b31a2SRichard Henderson case e_nlsel:
342429b31a2SRichard Henderson /* L: Select top 21 bits. */
343429b31a2SRichard Henderson value = value >> 11;
344429b31a2SRichard Henderson break;
345429b31a2SRichard Henderson
346429b31a2SRichard Henderson case e_rsel:
347429b31a2SRichard Henderson /* R: Select bottom 11 bits. */
348429b31a2SRichard Henderson value = value & 0x7ff;
349429b31a2SRichard Henderson break;
350429b31a2SRichard Henderson
351429b31a2SRichard Henderson case e_lssel:
352429b31a2SRichard Henderson /* LS: Round to nearest multiple of 2048 then select top 21 bits. */
353429b31a2SRichard Henderson value = value + 0x400;
354429b31a2SRichard Henderson value = value >> 11;
355429b31a2SRichard Henderson break;
356429b31a2SRichard Henderson
357429b31a2SRichard Henderson case e_rssel:
358429b31a2SRichard Henderson /* RS: Select bottom 11 bits for LS.
359429b31a2SRichard Henderson We need to return a value such that 2048 * LS'x + RS'x == x.
360429b31a2SRichard Henderson ie. RS'x = x - ((x + 0x400) & -0x800)
361429b31a2SRichard Henderson this is just a sign extension from bit 21. */
362429b31a2SRichard Henderson value = ((value & 0x7ff) ^ 0x400) - 0x400;
363429b31a2SRichard Henderson break;
364429b31a2SRichard Henderson
365429b31a2SRichard Henderson case e_ldsel:
366429b31a2SRichard Henderson /* LD: Round to next multiple of 2048 then select top 21 bits.
367429b31a2SRichard Henderson Yes, if we are already on a multiple of 2048, we go up to the
368429b31a2SRichard Henderson next one. RD in this case will be -2048. */
369429b31a2SRichard Henderson value = value + 0x800;
370429b31a2SRichard Henderson value = value >> 11;
371429b31a2SRichard Henderson break;
372429b31a2SRichard Henderson
373429b31a2SRichard Henderson case e_rdsel:
374429b31a2SRichard Henderson /* RD: Set bits 0-20 to one. */
375429b31a2SRichard Henderson value = value | -0x800;
376429b31a2SRichard Henderson break;
377429b31a2SRichard Henderson
378429b31a2SRichard Henderson case e_lrsel:
379429b31a2SRichard Henderson case e_nlrsel:
380429b31a2SRichard Henderson /* LR: L with rounding of the addend to nearest 8k. */
381429b31a2SRichard Henderson value = sym_val + ((addend + 0x1000) & -0x2000);
382429b31a2SRichard Henderson value = value >> 11;
383429b31a2SRichard Henderson break;
384429b31a2SRichard Henderson
385429b31a2SRichard Henderson case e_rrsel:
386429b31a2SRichard Henderson /* RR: R with rounding of the addend to nearest 8k.
387429b31a2SRichard Henderson We need to return a value such that 2048 * LR'x + RR'x == x
388429b31a2SRichard Henderson ie. RR'x = s+a - (s + (((a + 0x1000) & -0x2000) & -0x800))
389429b31a2SRichard Henderson . = s+a - ((s & -0x800) + ((a + 0x1000) & -0x2000))
390429b31a2SRichard Henderson . = (s & 0x7ff) + a - ((a + 0x1000) & -0x2000) */
391429b31a2SRichard Henderson value = (sym_val & 0x7ff) + (((addend & 0x1fff) ^ 0x1000) - 0x1000);
392429b31a2SRichard Henderson break;
393429b31a2SRichard Henderson
394429b31a2SRichard Henderson default:
395429b31a2SRichard Henderson abort ();
396429b31a2SRichard Henderson }
397429b31a2SRichard Henderson return value;
398429b31a2SRichard Henderson }
399429b31a2SRichard Henderson
400429b31a2SRichard Henderson /* PA-RISC OPCODES */
401429b31a2SRichard Henderson #define get_opcode(insn) (((insn) >> 26) & 0x3f)
402429b31a2SRichard Henderson
403429b31a2SRichard Henderson enum hppa_opcode_type
404429b31a2SRichard Henderson {
405429b31a2SRichard Henderson /* None of the opcodes in the first group generate relocs, so we
406429b31a2SRichard Henderson aren't too concerned about them. */
407429b31a2SRichard Henderson OP_SYSOP = 0x00,
408429b31a2SRichard Henderson OP_MEMMNG = 0x01,
409429b31a2SRichard Henderson OP_ALU = 0x02,
410429b31a2SRichard Henderson OP_NDXMEM = 0x03,
411429b31a2SRichard Henderson OP_SPOP = 0x04,
412429b31a2SRichard Henderson OP_DIAG = 0x05,
413429b31a2SRichard Henderson OP_FMPYADD = 0x06,
414429b31a2SRichard Henderson OP_UNDEF07 = 0x07,
415429b31a2SRichard Henderson OP_COPRW = 0x09,
416429b31a2SRichard Henderson OP_COPRDW = 0x0b,
417429b31a2SRichard Henderson OP_COPR = 0x0c,
418429b31a2SRichard Henderson OP_FLOAT = 0x0e,
419429b31a2SRichard Henderson OP_PRDSPEC = 0x0f,
420429b31a2SRichard Henderson OP_UNDEF15 = 0x15,
421429b31a2SRichard Henderson OP_UNDEF1d = 0x1d,
422429b31a2SRichard Henderson OP_FMPYSUB = 0x26,
423429b31a2SRichard Henderson OP_FPFUSED = 0x2e,
424429b31a2SRichard Henderson OP_SHEXDP0 = 0x34,
425429b31a2SRichard Henderson OP_SHEXDP1 = 0x35,
426429b31a2SRichard Henderson OP_SHEXDP2 = 0x36,
427429b31a2SRichard Henderson OP_UNDEF37 = 0x37,
428429b31a2SRichard Henderson OP_SHEXDP3 = 0x3c,
429429b31a2SRichard Henderson OP_SHEXDP4 = 0x3d,
430429b31a2SRichard Henderson OP_MULTMED = 0x3e,
431429b31a2SRichard Henderson OP_UNDEF3f = 0x3f,
432429b31a2SRichard Henderson
433429b31a2SRichard Henderson OP_LDIL = 0x08,
434429b31a2SRichard Henderson OP_ADDIL = 0x0a,
435429b31a2SRichard Henderson
436429b31a2SRichard Henderson OP_LDO = 0x0d,
437429b31a2SRichard Henderson OP_LDB = 0x10,
438429b31a2SRichard Henderson OP_LDH = 0x11,
439429b31a2SRichard Henderson OP_LDW = 0x12,
440429b31a2SRichard Henderson OP_LDWM = 0x13,
441429b31a2SRichard Henderson OP_STB = 0x18,
442429b31a2SRichard Henderson OP_STH = 0x19,
443429b31a2SRichard Henderson OP_STW = 0x1a,
444429b31a2SRichard Henderson OP_STWM = 0x1b,
445429b31a2SRichard Henderson
446429b31a2SRichard Henderson OP_LDD = 0x14,
447429b31a2SRichard Henderson OP_STD = 0x1c,
448429b31a2SRichard Henderson
449429b31a2SRichard Henderson OP_FLDW = 0x16,
450429b31a2SRichard Henderson OP_LDWL = 0x17,
451429b31a2SRichard Henderson OP_FSTW = 0x1e,
452429b31a2SRichard Henderson OP_STWL = 0x1f,
453429b31a2SRichard Henderson
454429b31a2SRichard Henderson OP_COMBT = 0x20,
455429b31a2SRichard Henderson OP_COMIBT = 0x21,
456429b31a2SRichard Henderson OP_COMBF = 0x22,
457429b31a2SRichard Henderson OP_COMIBF = 0x23,
458429b31a2SRichard Henderson OP_CMPBDT = 0x27,
459429b31a2SRichard Henderson OP_ADDBT = 0x28,
460429b31a2SRichard Henderson OP_ADDIBT = 0x29,
461429b31a2SRichard Henderson OP_ADDBF = 0x2a,
462429b31a2SRichard Henderson OP_ADDIBF = 0x2b,
463429b31a2SRichard Henderson OP_CMPBDF = 0x2f,
464429b31a2SRichard Henderson OP_BVB = 0x30,
465429b31a2SRichard Henderson OP_BB = 0x31,
466429b31a2SRichard Henderson OP_MOVB = 0x32,
467429b31a2SRichard Henderson OP_MOVIB = 0x33,
468429b31a2SRichard Henderson OP_CMPIBD = 0x3b,
469429b31a2SRichard Henderson
470429b31a2SRichard Henderson OP_COMICLR = 0x24,
471429b31a2SRichard Henderson OP_SUBI = 0x25,
472429b31a2SRichard Henderson OP_ADDIT = 0x2c,
473429b31a2SRichard Henderson OP_ADDI = 0x2d,
474429b31a2SRichard Henderson
475429b31a2SRichard Henderson OP_BE = 0x38,
476429b31a2SRichard Henderson OP_BLE = 0x39,
477429b31a2SRichard Henderson OP_BL = 0x3a
478429b31a2SRichard Henderson };
479429b31a2SRichard Henderson
480429b31a2SRichard Henderson
481429b31a2SRichard Henderson /* Insert VALUE into INSN using R_FORMAT to determine exactly what
482429b31a2SRichard Henderson bits to change. */
483429b31a2SRichard Henderson
484429b31a2SRichard Henderson static inline int
hppa_rebuild_insn(int insn,int value,int r_format)485429b31a2SRichard Henderson hppa_rebuild_insn (int insn, int value, int r_format)
486429b31a2SRichard Henderson {
487429b31a2SRichard Henderson switch (r_format)
488429b31a2SRichard Henderson {
489429b31a2SRichard Henderson case 11:
490429b31a2SRichard Henderson return (insn & ~ 0x7ff) | low_sign_unext (value, 11);
491429b31a2SRichard Henderson
492429b31a2SRichard Henderson case 12:
493429b31a2SRichard Henderson return (insn & ~ 0x1ffd) | re_assemble_12 (value);
494429b31a2SRichard Henderson
495429b31a2SRichard Henderson
496429b31a2SRichard Henderson case 10:
497429b31a2SRichard Henderson return (insn & ~ 0x3ff1) | re_assemble_14 (value & -8);
498429b31a2SRichard Henderson
499429b31a2SRichard Henderson case -11:
500429b31a2SRichard Henderson return (insn & ~ 0x3ff9) | re_assemble_14 (value & -4);
501429b31a2SRichard Henderson
502429b31a2SRichard Henderson case 14:
503429b31a2SRichard Henderson return (insn & ~ 0x3fff) | re_assemble_14 (value);
504429b31a2SRichard Henderson
505429b31a2SRichard Henderson
506429b31a2SRichard Henderson case -10:
507429b31a2SRichard Henderson return (insn & ~ 0xfff1) | re_assemble_16 (value & -8);
508429b31a2SRichard Henderson
509429b31a2SRichard Henderson case -16:
510429b31a2SRichard Henderson return (insn & ~ 0xfff9) | re_assemble_16 (value & -4);
511429b31a2SRichard Henderson
512429b31a2SRichard Henderson case 16:
513429b31a2SRichard Henderson return (insn & ~ 0xffff) | re_assemble_16 (value);
514429b31a2SRichard Henderson
515429b31a2SRichard Henderson
516429b31a2SRichard Henderson case 17:
517429b31a2SRichard Henderson return (insn & ~ 0x1f1ffd) | re_assemble_17 (value);
518429b31a2SRichard Henderson
519429b31a2SRichard Henderson case 21:
520429b31a2SRichard Henderson return (insn & ~ 0x1fffff) | re_assemble_21 (value);
521429b31a2SRichard Henderson
522429b31a2SRichard Henderson case 22:
523429b31a2SRichard Henderson return (insn & ~ 0x3ff1ffd) | re_assemble_22 (value);
524429b31a2SRichard Henderson
525429b31a2SRichard Henderson case 32:
526429b31a2SRichard Henderson return value;
527429b31a2SRichard Henderson
528429b31a2SRichard Henderson default:
529429b31a2SRichard Henderson abort ();
530429b31a2SRichard Henderson }
531429b31a2SRichard Henderson return insn;
532429b31a2SRichard Henderson }
533429b31a2SRichard Henderson
534429b31a2SRichard Henderson #endif /* _LIBHPPA_H */
535429b31a2SRichard Henderson /* Table of opcodes for the PA-RISC.
536429b31a2SRichard Henderson Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
537429b31a2SRichard Henderson 2001, 2002, 2003, 2004, 2005
538429b31a2SRichard Henderson Free Software Foundation, Inc.
539429b31a2SRichard Henderson
540429b31a2SRichard Henderson Contributed by the Center for Software Science at the
541429b31a2SRichard Henderson University of Utah (pa-gdb-bugs@cs.utah.edu).
542429b31a2SRichard Henderson
543429b31a2SRichard Henderson This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler.
544429b31a2SRichard Henderson
545429b31a2SRichard Henderson GAS/GDB is free software; you can redistribute it and/or modify
546429b31a2SRichard Henderson it under the terms of the GNU General Public License as published by
547429b31a2SRichard Henderson the Free Software Foundation; either version 1, or (at your option)
548429b31a2SRichard Henderson any later version.
549429b31a2SRichard Henderson
550429b31a2SRichard Henderson GAS/GDB is distributed in the hope that it will be useful,
551429b31a2SRichard Henderson but WITHOUT ANY WARRANTY; without even the implied warranty of
552429b31a2SRichard Henderson MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
553429b31a2SRichard Henderson GNU General Public License for more details.
554429b31a2SRichard Henderson
555429b31a2SRichard Henderson You should have received a copy of the GNU General Public License
556429b31a2SRichard Henderson along with GAS or GDB; see the file COPYING.
557429b31a2SRichard Henderson If not, see <http://www.gnu.org/licenses/>. */
558429b31a2SRichard Henderson
559429b31a2SRichard Henderson #if !defined(__STDC__) && !defined(const)
560429b31a2SRichard Henderson #define const
561429b31a2SRichard Henderson #endif
562429b31a2SRichard Henderson
563429b31a2SRichard Henderson /*
564429b31a2SRichard Henderson * Structure of an opcode table entry.
565429b31a2SRichard Henderson */
566429b31a2SRichard Henderson
567429b31a2SRichard Henderson /* There are two kinds of delay slot nullification: normal which is
568429b31a2SRichard Henderson * controlled by the nullification bit, and conditional, which depends
569429b31a2SRichard Henderson * on the direction of the branch and its success or failure.
570429b31a2SRichard Henderson *
571429b31a2SRichard Henderson * NONE is unfortunately #defined in the hiux system include files.
572429b31a2SRichard Henderson * #undef it away.
573429b31a2SRichard Henderson */
574429b31a2SRichard Henderson #undef NONE
575429b31a2SRichard Henderson struct pa_opcode
576429b31a2SRichard Henderson {
577429b31a2SRichard Henderson const char *name;
578429b31a2SRichard Henderson unsigned long int match; /* Bits that must be set... */
579429b31a2SRichard Henderson unsigned long int mask; /* ... in these bits. */
580429b31a2SRichard Henderson const char *args;
581429b31a2SRichard Henderson enum pa_arch arch;
582429b31a2SRichard Henderson char flags;
583429b31a2SRichard Henderson };
584429b31a2SRichard Henderson
585429b31a2SRichard Henderson /* Enables strict matching. Opcodes with match errors are skipped
586429b31a2SRichard Henderson when this bit is set. */
587429b31a2SRichard Henderson #define FLAG_STRICT 0x1
588429b31a2SRichard Henderson
589429b31a2SRichard Henderson /*
590429b31a2SRichard Henderson All hppa opcodes are 32 bits.
591429b31a2SRichard Henderson
592429b31a2SRichard Henderson The match component is a mask saying which bits must match a
593429b31a2SRichard Henderson particular opcode in order for an instruction to be an instance
594429b31a2SRichard Henderson of that opcode.
595429b31a2SRichard Henderson
596429b31a2SRichard Henderson The args component is a string containing one character for each operand of
597429b31a2SRichard Henderson the instruction. Characters used as a prefix allow any second character to
598429b31a2SRichard Henderson be used without conflicting with the main operand characters.
599429b31a2SRichard Henderson
600429b31a2SRichard Henderson Bit positions in this description follow HP usage of lsb = 31,
601429b31a2SRichard Henderson "at" is lsb of field.
602429b31a2SRichard Henderson
603429b31a2SRichard Henderson In the args field, the following characters must match exactly:
604429b31a2SRichard Henderson
605429b31a2SRichard Henderson '+,() '
606429b31a2SRichard Henderson
607429b31a2SRichard Henderson In the args field, the following characters are unused:
608429b31a2SRichard Henderson
609429b31a2SRichard Henderson ' " - / 34 6789:; '
610429b31a2SRichard Henderson '@ C M [\] '
611429b31a2SRichard Henderson '` e g } '
612429b31a2SRichard Henderson
613429b31a2SRichard Henderson Here are all the characters:
614429b31a2SRichard Henderson
615429b31a2SRichard Henderson ' !"#$%&'()*+-,./0123456789:;<=>?'
616429b31a2SRichard Henderson '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'
617429b31a2SRichard Henderson '`abcdefghijklmnopqrstuvwxyz{|}~ '
618429b31a2SRichard Henderson
619429b31a2SRichard Henderson Kinds of operands:
620429b31a2SRichard Henderson x integer register field at 15.
621429b31a2SRichard Henderson b integer register field at 10.
622429b31a2SRichard Henderson t integer register field at 31.
623429b31a2SRichard Henderson a integer register field at 10 and 15 (for PERMH)
624429b31a2SRichard Henderson 5 5 bit immediate at 15.
625429b31a2SRichard Henderson s 2 bit space specifier at 17.
626429b31a2SRichard Henderson S 3 bit space specifier at 18.
627429b31a2SRichard Henderson V 5 bit immediate value at 31
628429b31a2SRichard Henderson i 11 bit immediate value at 31
629429b31a2SRichard Henderson j 14 bit immediate value at 31
630429b31a2SRichard Henderson k 21 bit immediate value at 31
631429b31a2SRichard Henderson l 16 bit immediate value at 31 (wide mode only, unusual encoding).
632429b31a2SRichard Henderson n nullification for branch instructions
633429b31a2SRichard Henderson N nullification for spop and copr instructions
634429b31a2SRichard Henderson w 12 bit branch displacement
635429b31a2SRichard Henderson W 17 bit branch displacement (PC relative)
636429b31a2SRichard Henderson X 22 bit branch displacement (PC relative)
637429b31a2SRichard Henderson z 17 bit branch displacement (just a number, not an address)
638429b31a2SRichard Henderson
639429b31a2SRichard Henderson Also these:
640429b31a2SRichard Henderson
641429b31a2SRichard Henderson . 2 bit shift amount at 25
642429b31a2SRichard Henderson * 4 bit shift amount at 25
643429b31a2SRichard Henderson p 5 bit shift count at 26 (to support the SHD instruction) encoded as
644429b31a2SRichard Henderson 31-p
645429b31a2SRichard Henderson ~ 6 bit shift count at 20,22:26 encoded as 63-~.
646429b31a2SRichard Henderson P 5 bit bit position at 26
647429b31a2SRichard Henderson q 6 bit bit position at 20,22:26
648429b31a2SRichard Henderson T 5 bit field length at 31 (encoded as 32-T)
649429b31a2SRichard Henderson % 6 bit field length at 23,27:31 (variable extract/deposit)
650429b31a2SRichard Henderson | 6 bit field length at 19,27:31 (fixed extract/deposit)
651429b31a2SRichard Henderson A 13 bit immediate at 18 (to support the BREAK instruction)
652429b31a2SRichard Henderson ^ like b, but describes a control register
653429b31a2SRichard Henderson ! sar (cr11) register
654429b31a2SRichard Henderson D 26 bit immediate at 31 (to support the DIAG instruction)
655429b31a2SRichard Henderson $ 9 bit immediate at 28 (to support POPBTS)
656429b31a2SRichard Henderson
657429b31a2SRichard Henderson v 3 bit Special Function Unit identifier at 25
658429b31a2SRichard Henderson O 20 bit Special Function Unit operation split between 15 bits at 20
659429b31a2SRichard Henderson and 5 bits at 31
660429b31a2SRichard Henderson o 15 bit Special Function Unit operation at 20
661429b31a2SRichard Henderson 2 22 bit Special Function Unit operation split between 17 bits at 20
662429b31a2SRichard Henderson and 5 bits at 31
663429b31a2SRichard Henderson 1 15 bit Special Function Unit operation split between 10 bits at 20
664429b31a2SRichard Henderson and 5 bits at 31
665429b31a2SRichard Henderson 0 10 bit Special Function Unit operation split between 5 bits at 20
666429b31a2SRichard Henderson and 5 bits at 31
667429b31a2SRichard Henderson u 3 bit coprocessor unit identifier at 25
668429b31a2SRichard Henderson F Source Floating Point Operand Format Completer encoded 2 bits at 20
669429b31a2SRichard Henderson I Source Floating Point Operand Format Completer encoded 1 bits at 20
670429b31a2SRichard Henderson (for 0xe format FP instructions)
671429b31a2SRichard Henderson G Destination Floating Point Operand Format Completer encoded 2 bits at 18
672429b31a2SRichard Henderson H Floating Point Operand Format at 26 for 'fmpyadd' and 'fmpysub'
673429b31a2SRichard Henderson (very similar to 'F')
674429b31a2SRichard Henderson
675429b31a2SRichard Henderson r 5 bit immediate value at 31 (for the break instruction)
676429b31a2SRichard Henderson (very similar to V above, except the value is unsigned instead of
677429b31a2SRichard Henderson low_sign_ext)
678429b31a2SRichard Henderson R 5 bit immediate value at 15 (for the ssm, rsm, probei instructions)
679429b31a2SRichard Henderson (same as r above, except the value is in a different location)
680429b31a2SRichard Henderson U 10 bit immediate value at 15 (for SSM, RSM on pa2.0)
681429b31a2SRichard Henderson Q 5 bit immediate value at 10 (a bit position specified in
682429b31a2SRichard Henderson the bb instruction. It's the same as r above, except the
683429b31a2SRichard Henderson value is in a different location)
684429b31a2SRichard Henderson B 5 bit immediate value at 10 (a bit position specified in
685429b31a2SRichard Henderson the bb instruction. Similar to Q, but 64 bit handling is
686429b31a2SRichard Henderson different.
687429b31a2SRichard Henderson Z %r1 -- implicit target of addil instruction.
688429b31a2SRichard Henderson L ,%r2 completer for new syntax branch
689429b31a2SRichard Henderson { Source format completer for fcnv
690429b31a2SRichard Henderson _ Destination format completer for fcnv
691429b31a2SRichard Henderson h cbit for fcmp
692429b31a2SRichard Henderson = gfx tests for ftest
693429b31a2SRichard Henderson d 14 bit offset for single precision FP long load/store.
694429b31a2SRichard Henderson # 14 bit offset for double precision FP load long/store.
695429b31a2SRichard Henderson J Yet another 14 bit offset for load/store with ma,mb completers.
696429b31a2SRichard Henderson K Yet another 14 bit offset for load/store with ma,mb completers.
697429b31a2SRichard Henderson y 16 bit offset for word aligned load/store (PA2.0 wide).
698429b31a2SRichard Henderson & 16 bit offset for dword aligned load/store (PA2.0 wide).
699429b31a2SRichard Henderson < 16 bit offset for load/store with ma,mb completers (PA2.0 wide).
700429b31a2SRichard Henderson > 16 bit offset for load/store with ma,mb completers (PA2.0 wide).
701429b31a2SRichard Henderson Y %sr0,%r31 -- implicit target of be,l instruction.
702429b31a2SRichard Henderson @ implicit immediate value of 0
703429b31a2SRichard Henderson
704429b31a2SRichard Henderson Completer operands all have 'c' as the prefix:
705429b31a2SRichard Henderson
706429b31a2SRichard Henderson cx indexed load and store completer.
707429b31a2SRichard Henderson cX indexed load and store completer. Like cx, but emits a space
708429b31a2SRichard Henderson after in disassembler.
709429b31a2SRichard Henderson cm short load and store completer.
710429b31a2SRichard Henderson cM short load and store completer. Like cm, but emits a space
711429b31a2SRichard Henderson after in disassembler.
712429b31a2SRichard Henderson cq long load and store completer (like cm, but inserted into a
713429b31a2SRichard Henderson different location in the target instruction).
714429b31a2SRichard Henderson cs store bytes short completer.
715429b31a2SRichard Henderson cA store bytes short completer. Like cs, but emits a space
716429b31a2SRichard Henderson after in disassembler.
717429b31a2SRichard Henderson ce long load/store completer for LDW/STW with a different encoding
718429b31a2SRichard Henderson than the others
719429b31a2SRichard Henderson cc load cache control hint
720429b31a2SRichard Henderson cd load and clear cache control hint
721429b31a2SRichard Henderson cC store cache control hint
722429b31a2SRichard Henderson co ordered access
723429b31a2SRichard Henderson
724429b31a2SRichard Henderson cp branch link and push completer
725429b31a2SRichard Henderson cP branch pop completer
726429b31a2SRichard Henderson cl branch link completer
727429b31a2SRichard Henderson cg branch gate completer
728429b31a2SRichard Henderson
729429b31a2SRichard Henderson cw read/write completer for PROBE
730429b31a2SRichard Henderson cW wide completer for MFCTL
731429b31a2SRichard Henderson cL local processor completer for cache control
732429b31a2SRichard Henderson cZ System Control Completer (to support LPA, LHA, etc.)
733429b31a2SRichard Henderson
734429b31a2SRichard Henderson ci correction completer for DCOR
735429b31a2SRichard Henderson ca add completer
736429b31a2SRichard Henderson cy 32 bit add carry completer
737429b31a2SRichard Henderson cY 64 bit add carry completer
738429b31a2SRichard Henderson cv signed overflow trap completer
739429b31a2SRichard Henderson ct trap on condition completer for ADDI, SUB
740429b31a2SRichard Henderson cT trap on condition completer for UADDCM
741429b31a2SRichard Henderson cb 32 bit borrow completer for SUB
742429b31a2SRichard Henderson cB 64 bit borrow completer for SUB
743429b31a2SRichard Henderson
744429b31a2SRichard Henderson ch left/right half completer
745429b31a2SRichard Henderson cH signed/unsigned saturation completer
746429b31a2SRichard Henderson cS signed/unsigned completer at 21
747429b31a2SRichard Henderson cz zero/sign extension completer.
748429b31a2SRichard Henderson c* permutation completer
749429b31a2SRichard Henderson
750429b31a2SRichard Henderson Condition operands all have '?' as the prefix:
751429b31a2SRichard Henderson
752429b31a2SRichard Henderson ?f Floating point compare conditions (encoded as 5 bits at 31)
753429b31a2SRichard Henderson
754429b31a2SRichard Henderson ?a add conditions
755429b31a2SRichard Henderson ?A 64 bit add conditions
756429b31a2SRichard Henderson ?@ add branch conditions followed by nullify
757429b31a2SRichard Henderson ?d non-negated add branch conditions
758429b31a2SRichard Henderson ?D negated add branch conditions
759429b31a2SRichard Henderson ?w wide mode non-negated add branch conditions
760429b31a2SRichard Henderson ?W wide mode negated add branch conditions
761429b31a2SRichard Henderson
762429b31a2SRichard Henderson ?s compare/subtract conditions
763429b31a2SRichard Henderson ?S 64 bit compare/subtract conditions
764429b31a2SRichard Henderson ?t non-negated compare and branch conditions
765429b31a2SRichard Henderson ?n 32 bit compare and branch conditions followed by nullify
766429b31a2SRichard Henderson ?N 64 bit compare and branch conditions followed by nullify
767429b31a2SRichard Henderson ?Q 64 bit compare and branch conditions for CMPIB instruction
768429b31a2SRichard Henderson
769429b31a2SRichard Henderson ?l logical conditions
770429b31a2SRichard Henderson ?L 64 bit logical conditions
771429b31a2SRichard Henderson
772429b31a2SRichard Henderson ?b branch on bit conditions
773429b31a2SRichard Henderson ?B 64 bit branch on bit conditions
774429b31a2SRichard Henderson
775429b31a2SRichard Henderson ?x shift/extract/deposit conditions
776429b31a2SRichard Henderson ?X 64 bit shift/extract/deposit conditions
777429b31a2SRichard Henderson ?y shift/extract/deposit conditions followed by nullify for conditional
778429b31a2SRichard Henderson branches
779429b31a2SRichard Henderson
780429b31a2SRichard Henderson ?u unit conditions
781429b31a2SRichard Henderson ?U 64 bit unit conditions
782429b31a2SRichard Henderson
783429b31a2SRichard Henderson Floating point registers all have 'f' as a prefix:
784429b31a2SRichard Henderson
785429b31a2SRichard Henderson ft target register at 31
786429b31a2SRichard Henderson fT target register with L/R halves at 31
787429b31a2SRichard Henderson fa operand 1 register at 10
788429b31a2SRichard Henderson fA operand 1 register with L/R halves at 10
789429b31a2SRichard Henderson fX Same as fA, except prints a space before register during disasm
790429b31a2SRichard Henderson fb operand 2 register at 15
791429b31a2SRichard Henderson fB operand 2 register with L/R halves at 15
792429b31a2SRichard Henderson fC operand 3 register with L/R halves at 16:18,21:23
793429b31a2SRichard Henderson fe Like fT, but encoding is different.
794429b31a2SRichard Henderson fE Same as fe, except prints a space before register during disasm.
795429b31a2SRichard Henderson fx target register at 15 (only for PA 2.0 long format FLDD/FSTD).
796429b31a2SRichard Henderson
797429b31a2SRichard Henderson Float registers for fmpyadd and fmpysub:
798429b31a2SRichard Henderson
799429b31a2SRichard Henderson fi mult operand 1 register at 10
800429b31a2SRichard Henderson fj mult operand 2 register at 15
801429b31a2SRichard Henderson fk mult target register at 20
802429b31a2SRichard Henderson fl add/sub operand register at 25
803429b31a2SRichard Henderson fm add/sub target register at 31
804429b31a2SRichard Henderson
805429b31a2SRichard Henderson */
806429b31a2SRichard Henderson
807429b31a2SRichard Henderson
808429b31a2SRichard Henderson #if 0
809429b31a2SRichard Henderson /* List of characters not to put a space after. Note that
810429b31a2SRichard Henderson "," is included, as the "spopN" operations use literal
811429b31a2SRichard Henderson commas in their completer sections. */
812429b31a2SRichard Henderson static const char *const completer_chars = ",CcY<>?!@+&U~FfGHINnOoZMadu|/=0123%e$m}";
813429b31a2SRichard Henderson #endif
814429b31a2SRichard Henderson
815429b31a2SRichard Henderson /* The order of the opcodes in this table is significant:
816429b31a2SRichard Henderson
817429b31a2SRichard Henderson * The assembler requires that all instances of the same mnemonic be
818429b31a2SRichard Henderson consecutive. If they aren't, the assembler will bomb at runtime.
819429b31a2SRichard Henderson
820429b31a2SRichard Henderson * Immediate fields use pa_get_absolute_expression to parse the
821429b31a2SRichard Henderson string. It will generate a "bad expression" error if passed
822429b31a2SRichard Henderson a register name. Thus, register index variants of an opcode
823429b31a2SRichard Henderson need to precede immediate variants.
824429b31a2SRichard Henderson
825429b31a2SRichard Henderson * The disassembler does not care about the order of the opcodes
826429b31a2SRichard Henderson except in cases where implicit addressing is used.
827429b31a2SRichard Henderson
828429b31a2SRichard Henderson Here are the rules for ordering the opcodes of a mnemonic:
829429b31a2SRichard Henderson
830429b31a2SRichard Henderson 1) Opcodes with FLAG_STRICT should precede opcodes without
831429b31a2SRichard Henderson FLAG_STRICT.
832429b31a2SRichard Henderson
833429b31a2SRichard Henderson 2) Opcodes with FLAG_STRICT should be ordered as follows:
834429b31a2SRichard Henderson register index opcodes, short immediate opcodes, and finally
835429b31a2SRichard Henderson long immediate opcodes. When both pa10 and pa11 variants
836429b31a2SRichard Henderson of the same opcode are available, the pa10 opcode should
837429b31a2SRichard Henderson come first for correct architectural promotion.
838429b31a2SRichard Henderson
839429b31a2SRichard Henderson 3) When implicit addressing is available for an opcode, the
840429b31a2SRichard Henderson implicit opcode should precede the explicit opcode.
841429b31a2SRichard Henderson
842429b31a2SRichard Henderson 4) Opcodes without FLAG_STRICT should be ordered as follows:
843429b31a2SRichard Henderson register index opcodes, long immediate opcodes, and finally
844429b31a2SRichard Henderson short immediate opcodes. */
845429b31a2SRichard Henderson
846429b31a2SRichard Henderson static const struct pa_opcode pa_opcodes[] =
847429b31a2SRichard Henderson {
848429b31a2SRichard Henderson
849429b31a2SRichard Henderson /* Pseudo-instructions. */
850429b31a2SRichard Henderson
851429b31a2SRichard Henderson { "ldi", 0x34000000, 0xffe00000, "l,x", pa20w, 0},/* ldo val(r0),r */
852429b31a2SRichard Henderson { "ldi", 0x34000000, 0xffe0c000, "j,x", pa10, 0},/* ldo val(r0),r */
853429b31a2SRichard Henderson
854429b31a2SRichard Henderson { "cmpib", 0xec000000, 0xfc000000, "?Qn5,b,w", pa20, FLAG_STRICT},
855429b31a2SRichard Henderson { "cmpib", 0x84000000, 0xf4000000, "?nn5,b,w", pa10, FLAG_STRICT},
856429b31a2SRichard Henderson { "comib", 0x84000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/
857429b31a2SRichard Henderson /* This entry is for the disassembler only. It will never be used by
858429b31a2SRichard Henderson assembler. */
859429b31a2SRichard Henderson { "comib", 0x8c000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/
860429b31a2SRichard Henderson { "cmpb", 0x9c000000, 0xdc000000, "?Nnx,b,w", pa20, FLAG_STRICT},
861429b31a2SRichard Henderson { "cmpb", 0x80000000, 0xf4000000, "?nnx,b,w", pa10, FLAG_STRICT},
862429b31a2SRichard Henderson { "comb", 0x80000000, 0xfc000000, "?nnx,b,w", pa10, 0}, /* comb{tf} */
863429b31a2SRichard Henderson /* This entry is for the disassembler only. It will never be used by
864429b31a2SRichard Henderson assembler. */
865429b31a2SRichard Henderson { "comb", 0x88000000, 0xfc000000, "?nnx,b,w", pa10, 0}, /* comb{tf} */
866429b31a2SRichard Henderson { "addb", 0xa0000000, 0xf4000000, "?Wnx,b,w", pa20w, FLAG_STRICT},
867429b31a2SRichard Henderson { "addb", 0xa0000000, 0xfc000000, "?@nx,b,w", pa10, 0}, /* addb{tf} */
868429b31a2SRichard Henderson /* This entry is for the disassembler only. It will never be used by
869429b31a2SRichard Henderson assembler. */
870429b31a2SRichard Henderson { "addb", 0xa8000000, 0xfc000000, "?@nx,b,w", pa10, 0},
871429b31a2SRichard Henderson { "addib", 0xa4000000, 0xf4000000, "?Wn5,b,w", pa20w, FLAG_STRICT},
872429b31a2SRichard Henderson { "addib", 0xa4000000, 0xfc000000, "?@n5,b,w", pa10, 0}, /* addib{tf}*/
873429b31a2SRichard Henderson /* This entry is for the disassembler only. It will never be used by
874429b31a2SRichard Henderson assembler. */
875429b31a2SRichard Henderson { "addib", 0xac000000, 0xfc000000, "?@n5,b,w", pa10, 0}, /* addib{tf}*/
876429b31a2SRichard Henderson { "nop", 0x08000240, 0xffffffff, "", pa10, 0}, /* or 0,0,0 */
877429b31a2SRichard Henderson { "copy", 0x08000240, 0xffe0ffe0, "x,t", pa10, 0}, /* or r,0,t */
878429b31a2SRichard Henderson { "mtsar", 0x01601840, 0xffe0ffff, "x", pa10, 0}, /* mtctl r,cr11 */
879429b31a2SRichard Henderson
880429b31a2SRichard Henderson /* Loads and Stores for integer registers. */
881429b31a2SRichard Henderson
882429b31a2SRichard Henderson { "ldd", 0x0c0000c0, 0xfc00d3c0, "cxccx(b),t", pa20, FLAG_STRICT},
883429b31a2SRichard Henderson { "ldd", 0x0c0000c0, 0xfc0013c0, "cxccx(s,b),t", pa20, FLAG_STRICT},
884429b31a2SRichard Henderson { "ldd", 0x0c0010e0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT},
885429b31a2SRichard Henderson { "ldd", 0x0c0010e0, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT},
886429b31a2SRichard Henderson { "ldd", 0x0c0010c0, 0xfc00d3c0, "cmcc5(b),t", pa20, FLAG_STRICT},
887429b31a2SRichard Henderson { "ldd", 0x0c0010c0, 0xfc0013c0, "cmcc5(s,b),t", pa20, FLAG_STRICT},
888429b31a2SRichard Henderson { "ldd", 0x50000000, 0xfc000002, "cq&(b),x", pa20w, FLAG_STRICT},
889429b31a2SRichard Henderson { "ldd", 0x50000000, 0xfc00c002, "cq#(b),x", pa20, FLAG_STRICT},
890429b31a2SRichard Henderson { "ldd", 0x50000000, 0xfc000002, "cq#(s,b),x", pa20, FLAG_STRICT},
891429b31a2SRichard Henderson { "ldw", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT},
892429b31a2SRichard Henderson { "ldw", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT},
893429b31a2SRichard Henderson { "ldw", 0x0c000080, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT},
894429b31a2SRichard Henderson { "ldw", 0x0c000080, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT},
895429b31a2SRichard Henderson { "ldw", 0x0c0010a0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT},
896429b31a2SRichard Henderson { "ldw", 0x0c0010a0, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT},
897429b31a2SRichard Henderson { "ldw", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT},
898429b31a2SRichard Henderson { "ldw", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT},
899429b31a2SRichard Henderson { "ldw", 0x0c001080, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT},
900429b31a2SRichard Henderson { "ldw", 0x0c001080, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT},
901429b31a2SRichard Henderson { "ldw", 0x4c000000, 0xfc000000, "ce<(b),x", pa20w, FLAG_STRICT},
902429b31a2SRichard Henderson { "ldw", 0x5c000004, 0xfc000006, "ce>(b),x", pa20w, FLAG_STRICT},
903429b31a2SRichard Henderson { "ldw", 0x48000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT},
904429b31a2SRichard Henderson { "ldw", 0x5c000004, 0xfc00c006, "ceK(b),x", pa20, FLAG_STRICT},
905429b31a2SRichard Henderson { "ldw", 0x5c000004, 0xfc000006, "ceK(s,b),x", pa20, FLAG_STRICT},
906429b31a2SRichard Henderson { "ldw", 0x4c000000, 0xfc00c000, "ceJ(b),x", pa10, FLAG_STRICT},
907429b31a2SRichard Henderson { "ldw", 0x4c000000, 0xfc000000, "ceJ(s,b),x", pa10, FLAG_STRICT},
908429b31a2SRichard Henderson { "ldw", 0x48000000, 0xfc00c000, "j(b),x", pa10, 0},
909429b31a2SRichard Henderson { "ldw", 0x48000000, 0xfc000000, "j(s,b),x", pa10, 0},
910429b31a2SRichard Henderson { "ldh", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT},
911429b31a2SRichard Henderson { "ldh", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT},
912429b31a2SRichard Henderson { "ldh", 0x0c000040, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT},
913429b31a2SRichard Henderson { "ldh", 0x0c000040, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT},
914429b31a2SRichard Henderson { "ldh", 0x0c001060, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT},
915429b31a2SRichard Henderson { "ldh", 0x0c001060, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT},
916429b31a2SRichard Henderson { "ldh", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT},
917429b31a2SRichard Henderson { "ldh", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT},
918429b31a2SRichard Henderson { "ldh", 0x0c001040, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT},
919429b31a2SRichard Henderson { "ldh", 0x0c001040, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT},
920429b31a2SRichard Henderson { "ldh", 0x44000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT},
921429b31a2SRichard Henderson { "ldh", 0x44000000, 0xfc00c000, "j(b),x", pa10, 0},
922429b31a2SRichard Henderson { "ldh", 0x44000000, 0xfc000000, "j(s,b),x", pa10, 0},
923429b31a2SRichard Henderson { "ldb", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT},
924429b31a2SRichard Henderson { "ldb", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT},
925429b31a2SRichard Henderson { "ldb", 0x0c000000, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT},
926429b31a2SRichard Henderson { "ldb", 0x0c000000, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT},
927429b31a2SRichard Henderson { "ldb", 0x0c001020, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT},
928429b31a2SRichard Henderson { "ldb", 0x0c001020, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT},
929429b31a2SRichard Henderson { "ldb", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT},
930429b31a2SRichard Henderson { "ldb", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT},
931429b31a2SRichard Henderson { "ldb", 0x0c001000, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT},
932429b31a2SRichard Henderson { "ldb", 0x0c001000, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT},
933429b31a2SRichard Henderson { "ldb", 0x40000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT},
934429b31a2SRichard Henderson { "ldb", 0x40000000, 0xfc00c000, "j(b),x", pa10, 0},
935429b31a2SRichard Henderson { "ldb", 0x40000000, 0xfc000000, "j(s,b),x", pa10, 0},
936429b31a2SRichard Henderson { "std", 0x0c0012e0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT},
937429b31a2SRichard Henderson { "std", 0x0c0012e0, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT},
938429b31a2SRichard Henderson { "std", 0x0c0012c0, 0xfc00d3c0, "cmcCx,V(b)", pa20, FLAG_STRICT},
939429b31a2SRichard Henderson { "std", 0x0c0012c0, 0xfc0013c0, "cmcCx,V(s,b)", pa20, FLAG_STRICT},
940429b31a2SRichard Henderson { "std", 0x70000000, 0xfc000002, "cqx,&(b)", pa20w, FLAG_STRICT},
941429b31a2SRichard Henderson { "std", 0x70000000, 0xfc00c002, "cqx,#(b)", pa20, FLAG_STRICT},
942429b31a2SRichard Henderson { "std", 0x70000000, 0xfc000002, "cqx,#(s,b)", pa20, FLAG_STRICT},
943429b31a2SRichard Henderson { "stw", 0x0c0012a0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT},
944429b31a2SRichard Henderson { "stw", 0x0c0012a0, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT},
945429b31a2SRichard Henderson { "stw", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT},
946429b31a2SRichard Henderson { "stw", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT},
947429b31a2SRichard Henderson { "stw", 0x0c001280, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT},
948429b31a2SRichard Henderson { "stw", 0x0c001280, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT},
949429b31a2SRichard Henderson { "stw", 0x6c000000, 0xfc000000, "cex,<(b)", pa20w, FLAG_STRICT},
950429b31a2SRichard Henderson { "stw", 0x7c000004, 0xfc000006, "cex,>(b)", pa20w, FLAG_STRICT},
951429b31a2SRichard Henderson { "stw", 0x68000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT},
952429b31a2SRichard Henderson { "stw", 0x7c000004, 0xfc00c006, "cex,K(b)", pa20, FLAG_STRICT},
953429b31a2SRichard Henderson { "stw", 0x7c000004, 0xfc000006, "cex,K(s,b)", pa20, FLAG_STRICT},
954429b31a2SRichard Henderson { "stw", 0x6c000000, 0xfc00c000, "cex,J(b)", pa10, FLAG_STRICT},
955429b31a2SRichard Henderson { "stw", 0x6c000000, 0xfc000000, "cex,J(s,b)", pa10, FLAG_STRICT},
956429b31a2SRichard Henderson { "stw", 0x68000000, 0xfc00c000, "x,j(b)", pa10, 0},
957429b31a2SRichard Henderson { "stw", 0x68000000, 0xfc000000, "x,j(s,b)", pa10, 0},
958429b31a2SRichard Henderson { "sth", 0x0c001260, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT},
959429b31a2SRichard Henderson { "sth", 0x0c001260, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT},
960429b31a2SRichard Henderson { "sth", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT},
961429b31a2SRichard Henderson { "sth", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT},
962429b31a2SRichard Henderson { "sth", 0x0c001240, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT},
963429b31a2SRichard Henderson { "sth", 0x0c001240, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT},
964429b31a2SRichard Henderson { "sth", 0x64000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT},
965429b31a2SRichard Henderson { "sth", 0x64000000, 0xfc00c000, "x,j(b)", pa10, 0},
966429b31a2SRichard Henderson { "sth", 0x64000000, 0xfc000000, "x,j(s,b)", pa10, 0},
967429b31a2SRichard Henderson { "stb", 0x0c001220, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT},
968429b31a2SRichard Henderson { "stb", 0x0c001220, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT},
969429b31a2SRichard Henderson { "stb", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT},
970429b31a2SRichard Henderson { "stb", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT},
971429b31a2SRichard Henderson { "stb", 0x0c001200, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT},
972429b31a2SRichard Henderson { "stb", 0x0c001200, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT},
973429b31a2SRichard Henderson { "stb", 0x60000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT},
974429b31a2SRichard Henderson { "stb", 0x60000000, 0xfc00c000, "x,j(b)", pa10, 0},
975429b31a2SRichard Henderson { "stb", 0x60000000, 0xfc000000, "x,j(s,b)", pa10, 0},
976429b31a2SRichard Henderson { "ldwm", 0x4c000000, 0xfc00c000, "j(b),x", pa10, 0},
977429b31a2SRichard Henderson { "ldwm", 0x4c000000, 0xfc000000, "j(s,b),x", pa10, 0},
978429b31a2SRichard Henderson { "stwm", 0x6c000000, 0xfc00c000, "x,j(b)", pa10, 0},
979429b31a2SRichard Henderson { "stwm", 0x6c000000, 0xfc000000, "x,j(s,b)", pa10, 0},
980429b31a2SRichard Henderson { "ldwx", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT},
981429b31a2SRichard Henderson { "ldwx", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT},
982429b31a2SRichard Henderson { "ldwx", 0x0c000080, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT},
983429b31a2SRichard Henderson { "ldwx", 0x0c000080, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT},
984429b31a2SRichard Henderson { "ldwx", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, 0},
985429b31a2SRichard Henderson { "ldwx", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, 0},
986429b31a2SRichard Henderson { "ldhx", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT},
987429b31a2SRichard Henderson { "ldhx", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT},
988429b31a2SRichard Henderson { "ldhx", 0x0c000040, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT},
989429b31a2SRichard Henderson { "ldhx", 0x0c000040, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT},
990429b31a2SRichard Henderson { "ldhx", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, 0},
991429b31a2SRichard Henderson { "ldhx", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, 0},
992429b31a2SRichard Henderson { "ldbx", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT},
993429b31a2SRichard Henderson { "ldbx", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT},
994429b31a2SRichard Henderson { "ldbx", 0x0c000000, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT},
995429b31a2SRichard Henderson { "ldbx", 0x0c000000, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT},
996429b31a2SRichard Henderson { "ldbx", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, 0},
997429b31a2SRichard Henderson { "ldbx", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, 0},
998429b31a2SRichard Henderson { "ldwa", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT},
999429b31a2SRichard Henderson { "ldwa", 0x0c000180, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT},
1000429b31a2SRichard Henderson { "ldwa", 0x0c0011a0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT},
1001429b31a2SRichard Henderson { "ldwa", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT},
1002429b31a2SRichard Henderson { "ldwa", 0x0c001180, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT},
1003429b31a2SRichard Henderson { "ldcw", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT},
1004429b31a2SRichard Henderson { "ldcw", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT},
1005429b31a2SRichard Henderson { "ldcw", 0x0c0001c0, 0xfc00d3c0, "cxcdx(b),t", pa11, FLAG_STRICT},
1006429b31a2SRichard Henderson { "ldcw", 0x0c0001c0, 0xfc0013c0, "cxcdx(s,b),t", pa11, FLAG_STRICT},
1007429b31a2SRichard Henderson { "ldcw", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT},
1008429b31a2SRichard Henderson { "ldcw", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT},
1009429b31a2SRichard Henderson { "ldcw", 0x0c0011c0, 0xfc00d3c0, "cmcd5(b),t", pa11, FLAG_STRICT},
1010429b31a2SRichard Henderson { "ldcw", 0x0c0011c0, 0xfc0013c0, "cmcd5(s,b),t", pa11, FLAG_STRICT},
1011429b31a2SRichard Henderson { "stwa", 0x0c0013a0, 0xfc00d3ff, "cocCx,@(b)", pa20, FLAG_STRICT},
1012429b31a2SRichard Henderson { "stwa", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT},
1013429b31a2SRichard Henderson { "stwa", 0x0c001380, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT},
1014429b31a2SRichard Henderson { "stby", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, FLAG_STRICT},
1015429b31a2SRichard Henderson { "stby", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, FLAG_STRICT},
1016429b31a2SRichard Henderson { "stby", 0x0c001300, 0xfc00d3c0, "cscCx,V(b)", pa11, FLAG_STRICT},
1017429b31a2SRichard Henderson { "stby", 0x0c001300, 0xfc0013c0, "cscCx,V(s,b)", pa11, FLAG_STRICT},
1018429b31a2SRichard Henderson { "ldda", 0x0c000100, 0xfc00d3c0, "cxccx(b),t", pa20, FLAG_STRICT},
1019429b31a2SRichard Henderson { "ldda", 0x0c001120, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT},
1020429b31a2SRichard Henderson { "ldda", 0x0c001100, 0xfc00d3c0, "cmcc5(b),t", pa20, FLAG_STRICT},
1021429b31a2SRichard Henderson { "ldcd", 0x0c000140, 0xfc00d3c0, "cxcdx(b),t", pa20, FLAG_STRICT},
1022429b31a2SRichard Henderson { "ldcd", 0x0c000140, 0xfc0013c0, "cxcdx(s,b),t", pa20, FLAG_STRICT},
1023429b31a2SRichard Henderson { "ldcd", 0x0c001140, 0xfc00d3c0, "cmcd5(b),t", pa20, FLAG_STRICT},
1024429b31a2SRichard Henderson { "ldcd", 0x0c001140, 0xfc0013c0, "cmcd5(s,b),t", pa20, FLAG_STRICT},
1025429b31a2SRichard Henderson { "stda", 0x0c0013e0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT},
1026429b31a2SRichard Henderson { "stda", 0x0c0013c0, 0xfc00d3c0, "cmcCx,V(b)", pa20, FLAG_STRICT},
1027429b31a2SRichard Henderson { "ldwax", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT},
1028429b31a2SRichard Henderson { "ldwax", 0x0c000180, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT},
1029429b31a2SRichard Henderson { "ldwax", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, 0},
1030429b31a2SRichard Henderson { "ldcwx", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT},
1031429b31a2SRichard Henderson { "ldcwx", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT},
1032429b31a2SRichard Henderson { "ldcwx", 0x0c0001c0, 0xfc00d3c0, "cxcdx(b),t", pa11, FLAG_STRICT},
1033429b31a2SRichard Henderson { "ldcwx", 0x0c0001c0, 0xfc0013c0, "cxcdx(s,b),t", pa11, FLAG_STRICT},
1034429b31a2SRichard Henderson { "ldcwx", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, 0},
1035429b31a2SRichard Henderson { "ldcwx", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, 0},
1036429b31a2SRichard Henderson { "ldws", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT},
1037429b31a2SRichard Henderson { "ldws", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT},
1038429b31a2SRichard Henderson { "ldws", 0x0c001080, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT},
1039429b31a2SRichard Henderson { "ldws", 0x0c001080, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT},
1040429b31a2SRichard Henderson { "ldws", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, 0},
1041429b31a2SRichard Henderson { "ldws", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, 0},
1042429b31a2SRichard Henderson { "ldhs", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT},
1043429b31a2SRichard Henderson { "ldhs", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT},
1044429b31a2SRichard Henderson { "ldhs", 0x0c001040, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT},
1045429b31a2SRichard Henderson { "ldhs", 0x0c001040, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT},
1046429b31a2SRichard Henderson { "ldhs", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, 0},
1047429b31a2SRichard Henderson { "ldhs", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, 0},
1048429b31a2SRichard Henderson { "ldbs", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT},
1049429b31a2SRichard Henderson { "ldbs", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT},
1050429b31a2SRichard Henderson { "ldbs", 0x0c001000, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT},
1051429b31a2SRichard Henderson { "ldbs", 0x0c001000, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT},
1052429b31a2SRichard Henderson { "ldbs", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, 0},
1053429b31a2SRichard Henderson { "ldbs", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, 0},
1054429b31a2SRichard Henderson { "ldwas", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT},
1055429b31a2SRichard Henderson { "ldwas", 0x0c001180, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT},
1056429b31a2SRichard Henderson { "ldwas", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, 0},
1057429b31a2SRichard Henderson { "ldcws", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT},
1058429b31a2SRichard Henderson { "ldcws", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT},
1059429b31a2SRichard Henderson { "ldcws", 0x0c0011c0, 0xfc00d3c0, "cmcd5(b),t", pa11, FLAG_STRICT},
1060429b31a2SRichard Henderson { "ldcws", 0x0c0011c0, 0xfc0013c0, "cmcd5(s,b),t", pa11, FLAG_STRICT},
1061429b31a2SRichard Henderson { "ldcws", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, 0},
1062429b31a2SRichard Henderson { "ldcws", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, 0},
1063429b31a2SRichard Henderson { "stws", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT},
1064429b31a2SRichard Henderson { "stws", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT},
1065429b31a2SRichard Henderson { "stws", 0x0c001280, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT},
1066429b31a2SRichard Henderson { "stws", 0x0c001280, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT},
1067429b31a2SRichard Henderson { "stws", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, 0},
1068429b31a2SRichard Henderson { "stws", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, 0},
1069429b31a2SRichard Henderson { "sths", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT},
1070429b31a2SRichard Henderson { "sths", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT},
1071429b31a2SRichard Henderson { "sths", 0x0c001240, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT},
1072429b31a2SRichard Henderson { "sths", 0x0c001240, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT},
1073429b31a2SRichard Henderson { "sths", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, 0},
1074429b31a2SRichard Henderson { "sths", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, 0},
1075429b31a2SRichard Henderson { "stbs", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT},
1076429b31a2SRichard Henderson { "stbs", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT},
1077429b31a2SRichard Henderson { "stbs", 0x0c001200, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT},
1078429b31a2SRichard Henderson { "stbs", 0x0c001200, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT},
1079429b31a2SRichard Henderson { "stbs", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, 0},
1080429b31a2SRichard Henderson { "stbs", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, 0},
1081429b31a2SRichard Henderson { "stwas", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT},
1082429b31a2SRichard Henderson { "stwas", 0x0c001380, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT},
1083429b31a2SRichard Henderson { "stwas", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, 0},
1084429b31a2SRichard Henderson { "stdby", 0x0c001340, 0xfc00d3c0, "cscCx,V(b)", pa20, FLAG_STRICT},
1085429b31a2SRichard Henderson { "stdby", 0x0c001340, 0xfc0013c0, "cscCx,V(s,b)", pa20, FLAG_STRICT},
1086429b31a2SRichard Henderson { "stbys", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, FLAG_STRICT},
1087429b31a2SRichard Henderson { "stbys", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, FLAG_STRICT},
1088429b31a2SRichard Henderson { "stbys", 0x0c001300, 0xfc00d3c0, "cscCx,V(b)", pa11, FLAG_STRICT},
1089429b31a2SRichard Henderson { "stbys", 0x0c001300, 0xfc0013c0, "cscCx,V(s,b)", pa11, FLAG_STRICT},
1090429b31a2SRichard Henderson { "stbys", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, 0},
1091429b31a2SRichard Henderson { "stbys", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, 0},
1092429b31a2SRichard Henderson
1093429b31a2SRichard Henderson /* Immediate instructions. */
1094429b31a2SRichard Henderson { "ldo", 0x34000000, 0xfc000000, "l(b),x", pa20w, 0},
1095429b31a2SRichard Henderson { "ldo", 0x34000000, 0xfc00c000, "j(b),x", pa10, 0},
1096429b31a2SRichard Henderson { "ldil", 0x20000000, 0xfc000000, "k,b", pa10, 0},
1097429b31a2SRichard Henderson { "addil", 0x28000000, 0xfc000000, "k,b,Z", pa10, 0},
1098429b31a2SRichard Henderson { "addil", 0x28000000, 0xfc000000, "k,b", pa10, 0},
1099429b31a2SRichard Henderson
1100429b31a2SRichard Henderson /* Branching instructions. */
1101429b31a2SRichard Henderson { "b", 0xe8008000, 0xfc00e000, "cpnXL", pa20, FLAG_STRICT},
1102429b31a2SRichard Henderson { "b", 0xe800a000, 0xfc00e000, "clnXL", pa20, FLAG_STRICT},
1103429b31a2SRichard Henderson { "b", 0xe8000000, 0xfc00e000, "clnW,b", pa10, FLAG_STRICT},
1104429b31a2SRichard Henderson { "b", 0xe8002000, 0xfc00e000, "cgnW,b", pa10, FLAG_STRICT},
1105429b31a2SRichard Henderson { "b", 0xe8000000, 0xffe0e000, "nW", pa10, 0}, /* b,l foo,r0 */
1106429b31a2SRichard Henderson { "bl", 0xe8000000, 0xfc00e000, "nW,b", pa10, 0},
1107429b31a2SRichard Henderson { "gate", 0xe8002000, 0xfc00e000, "nW,b", pa10, 0},
1108429b31a2SRichard Henderson { "blr", 0xe8004000, 0xfc00e001, "nx,b", pa10, 0},
1109429b31a2SRichard Henderson { "bv", 0xe800c000, 0xfc00fffd, "nx(b)", pa10, 0},
1110429b31a2SRichard Henderson { "bv", 0xe800c000, 0xfc00fffd, "n(b)", pa10, 0},
1111429b31a2SRichard Henderson { "bve", 0xe800f001, 0xfc1ffffd, "cpn(b)L", pa20, FLAG_STRICT},
1112429b31a2SRichard Henderson { "bve", 0xe800f000, 0xfc1ffffd, "cln(b)L", pa20, FLAG_STRICT},
1113429b31a2SRichard Henderson { "bve", 0xe800d001, 0xfc1ffffd, "cPn(b)", pa20, FLAG_STRICT},
1114429b31a2SRichard Henderson { "bve", 0xe800d000, 0xfc1ffffd, "n(b)", pa20, FLAG_STRICT},
1115429b31a2SRichard Henderson { "be", 0xe4000000, 0xfc000000, "clnz(S,b),Y", pa10, FLAG_STRICT},
1116429b31a2SRichard Henderson { "be", 0xe4000000, 0xfc000000, "clnz(b),Y", pa10, FLAG_STRICT},
1117429b31a2SRichard Henderson { "be", 0xe0000000, 0xfc000000, "nz(S,b)", pa10, 0},
1118429b31a2SRichard Henderson { "be", 0xe0000000, 0xfc000000, "nz(b)", pa10, 0},
1119429b31a2SRichard Henderson { "ble", 0xe4000000, 0xfc000000, "nz(S,b)", pa10, 0},
1120429b31a2SRichard Henderson { "movb", 0xc8000000, 0xfc000000, "?ynx,b,w", pa10, 0},
1121429b31a2SRichard Henderson { "movib", 0xcc000000, 0xfc000000, "?yn5,b,w", pa10, 0},
1122429b31a2SRichard Henderson { "combt", 0x80000000, 0xfc000000, "?tnx,b,w", pa10, 0},
1123429b31a2SRichard Henderson { "combf", 0x88000000, 0xfc000000, "?tnx,b,w", pa10, 0},
1124429b31a2SRichard Henderson { "comibt", 0x84000000, 0xfc000000, "?tn5,b,w", pa10, 0},
1125429b31a2SRichard Henderson { "comibf", 0x8c000000, 0xfc000000, "?tn5,b,w", pa10, 0},
1126429b31a2SRichard Henderson { "addbt", 0xa0000000, 0xfc000000, "?dnx,b,w", pa10, 0},
1127429b31a2SRichard Henderson { "addbf", 0xa8000000, 0xfc000000, "?dnx,b,w", pa10, 0},
1128429b31a2SRichard Henderson { "addibt", 0xa4000000, 0xfc000000, "?dn5,b,w", pa10, 0},
1129429b31a2SRichard Henderson { "addibf", 0xac000000, 0xfc000000, "?dn5,b,w", pa10, 0},
1130429b31a2SRichard Henderson { "bb", 0xc0004000, 0xffe06000, "?bnx,!,w", pa10, FLAG_STRICT},
1131429b31a2SRichard Henderson { "bb", 0xc0006000, 0xffe06000, "?Bnx,!,w", pa20, FLAG_STRICT},
1132429b31a2SRichard Henderson { "bb", 0xc4004000, 0xfc006000, "?bnx,Q,w", pa10, FLAG_STRICT},
1133429b31a2SRichard Henderson { "bb", 0xc4004000, 0xfc004000, "?Bnx,B,w", pa20, FLAG_STRICT},
1134429b31a2SRichard Henderson { "bvb", 0xc0004000, 0xffe04000, "?bnx,w", pa10, 0},
1135429b31a2SRichard Henderson { "clrbts", 0xe8004005, 0xffffffff, "", pa20, FLAG_STRICT},
1136429b31a2SRichard Henderson { "popbts", 0xe8004005, 0xfffff007, "$", pa20, FLAG_STRICT},
1137429b31a2SRichard Henderson { "pushnom", 0xe8004001, 0xffffffff, "", pa20, FLAG_STRICT},
1138429b31a2SRichard Henderson { "pushbts", 0xe8004001, 0xffe0ffff, "x", pa20, FLAG_STRICT},
1139429b31a2SRichard Henderson
1140429b31a2SRichard Henderson /* Computation Instructions. */
1141429b31a2SRichard Henderson
1142429b31a2SRichard Henderson { "cmpclr", 0x080008a0, 0xfc000fe0, "?Sx,b,t", pa20, FLAG_STRICT},
1143429b31a2SRichard Henderson { "cmpclr", 0x08000880, 0xfc000fe0, "?sx,b,t", pa10, FLAG_STRICT},
1144429b31a2SRichard Henderson { "comclr", 0x08000880, 0xfc000fe0, "?sx,b,t", pa10, 0},
1145429b31a2SRichard Henderson { "or", 0x08000260, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT},
1146429b31a2SRichard Henderson { "or", 0x08000240, 0xfc000fe0, "?lx,b,t", pa10, 0},
1147429b31a2SRichard Henderson { "xor", 0x080002a0, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT},
1148429b31a2SRichard Henderson { "xor", 0x08000280, 0xfc000fe0, "?lx,b,t", pa10, 0},
1149429b31a2SRichard Henderson { "and", 0x08000220, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT},
1150429b31a2SRichard Henderson { "and", 0x08000200, 0xfc000fe0, "?lx,b,t", pa10, 0},
1151429b31a2SRichard Henderson { "andcm", 0x08000020, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT},
1152429b31a2SRichard Henderson { "andcm", 0x08000000, 0xfc000fe0, "?lx,b,t", pa10, 0},
1153429b31a2SRichard Henderson { "uxor", 0x080003a0, 0xfc000fe0, "?Ux,b,t", pa20, FLAG_STRICT},
1154429b31a2SRichard Henderson { "uxor", 0x08000380, 0xfc000fe0, "?ux,b,t", pa10, 0},
1155429b31a2SRichard Henderson { "uaddcm", 0x080009a0, 0xfc000fa0, "cT?Ux,b,t", pa20, FLAG_STRICT},
1156429b31a2SRichard Henderson { "uaddcm", 0x08000980, 0xfc000fa0, "cT?ux,b,t", pa10, FLAG_STRICT},
1157429b31a2SRichard Henderson { "uaddcm", 0x08000980, 0xfc000fe0, "?ux,b,t", pa10, 0},
1158429b31a2SRichard Henderson { "uaddcmt", 0x080009c0, 0xfc000fe0, "?ux,b,t", pa10, 0},
1159429b31a2SRichard Henderson { "dcor", 0x08000ba0, 0xfc1f0fa0, "ci?Ub,t", pa20, FLAG_STRICT},
1160429b31a2SRichard Henderson { "dcor", 0x08000b80, 0xfc1f0fa0, "ci?ub,t", pa10, FLAG_STRICT},
1161429b31a2SRichard Henderson { "dcor", 0x08000b80, 0xfc1f0fe0, "?ub,t", pa10, 0},
1162429b31a2SRichard Henderson { "idcor", 0x08000bc0, 0xfc1f0fe0, "?ub,t", pa10, 0},
1163429b31a2SRichard Henderson { "addi", 0xb0000000, 0xfc000000, "ct?ai,b,x", pa10, FLAG_STRICT},
1164429b31a2SRichard Henderson { "addi", 0xb4000000, 0xfc000000, "cv?ai,b,x", pa10, FLAG_STRICT},
1165429b31a2SRichard Henderson { "addi", 0xb4000000, 0xfc000800, "?ai,b,x", pa10, 0},
1166429b31a2SRichard Henderson { "addio", 0xb4000800, 0xfc000800, "?ai,b,x", pa10, 0},
1167429b31a2SRichard Henderson { "addit", 0xb0000000, 0xfc000800, "?ai,b,x", pa10, 0},
1168429b31a2SRichard Henderson { "addito", 0xb0000800, 0xfc000800, "?ai,b,x", pa10, 0},
1169429b31a2SRichard Henderson { "add", 0x08000720, 0xfc0007e0, "cY?Ax,b,t", pa20, FLAG_STRICT},
1170429b31a2SRichard Henderson { "add", 0x08000700, 0xfc0007e0, "cy?ax,b,t", pa10, FLAG_STRICT},
1171429b31a2SRichard Henderson { "add", 0x08000220, 0xfc0003e0, "ca?Ax,b,t", pa20, FLAG_STRICT},
1172429b31a2SRichard Henderson { "add", 0x08000200, 0xfc0003e0, "ca?ax,b,t", pa10, FLAG_STRICT},
1173429b31a2SRichard Henderson { "add", 0x08000600, 0xfc000fe0, "?ax,b,t", pa10, 0},
1174429b31a2SRichard Henderson { "addl", 0x08000a00, 0xfc000fe0, "?ax,b,t", pa10, 0},
1175429b31a2SRichard Henderson { "addo", 0x08000e00, 0xfc000fe0, "?ax,b,t", pa10, 0},
1176429b31a2SRichard Henderson { "addc", 0x08000700, 0xfc000fe0, "?ax,b,t", pa10, 0},
1177429b31a2SRichard Henderson { "addco", 0x08000f00, 0xfc000fe0, "?ax,b,t", pa10, 0},
1178429b31a2SRichard Henderson { "sub", 0x080004e0, 0xfc0007e0, "ct?Sx,b,t", pa20, FLAG_STRICT},
1179429b31a2SRichard Henderson { "sub", 0x080004c0, 0xfc0007e0, "ct?sx,b,t", pa10, FLAG_STRICT},
1180429b31a2SRichard Henderson { "sub", 0x08000520, 0xfc0007e0, "cB?Sx,b,t", pa20, FLAG_STRICT},
1181429b31a2SRichard Henderson { "sub", 0x08000500, 0xfc0007e0, "cb?sx,b,t", pa10, FLAG_STRICT},
1182429b31a2SRichard Henderson { "sub", 0x08000420, 0xfc0007e0, "cv?Sx,b,t", pa20, FLAG_STRICT},
1183429b31a2SRichard Henderson { "sub", 0x08000400, 0xfc0007e0, "cv?sx,b,t", pa10, FLAG_STRICT},
1184429b31a2SRichard Henderson { "sub", 0x08000400, 0xfc000fe0, "?sx,b,t", pa10, 0},
1185429b31a2SRichard Henderson { "subo", 0x08000c00, 0xfc000fe0, "?sx,b,t", pa10, 0},
1186429b31a2SRichard Henderson { "subb", 0x08000500, 0xfc000fe0, "?sx,b,t", pa10, 0},
1187429b31a2SRichard Henderson { "subbo", 0x08000d00, 0xfc000fe0, "?sx,b,t", pa10, 0},
1188429b31a2SRichard Henderson { "subt", 0x080004c0, 0xfc000fe0, "?sx,b,t", pa10, 0},
1189429b31a2SRichard Henderson { "subto", 0x08000cc0, 0xfc000fe0, "?sx,b,t", pa10, 0},
1190429b31a2SRichard Henderson { "ds", 0x08000440, 0xfc000fe0, "?sx,b,t", pa10, 0},
1191429b31a2SRichard Henderson { "subi", 0x94000000, 0xfc000000, "cv?si,b,x", pa10, FLAG_STRICT},
1192429b31a2SRichard Henderson { "subi", 0x94000000, 0xfc000800, "?si,b,x", pa10, 0},
1193429b31a2SRichard Henderson { "subio", 0x94000800, 0xfc000800, "?si,b,x", pa10, 0},
1194429b31a2SRichard Henderson { "cmpiclr", 0x90000800, 0xfc000800, "?Si,b,x", pa20, FLAG_STRICT},
1195429b31a2SRichard Henderson { "cmpiclr", 0x90000000, 0xfc000800, "?si,b,x", pa10, FLAG_STRICT},
1196429b31a2SRichard Henderson { "comiclr", 0x90000000, 0xfc000800, "?si,b,x", pa10, 0},
1197429b31a2SRichard Henderson { "shladd", 0x08000220, 0xfc000320, "ca?Ax,.,b,t", pa20, FLAG_STRICT},
1198429b31a2SRichard Henderson { "shladd", 0x08000200, 0xfc000320, "ca?ax,.,b,t", pa10, FLAG_STRICT},
1199429b31a2SRichard Henderson { "sh1add", 0x08000640, 0xfc000fe0, "?ax,b,t", pa10, 0},
1200429b31a2SRichard Henderson { "sh1addl", 0x08000a40, 0xfc000fe0, "?ax,b,t", pa10, 0},
1201429b31a2SRichard Henderson { "sh1addo", 0x08000e40, 0xfc000fe0, "?ax,b,t", pa10, 0},
1202429b31a2SRichard Henderson { "sh2add", 0x08000680, 0xfc000fe0, "?ax,b,t", pa10, 0},
1203429b31a2SRichard Henderson { "sh2addl", 0x08000a80, 0xfc000fe0, "?ax,b,t", pa10, 0},
1204429b31a2SRichard Henderson { "sh2addo", 0x08000e80, 0xfc000fe0, "?ax,b,t", pa10, 0},
1205429b31a2SRichard Henderson { "sh3add", 0x080006c0, 0xfc000fe0, "?ax,b,t", pa10, 0},
1206429b31a2SRichard Henderson { "sh3addl", 0x08000ac0, 0xfc000fe0, "?ax,b,t", pa10, 0},
1207429b31a2SRichard Henderson { "sh3addo", 0x08000ec0, 0xfc000fe0, "?ax,b,t", pa10, 0},
1208429b31a2SRichard Henderson
1209429b31a2SRichard Henderson /* Subword Operation Instructions. */
1210429b31a2SRichard Henderson
1211429b31a2SRichard Henderson { "hadd", 0x08000300, 0xfc00ff20, "cHx,b,t", pa20, FLAG_STRICT},
1212429b31a2SRichard Henderson { "havg", 0x080002c0, 0xfc00ffe0, "x,b,t", pa20, FLAG_STRICT},
1213429b31a2SRichard Henderson { "hshl", 0xf8008800, 0xffe0fc20, "x,*,t", pa20, FLAG_STRICT},
1214429b31a2SRichard Henderson { "hshladd", 0x08000700, 0xfc00ff20, "x,.,b,t", pa20, FLAG_STRICT},
1215429b31a2SRichard Henderson { "hshr", 0xf800c800, 0xfc1ff820, "cSb,*,t", pa20, FLAG_STRICT},
1216429b31a2SRichard Henderson { "hshradd", 0x08000500, 0xfc00ff20, "x,.,b,t", pa20, FLAG_STRICT},
1217429b31a2SRichard Henderson { "hsub", 0x08000100, 0xfc00ff20, "cHx,b,t", pa20, FLAG_STRICT},
1218429b31a2SRichard Henderson { "mixh", 0xf8008400, 0xfc009fe0, "chx,b,t", pa20, FLAG_STRICT},
1219429b31a2SRichard Henderson { "mixw", 0xf8008000, 0xfc009fe0, "chx,b,t", pa20, FLAG_STRICT},
1220429b31a2SRichard Henderson { "permh", 0xf8000000, 0xfc009020, "c*a,t", pa20, FLAG_STRICT},
1221429b31a2SRichard Henderson
1222429b31a2SRichard Henderson
1223429b31a2SRichard Henderson /* Extract and Deposit Instructions. */
1224429b31a2SRichard Henderson
1225429b31a2SRichard Henderson { "shrpd", 0xd0000200, 0xfc001fe0, "?Xx,b,!,t", pa20, FLAG_STRICT},
1226429b31a2SRichard Henderson { "shrpd", 0xd0000400, 0xfc001400, "?Xx,b,~,t", pa20, FLAG_STRICT},
1227429b31a2SRichard Henderson { "shrpw", 0xd0000000, 0xfc001fe0, "?xx,b,!,t", pa10, FLAG_STRICT},
1228429b31a2SRichard Henderson { "shrpw", 0xd0000800, 0xfc001c00, "?xx,b,p,t", pa10, FLAG_STRICT},
1229429b31a2SRichard Henderson { "vshd", 0xd0000000, 0xfc001fe0, "?xx,b,t", pa10, 0},
1230429b31a2SRichard Henderson { "shd", 0xd0000800, 0xfc001c00, "?xx,b,p,t", pa10, 0},
1231429b31a2SRichard Henderson { "extrd", 0xd0001200, 0xfc001ae0, "cS?Xb,!,%,x", pa20, FLAG_STRICT},
1232429b31a2SRichard Henderson { "extrd", 0xd8000000, 0xfc000000, "cS?Xb,q,|,x", pa20, FLAG_STRICT},
1233429b31a2SRichard Henderson { "extrw", 0xd0001000, 0xfc001be0, "cS?xb,!,T,x", pa10, FLAG_STRICT},
1234429b31a2SRichard Henderson { "extrw", 0xd0001800, 0xfc001800, "cS?xb,P,T,x", pa10, FLAG_STRICT},
1235429b31a2SRichard Henderson { "vextru", 0xd0001000, 0xfc001fe0, "?xb,T,x", pa10, 0},
1236429b31a2SRichard Henderson { "vextrs", 0xd0001400, 0xfc001fe0, "?xb,T,x", pa10, 0},
1237429b31a2SRichard Henderson { "extru", 0xd0001800, 0xfc001c00, "?xb,P,T,x", pa10, 0},
1238429b31a2SRichard Henderson { "extrs", 0xd0001c00, 0xfc001c00, "?xb,P,T,x", pa10, 0},
1239429b31a2SRichard Henderson { "depd", 0xd4000200, 0xfc001ae0, "cz?Xx,!,%,b", pa20, FLAG_STRICT},
1240429b31a2SRichard Henderson { "depd", 0xf0000000, 0xfc000000, "cz?Xx,~,|,b", pa20, FLAG_STRICT},
1241429b31a2SRichard Henderson { "depdi", 0xd4001200, 0xfc001ae0, "cz?X5,!,%,b", pa20, FLAG_STRICT},
1242429b31a2SRichard Henderson { "depdi", 0xf4000000, 0xfc000000, "cz?X5,~,|,b", pa20, FLAG_STRICT},
1243429b31a2SRichard Henderson { "depw", 0xd4000000, 0xfc001be0, "cz?xx,!,T,b", pa10, FLAG_STRICT},
1244429b31a2SRichard Henderson { "depw", 0xd4000800, 0xfc001800, "cz?xx,p,T,b", pa10, FLAG_STRICT},
1245429b31a2SRichard Henderson { "depwi", 0xd4001000, 0xfc001be0, "cz?x5,!,T,b", pa10, FLAG_STRICT},
1246429b31a2SRichard Henderson { "depwi", 0xd4001800, 0xfc001800, "cz?x5,p,T,b", pa10, FLAG_STRICT},
1247429b31a2SRichard Henderson { "zvdep", 0xd4000000, 0xfc001fe0, "?xx,T,b", pa10, 0},
1248429b31a2SRichard Henderson { "vdep", 0xd4000400, 0xfc001fe0, "?xx,T,b", pa10, 0},
1249429b31a2SRichard Henderson { "zdep", 0xd4000800, 0xfc001c00, "?xx,p,T,b", pa10, 0},
1250429b31a2SRichard Henderson { "dep", 0xd4000c00, 0xfc001c00, "?xx,p,T,b", pa10, 0},
1251429b31a2SRichard Henderson { "zvdepi", 0xd4001000, 0xfc001fe0, "?x5,T,b", pa10, 0},
1252429b31a2SRichard Henderson { "vdepi", 0xd4001400, 0xfc001fe0, "?x5,T,b", pa10, 0},
1253429b31a2SRichard Henderson { "zdepi", 0xd4001800, 0xfc001c00, "?x5,p,T,b", pa10, 0},
1254429b31a2SRichard Henderson { "depi", 0xd4001c00, 0xfc001c00, "?x5,p,T,b", pa10, 0},
1255429b31a2SRichard Henderson
1256429b31a2SRichard Henderson /* System Control Instructions. */
1257429b31a2SRichard Henderson
1258429b31a2SRichard Henderson { "break", 0x00000000, 0xfc001fe0, "r,A", pa10, 0},
1259429b31a2SRichard Henderson { "rfi", 0x00000c00, 0xffffff1f, "cr", pa10, FLAG_STRICT},
1260429b31a2SRichard Henderson { "rfi", 0x00000c00, 0xffffffff, "", pa10, 0},
1261429b31a2SRichard Henderson { "rfir", 0x00000ca0, 0xffffffff, "", pa11, 0},
1262429b31a2SRichard Henderson { "ssm", 0x00000d60, 0xfc00ffe0, "U,t", pa20, FLAG_STRICT},
1263429b31a2SRichard Henderson { "ssm", 0x00000d60, 0xffe0ffe0, "R,t", pa10, 0},
1264429b31a2SRichard Henderson { "rsm", 0x00000e60, 0xfc00ffe0, "U,t", pa20, FLAG_STRICT},
1265429b31a2SRichard Henderson { "rsm", 0x00000e60, 0xffe0ffe0, "R,t", pa10, 0},
1266429b31a2SRichard Henderson { "mtsm", 0x00001860, 0xffe0ffff, "x", pa10, 0},
1267429b31a2SRichard Henderson { "ldsid", 0x000010a0, 0xfc1fffe0, "(b),t", pa10, 0},
1268429b31a2SRichard Henderson { "ldsid", 0x000010a0, 0xfc1f3fe0, "(s,b),t", pa10, 0},
1269429b31a2SRichard Henderson { "mtsp", 0x00001820, 0xffe01fff, "x,S", pa10, 0},
1270429b31a2SRichard Henderson { "mtctl", 0x00001840, 0xfc00ffff, "x,^", pa10, 0},
1271429b31a2SRichard Henderson { "mtsarcm", 0x016018C0, 0xffe0ffff, "x", pa20, FLAG_STRICT},
1272429b31a2SRichard Henderson { "mfia", 0x000014A0, 0xffffffe0, "t", pa20, FLAG_STRICT},
1273429b31a2SRichard Henderson { "mfsp", 0x000004a0, 0xffff1fe0, "S,t", pa10, 0},
1274429b31a2SRichard Henderson { "mfctl", 0x016048a0, 0xffffffe0, "cW!,t", pa20, FLAG_STRICT},
1275429b31a2SRichard Henderson { "mfctl", 0x000008a0, 0xfc1fffe0, "^,t", pa10, 0},
1276429b31a2SRichard Henderson { "sync", 0x00000400, 0xffffffff, "", pa10, 0},
1277429b31a2SRichard Henderson { "syncdma", 0x00100400, 0xffffffff, "", pa10, 0},
1278429b31a2SRichard Henderson { "probe", 0x04001180, 0xfc00ffa0, "cw(b),x,t", pa10, FLAG_STRICT},
1279429b31a2SRichard Henderson { "probe", 0x04001180, 0xfc003fa0, "cw(s,b),x,t", pa10, FLAG_STRICT},
1280429b31a2SRichard Henderson { "probei", 0x04003180, 0xfc00ffa0, "cw(b),R,t", pa10, FLAG_STRICT},
1281429b31a2SRichard Henderson { "probei", 0x04003180, 0xfc003fa0, "cw(s,b),R,t", pa10, FLAG_STRICT},
1282429b31a2SRichard Henderson { "prober", 0x04001180, 0xfc00ffe0, "(b),x,t", pa10, 0},
1283429b31a2SRichard Henderson { "prober", 0x04001180, 0xfc003fe0, "(s,b),x,t", pa10, 0},
1284429b31a2SRichard Henderson { "proberi", 0x04003180, 0xfc00ffe0, "(b),R,t", pa10, 0},
1285429b31a2SRichard Henderson { "proberi", 0x04003180, 0xfc003fe0, "(s,b),R,t", pa10, 0},
1286429b31a2SRichard Henderson { "probew", 0x040011c0, 0xfc00ffe0, "(b),x,t", pa10, 0},
1287429b31a2SRichard Henderson { "probew", 0x040011c0, 0xfc003fe0, "(s,b),x,t", pa10, 0},
1288429b31a2SRichard Henderson { "probewi", 0x040031c0, 0xfc00ffe0, "(b),R,t", pa10, 0},
1289429b31a2SRichard Henderson { "probewi", 0x040031c0, 0xfc003fe0, "(s,b),R,t", pa10, 0},
1290429b31a2SRichard Henderson { "lpa", 0x04001340, 0xfc00ffc0, "cZx(b),t", pa10, 0},
1291429b31a2SRichard Henderson { "lpa", 0x04001340, 0xfc003fc0, "cZx(s,b),t", pa10, 0},
1292429b31a2SRichard Henderson { "lci", 0x04001300, 0xfc00ffe0, "x(b),t", pa11, 0},
1293429b31a2SRichard Henderson { "lci", 0x04001300, 0xfc003fe0, "x(s,b),t", pa11, 0},
1294429b31a2SRichard Henderson { "pdtlb", 0x04001600, 0xfc00ffdf, "cLcZx(b)", pa20, FLAG_STRICT},
1295429b31a2SRichard Henderson { "pdtlb", 0x04001600, 0xfc003fdf, "cLcZx(s,b)", pa20, FLAG_STRICT},
1296429b31a2SRichard Henderson { "pdtlb", 0x04001600, 0xfc1fffdf, "cLcZ@(b)", pa20, FLAG_STRICT},
1297429b31a2SRichard Henderson { "pdtlb", 0x04001600, 0xfc1f3fdf, "cLcZ@(s,b)", pa20, FLAG_STRICT},
1298429b31a2SRichard Henderson { "pdtlb", 0x04001200, 0xfc00ffdf, "cZx(b)", pa10, 0},
1299429b31a2SRichard Henderson { "pdtlb", 0x04001200, 0xfc003fdf, "cZx(s,b)", pa10, 0},
1300429b31a2SRichard Henderson { "pitlb", 0x04000600, 0xfc001fdf, "cLcZx(S,b)", pa20, FLAG_STRICT},
1301429b31a2SRichard Henderson { "pitlb", 0x04000600, 0xfc1f1fdf, "cLcZ@(S,b)", pa20, FLAG_STRICT},
1302429b31a2SRichard Henderson { "pitlb", 0x04000200, 0xfc001fdf, "cZx(S,b)", pa10, 0},
1303429b31a2SRichard Henderson { "pdtlbe", 0x04001240, 0xfc00ffdf, "cZx(b)", pa10, 0},
1304429b31a2SRichard Henderson { "pdtlbe", 0x04001240, 0xfc003fdf, "cZx(s,b)", pa10, 0},
1305429b31a2SRichard Henderson { "pitlbe", 0x04000240, 0xfc001fdf, "cZx(S,b)", pa10, 0},
1306429b31a2SRichard Henderson { "idtlba", 0x04001040, 0xfc00ffff, "x,(b)", pa10, 0},
1307429b31a2SRichard Henderson { "idtlba", 0x04001040, 0xfc003fff, "x,(s,b)", pa10, 0},
1308429b31a2SRichard Henderson { "iitlba", 0x04000040, 0xfc001fff, "x,(S,b)", pa10, 0},
1309429b31a2SRichard Henderson { "idtlbp", 0x04001000, 0xfc00ffff, "x,(b)", pa10, 0},
1310429b31a2SRichard Henderson { "idtlbp", 0x04001000, 0xfc003fff, "x,(s,b)", pa10, 0},
1311429b31a2SRichard Henderson { "iitlbp", 0x04000000, 0xfc001fff, "x,(S,b)", pa10, 0},
1312429b31a2SRichard Henderson { "pdc", 0x04001380, 0xfc00ffdf, "cZx(b)", pa10, 0},
1313429b31a2SRichard Henderson { "pdc", 0x04001380, 0xfc003fdf, "cZx(s,b)", pa10, 0},
1314429b31a2SRichard Henderson { "fdc", 0x04001280, 0xfc00ffdf, "cZx(b)", pa10, FLAG_STRICT},
1315429b31a2SRichard Henderson { "fdc", 0x04001280, 0xfc003fdf, "cZx(s,b)", pa10, FLAG_STRICT},
1316429b31a2SRichard Henderson { "fdc", 0x04003280, 0xfc00ffff, "5(b)", pa20, FLAG_STRICT},
1317429b31a2SRichard Henderson { "fdc", 0x04003280, 0xfc003fff, "5(s,b)", pa20, FLAG_STRICT},
1318429b31a2SRichard Henderson { "fdc", 0x04001280, 0xfc00ffdf, "cZx(b)", pa10, 0},
1319429b31a2SRichard Henderson { "fdc", 0x04001280, 0xfc003fdf, "cZx(s,b)", pa10, 0},
1320429b31a2SRichard Henderson { "fic", 0x040013c0, 0xfc00dfdf, "cZx(b)", pa20, FLAG_STRICT},
1321429b31a2SRichard Henderson { "fic", 0x04000280, 0xfc001fdf, "cZx(S,b)", pa10, 0},
1322429b31a2SRichard Henderson { "fdce", 0x040012c0, 0xfc00ffdf, "cZx(b)", pa10, 0},
1323429b31a2SRichard Henderson { "fdce", 0x040012c0, 0xfc003fdf, "cZx(s,b)", pa10, 0},
1324429b31a2SRichard Henderson { "fice", 0x040002c0, 0xfc001fdf, "cZx(S,b)", pa10, 0},
1325429b31a2SRichard Henderson { "diag", 0x14000000, 0xfc000000, "D", pa10, 0},
1326429b31a2SRichard Henderson { "idtlbt", 0x04001800, 0xfc00ffff, "x,b", pa20, FLAG_STRICT},
1327429b31a2SRichard Henderson { "iitlbt", 0x04000800, 0xfc00ffff, "x,b", pa20, FLAG_STRICT},
1328429b31a2SRichard Henderson
1329429b31a2SRichard Henderson /* These may be specific to certain versions of the PA. Joel claimed
1330429b31a2SRichard Henderson they were 72000 (7200?) specific. However, I'm almost certain the
1331429b31a2SRichard Henderson mtcpu/mfcpu were undocumented, but available in the older 700 machines. */
1332429b31a2SRichard Henderson { "mtcpu", 0x14001600, 0xfc00ffff, "x,^", pa10, 0},
1333429b31a2SRichard Henderson { "mfcpu", 0x14001A00, 0xfc00ffff, "^,x", pa10, 0},
1334429b31a2SRichard Henderson { "tocen", 0x14403600, 0xffffffff, "", pa10, 0},
1335429b31a2SRichard Henderson { "tocdis", 0x14401620, 0xffffffff, "", pa10, 0},
1336429b31a2SRichard Henderson { "shdwgr", 0x14402600, 0xffffffff, "", pa10, 0},
1337429b31a2SRichard Henderson { "grshdw", 0x14400620, 0xffffffff, "", pa10, 0},
1338429b31a2SRichard Henderson
1339429b31a2SRichard Henderson /* gfw and gfr are not in the HP PA 1.1 manual, but they are in either
1340429b31a2SRichard Henderson the Timex FPU or the Mustang ERS (not sure which) manual. */
1341429b31a2SRichard Henderson { "gfw", 0x04001680, 0xfc00ffdf, "cZx(b)", pa11, 0},
1342429b31a2SRichard Henderson { "gfw", 0x04001680, 0xfc003fdf, "cZx(s,b)", pa11, 0},
1343429b31a2SRichard Henderson { "gfr", 0x04001a80, 0xfc00ffdf, "cZx(b)", pa11, 0},
1344429b31a2SRichard Henderson { "gfr", 0x04001a80, 0xfc003fdf, "cZx(s,b)", pa11, 0},
1345429b31a2SRichard Henderson
1346429b31a2SRichard Henderson /* Floating Point Coprocessor Instructions. */
1347429b31a2SRichard Henderson
1348429b31a2SRichard Henderson { "fldw", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, FLAG_STRICT},
1349429b31a2SRichard Henderson { "fldw", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, FLAG_STRICT},
1350429b31a2SRichard Henderson { "fldw", 0x24000000, 0xfc00d380, "cxccx(b),fT", pa11, FLAG_STRICT},
1351429b31a2SRichard Henderson { "fldw", 0x24000000, 0xfc001380, "cxccx(s,b),fT", pa11, FLAG_STRICT},
1352429b31a2SRichard Henderson { "fldw", 0x24001020, 0xfc1ff3a0, "cocc@(b),fT", pa20, FLAG_STRICT},
1353429b31a2SRichard Henderson { "fldw", 0x24001020, 0xfc1f33a0, "cocc@(s,b),fT", pa20, FLAG_STRICT},
1354429b31a2SRichard Henderson { "fldw", 0x24001000, 0xfc00df80, "cM5(b),fT", pa10, FLAG_STRICT},
1355429b31a2SRichard Henderson { "fldw", 0x24001000, 0xfc001f80, "cM5(s,b),fT", pa10, FLAG_STRICT},
1356429b31a2SRichard Henderson { "fldw", 0x24001000, 0xfc00d380, "cmcc5(b),fT", pa11, FLAG_STRICT},
1357429b31a2SRichard Henderson { "fldw", 0x24001000, 0xfc001380, "cmcc5(s,b),fT", pa11, FLAG_STRICT},
1358429b31a2SRichard Henderson { "fldw", 0x5c000000, 0xfc000004, "y(b),fe", pa20w, FLAG_STRICT},
1359429b31a2SRichard Henderson { "fldw", 0x58000000, 0xfc000000, "cJy(b),fe", pa20w, FLAG_STRICT},
1360429b31a2SRichard Henderson { "fldw", 0x5c000000, 0xfc00c004, "d(b),fe", pa20, FLAG_STRICT},
1361429b31a2SRichard Henderson { "fldw", 0x5c000000, 0xfc000004, "d(s,b),fe", pa20, FLAG_STRICT},
1362429b31a2SRichard Henderson { "fldw", 0x58000000, 0xfc00c000, "cJd(b),fe", pa20, FLAG_STRICT},
1363429b31a2SRichard Henderson { "fldw", 0x58000000, 0xfc000000, "cJd(s,b),fe", pa20, FLAG_STRICT},
1364429b31a2SRichard Henderson { "fldd", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, FLAG_STRICT},
1365429b31a2SRichard Henderson { "fldd", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, FLAG_STRICT},
1366429b31a2SRichard Henderson { "fldd", 0x2c000000, 0xfc00d3c0, "cxccx(b),ft", pa11, FLAG_STRICT},
1367429b31a2SRichard Henderson { "fldd", 0x2c000000, 0xfc0013c0, "cxccx(s,b),ft", pa11, FLAG_STRICT},
1368429b31a2SRichard Henderson { "fldd", 0x2c001020, 0xfc1ff3e0, "cocc@(b),ft", pa20, FLAG_STRICT},
1369429b31a2SRichard Henderson { "fldd", 0x2c001020, 0xfc1f33e0, "cocc@(s,b),ft", pa20, FLAG_STRICT},
1370429b31a2SRichard Henderson { "fldd", 0x2c001000, 0xfc00dfc0, "cM5(b),ft", pa10, FLAG_STRICT},
1371429b31a2SRichard Henderson { "fldd", 0x2c001000, 0xfc001fc0, "cM5(s,b),ft", pa10, FLAG_STRICT},
1372429b31a2SRichard Henderson { "fldd", 0x2c001000, 0xfc00d3c0, "cmcc5(b),ft", pa11, FLAG_STRICT},
1373429b31a2SRichard Henderson { "fldd", 0x2c001000, 0xfc0013c0, "cmcc5(s,b),ft", pa11, FLAG_STRICT},
1374429b31a2SRichard Henderson { "fldd", 0x50000002, 0xfc000002, "cq&(b),fx", pa20w, FLAG_STRICT},
1375429b31a2SRichard Henderson { "fldd", 0x50000002, 0xfc00c002, "cq#(b),fx", pa20, FLAG_STRICT},
1376429b31a2SRichard Henderson { "fldd", 0x50000002, 0xfc000002, "cq#(s,b),fx", pa20, FLAG_STRICT},
1377429b31a2SRichard Henderson { "fstw", 0x24000200, 0xfc00df80, "cXfT,x(b)", pa10, FLAG_STRICT},
1378429b31a2SRichard Henderson { "fstw", 0x24000200, 0xfc001f80, "cXfT,x(s,b)", pa10, FLAG_STRICT},
1379429b31a2SRichard Henderson { "fstw", 0x24000200, 0xfc00d380, "cxcCfT,x(b)", pa11, FLAG_STRICT},
1380429b31a2SRichard Henderson { "fstw", 0x24000200, 0xfc001380, "cxcCfT,x(s,b)", pa11, FLAG_STRICT},
1381429b31a2SRichard Henderson { "fstw", 0x24001220, 0xfc1ff3a0, "cocCfT,@(b)", pa20, FLAG_STRICT},
1382429b31a2SRichard Henderson { "fstw", 0x24001220, 0xfc1f33a0, "cocCfT,@(s,b)", pa20, FLAG_STRICT},
1383429b31a2SRichard Henderson { "fstw", 0x24001200, 0xfc00df80, "cMfT,5(b)", pa10, FLAG_STRICT},
1384429b31a2SRichard Henderson { "fstw", 0x24001200, 0xfc001f80, "cMfT,5(s,b)", pa10, FLAG_STRICT},
1385429b31a2SRichard Henderson { "fstw", 0x24001200, 0xfc00df80, "cMfT,5(b)", pa10, FLAG_STRICT},
1386429b31a2SRichard Henderson { "fstw", 0x24001200, 0xfc001f80, "cMfT,5(s,b)", pa10, FLAG_STRICT},
1387429b31a2SRichard Henderson { "fstw", 0x7c000000, 0xfc000004, "fE,y(b)", pa20w, FLAG_STRICT},
1388429b31a2SRichard Henderson { "fstw", 0x78000000, 0xfc000000, "cJfE,y(b)", pa20w, FLAG_STRICT},
1389429b31a2SRichard Henderson { "fstw", 0x7c000000, 0xfc00c004, "fE,d(b)", pa20, FLAG_STRICT},
1390429b31a2SRichard Henderson { "fstw", 0x7c000000, 0xfc000004, "fE,d(s,b)", pa20, FLAG_STRICT},
1391429b31a2SRichard Henderson { "fstw", 0x78000000, 0xfc00c000, "cJfE,d(b)", pa20, FLAG_STRICT},
1392429b31a2SRichard Henderson { "fstw", 0x78000000, 0xfc000000, "cJfE,d(s,b)", pa20, FLAG_STRICT},
1393429b31a2SRichard Henderson { "fstd", 0x2c000200, 0xfc00dfc0, "cXft,x(b)", pa10, FLAG_STRICT},
1394429b31a2SRichard Henderson { "fstd", 0x2c000200, 0xfc001fc0, "cXft,x(s,b)", pa10, FLAG_STRICT},
1395429b31a2SRichard Henderson { "fstd", 0x2c000200, 0xfc00d3c0, "cxcCft,x(b)", pa11, FLAG_STRICT},
1396429b31a2SRichard Henderson { "fstd", 0x2c000200, 0xfc0013c0, "cxcCft,x(s,b)", pa11, FLAG_STRICT},
1397429b31a2SRichard Henderson { "fstd", 0x2c001220, 0xfc1ff3e0, "cocCft,@(b)", pa20, FLAG_STRICT},
1398429b31a2SRichard Henderson { "fstd", 0x2c001220, 0xfc1f33e0, "cocCft,@(s,b)", pa20, FLAG_STRICT},
1399429b31a2SRichard Henderson { "fstd", 0x2c001200, 0xfc00dfc0, "cMft,5(b)", pa10, FLAG_STRICT},
1400429b31a2SRichard Henderson { "fstd", 0x2c001200, 0xfc001fc0, "cMft,5(s,b)", pa10, FLAG_STRICT},
1401429b31a2SRichard Henderson { "fstd", 0x2c001200, 0xfc00d3c0, "cmcCft,5(b)", pa11, FLAG_STRICT},
1402429b31a2SRichard Henderson { "fstd", 0x2c001200, 0xfc0013c0, "cmcCft,5(s,b)", pa11, FLAG_STRICT},
1403429b31a2SRichard Henderson { "fstd", 0x70000002, 0xfc000002, "cqfx,&(b)", pa20w, FLAG_STRICT},
1404429b31a2SRichard Henderson { "fstd", 0x70000002, 0xfc00c002, "cqfx,#(b)", pa20, FLAG_STRICT},
1405429b31a2SRichard Henderson { "fstd", 0x70000002, 0xfc000002, "cqfx,#(s,b)", pa20, FLAG_STRICT},
1406429b31a2SRichard Henderson { "fldwx", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, FLAG_STRICT},
1407429b31a2SRichard Henderson { "fldwx", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, FLAG_STRICT},
1408429b31a2SRichard Henderson { "fldwx", 0x24000000, 0xfc00d380, "cxccx(b),fT", pa11, FLAG_STRICT},
1409429b31a2SRichard Henderson { "fldwx", 0x24000000, 0xfc001380, "cxccx(s,b),fT", pa11, FLAG_STRICT},
1410429b31a2SRichard Henderson { "fldwx", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, 0},
1411429b31a2SRichard Henderson { "fldwx", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, 0},
1412429b31a2SRichard Henderson { "flddx", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, FLAG_STRICT},
1413429b31a2SRichard Henderson { "flddx", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, FLAG_STRICT},
1414429b31a2SRichard Henderson { "flddx", 0x2c000000, 0xfc00d3c0, "cxccx(b),ft", pa11, FLAG_STRICT},
1415429b31a2SRichard Henderson { "flddx", 0x2c000000, 0xfc0013c0, "cxccx(s,b),ft", pa11, FLAG_STRICT},
1416429b31a2SRichard Henderson { "flddx", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, 0},
1417429b31a2SRichard Henderson { "flddx", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, 0},
1418429b31a2SRichard Henderson { "fstwx", 0x24000200, 0xfc00df80, "cxfT,x(b)", pa10, FLAG_STRICT},
1419429b31a2SRichard Henderson { "fstwx", 0x24000200, 0xfc001f80, "cxfT,x(s,b)", pa10, FLAG_STRICT},
1420429b31a2SRichard Henderson { "fstwx", 0x24000200, 0xfc00d380, "cxcCfT,x(b)", pa11, FLAG_STRICT},
1421429b31a2SRichard Henderson { "fstwx", 0x24000200, 0xfc001380, "cxcCfT,x(s,b)", pa11, FLAG_STRICT},
1422429b31a2SRichard Henderson { "fstwx", 0x24000200, 0xfc00df80, "cxfT,x(b)", pa10, 0},
1423429b31a2SRichard Henderson { "fstwx", 0x24000200, 0xfc001f80, "cxfT,x(s,b)", pa10, 0},
1424429b31a2SRichard Henderson { "fstdx", 0x2c000200, 0xfc00dfc0, "cxft,x(b)", pa10, FLAG_STRICT},
1425429b31a2SRichard Henderson { "fstdx", 0x2c000200, 0xfc001fc0, "cxft,x(s,b)", pa10, FLAG_STRICT},
1426429b31a2SRichard Henderson { "fstdx", 0x2c000200, 0xfc00d3c0, "cxcCft,x(b)", pa11, FLAG_STRICT},
1427429b31a2SRichard Henderson { "fstdx", 0x2c000200, 0xfc0013c0, "cxcCft,x(s,b)", pa11, FLAG_STRICT},
1428429b31a2SRichard Henderson { "fstdx", 0x2c000200, 0xfc00dfc0, "cxft,x(b)", pa10, 0},
1429429b31a2SRichard Henderson { "fstdx", 0x2c000200, 0xfc001fc0, "cxft,x(s,b)", pa10, 0},
1430429b31a2SRichard Henderson { "fstqx", 0x3c000200, 0xfc00dfc0, "cxft,x(b)", pa10, 0},
1431429b31a2SRichard Henderson { "fstqx", 0x3c000200, 0xfc001fc0, "cxft,x(s,b)", pa10, 0},
1432429b31a2SRichard Henderson { "fldws", 0x24001000, 0xfc00df80, "cm5(b),fT", pa10, FLAG_STRICT},
1433429b31a2SRichard Henderson { "fldws", 0x24001000, 0xfc001f80, "cm5(s,b),fT", pa10, FLAG_STRICT},
1434429b31a2SRichard Henderson { "fldws", 0x24001000, 0xfc00d380, "cmcc5(b),fT", pa11, FLAG_STRICT},
1435429b31a2SRichard Henderson { "fldws", 0x24001000, 0xfc001380, "cmcc5(s,b),fT", pa11, FLAG_STRICT},
1436429b31a2SRichard Henderson { "fldws", 0x24001000, 0xfc00df80, "cm5(b),fT", pa10, 0},
1437429b31a2SRichard Henderson { "fldws", 0x24001000, 0xfc001f80, "cm5(s,b),fT", pa10, 0},
1438429b31a2SRichard Henderson { "fldds", 0x2c001000, 0xfc00dfc0, "cm5(b),ft", pa10, FLAG_STRICT},
1439429b31a2SRichard Henderson { "fldds", 0x2c001000, 0xfc001fc0, "cm5(s,b),ft", pa10, FLAG_STRICT},
1440429b31a2SRichard Henderson { "fldds", 0x2c001000, 0xfc00d3c0, "cmcc5(b),ft", pa11, FLAG_STRICT},
1441429b31a2SRichard Henderson { "fldds", 0x2c001000, 0xfc0013c0, "cmcc5(s,b),ft", pa11, FLAG_STRICT},
1442429b31a2SRichard Henderson { "fldds", 0x2c001000, 0xfc00dfc0, "cm5(b),ft", pa10, 0},
1443429b31a2SRichard Henderson { "fldds", 0x2c001000, 0xfc001fc0, "cm5(s,b),ft", pa10, 0},
1444429b31a2SRichard Henderson { "fstws", 0x24001200, 0xfc00df80, "cmfT,5(b)", pa10, FLAG_STRICT},
1445429b31a2SRichard Henderson { "fstws", 0x24001200, 0xfc001f80, "cmfT,5(s,b)", pa10, FLAG_STRICT},
1446429b31a2SRichard Henderson { "fstws", 0x24001200, 0xfc00d380, "cmcCfT,5(b)", pa11, FLAG_STRICT},
1447429b31a2SRichard Henderson { "fstws", 0x24001200, 0xfc001380, "cmcCfT,5(s,b)", pa11, FLAG_STRICT},
1448429b31a2SRichard Henderson { "fstws", 0x24001200, 0xfc00df80, "cmfT,5(b)", pa10, 0},
1449429b31a2SRichard Henderson { "fstws", 0x24001200, 0xfc001f80, "cmfT,5(s,b)", pa10, 0},
1450429b31a2SRichard Henderson { "fstds", 0x2c001200, 0xfc00dfc0, "cmft,5(b)", pa10, FLAG_STRICT},
1451429b31a2SRichard Henderson { "fstds", 0x2c001200, 0xfc001fc0, "cmft,5(s,b)", pa10, FLAG_STRICT},
1452429b31a2SRichard Henderson { "fstds", 0x2c001200, 0xfc00d3c0, "cmcCft,5(b)", pa11, FLAG_STRICT},
1453429b31a2SRichard Henderson { "fstds", 0x2c001200, 0xfc0013c0, "cmcCft,5(s,b)", pa11, FLAG_STRICT},
1454429b31a2SRichard Henderson { "fstds", 0x2c001200, 0xfc00dfc0, "cmft,5(b)", pa10, 0},
1455429b31a2SRichard Henderson { "fstds", 0x2c001200, 0xfc001fc0, "cmft,5(s,b)", pa10, 0},
1456429b31a2SRichard Henderson { "fstqs", 0x3c001200, 0xfc00dfc0, "cmft,5(b)", pa10, 0},
1457429b31a2SRichard Henderson { "fstqs", 0x3c001200, 0xfc001fc0, "cmft,5(s,b)", pa10, 0},
1458429b31a2SRichard Henderson { "fadd", 0x30000600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0},
1459429b31a2SRichard Henderson { "fadd", 0x38000600, 0xfc00e720, "IfA,fB,fT", pa10, 0},
1460429b31a2SRichard Henderson { "fsub", 0x30002600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0},
1461429b31a2SRichard Henderson { "fsub", 0x38002600, 0xfc00e720, "IfA,fB,fT", pa10, 0},
1462429b31a2SRichard Henderson { "fmpy", 0x30004600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0},
1463429b31a2SRichard Henderson { "fmpy", 0x38004600, 0xfc00e720, "IfA,fB,fT", pa10, 0},
1464429b31a2SRichard Henderson { "fdiv", 0x30006600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0},
1465429b31a2SRichard Henderson { "fdiv", 0x38006600, 0xfc00e720, "IfA,fB,fT", pa10, 0},
1466429b31a2SRichard Henderson { "fsqrt", 0x30008000, 0xfc1fe7e0, "Ffa,fT", pa10, 0},
1467429b31a2SRichard Henderson { "fsqrt", 0x38008000, 0xfc1fe720, "FfA,fT", pa10, 0},
1468429b31a2SRichard Henderson { "fabs", 0x30006000, 0xfc1fe7e0, "Ffa,fT", pa10, 0},
1469429b31a2SRichard Henderson { "fabs", 0x38006000, 0xfc1fe720, "FfA,fT", pa10, 0},
1470429b31a2SRichard Henderson { "frem", 0x30008600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0},
1471429b31a2SRichard Henderson { "frem", 0x38008600, 0xfc00e720, "FfA,fB,fT", pa10, 0},
1472429b31a2SRichard Henderson { "frnd", 0x3000a000, 0xfc1fe7e0, "Ffa,fT", pa10, 0},
1473429b31a2SRichard Henderson { "frnd", 0x3800a000, 0xfc1fe720, "FfA,fT", pa10, 0},
1474429b31a2SRichard Henderson { "fcpy", 0x30004000, 0xfc1fe7e0, "Ffa,fT", pa10, 0},
1475429b31a2SRichard Henderson { "fcpy", 0x38004000, 0xfc1fe720, "FfA,fT", pa10, 0},
1476429b31a2SRichard Henderson { "fcnvff", 0x30000200, 0xfc1f87e0, "FGfa,fT", pa10, 0},
1477429b31a2SRichard Henderson { "fcnvff", 0x38000200, 0xfc1f8720, "FGfA,fT", pa10, 0},
1478429b31a2SRichard Henderson { "fcnvxf", 0x30008200, 0xfc1f87e0, "FGfa,fT", pa10, 0},
1479429b31a2SRichard Henderson { "fcnvxf", 0x38008200, 0xfc1f8720, "FGfA,fT", pa10, 0},
1480429b31a2SRichard Henderson { "fcnvfx", 0x30010200, 0xfc1f87e0, "FGfa,fT", pa10, 0},
1481429b31a2SRichard Henderson { "fcnvfx", 0x38010200, 0xfc1f8720, "FGfA,fT", pa10, 0},
1482429b31a2SRichard Henderson { "fcnvfxt", 0x30018200, 0xfc1f87e0, "FGfa,fT", pa10, 0},
1483429b31a2SRichard Henderson { "fcnvfxt", 0x38018200, 0xfc1f8720, "FGfA,fT", pa10, 0},
1484429b31a2SRichard Henderson { "fmpyfadd", 0xb8000000, 0xfc000020, "IfA,fB,fC,fT", pa20, FLAG_STRICT},
1485429b31a2SRichard Henderson { "fmpynfadd", 0xb8000020, 0xfc000020, "IfA,fB,fC,fT", pa20, FLAG_STRICT},
1486429b31a2SRichard Henderson { "fneg", 0x3000c000, 0xfc1fe7e0, "Ffa,fT", pa20, FLAG_STRICT},
1487429b31a2SRichard Henderson { "fneg", 0x3800c000, 0xfc1fe720, "IfA,fT", pa20, FLAG_STRICT},
1488429b31a2SRichard Henderson { "fnegabs", 0x3000e000, 0xfc1fe7e0, "Ffa,fT", pa20, FLAG_STRICT},
1489429b31a2SRichard Henderson { "fnegabs", 0x3800e000, 0xfc1fe720, "IfA,fT", pa20, FLAG_STRICT},
1490429b31a2SRichard Henderson { "fcnv", 0x30000200, 0xfc1c0720, "{_fa,fT", pa20, FLAG_STRICT},
1491429b31a2SRichard Henderson { "fcnv", 0x38000200, 0xfc1c0720, "FGfA,fT", pa20, FLAG_STRICT},
1492429b31a2SRichard Henderson { "fcmp", 0x30000400, 0xfc00e7e0, "F?ffa,fb", pa10, FLAG_STRICT},
1493429b31a2SRichard Henderson { "fcmp", 0x38000400, 0xfc00e720, "I?ffA,fB", pa10, FLAG_STRICT},
1494429b31a2SRichard Henderson { "fcmp", 0x30000400, 0xfc0007e0, "F?ffa,fb,h", pa20, FLAG_STRICT},
1495429b31a2SRichard Henderson { "fcmp", 0x38000400, 0xfc000720, "I?ffA,fB,h", pa20, FLAG_STRICT},
1496429b31a2SRichard Henderson { "fcmp", 0x30000400, 0xfc00e7e0, "F?ffa,fb", pa10, 0},
1497429b31a2SRichard Henderson { "fcmp", 0x38000400, 0xfc00e720, "I?ffA,fB", pa10, 0},
1498429b31a2SRichard Henderson { "xmpyu", 0x38004700, 0xfc00e720, "fX,fB,fT", pa11, 0},
1499429b31a2SRichard Henderson { "fmpyadd", 0x18000000, 0xfc000000, "Hfi,fj,fk,fl,fm", pa11, 0},
1500429b31a2SRichard Henderson { "fmpysub", 0x98000000, 0xfc000000, "Hfi,fj,fk,fl,fm", pa11, 0},
1501429b31a2SRichard Henderson { "ftest", 0x30002420, 0xffffffff, "", pa10, FLAG_STRICT},
1502429b31a2SRichard Henderson { "ftest", 0x30002420, 0xffffffe0, ",=", pa20, FLAG_STRICT},
1503429b31a2SRichard Henderson { "ftest", 0x30000420, 0xffff1fff, "m", pa20, FLAG_STRICT},
1504429b31a2SRichard Henderson { "fid", 0x30000000, 0xffffffff, "", pa11, 0},
1505429b31a2SRichard Henderson
1506429b31a2SRichard Henderson /* Performance Monitor Instructions. */
1507429b31a2SRichard Henderson
1508429b31a2SRichard Henderson { "pmdis", 0x30000280, 0xffffffdf, "N", pa20, FLAG_STRICT},
1509429b31a2SRichard Henderson { "pmenb", 0x30000680, 0xffffffff, "", pa20, FLAG_STRICT},
1510429b31a2SRichard Henderson
1511429b31a2SRichard Henderson /* Assist Instructions. */
1512429b31a2SRichard Henderson
1513429b31a2SRichard Henderson { "spop0", 0x10000000, 0xfc000600, "v,ON", pa10, 0},
1514429b31a2SRichard Henderson { "spop1", 0x10000200, 0xfc000600, "v,oNt", pa10, 0},
1515429b31a2SRichard Henderson { "spop2", 0x10000400, 0xfc000600, "v,1Nb", pa10, 0},
1516429b31a2SRichard Henderson { "spop3", 0x10000600, 0xfc000600, "v,0Nx,b", pa10, 0},
1517429b31a2SRichard Henderson { "copr", 0x30000000, 0xfc000000, "u,2N", pa10, 0},
1518429b31a2SRichard Henderson { "cldw", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT},
1519429b31a2SRichard Henderson { "cldw", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT},
1520429b31a2SRichard Henderson { "cldw", 0x24000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT},
1521429b31a2SRichard Henderson { "cldw", 0x24000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT},
1522429b31a2SRichard Henderson { "cldw", 0x24001000, 0xfc00d200, "ucocc@(b),t", pa20, FLAG_STRICT},
1523429b31a2SRichard Henderson { "cldw", 0x24001000, 0xfc001200, "ucocc@(s,b),t", pa20, FLAG_STRICT},
1524429b31a2SRichard Henderson { "cldw", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT},
1525429b31a2SRichard Henderson { "cldw", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT},
1526429b31a2SRichard Henderson { "cldw", 0x24001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT},
1527429b31a2SRichard Henderson { "cldw", 0x24001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT},
1528429b31a2SRichard Henderson { "cldd", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT},
1529429b31a2SRichard Henderson { "cldd", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT},
1530429b31a2SRichard Henderson { "cldd", 0x2c000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT},
1531429b31a2SRichard Henderson { "cldd", 0x2c000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT},
1532429b31a2SRichard Henderson { "cldd", 0x2c001000, 0xfc00d200, "ucocc@(b),t", pa20, FLAG_STRICT},
1533429b31a2SRichard Henderson { "cldd", 0x2c001000, 0xfc001200, "ucocc@(s,b),t", pa20, FLAG_STRICT},
1534429b31a2SRichard Henderson { "cldd", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT},
1535429b31a2SRichard Henderson { "cldd", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT},
1536429b31a2SRichard Henderson { "cldd", 0x2c001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT},
1537429b31a2SRichard Henderson { "cldd", 0x2c001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT},
1538429b31a2SRichard Henderson { "cstw", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT},
1539429b31a2SRichard Henderson { "cstw", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT},
1540429b31a2SRichard Henderson { "cstw", 0x24000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT},
1541429b31a2SRichard Henderson { "cstw", 0x24000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT},
1542429b31a2SRichard Henderson { "cstw", 0x24001200, 0xfc00d200, "ucocCt,@(b)", pa20, FLAG_STRICT},
1543429b31a2SRichard Henderson { "cstw", 0x24001200, 0xfc001200, "ucocCt,@(s,b)", pa20, FLAG_STRICT},
1544429b31a2SRichard Henderson { "cstw", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT},
1545429b31a2SRichard Henderson { "cstw", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT},
1546429b31a2SRichard Henderson { "cstw", 0x24001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT},
1547429b31a2SRichard Henderson { "cstw", 0x24001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT},
1548429b31a2SRichard Henderson { "cstd", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT},
1549429b31a2SRichard Henderson { "cstd", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT},
1550429b31a2SRichard Henderson { "cstd", 0x2c000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT},
1551429b31a2SRichard Henderson { "cstd", 0x2c000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT},
1552429b31a2SRichard Henderson { "cstd", 0x2c001200, 0xfc00d200, "ucocCt,@(b)", pa20, FLAG_STRICT},
1553429b31a2SRichard Henderson { "cstd", 0x2c001200, 0xfc001200, "ucocCt,@(s,b)", pa20, FLAG_STRICT},
1554429b31a2SRichard Henderson { "cstd", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT},
1555429b31a2SRichard Henderson { "cstd", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT},
1556429b31a2SRichard Henderson { "cstd", 0x2c001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT},
1557429b31a2SRichard Henderson { "cstd", 0x2c001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT},
1558429b31a2SRichard Henderson { "cldwx", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT},
1559429b31a2SRichard Henderson { "cldwx", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT},
1560429b31a2SRichard Henderson { "cldwx", 0x24000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT},
1561429b31a2SRichard Henderson { "cldwx", 0x24000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT},
1562429b31a2SRichard Henderson { "cldwx", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, 0},
1563429b31a2SRichard Henderson { "cldwx", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, 0},
1564429b31a2SRichard Henderson { "clddx", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT},
1565429b31a2SRichard Henderson { "clddx", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT},
1566429b31a2SRichard Henderson { "clddx", 0x2c000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT},
1567429b31a2SRichard Henderson { "clddx", 0x2c000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT},
1568429b31a2SRichard Henderson { "clddx", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, 0},
1569429b31a2SRichard Henderson { "clddx", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, 0},
1570429b31a2SRichard Henderson { "cstwx", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT},
1571429b31a2SRichard Henderson { "cstwx", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT},
1572429b31a2SRichard Henderson { "cstwx", 0x24000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT},
1573429b31a2SRichard Henderson { "cstwx", 0x24000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT},
1574429b31a2SRichard Henderson { "cstwx", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, 0},
1575429b31a2SRichard Henderson { "cstwx", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, 0},
1576429b31a2SRichard Henderson { "cstdx", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT},
1577429b31a2SRichard Henderson { "cstdx", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT},
1578429b31a2SRichard Henderson { "cstdx", 0x2c000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT},
1579429b31a2SRichard Henderson { "cstdx", 0x2c000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT},
1580429b31a2SRichard Henderson { "cstdx", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, 0},
1581429b31a2SRichard Henderson { "cstdx", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, 0},
1582429b31a2SRichard Henderson { "cldws", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT},
1583429b31a2SRichard Henderson { "cldws", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT},
1584429b31a2SRichard Henderson { "cldws", 0x24001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT},
1585429b31a2SRichard Henderson { "cldws", 0x24001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT},
1586429b31a2SRichard Henderson { "cldws", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, 0},
1587429b31a2SRichard Henderson { "cldws", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, 0},
1588429b31a2SRichard Henderson { "cldds", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT},
1589429b31a2SRichard Henderson { "cldds", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT},
1590429b31a2SRichard Henderson { "cldds", 0x2c001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT},
1591429b31a2SRichard Henderson { "cldds", 0x2c001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT},
1592429b31a2SRichard Henderson { "cldds", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, 0},
1593429b31a2SRichard Henderson { "cldds", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, 0},
1594429b31a2SRichard Henderson { "cstws", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT},
1595429b31a2SRichard Henderson { "cstws", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT},
1596429b31a2SRichard Henderson { "cstws", 0x24001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT},
1597429b31a2SRichard Henderson { "cstws", 0x24001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT},
1598429b31a2SRichard Henderson { "cstws", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, 0},
1599429b31a2SRichard Henderson { "cstws", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, 0},
1600429b31a2SRichard Henderson { "cstds", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT},
1601429b31a2SRichard Henderson { "cstds", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT},
1602429b31a2SRichard Henderson { "cstds", 0x2c001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT},
1603429b31a2SRichard Henderson { "cstds", 0x2c001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT},
1604429b31a2SRichard Henderson { "cstds", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, 0},
1605429b31a2SRichard Henderson { "cstds", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, 0},
1606429b31a2SRichard Henderson
1607429b31a2SRichard Henderson /* More pseudo instructions which must follow the main table. */
1608429b31a2SRichard Henderson { "call", 0xe800f000, 0xfc1ffffd, "n(b)", pa20, FLAG_STRICT},
1609429b31a2SRichard Henderson { "call", 0xe800a000, 0xffe0e000, "nW", pa10, FLAG_STRICT},
1610429b31a2SRichard Henderson { "ret", 0xe840d000, 0xfffffffd, "n", pa20, FLAG_STRICT},
1611429b31a2SRichard Henderson
16121a72469cSHelge Deller /* Opcodes assigned to QEMU, used by SeaBIOS firmware and Linux kernel */
16131a72469cSHelge Deller { "HALT QEMU", 0xfffdead0, 0xfffffffd, "n", pa10, FLAG_STRICT},
16141a72469cSHelge Deller { "RESET QEMU", 0xfffdead1, 0xfffffffd, "n", pa10, FLAG_STRICT},
16151a72469cSHelge Deller { "RESTORE SHR",0xfffdead2, 0xfffffffd, "n", pa10, FLAG_STRICT},
1616429b31a2SRichard Henderson };
1617429b31a2SRichard Henderson
1618429b31a2SRichard Henderson #define NUMOPCODES ((sizeof pa_opcodes)/(sizeof pa_opcodes[0]))
1619429b31a2SRichard Henderson
1620429b31a2SRichard Henderson /* SKV 12/18/92. Added some denotations for various operands. */
1621429b31a2SRichard Henderson
1622429b31a2SRichard Henderson #define PA_IMM11_AT_31 'i'
1623429b31a2SRichard Henderson #define PA_IMM14_AT_31 'j'
1624429b31a2SRichard Henderson #define PA_IMM21_AT_31 'k'
1625429b31a2SRichard Henderson #define PA_DISP12 'w'
1626429b31a2SRichard Henderson #define PA_DISP17 'W'
1627429b31a2SRichard Henderson
1628429b31a2SRichard Henderson #define N_HPPA_OPERAND_FORMATS 5
1629429b31a2SRichard Henderson
1630429b31a2SRichard Henderson /* Integer register names, indexed by the numbers which appear in the
1631429b31a2SRichard Henderson opcodes. */
1632429b31a2SRichard Henderson static const char *const reg_names[] =
1633429b31a2SRichard Henderson {
1634429b31a2SRichard Henderson "flags", "r1", "rp", "r3", "r4", "r5", "r6", "r7", "r8", "r9",
1635429b31a2SRichard Henderson "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19",
1636429b31a2SRichard Henderson "r20", "r21", "r22", "r23", "r24", "r25", "r26", "dp", "ret0", "ret1",
1637429b31a2SRichard Henderson "sp", "r31"
1638429b31a2SRichard Henderson };
1639429b31a2SRichard Henderson
1640429b31a2SRichard Henderson /* Floating point register names, indexed by the numbers which appear in the
1641429b31a2SRichard Henderson opcodes. */
1642429b31a2SRichard Henderson static const char *const fp_reg_names[] =
1643429b31a2SRichard Henderson {
1644429b31a2SRichard Henderson "fpsr", "fpe2", "fpe4", "fpe6",
1645429b31a2SRichard Henderson "fr4", "fr5", "fr6", "fr7", "fr8",
1646429b31a2SRichard Henderson "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
1647429b31a2SRichard Henderson "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23",
1648429b31a2SRichard Henderson "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31"
1649429b31a2SRichard Henderson };
1650429b31a2SRichard Henderson
1651429b31a2SRichard Henderson typedef unsigned int CORE_ADDR;
1652429b31a2SRichard Henderson
1653429b31a2SRichard Henderson /* Get at various relevant fields of an instruction word. */
1654429b31a2SRichard Henderson
1655429b31a2SRichard Henderson #define MASK_5 0x1f
1656429b31a2SRichard Henderson #define MASK_10 0x3ff
1657429b31a2SRichard Henderson #define MASK_11 0x7ff
1658429b31a2SRichard Henderson #define MASK_14 0x3fff
1659429b31a2SRichard Henderson #define MASK_16 0xffff
1660429b31a2SRichard Henderson #define MASK_21 0x1fffff
1661429b31a2SRichard Henderson
1662429b31a2SRichard Henderson /* These macros get bit fields using HP's numbering (MSB = 0). */
1663429b31a2SRichard Henderson
1664429b31a2SRichard Henderson #define GET_FIELD(X, FROM, TO) \
1665429b31a2SRichard Henderson ((X) >> (31 - (TO)) & ((1 << ((TO) - (FROM) + 1)) - 1))
1666429b31a2SRichard Henderson
1667429b31a2SRichard Henderson #define GET_BIT(X, WHICH) \
1668429b31a2SRichard Henderson GET_FIELD (X, WHICH, WHICH)
1669429b31a2SRichard Henderson
1670429b31a2SRichard Henderson /* Some of these have been converted to 2-d arrays because they
1671429b31a2SRichard Henderson consume less storage this way. If the maintenance becomes a
1672429b31a2SRichard Henderson problem, convert them back to const 1-d pointer arrays. */
1673429b31a2SRichard Henderson static const char *const control_reg[] =
1674429b31a2SRichard Henderson {
1675429b31a2SRichard Henderson "rctr", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
1676429b31a2SRichard Henderson "pidr1", "pidr2", "ccr", "sar", "pidr3", "pidr4",
1677429b31a2SRichard Henderson "iva", "eiem", "itmr", "pcsq", "pcoq", "iir", "isr",
1678429b31a2SRichard Henderson "ior", "ipsw", "eirr", "tr0", "tr1", "tr2", "tr3",
1679429b31a2SRichard Henderson "tr4", "tr5", "tr6", "tr7"
1680429b31a2SRichard Henderson };
1681429b31a2SRichard Henderson
1682429b31a2SRichard Henderson static const char *const compare_cond_names[] =
1683429b31a2SRichard Henderson {
1684429b31a2SRichard Henderson "", ",=", ",<", ",<=", ",<<", ",<<=", ",sv", ",od",
1685429b31a2SRichard Henderson ",tr", ",<>", ",>=", ",>", ",>>=", ",>>", ",nsv", ",ev"
1686429b31a2SRichard Henderson };
1687429b31a2SRichard Henderson static const char *const compare_cond_64_names[] =
1688429b31a2SRichard Henderson {
1689429b31a2SRichard Henderson "", ",*=", ",*<", ",*<=", ",*<<", ",*<<=", ",*sv", ",*od",
1690429b31a2SRichard Henderson ",*tr", ",*<>", ",*>=", ",*>", ",*>>=", ",*>>", ",*nsv", ",*ev"
1691429b31a2SRichard Henderson };
1692429b31a2SRichard Henderson static const char *const cmpib_cond_64_names[] =
1693429b31a2SRichard Henderson {
1694429b31a2SRichard Henderson ",*<<", ",*=", ",*<", ",*<=", ",*>>=", ",*<>", ",*>=", ",*>"
1695429b31a2SRichard Henderson };
1696429b31a2SRichard Henderson static const char *const add_cond_names[] =
1697429b31a2SRichard Henderson {
1698429b31a2SRichard Henderson "", ",=", ",<", ",<=", ",nuv", ",znv", ",sv", ",od",
1699429b31a2SRichard Henderson ",tr", ",<>", ",>=", ",>", ",uv", ",vnz", ",nsv", ",ev"
1700429b31a2SRichard Henderson };
1701429b31a2SRichard Henderson static const char *const add_cond_64_names[] =
1702429b31a2SRichard Henderson {
1703429b31a2SRichard Henderson "", ",*=", ",*<", ",*<=", ",*nuv", ",*znv", ",*sv", ",*od",
1704429b31a2SRichard Henderson ",*tr", ",*<>", ",*>=", ",*>", ",*uv", ",*vnz", ",*nsv", ",*ev"
1705429b31a2SRichard Henderson };
1706429b31a2SRichard Henderson static const char *const wide_add_cond_names[] =
1707429b31a2SRichard Henderson {
1708429b31a2SRichard Henderson "", ",=", ",<", ",<=", ",nuv", ",*=", ",*<", ",*<=",
1709429b31a2SRichard Henderson ",tr", ",<>", ",>=", ",>", ",uv", ",*<>", ",*>=", ",*>"
1710429b31a2SRichard Henderson };
1711429b31a2SRichard Henderson static const char *const logical_cond_names[] =
1712429b31a2SRichard Henderson {
1713429b31a2SRichard Henderson "", ",=", ",<", ",<=", 0, 0, 0, ",od",
1714429b31a2SRichard Henderson ",tr", ",<>", ",>=", ",>", 0, 0, 0, ",ev"};
1715429b31a2SRichard Henderson static const char *const logical_cond_64_names[] =
1716429b31a2SRichard Henderson {
1717429b31a2SRichard Henderson "", ",*=", ",*<", ",*<=", 0, 0, 0, ",*od",
1718429b31a2SRichard Henderson ",*tr", ",*<>", ",*>=", ",*>", 0, 0, 0, ",*ev"};
1719429b31a2SRichard Henderson static const char *const unit_cond_names[] =
1720429b31a2SRichard Henderson {
1721429b31a2SRichard Henderson "", ",swz", ",sbz", ",shz", ",sdc", ",swc", ",sbc", ",shc",
1722429b31a2SRichard Henderson ",tr", ",nwz", ",nbz", ",nhz", ",ndc", ",nwc", ",nbc", ",nhc"
1723429b31a2SRichard Henderson };
1724429b31a2SRichard Henderson static const char *const unit_cond_64_names[] =
1725429b31a2SRichard Henderson {
1726429b31a2SRichard Henderson "", ",*swz", ",*sbz", ",*shz", ",*sdc", ",*swc", ",*sbc", ",*shc",
1727429b31a2SRichard Henderson ",*tr", ",*nwz", ",*nbz", ",*nhz", ",*ndc", ",*nwc", ",*nbc", ",*nhc"
1728429b31a2SRichard Henderson };
1729429b31a2SRichard Henderson static const char *const shift_cond_names[] =
1730429b31a2SRichard Henderson {
1731429b31a2SRichard Henderson "", ",=", ",<", ",od", ",tr", ",<>", ",>=", ",ev"
1732429b31a2SRichard Henderson };
1733429b31a2SRichard Henderson static const char *const shift_cond_64_names[] =
1734429b31a2SRichard Henderson {
1735429b31a2SRichard Henderson "", ",*=", ",*<", ",*od", ",*tr", ",*<>", ",*>=", ",*ev"
1736429b31a2SRichard Henderson };
1737429b31a2SRichard Henderson static const char *const bb_cond_64_names[] =
1738429b31a2SRichard Henderson {
1739429b31a2SRichard Henderson ",*<", ",*>="
1740429b31a2SRichard Henderson };
1741429b31a2SRichard Henderson static const char *const index_compl_names[] = {"", ",m", ",s", ",sm"};
1742429b31a2SRichard Henderson static const char *const short_ldst_compl_names[] = {"", ",ma", "", ",mb"};
1743429b31a2SRichard Henderson static const char *const short_bytes_compl_names[] =
1744429b31a2SRichard Henderson {
1745429b31a2SRichard Henderson "", ",b,m", ",e", ",e,m"
1746429b31a2SRichard Henderson };
1747429b31a2SRichard Henderson static const char *const float_format_names[] = {",sgl", ",dbl", "", ",quad"};
1748429b31a2SRichard Henderson static const char *const fcnv_fixed_names[] = {",w", ",dw", "", ",qw"};
1749429b31a2SRichard Henderson static const char *const fcnv_ufixed_names[] = {",uw", ",udw", "", ",uqw"};
1750429b31a2SRichard Henderson static const char *const float_comp_names[] =
1751429b31a2SRichard Henderson {
1752429b31a2SRichard Henderson ",false?", ",false", ",?", ",!<=>", ",=", ",=t", ",?=", ",!<>",
1753429b31a2SRichard Henderson ",!?>=", ",<", ",?<", ",!>=", ",!?>", ",<=", ",?<=", ",!>",
1754429b31a2SRichard Henderson ",!?<=", ",>", ",?>", ",!<=", ",!?<", ",>=", ",?>=", ",!<",
1755429b31a2SRichard Henderson ",!?=", ",<>", ",!=", ",!=t", ",!?", ",<=>", ",true?", ",true"
1756429b31a2SRichard Henderson };
1757429b31a2SRichard Henderson static const char *const signed_unsigned_names[] = {",u", ",s"};
1758429b31a2SRichard Henderson static const char *const mix_half_names[] = {",l", ",r"};
1759429b31a2SRichard Henderson static const char *const saturation_names[] = {",us", ",ss", 0, ""};
1760429b31a2SRichard Henderson static const char *const read_write_names[] = {",r", ",w"};
1761429b31a2SRichard Henderson static const char *const add_compl_names[] = { 0, "", ",l", ",tsv" };
1762429b31a2SRichard Henderson
1763429b31a2SRichard Henderson /* For a bunch of different instructions form an index into a
1764429b31a2SRichard Henderson completer name table. */
1765429b31a2SRichard Henderson #define GET_COMPL(insn) (GET_FIELD (insn, 26, 26) | \
1766429b31a2SRichard Henderson GET_FIELD (insn, 18, 18) << 1)
1767429b31a2SRichard Henderson
1768429b31a2SRichard Henderson #define GET_COND(insn) (GET_FIELD ((insn), 16, 18) + \
1769429b31a2SRichard Henderson (GET_FIELD ((insn), 19, 19) ? 8 : 0))
1770429b31a2SRichard Henderson
1771429b31a2SRichard Henderson /* Utility function to print registers. Put these first, so gcc's function
1772429b31a2SRichard Henderson inlining can do its stuff. */
1773429b31a2SRichard Henderson
1774429b31a2SRichard Henderson #define fputs_filtered(STR,F) (*info->fprintf_func) (info->stream, "%s", STR)
1775429b31a2SRichard Henderson
1776429b31a2SRichard Henderson static void
fput_reg(unsigned reg,disassemble_info * info)1777429b31a2SRichard Henderson fput_reg (unsigned reg, disassemble_info *info)
1778429b31a2SRichard Henderson {
1779429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%s", reg ? reg_names[reg] : "r0");
1780429b31a2SRichard Henderson }
1781429b31a2SRichard Henderson
1782429b31a2SRichard Henderson static void
fput_fp_reg(unsigned reg,disassemble_info * info)1783429b31a2SRichard Henderson fput_fp_reg (unsigned reg, disassemble_info *info)
1784429b31a2SRichard Henderson {
1785429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%s", reg ? fp_reg_names[reg] : "fr0");
1786429b31a2SRichard Henderson }
1787429b31a2SRichard Henderson
1788429b31a2SRichard Henderson static void
fput_fp_reg_r(unsigned reg,disassemble_info * info)1789429b31a2SRichard Henderson fput_fp_reg_r (unsigned reg, disassemble_info *info)
1790429b31a2SRichard Henderson {
1791429b31a2SRichard Henderson /* Special case floating point exception registers. */
1792429b31a2SRichard Henderson if (reg < 4)
1793429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "fpe%d", reg * 2 + 1);
1794429b31a2SRichard Henderson else
17956815a8a0SPeter Maydell (*info->fprintf_func) (info->stream, "%sR", fp_reg_names[reg]);
1796429b31a2SRichard Henderson }
1797429b31a2SRichard Henderson
1798429b31a2SRichard Henderson static void
fput_creg(unsigned reg,disassemble_info * info)1799429b31a2SRichard Henderson fput_creg (unsigned reg, disassemble_info *info)
1800429b31a2SRichard Henderson {
1801429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%s", control_reg[reg]);
1802429b31a2SRichard Henderson }
1803429b31a2SRichard Henderson
1804429b31a2SRichard Henderson /* Print constants with sign. */
1805429b31a2SRichard Henderson
1806429b31a2SRichard Henderson static void
fput_const(unsigned num,disassemble_info * info)1807429b31a2SRichard Henderson fput_const (unsigned num, disassemble_info *info)
1808429b31a2SRichard Henderson {
1809429b31a2SRichard Henderson if ((int) num < 0)
1810429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "-%x", - (int) num);
1811429b31a2SRichard Henderson else
1812429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%x", num);
1813429b31a2SRichard Henderson }
1814429b31a2SRichard Henderson
1815429b31a2SRichard Henderson /* Routines to extract various sized constants out of hppa
1816429b31a2SRichard Henderson instructions. */
1817429b31a2SRichard Henderson
1818429b31a2SRichard Henderson /* Extract a 3-bit space register number from a be, ble, mtsp or mfsp. */
1819429b31a2SRichard Henderson static int
extract_3(unsigned word)1820429b31a2SRichard Henderson extract_3 (unsigned word)
1821429b31a2SRichard Henderson {
1822429b31a2SRichard Henderson return GET_FIELD (word, 18, 18) << 2 | GET_FIELD (word, 16, 17);
1823429b31a2SRichard Henderson }
1824429b31a2SRichard Henderson
1825429b31a2SRichard Henderson static int
extract_5_load(unsigned word)1826429b31a2SRichard Henderson extract_5_load (unsigned word)
1827429b31a2SRichard Henderson {
1828429b31a2SRichard Henderson return low_sign_extend (word >> 16 & MASK_5, 5);
1829429b31a2SRichard Henderson }
1830429b31a2SRichard Henderson
1831429b31a2SRichard Henderson /* Extract the immediate field from a st{bhw}s instruction. */
1832429b31a2SRichard Henderson
1833429b31a2SRichard Henderson static int
extract_5_store(unsigned word)1834429b31a2SRichard Henderson extract_5_store (unsigned word)
1835429b31a2SRichard Henderson {
1836429b31a2SRichard Henderson return low_sign_extend (word & MASK_5, 5);
1837429b31a2SRichard Henderson }
1838429b31a2SRichard Henderson
1839429b31a2SRichard Henderson /* Extract the immediate field from a break instruction. */
1840429b31a2SRichard Henderson
1841429b31a2SRichard Henderson static unsigned
extract_5r_store(unsigned word)1842429b31a2SRichard Henderson extract_5r_store (unsigned word)
1843429b31a2SRichard Henderson {
1844429b31a2SRichard Henderson return (word & MASK_5);
1845429b31a2SRichard Henderson }
1846429b31a2SRichard Henderson
1847429b31a2SRichard Henderson /* Extract the immediate field from a {sr}sm instruction. */
1848429b31a2SRichard Henderson
1849429b31a2SRichard Henderson static unsigned
extract_5R_store(unsigned word)1850429b31a2SRichard Henderson extract_5R_store (unsigned word)
1851429b31a2SRichard Henderson {
1852429b31a2SRichard Henderson return (word >> 16 & MASK_5);
1853429b31a2SRichard Henderson }
1854429b31a2SRichard Henderson
1855429b31a2SRichard Henderson /* Extract the 10 bit immediate field from a {sr}sm instruction. */
1856429b31a2SRichard Henderson
1857429b31a2SRichard Henderson static unsigned
extract_10U_store(unsigned word)1858429b31a2SRichard Henderson extract_10U_store (unsigned word)
1859429b31a2SRichard Henderson {
1860429b31a2SRichard Henderson return (word >> 16 & MASK_10);
1861429b31a2SRichard Henderson }
1862429b31a2SRichard Henderson
1863429b31a2SRichard Henderson /* Extract the immediate field from a bb instruction. */
1864429b31a2SRichard Henderson
1865429b31a2SRichard Henderson static unsigned
extract_5Q_store(unsigned word)1866429b31a2SRichard Henderson extract_5Q_store (unsigned word)
1867429b31a2SRichard Henderson {
1868429b31a2SRichard Henderson return (word >> 21 & MASK_5);
1869429b31a2SRichard Henderson }
1870429b31a2SRichard Henderson
1871429b31a2SRichard Henderson /* Extract an 11 bit immediate field. */
1872429b31a2SRichard Henderson
1873429b31a2SRichard Henderson static int
extract_11(unsigned word)1874429b31a2SRichard Henderson extract_11 (unsigned word)
1875429b31a2SRichard Henderson {
1876429b31a2SRichard Henderson return low_sign_extend (word & MASK_11, 11);
1877429b31a2SRichard Henderson }
1878429b31a2SRichard Henderson
1879429b31a2SRichard Henderson /* Extract a 14 bit immediate field. */
1880429b31a2SRichard Henderson
1881429b31a2SRichard Henderson static int
extract_14(unsigned word)1882429b31a2SRichard Henderson extract_14 (unsigned word)
1883429b31a2SRichard Henderson {
1884429b31a2SRichard Henderson return low_sign_extend (word & MASK_14, 14);
1885429b31a2SRichard Henderson }
1886429b31a2SRichard Henderson
1887429b31a2SRichard Henderson /* Extract a 16 bit immediate field (PA2.0 wide only). */
1888429b31a2SRichard Henderson
1889429b31a2SRichard Henderson static int
extract_16(unsigned word)1890429b31a2SRichard Henderson extract_16 (unsigned word)
1891429b31a2SRichard Henderson {
1892429b31a2SRichard Henderson int m15, m0, m1;
1893429b31a2SRichard Henderson
1894429b31a2SRichard Henderson m0 = GET_BIT (word, 16);
1895429b31a2SRichard Henderson m1 = GET_BIT (word, 17);
1896429b31a2SRichard Henderson m15 = GET_BIT (word, 31);
1897429b31a2SRichard Henderson word = (word >> 1) & 0x1fff;
1898429b31a2SRichard Henderson word = word | (m15 << 15) | ((m15 ^ m0) << 14) | ((m15 ^ m1) << 13);
1899429b31a2SRichard Henderson return sign_extend (word, 16);
1900429b31a2SRichard Henderson }
1901429b31a2SRichard Henderson
1902429b31a2SRichard Henderson /* Extract a 21 bit constant. */
1903429b31a2SRichard Henderson
1904429b31a2SRichard Henderson static int
extract_21(unsigned word)1905429b31a2SRichard Henderson extract_21 (unsigned word)
1906429b31a2SRichard Henderson {
1907429b31a2SRichard Henderson int val;
1908429b31a2SRichard Henderson
1909429b31a2SRichard Henderson word &= MASK_21;
1910429b31a2SRichard Henderson word <<= 11;
1911429b31a2SRichard Henderson val = GET_FIELD (word, 20, 20);
1912429b31a2SRichard Henderson val <<= 11;
1913429b31a2SRichard Henderson val |= GET_FIELD (word, 9, 19);
1914429b31a2SRichard Henderson val <<= 2;
1915429b31a2SRichard Henderson val |= GET_FIELD (word, 5, 6);
1916429b31a2SRichard Henderson val <<= 5;
1917429b31a2SRichard Henderson val |= GET_FIELD (word, 0, 4);
1918429b31a2SRichard Henderson val <<= 2;
1919429b31a2SRichard Henderson val |= GET_FIELD (word, 7, 8);
1920429b31a2SRichard Henderson return sign_extend (val, 21) << 11;
1921429b31a2SRichard Henderson }
1922429b31a2SRichard Henderson
1923429b31a2SRichard Henderson /* Extract a 12 bit constant from branch instructions. */
1924429b31a2SRichard Henderson
1925429b31a2SRichard Henderson static int
extract_12(unsigned word)1926429b31a2SRichard Henderson extract_12 (unsigned word)
1927429b31a2SRichard Henderson {
1928429b31a2SRichard Henderson return sign_extend (GET_FIELD (word, 19, 28)
1929429b31a2SRichard Henderson | GET_FIELD (word, 29, 29) << 10
1930429b31a2SRichard Henderson | (word & 0x1) << 11, 12) << 2;
1931429b31a2SRichard Henderson }
1932429b31a2SRichard Henderson
1933429b31a2SRichard Henderson /* Extract a 17 bit constant from branch instructions, returning the
1934429b31a2SRichard Henderson 19 bit signed value. */
1935429b31a2SRichard Henderson
1936429b31a2SRichard Henderson static int
extract_17(unsigned word)1937429b31a2SRichard Henderson extract_17 (unsigned word)
1938429b31a2SRichard Henderson {
1939429b31a2SRichard Henderson return sign_extend (GET_FIELD (word, 19, 28)
1940429b31a2SRichard Henderson | GET_FIELD (word, 29, 29) << 10
1941429b31a2SRichard Henderson | GET_FIELD (word, 11, 15) << 11
1942429b31a2SRichard Henderson | (word & 0x1) << 16, 17) << 2;
1943429b31a2SRichard Henderson }
1944429b31a2SRichard Henderson
1945429b31a2SRichard Henderson static int
extract_22(unsigned word)1946429b31a2SRichard Henderson extract_22 (unsigned word)
1947429b31a2SRichard Henderson {
1948429b31a2SRichard Henderson return sign_extend (GET_FIELD (word, 19, 28)
1949429b31a2SRichard Henderson | GET_FIELD (word, 29, 29) << 10
1950429b31a2SRichard Henderson | GET_FIELD (word, 11, 15) << 11
1951429b31a2SRichard Henderson | GET_FIELD (word, 6, 10) << 16
1952429b31a2SRichard Henderson | (word & 0x1) << 21, 22) << 2;
1953429b31a2SRichard Henderson }
1954429b31a2SRichard Henderson
1955429b31a2SRichard Henderson /* Print one instruction. */
1956429b31a2SRichard Henderson
1957429b31a2SRichard Henderson int
print_insn_hppa(bfd_vma memaddr,disassemble_info * info)1958429b31a2SRichard Henderson print_insn_hppa (bfd_vma memaddr, disassemble_info *info)
1959429b31a2SRichard Henderson {
1960429b31a2SRichard Henderson bfd_byte buffer[4];
1961429b31a2SRichard Henderson unsigned int insn, i;
1962429b31a2SRichard Henderson
1963429b31a2SRichard Henderson {
1964429b31a2SRichard Henderson int status =
1965429b31a2SRichard Henderson (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info);
1966429b31a2SRichard Henderson if (status != 0)
1967429b31a2SRichard Henderson {
1968429b31a2SRichard Henderson (*info->memory_error_func) (status, memaddr, info);
1969429b31a2SRichard Henderson return -1;
1970429b31a2SRichard Henderson }
1971429b31a2SRichard Henderson }
1972429b31a2SRichard Henderson
1973429b31a2SRichard Henderson insn = bfd_getb32 (buffer);
1974429b31a2SRichard Henderson
1975*7cff154bSAlex Bennée if (info->show_opcodes) {
19762f926bfdSHelge Deller info->fprintf_func(info->stream, " %02x %02x %02x %02x ",
19772f926bfdSHelge Deller (insn >> 24) & 0xff, (insn >> 16) & 0xff,
19782f926bfdSHelge Deller (insn >> 8) & 0xff, insn & 0xff);
1979*7cff154bSAlex Bennée }
19802f926bfdSHelge Deller
1981429b31a2SRichard Henderson for (i = 0; i < NUMOPCODES; ++i)
1982429b31a2SRichard Henderson {
1983429b31a2SRichard Henderson const struct pa_opcode *opcode = &pa_opcodes[i];
1984429b31a2SRichard Henderson
1985429b31a2SRichard Henderson if ((insn & opcode->mask) == opcode->match)
1986429b31a2SRichard Henderson {
1987429b31a2SRichard Henderson const char *s;
1988429b31a2SRichard Henderson #ifndef BFD64
1989429b31a2SRichard Henderson if (opcode->arch == pa20w)
1990429b31a2SRichard Henderson continue;
1991429b31a2SRichard Henderson #endif
1992429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%s", opcode->name);
1993429b31a2SRichard Henderson
1994429b31a2SRichard Henderson if (!strchr ("cfCY?-+nHNZFIuv{", opcode->args[0]))
1995429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, " ");
1996429b31a2SRichard Henderson for (s = opcode->args; *s != '\0'; ++s)
1997429b31a2SRichard Henderson {
1998429b31a2SRichard Henderson switch (*s)
1999429b31a2SRichard Henderson {
2000429b31a2SRichard Henderson case 'x':
2001429b31a2SRichard Henderson fput_reg (GET_FIELD (insn, 11, 15), info);
2002429b31a2SRichard Henderson break;
2003429b31a2SRichard Henderson case 'a':
2004429b31a2SRichard Henderson case 'b':
2005429b31a2SRichard Henderson fput_reg (GET_FIELD (insn, 6, 10), info);
2006429b31a2SRichard Henderson break;
2007429b31a2SRichard Henderson case '^':
2008429b31a2SRichard Henderson fput_creg (GET_FIELD (insn, 6, 10), info);
2009429b31a2SRichard Henderson break;
2010429b31a2SRichard Henderson case 't':
2011429b31a2SRichard Henderson fput_reg (GET_FIELD (insn, 27, 31), info);
2012429b31a2SRichard Henderson break;
2013429b31a2SRichard Henderson
2014429b31a2SRichard Henderson /* Handle floating point registers. */
2015429b31a2SRichard Henderson case 'f':
2016429b31a2SRichard Henderson switch (*++s)
2017429b31a2SRichard Henderson {
2018429b31a2SRichard Henderson case 't':
2019429b31a2SRichard Henderson fput_fp_reg (GET_FIELD (insn, 27, 31), info);
2020429b31a2SRichard Henderson break;
2021429b31a2SRichard Henderson case 'T':
2022429b31a2SRichard Henderson if (GET_FIELD (insn, 25, 25))
2023429b31a2SRichard Henderson fput_fp_reg_r (GET_FIELD (insn, 27, 31), info);
2024429b31a2SRichard Henderson else
2025429b31a2SRichard Henderson fput_fp_reg (GET_FIELD (insn, 27, 31), info);
2026429b31a2SRichard Henderson break;
2027429b31a2SRichard Henderson case 'a':
2028429b31a2SRichard Henderson if (GET_FIELD (insn, 25, 25))
2029429b31a2SRichard Henderson fput_fp_reg_r (GET_FIELD (insn, 6, 10), info);
2030429b31a2SRichard Henderson else
2031429b31a2SRichard Henderson fput_fp_reg (GET_FIELD (insn, 6, 10), info);
2032429b31a2SRichard Henderson break;
2033429b31a2SRichard Henderson
20342dbb1308Szhaolichang /* 'fA' will not generate a space before the register
2035429b31a2SRichard Henderson name. Normally that is fine. Except that it
2036429b31a2SRichard Henderson causes problems with xmpyu which has no FP format
2037429b31a2SRichard Henderson completer. */
2038429b31a2SRichard Henderson case 'X':
2039429b31a2SRichard Henderson fputs_filtered (" ", info);
2040429b31a2SRichard Henderson /* FALLTHRU */
2041429b31a2SRichard Henderson
2042429b31a2SRichard Henderson case 'A':
2043429b31a2SRichard Henderson if (GET_FIELD (insn, 24, 24))
2044429b31a2SRichard Henderson fput_fp_reg_r (GET_FIELD (insn, 6, 10), info);
2045429b31a2SRichard Henderson else
2046429b31a2SRichard Henderson fput_fp_reg (GET_FIELD (insn, 6, 10), info);
2047429b31a2SRichard Henderson break;
2048429b31a2SRichard Henderson case 'b':
2049429b31a2SRichard Henderson if (GET_FIELD (insn, 25, 25))
2050429b31a2SRichard Henderson fput_fp_reg_r (GET_FIELD (insn, 11, 15), info);
2051429b31a2SRichard Henderson else
2052429b31a2SRichard Henderson fput_fp_reg (GET_FIELD (insn, 11, 15), info);
2053429b31a2SRichard Henderson break;
2054429b31a2SRichard Henderson case 'B':
2055429b31a2SRichard Henderson if (GET_FIELD (insn, 19, 19))
2056429b31a2SRichard Henderson fput_fp_reg_r (GET_FIELD (insn, 11, 15), info);
2057429b31a2SRichard Henderson else
2058429b31a2SRichard Henderson fput_fp_reg (GET_FIELD (insn, 11, 15), info);
2059429b31a2SRichard Henderson break;
2060429b31a2SRichard Henderson case 'C':
2061429b31a2SRichard Henderson {
2062429b31a2SRichard Henderson int reg = GET_FIELD (insn, 21, 22);
2063429b31a2SRichard Henderson reg |= GET_FIELD (insn, 16, 18) << 2;
2064429b31a2SRichard Henderson if (GET_FIELD (insn, 23, 23) != 0)
2065429b31a2SRichard Henderson fput_fp_reg_r (reg, info);
2066429b31a2SRichard Henderson else
2067429b31a2SRichard Henderson fput_fp_reg (reg, info);
2068429b31a2SRichard Henderson break;
2069429b31a2SRichard Henderson }
2070429b31a2SRichard Henderson case 'i':
2071429b31a2SRichard Henderson {
2072429b31a2SRichard Henderson int reg = GET_FIELD (insn, 6, 10);
2073429b31a2SRichard Henderson
2074429b31a2SRichard Henderson reg |= (GET_FIELD (insn, 26, 26) << 4);
2075429b31a2SRichard Henderson fput_fp_reg (reg, info);
2076429b31a2SRichard Henderson break;
2077429b31a2SRichard Henderson }
2078429b31a2SRichard Henderson case 'j':
2079429b31a2SRichard Henderson {
2080429b31a2SRichard Henderson int reg = GET_FIELD (insn, 11, 15);
2081429b31a2SRichard Henderson
2082429b31a2SRichard Henderson reg |= (GET_FIELD (insn, 26, 26) << 4);
2083429b31a2SRichard Henderson fput_fp_reg (reg, info);
2084429b31a2SRichard Henderson break;
2085429b31a2SRichard Henderson }
2086429b31a2SRichard Henderson case 'k':
2087429b31a2SRichard Henderson {
2088429b31a2SRichard Henderson int reg = GET_FIELD (insn, 27, 31);
2089429b31a2SRichard Henderson
2090429b31a2SRichard Henderson reg |= (GET_FIELD (insn, 26, 26) << 4);
2091429b31a2SRichard Henderson fput_fp_reg (reg, info);
2092429b31a2SRichard Henderson break;
2093429b31a2SRichard Henderson }
2094429b31a2SRichard Henderson case 'l':
2095429b31a2SRichard Henderson {
2096429b31a2SRichard Henderson int reg = GET_FIELD (insn, 21, 25);
2097429b31a2SRichard Henderson
2098429b31a2SRichard Henderson reg |= (GET_FIELD (insn, 26, 26) << 4);
2099429b31a2SRichard Henderson fput_fp_reg (reg, info);
2100429b31a2SRichard Henderson break;
2101429b31a2SRichard Henderson }
2102429b31a2SRichard Henderson case 'm':
2103429b31a2SRichard Henderson {
2104429b31a2SRichard Henderson int reg = GET_FIELD (insn, 16, 20);
2105429b31a2SRichard Henderson
2106429b31a2SRichard Henderson reg |= (GET_FIELD (insn, 26, 26) << 4);
2107429b31a2SRichard Henderson fput_fp_reg (reg, info);
2108429b31a2SRichard Henderson break;
2109429b31a2SRichard Henderson }
2110429b31a2SRichard Henderson
2111429b31a2SRichard Henderson /* 'fe' will not generate a space before the register
2112429b31a2SRichard Henderson name. Normally that is fine. Except that it
2113429b31a2SRichard Henderson causes problems with fstw fe,y(b) which has no FP
2114429b31a2SRichard Henderson format completer. */
2115429b31a2SRichard Henderson case 'E':
2116429b31a2SRichard Henderson fputs_filtered (" ", info);
2117429b31a2SRichard Henderson /* FALLTHRU */
2118429b31a2SRichard Henderson
2119429b31a2SRichard Henderson case 'e':
2120429b31a2SRichard Henderson if (GET_FIELD (insn, 30, 30))
2121429b31a2SRichard Henderson fput_fp_reg_r (GET_FIELD (insn, 11, 15), info);
2122429b31a2SRichard Henderson else
2123429b31a2SRichard Henderson fput_fp_reg (GET_FIELD (insn, 11, 15), info);
2124429b31a2SRichard Henderson break;
2125429b31a2SRichard Henderson case 'x':
2126429b31a2SRichard Henderson fput_fp_reg (GET_FIELD (insn, 11, 15), info);
2127429b31a2SRichard Henderson break;
2128429b31a2SRichard Henderson }
2129429b31a2SRichard Henderson break;
2130429b31a2SRichard Henderson
2131429b31a2SRichard Henderson case '5':
2132429b31a2SRichard Henderson fput_const (extract_5_load (insn), info);
2133429b31a2SRichard Henderson break;
2134429b31a2SRichard Henderson case 's':
2135429b31a2SRichard Henderson {
2136429b31a2SRichard Henderson int space = GET_FIELD (insn, 16, 17);
2137429b31a2SRichard Henderson /* Zero means implicit addressing, not use of sr0. */
2138429b31a2SRichard Henderson if (space != 0)
2139429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "sr%d", space);
2140429b31a2SRichard Henderson }
2141429b31a2SRichard Henderson break;
2142429b31a2SRichard Henderson
2143429b31a2SRichard Henderson case 'S':
2144429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "sr%d",
2145429b31a2SRichard Henderson extract_3 (insn));
2146429b31a2SRichard Henderson break;
2147429b31a2SRichard Henderson
2148429b31a2SRichard Henderson /* Handle completers. */
2149429b31a2SRichard Henderson case 'c':
2150429b31a2SRichard Henderson switch (*++s)
2151429b31a2SRichard Henderson {
2152429b31a2SRichard Henderson case 'x':
2153429b31a2SRichard Henderson (*info->fprintf_func)
2154429b31a2SRichard Henderson (info->stream, "%s",
2155429b31a2SRichard Henderson index_compl_names[GET_COMPL (insn)]);
2156429b31a2SRichard Henderson break;
2157429b31a2SRichard Henderson case 'X':
2158429b31a2SRichard Henderson (*info->fprintf_func)
2159429b31a2SRichard Henderson (info->stream, "%s ",
2160429b31a2SRichard Henderson index_compl_names[GET_COMPL (insn)]);
2161429b31a2SRichard Henderson break;
2162429b31a2SRichard Henderson case 'm':
2163429b31a2SRichard Henderson (*info->fprintf_func)
2164429b31a2SRichard Henderson (info->stream, "%s",
2165429b31a2SRichard Henderson short_ldst_compl_names[GET_COMPL (insn)]);
2166429b31a2SRichard Henderson break;
2167429b31a2SRichard Henderson case 'M':
2168429b31a2SRichard Henderson (*info->fprintf_func)
2169429b31a2SRichard Henderson (info->stream, "%s ",
2170429b31a2SRichard Henderson short_ldst_compl_names[GET_COMPL (insn)]);
2171429b31a2SRichard Henderson break;
2172429b31a2SRichard Henderson case 'A':
2173429b31a2SRichard Henderson (*info->fprintf_func)
2174429b31a2SRichard Henderson (info->stream, "%s ",
2175429b31a2SRichard Henderson short_bytes_compl_names[GET_COMPL (insn)]);
2176429b31a2SRichard Henderson break;
2177429b31a2SRichard Henderson case 's':
2178429b31a2SRichard Henderson (*info->fprintf_func)
2179429b31a2SRichard Henderson (info->stream, "%s",
2180429b31a2SRichard Henderson short_bytes_compl_names[GET_COMPL (insn)]);
2181429b31a2SRichard Henderson break;
2182429b31a2SRichard Henderson case 'c':
2183429b31a2SRichard Henderson case 'C':
2184429b31a2SRichard Henderson switch (GET_FIELD (insn, 20, 21))
2185429b31a2SRichard Henderson {
2186429b31a2SRichard Henderson case 1:
2187429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",bc ");
2188429b31a2SRichard Henderson break;
2189429b31a2SRichard Henderson case 2:
2190429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",sl ");
2191429b31a2SRichard Henderson break;
2192429b31a2SRichard Henderson default:
2193429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, " ");
2194429b31a2SRichard Henderson }
2195429b31a2SRichard Henderson break;
2196429b31a2SRichard Henderson case 'd':
2197429b31a2SRichard Henderson switch (GET_FIELD (insn, 20, 21))
2198429b31a2SRichard Henderson {
2199429b31a2SRichard Henderson case 1:
2200429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",co ");
2201429b31a2SRichard Henderson break;
2202429b31a2SRichard Henderson default:
2203429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, " ");
2204429b31a2SRichard Henderson }
2205429b31a2SRichard Henderson break;
2206429b31a2SRichard Henderson case 'o':
2207429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",o");
2208429b31a2SRichard Henderson break;
2209429b31a2SRichard Henderson case 'g':
2210429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",gate");
2211429b31a2SRichard Henderson break;
2212429b31a2SRichard Henderson case 'p':
2213429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",l,push");
2214429b31a2SRichard Henderson break;
2215429b31a2SRichard Henderson case 'P':
2216429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",pop");
2217429b31a2SRichard Henderson break;
2218429b31a2SRichard Henderson case 'l':
2219429b31a2SRichard Henderson case 'L':
2220429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",l");
2221429b31a2SRichard Henderson break;
2222429b31a2SRichard Henderson case 'w':
2223429b31a2SRichard Henderson (*info->fprintf_func)
2224429b31a2SRichard Henderson (info->stream, "%s ",
2225429b31a2SRichard Henderson read_write_names[GET_FIELD (insn, 25, 25)]);
2226429b31a2SRichard Henderson break;
2227429b31a2SRichard Henderson case 'W':
2228429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",w ");
2229429b31a2SRichard Henderson break;
2230429b31a2SRichard Henderson case 'r':
2231429b31a2SRichard Henderson if (GET_FIELD (insn, 23, 26) == 5)
2232429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",r");
2233429b31a2SRichard Henderson break;
2234429b31a2SRichard Henderson case 'Z':
2235429b31a2SRichard Henderson if (GET_FIELD (insn, 26, 26))
2236429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",m ");
2237429b31a2SRichard Henderson else
2238429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, " ");
2239429b31a2SRichard Henderson break;
2240429b31a2SRichard Henderson case 'i':
2241429b31a2SRichard Henderson if (GET_FIELD (insn, 25, 25))
2242429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",i");
2243429b31a2SRichard Henderson break;
2244429b31a2SRichard Henderson case 'z':
2245429b31a2SRichard Henderson if (!GET_FIELD (insn, 21, 21))
2246429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",z");
2247429b31a2SRichard Henderson break;
2248429b31a2SRichard Henderson case 'a':
2249429b31a2SRichard Henderson (*info->fprintf_func)
2250429b31a2SRichard Henderson (info->stream, "%s",
2251429b31a2SRichard Henderson add_compl_names[GET_FIELD (insn, 20, 21)]);
2252429b31a2SRichard Henderson break;
2253429b31a2SRichard Henderson case 'Y':
2254429b31a2SRichard Henderson (*info->fprintf_func)
2255429b31a2SRichard Henderson (info->stream, ",dc%s",
2256429b31a2SRichard Henderson add_compl_names[GET_FIELD (insn, 20, 21)]);
2257429b31a2SRichard Henderson break;
2258429b31a2SRichard Henderson case 'y':
2259429b31a2SRichard Henderson (*info->fprintf_func)
2260429b31a2SRichard Henderson (info->stream, ",c%s",
2261429b31a2SRichard Henderson add_compl_names[GET_FIELD (insn, 20, 21)]);
2262429b31a2SRichard Henderson break;
2263429b31a2SRichard Henderson case 'v':
2264429b31a2SRichard Henderson if (GET_FIELD (insn, 20, 20))
2265429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",tsv");
2266429b31a2SRichard Henderson break;
2267429b31a2SRichard Henderson case 't':
2268429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",tc");
2269429b31a2SRichard Henderson if (GET_FIELD (insn, 20, 20))
2270429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",tsv");
2271429b31a2SRichard Henderson break;
2272429b31a2SRichard Henderson case 'B':
2273429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",db");
2274429b31a2SRichard Henderson if (GET_FIELD (insn, 20, 20))
2275429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",tsv");
2276429b31a2SRichard Henderson break;
2277429b31a2SRichard Henderson case 'b':
2278429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",b");
2279429b31a2SRichard Henderson if (GET_FIELD (insn, 20, 20))
2280429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",tsv");
2281429b31a2SRichard Henderson break;
2282429b31a2SRichard Henderson case 'T':
2283429b31a2SRichard Henderson if (GET_FIELD (insn, 25, 25))
2284429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",tc");
2285429b31a2SRichard Henderson break;
2286429b31a2SRichard Henderson case 'S':
2287429b31a2SRichard Henderson /* EXTRD/W has a following condition. */
2288429b31a2SRichard Henderson if (*(s + 1) == '?')
2289429b31a2SRichard Henderson (*info->fprintf_func)
2290429b31a2SRichard Henderson (info->stream, "%s",
2291429b31a2SRichard Henderson signed_unsigned_names[GET_FIELD (insn, 21, 21)]);
2292429b31a2SRichard Henderson else
2293429b31a2SRichard Henderson (*info->fprintf_func)
2294429b31a2SRichard Henderson (info->stream, "%s ",
2295429b31a2SRichard Henderson signed_unsigned_names[GET_FIELD (insn, 21, 21)]);
2296429b31a2SRichard Henderson break;
2297429b31a2SRichard Henderson case 'h':
2298429b31a2SRichard Henderson (*info->fprintf_func)
2299429b31a2SRichard Henderson (info->stream, "%s",
2300429b31a2SRichard Henderson mix_half_names[GET_FIELD (insn, 17, 17)]);
2301429b31a2SRichard Henderson break;
2302429b31a2SRichard Henderson case 'H':
2303429b31a2SRichard Henderson (*info->fprintf_func)
2304429b31a2SRichard Henderson (info->stream, "%s ",
2305429b31a2SRichard Henderson saturation_names[GET_FIELD (insn, 24, 25)]);
2306429b31a2SRichard Henderson break;
2307429b31a2SRichard Henderson case '*':
2308429b31a2SRichard Henderson (*info->fprintf_func)
2309429b31a2SRichard Henderson (info->stream, ",%d%d%d%d ",
2310429b31a2SRichard Henderson GET_FIELD (insn, 17, 18), GET_FIELD (insn, 20, 21),
2311429b31a2SRichard Henderson GET_FIELD (insn, 22, 23), GET_FIELD (insn, 24, 25));
2312429b31a2SRichard Henderson break;
2313429b31a2SRichard Henderson
2314429b31a2SRichard Henderson case 'q':
2315429b31a2SRichard Henderson {
2316429b31a2SRichard Henderson int m, a;
2317429b31a2SRichard Henderson
2318429b31a2SRichard Henderson m = GET_FIELD (insn, 28, 28);
2319429b31a2SRichard Henderson a = GET_FIELD (insn, 29, 29);
2320429b31a2SRichard Henderson
2321429b31a2SRichard Henderson if (m && !a)
2322429b31a2SRichard Henderson fputs_filtered (",ma ", info);
2323429b31a2SRichard Henderson else if (m && a)
2324429b31a2SRichard Henderson fputs_filtered (",mb ", info);
2325429b31a2SRichard Henderson else
2326429b31a2SRichard Henderson fputs_filtered (" ", info);
2327429b31a2SRichard Henderson break;
2328429b31a2SRichard Henderson }
2329429b31a2SRichard Henderson
2330429b31a2SRichard Henderson case 'J':
2331429b31a2SRichard Henderson {
2332429b31a2SRichard Henderson int opc = GET_FIELD (insn, 0, 5);
2333429b31a2SRichard Henderson
2334429b31a2SRichard Henderson if (opc == 0x16 || opc == 0x1e)
2335429b31a2SRichard Henderson {
2336429b31a2SRichard Henderson if (GET_FIELD (insn, 29, 29) == 0)
2337429b31a2SRichard Henderson fputs_filtered (",ma ", info);
2338429b31a2SRichard Henderson else
2339429b31a2SRichard Henderson fputs_filtered (",mb ", info);
2340429b31a2SRichard Henderson }
2341429b31a2SRichard Henderson else
2342429b31a2SRichard Henderson fputs_filtered (" ", info);
2343429b31a2SRichard Henderson break;
2344429b31a2SRichard Henderson }
2345429b31a2SRichard Henderson
2346429b31a2SRichard Henderson case 'e':
2347429b31a2SRichard Henderson {
2348429b31a2SRichard Henderson int opc = GET_FIELD (insn, 0, 5);
2349429b31a2SRichard Henderson
2350429b31a2SRichard Henderson if (opc == 0x13 || opc == 0x1b)
2351429b31a2SRichard Henderson {
2352429b31a2SRichard Henderson if (GET_FIELD (insn, 18, 18) == 1)
2353429b31a2SRichard Henderson fputs_filtered (",mb ", info);
2354429b31a2SRichard Henderson else
2355429b31a2SRichard Henderson fputs_filtered (",ma ", info);
2356429b31a2SRichard Henderson }
2357429b31a2SRichard Henderson else if (opc == 0x17 || opc == 0x1f)
2358429b31a2SRichard Henderson {
2359429b31a2SRichard Henderson if (GET_FIELD (insn, 31, 31) == 1)
2360429b31a2SRichard Henderson fputs_filtered (",ma ", info);
2361429b31a2SRichard Henderson else
2362429b31a2SRichard Henderson fputs_filtered (",mb ", info);
2363429b31a2SRichard Henderson }
2364429b31a2SRichard Henderson else
2365429b31a2SRichard Henderson fputs_filtered (" ", info);
2366429b31a2SRichard Henderson
2367429b31a2SRichard Henderson break;
2368429b31a2SRichard Henderson }
2369429b31a2SRichard Henderson }
2370429b31a2SRichard Henderson break;
2371429b31a2SRichard Henderson
2372429b31a2SRichard Henderson /* Handle conditions. */
2373429b31a2SRichard Henderson case '?':
2374429b31a2SRichard Henderson {
2375429b31a2SRichard Henderson s++;
2376429b31a2SRichard Henderson switch (*s)
2377429b31a2SRichard Henderson {
2378429b31a2SRichard Henderson case 'f':
2379429b31a2SRichard Henderson (*info->fprintf_func)
2380429b31a2SRichard Henderson (info->stream, "%s ",
2381429b31a2SRichard Henderson float_comp_names[GET_FIELD (insn, 27, 31)]);
2382429b31a2SRichard Henderson break;
2383429b31a2SRichard Henderson
2384429b31a2SRichard Henderson /* These four conditions are for the set of instructions
2385429b31a2SRichard Henderson which distinguish true/false conditions by opcode
2386429b31a2SRichard Henderson rather than by the 'f' bit (sigh): comb, comib,
2387429b31a2SRichard Henderson addb, addib. */
2388429b31a2SRichard Henderson case 't':
2389429b31a2SRichard Henderson fputs_filtered
2390429b31a2SRichard Henderson (compare_cond_names[GET_FIELD (insn, 16, 18)], info);
2391429b31a2SRichard Henderson break;
2392429b31a2SRichard Henderson case 'n':
2393429b31a2SRichard Henderson fputs_filtered
2394429b31a2SRichard Henderson (compare_cond_names[GET_FIELD (insn, 16, 18)
2395429b31a2SRichard Henderson + GET_FIELD (insn, 4, 4) * 8],
2396429b31a2SRichard Henderson info);
2397429b31a2SRichard Henderson break;
2398429b31a2SRichard Henderson case 'N':
2399429b31a2SRichard Henderson fputs_filtered
2400429b31a2SRichard Henderson (compare_cond_64_names[GET_FIELD (insn, 16, 18)
2401429b31a2SRichard Henderson + GET_FIELD (insn, 2, 2) * 8],
2402429b31a2SRichard Henderson info);
2403429b31a2SRichard Henderson break;
2404429b31a2SRichard Henderson case 'Q':
2405429b31a2SRichard Henderson fputs_filtered
2406429b31a2SRichard Henderson (cmpib_cond_64_names[GET_FIELD (insn, 16, 18)],
2407429b31a2SRichard Henderson info);
2408429b31a2SRichard Henderson break;
2409429b31a2SRichard Henderson case '@':
2410429b31a2SRichard Henderson fputs_filtered
2411429b31a2SRichard Henderson (add_cond_names[GET_FIELD (insn, 16, 18)
2412429b31a2SRichard Henderson + GET_FIELD (insn, 4, 4) * 8],
2413429b31a2SRichard Henderson info);
2414429b31a2SRichard Henderson break;
2415429b31a2SRichard Henderson case 's':
2416429b31a2SRichard Henderson (*info->fprintf_func)
2417429b31a2SRichard Henderson (info->stream, "%s ",
2418429b31a2SRichard Henderson compare_cond_names[GET_COND (insn)]);
2419429b31a2SRichard Henderson break;
2420429b31a2SRichard Henderson case 'S':
2421429b31a2SRichard Henderson (*info->fprintf_func)
2422429b31a2SRichard Henderson (info->stream, "%s ",
2423429b31a2SRichard Henderson compare_cond_64_names[GET_COND (insn)]);
2424429b31a2SRichard Henderson break;
2425429b31a2SRichard Henderson case 'a':
2426429b31a2SRichard Henderson (*info->fprintf_func)
2427429b31a2SRichard Henderson (info->stream, "%s ",
2428429b31a2SRichard Henderson add_cond_names[GET_COND (insn)]);
2429429b31a2SRichard Henderson break;
2430429b31a2SRichard Henderson case 'A':
2431429b31a2SRichard Henderson (*info->fprintf_func)
2432429b31a2SRichard Henderson (info->stream, "%s ",
2433429b31a2SRichard Henderson add_cond_64_names[GET_COND (insn)]);
2434429b31a2SRichard Henderson break;
2435429b31a2SRichard Henderson case 'd':
2436429b31a2SRichard Henderson (*info->fprintf_func)
2437429b31a2SRichard Henderson (info->stream, "%s",
2438429b31a2SRichard Henderson add_cond_names[GET_FIELD (insn, 16, 18)]);
2439429b31a2SRichard Henderson break;
2440429b31a2SRichard Henderson
2441429b31a2SRichard Henderson case 'W':
2442429b31a2SRichard Henderson (*info->fprintf_func)
2443429b31a2SRichard Henderson (info->stream, "%s",
2444429b31a2SRichard Henderson wide_add_cond_names[GET_FIELD (insn, 16, 18) +
2445429b31a2SRichard Henderson GET_FIELD (insn, 4, 4) * 8]);
2446429b31a2SRichard Henderson break;
2447429b31a2SRichard Henderson
2448429b31a2SRichard Henderson case 'l':
2449429b31a2SRichard Henderson (*info->fprintf_func)
2450429b31a2SRichard Henderson (info->stream, "%s ",
2451429b31a2SRichard Henderson logical_cond_names[GET_COND (insn)]);
2452429b31a2SRichard Henderson break;
2453429b31a2SRichard Henderson case 'L':
2454429b31a2SRichard Henderson (*info->fprintf_func)
2455429b31a2SRichard Henderson (info->stream, "%s ",
2456429b31a2SRichard Henderson logical_cond_64_names[GET_COND (insn)]);
2457429b31a2SRichard Henderson break;
2458429b31a2SRichard Henderson case 'u':
2459429b31a2SRichard Henderson (*info->fprintf_func)
2460429b31a2SRichard Henderson (info->stream, "%s ",
2461429b31a2SRichard Henderson unit_cond_names[GET_COND (insn)]);
2462429b31a2SRichard Henderson break;
2463429b31a2SRichard Henderson case 'U':
2464429b31a2SRichard Henderson (*info->fprintf_func)
2465429b31a2SRichard Henderson (info->stream, "%s ",
2466429b31a2SRichard Henderson unit_cond_64_names[GET_COND (insn)]);
2467429b31a2SRichard Henderson break;
2468429b31a2SRichard Henderson case 'y':
2469429b31a2SRichard Henderson case 'x':
2470429b31a2SRichard Henderson case 'b':
2471429b31a2SRichard Henderson (*info->fprintf_func)
2472429b31a2SRichard Henderson (info->stream, "%s",
2473429b31a2SRichard Henderson shift_cond_names[GET_FIELD (insn, 16, 18)]);
2474429b31a2SRichard Henderson
2475429b31a2SRichard Henderson /* If the next character in args is 'n', it will handle
2476429b31a2SRichard Henderson putting out the space. */
2477429b31a2SRichard Henderson if (s[1] != 'n')
2478429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, " ");
2479429b31a2SRichard Henderson break;
2480429b31a2SRichard Henderson case 'X':
2481429b31a2SRichard Henderson (*info->fprintf_func)
2482429b31a2SRichard Henderson (info->stream, "%s ",
2483429b31a2SRichard Henderson shift_cond_64_names[GET_FIELD (insn, 16, 18)]);
2484429b31a2SRichard Henderson break;
2485429b31a2SRichard Henderson case 'B':
2486429b31a2SRichard Henderson (*info->fprintf_func)
2487429b31a2SRichard Henderson (info->stream, "%s",
2488429b31a2SRichard Henderson bb_cond_64_names[GET_FIELD (insn, 16, 16)]);
2489429b31a2SRichard Henderson
2490429b31a2SRichard Henderson /* If the next character in args is 'n', it will handle
2491429b31a2SRichard Henderson putting out the space. */
2492429b31a2SRichard Henderson if (s[1] != 'n')
2493429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, " ");
2494429b31a2SRichard Henderson break;
2495429b31a2SRichard Henderson }
2496429b31a2SRichard Henderson break;
2497429b31a2SRichard Henderson }
2498429b31a2SRichard Henderson
2499429b31a2SRichard Henderson case 'V':
2500429b31a2SRichard Henderson fput_const (extract_5_store (insn), info);
2501429b31a2SRichard Henderson break;
2502429b31a2SRichard Henderson case 'r':
2503429b31a2SRichard Henderson fput_const (extract_5r_store (insn), info);
2504429b31a2SRichard Henderson break;
2505429b31a2SRichard Henderson case 'R':
2506429b31a2SRichard Henderson fput_const (extract_5R_store (insn), info);
2507429b31a2SRichard Henderson break;
2508429b31a2SRichard Henderson case 'U':
2509429b31a2SRichard Henderson fput_const (extract_10U_store (insn), info);
2510429b31a2SRichard Henderson break;
2511429b31a2SRichard Henderson case 'B':
2512429b31a2SRichard Henderson case 'Q':
2513429b31a2SRichard Henderson fput_const (extract_5Q_store (insn), info);
2514429b31a2SRichard Henderson break;
2515429b31a2SRichard Henderson case 'i':
2516429b31a2SRichard Henderson fput_const (extract_11 (insn), info);
2517429b31a2SRichard Henderson break;
2518429b31a2SRichard Henderson case 'j':
2519429b31a2SRichard Henderson fput_const (extract_14 (insn), info);
2520429b31a2SRichard Henderson break;
2521429b31a2SRichard Henderson case 'k':
2522429b31a2SRichard Henderson fputs_filtered ("L%", info);
2523429b31a2SRichard Henderson fput_const (extract_21 (insn), info);
2524429b31a2SRichard Henderson break;
2525429b31a2SRichard Henderson case '<':
2526429b31a2SRichard Henderson case 'l':
2527429b31a2SRichard Henderson /* 16-bit long disp., PA2.0 wide only. */
2528429b31a2SRichard Henderson fput_const (extract_16 (insn), info);
2529429b31a2SRichard Henderson break;
2530429b31a2SRichard Henderson case 'n':
2531429b31a2SRichard Henderson if (insn & 0x2)
2532429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",n ");
2533429b31a2SRichard Henderson else
2534429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, " ");
2535429b31a2SRichard Henderson break;
2536429b31a2SRichard Henderson case 'N':
2537429b31a2SRichard Henderson if ((insn & 0x20) && s[1])
2538429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",n ");
2539429b31a2SRichard Henderson else if (insn & 0x20)
2540429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",n");
2541429b31a2SRichard Henderson else if (s[1])
2542429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, " ");
2543429b31a2SRichard Henderson break;
2544429b31a2SRichard Henderson case 'w':
2545429b31a2SRichard Henderson (*info->print_address_func)
2546429b31a2SRichard Henderson (memaddr + 8 + extract_12 (insn), info);
2547429b31a2SRichard Henderson break;
2548429b31a2SRichard Henderson case 'W':
2549429b31a2SRichard Henderson /* 17 bit PC-relative branch. */
2550429b31a2SRichard Henderson (*info->print_address_func)
2551429b31a2SRichard Henderson ((memaddr + 8 + extract_17 (insn)), info);
2552429b31a2SRichard Henderson break;
2553429b31a2SRichard Henderson case 'z':
2554429b31a2SRichard Henderson /* 17 bit displacement. This is an offset from a register
2555429b31a2SRichard Henderson so it gets disasssembled as just a number, not any sort
2556429b31a2SRichard Henderson of address. */
2557429b31a2SRichard Henderson fput_const (extract_17 (insn), info);
2558429b31a2SRichard Henderson break;
2559429b31a2SRichard Henderson
2560429b31a2SRichard Henderson case 'Z':
2561429b31a2SRichard Henderson /* addil %r1 implicit output. */
2562429b31a2SRichard Henderson fputs_filtered ("r1", info);
2563429b31a2SRichard Henderson break;
2564429b31a2SRichard Henderson
2565429b31a2SRichard Henderson case 'Y':
2566429b31a2SRichard Henderson /* be,l %sr0,%r31 implicit output. */
2567429b31a2SRichard Henderson fputs_filtered ("sr0,r31", info);
2568429b31a2SRichard Henderson break;
2569429b31a2SRichard Henderson
2570429b31a2SRichard Henderson case '@':
2571429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "0");
2572429b31a2SRichard Henderson break;
2573429b31a2SRichard Henderson
2574429b31a2SRichard Henderson case '.':
2575429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%d",
2576429b31a2SRichard Henderson GET_FIELD (insn, 24, 25));
2577429b31a2SRichard Henderson break;
2578429b31a2SRichard Henderson case '*':
2579429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%d",
2580429b31a2SRichard Henderson GET_FIELD (insn, 22, 25));
2581429b31a2SRichard Henderson break;
2582429b31a2SRichard Henderson case '!':
2583429b31a2SRichard Henderson fputs_filtered ("sar", info);
2584429b31a2SRichard Henderson break;
2585429b31a2SRichard Henderson case 'p':
2586429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%d",
2587429b31a2SRichard Henderson 31 - GET_FIELD (insn, 22, 26));
2588429b31a2SRichard Henderson break;
2589429b31a2SRichard Henderson case '~':
2590429b31a2SRichard Henderson {
2591429b31a2SRichard Henderson int num;
2592429b31a2SRichard Henderson num = GET_FIELD (insn, 20, 20) << 5;
2593429b31a2SRichard Henderson num |= GET_FIELD (insn, 22, 26);
2594429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%d", 63 - num);
2595429b31a2SRichard Henderson break;
2596429b31a2SRichard Henderson }
2597429b31a2SRichard Henderson case 'P':
2598429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%d",
2599429b31a2SRichard Henderson GET_FIELD (insn, 22, 26));
2600429b31a2SRichard Henderson break;
2601429b31a2SRichard Henderson case 'q':
2602429b31a2SRichard Henderson {
2603429b31a2SRichard Henderson int num;
2604429b31a2SRichard Henderson num = GET_FIELD (insn, 20, 20) << 5;
2605429b31a2SRichard Henderson num |= GET_FIELD (insn, 22, 26);
2606429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%d", num);
2607429b31a2SRichard Henderson break;
2608429b31a2SRichard Henderson }
2609429b31a2SRichard Henderson case 'T':
2610429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%d",
2611429b31a2SRichard Henderson 32 - GET_FIELD (insn, 27, 31));
2612429b31a2SRichard Henderson break;
2613429b31a2SRichard Henderson case '%':
2614429b31a2SRichard Henderson {
2615429b31a2SRichard Henderson int num;
2616429b31a2SRichard Henderson num = (GET_FIELD (insn, 23, 23) + 1) * 32;
2617429b31a2SRichard Henderson num -= GET_FIELD (insn, 27, 31);
2618429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%d", num);
2619429b31a2SRichard Henderson break;
2620429b31a2SRichard Henderson }
2621429b31a2SRichard Henderson case '|':
2622429b31a2SRichard Henderson {
2623429b31a2SRichard Henderson int num;
2624429b31a2SRichard Henderson num = (GET_FIELD (insn, 19, 19) + 1) * 32;
2625429b31a2SRichard Henderson num -= GET_FIELD (insn, 27, 31);
2626429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%d", num);
2627429b31a2SRichard Henderson break;
2628429b31a2SRichard Henderson }
2629429b31a2SRichard Henderson case '$':
2630429b31a2SRichard Henderson fput_const (GET_FIELD (insn, 20, 28), info);
2631429b31a2SRichard Henderson break;
2632429b31a2SRichard Henderson case 'A':
2633429b31a2SRichard Henderson fput_const (GET_FIELD (insn, 6, 18), info);
2634429b31a2SRichard Henderson break;
2635429b31a2SRichard Henderson case 'D':
2636429b31a2SRichard Henderson fput_const (GET_FIELD (insn, 6, 31), info);
2637429b31a2SRichard Henderson break;
2638429b31a2SRichard Henderson case 'v':
2639429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",%d",
2640429b31a2SRichard Henderson GET_FIELD (insn, 23, 25));
2641429b31a2SRichard Henderson break;
2642429b31a2SRichard Henderson case 'O':
2643429b31a2SRichard Henderson fput_const ((GET_FIELD (insn, 6,20) << 5 |
2644429b31a2SRichard Henderson GET_FIELD (insn, 27, 31)), info);
2645429b31a2SRichard Henderson break;
2646429b31a2SRichard Henderson case 'o':
2647429b31a2SRichard Henderson fput_const (GET_FIELD (insn, 6, 20), info);
2648429b31a2SRichard Henderson break;
2649429b31a2SRichard Henderson case '2':
2650429b31a2SRichard Henderson fput_const ((GET_FIELD (insn, 6, 22) << 5 |
2651429b31a2SRichard Henderson GET_FIELD (insn, 27, 31)), info);
2652429b31a2SRichard Henderson break;
2653429b31a2SRichard Henderson case '1':
2654429b31a2SRichard Henderson fput_const ((GET_FIELD (insn, 11, 20) << 5 |
2655429b31a2SRichard Henderson GET_FIELD (insn, 27, 31)), info);
2656429b31a2SRichard Henderson break;
2657429b31a2SRichard Henderson case '0':
2658429b31a2SRichard Henderson fput_const ((GET_FIELD (insn, 16, 20) << 5 |
2659429b31a2SRichard Henderson GET_FIELD (insn, 27, 31)), info);
2660429b31a2SRichard Henderson break;
2661429b31a2SRichard Henderson case 'u':
2662429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",%d",
2663429b31a2SRichard Henderson GET_FIELD (insn, 23, 25));
2664429b31a2SRichard Henderson break;
2665429b31a2SRichard Henderson case 'F':
2666429b31a2SRichard Henderson /* If no destination completer and not before a completer
2667429b31a2SRichard Henderson for fcmp, need a space here. */
2668429b31a2SRichard Henderson if (s[1] == 'G' || s[1] == '?')
2669429b31a2SRichard Henderson fputs_filtered
2670429b31a2SRichard Henderson (float_format_names[GET_FIELD (insn, 19, 20)], info);
2671429b31a2SRichard Henderson else
2672429b31a2SRichard Henderson (*info->fprintf_func)
2673429b31a2SRichard Henderson (info->stream, "%s ",
2674429b31a2SRichard Henderson float_format_names[GET_FIELD (insn, 19, 20)]);
2675429b31a2SRichard Henderson break;
2676429b31a2SRichard Henderson case 'G':
2677429b31a2SRichard Henderson (*info->fprintf_func)
2678429b31a2SRichard Henderson (info->stream, "%s ",
2679429b31a2SRichard Henderson float_format_names[GET_FIELD (insn, 17, 18)]);
2680429b31a2SRichard Henderson break;
2681429b31a2SRichard Henderson case 'H':
2682429b31a2SRichard Henderson if (GET_FIELD (insn, 26, 26) == 1)
2683429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%s ",
2684429b31a2SRichard Henderson float_format_names[0]);
2685429b31a2SRichard Henderson else
2686429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%s ",
2687429b31a2SRichard Henderson float_format_names[1]);
2688429b31a2SRichard Henderson break;
2689429b31a2SRichard Henderson case 'I':
2690429b31a2SRichard Henderson /* If no destination completer and not before a completer
2691429b31a2SRichard Henderson for fcmp, need a space here. */
2692429b31a2SRichard Henderson if (s[1] == '?')
2693429b31a2SRichard Henderson fputs_filtered
2694429b31a2SRichard Henderson (float_format_names[GET_FIELD (insn, 20, 20)], info);
2695429b31a2SRichard Henderson else
2696429b31a2SRichard Henderson (*info->fprintf_func)
2697429b31a2SRichard Henderson (info->stream, "%s ",
2698429b31a2SRichard Henderson float_format_names[GET_FIELD (insn, 20, 20)]);
2699429b31a2SRichard Henderson break;
2700429b31a2SRichard Henderson
2701429b31a2SRichard Henderson case 'J':
2702429b31a2SRichard Henderson fput_const (extract_14 (insn), info);
2703429b31a2SRichard Henderson break;
2704429b31a2SRichard Henderson
2705429b31a2SRichard Henderson case '#':
2706429b31a2SRichard Henderson {
2707429b31a2SRichard Henderson int sign = GET_FIELD (insn, 31, 31);
2708429b31a2SRichard Henderson int imm10 = GET_FIELD (insn, 18, 27);
2709429b31a2SRichard Henderson int disp;
2710429b31a2SRichard Henderson
2711429b31a2SRichard Henderson if (sign)
2712429b31a2SRichard Henderson disp = (-1 << 10) | imm10;
2713429b31a2SRichard Henderson else
2714429b31a2SRichard Henderson disp = imm10;
2715429b31a2SRichard Henderson
2716429b31a2SRichard Henderson disp <<= 3;
2717429b31a2SRichard Henderson fput_const (disp, info);
2718429b31a2SRichard Henderson break;
2719429b31a2SRichard Henderson }
2720429b31a2SRichard Henderson case 'K':
2721429b31a2SRichard Henderson case 'd':
2722429b31a2SRichard Henderson {
2723429b31a2SRichard Henderson int sign = GET_FIELD (insn, 31, 31);
2724429b31a2SRichard Henderson int imm11 = GET_FIELD (insn, 18, 28);
2725429b31a2SRichard Henderson int disp;
2726429b31a2SRichard Henderson
2727429b31a2SRichard Henderson if (sign)
2728429b31a2SRichard Henderson disp = (-1 << 11) | imm11;
2729429b31a2SRichard Henderson else
2730429b31a2SRichard Henderson disp = imm11;
2731429b31a2SRichard Henderson
2732429b31a2SRichard Henderson disp <<= 2;
2733429b31a2SRichard Henderson fput_const (disp, info);
2734429b31a2SRichard Henderson break;
2735429b31a2SRichard Henderson }
2736429b31a2SRichard Henderson
2737429b31a2SRichard Henderson case '>':
2738429b31a2SRichard Henderson case 'y':
2739429b31a2SRichard Henderson {
2740429b31a2SRichard Henderson /* 16-bit long disp., PA2.0 wide only. */
2741429b31a2SRichard Henderson int disp = extract_16 (insn);
2742429b31a2SRichard Henderson disp &= ~3;
2743429b31a2SRichard Henderson fput_const (disp, info);
2744429b31a2SRichard Henderson break;
2745429b31a2SRichard Henderson }
2746429b31a2SRichard Henderson
2747429b31a2SRichard Henderson case '&':
2748429b31a2SRichard Henderson {
2749429b31a2SRichard Henderson /* 16-bit long disp., PA2.0 wide only. */
2750429b31a2SRichard Henderson int disp = extract_16 (insn);
2751429b31a2SRichard Henderson disp &= ~7;
2752429b31a2SRichard Henderson fput_const (disp, info);
2753429b31a2SRichard Henderson break;
2754429b31a2SRichard Henderson }
2755429b31a2SRichard Henderson
2756429b31a2SRichard Henderson case '_':
2757429b31a2SRichard Henderson break; /* Dealt with by '{' */
2758429b31a2SRichard Henderson
2759429b31a2SRichard Henderson case '{':
2760429b31a2SRichard Henderson {
2761429b31a2SRichard Henderson int sub = GET_FIELD (insn, 14, 16);
2762429b31a2SRichard Henderson int df = GET_FIELD (insn, 17, 18);
2763429b31a2SRichard Henderson int sf = GET_FIELD (insn, 19, 20);
2764429b31a2SRichard Henderson const char * const * source = float_format_names;
2765429b31a2SRichard Henderson const char * const * dest = float_format_names;
2766429b31a2SRichard Henderson const char *t = "";
2767429b31a2SRichard Henderson
2768429b31a2SRichard Henderson if (sub == 4)
2769429b31a2SRichard Henderson {
2770429b31a2SRichard Henderson fputs_filtered (",UND ", info);
2771429b31a2SRichard Henderson break;
2772429b31a2SRichard Henderson }
2773429b31a2SRichard Henderson if ((sub & 3) == 3)
2774429b31a2SRichard Henderson t = ",t";
2775429b31a2SRichard Henderson if ((sub & 3) == 1)
2776429b31a2SRichard Henderson source = sub & 4 ? fcnv_ufixed_names : fcnv_fixed_names;
2777429b31a2SRichard Henderson if (sub & 2)
2778429b31a2SRichard Henderson dest = sub & 4 ? fcnv_ufixed_names : fcnv_fixed_names;
2779429b31a2SRichard Henderson
2780429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%s%s%s ",
2781429b31a2SRichard Henderson t, source[sf], dest[df]);
2782429b31a2SRichard Henderson break;
2783429b31a2SRichard Henderson }
2784429b31a2SRichard Henderson
2785429b31a2SRichard Henderson case 'm':
2786429b31a2SRichard Henderson {
2787429b31a2SRichard Henderson int y = GET_FIELD (insn, 16, 18);
2788429b31a2SRichard Henderson
2789429b31a2SRichard Henderson if (y != 1)
2790429b31a2SRichard Henderson fput_const ((y ^ 1) - 1, info);
2791429b31a2SRichard Henderson }
2792429b31a2SRichard Henderson break;
2793429b31a2SRichard Henderson
2794429b31a2SRichard Henderson case 'h':
2795429b31a2SRichard Henderson {
2796429b31a2SRichard Henderson int cbit;
2797429b31a2SRichard Henderson
2798429b31a2SRichard Henderson cbit = GET_FIELD (insn, 16, 18);
2799429b31a2SRichard Henderson
2800429b31a2SRichard Henderson if (cbit > 0)
2801429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, ",%d", cbit - 1);
2802429b31a2SRichard Henderson break;
2803429b31a2SRichard Henderson }
2804429b31a2SRichard Henderson
2805429b31a2SRichard Henderson case '=':
2806429b31a2SRichard Henderson {
2807429b31a2SRichard Henderson int cond = GET_FIELD (insn, 27, 31);
2808429b31a2SRichard Henderson
2809429b31a2SRichard Henderson switch (cond)
2810429b31a2SRichard Henderson {
2811429b31a2SRichard Henderson case 0: fputs_filtered (" ", info); break;
2812429b31a2SRichard Henderson case 1: fputs_filtered ("acc ", info); break;
2813429b31a2SRichard Henderson case 2: fputs_filtered ("rej ", info); break;
2814429b31a2SRichard Henderson case 5: fputs_filtered ("acc8 ", info); break;
2815429b31a2SRichard Henderson case 6: fputs_filtered ("rej8 ", info); break;
2816429b31a2SRichard Henderson case 9: fputs_filtered ("acc6 ", info); break;
2817429b31a2SRichard Henderson case 13: fputs_filtered ("acc4 ", info); break;
2818429b31a2SRichard Henderson case 17: fputs_filtered ("acc2 ", info); break;
2819429b31a2SRichard Henderson default: break;
2820429b31a2SRichard Henderson }
2821429b31a2SRichard Henderson break;
2822429b31a2SRichard Henderson }
2823429b31a2SRichard Henderson
2824429b31a2SRichard Henderson case 'X':
2825429b31a2SRichard Henderson (*info->print_address_func)
2826429b31a2SRichard Henderson (memaddr + 8 + extract_22 (insn), info);
2827429b31a2SRichard Henderson break;
2828429b31a2SRichard Henderson case 'L':
2829429b31a2SRichard Henderson fputs_filtered (",rp", info);
2830429b31a2SRichard Henderson break;
2831429b31a2SRichard Henderson default:
2832429b31a2SRichard Henderson (*info->fprintf_func) (info->stream, "%c", *s);
2833429b31a2SRichard Henderson break;
2834429b31a2SRichard Henderson }
2835429b31a2SRichard Henderson }
2836429b31a2SRichard Henderson return sizeof (insn);
2837429b31a2SRichard Henderson }
2838429b31a2SRichard Henderson }
28392f926bfdSHelge Deller info->fprintf_func(info->stream, "<unknown>");
2840429b31a2SRichard Henderson return sizeof (insn);
2841429b31a2SRichard Henderson }
2842