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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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