1139790Simp/*-
2159916Smarcel * Copyright (c) 2000-2006 Marcel Moolenaar
3121404Smarcel * All rights reserved.
4121404Smarcel *
5121404Smarcel * Redistribution and use in source and binary forms, with or without
6121404Smarcel * modification, are permitted provided that the following conditions
7121404Smarcel * are met:
8121404Smarcel *
9121404Smarcel * 1. Redistributions of source code must retain the above copyright
10121404Smarcel *    notice, this list of conditions and the following disclaimer.
11121404Smarcel * 2. Redistributions in binary form must reproduce the above copyright
12121404Smarcel *    notice, this list of conditions and the following disclaimer in the
13121404Smarcel *    documentation and/or other materials provided with the distribution.
14121404Smarcel *
15121404Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16121404Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17121404Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18121404Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19121404Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20121404Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21121404Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22121404Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23121404Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24121404Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25121404Smarcel */
26121404Smarcel
27121404Smarcel#include <sys/cdefs.h>
28121404Smarcel__FBSDID("$FreeBSD$");
29121404Smarcel
30121404Smarcel#include <sys/param.h>
31121404Smarcel#include <sys/systm.h>
32121404Smarcel
33121404Smarcel#include <machine/stdarg.h>
34121404Smarcel
35121404Smarcel#include <ia64/disasm/disasm_int.h>
36121404Smarcel#include <ia64/disasm/disasm.h>
37121404Smarcel
38121404Smarcel#define FRAG(o,l)	((int)((o << 8) | (l & 0xff)))
39121404Smarcel#define FRAG_OFS(f)	(f >> 8)
40121404Smarcel#define FRAG_LEN(f)	(f & 0xff)
41121404Smarcel
42121404Smarcel/*
43121404Smarcel * Support functions.
44121404Smarcel */
45121404Smarcelstatic void
46121404Smarcelasm_cmpltr_add(struct asm_inst *i, enum asm_cmpltr_class c,
47121404Smarcel    enum asm_cmpltr_type t)
48121404Smarcel{
49121404Smarcel
50121404Smarcel	i->i_cmpltr[i->i_ncmpltrs].c_class = c;
51121404Smarcel	i->i_cmpltr[i->i_ncmpltrs].c_type = t;
52121404Smarcel	i->i_ncmpltrs++;
53121404Smarcel	KASSERT(i->i_ncmpltrs < 6, ("foo"));
54121404Smarcel}
55121404Smarcel
56121404Smarcelstatic void
57121404Smarcelasm_hint(struct asm_inst *i, enum asm_cmpltr_class c)
58121404Smarcel{
59121404Smarcel
60121404Smarcel	switch (FIELD(i->i_bits, 28, 2)) { /* hint */
61121404Smarcel	case 0:
62121404Smarcel		asm_cmpltr_add(i, c, ASM_CT_NONE);
63121404Smarcel		break;
64121404Smarcel	case 1:
65121404Smarcel		asm_cmpltr_add(i, c, ASM_CT_NT1);
66121404Smarcel		break;
67121404Smarcel	case 2:
68121404Smarcel		asm_cmpltr_add(i, c, ASM_CT_NT2);
69121404Smarcel		break;
70121404Smarcel	case 3:
71121404Smarcel		asm_cmpltr_add(i, c, ASM_CT_NTA);
72121404Smarcel		break;
73121404Smarcel	}
74121404Smarcel}
75121404Smarcel
76121404Smarcelstatic void
77121404Smarcelasm_sf(struct asm_inst *i)
78121404Smarcel{
79121404Smarcel
80121404Smarcel	switch (FIELD(i->i_bits, 34, 2)) {
81121404Smarcel	case 0:
82121404Smarcel		asm_cmpltr_add(i, ASM_CC_SF, ASM_CT_S0);
83121404Smarcel		break;
84121404Smarcel	case 1:
85121404Smarcel		asm_cmpltr_add(i, ASM_CC_SF, ASM_CT_S1);
86121404Smarcel		break;
87121404Smarcel	case 2:
88121404Smarcel		asm_cmpltr_add(i, ASM_CC_SF, ASM_CT_S2);
89121404Smarcel		break;
90121404Smarcel	case 3:
91121404Smarcel		asm_cmpltr_add(i, ASM_CC_SF, ASM_CT_S3);
92121404Smarcel		break;
93121404Smarcel	}
94121404Smarcel}
95121404Smarcel
96121404Smarcelstatic void
97121404Smarcelasm_brhint(struct asm_inst *i)
98121404Smarcel{
99121404Smarcel	uint64_t bits = i->i_bits;
100121404Smarcel
101121404Smarcel	switch (FIELD(bits, 33, 2)) { /* bwh */
102121404Smarcel	case 0:
103121404Smarcel		asm_cmpltr_add(i, ASM_CC_BWH, ASM_CT_SPTK);
104121404Smarcel		break;
105121404Smarcel	case 1:
106121404Smarcel		asm_cmpltr_add(i, ASM_CC_BWH, ASM_CT_SPNT);
107121404Smarcel		break;
108121404Smarcel	case 2:
109121404Smarcel		asm_cmpltr_add(i, ASM_CC_BWH, ASM_CT_DPTK);
110121404Smarcel		break;
111121404Smarcel	case 3:
112121404Smarcel		asm_cmpltr_add(i, ASM_CC_BWH, ASM_CT_DPNT);
113121404Smarcel		break;
114121404Smarcel	}
115121404Smarcel
116121404Smarcel	if (FIELD(bits, 12, 1)) /* ph */
117121404Smarcel		asm_cmpltr_add(i, ASM_CC_PH, ASM_CT_MANY);
118121404Smarcel	else
119121404Smarcel		asm_cmpltr_add(i, ASM_CC_PH, ASM_CT_FEW);
120121404Smarcel
121121404Smarcel	if (FIELD(bits, 35, 1)) /* dh */
122121404Smarcel		asm_cmpltr_add(i, ASM_CC_DH, ASM_CT_CLR);
123121404Smarcel	else
124121404Smarcel		asm_cmpltr_add(i, ASM_CC_DH, ASM_CT_NONE);
125121404Smarcel}
126121404Smarcel
127121404Smarcelstatic void
128121404Smarcelasm_brphint(struct asm_inst *i)
129121404Smarcel{
130121404Smarcel	uint64_t bits = i->i_bits;
131121404Smarcel
132121404Smarcel	switch (FIELD(bits, 3, 2)) { /* ipwh, indwh */
133121404Smarcel	case 0:
134121404Smarcel		asm_cmpltr_add(i, ASM_CC_IPWH, ASM_CT_SPTK);
135121404Smarcel		break;
136121404Smarcel	case 1:
137121404Smarcel		asm_cmpltr_add(i, ASM_CC_IPWH, ASM_CT_LOOP);
138121404Smarcel		break;
139121404Smarcel	case 2:
140121404Smarcel		asm_cmpltr_add(i, ASM_CC_IPWH, ASM_CT_DPTK);
141121404Smarcel		break;
142121404Smarcel	case 3:
143121404Smarcel		asm_cmpltr_add(i, ASM_CC_IPWH, ASM_CT_EXIT);
144121404Smarcel		break;
145121404Smarcel	}
146121404Smarcel
147121404Smarcel	if (FIELD(bits, 5, 1)) /* ph */
148121404Smarcel		asm_cmpltr_add(i, ASM_CC_PH, ASM_CT_MANY);
149121404Smarcel	else
150121404Smarcel		asm_cmpltr_add(i, ASM_CC_PH, ASM_CT_FEW);
151121404Smarcel
152121404Smarcel	switch (FIELD(bits, 0, 3)) { /* pvec */
153121404Smarcel	case 0:
154121404Smarcel		asm_cmpltr_add(i, ASM_CC_PVEC, ASM_CT_DC_DC);
155121404Smarcel		break;
156121404Smarcel	case 1:
157121404Smarcel		asm_cmpltr_add(i, ASM_CC_PVEC, ASM_CT_DC_NT);
158121404Smarcel		break;
159121404Smarcel	case 2:
160121404Smarcel		asm_cmpltr_add(i, ASM_CC_PVEC, ASM_CT_TK_DC);
161121404Smarcel		break;
162121404Smarcel	case 3:
163121404Smarcel		asm_cmpltr_add(i, ASM_CC_PVEC, ASM_CT_TK_TK);
164121404Smarcel		break;
165121404Smarcel	case 4:
166121404Smarcel		asm_cmpltr_add(i, ASM_CC_PVEC, ASM_CT_TK_NT);
167121404Smarcel		break;
168121404Smarcel	case 5:
169121404Smarcel		asm_cmpltr_add(i, ASM_CC_PVEC, ASM_CT_NT_DC);
170121404Smarcel		break;
171121404Smarcel	case 6:
172121404Smarcel		asm_cmpltr_add(i, ASM_CC_PVEC, ASM_CT_NT_TK);
173121404Smarcel		break;
174121404Smarcel	case 7:
175121404Smarcel		asm_cmpltr_add(i, ASM_CC_PVEC, ASM_CT_NT_NT);
176121404Smarcel		break;
177121404Smarcel	}
178121404Smarcel
179121404Smarcel	if (FIELD(bits, 35, 1)) /* ih */
180121404Smarcel		asm_cmpltr_add(i, ASM_CC_IH, ASM_CT_IMP);
181121404Smarcel	else
182121404Smarcel		asm_cmpltr_add(i, ASM_CC_IH, ASM_CT_NONE);
183121404Smarcel}
184121404Smarcel
185121404Smarcelstatic enum asm_oper_type
186121404Smarcelasm_normalize(struct asm_inst *i, enum asm_op op)
187121404Smarcel{
188121404Smarcel	enum asm_oper_type ot = ASM_OPER_NONE;
189121404Smarcel
190121404Smarcel	switch (op) {
191121404Smarcel	case ASM_OP_BR_CALL:
192121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_CALL);
193121404Smarcel		op = ASM_OP_BR;
194121404Smarcel		break;
195121404Smarcel	case ASM_OP_BR_CEXIT:
196121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_CEXIT);
197121404Smarcel		op = ASM_OP_BR;
198121404Smarcel		break;
199121404Smarcel	case ASM_OP_BR_CLOOP:
200121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_CLOOP);
201121404Smarcel		op = ASM_OP_BR;
202121404Smarcel		break;
203121404Smarcel	case ASM_OP_BR_COND:
204121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_COND);
205121404Smarcel		op = ASM_OP_BR;
206121404Smarcel		break;
207121404Smarcel	case ASM_OP_BR_CTOP:
208121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_CTOP);
209121404Smarcel		op = ASM_OP_BR;
210121404Smarcel		break;
211121404Smarcel	case ASM_OP_BR_IA:
212121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_IA);
213121404Smarcel		op = ASM_OP_BR;
214121404Smarcel		break;
215121404Smarcel	case ASM_OP_BR_RET:
216121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_RET);
217121404Smarcel		op = ASM_OP_BR;
218121404Smarcel		break;
219121404Smarcel	case ASM_OP_BR_WEXIT:
220121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_WEXIT);
221121404Smarcel		op = ASM_OP_BR;
222121404Smarcel		break;
223121404Smarcel	case ASM_OP_BR_WTOP:
224121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_WTOP);
225121404Smarcel		op = ASM_OP_BR;
226121404Smarcel		break;
227121404Smarcel	case ASM_OP_BREAK_B:
228121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_B);
229121404Smarcel		op = ASM_OP_BREAK;
230121404Smarcel		break;
231121404Smarcel	case ASM_OP_BREAK_F:
232121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_F);
233121404Smarcel		op = ASM_OP_BREAK;
234121404Smarcel		break;
235121404Smarcel	case ASM_OP_BREAK_I:
236121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_I);
237121404Smarcel		op = ASM_OP_BREAK;
238121404Smarcel		break;
239121404Smarcel	case ASM_OP_BREAK_M:
240121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_M);
241121404Smarcel		op = ASM_OP_BREAK;
242121404Smarcel		break;
243121404Smarcel	case ASM_OP_BREAK_X:
244121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_X);
245121404Smarcel		op = ASM_OP_BREAK;
246121404Smarcel		break;
247121404Smarcel	case ASM_OP_BRL_COND:
248121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_COND);
249121404Smarcel		op = ASM_OP_BRL;
250121404Smarcel		break;
251121404Smarcel	case ASM_OP_BRL_CALL:
252121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_CALL);
253121404Smarcel		op = ASM_OP_BRL;
254121404Smarcel		break;
255121404Smarcel	case ASM_OP_BRP_:
256121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_NONE);
257121404Smarcel		op = ASM_OP_BRP;
258121404Smarcel		break;
259121404Smarcel	case ASM_OP_BRP_RET:
260121404Smarcel		asm_cmpltr_add(i, ASM_CC_BTYPE, ASM_CT_RET);
261121404Smarcel		op = ASM_OP_BRP;
262121404Smarcel		break;
263121404Smarcel	case ASM_OP_BSW_0:
264121404Smarcel		asm_cmpltr_add(i, ASM_CC_BSW, ASM_CT_0);
265121404Smarcel		op = ASM_OP_BSW;
266121404Smarcel		break;
267121404Smarcel	case ASM_OP_BSW_1:
268121404Smarcel		asm_cmpltr_add(i, ASM_CC_BSW, ASM_CT_1);
269121404Smarcel		op = ASM_OP_BSW;
270121404Smarcel		break;
271121404Smarcel	case ASM_OP_CHK_A_CLR:
272121404Smarcel		asm_cmpltr_add(i, ASM_CC_CHK, ASM_CT_A);
273121404Smarcel		asm_cmpltr_add(i, ASM_CC_ACLR, ASM_CT_CLR);
274121404Smarcel		op = ASM_OP_CHK;
275121404Smarcel		break;
276121404Smarcel	case ASM_OP_CHK_A_NC:
277121404Smarcel		asm_cmpltr_add(i, ASM_CC_CHK, ASM_CT_A);
278121404Smarcel		asm_cmpltr_add(i, ASM_CC_ACLR, ASM_CT_NC);
279121404Smarcel		op = ASM_OP_CHK;
280121404Smarcel		break;
281121404Smarcel	case ASM_OP_CHK_S:
282121404Smarcel		asm_cmpltr_add(i, ASM_CC_CHK, ASM_CT_S);
283121404Smarcel		op = ASM_OP_CHK;
284121404Smarcel		break;
285121404Smarcel	case ASM_OP_CHK_S_I:
286121404Smarcel		asm_cmpltr_add(i, ASM_CC_CHK, ASM_CT_S);
287121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_I);
288121404Smarcel		op = ASM_OP_CHK;
289121404Smarcel		break;
290121404Smarcel	case ASM_OP_CHK_S_M:
291121404Smarcel		asm_cmpltr_add(i, ASM_CC_CHK, ASM_CT_S);
292121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_M);
293121404Smarcel		op = ASM_OP_CHK;
294121404Smarcel		break;
295121404Smarcel	case ASM_OP_CLRRRB_:
296121404Smarcel		asm_cmpltr_add(i, ASM_CC_CLRRRB, ASM_CT_NONE);
297121404Smarcel		op = ASM_OP_CLRRRB;
298121404Smarcel		break;
299121404Smarcel	case ASM_OP_CLRRRB_PR:
300121404Smarcel		asm_cmpltr_add(i, ASM_CC_CLRRRB, ASM_CT_PR);
301121404Smarcel		op = ASM_OP_CLRRRB;
302121404Smarcel		break;
303121404Smarcel	case ASM_OP_CMP_EQ:
304121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_EQ);
305121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_NONE);
306121404Smarcel		op = ASM_OP_CMP;
307121404Smarcel		break;
308121404Smarcel	case ASM_OP_CMP_EQ_AND:
309121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_EQ);
310121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
311121404Smarcel		op = ASM_OP_CMP;
312121404Smarcel		break;
313121404Smarcel	case ASM_OP_CMP_EQ_OR:
314121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_EQ);
315121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
316121404Smarcel		op = ASM_OP_CMP;
317121404Smarcel		break;
318121404Smarcel	case ASM_OP_CMP_EQ_OR_ANDCM:
319121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_EQ);
320121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
321121404Smarcel		op = ASM_OP_CMP;
322121404Smarcel		break;
323121404Smarcel	case ASM_OP_CMP_EQ_UNC:
324121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_EQ);
325121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_UNC);
326121404Smarcel		op = ASM_OP_CMP;
327121404Smarcel		break;
328121404Smarcel	case ASM_OP_CMP_GE_AND:
329121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GE);
330121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
331121404Smarcel		op = ASM_OP_CMP;
332121404Smarcel		break;
333121404Smarcel	case ASM_OP_CMP_GE_OR:
334121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GE);
335121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
336121404Smarcel		op = ASM_OP_CMP;
337121404Smarcel		break;
338121404Smarcel	case ASM_OP_CMP_GE_OR_ANDCM:
339121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GE);
340121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
341121404Smarcel		op = ASM_OP_CMP;
342121404Smarcel		break;
343121404Smarcel	case ASM_OP_CMP_GT_AND:
344121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GT);
345121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
346121404Smarcel		op = ASM_OP_CMP;
347121404Smarcel		break;
348121404Smarcel	case ASM_OP_CMP_GT_OR:
349121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GT);
350121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
351121404Smarcel		op = ASM_OP_CMP;
352121404Smarcel		break;
353121404Smarcel	case ASM_OP_CMP_GT_OR_ANDCM:
354121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GT);
355121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
356121404Smarcel		op = ASM_OP_CMP;
357121404Smarcel		break;
358121404Smarcel	case ASM_OP_CMP_LE_AND:
359121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LE);
360121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
361121404Smarcel		op = ASM_OP_CMP;
362121404Smarcel		break;
363121404Smarcel	case ASM_OP_CMP_LE_OR:
364121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LE);
365121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
366121404Smarcel		op = ASM_OP_CMP;
367121404Smarcel		break;
368121404Smarcel	case ASM_OP_CMP_LE_OR_ANDCM:
369121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LE);
370121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
371121404Smarcel		op = ASM_OP_CMP;
372121404Smarcel		break;
373121404Smarcel	case ASM_OP_CMP_LT:
374121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LT);
375121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_NONE);
376121404Smarcel		op = ASM_OP_CMP;
377121404Smarcel		break;
378121404Smarcel	case ASM_OP_CMP_LT_AND:
379121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LT);
380121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
381121404Smarcel		op = ASM_OP_CMP;
382121404Smarcel		break;
383121404Smarcel	case ASM_OP_CMP_LT_OR:
384121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LT);
385121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
386121404Smarcel		op = ASM_OP_CMP;
387121404Smarcel		break;
388121404Smarcel	case ASM_OP_CMP_LT_OR_ANDCM:
389121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LT);
390121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
391121404Smarcel		op = ASM_OP_CMP;
392121404Smarcel		break;
393121404Smarcel	case ASM_OP_CMP_LT_UNC:
394121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LT);
395121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_UNC);
396121404Smarcel		op = ASM_OP_CMP;
397121404Smarcel		break;
398121404Smarcel	case ASM_OP_CMP_LTU:
399121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LTU);
400121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_NONE);
401121404Smarcel		op = ASM_OP_CMP;
402121404Smarcel		break;
403121404Smarcel	case ASM_OP_CMP_LTU_UNC:
404121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LTU);
405121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_UNC);
406121404Smarcel		op = ASM_OP_CMP;
407121404Smarcel		break;
408121404Smarcel	case ASM_OP_CMP_NE_AND:
409121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_NE);
410121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
411121404Smarcel		op = ASM_OP_CMP;
412121404Smarcel		break;
413121404Smarcel	case ASM_OP_CMP_NE_OR:
414121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_NE);
415121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
416121404Smarcel		op = ASM_OP_CMP;
417121404Smarcel		break;
418121404Smarcel	case ASM_OP_CMP_NE_OR_ANDCM:
419121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_NE);
420121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
421121404Smarcel		op = ASM_OP_CMP;
422121404Smarcel		break;
423121404Smarcel	case ASM_OP_CMP4_EQ:
424121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_EQ);
425121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_NONE);
426121404Smarcel		op = ASM_OP_CMP4;
427121404Smarcel		break;
428121404Smarcel	case ASM_OP_CMP4_EQ_AND:
429121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_EQ);
430121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
431121404Smarcel		op = ASM_OP_CMP4;
432121404Smarcel		break;
433121404Smarcel	case ASM_OP_CMP4_EQ_OR:
434121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_EQ);
435121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
436121404Smarcel		op = ASM_OP_CMP4;
437121404Smarcel		break;
438121404Smarcel	case ASM_OP_CMP4_EQ_OR_ANDCM:
439121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_EQ);
440121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
441121404Smarcel		op = ASM_OP_CMP4;
442121404Smarcel		break;
443121404Smarcel	case ASM_OP_CMP4_EQ_UNC:
444121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_EQ);
445121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_UNC);
446121404Smarcel		op = ASM_OP_CMP4;
447121404Smarcel		break;
448121404Smarcel	case ASM_OP_CMP4_GE_AND:
449121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GE);
450121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
451121404Smarcel		op = ASM_OP_CMP4;
452121404Smarcel		break;
453121404Smarcel	case ASM_OP_CMP4_GE_OR:
454121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GE);
455121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
456121404Smarcel		op = ASM_OP_CMP4;
457121404Smarcel		break;
458121404Smarcel	case ASM_OP_CMP4_GE_OR_ANDCM:
459121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GE);
460121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
461121404Smarcel		op = ASM_OP_CMP4;
462121404Smarcel		break;
463121404Smarcel	case ASM_OP_CMP4_GT_AND:
464121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GT);
465121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
466121404Smarcel		op = ASM_OP_CMP4;
467121404Smarcel		break;
468121404Smarcel	case ASM_OP_CMP4_GT_OR:
469121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GT);
470121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
471121404Smarcel		op = ASM_OP_CMP4;
472121404Smarcel		break;
473121404Smarcel	case ASM_OP_CMP4_GT_OR_ANDCM:
474121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_GT);
475121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
476121404Smarcel		op = ASM_OP_CMP4;
477121404Smarcel		break;
478121404Smarcel	case ASM_OP_CMP4_LE_AND:
479121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LE);
480121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
481121404Smarcel		op = ASM_OP_CMP4;
482121404Smarcel		break;
483121404Smarcel	case ASM_OP_CMP4_LE_OR:
484121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LE);
485121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
486121404Smarcel		op = ASM_OP_CMP4;
487121404Smarcel		break;
488121404Smarcel	case ASM_OP_CMP4_LE_OR_ANDCM:
489121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LE);
490121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
491121404Smarcel		op = ASM_OP_CMP4;
492121404Smarcel		break;
493121404Smarcel	case ASM_OP_CMP4_LT:
494121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LT);
495121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_NONE);
496121404Smarcel		op = ASM_OP_CMP4;
497121404Smarcel		break;
498121404Smarcel	case ASM_OP_CMP4_LT_AND:
499121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LT);
500121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
501121404Smarcel		op = ASM_OP_CMP4;
502121404Smarcel		break;
503121404Smarcel	case ASM_OP_CMP4_LT_OR:
504121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LT);
505121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
506121404Smarcel		op = ASM_OP_CMP4;
507121404Smarcel		break;
508121404Smarcel	case ASM_OP_CMP4_LT_OR_ANDCM:
509121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LT);
510121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
511121404Smarcel		op = ASM_OP_CMP4;
512121404Smarcel		break;
513121404Smarcel	case ASM_OP_CMP4_LT_UNC:
514121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LT);
515121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_UNC);
516121404Smarcel		op = ASM_OP_CMP4;
517121404Smarcel		break;
518121404Smarcel	case ASM_OP_CMP4_LTU:
519121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LTU);
520121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_NONE);
521121404Smarcel		op = ASM_OP_CMP4;
522121404Smarcel		break;
523121404Smarcel	case ASM_OP_CMP4_LTU_UNC:
524121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_LTU);
525121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_UNC);
526121404Smarcel		op = ASM_OP_CMP4;
527121404Smarcel		break;
528121404Smarcel	case ASM_OP_CMP4_NE_AND:
529121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_NE);
530121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
531121404Smarcel		op = ASM_OP_CMP4;
532121404Smarcel		break;
533121404Smarcel	case ASM_OP_CMP4_NE_OR:
534121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_NE);
535121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
536121404Smarcel		op = ASM_OP_CMP4;
537121404Smarcel		break;
538121404Smarcel	case ASM_OP_CMP4_NE_OR_ANDCM:
539121404Smarcel		asm_cmpltr_add(i, ASM_CC_CREL, ASM_CT_NE);
540121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
541121404Smarcel		op = ASM_OP_CMP4;
542121404Smarcel		break;
543121404Smarcel	case ASM_OP_CMP8XCHG16_ACQ:
544121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_ACQ);
545121404Smarcel		op = ASM_OP_CMP8XCHG16;
546121404Smarcel		break;
547121404Smarcel	case ASM_OP_CMP8XCHG16_REL:
548121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_REL);
549121404Smarcel		op = ASM_OP_CMP8XCHG16;
550121404Smarcel		break;
551121404Smarcel	case ASM_OP_CMPXCHG1_ACQ:
552121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_ACQ);
553121404Smarcel		op = ASM_OP_CMPXCHG1;
554121404Smarcel		break;
555121404Smarcel	case ASM_OP_CMPXCHG1_REL:
556121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_REL);
557121404Smarcel		op = ASM_OP_CMPXCHG1;
558121404Smarcel		break;
559121404Smarcel	case ASM_OP_CMPXCHG2_ACQ:
560121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_ACQ);
561121404Smarcel		op = ASM_OP_CMPXCHG2;
562121404Smarcel		break;
563121404Smarcel	case ASM_OP_CMPXCHG2_REL:
564121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_REL);
565121404Smarcel		op = ASM_OP_CMPXCHG2;
566121404Smarcel		break;
567121404Smarcel	case ASM_OP_CMPXCHG4_ACQ:
568121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_ACQ);
569121404Smarcel		op = ASM_OP_CMPXCHG4;
570121404Smarcel		break;
571121404Smarcel	case ASM_OP_CMPXCHG4_REL:
572121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_REL);
573121404Smarcel		op = ASM_OP_CMPXCHG4;
574121404Smarcel		break;
575121404Smarcel	case ASM_OP_CMPXCHG8_ACQ:
576121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_ACQ);
577121404Smarcel		op = ASM_OP_CMPXCHG8;
578121404Smarcel		break;
579121404Smarcel	case ASM_OP_CMPXCHG8_REL:
580121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_REL);
581121404Smarcel		op = ASM_OP_CMPXCHG8;
582121404Smarcel		break;
583121404Smarcel	case ASM_OP_CZX1_L:
584121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_L);
585121404Smarcel		op = ASM_OP_CZX1;
586121404Smarcel		break;
587121404Smarcel	case ASM_OP_CZX1_R:
588121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_R);
589121404Smarcel		op = ASM_OP_CZX1;
590121404Smarcel		break;
591121404Smarcel	case ASM_OP_CZX2_L:
592121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_L);
593121404Smarcel		op = ASM_OP_CZX2;
594121404Smarcel		break;
595121404Smarcel	case ASM_OP_CZX2_R:
596121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_R);
597121404Smarcel		op = ASM_OP_CZX2;
598121404Smarcel		break;
599121404Smarcel	case ASM_OP_DEP_:
600121404Smarcel		asm_cmpltr_add(i, ASM_CC_DEP, ASM_CT_NONE);
601121404Smarcel		op = ASM_OP_DEP;
602121404Smarcel		break;
603121404Smarcel	case ASM_OP_DEP_Z:
604121404Smarcel		asm_cmpltr_add(i, ASM_CC_DEP, ASM_CT_Z);
605121404Smarcel		op = ASM_OP_DEP;
606121404Smarcel		break;
607121404Smarcel	case ASM_OP_FC_:
608121404Smarcel		asm_cmpltr_add(i, ASM_CC_FC, ASM_CT_NONE);
609121404Smarcel		op = ASM_OP_FC;
610121404Smarcel		break;
611121404Smarcel	case ASM_OP_FC_I:
612121404Smarcel		asm_cmpltr_add(i, ASM_CC_FC, ASM_CT_I);
613121404Smarcel		op = ASM_OP_FC;
614121404Smarcel		break;
615121404Smarcel	case ASM_OP_FCLASS_M:
616121404Smarcel		asm_cmpltr_add(i, ASM_CC_FCREL, ASM_CT_M);
617121404Smarcel		op = ASM_OP_FCLASS;
618121404Smarcel		break;
619121404Smarcel	case ASM_OP_FCVT_FX:
620121404Smarcel		asm_cmpltr_add(i, ASM_CC_FCVT, ASM_CT_FX);
621121404Smarcel		asm_cmpltr_add(i, ASM_CC_TRUNC, ASM_CT_NONE);
622121404Smarcel		op = ASM_OP_FCVT;
623121404Smarcel		break;
624121404Smarcel	case ASM_OP_FCVT_FX_TRUNC:
625121404Smarcel		asm_cmpltr_add(i, ASM_CC_FCVT, ASM_CT_FX);
626121404Smarcel		asm_cmpltr_add(i, ASM_CC_TRUNC, ASM_CT_TRUNC);
627121404Smarcel		op = ASM_OP_FCVT;
628121404Smarcel		break;
629121404Smarcel	case ASM_OP_FCVT_FXU:
630121404Smarcel		asm_cmpltr_add(i, ASM_CC_FCVT, ASM_CT_FXU);
631121404Smarcel		asm_cmpltr_add(i, ASM_CC_TRUNC, ASM_CT_NONE);
632121404Smarcel		op = ASM_OP_FCVT;
633121404Smarcel		break;
634121404Smarcel	case ASM_OP_FCVT_FXU_TRUNC:
635121404Smarcel		asm_cmpltr_add(i, ASM_CC_FCVT, ASM_CT_FXU);
636121404Smarcel		asm_cmpltr_add(i, ASM_CC_TRUNC, ASM_CT_TRUNC);
637121404Smarcel		op = ASM_OP_FCVT;
638121404Smarcel		break;
639121404Smarcel	case ASM_OP_FCVT_XF:
640121404Smarcel		asm_cmpltr_add(i, ASM_CC_FCVT, ASM_CT_XF);
641121404Smarcel		asm_cmpltr_add(i, ASM_CC_TRUNC, ASM_CT_NONE);
642121404Smarcel		op = ASM_OP_FCVT;
643121404Smarcel		break;
644121404Smarcel	case ASM_OP_FETCHADD4_ACQ:
645121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_ACQ);
646121404Smarcel		op = ASM_OP_FETCHADD4;
647121404Smarcel		break;
648121404Smarcel	case ASM_OP_FETCHADD4_REL:
649121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_REL);
650121404Smarcel		op = ASM_OP_FETCHADD4;
651121404Smarcel		break;
652121404Smarcel	case ASM_OP_FETCHADD8_ACQ:
653121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_ACQ);
654121404Smarcel		op = ASM_OP_FETCHADD8;
655121404Smarcel		break;
656121404Smarcel	case ASM_OP_FETCHADD8_REL:
657121404Smarcel		asm_cmpltr_add(i, ASM_CC_SEM, ASM_CT_REL);
658121404Smarcel		op = ASM_OP_FETCHADD8;
659121404Smarcel		break;
660121404Smarcel	case ASM_OP_FMA_:
661121404Smarcel		asm_cmpltr_add(i, ASM_CC_PC, ASM_CT_NONE);
662121404Smarcel		op = ASM_OP_FMA;
663121404Smarcel		break;
664121404Smarcel	case ASM_OP_FMA_D:
665121404Smarcel		asm_cmpltr_add(i, ASM_CC_PC, ASM_CT_D);
666121404Smarcel		op = ASM_OP_FMA;
667121404Smarcel		break;
668121404Smarcel	case ASM_OP_FMA_S:
669121404Smarcel		asm_cmpltr_add(i, ASM_CC_PC, ASM_CT_S);
670121404Smarcel		op = ASM_OP_FMA;
671121404Smarcel		break;
672121404Smarcel	case ASM_OP_FMERGE_NS:
673121404Smarcel		asm_cmpltr_add(i, ASM_CC_FMERGE, ASM_CT_NS);
674121404Smarcel		op = ASM_OP_FMERGE;
675121404Smarcel		break;
676121404Smarcel	case ASM_OP_FMERGE_S:
677121404Smarcel		asm_cmpltr_add(i, ASM_CC_FMERGE, ASM_CT_S);
678121404Smarcel		op = ASM_OP_FMERGE;
679121404Smarcel		break;
680121404Smarcel	case ASM_OP_FMERGE_SE:
681121404Smarcel		asm_cmpltr_add(i, ASM_CC_FMERGE, ASM_CT_SE);
682121404Smarcel		op = ASM_OP_FMERGE;
683121404Smarcel		break;
684121404Smarcel	case ASM_OP_FMIX_L:
685121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_L);
686121404Smarcel		op = ASM_OP_FMIX;
687121404Smarcel		break;
688121404Smarcel	case ASM_OP_FMIX_LR:
689121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_LR);
690121404Smarcel		op = ASM_OP_FMIX;
691121404Smarcel		break;
692121404Smarcel	case ASM_OP_FMIX_R:
693121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_R);
694121404Smarcel		op = ASM_OP_FMIX;
695121404Smarcel		break;
696121404Smarcel	case ASM_OP_FMS_:
697121404Smarcel		asm_cmpltr_add(i, ASM_CC_PC, ASM_CT_NONE);
698121404Smarcel		op = ASM_OP_FMS;
699121404Smarcel		break;
700121404Smarcel	case ASM_OP_FMS_D:
701121404Smarcel		asm_cmpltr_add(i, ASM_CC_PC, ASM_CT_D);
702121404Smarcel		op = ASM_OP_FMS;
703121404Smarcel		break;
704121404Smarcel	case ASM_OP_FMS_S:
705121404Smarcel		asm_cmpltr_add(i, ASM_CC_PC, ASM_CT_S);
706121404Smarcel		op = ASM_OP_FMS;
707121404Smarcel		break;
708121404Smarcel	case ASM_OP_FNMA_:
709121404Smarcel		asm_cmpltr_add(i, ASM_CC_PC, ASM_CT_NONE);
710121404Smarcel		op = ASM_OP_FNMA;
711121404Smarcel		break;
712121404Smarcel	case ASM_OP_FNMA_D:
713121404Smarcel		asm_cmpltr_add(i, ASM_CC_PC, ASM_CT_D);
714121404Smarcel		op = ASM_OP_FNMA;
715121404Smarcel		break;
716121404Smarcel	case ASM_OP_FNMA_S:
717121404Smarcel		asm_cmpltr_add(i, ASM_CC_PC, ASM_CT_S);
718121404Smarcel		op = ASM_OP_FNMA;
719121404Smarcel		break;
720121404Smarcel	case ASM_OP_FPCMP_EQ:
721121404Smarcel		asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_EQ);
722121404Smarcel		op = ASM_OP_FPCMP;
723121404Smarcel		break;
724121404Smarcel	case ASM_OP_FPCMP_LE:
725121404Smarcel		asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_LE);
726121404Smarcel		op = ASM_OP_FPCMP;
727121404Smarcel		break;
728121404Smarcel	case ASM_OP_FPCMP_LT:
729121404Smarcel		asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_LT);
730121404Smarcel		op = ASM_OP_FPCMP;
731121404Smarcel		break;
732121404Smarcel	case ASM_OP_FPCMP_NEQ:
733121404Smarcel		asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_NEQ);
734121404Smarcel		op = ASM_OP_FPCMP;
735121404Smarcel		break;
736121404Smarcel	case ASM_OP_FPCMP_NLE:
737121404Smarcel		asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_NLE);
738121404Smarcel		op = ASM_OP_FPCMP;
739121404Smarcel		break;
740121404Smarcel	case ASM_OP_FPCMP_NLT:
741121404Smarcel		asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_NLT);
742121404Smarcel		op = ASM_OP_FPCMP;
743121404Smarcel		break;
744121404Smarcel	case ASM_OP_FPCMP_ORD:
745121404Smarcel		asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_ORD);
746121404Smarcel		op = ASM_OP_FPCMP;
747121404Smarcel		break;
748121404Smarcel	case ASM_OP_FPCMP_UNORD:
749121404Smarcel		asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_UNORD);
750121404Smarcel		op = ASM_OP_FPCMP;
751121404Smarcel		break;
752121404Smarcel	case ASM_OP_FPCVT_FX:
753121404Smarcel		asm_cmpltr_add(i, ASM_CC_FCVT, ASM_CT_FX);
754121404Smarcel		asm_cmpltr_add(i, ASM_CC_TRUNC, ASM_CT_NONE);
755121404Smarcel		op = ASM_OP_FPCVT;
756121404Smarcel		break;
757121404Smarcel	case ASM_OP_FPCVT_FX_TRUNC:
758121404Smarcel		asm_cmpltr_add(i, ASM_CC_FCVT, ASM_CT_FX);
759121404Smarcel		asm_cmpltr_add(i, ASM_CC_TRUNC, ASM_CT_TRUNC);
760121404Smarcel		op = ASM_OP_FPCVT;
761121404Smarcel		break;
762121404Smarcel	case ASM_OP_FPCVT_FXU:
763121404Smarcel		asm_cmpltr_add(i, ASM_CC_FCVT, ASM_CT_FXU);
764121404Smarcel		asm_cmpltr_add(i, ASM_CC_TRUNC, ASM_CT_NONE);
765121404Smarcel		op = ASM_OP_FPCVT;
766121404Smarcel		break;
767121404Smarcel	case ASM_OP_FPCVT_FXU_TRUNC:
768121404Smarcel		asm_cmpltr_add(i, ASM_CC_FCVT, ASM_CT_FXU);
769121404Smarcel		asm_cmpltr_add(i, ASM_CC_TRUNC, ASM_CT_TRUNC);
770121404Smarcel		op = ASM_OP_FPCVT;
771121404Smarcel		break;
772121404Smarcel	case ASM_OP_FPMERGE_NS:
773121404Smarcel		asm_cmpltr_add(i, ASM_CC_FMERGE, ASM_CT_NS);
774121404Smarcel		op = ASM_OP_FPMERGE;
775121404Smarcel		break;
776121404Smarcel	case ASM_OP_FPMERGE_S:
777121404Smarcel		asm_cmpltr_add(i, ASM_CC_FMERGE, ASM_CT_S);
778121404Smarcel		op = ASM_OP_FPMERGE;
779121404Smarcel		break;
780121404Smarcel	case ASM_OP_FPMERGE_SE:
781121404Smarcel		asm_cmpltr_add(i, ASM_CC_FMERGE, ASM_CT_SE);
782121404Smarcel		op = ASM_OP_FPMERGE;
783121404Smarcel		break;
784121404Smarcel	case ASM_OP_FSWAP_:
785121404Smarcel		asm_cmpltr_add(i, ASM_CC_FSWAP, ASM_CT_NONE);
786121404Smarcel		op = ASM_OP_FSWAP;
787121404Smarcel		break;
788121404Smarcel	case ASM_OP_FSWAP_NL:
789121404Smarcel		asm_cmpltr_add(i, ASM_CC_FSWAP, ASM_CT_NL);
790121404Smarcel		op = ASM_OP_FSWAP;
791121404Smarcel		break;
792121404Smarcel	case ASM_OP_FSWAP_NR:
793121404Smarcel		asm_cmpltr_add(i, ASM_CC_FSWAP, ASM_CT_NR);
794121404Smarcel		op = ASM_OP_FSWAP;
795121404Smarcel		break;
796121404Smarcel	case ASM_OP_FSXT_L:
797121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_L);
798121404Smarcel		op = ASM_OP_FSXT;
799121404Smarcel		break;
800121404Smarcel	case ASM_OP_FSXT_R:
801121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_R);
802121404Smarcel		op = ASM_OP_FSXT;
803121404Smarcel		break;
804121404Smarcel	case ASM_OP_GETF_D:
805121404Smarcel		asm_cmpltr_add(i, ASM_CC_GETF, ASM_CT_D);
806121404Smarcel		op = ASM_OP_GETF;
807121404Smarcel		break;
808121404Smarcel	case ASM_OP_GETF_EXP:
809121404Smarcel		asm_cmpltr_add(i, ASM_CC_GETF, ASM_CT_EXP);
810121404Smarcel		op = ASM_OP_GETF;
811121404Smarcel		break;
812121404Smarcel	case ASM_OP_GETF_S:
813121404Smarcel		asm_cmpltr_add(i, ASM_CC_GETF, ASM_CT_S);
814121404Smarcel		op = ASM_OP_GETF;
815121404Smarcel		break;
816121404Smarcel	case ASM_OP_GETF_SIG:
817121404Smarcel		asm_cmpltr_add(i, ASM_CC_GETF, ASM_CT_SIG);
818121404Smarcel		op = ASM_OP_GETF;
819121404Smarcel		break;
820159909Smarcel	case ASM_OP_HINT_B:
821159909Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_B);
822159909Smarcel		op = ASM_OP_HINT;
823159909Smarcel		break;
824159909Smarcel	case ASM_OP_HINT_F:
825159909Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_F);
826159909Smarcel		op = ASM_OP_HINT;
827159909Smarcel		break;
828159909Smarcel	case ASM_OP_HINT_I:
829159909Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_I);
830159909Smarcel		op = ASM_OP_HINT;
831159909Smarcel		break;
832159909Smarcel	case ASM_OP_HINT_M:
833159909Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_M);
834159909Smarcel		op = ASM_OP_HINT;
835159909Smarcel		break;
836159909Smarcel	case ASM_OP_HINT_X:
837159909Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_X);
838159909Smarcel		op = ASM_OP_HINT;
839159909Smarcel		break;
840121404Smarcel	case ASM_OP_INVALA_:
841121404Smarcel		asm_cmpltr_add(i, ASM_CC_INVALA, ASM_CT_NONE);
842121404Smarcel		op = ASM_OP_INVALA;
843121404Smarcel		break;
844121404Smarcel	case ASM_OP_INVALA_E:
845121404Smarcel		asm_cmpltr_add(i, ASM_CC_INVALA, ASM_CT_E);
846121404Smarcel		op = ASM_OP_INVALA;
847121404Smarcel		break;
848121404Smarcel	case ASM_OP_ITC_D:
849121404Smarcel		asm_cmpltr_add(i, ASM_CC_ITC, ASM_CT_D);
850121404Smarcel		op = ASM_OP_ITC;
851121404Smarcel		break;
852121404Smarcel	case ASM_OP_ITC_I:
853121404Smarcel		asm_cmpltr_add(i, ASM_CC_ITC, ASM_CT_I);
854121404Smarcel		op = ASM_OP_ITC;
855121404Smarcel		break;
856121404Smarcel	case ASM_OP_ITR_D:
857121404Smarcel		asm_cmpltr_add(i, ASM_CC_ITR, ASM_CT_D);
858121404Smarcel		ot = ASM_OPER_DTR;
859121404Smarcel		op = ASM_OP_ITR;
860121404Smarcel		break;
861121404Smarcel	case ASM_OP_ITR_I:
862121404Smarcel		asm_cmpltr_add(i, ASM_CC_ITR, ASM_CT_I);
863121404Smarcel		ot = ASM_OPER_ITR;
864121404Smarcel		op = ASM_OP_ITR;
865121404Smarcel		break;
866121404Smarcel	case ASM_OP_LD1_:
867121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_NONE);
868121404Smarcel		op = ASM_OP_LD1;
869121404Smarcel		break;
870121404Smarcel	case ASM_OP_LD1_A:
871121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_A);
872121404Smarcel		op = ASM_OP_LD1;
873121404Smarcel		break;
874121404Smarcel	case ASM_OP_LD1_ACQ:
875121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_ACQ);
876121404Smarcel		op = ASM_OP_LD1;
877121404Smarcel		break;
878121404Smarcel	case ASM_OP_LD1_BIAS:
879121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_BIAS);
880121404Smarcel		op = ASM_OP_LD1;
881121404Smarcel		break;
882121404Smarcel	case ASM_OP_LD1_C_CLR:
883121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_CLR);
884121404Smarcel		op = ASM_OP_LD1;
885121404Smarcel		break;
886121404Smarcel	case ASM_OP_LD1_C_CLR_ACQ:
887121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_CLR_ACQ);
888121404Smarcel		op = ASM_OP_LD1;
889121404Smarcel		break;
890121404Smarcel	case ASM_OP_LD1_C_NC:
891121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_NC);
892121404Smarcel		op = ASM_OP_LD1;
893121404Smarcel		break;
894121404Smarcel	case ASM_OP_LD1_S:
895121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_S);
896121404Smarcel		op = ASM_OP_LD1;
897121404Smarcel		break;
898121404Smarcel	case ASM_OP_LD1_SA:
899121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_SA);
900121404Smarcel		op = ASM_OP_LD1;
901121404Smarcel		break;
902121404Smarcel	case ASM_OP_LD16_:
903121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_NONE);
904121404Smarcel		op = ASM_OP_LD16;
905121404Smarcel		break;
906121404Smarcel	case ASM_OP_LD16_ACQ:
907121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_ACQ);
908121404Smarcel		op = ASM_OP_LD16;
909121404Smarcel		break;
910121404Smarcel	case ASM_OP_LD2_:
911121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_NONE);
912121404Smarcel		op = ASM_OP_LD2;
913121404Smarcel		break;
914121404Smarcel	case ASM_OP_LD2_A:
915121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_A);
916121404Smarcel		op = ASM_OP_LD2;
917121404Smarcel		break;
918121404Smarcel	case ASM_OP_LD2_ACQ:
919121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_ACQ);
920121404Smarcel		op = ASM_OP_LD2;
921121404Smarcel		break;
922121404Smarcel	case ASM_OP_LD2_BIAS:
923121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_BIAS);
924121404Smarcel		op = ASM_OP_LD2;
925121404Smarcel		break;
926121404Smarcel	case ASM_OP_LD2_C_CLR:
927121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_CLR);
928121404Smarcel		op = ASM_OP_LD2;
929121404Smarcel		break;
930121404Smarcel	case ASM_OP_LD2_C_CLR_ACQ:
931121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_CLR_ACQ);
932121404Smarcel		op = ASM_OP_LD2;
933121404Smarcel		break;
934121404Smarcel	case ASM_OP_LD2_C_NC:
935121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_NC);
936121404Smarcel		op = ASM_OP_LD2;
937121404Smarcel		break;
938121404Smarcel	case ASM_OP_LD2_S:
939121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_S);
940121404Smarcel		op = ASM_OP_LD2;
941121404Smarcel		break;
942121404Smarcel	case ASM_OP_LD2_SA:
943121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_SA);
944121404Smarcel		op = ASM_OP_LD2;
945121404Smarcel		break;
946121404Smarcel	case ASM_OP_LD4_:
947121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_NONE);
948121404Smarcel		op = ASM_OP_LD4;
949121404Smarcel		break;
950121404Smarcel	case ASM_OP_LD4_A:
951121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_A);
952121404Smarcel		op = ASM_OP_LD4;
953121404Smarcel		break;
954121404Smarcel	case ASM_OP_LD4_ACQ:
955121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_ACQ);
956121404Smarcel		op = ASM_OP_LD4;
957121404Smarcel		break;
958121404Smarcel	case ASM_OP_LD4_BIAS:
959121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_BIAS);
960121404Smarcel		op = ASM_OP_LD4;
961121404Smarcel		break;
962121404Smarcel	case ASM_OP_LD4_C_CLR:
963121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_CLR);
964121404Smarcel		op = ASM_OP_LD4;
965121404Smarcel		break;
966121404Smarcel	case ASM_OP_LD4_C_CLR_ACQ:
967121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_CLR_ACQ);
968121404Smarcel		op = ASM_OP_LD4;
969121404Smarcel		break;
970121404Smarcel	case ASM_OP_LD4_C_NC:
971121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_NC);
972121404Smarcel		op = ASM_OP_LD4;
973121404Smarcel		break;
974121404Smarcel	case ASM_OP_LD4_S:
975121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_S);
976121404Smarcel		op = ASM_OP_LD4;
977121404Smarcel		break;
978121404Smarcel	case ASM_OP_LD4_SA:
979121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_SA);
980121404Smarcel		op = ASM_OP_LD4;
981121404Smarcel		break;
982121404Smarcel	case ASM_OP_LD8_:
983121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_NONE);
984121404Smarcel		op = ASM_OP_LD8;
985121404Smarcel		break;
986121404Smarcel	case ASM_OP_LD8_A:
987121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_A);
988121404Smarcel		op = ASM_OP_LD8;
989121404Smarcel		break;
990121404Smarcel	case ASM_OP_LD8_ACQ:
991121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_ACQ);
992121404Smarcel		op = ASM_OP_LD8;
993121404Smarcel		break;
994121404Smarcel	case ASM_OP_LD8_BIAS:
995121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_BIAS);
996121404Smarcel		op = ASM_OP_LD8;
997121404Smarcel		break;
998121404Smarcel	case ASM_OP_LD8_C_CLR:
999121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_CLR);
1000121404Smarcel		op = ASM_OP_LD8;
1001121404Smarcel		break;
1002121404Smarcel	case ASM_OP_LD8_C_CLR_ACQ:
1003121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_CLR_ACQ);
1004121404Smarcel		op = ASM_OP_LD8;
1005121404Smarcel		break;
1006121404Smarcel	case ASM_OP_LD8_C_NC:
1007121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_C_NC);
1008121404Smarcel		op = ASM_OP_LD8;
1009121404Smarcel		break;
1010121404Smarcel	case ASM_OP_LD8_FILL:
1011121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_FILL);
1012121404Smarcel		op = ASM_OP_LD8;
1013121404Smarcel		break;
1014121404Smarcel	case ASM_OP_LD8_S:
1015121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_S);
1016121404Smarcel		op = ASM_OP_LD8;
1017121404Smarcel		break;
1018121404Smarcel	case ASM_OP_LD8_SA:
1019121404Smarcel		asm_cmpltr_add(i, ASM_CC_LDTYPE, ASM_CT_SA);
1020121404Smarcel		op = ASM_OP_LD8;
1021121404Smarcel		break;
1022121404Smarcel	case ASM_OP_LDF_FILL:
1023121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_FILL);
1024121404Smarcel		op = ASM_OP_LDF;
1025121404Smarcel		break;
1026121404Smarcel	case ASM_OP_LDF8_:
1027121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_NONE);
1028121404Smarcel		op = ASM_OP_LDF8;
1029121404Smarcel		break;
1030121404Smarcel	case ASM_OP_LDF8_A:
1031121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_A);
1032121404Smarcel		op = ASM_OP_LDF8;
1033121404Smarcel		break;
1034121404Smarcel	case ASM_OP_LDF8_C_CLR:
1035121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_CLR);
1036121404Smarcel		op = ASM_OP_LDF8;
1037121404Smarcel		break;
1038121404Smarcel	case ASM_OP_LDF8_C_NC:
1039121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_NC);
1040121404Smarcel		op = ASM_OP_LDF8;
1041121404Smarcel		break;
1042121404Smarcel	case ASM_OP_LDF8_S:
1043121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_S);
1044121404Smarcel		op = ASM_OP_LDF8;
1045121404Smarcel		break;
1046121404Smarcel	case ASM_OP_LDF8_SA:
1047121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_SA);
1048121404Smarcel		op = ASM_OP_LDF8;
1049121404Smarcel		break;
1050121404Smarcel	case ASM_OP_LDFD_:
1051121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_NONE);
1052121404Smarcel		op = ASM_OP_LDFD;
1053121404Smarcel		break;
1054121404Smarcel	case ASM_OP_LDFD_A:
1055121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_A);
1056121404Smarcel		op = ASM_OP_LDFD;
1057121404Smarcel		break;
1058121404Smarcel	case ASM_OP_LDFD_C_CLR:
1059121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_CLR);
1060121404Smarcel		op = ASM_OP_LDFD;
1061121404Smarcel		break;
1062121404Smarcel	case ASM_OP_LDFD_C_NC:
1063121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_NC);
1064121404Smarcel		op = ASM_OP_LDFD;
1065121404Smarcel		break;
1066121404Smarcel	case ASM_OP_LDFD_S:
1067121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_S);
1068121404Smarcel		op = ASM_OP_LDFD;
1069121404Smarcel		break;
1070121404Smarcel	case ASM_OP_LDFD_SA:
1071121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_SA);
1072121404Smarcel		op = ASM_OP_LDFD;
1073121404Smarcel		break;
1074121404Smarcel	case ASM_OP_LDFE_:
1075121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_NONE);
1076121404Smarcel		op = ASM_OP_LDFE;
1077121404Smarcel		break;
1078121404Smarcel	case ASM_OP_LDFE_A:
1079121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_A);
1080121404Smarcel		op = ASM_OP_LDFE;
1081121404Smarcel		break;
1082121404Smarcel	case ASM_OP_LDFE_C_CLR:
1083121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_CLR);
1084121404Smarcel		op = ASM_OP_LDFE;
1085121404Smarcel		break;
1086121404Smarcel	case ASM_OP_LDFE_C_NC:
1087121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_NC);
1088121404Smarcel		op = ASM_OP_LDFE;
1089121404Smarcel		break;
1090121404Smarcel	case ASM_OP_LDFE_S:
1091121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_S);
1092121404Smarcel		op = ASM_OP_LDFE;
1093121404Smarcel		break;
1094121404Smarcel	case ASM_OP_LDFE_SA:
1095121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_SA);
1096121404Smarcel		op = ASM_OP_LDFE;
1097121404Smarcel		break;
1098121404Smarcel	case ASM_OP_LDFP8_:
1099121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_NONE);
1100121404Smarcel		op = ASM_OP_LDFP8;
1101121404Smarcel		break;
1102121404Smarcel	case ASM_OP_LDFP8_A:
1103121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_A);
1104121404Smarcel		op = ASM_OP_LDFP8;
1105121404Smarcel		break;
1106121404Smarcel	case ASM_OP_LDFP8_C_CLR:
1107121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_CLR);
1108121404Smarcel		op = ASM_OP_LDFP8;
1109121404Smarcel		break;
1110121404Smarcel	case ASM_OP_LDFP8_C_NC:
1111121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_NC);
1112121404Smarcel		op = ASM_OP_LDFP8;
1113121404Smarcel		break;
1114121404Smarcel	case ASM_OP_LDFP8_S:
1115121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_S);
1116121404Smarcel		op = ASM_OP_LDFP8;
1117121404Smarcel		break;
1118121404Smarcel	case ASM_OP_LDFP8_SA:
1119121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_SA);
1120121404Smarcel		op = ASM_OP_LDFP8;
1121121404Smarcel		break;
1122121404Smarcel	case ASM_OP_LDFPD_:
1123121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_NONE);
1124121404Smarcel		op = ASM_OP_LDFPD;
1125121404Smarcel		break;
1126121404Smarcel	case ASM_OP_LDFPD_A:
1127121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_A);
1128121404Smarcel		op = ASM_OP_LDFPD;
1129121404Smarcel		break;
1130121404Smarcel	case ASM_OP_LDFPD_C_CLR:
1131121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_CLR);
1132121404Smarcel		op = ASM_OP_LDFPD;
1133121404Smarcel		break;
1134121404Smarcel	case ASM_OP_LDFPD_C_NC:
1135121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_NC);
1136121404Smarcel		op = ASM_OP_LDFPD;
1137121404Smarcel		break;
1138121404Smarcel	case ASM_OP_LDFPD_S:
1139121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_S);
1140121404Smarcel		op = ASM_OP_LDFPD;
1141121404Smarcel		break;
1142121404Smarcel	case ASM_OP_LDFPD_SA:
1143121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_SA);
1144121404Smarcel		op = ASM_OP_LDFPD;
1145121404Smarcel		break;
1146121404Smarcel	case ASM_OP_LDFPS_:
1147121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_NONE);
1148121404Smarcel		op = ASM_OP_LDFPS;
1149121404Smarcel		break;
1150121404Smarcel	case ASM_OP_LDFPS_A:
1151121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_A);
1152121404Smarcel		op = ASM_OP_LDFPS;
1153121404Smarcel		break;
1154121404Smarcel	case ASM_OP_LDFPS_C_CLR:
1155121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_CLR);
1156121404Smarcel		op = ASM_OP_LDFPS;
1157121404Smarcel		break;
1158121404Smarcel	case ASM_OP_LDFPS_C_NC:
1159121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_NC);
1160121404Smarcel		op = ASM_OP_LDFPS;
1161121404Smarcel		break;
1162121404Smarcel	case ASM_OP_LDFPS_S:
1163121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_S);
1164121404Smarcel		op = ASM_OP_LDFPS;
1165121404Smarcel		break;
1166121404Smarcel	case ASM_OP_LDFPS_SA:
1167121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_SA);
1168121404Smarcel		op = ASM_OP_LDFPS;
1169121404Smarcel		break;
1170121404Smarcel	case ASM_OP_LDFS_:
1171121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_NONE);
1172121404Smarcel		op = ASM_OP_LDFS;
1173121404Smarcel		break;
1174121404Smarcel	case ASM_OP_LDFS_A:
1175121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_A);
1176121404Smarcel		op = ASM_OP_LDFS;
1177121404Smarcel		break;
1178121404Smarcel	case ASM_OP_LDFS_C_CLR:
1179121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_CLR);
1180121404Smarcel		op = ASM_OP_LDFS;
1181121404Smarcel		break;
1182121404Smarcel	case ASM_OP_LDFS_C_NC:
1183121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_C_NC);
1184121404Smarcel		op = ASM_OP_LDFS;
1185121404Smarcel		break;
1186121404Smarcel	case ASM_OP_LDFS_S:
1187121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_S);
1188121404Smarcel		op = ASM_OP_LDFS;
1189121404Smarcel		break;
1190121404Smarcel	case ASM_OP_LDFS_SA:
1191121404Smarcel		asm_cmpltr_add(i, ASM_CC_FLDTYPE, ASM_CT_SA);
1192121404Smarcel		op = ASM_OP_LDFS;
1193121404Smarcel		break;
1194121404Smarcel	case ASM_OP_LFETCH_:
1195121404Smarcel		asm_cmpltr_add(i, ASM_CC_LFTYPE, ASM_CT_NONE);
1196121404Smarcel		asm_cmpltr_add(i, ASM_CC_LFETCH, ASM_CT_NONE);
1197121404Smarcel		op = ASM_OP_LFETCH;
1198121404Smarcel		break;
1199121404Smarcel	case ASM_OP_LFETCH_EXCL:
1200121404Smarcel		asm_cmpltr_add(i, ASM_CC_LFTYPE, ASM_CT_NONE);
1201121404Smarcel		asm_cmpltr_add(i, ASM_CC_LFETCH, ASM_CT_EXCL);
1202121404Smarcel		op = ASM_OP_LFETCH;
1203121404Smarcel		break;
1204121404Smarcel	case ASM_OP_LFETCH_FAULT:
1205121404Smarcel		asm_cmpltr_add(i, ASM_CC_LFTYPE, ASM_CT_FAULT);
1206121404Smarcel		asm_cmpltr_add(i, ASM_CC_LFETCH, ASM_CT_NONE);
1207121404Smarcel		op = ASM_OP_LFETCH;
1208121404Smarcel		break;
1209121404Smarcel	case ASM_OP_LFETCH_FAULT_EXCL:
1210121404Smarcel		asm_cmpltr_add(i, ASM_CC_LFTYPE, ASM_CT_FAULT);
1211121404Smarcel		asm_cmpltr_add(i, ASM_CC_LFETCH, ASM_CT_EXCL);
1212121404Smarcel		op = ASM_OP_LFETCH;
1213121404Smarcel		break;
1214121404Smarcel	case ASM_OP_MF_:
1215121404Smarcel		asm_cmpltr_add(i, ASM_CC_MF, ASM_CT_NONE);
1216121404Smarcel		op = ASM_OP_MF;
1217121404Smarcel		break;
1218121404Smarcel	case ASM_OP_MF_A:
1219121404Smarcel		asm_cmpltr_add(i, ASM_CC_MF, ASM_CT_A);
1220121404Smarcel		op = ASM_OP_MF;
1221121404Smarcel		break;
1222121404Smarcel	case ASM_OP_MIX1_L:
1223121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_L);
1224121404Smarcel		op = ASM_OP_MIX1;
1225121404Smarcel		break;
1226121404Smarcel	case ASM_OP_MIX1_R:
1227121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_R);
1228121404Smarcel		op = ASM_OP_MIX1;
1229121404Smarcel		break;
1230121404Smarcel	case ASM_OP_MIX2_L:
1231121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_L);
1232121404Smarcel		op = ASM_OP_MIX2;
1233121404Smarcel		break;
1234121404Smarcel	case ASM_OP_MIX2_R:
1235121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_R);
1236121404Smarcel		op = ASM_OP_MIX2;
1237121404Smarcel		break;
1238121404Smarcel	case ASM_OP_MIX4_L:
1239121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_L);
1240121404Smarcel		op = ASM_OP_MIX4;
1241121404Smarcel		break;
1242121404Smarcel	case ASM_OP_MIX4_R:
1243121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_R);
1244121404Smarcel		op = ASM_OP_MIX4;
1245121404Smarcel		break;
1246121404Smarcel	case ASM_OP_MOV_:
1247121404Smarcel		asm_cmpltr_add(i, ASM_CC_MOV, ASM_CT_NONE);
1248121404Smarcel		op = ASM_OP_MOV;
1249121404Smarcel		break;
1250121404Smarcel	case ASM_OP_MOV_I:
1251121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_I);
1252121404Smarcel		op = ASM_OP_MOV;
1253121404Smarcel		break;
1254121404Smarcel	case ASM_OP_MOV_M:
1255121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_M);
1256121404Smarcel		op = ASM_OP_MOV;
1257121404Smarcel		break;
1258121404Smarcel	case ASM_OP_MOV_RET:
1259121404Smarcel		asm_cmpltr_add(i, ASM_CC_MOV, ASM_CT_RET);
1260121404Smarcel		op = ASM_OP_MOV;
1261121404Smarcel		break;
1262121404Smarcel	case ASM_OP_MOV_CPUID:
1263121404Smarcel		ot = ASM_OPER_CPUID;
1264121404Smarcel		op = ASM_OP_MOV;
1265121404Smarcel		break;
1266121404Smarcel	case ASM_OP_MOV_DBR:
1267121404Smarcel		ot = ASM_OPER_DBR;
1268121404Smarcel		op = ASM_OP_MOV;
1269121404Smarcel		break;
1270121404Smarcel	case ASM_OP_MOV_IBR:
1271121404Smarcel		ot = ASM_OPER_IBR;
1272121404Smarcel		op = ASM_OP_MOV;
1273121404Smarcel		break;
1274121404Smarcel	case ASM_OP_MOV_IP:
1275121404Smarcel		ot = ASM_OPER_IP;
1276121404Smarcel		op = ASM_OP_MOV;
1277121404Smarcel		break;
1278121404Smarcel	case ASM_OP_MOV_MSR:
1279121404Smarcel		ot = ASM_OPER_MSR;
1280121404Smarcel		op = ASM_OP_MOV;
1281121404Smarcel		break;
1282121404Smarcel	case ASM_OP_MOV_PKR:
1283121404Smarcel		ot = ASM_OPER_PKR;
1284121404Smarcel		op = ASM_OP_MOV;
1285121404Smarcel		break;
1286121404Smarcel	case ASM_OP_MOV_PMC:
1287121404Smarcel		ot = ASM_OPER_PMC;
1288121404Smarcel		op = ASM_OP_MOV;
1289121404Smarcel		break;
1290121404Smarcel	case ASM_OP_MOV_PMD:
1291121404Smarcel		ot = ASM_OPER_PMD;
1292121404Smarcel		op = ASM_OP_MOV;
1293121404Smarcel		break;
1294121404Smarcel	case ASM_OP_MOV_PR:
1295121404Smarcel		ot = ASM_OPER_PR;
1296121404Smarcel		op = ASM_OP_MOV;
1297121404Smarcel		break;
1298121404Smarcel	case ASM_OP_MOV_PSR:
1299121404Smarcel		ot = ASM_OPER_PSR;
1300121404Smarcel		op = ASM_OP_MOV;
1301121404Smarcel		break;
1302121404Smarcel	case ASM_OP_MOV_PSR_L:
1303121404Smarcel		ot = ASM_OPER_PSR_L;
1304121404Smarcel		op = ASM_OP_MOV;
1305121404Smarcel		break;
1306121404Smarcel	case ASM_OP_MOV_PSR_UM:
1307121404Smarcel		ot = ASM_OPER_PSR_UM;
1308121404Smarcel		op = ASM_OP_MOV;
1309121404Smarcel		break;
1310121404Smarcel	case ASM_OP_MOV_RR:
1311121404Smarcel		ot = ASM_OPER_RR;
1312121404Smarcel		op = ASM_OP_MOV;
1313121404Smarcel		break;
1314121404Smarcel	case ASM_OP_NOP_B:
1315121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_B);
1316121404Smarcel		op = ASM_OP_NOP;
1317121404Smarcel		break;
1318121404Smarcel	case ASM_OP_NOP_F:
1319121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_F);
1320121404Smarcel		op = ASM_OP_NOP;
1321121404Smarcel		break;
1322121404Smarcel	case ASM_OP_NOP_I:
1323121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_I);
1324121404Smarcel		op = ASM_OP_NOP;
1325121404Smarcel		break;
1326121404Smarcel	case ASM_OP_NOP_M:
1327121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_M);
1328121404Smarcel		op = ASM_OP_NOP;
1329121404Smarcel		break;
1330121404Smarcel	case ASM_OP_NOP_X:
1331121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_X);
1332121404Smarcel		op = ASM_OP_NOP;
1333121404Smarcel		break;
1334121404Smarcel	case ASM_OP_PACK2_SSS:
1335121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_SSS);
1336121404Smarcel		op = ASM_OP_PACK2;
1337121404Smarcel		break;
1338121404Smarcel	case ASM_OP_PACK2_USS:
1339121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_USS);
1340121404Smarcel		op = ASM_OP_PACK2;
1341121404Smarcel		break;
1342121404Smarcel	case ASM_OP_PACK4_SSS:
1343121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_SSS);
1344121404Smarcel		op = ASM_OP_PACK4;
1345121404Smarcel		break;
1346121404Smarcel	case ASM_OP_PADD1_:
1347121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_NONE);
1348121404Smarcel		op = ASM_OP_PADD1;
1349121404Smarcel		break;
1350121404Smarcel	case ASM_OP_PADD1_SSS:
1351121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_SSS);
1352121404Smarcel		op = ASM_OP_PADD1;
1353121404Smarcel		break;
1354121404Smarcel	case ASM_OP_PADD1_UUS:
1355121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_UUS);
1356121404Smarcel		op = ASM_OP_PADD1;
1357121404Smarcel		break;
1358121404Smarcel	case ASM_OP_PADD1_UUU:
1359121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_UUU);
1360121404Smarcel		op = ASM_OP_PADD1;
1361121404Smarcel		break;
1362121404Smarcel	case ASM_OP_PADD2_:
1363121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_NONE);
1364121404Smarcel		op = ASM_OP_PADD2;
1365121404Smarcel		break;
1366121404Smarcel	case ASM_OP_PADD2_SSS:
1367121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_SSS);
1368121404Smarcel		op = ASM_OP_PADD2;
1369121404Smarcel		break;
1370121404Smarcel	case ASM_OP_PADD2_UUS:
1371121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_UUS);
1372121404Smarcel		op = ASM_OP_PADD2;
1373121404Smarcel		break;
1374121404Smarcel	case ASM_OP_PADD2_UUU:
1375121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_UUU);
1376121404Smarcel		op = ASM_OP_PADD2;
1377121404Smarcel		break;
1378121404Smarcel	case ASM_OP_PAVG1_:
1379121404Smarcel		asm_cmpltr_add(i, ASM_CC_PAVG, ASM_CT_NONE);
1380121404Smarcel		op = ASM_OP_PAVG1;
1381121404Smarcel		break;
1382121404Smarcel	case ASM_OP_PAVG1_RAZ:
1383121404Smarcel		asm_cmpltr_add(i, ASM_CC_PAVG, ASM_CT_RAZ);
1384121404Smarcel		op = ASM_OP_PAVG1;
1385121404Smarcel		break;
1386121404Smarcel	case ASM_OP_PAVG2_:
1387121404Smarcel		asm_cmpltr_add(i, ASM_CC_PAVG, ASM_CT_NONE);
1388121404Smarcel		op = ASM_OP_PAVG2;
1389121404Smarcel		break;
1390121404Smarcel	case ASM_OP_PAVG2_RAZ:
1391121404Smarcel		asm_cmpltr_add(i, ASM_CC_PAVG, ASM_CT_RAZ);
1392121404Smarcel		op = ASM_OP_PAVG2;
1393121404Smarcel		break;
1394121404Smarcel	case ASM_OP_PCMP1_EQ:
1395121404Smarcel		asm_cmpltr_add(i, ASM_CC_PREL, ASM_CT_EQ);
1396121404Smarcel		op = ASM_OP_PCMP1;
1397121404Smarcel		break;
1398121404Smarcel	case ASM_OP_PCMP1_GT:
1399121404Smarcel		asm_cmpltr_add(i, ASM_CC_PREL, ASM_CT_GT);
1400121404Smarcel		op = ASM_OP_PCMP1;
1401121404Smarcel		break;
1402121404Smarcel	case ASM_OP_PCMP2_EQ:
1403121404Smarcel		asm_cmpltr_add(i, ASM_CC_PREL, ASM_CT_EQ);
1404121404Smarcel		op = ASM_OP_PCMP2;
1405121404Smarcel		break;
1406121404Smarcel	case ASM_OP_PCMP2_GT:
1407121404Smarcel		asm_cmpltr_add(i, ASM_CC_PREL, ASM_CT_GT);
1408121404Smarcel		op = ASM_OP_PCMP2;
1409121404Smarcel		break;
1410121404Smarcel	case ASM_OP_PCMP4_EQ:
1411121404Smarcel		asm_cmpltr_add(i, ASM_CC_PREL, ASM_CT_EQ);
1412121404Smarcel		op = ASM_OP_PCMP4;
1413121404Smarcel		break;
1414121404Smarcel	case ASM_OP_PCMP4_GT:
1415121404Smarcel		asm_cmpltr_add(i, ASM_CC_PREL, ASM_CT_GT);
1416121404Smarcel		op = ASM_OP_PCMP4;
1417121404Smarcel		break;
1418121404Smarcel	case ASM_OP_PMAX1_U:
1419121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNS, ASM_CT_U);
1420121404Smarcel		op = ASM_OP_PMAX1;
1421121404Smarcel		break;
1422121404Smarcel	case ASM_OP_PMIN1_U:
1423121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNS, ASM_CT_U);
1424121404Smarcel		op = ASM_OP_PMIN1;
1425121404Smarcel		break;
1426121404Smarcel	case ASM_OP_PMPY2_L:
1427121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_L);
1428121404Smarcel		op = ASM_OP_PMPY2;
1429121404Smarcel		break;
1430121404Smarcel	case ASM_OP_PMPY2_R:
1431121404Smarcel		asm_cmpltr_add(i, ASM_CC_LR, ASM_CT_R);
1432121404Smarcel		op = ASM_OP_PMPY2;
1433121404Smarcel		break;
1434121404Smarcel	case ASM_OP_PMPYSHR2_:
1435121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNS, ASM_CT_NONE);
1436121404Smarcel		op = ASM_OP_PMPYSHR2;
1437121404Smarcel		break;
1438121404Smarcel	case ASM_OP_PMPYSHR2_U:
1439121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNS, ASM_CT_U);
1440121404Smarcel		op = ASM_OP_PMPYSHR2;
1441121404Smarcel		break;
1442121404Smarcel	case ASM_OP_PROBE_R:
1443121404Smarcel		asm_cmpltr_add(i, ASM_CC_RW, ASM_CT_R);
1444121404Smarcel		asm_cmpltr_add(i, ASM_CC_PRTYPE, ASM_CT_NONE);
1445121404Smarcel		op = ASM_OP_PROBE;
1446121404Smarcel		break;
1447121404Smarcel	case ASM_OP_PROBE_R_FAULT:
1448121404Smarcel		asm_cmpltr_add(i, ASM_CC_RW, ASM_CT_R);
1449121404Smarcel		asm_cmpltr_add(i, ASM_CC_PRTYPE, ASM_CT_FAULT);
1450121404Smarcel		op = ASM_OP_PROBE;
1451121404Smarcel		break;
1452121404Smarcel	case ASM_OP_PROBE_RW_FAULT:
1453121404Smarcel		asm_cmpltr_add(i, ASM_CC_RW, ASM_CT_RW);
1454121404Smarcel		asm_cmpltr_add(i, ASM_CC_PRTYPE, ASM_CT_FAULT);
1455121404Smarcel		op = ASM_OP_PROBE;
1456121404Smarcel		break;
1457121404Smarcel	case ASM_OP_PROBE_W:
1458121404Smarcel		asm_cmpltr_add(i, ASM_CC_RW, ASM_CT_W);
1459121404Smarcel		asm_cmpltr_add(i, ASM_CC_PRTYPE, ASM_CT_NONE);
1460121404Smarcel		op = ASM_OP_PROBE;
1461121404Smarcel		break;
1462121404Smarcel	case ASM_OP_PROBE_W_FAULT:
1463121404Smarcel		asm_cmpltr_add(i, ASM_CC_RW, ASM_CT_W);
1464121404Smarcel		asm_cmpltr_add(i, ASM_CC_PRTYPE, ASM_CT_FAULT);
1465121404Smarcel		op = ASM_OP_PROBE;
1466121404Smarcel		break;
1467121404Smarcel	case ASM_OP_PSHR2_:
1468121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNS, ASM_CT_NONE);
1469121404Smarcel		op = ASM_OP_PSHR2;
1470121404Smarcel		break;
1471121404Smarcel	case ASM_OP_PSHR2_U:
1472121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNS, ASM_CT_U);
1473121404Smarcel		op = ASM_OP_PSHR2;
1474121404Smarcel		break;
1475121404Smarcel	case ASM_OP_PSHR4_:
1476121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNS, ASM_CT_NONE);
1477121404Smarcel		op = ASM_OP_PSHR4;
1478121404Smarcel		break;
1479121404Smarcel	case ASM_OP_PSHR4_U:
1480121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNS, ASM_CT_U);
1481121404Smarcel		op = ASM_OP_PSHR4;
1482121404Smarcel		break;
1483121404Smarcel	case ASM_OP_PSUB1_:
1484121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_NONE);
1485121404Smarcel		op = ASM_OP_PSUB1;
1486121404Smarcel		break;
1487121404Smarcel	case ASM_OP_PSUB1_SSS:
1488121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_SSS);
1489121404Smarcel		op = ASM_OP_PSUB1;
1490121404Smarcel		break;
1491121404Smarcel	case ASM_OP_PSUB1_UUS:
1492121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_UUS);
1493121404Smarcel		op = ASM_OP_PSUB1;
1494121404Smarcel		break;
1495121404Smarcel	case ASM_OP_PSUB1_UUU:
1496121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_UUU);
1497121404Smarcel		op = ASM_OP_PSUB1;
1498121404Smarcel		break;
1499121404Smarcel	case ASM_OP_PSUB2_:
1500121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_NONE);
1501121404Smarcel		op = ASM_OP_PSUB2;
1502121404Smarcel		break;
1503121404Smarcel	case ASM_OP_PSUB2_SSS:
1504121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_SSS);
1505121404Smarcel		op = ASM_OP_PSUB2;
1506121404Smarcel		break;
1507121404Smarcel	case ASM_OP_PSUB2_UUS:
1508121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_UUS);
1509121404Smarcel		op = ASM_OP_PSUB2;
1510121404Smarcel		break;
1511121404Smarcel	case ASM_OP_PSUB2_UUU:
1512121404Smarcel		asm_cmpltr_add(i, ASM_CC_SAT, ASM_CT_UUU);
1513121404Smarcel		op = ASM_OP_PSUB2;
1514121404Smarcel		break;
1515121404Smarcel	case ASM_OP_PTC_E:
1516121404Smarcel		asm_cmpltr_add(i, ASM_CC_PTC, ASM_CT_E);
1517121404Smarcel		op = ASM_OP_PTC;
1518121404Smarcel		break;
1519121404Smarcel	case ASM_OP_PTC_G:
1520121404Smarcel		asm_cmpltr_add(i, ASM_CC_PTC, ASM_CT_G);
1521121404Smarcel		op = ASM_OP_PTC;
1522121404Smarcel		break;
1523121404Smarcel	case ASM_OP_PTC_GA:
1524121404Smarcel		asm_cmpltr_add(i, ASM_CC_PTC, ASM_CT_GA);
1525121404Smarcel		op = ASM_OP_PTC;
1526121404Smarcel		break;
1527121404Smarcel	case ASM_OP_PTC_L:
1528121404Smarcel		asm_cmpltr_add(i, ASM_CC_PTC, ASM_CT_L);
1529121404Smarcel		op = ASM_OP_PTC;
1530121404Smarcel		break;
1531121404Smarcel	case ASM_OP_PTR_D:
1532121404Smarcel		asm_cmpltr_add(i, ASM_CC_PTR, ASM_CT_D);
1533121404Smarcel		op = ASM_OP_PTR;
1534121404Smarcel		break;
1535121404Smarcel	case ASM_OP_PTR_I:
1536121404Smarcel		asm_cmpltr_add(i, ASM_CC_PTR, ASM_CT_I);
1537121404Smarcel		op = ASM_OP_PTR;
1538121404Smarcel		break;
1539121404Smarcel	case ASM_OP_SETF_D:
1540121404Smarcel		asm_cmpltr_add(i, ASM_CC_SETF, ASM_CT_D);
1541121404Smarcel		op = ASM_OP_SETF;
1542121404Smarcel		break;
1543121404Smarcel	case ASM_OP_SETF_EXP:
1544121404Smarcel		asm_cmpltr_add(i, ASM_CC_SETF, ASM_CT_EXP);
1545121404Smarcel		op = ASM_OP_SETF;
1546121404Smarcel		break;
1547121404Smarcel	case ASM_OP_SETF_S:
1548121404Smarcel		asm_cmpltr_add(i, ASM_CC_SETF, ASM_CT_S);
1549121404Smarcel		op = ASM_OP_SETF;
1550121404Smarcel		break;
1551121404Smarcel	case ASM_OP_SETF_SIG:
1552121404Smarcel		asm_cmpltr_add(i, ASM_CC_SETF, ASM_CT_SIG);
1553121404Smarcel		op = ASM_OP_SETF;
1554121404Smarcel		break;
1555121404Smarcel	case ASM_OP_SHR_:
1556121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNS, ASM_CT_NONE);
1557121404Smarcel		op = ASM_OP_SHR;
1558121404Smarcel		break;
1559121404Smarcel	case ASM_OP_SHR_U:
1560121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNS, ASM_CT_U);
1561121404Smarcel		op = ASM_OP_SHR;
1562121404Smarcel		break;
1563121404Smarcel	case ASM_OP_SRLZ_D:
1564121404Smarcel		asm_cmpltr_add(i, ASM_CC_SRLZ, ASM_CT_D);
1565121404Smarcel		op = ASM_OP_SRLZ;
1566121404Smarcel		break;
1567121404Smarcel	case ASM_OP_SRLZ_I:
1568121404Smarcel		asm_cmpltr_add(i, ASM_CC_SRLZ, ASM_CT_I);
1569121404Smarcel		op = ASM_OP_SRLZ;
1570121404Smarcel		break;
1571121404Smarcel	case ASM_OP_ST1_:
1572121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_NONE);
1573121404Smarcel		op = ASM_OP_ST1;
1574121404Smarcel		break;
1575121404Smarcel	case ASM_OP_ST1_REL:
1576121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_REL);
1577121404Smarcel		op = ASM_OP_ST1;
1578121404Smarcel		break;
1579121404Smarcel	case ASM_OP_ST16_:
1580121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_NONE);
1581121404Smarcel		op = ASM_OP_ST16;
1582121404Smarcel		break;
1583121404Smarcel	case ASM_OP_ST16_REL:
1584121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_REL);
1585121404Smarcel		op = ASM_OP_ST16;
1586121404Smarcel		break;
1587121404Smarcel	case ASM_OP_ST2_:
1588121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_NONE);
1589121404Smarcel		op = ASM_OP_ST2;
1590121404Smarcel		break;
1591121404Smarcel	case ASM_OP_ST2_REL:
1592121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_REL);
1593121404Smarcel		op = ASM_OP_ST2;
1594121404Smarcel		break;
1595121404Smarcel	case ASM_OP_ST4_:
1596121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_NONE);
1597121404Smarcel		op = ASM_OP_ST4;
1598121404Smarcel		break;
1599121404Smarcel	case ASM_OP_ST4_REL:
1600121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_REL);
1601121404Smarcel		op = ASM_OP_ST4;
1602121404Smarcel		break;
1603121404Smarcel	case ASM_OP_ST8_:
1604121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_NONE);
1605121404Smarcel		op = ASM_OP_ST8;
1606121404Smarcel		break;
1607121404Smarcel	case ASM_OP_ST8_REL:
1608121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_REL);
1609121404Smarcel		op = ASM_OP_ST8;
1610121404Smarcel		break;
1611121404Smarcel	case ASM_OP_ST8_SPILL:
1612121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_SPILL);
1613121404Smarcel		op = ASM_OP_ST8;
1614121404Smarcel		break;
1615121404Smarcel	case ASM_OP_STF_SPILL:
1616121404Smarcel		asm_cmpltr_add(i, ASM_CC_STTYPE, ASM_CT_SPILL);
1617121404Smarcel		op = ASM_OP_STF;
1618121404Smarcel		break;
1619121404Smarcel	case ASM_OP_SYNC_I:
1620121404Smarcel		asm_cmpltr_add(i, ASM_CC_SYNC, ASM_CT_I);
1621121404Smarcel		op = ASM_OP_SYNC;
1622121404Smarcel		break;
1623121404Smarcel	case ASM_OP_TBIT_NZ_AND:
1624121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_NZ);
1625121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
1626121404Smarcel		op = ASM_OP_TBIT;
1627121404Smarcel		break;
1628121404Smarcel	case ASM_OP_TBIT_NZ_OR:
1629121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_NZ);
1630121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
1631121404Smarcel		op = ASM_OP_TBIT;
1632121404Smarcel		break;
1633121404Smarcel	case ASM_OP_TBIT_NZ_OR_ANDCM:
1634121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_NZ);
1635121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
1636121404Smarcel		op = ASM_OP_TBIT;
1637121404Smarcel		break;
1638121404Smarcel	case ASM_OP_TBIT_Z:
1639121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1640121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_NONE);
1641121404Smarcel		op = ASM_OP_TBIT;
1642121404Smarcel		break;
1643121404Smarcel	case ASM_OP_TBIT_Z_AND:
1644121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1645121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
1646121404Smarcel		op = ASM_OP_TBIT;
1647121404Smarcel		break;
1648121404Smarcel	case ASM_OP_TBIT_Z_OR:
1649121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1650121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
1651121404Smarcel		op = ASM_OP_TBIT;
1652121404Smarcel		break;
1653121404Smarcel	case ASM_OP_TBIT_Z_OR_ANDCM:
1654121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1655121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
1656121404Smarcel		op = ASM_OP_TBIT;
1657121404Smarcel		break;
1658121404Smarcel	case ASM_OP_TBIT_Z_UNC:
1659121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1660121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_UNC);
1661121404Smarcel		op = ASM_OP_TBIT;
1662121404Smarcel		break;
1663159916Smarcel	case ASM_OP_TF_NZ_AND:
1664159916Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_NZ);
1665159916Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
1666159916Smarcel		op = ASM_OP_TF;
1667159916Smarcel		break;
1668159916Smarcel	case ASM_OP_TF_NZ_OR:
1669159916Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_NZ);
1670159916Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
1671159916Smarcel		op = ASM_OP_TF;
1672159916Smarcel		break;
1673159916Smarcel	case ASM_OP_TF_NZ_OR_ANDCM:
1674159916Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_NZ);
1675159916Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
1676159916Smarcel		op = ASM_OP_TF;
1677159916Smarcel		break;
1678159916Smarcel	case ASM_OP_TF_Z:
1679159916Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1680159916Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_NONE);
1681159916Smarcel		op = ASM_OP_TF;
1682159916Smarcel		break;
1683159916Smarcel	case ASM_OP_TF_Z_AND:
1684159916Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1685159916Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
1686159916Smarcel		op = ASM_OP_TF;
1687159916Smarcel		break;
1688159916Smarcel	case ASM_OP_TF_Z_OR:
1689159916Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1690159916Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
1691159916Smarcel		op = ASM_OP_TF;
1692159916Smarcel		break;
1693159916Smarcel	case ASM_OP_TF_Z_OR_ANDCM:
1694159916Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1695159916Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
1696159916Smarcel		op = ASM_OP_TF;
1697159916Smarcel		break;
1698159916Smarcel	case ASM_OP_TF_Z_UNC:
1699159916Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1700159916Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_UNC);
1701159916Smarcel		op = ASM_OP_TF;
1702159916Smarcel		break;
1703121404Smarcel	case ASM_OP_TNAT_NZ_AND:
1704121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_NZ);
1705121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
1706121404Smarcel		op = ASM_OP_TNAT;
1707121404Smarcel		break;
1708121404Smarcel	case ASM_OP_TNAT_NZ_OR:
1709121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_NZ);
1710121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
1711121404Smarcel		op = ASM_OP_TNAT;
1712121404Smarcel		break;
1713121404Smarcel	case ASM_OP_TNAT_NZ_OR_ANDCM:
1714121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_NZ);
1715121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
1716121404Smarcel		op = ASM_OP_TNAT;
1717121404Smarcel		break;
1718121404Smarcel	case ASM_OP_TNAT_Z:
1719121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1720121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_NONE);
1721121404Smarcel		op = ASM_OP_TNAT;
1722121404Smarcel		break;
1723121404Smarcel	case ASM_OP_TNAT_Z_AND:
1724121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1725121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_AND);
1726121404Smarcel		op = ASM_OP_TNAT;
1727121404Smarcel		break;
1728121404Smarcel	case ASM_OP_TNAT_Z_OR:
1729121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1730121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR);
1731121404Smarcel		op = ASM_OP_TNAT;
1732121404Smarcel		break;
1733121404Smarcel	case ASM_OP_TNAT_Z_OR_ANDCM:
1734121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1735121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_OR_ANDCM);
1736121404Smarcel		op = ASM_OP_TNAT;
1737121404Smarcel		break;
1738121404Smarcel	case ASM_OP_TNAT_Z_UNC:
1739121404Smarcel		asm_cmpltr_add(i, ASM_CC_TREL, ASM_CT_Z);
1740121404Smarcel		asm_cmpltr_add(i, ASM_CC_CTYPE, ASM_CT_UNC);
1741121404Smarcel		op = ASM_OP_TNAT;
1742121404Smarcel		break;
1743121404Smarcel	case ASM_OP_UNPACK1_H:
1744121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNPACK, ASM_CT_H);
1745121404Smarcel		op = ASM_OP_UNPACK1;
1746121404Smarcel		break;
1747121404Smarcel	case ASM_OP_UNPACK1_L:
1748121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNPACK, ASM_CT_L);
1749121404Smarcel		op = ASM_OP_UNPACK1;
1750121404Smarcel		break;
1751121404Smarcel	case ASM_OP_UNPACK2_H:
1752121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNPACK, ASM_CT_H);
1753121404Smarcel		op = ASM_OP_UNPACK2;
1754121404Smarcel		break;
1755121404Smarcel	case ASM_OP_UNPACK2_L:
1756121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNPACK, ASM_CT_L);
1757121404Smarcel		op = ASM_OP_UNPACK2;
1758121404Smarcel		break;
1759121404Smarcel	case ASM_OP_UNPACK4_H:
1760121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNPACK, ASM_CT_H);
1761121404Smarcel		op = ASM_OP_UNPACK4;
1762121404Smarcel		break;
1763121404Smarcel	case ASM_OP_UNPACK4_L:
1764121404Smarcel		asm_cmpltr_add(i, ASM_CC_UNPACK, ASM_CT_L);
1765121404Smarcel		op = ASM_OP_UNPACK4;
1766121404Smarcel		break;
1767159916Smarcel	case ASM_OP_VMSW_0:
1768159916Smarcel		asm_cmpltr_add(i, ASM_CC_VMSW, ASM_CT_0);
1769159916Smarcel		op = ASM_OP_VMSW;
1770159916Smarcel		break;
1771159916Smarcel	case ASM_OP_VMSW_1:
1772159916Smarcel		asm_cmpltr_add(i, ASM_CC_VMSW, ASM_CT_1);
1773159916Smarcel		op = ASM_OP_VMSW;
1774159916Smarcel		break;
1775121404Smarcel	case ASM_OP_XMA_H:
1776121404Smarcel		asm_cmpltr_add(i, ASM_CC_XMA, ASM_CT_H);
1777121404Smarcel		op = ASM_OP_XMA;
1778121404Smarcel		break;
1779121404Smarcel	case ASM_OP_XMA_HU:
1780121404Smarcel		asm_cmpltr_add(i, ASM_CC_XMA, ASM_CT_HU);
1781121404Smarcel		op = ASM_OP_XMA;
1782121404Smarcel		break;
1783121404Smarcel	case ASM_OP_XMA_L:
1784121404Smarcel		asm_cmpltr_add(i, ASM_CC_XMA, ASM_CT_L);
1785121404Smarcel		op = ASM_OP_XMA;
1786121404Smarcel		break;
1787121404Smarcel	default:
1788121404Smarcel		KASSERT(op < ASM_OP_NUMBER_OF_OPCODES, ("foo"));
1789121404Smarcel		break;
1790121404Smarcel	}
1791121404Smarcel	i->i_op = op;
1792121404Smarcel	return (ot);
1793121404Smarcel}
1794121404Smarcel
1795121404Smarcelstatic __inline void
1796121404Smarcelop_imm(struct asm_inst *i, int op, uint64_t val)
1797121404Smarcel{
1798121404Smarcel	i->i_oper[op].o_type = ASM_OPER_IMM;
1799121404Smarcel	i->i_oper[op].o_value = val;
1800121404Smarcel}
1801121404Smarcel
1802121404Smarcelstatic __inline void
1803121404Smarcelop_type(struct asm_inst *i, int op, enum asm_oper_type ot)
1804121404Smarcel{
1805121404Smarcel	i->i_oper[op].o_type = ot;
1806121404Smarcel}
1807121404Smarcel
1808121404Smarcelstatic __inline void
1809121404Smarcelop_value(struct asm_inst *i, int op, uint64_t val)
1810121404Smarcel{
1811121404Smarcel	i->i_oper[op].o_value = val;
1812121404Smarcel}
1813121404Smarcel
1814121404Smarcelstatic __inline void
1815121404Smarceloperand(struct asm_inst *i, int op, enum asm_oper_type ot, uint64_t bits,
1816121404Smarcel    int o, int l)
1817121404Smarcel{
1818121404Smarcel	i->i_oper[op].o_type = ot;
1819121404Smarcel	i->i_oper[op].o_value = FIELD(bits, o, l);
1820121404Smarcel}
1821121404Smarcel
1822121404Smarcelstatic uint64_t
1823121404Smarcelimm(uint64_t bits, int sign, int o, int l)
1824121404Smarcel{
1825121404Smarcel	uint64_t val = FIELD(bits, o, l);
1826121404Smarcel
1827121404Smarcel	if (sign && (val & (1LL << (l - 1))) != 0)
1828121404Smarcel		val |= -1LL << l;
1829121404Smarcel	return (val);
1830121404Smarcel}
1831121404Smarcel
1832121404Smarcelstatic void
1833121404Smarcels_imm(struct asm_inst *i, int op, uint64_t bits, int o, int l)
1834121404Smarcel{
1835121404Smarcel	i->i_oper[op].o_type = ASM_OPER_IMM;
1836121404Smarcel	i->i_oper[op].o_value = imm(bits, 1, o, l);
1837121404Smarcel}
1838121404Smarcel
1839121404Smarcelstatic void
1840121404Smarcelu_imm(struct asm_inst *i, int op, uint64_t bits, int o, int l)
1841121404Smarcel{
1842121404Smarcel	i->i_oper[op].o_type = ASM_OPER_IMM;
1843121404Smarcel	i->i_oper[op].o_value = imm(bits, 0, o, l);
1844121404Smarcel}
1845121404Smarcel
1846121404Smarcelstatic uint64_t
1847121404Smarcelvimm(uint64_t bits, int sign, va_list ap)
1848121404Smarcel{
1849121404Smarcel	uint64_t val = 0;
1850121404Smarcel	int len = 0;
1851121404Smarcel	int frag;
1852121404Smarcel
1853121404Smarcel	while ((frag = va_arg(ap, int)) != 0) {
1854121404Smarcel		val |= (uint64_t)FIELD(bits, FRAG_OFS(frag), FRAG_LEN(frag))
1855121404Smarcel		    << len;
1856121404Smarcel		len += FRAG_LEN(frag);
1857121404Smarcel	}
1858121404Smarcel	if (sign && (val & (1LL << (len - 1))) != 0)
1859121404Smarcel		val |= -1LL << len;
1860121404Smarcel	return (val);
1861121404Smarcel}
1862121404Smarcel
1863121404Smarcelstatic void
1864121404Smarcels_immf(struct asm_inst *i, int op, uint64_t bits, ...)
1865121404Smarcel{
1866121404Smarcel	va_list ap;
1867121404Smarcel	va_start(ap, bits);
1868121404Smarcel	i->i_oper[op].o_type = ASM_OPER_IMM;
1869121404Smarcel	i->i_oper[op].o_value = vimm(bits, 1, ap);
1870121404Smarcel	va_end(ap);
1871121404Smarcel}
1872121404Smarcel
1873121404Smarcelstatic void
1874121404Smarcelu_immf(struct asm_inst *i, int op, uint64_t bits, ...)
1875121404Smarcel{
1876121404Smarcel	va_list ap;
1877121404Smarcel	va_start(ap, bits);
1878121404Smarcel	i->i_oper[op].o_type = ASM_OPER_IMM;
1879121404Smarcel	i->i_oper[op].o_value = vimm(bits, 0, ap);
1880121404Smarcel	va_end(ap);
1881121404Smarcel}
1882121404Smarcel
1883121404Smarcelstatic void
1884121404Smarceldisp(struct asm_inst *i, int op, uint64_t bits, ...)
1885121404Smarcel{
1886121404Smarcel	va_list ap;
1887121404Smarcel	va_start(ap, bits);
1888121404Smarcel	i->i_oper[op].o_type = ASM_OPER_DISP;
1889121404Smarcel	i->i_oper[op].o_value = vimm(bits, 1, ap) << 4;
1890121404Smarcel	va_end(ap);
1891121404Smarcel}
1892121404Smarcel
1893121404Smarcelstatic __inline void
1894121404Smarcelcombine(uint64_t *dst, int dl, uint64_t src, int sl, int so)
1895121404Smarcel{
1896121404Smarcel	*dst = (*dst & ((1LL << dl) - 1LL)) |
1897121404Smarcel	    ((uint64_t)_FLD64(src, so, sl) << dl);
1898121404Smarcel}
1899121404Smarcel
1900121404Smarcelint
1901121404Smarcelasm_extract(enum asm_op op, enum asm_fmt fmt, uint64_t bits,
1902121404Smarcel    struct asm_bundle *b, int slot)
1903121404Smarcel{
1904121404Smarcel	struct asm_inst *i = b->b_inst + slot;
1905121404Smarcel	enum asm_oper_type ot;
1906121404Smarcel
1907121404Smarcel	KASSERT(op != ASM_OP_NONE, ("foo"));
1908121404Smarcel	i->i_bits = bits;
1909121404Smarcel	i->i_format = fmt;
1910121404Smarcel	i->i_srcidx = 2;
1911121404Smarcel
1912121404Smarcel	ot = asm_normalize(i, op);
1913121404Smarcel
1914121404Smarcel	if (fmt != ASM_FMT_B6 && fmt != ASM_FMT_B7)
1915121404Smarcel		operand(i, 0, ASM_OPER_PREG, bits, 0, 6);
1916121404Smarcel
1917121404Smarcel	switch (fmt) {
1918121404Smarcel	case ASM_FMT_A1:
1919121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
1920121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
1921121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
1922121404Smarcel		if ((op == ASM_OP_ADD && FIELD(bits, 27, 2) == 1) ||
1923121404Smarcel		    (op == ASM_OP_SUB && FIELD(bits, 27, 2) == 0))
1924121404Smarcel			op_imm(i, 4, 1LL);
1925121404Smarcel		break;
1926121404Smarcel	case ASM_FMT_A2:
1927121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
1928121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
1929121404Smarcel		op_imm(i, 3, 1LL + FIELD(bits, 27, 2));
1930121404Smarcel		operand(i, 4, ASM_OPER_GREG, bits, 20, 7);
1931121404Smarcel		break;
1932121404Smarcel	case ASM_FMT_A3:
1933121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
1934121404Smarcel		s_immf(i, 2, bits, FRAG(13,7), FRAG(36,1), 0);
1935121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
1936121404Smarcel		break;
1937121404Smarcel	case ASM_FMT_A4:
1938121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
1939121404Smarcel		s_immf(i, 2, bits, FRAG(13,7), FRAG(27,6), FRAG(36,1), 0);
1940121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
1941121404Smarcel		break;
1942121404Smarcel	case ASM_FMT_A5:
1943121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
1944121404Smarcel		s_immf(i, 2, bits, FRAG(13,7), FRAG(27,9), FRAG(22,5),
1945121404Smarcel		    FRAG(36,1), 0);
1946121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 2);
1947121404Smarcel		break;
1948121404Smarcel	case ASM_FMT_A6: /* 2 dst */
1949121404Smarcel		operand(i, 1, ASM_OPER_PREG, bits, 6, 6);
1950121404Smarcel		operand(i, 2, ASM_OPER_PREG, bits, 27, 6);
1951121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 13, 7);
1952121404Smarcel		operand(i, 4, ASM_OPER_GREG, bits, 20, 7);
1953121404Smarcel		i->i_srcidx++;
1954121404Smarcel		break;
1955121404Smarcel	case ASM_FMT_A7: /* 2 dst */
1956121404Smarcel		if (FIELD(bits, 13, 7) != 0)
1957121404Smarcel			return (0);
1958121404Smarcel		operand(i, 1, ASM_OPER_PREG, bits, 6, 6);
1959121404Smarcel		operand(i, 2, ASM_OPER_PREG, bits, 27, 6);
1960121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 13, 7);
1961121404Smarcel		operand(i, 4, ASM_OPER_GREG, bits, 20, 7);
1962121404Smarcel		i->i_srcidx++;
1963121404Smarcel		break;
1964121404Smarcel	case ASM_FMT_A8: /* 2 dst */
1965121404Smarcel		operand(i, 1, ASM_OPER_PREG, bits, 6, 6);
1966121404Smarcel		operand(i, 2, ASM_OPER_PREG, bits, 27, 6);
1967121404Smarcel		s_immf(i, 3, bits, FRAG(13,7), FRAG(36,1), 0);
1968121404Smarcel		operand(i, 4, ASM_OPER_GREG, bits, 20, 7);
1969121404Smarcel		i->i_srcidx++;
1970121404Smarcel		break;
1971121404Smarcel	case ASM_FMT_A9:
1972121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
1973121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
1974121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
1975121404Smarcel		break;
1976121404Smarcel	case ASM_FMT_A10:
1977121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
1978121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
1979121404Smarcel		op_imm(i, 3, 1LL + FIELD(bits, 27, 2));
1980121404Smarcel		operand(i, 4, ASM_OPER_GREG, bits, 20, 7);
1981121404Smarcel		break;
1982121404Smarcel	case ASM_FMT_B1: /* 0 dst */
1983121404Smarcel		asm_brhint(i);
1984121404Smarcel		disp(i, 1, bits, FRAG(13,20), FRAG(36,1), 0);
1985121404Smarcel		break;
1986121404Smarcel	case ASM_FMT_B2: /* 0 dst */
1987121404Smarcel		if (FIELD(bits, 0, 6) != 0)
1988121404Smarcel			return (0);
1989121404Smarcel		asm_brhint(i);
1990121404Smarcel		disp(i, 1, bits, FRAG(13,20), FRAG(36,1), 0);
1991121404Smarcel		break;
1992121404Smarcel	case ASM_FMT_B3:
1993121404Smarcel		asm_brhint(i);
1994121404Smarcel		operand(i, 1, ASM_OPER_BREG, bits, 6, 3);
1995121404Smarcel		disp(i, 2, bits, FRAG(13,20), FRAG(36,1), 0);
1996121404Smarcel		break;
1997121404Smarcel	case ASM_FMT_B4: /* 0 dst */
1998121404Smarcel		asm_brhint(i);
1999121404Smarcel		operand(i, 1, ASM_OPER_BREG, bits, 13, 3);
2000121404Smarcel		break;
2001121404Smarcel	case ASM_FMT_B5:
2002121404Smarcel#if 0
2003121404Smarcel		if (FIELD(bits, 32, 1) == 0)
2004121404Smarcel			return (0);
2005121404Smarcel#endif
2006121404Smarcel		asm_brhint(i);
2007121404Smarcel		operand(i, 1, ASM_OPER_BREG, bits, 6, 3);
2008121404Smarcel		operand(i, 2, ASM_OPER_BREG, bits, 13, 3);
2009121404Smarcel		break;
2010121404Smarcel	case ASM_FMT_B6: /* 0 dst */
2011121404Smarcel		asm_brphint(i);
2012121404Smarcel		disp(i, 1, bits, FRAG(13,20), FRAG(36,1), 0);
2013121404Smarcel		disp(i, 2, bits, FRAG(6,7), FRAG(33,2), 0);
2014121404Smarcel		i->i_srcidx--;
2015121404Smarcel		break;
2016121404Smarcel	case ASM_FMT_B7: /* 0 dst */
2017121404Smarcel		asm_brphint(i);
2018121404Smarcel		operand(i, 1, ASM_OPER_BREG, bits, 13, 3);
2019121404Smarcel		disp(i, 2, bits, FRAG(6,7), FRAG(33,2), 0);
2020121404Smarcel		i->i_srcidx--;
2021121404Smarcel		break;
2022121404Smarcel	case ASM_FMT_B8:
2023121404Smarcel		/* no operands */
2024121404Smarcel		break;
2025121404Smarcel	case ASM_FMT_B9: /* 0 dst */
2026121404Smarcel		u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
2027121404Smarcel		break;
2028121404Smarcel	case ASM_FMT_F1:
2029121404Smarcel		asm_sf(i);
2030121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2031121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2032121404Smarcel		operand(i, 3, ASM_OPER_FREG, bits, 20, 7);
2033121404Smarcel		operand(i, 4, ASM_OPER_FREG, bits, 27, 7);
2034121404Smarcel		break;
2035121404Smarcel	case ASM_FMT_F2:
2036121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2037121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2038121404Smarcel		operand(i, 3, ASM_OPER_FREG, bits, 20, 7);
2039121404Smarcel		operand(i, 4, ASM_OPER_FREG, bits, 27, 7);
2040121404Smarcel		break;
2041121404Smarcel	case ASM_FMT_F3:
2042121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2043121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2044121404Smarcel		operand(i, 3, ASM_OPER_FREG, bits, 20, 7);
2045121404Smarcel		operand(i, 4, ASM_OPER_FREG, bits, 27, 7);
2046121404Smarcel		break;
2047121404Smarcel	case ASM_FMT_F4: /* 2 dst */
2048121404Smarcel		if (FIELD(bits, 33, 1)) { /* ra */
2049121404Smarcel			if (FIELD(bits, 36, 1)) /* rb */
2050121404Smarcel				asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_UNORD);
2051121404Smarcel			else
2052121404Smarcel				asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_LE);
2053121404Smarcel		} else {
2054121404Smarcel			if (FIELD(bits, 36, 1)) /* rb */
2055121404Smarcel				asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_LT);
2056121404Smarcel			else
2057121404Smarcel				asm_cmpltr_add(i, ASM_CC_FREL, ASM_CT_EQ);
2058121404Smarcel		}
2059121404Smarcel		if (FIELD(bits, 12, 1)) /* ta */
2060121404Smarcel			asm_cmpltr_add(i, ASM_CC_FCTYPE, ASM_CT_UNC);
2061121404Smarcel		else
2062121404Smarcel			asm_cmpltr_add(i, ASM_CC_FCTYPE, ASM_CT_NONE);
2063121404Smarcel		asm_sf(i);
2064121404Smarcel		operand(i, 1, ASM_OPER_PREG, bits, 6, 6);
2065121404Smarcel		operand(i, 2, ASM_OPER_PREG, bits, 27, 6);
2066121404Smarcel		operand(i, 3, ASM_OPER_FREG, bits, 13, 7);
2067121404Smarcel		operand(i, 4, ASM_OPER_FREG, bits, 20, 7);
2068121404Smarcel		i->i_srcidx++;
2069121404Smarcel		break;
2070121404Smarcel	case ASM_FMT_F5: /* 2 dst */
2071121404Smarcel		operand(i, 1, ASM_OPER_PREG, bits, 6, 6);
2072121404Smarcel		operand(i, 2, ASM_OPER_PREG, bits, 27, 6);
2073121404Smarcel		operand(i, 3, ASM_OPER_FREG, bits, 13, 7);
2074121404Smarcel		u_immf(i, 4, bits, FRAG(33,2), FRAG(20,7), 0);
2075121404Smarcel		i->i_srcidx++;
2076121404Smarcel		break;
2077121404Smarcel	case ASM_FMT_F6: /* 2 dst */
2078121404Smarcel		asm_sf(i);
2079121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2080121404Smarcel		operand(i, 2, ASM_OPER_PREG, bits, 27, 6);
2081121404Smarcel		operand(i, 3, ASM_OPER_FREG, bits, 13, 7);
2082121404Smarcel		operand(i, 4, ASM_OPER_FREG, bits, 20, 7);
2083121404Smarcel		i->i_srcidx++;
2084121404Smarcel		break;
2085121404Smarcel	case ASM_FMT_F7: /* 2 dst */
2086121404Smarcel		asm_sf(i);
2087121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2088121404Smarcel		operand(i, 2, ASM_OPER_PREG, bits, 27, 6);
2089121404Smarcel		operand(i, 3, ASM_OPER_FREG, bits, 20, 7);
2090121404Smarcel		i->i_srcidx++;
2091121404Smarcel		break;
2092121404Smarcel	case ASM_FMT_F8:
2093121404Smarcel		asm_sf(i);
2094121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2095121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2096121404Smarcel		operand(i, 3, ASM_OPER_FREG, bits, 20, 7);
2097121404Smarcel		break;
2098121404Smarcel	case ASM_FMT_F9:
2099121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2100121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2101121404Smarcel		operand(i, 3, ASM_OPER_FREG, bits, 20, 7);
2102121404Smarcel		break;
2103121404Smarcel	case ASM_FMT_F10:
2104121404Smarcel		asm_sf(i);
2105121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2106121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2107121404Smarcel		break;
2108121404Smarcel	case ASM_FMT_F11:
2109121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2110121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2111121404Smarcel		break;
2112121404Smarcel	case ASM_FMT_F12: /* 0 dst */
2113121404Smarcel		asm_sf(i);
2114121404Smarcel		u_imm(i, 1, bits, 13, 7);
2115121404Smarcel		u_imm(i, 2, bits, 20, 7);
2116121404Smarcel		i->i_srcidx--;
2117121404Smarcel		break;
2118121404Smarcel	case ASM_FMT_F13:
2119121404Smarcel		asm_sf(i);
2120121404Smarcel		/* no operands */
2121121404Smarcel		break;
2122121404Smarcel	case ASM_FMT_F14: /* 0 dst */
2123121404Smarcel		asm_sf(i);
2124121404Smarcel		disp(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
2125121404Smarcel		break;
2126121404Smarcel	case ASM_FMT_F15: /* 0 dst */
2127121404Smarcel		u_imm(i, 1, bits, 6, 20);
2128121404Smarcel		break;
2129159909Smarcel	case ASM_FMT_F16: /* 0 dst */
2130159909Smarcel		u_imm(i, 1, bits, 6, 20);
2131159909Smarcel		break;
2132121404Smarcel	case ASM_FMT_I1:
2133121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2134121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2135121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
2136121404Smarcel		switch (FIELD(bits, 30, 2)) {
2137121404Smarcel		case 0:	op_imm(i, 4, 0LL); break;
2138121404Smarcel		case 1: op_imm(i, 4, 7LL); break;
2139121404Smarcel		case 2: op_imm(i, 4, 15LL); break;
2140121404Smarcel		case 3: op_imm(i, 4, 16LL); break;
2141121404Smarcel		}
2142121404Smarcel		break;
2143121404Smarcel	case ASM_FMT_I2:
2144121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2145121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2146121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
2147121404Smarcel		break;
2148121404Smarcel	case ASM_FMT_I3:
2149121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2150121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2151121404Smarcel		u_imm(i, 3, bits, 20, 4);
2152121404Smarcel		break;
2153121404Smarcel	case ASM_FMT_I4:
2154121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2155121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2156121404Smarcel		u_imm(i, 3, bits, 20, 8);
2157121404Smarcel		break;
2158121404Smarcel	case ASM_FMT_I5:
2159121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2160121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 20, 7);
2161121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 13, 7);
2162121404Smarcel		break;
2163121404Smarcel	case ASM_FMT_I6:
2164121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2165121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 20, 7);
2166121404Smarcel		u_imm(i, 3, bits, 14, 5);
2167121404Smarcel		break;
2168121404Smarcel	case ASM_FMT_I7:
2169121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2170121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2171121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
2172121404Smarcel		break;
2173121404Smarcel	case ASM_FMT_I8:
2174121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2175121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2176121404Smarcel		op_imm(i, 3, 31LL - FIELD(bits, 20, 5));
2177121404Smarcel		break;
2178121404Smarcel	case ASM_FMT_I9:
2179121404Smarcel		if (FIELD(bits, 13, 7) != 0)
2180121404Smarcel			return (0);
2181121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2182121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 20, 7);
2183121404Smarcel		break;
2184121404Smarcel	case ASM_FMT_I10:
2185121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2186121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2187121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
2188121404Smarcel		u_imm(i, 4, bits, 27, 6);
2189121404Smarcel		break;
2190121404Smarcel	case ASM_FMT_I11:
2191121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2192121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 20, 7);
2193121404Smarcel		u_imm(i, 3, bits, 14, 6);
2194121404Smarcel		op_imm(i, 4, 1LL + FIELD(bits, 27, 6));
2195121404Smarcel		break;
2196121404Smarcel	case ASM_FMT_I12:
2197121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2198121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2199121404Smarcel		op_imm(i, 3, 63LL - FIELD(bits, 20, 6));
2200121404Smarcel		op_imm(i, 4, 1LL + FIELD(bits, 27, 6));
2201121404Smarcel		break;
2202121404Smarcel	case ASM_FMT_I13:
2203121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2204121404Smarcel		s_immf(i, 2, bits, FRAG(13,7), FRAG(36,1), 0);
2205121404Smarcel		op_imm(i, 3, 63LL - FIELD(bits, 20, 6));
2206121404Smarcel		op_imm(i, 4, 1LL + FIELD(bits, 27, 6));
2207121404Smarcel		break;
2208121404Smarcel	case ASM_FMT_I14:
2209121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2210121404Smarcel		s_imm(i, 2, bits, 36, 1);
2211121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
2212121404Smarcel		op_imm(i, 4, 63LL - FIELD(bits, 14, 6));
2213121404Smarcel		op_imm(i, 5, 1LL + FIELD(bits, 27, 6));
2214121404Smarcel		break;
2215121404Smarcel	case ASM_FMT_I15:
2216121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2217121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2218121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
2219121404Smarcel		op_imm(i, 4, 63LL - FIELD(bits, 31, 6));
2220121404Smarcel		op_imm(i, 5, 1LL + FIELD(bits, 27, 4));
2221121404Smarcel		break;
2222121404Smarcel	case ASM_FMT_I16: /* 2 dst */
2223121404Smarcel		operand(i, 1, ASM_OPER_PREG, bits, 6, 6);
2224121404Smarcel		operand(i, 2, ASM_OPER_PREG, bits, 27, 6);
2225121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
2226121404Smarcel		u_imm(i, 4, bits, 14, 6);
2227121404Smarcel		i->i_srcidx++;
2228121404Smarcel		break;
2229121404Smarcel	case ASM_FMT_I17: /* 2 dst */
2230121404Smarcel		operand(i, 1, ASM_OPER_PREG, bits, 6, 6);
2231121404Smarcel		operand(i, 2, ASM_OPER_PREG, bits, 27, 6);
2232121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
2233121404Smarcel		i->i_srcidx++;
2234121404Smarcel		break;
2235159909Smarcel	case ASM_FMT_I18:
2236159909Smarcel		u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
2237159909Smarcel		break;
2238121404Smarcel	case ASM_FMT_I19:
2239121404Smarcel		u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
2240121404Smarcel		break;
2241121404Smarcel	case ASM_FMT_I20: /* 0 dst */
2242121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 13, 7);
2243121404Smarcel		disp(i, 2, bits, FRAG(6,7), FRAG(20,13), FRAG(36,1), 0);
2244121404Smarcel		i->i_srcidx--;
2245121404Smarcel		break;
2246121404Smarcel	case ASM_FMT_I21:
2247121404Smarcel		switch (FIELD(bits, 20, 2)) { /* wh */
2248121404Smarcel		case 0:	asm_cmpltr_add(i, ASM_CC_MWH, ASM_CT_SPTK); break;
2249121404Smarcel		case 1:	asm_cmpltr_add(i, ASM_CC_MWH, ASM_CT_NONE); break;
2250121404Smarcel		case 2:	asm_cmpltr_add(i, ASM_CC_MWH, ASM_CT_DPTK); break;
2251121404Smarcel		case 3:	return (0);
2252121404Smarcel		}
2253121404Smarcel		if (FIELD(bits, 23, 1)) /* ih */
2254121404Smarcel			asm_cmpltr_add(i, ASM_CC_IH, ASM_CT_IMP);
2255121404Smarcel		else
2256121404Smarcel			asm_cmpltr_add(i, ASM_CC_IH, ASM_CT_NONE);
2257121404Smarcel		operand(i, 1, ASM_OPER_BREG, bits, 6, 3);
2258121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2259121404Smarcel		disp(i, 3, bits, FRAG(24,9), 0);
2260121404Smarcel		break;
2261121404Smarcel	case ASM_FMT_I22:
2262121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2263121404Smarcel		operand(i, 2, ASM_OPER_BREG, bits, 13, 3);
2264121404Smarcel		break;
2265121404Smarcel	case ASM_FMT_I23:
2266121404Smarcel		op_type(i, 1, ASM_OPER_PR);
2267121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2268121404Smarcel		u_immf(i, 3, bits, FRAG(6,7), FRAG(24,8), FRAG(36,1), 0);
2269121404Smarcel		i->i_oper[3].o_value <<= 1;
2270121404Smarcel		break;
2271121404Smarcel	case ASM_FMT_I24:
2272121404Smarcel		op_type(i, 1, ASM_OPER_PR_ROT);
2273121404Smarcel		s_immf(i, 2, bits, FRAG(6,27), FRAG(36,1), 0);
2274121404Smarcel		break;
2275121404Smarcel	case ASM_FMT_I25:
2276121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2277121404Smarcel		op_type(i, 2, ot);
2278121404Smarcel		break;
2279121404Smarcel	case ASM_FMT_I26:
2280121404Smarcel		operand(i, 1, ASM_OPER_AREG, bits, 20, 7);
2281121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2282121404Smarcel		break;
2283121404Smarcel	case ASM_FMT_I27:
2284121404Smarcel		operand(i, 1, ASM_OPER_AREG, bits, 20, 7);
2285121404Smarcel		s_immf(i, 2, bits, FRAG(13,7), FRAG(36,1), 0);
2286121404Smarcel		break;
2287121404Smarcel	case ASM_FMT_I28:
2288121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2289121404Smarcel		operand(i, 2, ASM_OPER_AREG, bits, 20, 7);
2290121404Smarcel		break;
2291121404Smarcel	case ASM_FMT_I29:
2292121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2293121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 20, 7);
2294121404Smarcel		break;
2295159916Smarcel	case ASM_FMT_I30: /* 2 dst */
2296159916Smarcel		operand(i, 1, ASM_OPER_PREG, bits, 6, 6);
2297159916Smarcel		operand(i, 2, ASM_OPER_PREG, bits, 27, 6);
2298159916Smarcel		op_imm(i, 3, 32LL + FIELD(bits, 14, 5));
2299159916Smarcel		i->i_srcidx++;
2300159916Smarcel		break;
2301121404Smarcel	case ASM_FMT_M1:
2302121404Smarcel		asm_hint(i, ASM_CC_LDHINT);
2303121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2304121404Smarcel		if (i->i_op == ASM_OP_LD16) {
2305121404Smarcel			op_type(i, 2, ASM_OPER_AREG);
2306121404Smarcel			op_value(i, 2, AR_CSD);
2307121404Smarcel			i->i_srcidx++;
2308121404Smarcel		}
2309121404Smarcel		operand(i, i->i_srcidx, ASM_OPER_MEM, bits, 20, 7);
2310121404Smarcel		break;
2311121404Smarcel	case ASM_FMT_M2:
2312121404Smarcel		asm_hint(i, ASM_CC_LDHINT);
2313121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2314121404Smarcel		operand(i, 2, ASM_OPER_MEM, bits, 20, 7);
2315121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 13, 7);
2316121404Smarcel		break;
2317121404Smarcel	case ASM_FMT_M3:
2318121404Smarcel		asm_hint(i, ASM_CC_LDHINT);
2319121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2320121404Smarcel		operand(i, 2, ASM_OPER_MEM, bits, 20, 7);
2321121404Smarcel		s_immf(i, 3, bits, FRAG(13,7), FRAG(27,1), FRAG(36,1), 0);
2322121404Smarcel		break;
2323121404Smarcel	case ASM_FMT_M4:
2324121404Smarcel		asm_hint(i, ASM_CC_STHINT);
2325121404Smarcel		operand(i, 1, ASM_OPER_MEM, bits, 20, 7);
2326121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2327121404Smarcel		if (i->i_op == ASM_OP_ST16) {
2328121404Smarcel			op_type(i, 3, ASM_OPER_AREG);
2329121404Smarcel			op_value(i, 3, AR_CSD);
2330121404Smarcel		}
2331121404Smarcel		break;
2332121404Smarcel	case ASM_FMT_M5:
2333121404Smarcel		asm_hint(i, ASM_CC_STHINT);
2334121404Smarcel		operand(i, 1, ASM_OPER_MEM, bits, 20, 7);
2335121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2336121404Smarcel		s_immf(i, 3, bits, FRAG(6,7), FRAG(27,1), FRAG(36,1), 0);
2337121404Smarcel		break;
2338121404Smarcel	case ASM_FMT_M6:
2339121404Smarcel		asm_hint(i, ASM_CC_LDHINT);
2340121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2341121404Smarcel		operand(i, 2, ASM_OPER_MEM, bits, 20, 7);
2342121404Smarcel		break;
2343121404Smarcel	case ASM_FMT_M7:
2344121404Smarcel		asm_hint(i, ASM_CC_LDHINT);
2345121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2346121404Smarcel		operand(i, 2, ASM_OPER_MEM, bits, 20, 7);
2347121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 13, 7);
2348121404Smarcel		break;
2349121404Smarcel	case ASM_FMT_M8:
2350121404Smarcel		asm_hint(i, ASM_CC_LDHINT);
2351121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2352121404Smarcel		operand(i, 2, ASM_OPER_MEM, bits, 20, 7);
2353121404Smarcel		s_immf(i, 3, bits, FRAG(13,7), FRAG(27,1), FRAG(36,1), 0);
2354121404Smarcel		break;
2355121404Smarcel	case ASM_FMT_M9:
2356121404Smarcel		asm_hint(i, ASM_CC_STHINT);
2357121404Smarcel		operand(i, 1, ASM_OPER_MEM, bits, 20, 7);
2358121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2359121404Smarcel		break;
2360121404Smarcel	case ASM_FMT_M10:
2361121404Smarcel		asm_hint(i, ASM_CC_STHINT);
2362121404Smarcel		operand(i, 1, ASM_OPER_MEM, bits, 20, 7);
2363121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2364121404Smarcel		s_immf(i, 3, bits, FRAG(6,7), FRAG(27,1), FRAG(36,1), 0);
2365121404Smarcel		break;
2366121404Smarcel	case ASM_FMT_M11: /* 2 dst */
2367121404Smarcel		asm_hint(i, ASM_CC_LDHINT);
2368121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2369121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2370121404Smarcel		operand(i, 3, ASM_OPER_MEM, bits, 20, 7);
2371121404Smarcel		i->i_srcidx++;
2372121404Smarcel		break;
2373121404Smarcel	case ASM_FMT_M12: /* 2 dst */
2374121404Smarcel		asm_hint(i, ASM_CC_LDHINT);
2375121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2376121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2377121404Smarcel		operand(i, 3, ASM_OPER_MEM, bits, 20, 7);
2378121404Smarcel		op_imm(i, 4, 8LL << FIELD(bits, 30, 1));
2379121404Smarcel		i->i_srcidx++;
2380121404Smarcel		break;
2381121404Smarcel	case ASM_FMT_M13:
2382121404Smarcel		asm_hint(i, ASM_CC_LFHINT);
2383121404Smarcel		operand(i, 1, ASM_OPER_MEM, bits, 20, 7);
2384121404Smarcel		break;
2385121404Smarcel	case ASM_FMT_M14: /* 0 dst */
2386121404Smarcel		asm_hint(i, ASM_CC_LFHINT);
2387121404Smarcel		operand(i, 1, ASM_OPER_MEM, bits, 20, 7);
2388121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2389121404Smarcel		i->i_srcidx--;
2390121404Smarcel		break;
2391121404Smarcel	case ASM_FMT_M15: /* 0 dst */
2392121404Smarcel		asm_hint(i, ASM_CC_LFHINT);
2393121404Smarcel		operand(i, 1, ASM_OPER_MEM, bits, 20, 7);
2394121404Smarcel		s_immf(i, 2, bits, FRAG(13,7), FRAG(27,1), FRAG(36,1), 0);
2395121404Smarcel		i->i_srcidx--;
2396121404Smarcel		break;
2397159909Smarcel	case ASM_FMT_M16:
2398121404Smarcel		asm_hint(i, ASM_CC_LDHINT);
2399121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2400121404Smarcel		operand(i, 2, ASM_OPER_MEM, bits, 20, 7);
2401121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 13, 7);
2402121404Smarcel		if (i->i_op == ASM_OP_CMP8XCHG16) {
2403121404Smarcel			op_type(i, 4, ASM_OPER_AREG);
2404121404Smarcel			op_value(i, 4, AR_CSD);
2405159909Smarcel			op_type(i, 5, ASM_OPER_AREG);
2406159909Smarcel			op_value(i, 5, AR_CCV);
2407159909Smarcel		} else {
2408159909Smarcel			if (FIELD(bits, 30, 6) < 8) {
2409159909Smarcel				op_type(i, 4, ASM_OPER_AREG);
2410159909Smarcel				op_value(i, 4, AR_CCV);
2411159909Smarcel			}
2412121404Smarcel		}
2413121404Smarcel		break;
2414121404Smarcel	case ASM_FMT_M17:
2415121404Smarcel		asm_hint(i, ASM_CC_LDHINT);
2416121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2417121404Smarcel		operand(i, 2, ASM_OPER_MEM, bits, 20, 7);
2418121404Smarcel		switch (FIELD(bits, 13, 2)) {
2419121404Smarcel		case 0: op_imm(i, 3, 1LL << 4); break;
2420121404Smarcel		case 1: op_imm(i, 3, 1LL << 3); break;
2421121404Smarcel		case 2:	op_imm(i, 3, 1LL << 2); break;
2422121404Smarcel		case 3: op_imm(i, 3, 1LL); break;
2423121404Smarcel		}
2424121404Smarcel		if (FIELD(bits, 15, 1))
2425121404Smarcel			i->i_oper[3].o_value *= -1LL;
2426121404Smarcel		break;
2427121404Smarcel	case ASM_FMT_M18:
2428121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2429121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2430121404Smarcel		break;
2431121404Smarcel	case ASM_FMT_M19:
2432121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2433121404Smarcel		operand(i, 2, ASM_OPER_FREG, bits, 13, 7);
2434121404Smarcel		break;
2435121404Smarcel	case ASM_FMT_M20: /* 0 dst */
2436121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 13, 7);
2437121404Smarcel		disp(i, 2, bits, FRAG(6,7), FRAG(20,13), FRAG(36,1), 0);
2438121404Smarcel		i->i_srcidx--;
2439121404Smarcel		break;
2440121404Smarcel	case ASM_FMT_M21: /* 0 dst */
2441121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 13, 7);
2442121404Smarcel		disp(i, 2, bits, FRAG(6,7), FRAG(20,13), FRAG(36,1), 0);
2443121404Smarcel		i->i_srcidx--;
2444121404Smarcel		break;
2445121404Smarcel	case ASM_FMT_M22: /* 0 dst */
2446121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2447121404Smarcel		disp(i, 2, bits, FRAG(13,20), FRAG(36,1), 0);
2448121404Smarcel		i->i_srcidx--;
2449121404Smarcel		break;
2450121404Smarcel	case ASM_FMT_M23: /* 0 dst */
2451121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2452121404Smarcel		disp(i, 2, bits, FRAG(13,20), FRAG(36,1), 0);
2453121404Smarcel		i->i_srcidx--;
2454121404Smarcel		break;
2455121404Smarcel	case ASM_FMT_M24:
2456121404Smarcel		/* no operands */
2457121404Smarcel		break;
2458121404Smarcel	case ASM_FMT_M25:
2459121404Smarcel		if (FIELD(bits, 0, 6) != 0)
2460121404Smarcel			return (0);
2461121404Smarcel		/* no operands */
2462121404Smarcel		break;
2463121404Smarcel	case ASM_FMT_M26:
2464121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2465121404Smarcel		break;
2466121404Smarcel	case ASM_FMT_M27:
2467121404Smarcel		operand(i, 1, ASM_OPER_FREG, bits, 6, 7);
2468121404Smarcel		break;
2469121404Smarcel	case ASM_FMT_M28:
2470121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 20, 7);
2471121404Smarcel		break;
2472121404Smarcel	case ASM_FMT_M29:
2473121404Smarcel		operand(i, 1, ASM_OPER_AREG, bits, 20, 7);
2474121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2475121404Smarcel		break;
2476121404Smarcel	case ASM_FMT_M30:
2477121404Smarcel		operand(i, 1, ASM_OPER_AREG, bits, 20, 7);
2478121404Smarcel		s_immf(i, 2, bits, FRAG(13,7), FRAG(36,1), 0);
2479121404Smarcel		break;
2480121404Smarcel	case ASM_FMT_M31:
2481121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2482121404Smarcel		operand(i, 2, ASM_OPER_AREG, bits, 20, 7);
2483121404Smarcel		break;
2484121404Smarcel	case ASM_FMT_M32:
2485121404Smarcel		operand(i, 1, ASM_OPER_CREG, bits, 20, 7);
2486121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2487121404Smarcel		break;
2488121404Smarcel	case ASM_FMT_M33:
2489121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2490121404Smarcel		operand(i, 2, ASM_OPER_CREG, bits, 20, 7);
2491121404Smarcel		break;
2492121404Smarcel	case ASM_FMT_M34: {
2493121404Smarcel		uint64_t loc, out;
2494121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2495121404Smarcel		op_type(i, 2, ASM_OPER_AREG);
2496121404Smarcel		op_value(i, 2, AR_PFS);
2497121404Smarcel		loc = FIELD(bits, 20, 7);
2498121404Smarcel		out = FIELD(bits, 13, 7) - loc;
2499121404Smarcel		op_imm(i, 3, 0);
2500121404Smarcel		op_imm(i, 4, loc);
2501121404Smarcel		op_imm(i, 5, out);
2502121404Smarcel		op_imm(i, 6, (uint64_t)FIELD(bits, 27, 4) << 3);
2503121404Smarcel		break;
2504121404Smarcel	}
2505121404Smarcel	case ASM_FMT_M35:
2506121404Smarcel		if (FIELD(bits, 27, 6) == 0x2D)
2507121404Smarcel			op_type(i, 1, ASM_OPER_PSR_L);
2508121404Smarcel		else
2509121404Smarcel			op_type(i, 1, ASM_OPER_PSR_UM);
2510121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2511121404Smarcel		break;
2512121404Smarcel	case ASM_FMT_M36:
2513121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2514121404Smarcel		if (FIELD(bits, 27, 6) == 0x25)
2515121404Smarcel			op_type(i, 2, ASM_OPER_PSR);
2516121404Smarcel		else
2517121404Smarcel			op_type(i, 2, ASM_OPER_PSR_UM);
2518121404Smarcel		break;
2519121404Smarcel	case ASM_FMT_M37:
2520121404Smarcel		u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
2521121404Smarcel		break;
2522121404Smarcel	case ASM_FMT_M38:
2523121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2524121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 20, 7);
2525121404Smarcel		operand(i, 3, ASM_OPER_GREG, bits, 13, 7);
2526121404Smarcel		break;
2527121404Smarcel	case ASM_FMT_M39:
2528121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2529121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 20, 7);
2530121404Smarcel		u_imm(i, 3, bits, 13, 2);
2531121404Smarcel		break;
2532121404Smarcel	case ASM_FMT_M40: /* 0 dst */
2533121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 20, 7);
2534121404Smarcel		u_imm(i, 2, bits, 13, 2);
2535121404Smarcel		i->i_srcidx--;
2536121404Smarcel		break;
2537121404Smarcel	case ASM_FMT_M41:
2538121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 13, 7);
2539121404Smarcel		break;
2540121404Smarcel	case ASM_FMT_M42:
2541121404Smarcel		operand(i, 1, ot, bits, 20, 7);
2542121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2543121404Smarcel		break;
2544121404Smarcel	case ASM_FMT_M43:
2545121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2546121404Smarcel		operand(i, 2, ot, bits, 20, 7);
2547121404Smarcel		break;
2548121404Smarcel	case ASM_FMT_M44:
2549121404Smarcel		u_immf(i, 1, bits, FRAG(6,21), FRAG(31,2), FRAG(36,1), 0);
2550121404Smarcel		break;
2551121404Smarcel	case ASM_FMT_M45: /* 0 dst */
2552121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 20, 7);
2553121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
2554121404Smarcel		i->i_srcidx--;
2555121404Smarcel		break;
2556121404Smarcel	case ASM_FMT_M46:
2557121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2558121404Smarcel		operand(i, 2, ASM_OPER_GREG, bits, 20, 7);
2559121404Smarcel		break;
2560159909Smarcel	case ASM_FMT_M47:
2561159909Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 20, 7);
2562159909Smarcel		break;
2563159909Smarcel	case ASM_FMT_M48:
2564159909Smarcel		u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
2565159909Smarcel		break;
2566121404Smarcel	case ASM_FMT_X1:
2567121404Smarcel		KASSERT(slot == 2, ("foo"));
2568121404Smarcel		u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
2569121404Smarcel		combine(&i->i_oper[1].o_value, 21, b->b_inst[1].i_bits, 41, 0);
2570121404Smarcel		break;
2571121404Smarcel	case ASM_FMT_X2:
2572121404Smarcel		KASSERT(slot == 2, ("foo"));
2573121404Smarcel		operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
2574121404Smarcel		u_immf(i, 2, bits, FRAG(13,7), FRAG(27,9), FRAG(22,5),
2575121404Smarcel		    FRAG(21,1), 0);
2576121404Smarcel		combine(&i->i_oper[2].o_value, 22, b->b_inst[1].i_bits, 41, 0);
2577121404Smarcel		combine(&i->i_oper[2].o_value, 63, bits, 1, 36);
2578121404Smarcel		break;
2579121404Smarcel	case ASM_FMT_X3:
2580121404Smarcel		KASSERT(slot == 2, ("foo"));
2581121404Smarcel		asm_brhint(i);
2582121404Smarcel		u_imm(i, 1, bits, 13, 20);
2583121404Smarcel		combine(&i->i_oper[1].o_value, 20, b->b_inst[1].i_bits, 39, 2);
2584121404Smarcel		combine(&i->i_oper[1].o_value, 59, bits, 1, 36);
2585121404Smarcel		i->i_oper[1].o_value <<= 4;
2586121404Smarcel		i->i_oper[1].o_type = ASM_OPER_DISP;
2587121404Smarcel		break;
2588121404Smarcel	case ASM_FMT_X4:
2589121404Smarcel		KASSERT(slot == 2, ("foo"));
2590121404Smarcel		asm_brhint(i);
2591121404Smarcel		operand(i, 1, ASM_OPER_BREG, bits, 6, 3);
2592121404Smarcel		u_imm(i, 2, bits, 13, 20);
2593121404Smarcel		combine(&i->i_oper[2].o_value, 20, b->b_inst[1].i_bits, 39, 2);
2594121404Smarcel		combine(&i->i_oper[2].o_value, 59, bits, 1, 36);
2595121404Smarcel		i->i_oper[2].o_value <<= 4;
2596121404Smarcel		i->i_oper[2].o_type = ASM_OPER_DISP;
2597121404Smarcel		break;
2598159909Smarcel	case ASM_FMT_X5:
2599159909Smarcel		KASSERT(slot == 2, ("foo"));
2600159909Smarcel		u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
2601159909Smarcel		combine(&i->i_oper[1].o_value, 21, b->b_inst[1].i_bits, 41, 0);
2602159909Smarcel		break;
2603121404Smarcel	default:
2604121404Smarcel		KASSERT(fmt == ASM_FMT_NONE, ("foo"));
2605121404Smarcel		return (0);
2606121404Smarcel	}
2607121404Smarcel
2608121404Smarcel	return (1);
2609121404Smarcel}
2610