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