xref: /openbsd/sys/arch/sh/sh/db_disasm.c (revision 949c1c4e)
1 /*	$OpenBSD: db_disasm.c,v 1.7 2024/11/07 16:02:29 miod Exp $	*/
2 /*	$NetBSD: db_disasm.c,v 1.13 2006/01/21 02:09:06 uwe Exp $	*/
3 
4 /*
5  * Copyright (c) 1998-2000 Internet Initiative Japan Inc.
6  * All rights reserved.
7  *
8  * Author: Akinori Koketsu
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistribution with functional modification must include
16  *    prominent notice stating how and when and by whom it is
17  *    modified.
18  * 3. Redistributions in binary form have to be along with the source
19  *    code or documentation which include above copyright notice, this
20  *    list of conditions and the following disclaimer.
21  * 4. All commercial advertising materials mentioning features or use
22  *    of this software must display the following acknowledgement:
23  *      This product includes software developed by Internet
24  *      Initiative Japan Inc.
25  *
26  * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY EXPRESS OR IMPLIED
27  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29  * DISCLAIMED.
30  */
31 
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 
35 #include <machine/db_machdep.h>
36 
37 #include <ddb/db_interface.h>
38 #include <ddb/db_output.h>
39 #include <ddb/db_sym.h>
40 
41 static void	disasm_branch(char *, size_t, const char *, vaddr_t);
42 static void	get_ascii(unsigned char *, char *);
43 static void	get_opcode(vaddr_t, char *, size_t);
44 static void	f_02(vaddr_t, u_int, char *, size_t);
45 static void	f_03(vaddr_t, u_int, char *, size_t);
46 static void	f_04(vaddr_t, u_int, char *, size_t);
47 static void	f_08(vaddr_t, u_int, char *, size_t);
48 static void	f_09(vaddr_t, u_int, char *, size_t);
49 static void	f_0a(vaddr_t, u_int, char *, size_t);
50 static void	f_0b(vaddr_t, u_int, char *, size_t);
51 static void	f_0c(vaddr_t, u_int, char *, size_t);
52 static void	f_10(vaddr_t, u_int, char *, size_t);
53 static void	f_20(vaddr_t, u_int, char *, size_t);
54 static void	f_24(vaddr_t, u_int, char *, size_t);
55 static void	f_28(vaddr_t, u_int, char *, size_t);
56 static void	f_2c(vaddr_t, u_int, char *, size_t);
57 static void	f_30(vaddr_t, u_int, char *, size_t);
58 static void	f_34(vaddr_t, u_int, char *, size_t);
59 static void	f_38(vaddr_t, u_int, char *, size_t);
60 static void	f_3c(vaddr_t, u_int, char *, size_t);
61 static void	f_40(vaddr_t, u_int, char *, size_t);
62 static void	f_41(vaddr_t, u_int, char *, size_t);
63 static void	f_42(vaddr_t, u_int, char *, size_t);
64 static void	f_43(vaddr_t, u_int, char *, size_t);
65 static void	f_44(vaddr_t, u_int, char *, size_t);
66 static void	f_45(vaddr_t, u_int, char *, size_t);
67 static void	f_46(vaddr_t, u_int, char *, size_t);
68 static void	f_47(vaddr_t, u_int, char *, size_t);
69 static void	f_48(vaddr_t, u_int, char *, size_t);
70 static void	f_49(vaddr_t, u_int, char *, size_t);
71 static void	f_4a(vaddr_t, u_int, char *, size_t);
72 static void	f_4b(vaddr_t, u_int, char *, size_t);
73 static void	f_4c(vaddr_t, u_int, char *, size_t);
74 static void	f_4d(vaddr_t, u_int, char *, size_t);
75 static void	f_4e(vaddr_t, u_int, char *, size_t);
76 static void	f_4f(vaddr_t, u_int, char *, size_t);
77 static void	f_50(vaddr_t, u_int, char *, size_t);
78 static void	f_60(vaddr_t, u_int, char *, size_t);
79 static void	f_64(vaddr_t, u_int, char *, size_t);
80 static void	f_68(vaddr_t, u_int, char *, size_t);
81 static void	f_6c(vaddr_t, u_int, char *, size_t);
82 static void	f_70(vaddr_t, u_int, char *, size_t);
83 static void	f_80(vaddr_t, u_int, char *, size_t);
84 static void	f_90(vaddr_t, u_int, char *, size_t);
85 static void	f_a0(vaddr_t, u_int, char *, size_t);
86 static void	f_b0(vaddr_t, u_int, char *, size_t);
87 static void	f_c0(vaddr_t, u_int, char *, size_t);
88 static void	f_d0(vaddr_t, u_int, char *, size_t);
89 static void	f_e0(vaddr_t, u_int, char *, size_t);
90 static void	f_f0(vaddr_t, u_int, char *, size_t);
91 static void	f_f4(vaddr_t, u_int, char *, size_t);
92 static void	f_f8(vaddr_t, u_int, char *, size_t);
93 static void	f_fc(vaddr_t, u_int, char *, size_t);
94 static void	f_fd(vaddr_t, u_int, char *, size_t);
95 static void	f_fe(vaddr_t, u_int, char *, size_t);
96 
97 typedef	void (*rasm_t)(vaddr_t, u_int, char *, size_t);
98 static const rasm_t f[16][16] = {
99 	{ /* [0][0-7] */	NULL, NULL, f_02, f_03, f_04, f_04, f_04, f_04,
100 	  /* [0][8-f] */	f_08, f_09, f_0a, f_0b, f_0c, f_0c, f_0c, f_0c },
101 	{ /* [1][0-7] */	f_10, f_10, f_10, f_10, f_10, f_10, f_10, f_10,
102 	  /* [1][8-f] */	f_10, f_10, f_10, f_10, f_10, f_10, f_10, f_10 },
103 	{ /* [2][0-7] */	f_20, f_20, f_20, f_20, f_24, f_24, f_24, f_24,
104 	  /* [2][8-f] */	f_28, f_28, f_28, f_28, f_2c, f_2c, f_2c, f_2c },
105 	{ /* [3][0-7] */	f_30, f_30, f_30, f_30, f_34, f_34, f_34, f_34,
106 	  /* [3][8-f] */	f_38, f_38, f_38, f_38, f_3c, f_3c, f_3c, f_3c },
107 	{ /* [4][0-7] */	f_40, f_41, f_42, f_43, f_44, f_45, f_46, f_47,
108 	  /* [4][8-f] */	f_48, f_49, f_4a, f_4b, f_4c, f_4d, f_4e, f_4f },
109 	{ /* [5][0-7] */	f_50, f_50, f_50, f_50, f_50, f_50, f_50, f_50,
110 	  /* [5][8-f] */	f_50, f_50, f_50, f_50, f_50, f_50, f_50, f_50 },
111 	{ /* [6][0-7] */	f_60, f_60, f_60, f_60, f_64, f_64, f_64, f_64,
112 	  /* [6][8-f] */	f_68, f_68, f_68, f_68, f_6c, f_6c, f_6c, f_6c },
113 	{ /* [7][0-7] */	f_70, f_70, f_70, f_70, f_70, f_70, f_70, f_70,
114 	  /* [7][8-f] */	f_70, f_70, f_70, f_70, f_70, f_70, f_70, f_70 },
115 	{ /* [8][0-7] */	f_80, f_80, f_80, f_80, f_80, f_80, f_80, f_80,
116 	  /* [8][8-f] */	f_80, f_80, f_80, f_80, f_80, f_80, f_80, f_80 },
117 	{ /* [9][0-7] */	f_90, f_90, f_90, f_90, f_90, f_90, f_90, f_90,
118 	  /* [9][8-f] */	f_90, f_90, f_90, f_90, f_90, f_90, f_90, f_90 },
119 	{ /* [a][0-7] */	f_a0, f_a0, f_a0, f_a0, f_a0, f_a0, f_a0, f_a0,
120 	  /* [a][8-f] */	f_a0, f_a0, f_a0, f_a0, f_a0, f_a0, f_a0, f_a0 },
121 	{ /* [b][0-7] */	f_b0, f_b0, f_b0, f_b0, f_b0, f_b0, f_b0, f_b0,
122 	  /* [b][8-f] */	f_b0, f_b0, f_b0, f_b0, f_b0, f_b0, f_b0, f_b0 },
123 	{ /* [c][0-7] */	f_c0, f_c0, f_c0, f_c0, f_c0, f_c0, f_c0, f_c0,
124 	  /* [c][8-f] */	f_c0, f_c0, f_c0, f_c0, f_c0, f_c0, f_c0, f_c0 },
125 	{ /* [d][0-7] */	f_d0, f_d0, f_d0, f_d0, f_d0, f_d0, f_d0, f_d0,
126 	  /* [d][8-f] */	f_d0, f_d0, f_d0, f_d0, f_d0, f_d0, f_d0, f_d0 },
127 	{ /* [e][0-7] */	f_e0, f_e0, f_e0, f_e0, f_e0, f_e0, f_e0, f_e0,
128 	  /* [e][8-f] */	f_e0, f_e0, f_e0, f_e0, f_e0, f_e0, f_e0, f_e0 },
129 	{ /* [f][0-7] */	f_f0, f_f0, f_f0, f_f0, f_f4, f_f4, f_f4, f_f4,
130 	  /* [f][8-f] */	f_f8, f_f8, f_f8, f_f8, f_fc, f_fd, f_fe, NULL }
131 };
132 
133 vaddr_t
db_disasm(vaddr_t loc,int altfmt)134 db_disasm(vaddr_t loc, int altfmt)
135 {
136 	char line[40], ascii[4];
137 	void *pc = (void *)loc;
138 
139 	get_opcode(loc, line, sizeof line);
140 	if (altfmt) {
141 		get_ascii(pc, ascii);
142 		db_printf("%-32s ! %s\n", line, ascii);
143 	} else
144 		db_printf("%s\n", line);
145 
146 	return (loc + 2);
147 }
148 
149 static void
disasm_branch(char * buf,size_t bufsiz,const char * opstr,vaddr_t addr)150 disasm_branch(char *buf, size_t bufsiz, const char *opstr, vaddr_t addr)
151 {
152 	size_t len;
153 	db_expr_t d, value;
154 	const char *name;
155 	Elf_Sym *cursym;
156 	extern unsigned long db_lastsym;
157 	extern unsigned int db_maxoff;
158 
159 	snprintf(buf, bufsiz, "%-8s", opstr);
160 	len = strlen(buf);
161 	buf += len;
162 	bufsiz -= len;
163 
164 	if (addr <= db_lastsym) {
165 		cursym = db_search_symbol(addr, DB_STGY_PROC, &d);
166 		db_symbol_values(cursym, &name, &value);
167 		if (name && d < db_maxoff && value) {
168 			if (d == 0)
169 				snprintf(buf, bufsiz, "%s", name);
170 			else {
171 				snprintf(buf, bufsiz, "%s+", name);
172 				len = strlen(buf);
173 				buf += len;
174 				bufsiz -= len;
175 				db_format(buf, bufsiz, d, DB_FORMAT_R, 1, 0);
176 			}
177 			return;
178 		}
179 	}
180 
181 	db_format(buf, bufsiz, addr, DB_FORMAT_N, 1, 0);
182 }
183 
184 static void
get_ascii(unsigned char * cp,char * str)185 get_ascii(unsigned char *cp, char *str)
186 {
187 	*str++ = (0x20 <= *cp && *cp < 0x7f) ? *cp : '.';
188 	cp++;
189 	*str++ = (0x20 <= *cp && *cp < 0x7f) ? *cp : '.';
190 	*str = '\0';
191 }
192 
193 static void
get_opcode(vaddr_t loc,char * buf,size_t bufsiz)194 get_opcode(vaddr_t loc, char *buf, size_t bufsiz)
195 {
196 	int n0, n3;
197 	u_int insn = *(u_int16_t *)loc;
198 
199 	snprintf(buf, bufsiz, ".word 0x%x", insn);
200 
201 	n0 = (insn & 0xf000) >> 12;
202 	n3 = (insn & 0x000f);
203 
204 	if (f[n0][n3] != NULL)
205 		(*f[n0][n3])(loc, insn, buf, bufsiz);
206 }
207 
208 static void
f_02(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)209 f_02(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
210 {
211 	int	rn, type, md;
212 
213 	rn   = (insn & 0x0f00) >> 8;
214 	type = (insn & 0x00c0) >> 6;
215 	md   = (insn & 0x0030) >> 4;
216 
217 	switch (type) {
218 	case 0:
219 		switch (md) {
220 		case 0:
221 			snprintf(buf, bufsiz, "stc     sr, r%d", rn);
222 			break;
223 		case 1:
224 			snprintf(buf, bufsiz, "stc     gbr, r%d", rn);
225 			break;
226 		case 2:
227 			snprintf(buf, bufsiz, "stc     vbr, r%d", rn);
228 			break;
229 		case 3:
230 			snprintf(buf, bufsiz, "stc     ssr, r%d", rn);
231 			break;
232 		}
233 		break;
234 	case 1:
235 		switch (md) {
236 		case 0:
237 			snprintf(buf, bufsiz, "stc     spc, r%d", rn);
238 			break;
239 		}
240 		break;
241 	case 2:
242 		snprintf(buf, bufsiz, "stc     r%d_bank, r%d", md, rn);
243 		break;
244 	case 3:
245 		snprintf(buf, bufsiz, "stc     r%d_bank, r%d", md + 4, rn);
246 		break;
247 	} /* end of switch (type) */
248 }
249 
250 static void
f_03(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)251 f_03(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
252 {
253 	int	rn, type, md;
254 
255 	rn   = (insn & 0x0f00) >> 8;
256 	type = (insn & 0x00c0) >> 6;
257 	md   = (insn & 0x0030) >> 4;
258 
259 	switch (type) {
260 	case 0:
261 		switch (md) {
262 		case 0:
263 			snprintf(buf, bufsiz, "bsrf    r%d", rn);
264 			break;
265 		case 2:
266 			snprintf(buf, bufsiz, "braf    r%d", rn);
267 			break;
268 		}
269 		break;
270 	case 2:
271 		switch (md) {
272 		case 0:
273 			snprintf(buf, bufsiz, "pref    @r%d", rn);
274 			break;
275 		}
276 		break;
277 	} /* end of switch (type) */
278 }
279 
280 static void
f_04(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)281 f_04(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
282 {
283 	int	rn, rm, md;
284 
285 	rn   = (insn & 0x0f00) >> 8;
286 	rm   = (insn & 0x00f0) >> 4;
287 	md   = (insn & 0x0003);
288 
289 	switch (md) {
290 	case 0:
291 		snprintf(buf, bufsiz, "mov.b   r%d, @(r0, r%d)", rm, rn);
292 		break;
293 	case 1:
294 		snprintf(buf, bufsiz, "mov.w   r%d, @(r0, r%d)", rm, rn);
295 		break;
296 	case 2:
297 		snprintf(buf, bufsiz, "mov.l   r%d, @(r0, r%d)", rm, rn);
298 		break;
299 	case 3:
300 		snprintf(buf, bufsiz, "mul.l   r%d, r%d", rm, rn);
301 		break;
302 	} /* end of switch (md) */
303 }
304 
305 static void
f_08(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)306 f_08(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
307 {
308 	int	n1, type, md;
309 
310 	n1   = (insn & 0x0f00) >> 8;
311 	type = (insn & 0x00c0) >> 6;
312 	md   = (insn & 0x0030) >> 4;
313 
314 	if (n1 != 0)
315 		return;
316 
317 	switch (type) {
318 	case 0:
319 		switch (md) {
320 		case 0:
321 			strlcpy(buf, "clrt", bufsiz);
322 			break;
323 		case 1:
324 			strlcpy(buf, "sett", bufsiz);
325 			break;
326 		case 2:
327 			strlcpy(buf, "clrmac", bufsiz);
328 			break;
329 		case 3:
330 			strlcpy(buf, "ldtlb", bufsiz);
331 			break;
332 		}
333 		break;
334 	case 1:
335 		switch (md) {
336 		case 0:
337 			strlcpy(buf, "clrs", bufsiz);
338 			break;
339 		case 1:
340 			strlcpy(buf, "sets", bufsiz);
341 			break;
342 		}
343 		break;
344 	} /* end of switch (type) */
345 }
346 
347 static void
f_09(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)348 f_09(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
349 {
350 	int	rn, fx;
351 
352 	rn = (insn & 0x0f00) >> 8;
353 	fx = (insn & 0x00f0) >> 4;
354 
355 	switch (fx) {
356 	case 0:
357 		if (rn != 0)
358 			return;
359 		strlcpy(buf, "nop", bufsiz);
360 		break;
361 	case 1:
362 		if (rn != 0)
363 			return;
364 		strlcpy(buf, "div0u", bufsiz);
365 		break;
366 	case 2:
367 		snprintf(buf, bufsiz, "movt    r%d", rn);
368 		break;
369 	} /* end of switch (fx) */
370 }
371 
372 static void
f_0a(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)373 f_0a(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
374 {
375 	int	rn, type, md;
376 
377 	rn   = (insn & 0x0f00) >> 8;
378 	type = (insn & 0x00c0) >> 6;
379 	md   = (insn & 0x0030) >> 4;
380 
381 	switch (type) {
382 	case 0:
383 		switch (md) {
384 		case 0:
385 			snprintf(buf, bufsiz, "sts     mach, r%d", rn);
386 			break;
387 		case 1:
388 			snprintf(buf, bufsiz, "sts     macl, r%d", rn);
389 			break;
390 		case 2:
391 			snprintf(buf, bufsiz, "sts     pr, r%d", rn);
392 			break;
393 		}
394 		break;
395 	case 1:
396 		switch (md) {
397 		case 1:
398 			snprintf(buf, bufsiz, "sts     fpul, r%d", rn);
399 			break;
400 		case 2:
401 			snprintf(buf, bufsiz, "sts     fpscr, r%d", rn);
402 			break;
403 		}
404 		break;
405 	} /* end of switch (type) */
406 }
407 
408 static void
f_0b(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)409 f_0b(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
410 {
411 	int	n1, fx;
412 
413 	n1 = (insn & 0x0f00) >> 8;
414 	if (n1 != 0)
415 		return;
416 
417 	fx = (insn & 0x00f0) >> 4;
418 	switch (fx) {
419 	case 0:
420 		strlcpy(buf, "rts", bufsiz);
421 		break;
422 	case 1:
423 		strlcpy(buf, "sleep", bufsiz);
424 		break;
425 	case 2:
426 		strlcpy(buf, "rte", bufsiz);
427 		break;
428 	} /* end of switch (fx) */
429 }
430 
431 static void
f_0c(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)432 f_0c(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
433 {
434 	int	rn, rm, md;
435 
436 	rn   = (insn & 0x0f00) >> 8;
437 	rm   = (insn & 0x00f0) >> 4;
438 	md   = (insn & 0x0003);
439 
440 	switch (md) {
441 	case 0:
442 		snprintf(buf, bufsiz, "mov.b   @(r0, r%d), r%d", rm, rn);
443 		break;
444 	case 1:
445 		snprintf(buf, bufsiz, "mov.w   @(r0, r%d), r%d", rm, rn);
446 		break;
447 	case 2:
448 		snprintf(buf, bufsiz, "mov.l   @(r0, r%d), r%d", rm, rn);
449 		break;
450 	case 3:
451 		snprintf(buf, bufsiz, "mac.l   @r%d+, r%d+", rm, rn);
452 		break;
453 	} /* end of switch (md) */
454 }
455 
456 static void
f_10(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)457 f_10(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
458 {
459 	int	rn, rm, disp;
460 
461 	rn   = (insn & 0x0f00) >> 8;
462 	rm   = (insn & 0x00f0) >> 4;
463 	disp = (insn & 0x000f);
464 	disp *= 4;
465 
466 	snprintf(buf, bufsiz, "mov.l   r%d, @(%d, r%d)", rm, disp, rn);
467 }
468 
469 static void
f_20(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)470 f_20(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
471 {
472 	int	rn, rm, md;
473 
474 	rn   = (insn & 0x0f00) >> 8;
475 	rm   = (insn & 0x00f0) >> 4;
476 	md   = (insn & 0x0003);
477 
478 	switch (md) {
479 	case 0:
480 		snprintf(buf, bufsiz, "mov.b   r%d, @r%d", rm, rn);
481 		break;
482 	case 1:
483 		snprintf(buf, bufsiz, "mov.w   r%d, @r%d", rm, rn);
484 		break;
485 	case 2:
486 		snprintf(buf, bufsiz, "mov.l   r%d, @r%d", rm, rn);
487 		break;
488 	} /* end of switch (md) */
489 }
490 
491 static void
f_24(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)492 f_24(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
493 {
494 	int	rn, rm, md;
495 
496 	rn   = (insn & 0x0f00) >> 8;
497 	rm   = (insn & 0x00f0) >> 4;
498 	md   = (insn & 0x0003);
499 
500 	switch (md) {
501 	case 0:
502 		snprintf(buf, bufsiz, "mov.b   r%d, @-r%d", rm, rn);
503 		break;
504 	case 1:
505 		snprintf(buf, bufsiz, "mov.w   r%d, @-r%d", rm, rn);
506 		break;
507 	case 2:
508 		snprintf(buf, bufsiz, "mov.l   r%d, @-r%d", rm, rn);
509 		break;
510 	case 3:
511 		snprintf(buf, bufsiz, "div0s   r%d, r%d", rm, rn);
512 		break;
513 	} /* end of switch (md) */
514 }
515 
516 static void
f_28(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)517 f_28(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
518 {
519 	int	rn, rm, md;
520 
521 	rn   = (insn & 0x0f00) >> 8;
522 	rm   = (insn & 0x00f0) >> 4;
523 	md   = (insn & 0x0003);
524 
525 	switch (md) {
526 	case 0:
527 		snprintf(buf, bufsiz, "tst     r%d, r%d", rm, rn);
528 		break;
529 	case 1:
530 		snprintf(buf, bufsiz, "and     r%d, r%d", rm, rn);
531 		break;
532 	case 2:
533 		snprintf(buf, bufsiz, "xor     r%d, r%d", rm, rn);
534 		break;
535 	case 3:
536 		snprintf(buf, bufsiz, "or      r%d, r%d", rm, rn);
537 		break;
538 	} /* end of switch (md) */
539 }
540 
541 static void
f_2c(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)542 f_2c(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
543 {
544 	int	rn, rm, md;
545 
546 	rn   = (insn & 0x0f00) >> 8;
547 	rm   = (insn & 0x00f0) >> 4;
548 	md   = (insn & 0x0003);
549 
550 	switch (md) {
551 	case 0:
552 		snprintf(buf, bufsiz, "cmp/str r%d, r%d", rm, rn);
553 		break;
554 	case 1:
555 		snprintf(buf, bufsiz, "xtrct   r%d, r%d", rm, rn);
556 		break;
557 	case 2:
558 		snprintf(buf, bufsiz, "mulu.w  r%d, r%d", rm, rn);
559 		break;
560 	case 3:
561 		snprintf(buf, bufsiz, "muls.w  r%d, r%d", rm, rn);
562 		break;
563 	} /* end of switch (md) */
564 }
565 
566 static void
f_30(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)567 f_30(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
568 {
569 	int	rn, rm, md;
570 
571 	rn   = (insn & 0x0f00) >> 8;
572 	rm   = (insn & 0x00f0) >> 4;
573 	md   = (insn & 0x0003);
574 
575 	switch (md) {
576 	case 0:
577 		snprintf(buf, bufsiz, "cmp/eq  r%d, r%d", rm, rn);
578 		break;
579 	case 2:
580 		snprintf(buf, bufsiz, "cmp/hs  r%d, r%d", rm, rn);
581 		break;
582 	case 3:
583 		snprintf(buf, bufsiz, "cmp/ge  r%d, r%d", rm, rn);
584 		break;
585 	} /* end of switch (md) */
586 }
587 
588 static void
f_34(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)589 f_34(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
590 {
591 	int	rn, rm, md;
592 
593 	rn   = (insn & 0x0f00) >> 8;
594 	rm   = (insn & 0x00f0) >> 4;
595 	md   = (insn & 0x0003);
596 
597 	switch (md) {
598 	case 0:
599 		snprintf(buf, bufsiz, "div1    r%d, r%d", rm, rn);
600 		break;
601 	case 1:
602 		snprintf(buf, bufsiz, "dmulu.l r%d, r%d", rm, rn);
603 		break;
604 	case 2:
605 		snprintf(buf, bufsiz, "cmp/hi  r%d, r%d", rm, rn);
606 		break;
607 	case 3:
608 		snprintf(buf, bufsiz, "cmp/gt  r%d, r%d", rm, rn);
609 		break;
610 	} /* end of switch (md) */
611 }
612 
613 static void
f_38(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)614 f_38(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
615 {
616 	int	rn, rm, md;
617 
618 	rn   = (insn & 0x0f00) >> 8;
619 	rm   = (insn & 0x00f0) >> 4;
620 	md   = (insn & 0x0003);
621 
622 	switch (md) {
623 	case 0:
624 		snprintf(buf, bufsiz, "sub     r%d, r%d", rm, rn);
625 		break;
626 	case 2:
627 		snprintf(buf, bufsiz, "subc    r%d, r%d", rm, rn);
628 		break;
629 	case 3:
630 		snprintf(buf, bufsiz, "subv    r%d, r%d", rm, rn);
631 		break;
632 	} /* end of switch (md) */
633 }
634 
635 static void
f_3c(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)636 f_3c(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
637 {
638 	int	rn, rm, md;
639 
640 	rn   = (insn & 0x0f00) >> 8;
641 	rm   = (insn & 0x00f0) >> 4;
642 	md   = (insn & 0x0003);
643 
644 	switch (md) {
645 	case 0:
646 		snprintf(buf, bufsiz, "add     r%d, r%d", rm, rn);
647 		break;
648 	case 1:
649 		snprintf(buf, bufsiz, "dmulu.l r%d, r%d", rm, rn);
650 		break;
651 	case 2:
652 		snprintf(buf, bufsiz, "addc    r%d, r%d", rm, rn);
653 		break;
654 	case 3:
655 		snprintf(buf, bufsiz, "addv    r%d, r%d", rm, rn);
656 		break;
657 	} /* end of switch (md) */
658 }
659 
660 static void
f_40(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)661 f_40(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
662 {
663 	int	rn, fx;
664 
665 	rn   = (insn & 0x0f00) >> 8;
666 	fx   = (insn & 0x00f0) >> 4;
667 
668 	switch (fx) {
669 	case 0:
670 		snprintf(buf, bufsiz, "shll    r%d", rn);
671 		break;
672 	case 1:
673 		snprintf(buf, bufsiz, "dt      r%d", rn);
674 		break;
675 	case 2:
676 		snprintf(buf, bufsiz, "shal    r%d", rn);
677 		break;
678 	} /* end of switch (fx) */
679 }
680 
681 static void
f_41(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)682 f_41(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
683 {
684 	int	rn, fx;
685 
686 	rn   = (insn & 0x0f00) >> 8;
687 	fx   = (insn & 0x00f0) >> 4;
688 
689 	switch (fx) {
690 	case 0:
691 		snprintf(buf, bufsiz, "shlr    r%d", rn);
692 		break;
693 	case 1:
694 		snprintf(buf, bufsiz, "cmp/pz  r%d", rn);
695 		break;
696 	case 2:
697 		snprintf(buf, bufsiz, "shar    r%d", rn);
698 		break;
699 	} /* end of switch (fx) */
700 }
701 
702 static void
f_42(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)703 f_42(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
704 {
705 	int	rn, type, md;
706 
707 	rn   = (insn & 0x0f00) >> 8;
708 	type = (insn & 0x00c0) >> 6;
709 	md   = (insn & 0x0030) >> 4;
710 
711 	switch (type) {
712 	case 0:
713 		switch (md) {
714 		case 0:
715 			snprintf(buf, bufsiz, "sts.l   mach, @-r%d", rn);
716 			break;
717 		case 1:
718 			snprintf(buf, bufsiz, "sts.l   macl, @-r%d", rn);
719 			break;
720 		case 2:
721 			snprintf(buf, bufsiz, "sts.l   pr, @-r%d", rn);
722 			break;
723 		}
724 		break;
725 	case 1:
726 		switch (md) {
727 		case 1:
728 			snprintf(buf, bufsiz, "sts.l   fpul, @-r%d", rn);
729 			break;
730 		case 2:
731 			snprintf(buf, bufsiz, "sts.l   fpscr, @-r%d", rn);
732 			break;
733 		}
734 		break;
735 	} /* end of switch (type) */
736 }
737 
738 static void
f_43(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)739 f_43(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
740 {
741 	int	rn, type, md;
742 
743 	rn   = (insn & 0x0f00) >> 8;
744 	type = (insn & 0x00c0) >> 6;
745 	md   = (insn & 0x0030) >> 4;
746 
747 	switch (type) {
748 	case 0:
749 		switch (md) {
750 		case 0:
751 			snprintf(buf, bufsiz, "stc.l   sr, @-r%d", rn);
752 			break;
753 		case 1:
754 			snprintf(buf, bufsiz, "stc.l   gbr, @-r%d", rn);
755 			break;
756 		case 2:
757 			snprintf(buf, bufsiz, "stc.l   vbr, @-r%d", rn);
758 			break;
759 		case 3:
760 			snprintf(buf, bufsiz, "stc.l   ssr, @-r%d", rn);
761 			break;
762 		}
763 		break;
764 	case 1:
765 		switch (md) {
766 		case 0:
767 			snprintf(buf, bufsiz, "stc.l   spc, @-r%d", rn);
768 			break;
769 		}
770 		break;
771 	case 2:
772 		snprintf(buf, bufsiz, "stc.l   r%d_bank, @-r%d", md, rn);
773 		break;
774 	case 3:
775 		snprintf(buf, bufsiz, "stc.l   r%d_bank, @-r%d", md + 4, rn);
776 		break;
777 	} /* end of switch (type) */
778 }
779 
780 static void
f_44(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)781 f_44(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
782 {
783 	int	rn, fx;
784 
785 	rn   = (insn & 0x0f00) >> 8;
786 	fx   = (insn & 0x00f0) >> 4;
787 
788 	switch (fx) {
789 	case 0:
790 		snprintf(buf, bufsiz, "rotl    r%d", rn);
791 		break;
792 	case 2:
793 		snprintf(buf, bufsiz, "rotcl   r%d", rn);
794 		break;
795 	} /* end of switch (fx) */
796 }
797 
798 static void
f_45(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)799 f_45(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
800 {
801 	int	rn, fx;
802 
803 	rn   = (insn & 0x0f00) >> 8;
804 	fx   = (insn & 0x00f0) >> 4;
805 
806 	switch (fx) {
807 	case 0:
808 		snprintf(buf, bufsiz, "rotr    r%d", rn);
809 		break;
810 	case 1:
811 		snprintf(buf, bufsiz, "cmp/pl  r%d", rn);
812 		break;
813 	case 2:
814 		snprintf(buf, bufsiz, "rotcr   r%d", rn);
815 		break;
816 	} /* end of switch (fx) */
817 }
818 
819 static void
f_46(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)820 f_46(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
821 {
822 	int	rm, type, md;
823 
824 	rm   = (insn & 0x0f00) >> 8;
825 	type = (insn & 0x00c0) >> 6;
826 	md   = (insn & 0x0030) >> 4;
827 
828 	switch (type) {
829 	case 0:
830 		switch (md) {
831 		case 0:
832 			snprintf(buf, bufsiz, "lds.l   @r%d+, mach", rm);
833 			break;
834 		case 1:
835 			snprintf(buf, bufsiz, "lds.l   @r%d+, macl", rm);
836 			break;
837 		case 2:
838 			snprintf(buf, bufsiz, "lds.l   @r%d+, pr", rm);
839 			break;
840 		}
841 		break;
842 	case 1:
843 		switch (md) {
844 		case 1:
845 			snprintf(buf, bufsiz, "lds.l   @r%d+, fpul", rm);
846 			break;
847 		case 2:
848 			snprintf(buf, bufsiz, "lds.l   @r%d+, fpscr", rm);
849 			break;
850 		}
851 		break;
852 	} /* end of switch (type) */
853 }
854 
855 static void
f_47(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)856 f_47(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
857 {
858 	int	rm, type, md;
859 
860 	rm   = (insn & 0x0f00) >> 8;
861 	type = (insn & 0x00c0) >> 6;
862 	md   = (insn & 0x0030) >> 4;
863 
864 	switch (type) {
865 	case 0:
866 		switch (md) {
867 		case 0:
868 			snprintf(buf, bufsiz, "ldc.l   @r%d+, sr", rm);
869 			break;
870 		case 1:
871 			snprintf(buf, bufsiz, "ldc.l   @r%d+, gbr", rm);
872 			break;
873 		case 2:
874 			snprintf(buf, bufsiz, "ldc.l   @r%d+, vbr", rm);
875 			break;
876 		case 3:
877 			snprintf(buf, bufsiz, "ldc.l   @r%d+, ssr", rm);
878 			break;
879 		}
880 		break;
881 	case 1:
882 		switch (md) {
883 		case 0:
884 			snprintf(buf, bufsiz, "ldc.l   @r%d+, spc", rm);
885 			break;
886 		}
887 		break;
888 	case 2:
889 		snprintf(buf, bufsiz, "ldc.l   @r%d+, r%d_bank", rm, md);
890 		break;
891 	case 3:
892 		snprintf(buf, bufsiz, "ldc.l   @r%d+, r%d_bank", rm, md + 4);
893 		break;
894 	} /* end of switch (type) */
895 }
896 
897 static void
f_48(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)898 f_48(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
899 {
900 	int	rn, fx;
901 
902 	rn   = (insn & 0x0f00) >> 8;
903 	fx   = (insn & 0x00f0) >> 4;
904 
905 	switch (fx) {
906 	case 0:
907 		snprintf(buf, bufsiz, "shll2   r%d", rn);
908 		break;
909 	case 1:
910 		snprintf(buf, bufsiz, "shll8   r%d", rn);
911 		break;
912 	case 2:
913 		snprintf(buf, bufsiz, "shll16  r%d", rn);
914 		break;
915 	} /* end of switch (fx) */
916 }
917 
918 static void
f_49(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)919 f_49(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
920 {
921 	int	rn, fx;
922 
923 	rn   = (insn & 0x0f00) >> 8;
924 	fx   = (insn & 0x00f0) >> 4;
925 
926 	switch (fx) {
927 	case 0:
928 		snprintf(buf, bufsiz, "shlr2   r%d", rn);
929 		break;
930 	case 1:
931 		snprintf(buf, bufsiz, "shlr8   r%d", rn);
932 		break;
933 	case 2:
934 		snprintf(buf, bufsiz, "shlr16  r%d", rn);
935 		break;
936 	} /* end of switch (fx) */
937 }
938 
939 static void
f_4a(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)940 f_4a(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
941 {
942 	int	rm, type, md;
943 
944 	rm   = (insn & 0x0f00) >> 8;
945 	type = (insn & 0x00c0) >> 6;
946 	md   = (insn & 0x0030) >> 4;
947 
948 	switch (type) {
949 	case 0:
950 		switch (md) {
951 		case 0:
952 			snprintf(buf, bufsiz, "lds     r%d, mach", rm);
953 			break;
954 		case 1:
955 			snprintf(buf, bufsiz, "lds     r%d, macl", rm);
956 			break;
957 		case 2:
958 			snprintf(buf, bufsiz, "lds     r%d, pr", rm);
959 			break;
960 		}
961 		break;
962 	case 1:
963 		switch (md) {
964 		case 1:
965 			snprintf(buf, bufsiz, "lds     r%d, fpul", rm);
966 			break;
967 		case 2:
968 			snprintf(buf, bufsiz, "lds     r%d, fpscr", rm);
969 			break;
970 		}
971 		break;
972 	} /* end of switch (type) */
973 }
974 
975 static void
f_4b(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)976 f_4b(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
977 {
978 	int	rm, fx;
979 
980 	rm   = (insn & 0x0f00) >> 8;
981 	fx   = (insn & 0x00f0) >> 4;
982 
983 	switch (fx) {
984 	case 0:
985 		snprintf(buf, bufsiz, "jsr     @r%d", rm);
986 		break;
987 	case 1:
988 		snprintf(buf, bufsiz, "tas.b   @r%d", rm);
989 		break;
990 	case 2:
991 		snprintf(buf, bufsiz, "jmp     @r%d", rm);
992 		break;
993 	} /* end of switch (fx) */
994 }
995 
996 static void
f_4c(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)997 f_4c(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
998 {
999 	int	rn, rm;
1000 
1001 	rn   = (insn & 0x0f00) >> 8;
1002 	rm   = (insn & 0x00f0) >> 4;
1003 	snprintf(buf, bufsiz, "shad    r%d, r%d", rm, rn);
1004 }
1005 
1006 static void
f_4d(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1007 f_4d(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1008 {
1009 	int	rn, rm;
1010 
1011 	rn   = (insn & 0x0f00) >> 8;
1012 	rm   = (insn & 0x00f0) >> 4;
1013 	snprintf(buf, bufsiz, "shld    r%d, r%d", rm, rn);
1014 }
1015 
1016 static void
f_4e(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1017 f_4e(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1018 {
1019 	int	rm, type, md;
1020 
1021 	rm   = (insn & 0x0f00) >> 8;
1022 	type = (insn & 0x00c0) >> 6;
1023 	md   = (insn & 0x0030) >> 4;
1024 
1025 	switch (type) {
1026 	case 0:
1027 		switch (md) {
1028 		case 0:
1029 			snprintf(buf, bufsiz, "ldc     r%d, sr", rm);
1030 			break;
1031 		case 1:
1032 			snprintf(buf, bufsiz, "ldc     r%d, gbr", rm);
1033 			break;
1034 		case 2:
1035 			snprintf(buf, bufsiz, "ldc     r%d, vbr", rm);
1036 			break;
1037 		case 3:
1038 			snprintf(buf, bufsiz, "ldc     r%d, ssr", rm);
1039 			break;
1040 		}
1041 		break;
1042 	case 1:
1043 		switch (md) {
1044 		case 0:
1045 			snprintf(buf, bufsiz, "ldc     r%d, spc", rm);
1046 			break;
1047 		}
1048 		break;
1049 	case 2:
1050 		snprintf(buf, bufsiz, "ldc     r%d, r%d_bank", rm, md);
1051 		break;
1052 	case 3:
1053 		snprintf(buf, bufsiz, "ldc     r%d, r%d_bank", rm, md + 4);
1054 		break;
1055 	} /* end of switch (type) */
1056 }
1057 
1058 static void
f_4f(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1059 f_4f(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1060 {
1061 	int	rn, rm;
1062 
1063 	rn   = (insn & 0x0f00) >> 8;
1064 	rm   = (insn & 0x00f0) >> 4;
1065 	snprintf(buf, bufsiz, "mac.w   @r%d+, @r%d+", rm, rn);
1066 }
1067 
1068 static void
f_50(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1069 f_50(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1070 {
1071 	int	rn, rm, disp;
1072 
1073 	rn   = (insn & 0x0f00) >> 8;
1074 	rm   = (insn & 0x00f0) >> 4;
1075 	disp = (insn & 0x000f);
1076 	disp *= 4;
1077 
1078 	snprintf(buf, bufsiz, "mov.l   @(%d, r%d), r%d", disp, rm, rn);
1079 }
1080 
1081 static void
f_60(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1082 f_60(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1083 {
1084 	int	rn, rm, md;
1085 
1086 	rn   = (insn & 0x0f00) >> 8;
1087 	rm   = (insn & 0x00f0) >> 4;
1088 	md   = (insn & 0x0003);
1089 
1090 	switch (md) {
1091 	case 0:
1092 		snprintf(buf, bufsiz, "mov.b   @r%d, r%d", rm, rn);
1093 		break;
1094 	case 1:
1095 		snprintf(buf, bufsiz, "mov.w   @r%d, r%d", rm, rn);
1096 		break;
1097 	case 2:
1098 		snprintf(buf, bufsiz, "mov.l   @r%d, r%d", rm, rn);
1099 		break;
1100 	case 3:
1101 		snprintf(buf, bufsiz, "mov     r%d, r%d", rm, rn);
1102 		break;
1103 	} /* end of switch (md) */
1104 }
1105 
1106 static void
f_64(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1107 f_64(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1108 {
1109 	int	rn, rm, md;
1110 
1111 	rn   = (insn & 0x0f00) >> 8;
1112 	rm   = (insn & 0x00f0) >> 4;
1113 	md   = (insn & 0x0003);
1114 
1115 	switch (md) {
1116 	case 0:
1117 		snprintf(buf, bufsiz, "mov.b   @r%d+, r%d", rm, rn);
1118 		break;
1119 	case 1:
1120 		snprintf(buf, bufsiz, "mov.w   @r%d+, r%d", rm, rn);
1121 		break;
1122 	case 2:
1123 		snprintf(buf, bufsiz, "mov.l   @r%d+, r%d", rm, rn);
1124 		break;
1125 	case 3:
1126 		snprintf(buf, bufsiz, "not     r%d, r%d", rm, rn);
1127 		break;
1128 	} /* end of switch (md) */
1129 }
1130 
1131 static void
f_68(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1132 f_68(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1133 {
1134 	int	rn, rm, md;
1135 
1136 	rn   = (insn & 0x0f00) >> 8;
1137 	rm   = (insn & 0x00f0) >> 4;
1138 	md   = (insn & 0x0003);
1139 
1140 	switch (md) {
1141 	case 0:
1142 		snprintf(buf, bufsiz, "swap.b  r%d, r%d", rm, rn);
1143 		break;
1144 	case 1:
1145 		snprintf(buf, bufsiz, "swap.w  r%d, r%d", rm, rn);
1146 		break;
1147 	case 2:
1148 		snprintf(buf, bufsiz, "negc    r%d, r%d", rm, rn);
1149 		break;
1150 	case 3:
1151 		snprintf(buf, bufsiz, "neg     r%d, r%d", rm, rn);
1152 		break;
1153 	} /* end of switch (md) */
1154 }
1155 
1156 static void
f_6c(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1157 f_6c(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1158 {
1159 	int	rn, rm, md;
1160 
1161 	rn   = (insn & 0x0f00) >> 8;
1162 	rm   = (insn & 0x00f0) >> 4;
1163 	md   = (insn & 0x0003);
1164 
1165 	switch (md) {
1166 	case 0:
1167 		snprintf(buf, bufsiz, "extu.b  r%d, r%d", rm, rn);
1168 		break;
1169 	case 1:
1170 		snprintf(buf, bufsiz, "extu.w  r%d, r%d", rm, rn);
1171 		break;
1172 	case 2:
1173 		snprintf(buf, bufsiz, "exts.b  r%d, r%d", rm, rn);
1174 		break;
1175 	case 3:
1176 		snprintf(buf, bufsiz, "exts.w  r%d, r%d", rm, rn);
1177 		break;
1178 	} /* end of switch (md) */
1179 }
1180 
1181 static void
f_70(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1182 f_70(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1183 {
1184 	int	rn, imm;
1185 
1186 	rn   = (insn & 0x0f00) >> 8;
1187 	imm  = (int) ((char) (insn & 0x00ff));
1188 
1189 	snprintf(buf, bufsiz, "add     #0x%x, r%d", imm, rn);
1190 }
1191 
1192 static void
f_80(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1193 f_80(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1194 {
1195 	int	type, md, rn, disp;
1196 
1197 	type = (insn & 0x0c00) >> 10;
1198 	md   = (insn & 0x0300) >> 8;
1199 
1200 	switch (type) {
1201 	case 0:
1202 		rn   = (insn & 0x00f0) >> 4;
1203 		disp = (insn & 0x000f);
1204 
1205 		switch (md) {
1206 		case 0:
1207 			snprintf(buf, bufsiz, "mov.b   r0, @(%d, r%d)",
1208 			    disp, rn);
1209 			break;
1210 		case 1:
1211 			disp *= 2;
1212 			snprintf(buf, bufsiz, "mov.w   r0, @(%d, r%d)",
1213 			    disp, rn);
1214 			break;
1215 		}
1216 		break;
1217 	case 1:
1218 		rn   = (insn & 0x00f0) >> 4;
1219 		disp = (insn & 0x000f);
1220 
1221 		switch (md) {
1222 		case 0:
1223 			snprintf(buf, bufsiz, "mov.b   @(%d, r%d), r0",
1224 			    disp, rn);
1225 			break;
1226 		case 1:
1227 			disp *= 2;
1228 			snprintf(buf, bufsiz, "mov.w   @(%d, r%d), r0",
1229 			    disp, rn);
1230 			break;
1231 		}
1232 		break;
1233 	case 2:
1234 		disp = (insn & 0x00ff);
1235 
1236 		switch (md) {
1237 		case 0:
1238 			snprintf(buf, bufsiz, "cmp/eq  #%d, r0", disp);
1239 			break;
1240 		case 1:
1241 			disp = (int) ((char) disp);
1242 			disp *= 2;
1243 			disasm_branch(buf, bufsiz, "bt", loc + 4 + disp);
1244 			break;
1245 		case 3:
1246 			disp = (int) ((char) disp);
1247 			disp *= 2;
1248 			disasm_branch(buf, bufsiz, "bf", loc + 4 + disp);
1249 			break;
1250 		}
1251 		break;
1252 	case 3:
1253 		disp = (int) ((char) (insn & 0x00ff));
1254 		disp *= 2;
1255 
1256 		switch (md) {
1257 		case 1:
1258 			disasm_branch(buf, bufsiz, "bt/s", loc + 4 + disp);
1259 			break;
1260 		case 3:
1261 			disasm_branch(buf, bufsiz, "bf/s", loc + 4 + disp);
1262 			break;
1263 		}
1264 		break;
1265 	} /* end of switch (type) */
1266 }
1267 
1268 static void
f_90(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1269 f_90(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1270 {
1271 	int	rn, disp;
1272 
1273 	rn   = (insn & 0x0f00) >> 8;
1274 	disp = (insn & 0x00ff);
1275 	disp *= 2;
1276 
1277 	snprintf(buf, bufsiz, "mov.w   @(%d, pc), r%d", disp, rn);
1278 }
1279 
1280 static void
f_a0(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1281 f_a0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1282 {
1283 	int	disp;
1284 
1285 	disp = (insn & 0x0fff);
1286 	if (disp & 0x0800)	/* negative displacement? */
1287 		disp |= 0xfffff000; /* sign extend */
1288 	disp *= 2;
1289 
1290 	disasm_branch(buf, bufsiz, "bra", loc + 4 + disp);
1291 }
1292 
1293 static void
f_b0(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1294 f_b0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1295 {
1296 	int	disp;
1297 
1298 	disp = (insn & 0x0fff);
1299 	if (disp & 0x0800)	/* negative displacement? */
1300 		disp |= 0xfffff000; /* sign extend */
1301 	disp *= 2;
1302 
1303 	disasm_branch(buf, bufsiz, "bsr", loc + 4 + disp);
1304 }
1305 
1306 static void
f_c0(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1307 f_c0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1308 {
1309 	int	type, md, imm;
1310 
1311 	type = (insn & 0x0c00) >> 10;
1312 	md   = (insn & 0x0300) >> 8;
1313 	imm  = (insn & 0x00ff);
1314 
1315 	switch (type) {
1316 	case 0:
1317 		switch (md) {
1318 		case 0:
1319 			snprintf(buf, bufsiz, "mov.b   r0, @(%d, gbr)", imm);
1320 			break;
1321 		case 1:
1322 			imm *= 2;
1323 			snprintf(buf, bufsiz, "mov.w   r0, @(%d, gbr)", imm);
1324 			break;
1325 		case 2:
1326 			imm *= 4;
1327 			snprintf(buf, bufsiz, "mov.l   r0, @(%d, gbr)", imm);
1328 			break;
1329 		case 3:
1330 			snprintf(buf, bufsiz, "trapa   #%d", imm);
1331 			break;
1332 		}
1333 		break;
1334 	case 1:
1335 		switch (md) {
1336 		case 0:
1337 			snprintf(buf, bufsiz, "mov.b   @(%d, gbr), r0", imm);
1338 			break;
1339 		case 1:
1340 			imm *= 2;
1341 			snprintf(buf, bufsiz, "mov.w   @(%d, gbr), r0", imm);
1342 			break;
1343 		case 2:
1344 			imm *= 4;
1345 			snprintf(buf, bufsiz, "mov.l   @(%d, gbr), r0", imm);
1346 			break;
1347 		case 3:
1348 			imm *= 4;
1349 			snprintf(buf, bufsiz, "mova    @(%d, pc), r0", imm);
1350 			break;
1351 		}
1352 		break;
1353 	case 2:
1354 		switch (md) {
1355 		case 0:
1356 			snprintf(buf, bufsiz, "tst     #%d, r0", imm);
1357 			break;
1358 		case 1:
1359 			snprintf(buf, bufsiz, "and     #%d, r0", imm);
1360 			break;
1361 		case 2:
1362 			snprintf(buf, bufsiz, "xor     #%d, r0", imm);
1363 			break;
1364 		case 3:
1365 			snprintf(buf, bufsiz, "or      #%d, r0", imm);
1366 			break;
1367 		}
1368 		break;
1369 	case 3:
1370 		switch (md) {
1371 		case 0:
1372 			snprintf(buf, bufsiz, "tst.b   #%d, @(r0, gbr)", imm);
1373 			break;
1374 		case 1:
1375 			snprintf(buf, bufsiz, "and.b   #%d, @(r0, gbr)", imm);
1376 			break;
1377 		case 2:
1378 			snprintf(buf, bufsiz, "xor.b   #%d, @(r0, gbr)", imm);
1379 			break;
1380 		case 3:
1381 			snprintf(buf, bufsiz, "or.b    #%d, @(r0, gbr)", imm);
1382 			break;
1383 		}
1384 		break;
1385 	} /* end of switch (type) */
1386 }
1387 
1388 static void
f_d0(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1389 f_d0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1390 {
1391 	int	rn, disp;
1392 
1393 	rn   = (insn & 0x0f00) >> 8;
1394 	disp = (insn & 0x00ff);
1395 	disp *= 4;
1396 
1397 	snprintf(buf, bufsiz, "mov.l   @(%d, pc), r%d", disp, rn);
1398 }
1399 
1400 static void
f_e0(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1401 f_e0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1402 {
1403 	int	rn, imm;
1404 
1405 	rn   = (insn & 0x0f00) >> 8;
1406 	imm  = (int) ((char) (insn & 0x00ff));
1407 
1408 	snprintf(buf, bufsiz, "mov     #0x%x, r%d", imm, rn);
1409 }
1410 
1411 static void
f_f0(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1412 f_f0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1413 {
1414 	int	rn, rm, md;
1415 
1416 	rn   = (insn & 0x0f00) >> 8;
1417 	rm   = (insn & 0x00f0) >> 4;
1418 	md   = (insn & 0x0003);
1419 
1420 	switch (md) {
1421 	case 0:
1422 		snprintf(buf, bufsiz, "fadd    fr%d, fr%d", rm, rn);
1423 		break;
1424 	case 1:
1425 		snprintf(buf, bufsiz, "fsub    fr%d, fr%d", rm, rn);
1426 		break;
1427 	case 2:
1428 		snprintf(buf, bufsiz, "fmul    fr%d, fr%d", rm, rn);
1429 		break;
1430 	case 3:
1431 		snprintf(buf, bufsiz, "fdiv    fr%d, fr%d", rm, rn);
1432 		break;
1433 	} /* end of switch (md) */
1434 }
1435 
1436 static void
f_f4(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1437 f_f4(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1438 {
1439 	int	rn, rm, md;
1440 
1441 	rn   = (insn & 0x0f00) >> 8;
1442 	rm   = (insn & 0x00f0) >> 4;
1443 	md   = (insn & 0x0003);
1444 
1445 	switch (md) {
1446 	case 0:
1447 		snprintf(buf, bufsiz, "fcmp/eq fr%d, fr%d", rm, rn);
1448 		break;
1449 	case 1:
1450 		snprintf(buf, bufsiz, "fcmp/gt fr%d, fr%d", rm, rn);
1451 		break;
1452 	case 2:
1453 		snprintf(buf, bufsiz, "fmov.s  @(r0, r%d), fr%d", rm, rn);
1454 		break;
1455 	case 3:
1456 		snprintf(buf, bufsiz, "fmov.s  fr%d, @(r0, r%d)", rm, rn);
1457 		break;
1458 	} /* end of switch (md) */
1459 }
1460 
1461 static void
f_f8(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1462 f_f8(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1463 {
1464 	int	rn, rm, md;
1465 
1466 	rn   = (insn & 0x0f00) >> 8;
1467 	rm   = (insn & 0x00f0) >> 4;
1468 	md   = (insn & 0x0003);
1469 
1470 	switch (md) {
1471 	case 0:
1472 		snprintf(buf, bufsiz, "fmov.s  @r%d, fr%d", rm, rn);
1473 		break;
1474 	case 1:
1475 		snprintf(buf, bufsiz, "fmov.s  @r%d+, fr%d", rm, rn);
1476 		break;
1477 	case 2:
1478 		snprintf(buf, bufsiz, "fmov.s  fr%d, @r%d", rm, rn);
1479 		break;
1480 	case 3:
1481 		snprintf(buf, bufsiz, "fmov.s  fr%d, @-r%d", rm, rn);
1482 		break;
1483 	} /* end of switch (md) */
1484 }
1485 
1486 static void
f_fc(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1487 f_fc(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1488 {
1489 	int	rn, rm;
1490 
1491 	rn   = (insn & 0x0f00) >> 8;
1492 	rm   = (insn & 0x00f0) >> 4;
1493 
1494 	snprintf(buf, bufsiz, "fmov    fr%d, fr%d", rm, rn);
1495 }
1496 
1497 static void
f_fd(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1498 f_fd(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1499 {
1500 	int	rn, type, md;
1501 
1502 	rn   = (insn & 0x0f00) >> 8;
1503 	type = (insn & 0x00c0) >> 6;
1504 	md   = (insn & 0x0030) >> 4;
1505 
1506 	switch (type) {
1507 	case 0:
1508 		switch (md) {
1509 		case 0:
1510 			snprintf(buf, bufsiz, "fsts    fpul, fr%d", rn);
1511 			break;
1512 		case 1:
1513 			snprintf(buf, bufsiz, "flds    fr%d, fpul", rn);
1514 			break;
1515 		case 2:
1516 			snprintf(buf, bufsiz, "float   fpul, fr%d", rn);
1517 			break;
1518 		case 3:
1519 			snprintf(buf, bufsiz, "ftrc    fr%d, fpul", rn);
1520 			break;
1521 		}
1522 		break;
1523 	case 1:
1524 		switch (md) {
1525 		case 0:
1526 			snprintf(buf, bufsiz, "fneg    fr%d", rn);
1527 			break;
1528 		case 1:
1529 			snprintf(buf, bufsiz, "fabs    fr%d", rn);
1530 			break;
1531 		case 2:
1532 			snprintf(buf, bufsiz, "fsqrt   fr%d", rn);
1533 			break;
1534 		}
1535 		break;
1536 	case 2:
1537 		switch (md) {
1538 		case 0:
1539 		case 1:
1540 			snprintf(buf, bufsiz, "fldi%d   fr%d", md, rn);
1541 			break;
1542 		}
1543 		break;
1544 	} /* end of switch (type) */
1545 }
1546 
1547 static void
f_fe(vaddr_t loc,u_int insn,char * buf,size_t bufsiz)1548 f_fe(vaddr_t loc, u_int insn, char *buf, size_t bufsiz)
1549 {
1550 	int	rn, rm;
1551 
1552 	rn   = (insn & 0x0f00) >> 8;
1553 	rm   = (insn & 0x00f0) >> 4;
1554 
1555 	snprintf(buf, bufsiz, "fmac    fr0, fr%d, fr%d", rm, rn);
1556 }
1557