1*949c1c4eSmiod /* $OpenBSD: db_disasm.c,v 1.7 2024/11/07 16:02:29 miod Exp $ */ 295c7671fSmiod /* $NetBSD: db_disasm.c,v 1.13 2006/01/21 02:09:06 uwe Exp $ */ 395c7671fSmiod 495c7671fSmiod /* 595c7671fSmiod * Copyright (c) 1998-2000 Internet Initiative Japan Inc. 695c7671fSmiod * All rights reserved. 795c7671fSmiod * 895c7671fSmiod * Author: Akinori Koketsu 995c7671fSmiod * 1095c7671fSmiod * Redistribution and use in source and binary forms, with or without 1195c7671fSmiod * modification, are permitted provided that the following conditions 1295c7671fSmiod * are met: 1395c7671fSmiod * 1. Redistributions of source code must retain the above copyright 1495c7671fSmiod * notice, this list of conditions and the following disclaimer. 1595c7671fSmiod * 2. Redistribution with functional modification must include 1695c7671fSmiod * prominent notice stating how and when and by whom it is 1795c7671fSmiod * modified. 1895c7671fSmiod * 3. Redistributions in binary form have to be along with the source 1995c7671fSmiod * code or documentation which include above copyright notice, this 2095c7671fSmiod * list of conditions and the following disclaimer. 2195c7671fSmiod * 4. All commercial advertising materials mentioning features or use 2295c7671fSmiod * of this software must display the following acknowledgement: 2395c7671fSmiod * This product includes software developed by Internet 2495c7671fSmiod * Initiative Japan Inc. 2595c7671fSmiod * 2695c7671fSmiod * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY EXPRESS OR IMPLIED 2795c7671fSmiod * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2895c7671fSmiod * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2995c7671fSmiod * DISCLAIMED. 3095c7671fSmiod */ 3195c7671fSmiod 3295c7671fSmiod #include <sys/param.h> 3395c7671fSmiod #include <sys/systm.h> 3495c7671fSmiod 3595c7671fSmiod #include <machine/db_machdep.h> 3695c7671fSmiod 3795c7671fSmiod #include <ddb/db_interface.h> 3895c7671fSmiod #include <ddb/db_output.h> 39f0152d4fSmiod #include <ddb/db_sym.h> 4095c7671fSmiod 4152de38dfSmpi static void disasm_branch(char *, size_t, const char *, vaddr_t); 4295c7671fSmiod static void get_ascii(unsigned char *, char *); 4352de38dfSmpi static void get_opcode(vaddr_t, char *, size_t); 4452de38dfSmpi static void f_02(vaddr_t, u_int, char *, size_t); 4552de38dfSmpi static void f_03(vaddr_t, u_int, char *, size_t); 4652de38dfSmpi static void f_04(vaddr_t, u_int, char *, size_t); 4752de38dfSmpi static void f_08(vaddr_t, u_int, char *, size_t); 4852de38dfSmpi static void f_09(vaddr_t, u_int, char *, size_t); 4952de38dfSmpi static void f_0a(vaddr_t, u_int, char *, size_t); 5052de38dfSmpi static void f_0b(vaddr_t, u_int, char *, size_t); 5152de38dfSmpi static void f_0c(vaddr_t, u_int, char *, size_t); 5252de38dfSmpi static void f_10(vaddr_t, u_int, char *, size_t); 5352de38dfSmpi static void f_20(vaddr_t, u_int, char *, size_t); 5452de38dfSmpi static void f_24(vaddr_t, u_int, char *, size_t); 5552de38dfSmpi static void f_28(vaddr_t, u_int, char *, size_t); 5652de38dfSmpi static void f_2c(vaddr_t, u_int, char *, size_t); 5752de38dfSmpi static void f_30(vaddr_t, u_int, char *, size_t); 5852de38dfSmpi static void f_34(vaddr_t, u_int, char *, size_t); 5952de38dfSmpi static void f_38(vaddr_t, u_int, char *, size_t); 6052de38dfSmpi static void f_3c(vaddr_t, u_int, char *, size_t); 6152de38dfSmpi static void f_40(vaddr_t, u_int, char *, size_t); 6252de38dfSmpi static void f_41(vaddr_t, u_int, char *, size_t); 6352de38dfSmpi static void f_42(vaddr_t, u_int, char *, size_t); 6452de38dfSmpi static void f_43(vaddr_t, u_int, char *, size_t); 6552de38dfSmpi static void f_44(vaddr_t, u_int, char *, size_t); 6652de38dfSmpi static void f_45(vaddr_t, u_int, char *, size_t); 6752de38dfSmpi static void f_46(vaddr_t, u_int, char *, size_t); 6852de38dfSmpi static void f_47(vaddr_t, u_int, char *, size_t); 6952de38dfSmpi static void f_48(vaddr_t, u_int, char *, size_t); 7052de38dfSmpi static void f_49(vaddr_t, u_int, char *, size_t); 7152de38dfSmpi static void f_4a(vaddr_t, u_int, char *, size_t); 7252de38dfSmpi static void f_4b(vaddr_t, u_int, char *, size_t); 7352de38dfSmpi static void f_4c(vaddr_t, u_int, char *, size_t); 7452de38dfSmpi static void f_4d(vaddr_t, u_int, char *, size_t); 7552de38dfSmpi static void f_4e(vaddr_t, u_int, char *, size_t); 7652de38dfSmpi static void f_4f(vaddr_t, u_int, char *, size_t); 7752de38dfSmpi static void f_50(vaddr_t, u_int, char *, size_t); 7852de38dfSmpi static void f_60(vaddr_t, u_int, char *, size_t); 7952de38dfSmpi static void f_64(vaddr_t, u_int, char *, size_t); 8052de38dfSmpi static void f_68(vaddr_t, u_int, char *, size_t); 8152de38dfSmpi static void f_6c(vaddr_t, u_int, char *, size_t); 8252de38dfSmpi static void f_70(vaddr_t, u_int, char *, size_t); 8352de38dfSmpi static void f_80(vaddr_t, u_int, char *, size_t); 8452de38dfSmpi static void f_90(vaddr_t, u_int, char *, size_t); 8552de38dfSmpi static void f_a0(vaddr_t, u_int, char *, size_t); 8652de38dfSmpi static void f_b0(vaddr_t, u_int, char *, size_t); 8752de38dfSmpi static void f_c0(vaddr_t, u_int, char *, size_t); 8852de38dfSmpi static void f_d0(vaddr_t, u_int, char *, size_t); 8952de38dfSmpi static void f_e0(vaddr_t, u_int, char *, size_t); 9052de38dfSmpi static void f_f0(vaddr_t, u_int, char *, size_t); 9152de38dfSmpi static void f_f4(vaddr_t, u_int, char *, size_t); 9252de38dfSmpi static void f_f8(vaddr_t, u_int, char *, size_t); 9352de38dfSmpi static void f_fc(vaddr_t, u_int, char *, size_t); 9452de38dfSmpi static void f_fd(vaddr_t, u_int, char *, size_t); 9552de38dfSmpi static void f_fe(vaddr_t, u_int, char *, size_t); 9695c7671fSmiod 9752de38dfSmpi typedef void (*rasm_t)(vaddr_t, u_int, char *, size_t); 98f0152d4fSmiod static const rasm_t f[16][16] = { 9995c7671fSmiod { /* [0][0-7] */ NULL, NULL, f_02, f_03, f_04, f_04, f_04, f_04, 10095c7671fSmiod /* [0][8-f] */ f_08, f_09, f_0a, f_0b, f_0c, f_0c, f_0c, f_0c }, 10195c7671fSmiod { /* [1][0-7] */ f_10, f_10, f_10, f_10, f_10, f_10, f_10, f_10, 10295c7671fSmiod /* [1][8-f] */ f_10, f_10, f_10, f_10, f_10, f_10, f_10, f_10 }, 10395c7671fSmiod { /* [2][0-7] */ f_20, f_20, f_20, f_20, f_24, f_24, f_24, f_24, 10495c7671fSmiod /* [2][8-f] */ f_28, f_28, f_28, f_28, f_2c, f_2c, f_2c, f_2c }, 10595c7671fSmiod { /* [3][0-7] */ f_30, f_30, f_30, f_30, f_34, f_34, f_34, f_34, 10695c7671fSmiod /* [3][8-f] */ f_38, f_38, f_38, f_38, f_3c, f_3c, f_3c, f_3c }, 10795c7671fSmiod { /* [4][0-7] */ f_40, f_41, f_42, f_43, f_44, f_45, f_46, f_47, 10895c7671fSmiod /* [4][8-f] */ f_48, f_49, f_4a, f_4b, f_4c, f_4d, f_4e, f_4f }, 10995c7671fSmiod { /* [5][0-7] */ f_50, f_50, f_50, f_50, f_50, f_50, f_50, f_50, 11095c7671fSmiod /* [5][8-f] */ f_50, f_50, f_50, f_50, f_50, f_50, f_50, f_50 }, 11195c7671fSmiod { /* [6][0-7] */ f_60, f_60, f_60, f_60, f_64, f_64, f_64, f_64, 11295c7671fSmiod /* [6][8-f] */ f_68, f_68, f_68, f_68, f_6c, f_6c, f_6c, f_6c }, 11395c7671fSmiod { /* [7][0-7] */ f_70, f_70, f_70, f_70, f_70, f_70, f_70, f_70, 11495c7671fSmiod /* [7][8-f] */ f_70, f_70, f_70, f_70, f_70, f_70, f_70, f_70 }, 11595c7671fSmiod { /* [8][0-7] */ f_80, f_80, f_80, f_80, f_80, f_80, f_80, f_80, 11695c7671fSmiod /* [8][8-f] */ f_80, f_80, f_80, f_80, f_80, f_80, f_80, f_80 }, 11795c7671fSmiod { /* [9][0-7] */ f_90, f_90, f_90, f_90, f_90, f_90, f_90, f_90, 11895c7671fSmiod /* [9][8-f] */ f_90, f_90, f_90, f_90, f_90, f_90, f_90, f_90 }, 11995c7671fSmiod { /* [a][0-7] */ f_a0, f_a0, f_a0, f_a0, f_a0, f_a0, f_a0, f_a0, 12095c7671fSmiod /* [a][8-f] */ f_a0, f_a0, f_a0, f_a0, f_a0, f_a0, f_a0, f_a0 }, 12195c7671fSmiod { /* [b][0-7] */ f_b0, f_b0, f_b0, f_b0, f_b0, f_b0, f_b0, f_b0, 12295c7671fSmiod /* [b][8-f] */ f_b0, f_b0, f_b0, f_b0, f_b0, f_b0, f_b0, f_b0 }, 12395c7671fSmiod { /* [c][0-7] */ f_c0, f_c0, f_c0, f_c0, f_c0, f_c0, f_c0, f_c0, 12495c7671fSmiod /* [c][8-f] */ f_c0, f_c0, f_c0, f_c0, f_c0, f_c0, f_c0, f_c0 }, 12595c7671fSmiod { /* [d][0-7] */ f_d0, f_d0, f_d0, f_d0, f_d0, f_d0, f_d0, f_d0, 12695c7671fSmiod /* [d][8-f] */ f_d0, f_d0, f_d0, f_d0, f_d0, f_d0, f_d0, f_d0 }, 12795c7671fSmiod { /* [e][0-7] */ f_e0, f_e0, f_e0, f_e0, f_e0, f_e0, f_e0, f_e0, 12895c7671fSmiod /* [e][8-f] */ f_e0, f_e0, f_e0, f_e0, f_e0, f_e0, f_e0, f_e0 }, 12995c7671fSmiod { /* [f][0-7] */ f_f0, f_f0, f_f0, f_f0, f_f4, f_f4, f_f4, f_f4, 13095c7671fSmiod /* [f][8-f] */ f_f8, f_f8, f_f8, f_f8, f_fc, f_fd, f_fe, NULL } 13195c7671fSmiod }; 13295c7671fSmiod 13352de38dfSmpi vaddr_t 13452de38dfSmpi db_disasm(vaddr_t loc, int altfmt) 13595c7671fSmiod { 13695c7671fSmiod char line[40], ascii[4]; 13795c7671fSmiod void *pc = (void *)loc; 13895c7671fSmiod 139f0152d4fSmiod get_opcode(loc, line, sizeof line); 14095c7671fSmiod if (altfmt) { 14195c7671fSmiod get_ascii(pc, ascii); 14295c7671fSmiod db_printf("%-32s ! %s\n", line, ascii); 14395c7671fSmiod } else 14495c7671fSmiod db_printf("%s\n", line); 14595c7671fSmiod 14695c7671fSmiod return (loc + 2); 14795c7671fSmiod } 14895c7671fSmiod 14995c7671fSmiod static void 15052de38dfSmpi disasm_branch(char *buf, size_t bufsiz, const char *opstr, vaddr_t addr) 151f0152d4fSmiod { 152f0152d4fSmiod size_t len; 153f0152d4fSmiod db_expr_t d, value; 154*949c1c4eSmiod const char *name; 15562781896Smpi Elf_Sym *cursym; 156f0152d4fSmiod extern unsigned long db_lastsym; 157f0152d4fSmiod extern unsigned int db_maxoff; 158f0152d4fSmiod 159f0152d4fSmiod snprintf(buf, bufsiz, "%-8s", opstr); 160f0152d4fSmiod len = strlen(buf); 161f0152d4fSmiod buf += len; 162f0152d4fSmiod bufsiz -= len; 163f0152d4fSmiod 164f0152d4fSmiod if (addr <= db_lastsym) { 165f0152d4fSmiod cursym = db_search_symbol(addr, DB_STGY_PROC, &d); 166f0152d4fSmiod db_symbol_values(cursym, &name, &value); 167f0152d4fSmiod if (name && d < db_maxoff && value) { 168f0152d4fSmiod if (d == 0) 169f0152d4fSmiod snprintf(buf, bufsiz, "%s", name); 170f0152d4fSmiod else { 171f0152d4fSmiod snprintf(buf, bufsiz, "%s+", name); 172f0152d4fSmiod len = strlen(buf); 173f0152d4fSmiod buf += len; 174f0152d4fSmiod bufsiz -= len; 175f0152d4fSmiod db_format(buf, bufsiz, d, DB_FORMAT_R, 1, 0); 176f0152d4fSmiod } 177f0152d4fSmiod return; 178f0152d4fSmiod } 179f0152d4fSmiod } 180f0152d4fSmiod 181f0152d4fSmiod db_format(buf, bufsiz, addr, DB_FORMAT_N, 1, 0); 182f0152d4fSmiod } 183f0152d4fSmiod 184f0152d4fSmiod static void 18595c7671fSmiod get_ascii(unsigned char *cp, char *str) 18695c7671fSmiod { 18795c7671fSmiod *str++ = (0x20 <= *cp && *cp < 0x7f) ? *cp : '.'; 18895c7671fSmiod cp++; 18995c7671fSmiod *str++ = (0x20 <= *cp && *cp < 0x7f) ? *cp : '.'; 19095c7671fSmiod *str = '\0'; 19195c7671fSmiod } 19295c7671fSmiod 19395c7671fSmiod static void 19452de38dfSmpi get_opcode(vaddr_t loc, char *buf, size_t bufsiz) 19595c7671fSmiod { 19695c7671fSmiod int n0, n3; 197f0152d4fSmiod u_int insn = *(u_int16_t *)loc; 19895c7671fSmiod 199c26cea98Smiod snprintf(buf, bufsiz, ".word 0x%x", insn); 20095c7671fSmiod 201f0152d4fSmiod n0 = (insn & 0xf000) >> 12; 202f0152d4fSmiod n3 = (insn & 0x000f); 20395c7671fSmiod 204f0152d4fSmiod if (f[n0][n3] != NULL) 205f0152d4fSmiod (*f[n0][n3])(loc, insn, buf, bufsiz); 20695c7671fSmiod } 20795c7671fSmiod 20895c7671fSmiod static void 20952de38dfSmpi f_02(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 21095c7671fSmiod { 21195c7671fSmiod int rn, type, md; 21295c7671fSmiod 213f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 214f0152d4fSmiod type = (insn & 0x00c0) >> 6; 215f0152d4fSmiod md = (insn & 0x0030) >> 4; 21695c7671fSmiod 21795c7671fSmiod switch (type) { 21895c7671fSmiod case 0: 21995c7671fSmiod switch (md) { 22095c7671fSmiod case 0: 22195c7671fSmiod snprintf(buf, bufsiz, "stc sr, r%d", rn); 22295c7671fSmiod break; 22395c7671fSmiod case 1: 22495c7671fSmiod snprintf(buf, bufsiz, "stc gbr, r%d", rn); 22595c7671fSmiod break; 22695c7671fSmiod case 2: 22795c7671fSmiod snprintf(buf, bufsiz, "stc vbr, r%d", rn); 22895c7671fSmiod break; 22995c7671fSmiod case 3: 23095c7671fSmiod snprintf(buf, bufsiz, "stc ssr, r%d", rn); 23195c7671fSmiod break; 23295c7671fSmiod } 23395c7671fSmiod break; 23495c7671fSmiod case 1: 23595c7671fSmiod switch (md) { 23695c7671fSmiod case 0: 23795c7671fSmiod snprintf(buf, bufsiz, "stc spc, r%d", rn); 23895c7671fSmiod break; 23995c7671fSmiod } 24095c7671fSmiod break; 24195c7671fSmiod case 2: 24295c7671fSmiod snprintf(buf, bufsiz, "stc r%d_bank, r%d", md, rn); 24395c7671fSmiod break; 24495c7671fSmiod case 3: 24595c7671fSmiod snprintf(buf, bufsiz, "stc r%d_bank, r%d", md + 4, rn); 24695c7671fSmiod break; 24795c7671fSmiod } /* end of switch (type) */ 24895c7671fSmiod } 24995c7671fSmiod 25095c7671fSmiod static void 25152de38dfSmpi f_03(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 25295c7671fSmiod { 25395c7671fSmiod int rn, type, md; 25495c7671fSmiod 255f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 256f0152d4fSmiod type = (insn & 0x00c0) >> 6; 257f0152d4fSmiod md = (insn & 0x0030) >> 4; 25895c7671fSmiod 25995c7671fSmiod switch (type) { 26095c7671fSmiod case 0: 26195c7671fSmiod switch (md) { 26295c7671fSmiod case 0: 26395c7671fSmiod snprintf(buf, bufsiz, "bsrf r%d", rn); 26495c7671fSmiod break; 26595c7671fSmiod case 2: 26695c7671fSmiod snprintf(buf, bufsiz, "braf r%d", rn); 26795c7671fSmiod break; 26895c7671fSmiod } 26995c7671fSmiod break; 27095c7671fSmiod case 2: 27195c7671fSmiod switch (md) { 27295c7671fSmiod case 0: 27395c7671fSmiod snprintf(buf, bufsiz, "pref @r%d", rn); 27495c7671fSmiod break; 27595c7671fSmiod } 27695c7671fSmiod break; 27795c7671fSmiod } /* end of switch (type) */ 27895c7671fSmiod } 27995c7671fSmiod 28095c7671fSmiod static void 28152de38dfSmpi f_04(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 28295c7671fSmiod { 28395c7671fSmiod int rn, rm, md; 28495c7671fSmiod 285f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 286f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 287f0152d4fSmiod md = (insn & 0x0003); 28895c7671fSmiod 28995c7671fSmiod switch (md) { 29095c7671fSmiod case 0: 29195c7671fSmiod snprintf(buf, bufsiz, "mov.b r%d, @(r0, r%d)", rm, rn); 29295c7671fSmiod break; 29395c7671fSmiod case 1: 29495c7671fSmiod snprintf(buf, bufsiz, "mov.w r%d, @(r0, r%d)", rm, rn); 29595c7671fSmiod break; 29695c7671fSmiod case 2: 29795c7671fSmiod snprintf(buf, bufsiz, "mov.l r%d, @(r0, r%d)", rm, rn); 29895c7671fSmiod break; 29995c7671fSmiod case 3: 300c26cea98Smiod snprintf(buf, bufsiz, "mul.l r%d, r%d", rm, rn); 30195c7671fSmiod break; 30295c7671fSmiod } /* end of switch (md) */ 30395c7671fSmiod } 30495c7671fSmiod 30595c7671fSmiod static void 30652de38dfSmpi f_08(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 30795c7671fSmiod { 30895c7671fSmiod int n1, type, md; 30995c7671fSmiod 310f0152d4fSmiod n1 = (insn & 0x0f00) >> 8; 311f0152d4fSmiod type = (insn & 0x00c0) >> 6; 312f0152d4fSmiod md = (insn & 0x0030) >> 4; 31395c7671fSmiod 31495c7671fSmiod if (n1 != 0) 31595c7671fSmiod return; 31695c7671fSmiod 31795c7671fSmiod switch (type) { 31895c7671fSmiod case 0: 31995c7671fSmiod switch (md) { 32095c7671fSmiod case 0: 32195c7671fSmiod strlcpy(buf, "clrt", bufsiz); 32295c7671fSmiod break; 32395c7671fSmiod case 1: 32495c7671fSmiod strlcpy(buf, "sett", bufsiz); 32595c7671fSmiod break; 32695c7671fSmiod case 2: 32795c7671fSmiod strlcpy(buf, "clrmac", bufsiz); 32895c7671fSmiod break; 32995c7671fSmiod case 3: 33095c7671fSmiod strlcpy(buf, "ldtlb", bufsiz); 33195c7671fSmiod break; 33295c7671fSmiod } 33395c7671fSmiod break; 33495c7671fSmiod case 1: 33595c7671fSmiod switch (md) { 33695c7671fSmiod case 0: 33795c7671fSmiod strlcpy(buf, "clrs", bufsiz); 33895c7671fSmiod break; 33995c7671fSmiod case 1: 34095c7671fSmiod strlcpy(buf, "sets", bufsiz); 34195c7671fSmiod break; 34295c7671fSmiod } 34395c7671fSmiod break; 34495c7671fSmiod } /* end of switch (type) */ 34595c7671fSmiod } 34695c7671fSmiod 34795c7671fSmiod static void 34852de38dfSmpi f_09(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 34995c7671fSmiod { 35095c7671fSmiod int rn, fx; 35195c7671fSmiod 352f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 353f0152d4fSmiod fx = (insn & 0x00f0) >> 4; 35495c7671fSmiod 35595c7671fSmiod switch (fx) { 35695c7671fSmiod case 0: 35795c7671fSmiod if (rn != 0) 35895c7671fSmiod return; 35995c7671fSmiod strlcpy(buf, "nop", bufsiz); 36095c7671fSmiod break; 36195c7671fSmiod case 1: 36295c7671fSmiod if (rn != 0) 36395c7671fSmiod return; 36495c7671fSmiod strlcpy(buf, "div0u", bufsiz); 36595c7671fSmiod break; 36695c7671fSmiod case 2: 36795c7671fSmiod snprintf(buf, bufsiz, "movt r%d", rn); 36895c7671fSmiod break; 36995c7671fSmiod } /* end of switch (fx) */ 37095c7671fSmiod } 37195c7671fSmiod 37295c7671fSmiod static void 37352de38dfSmpi f_0a(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 37495c7671fSmiod { 37595c7671fSmiod int rn, type, md; 37695c7671fSmiod 377f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 378f0152d4fSmiod type = (insn & 0x00c0) >> 6; 379f0152d4fSmiod md = (insn & 0x0030) >> 4; 38095c7671fSmiod 38195c7671fSmiod switch (type) { 38295c7671fSmiod case 0: 38395c7671fSmiod switch (md) { 38495c7671fSmiod case 0: 38595c7671fSmiod snprintf(buf, bufsiz, "sts mach, r%d", rn); 38695c7671fSmiod break; 38795c7671fSmiod case 1: 38895c7671fSmiod snprintf(buf, bufsiz, "sts macl, r%d", rn); 38995c7671fSmiod break; 39095c7671fSmiod case 2: 39195c7671fSmiod snprintf(buf, bufsiz, "sts pr, r%d", rn); 39295c7671fSmiod break; 39395c7671fSmiod } 39495c7671fSmiod break; 39595c7671fSmiod case 1: 39695c7671fSmiod switch (md) { 39795c7671fSmiod case 1: 39895c7671fSmiod snprintf(buf, bufsiz, "sts fpul, r%d", rn); 39995c7671fSmiod break; 40095c7671fSmiod case 2: 40195c7671fSmiod snprintf(buf, bufsiz, "sts fpscr, r%d", rn); 40295c7671fSmiod break; 40395c7671fSmiod } 40495c7671fSmiod break; 40595c7671fSmiod } /* end of switch (type) */ 40695c7671fSmiod } 40795c7671fSmiod 40895c7671fSmiod static void 40952de38dfSmpi f_0b(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 41095c7671fSmiod { 41195c7671fSmiod int n1, fx; 41295c7671fSmiod 413f0152d4fSmiod n1 = (insn & 0x0f00) >> 8; 41495c7671fSmiod if (n1 != 0) 41595c7671fSmiod return; 41695c7671fSmiod 417f0152d4fSmiod fx = (insn & 0x00f0) >> 4; 41895c7671fSmiod switch (fx) { 41995c7671fSmiod case 0: 42095c7671fSmiod strlcpy(buf, "rts", bufsiz); 42195c7671fSmiod break; 42295c7671fSmiod case 1: 42395c7671fSmiod strlcpy(buf, "sleep", bufsiz); 42495c7671fSmiod break; 42595c7671fSmiod case 2: 42695c7671fSmiod strlcpy(buf, "rte", bufsiz); 42795c7671fSmiod break; 42895c7671fSmiod } /* end of switch (fx) */ 42995c7671fSmiod } 43095c7671fSmiod 43195c7671fSmiod static void 43252de38dfSmpi f_0c(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 43395c7671fSmiod { 43495c7671fSmiod int rn, rm, md; 43595c7671fSmiod 436f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 437f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 438f0152d4fSmiod md = (insn & 0x0003); 43995c7671fSmiod 44095c7671fSmiod switch (md) { 44195c7671fSmiod case 0: 44295c7671fSmiod snprintf(buf, bufsiz, "mov.b @(r0, r%d), r%d", rm, rn); 44395c7671fSmiod break; 44495c7671fSmiod case 1: 44595c7671fSmiod snprintf(buf, bufsiz, "mov.w @(r0, r%d), r%d", rm, rn); 44695c7671fSmiod break; 44795c7671fSmiod case 2: 44895c7671fSmiod snprintf(buf, bufsiz, "mov.l @(r0, r%d), r%d", rm, rn); 44995c7671fSmiod break; 45095c7671fSmiod case 3: 45195c7671fSmiod snprintf(buf, bufsiz, "mac.l @r%d+, r%d+", rm, rn); 45295c7671fSmiod break; 45395c7671fSmiod } /* end of switch (md) */ 45495c7671fSmiod } 45595c7671fSmiod 45695c7671fSmiod static void 45752de38dfSmpi f_10(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 45895c7671fSmiod { 45995c7671fSmiod int rn, rm, disp; 46095c7671fSmiod 461f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 462f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 463f0152d4fSmiod disp = (insn & 0x000f); 46495c7671fSmiod disp *= 4; 46595c7671fSmiod 46695c7671fSmiod snprintf(buf, bufsiz, "mov.l r%d, @(%d, r%d)", rm, disp, rn); 46795c7671fSmiod } 46895c7671fSmiod 46995c7671fSmiod static void 47052de38dfSmpi f_20(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 47195c7671fSmiod { 47295c7671fSmiod int rn, rm, md; 47395c7671fSmiod 474f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 475f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 476f0152d4fSmiod md = (insn & 0x0003); 47795c7671fSmiod 47895c7671fSmiod switch (md) { 47995c7671fSmiod case 0: 48095c7671fSmiod snprintf(buf, bufsiz, "mov.b r%d, @r%d", rm, rn); 48195c7671fSmiod break; 48295c7671fSmiod case 1: 48395c7671fSmiod snprintf(buf, bufsiz, "mov.w r%d, @r%d", rm, rn); 48495c7671fSmiod break; 48595c7671fSmiod case 2: 48695c7671fSmiod snprintf(buf, bufsiz, "mov.l r%d, @r%d", rm, rn); 48795c7671fSmiod break; 48895c7671fSmiod } /* end of switch (md) */ 48995c7671fSmiod } 49095c7671fSmiod 49195c7671fSmiod static void 49252de38dfSmpi f_24(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 49395c7671fSmiod { 49495c7671fSmiod int rn, rm, md; 49595c7671fSmiod 496f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 497f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 498f0152d4fSmiod md = (insn & 0x0003); 49995c7671fSmiod 50095c7671fSmiod switch (md) { 50195c7671fSmiod case 0: 50295c7671fSmiod snprintf(buf, bufsiz, "mov.b r%d, @-r%d", rm, rn); 50395c7671fSmiod break; 50495c7671fSmiod case 1: 50595c7671fSmiod snprintf(buf, bufsiz, "mov.w r%d, @-r%d", rm, rn); 50695c7671fSmiod break; 50795c7671fSmiod case 2: 50895c7671fSmiod snprintf(buf, bufsiz, "mov.l r%d, @-r%d", rm, rn); 50995c7671fSmiod break; 51095c7671fSmiod case 3: 511c26cea98Smiod snprintf(buf, bufsiz, "div0s r%d, r%d", rm, rn); 51295c7671fSmiod break; 51395c7671fSmiod } /* end of switch (md) */ 51495c7671fSmiod } 51595c7671fSmiod 51695c7671fSmiod static void 51752de38dfSmpi f_28(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 51895c7671fSmiod { 51995c7671fSmiod int rn, rm, md; 52095c7671fSmiod 521f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 522f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 523f0152d4fSmiod md = (insn & 0x0003); 52495c7671fSmiod 52595c7671fSmiod switch (md) { 52695c7671fSmiod case 0: 52795c7671fSmiod snprintf(buf, bufsiz, "tst r%d, r%d", rm, rn); 52895c7671fSmiod break; 52995c7671fSmiod case 1: 53095c7671fSmiod snprintf(buf, bufsiz, "and r%d, r%d", rm, rn); 53195c7671fSmiod break; 53295c7671fSmiod case 2: 53395c7671fSmiod snprintf(buf, bufsiz, "xor r%d, r%d", rm, rn); 53495c7671fSmiod break; 53595c7671fSmiod case 3: 53695c7671fSmiod snprintf(buf, bufsiz, "or r%d, r%d", rm, rn); 53795c7671fSmiod break; 53895c7671fSmiod } /* end of switch (md) */ 53995c7671fSmiod } 54095c7671fSmiod 54195c7671fSmiod static void 54252de38dfSmpi f_2c(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 54395c7671fSmiod { 54495c7671fSmiod int rn, rm, md; 54595c7671fSmiod 546f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 547f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 548f0152d4fSmiod md = (insn & 0x0003); 54995c7671fSmiod 55095c7671fSmiod switch (md) { 55195c7671fSmiod case 0: 55295c7671fSmiod snprintf(buf, bufsiz, "cmp/str r%d, r%d", rm, rn); 55395c7671fSmiod break; 55495c7671fSmiod case 1: 55595c7671fSmiod snprintf(buf, bufsiz, "xtrct r%d, r%d", rm, rn); 55695c7671fSmiod break; 55795c7671fSmiod case 2: 55895c7671fSmiod snprintf(buf, bufsiz, "mulu.w r%d, r%d", rm, rn); 55995c7671fSmiod break; 56095c7671fSmiod case 3: 56195c7671fSmiod snprintf(buf, bufsiz, "muls.w r%d, r%d", rm, rn); 56295c7671fSmiod break; 56395c7671fSmiod } /* end of switch (md) */ 56495c7671fSmiod } 56595c7671fSmiod 56695c7671fSmiod static void 56752de38dfSmpi f_30(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 56895c7671fSmiod { 56995c7671fSmiod int rn, rm, md; 57095c7671fSmiod 571f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 572f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 573f0152d4fSmiod md = (insn & 0x0003); 57495c7671fSmiod 57595c7671fSmiod switch (md) { 57695c7671fSmiod case 0: 57795c7671fSmiod snprintf(buf, bufsiz, "cmp/eq r%d, r%d", rm, rn); 57895c7671fSmiod break; 57995c7671fSmiod case 2: 58095c7671fSmiod snprintf(buf, bufsiz, "cmp/hs r%d, r%d", rm, rn); 58195c7671fSmiod break; 58295c7671fSmiod case 3: 58395c7671fSmiod snprintf(buf, bufsiz, "cmp/ge r%d, r%d", rm, rn); 58495c7671fSmiod break; 58595c7671fSmiod } /* end of switch (md) */ 58695c7671fSmiod } 58795c7671fSmiod 58895c7671fSmiod static void 58952de38dfSmpi f_34(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 59095c7671fSmiod { 59195c7671fSmiod int rn, rm, md; 59295c7671fSmiod 593f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 594f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 595f0152d4fSmiod md = (insn & 0x0003); 59695c7671fSmiod 59795c7671fSmiod switch (md) { 59895c7671fSmiod case 0: 59995c7671fSmiod snprintf(buf, bufsiz, "div1 r%d, r%d", rm, rn); 60095c7671fSmiod break; 60195c7671fSmiod case 1: 60295c7671fSmiod snprintf(buf, bufsiz, "dmulu.l r%d, r%d", rm, rn); 60395c7671fSmiod break; 60495c7671fSmiod case 2: 60595c7671fSmiod snprintf(buf, bufsiz, "cmp/hi r%d, r%d", rm, rn); 60695c7671fSmiod break; 60795c7671fSmiod case 3: 60895c7671fSmiod snprintf(buf, bufsiz, "cmp/gt r%d, r%d", rm, rn); 60995c7671fSmiod break; 61095c7671fSmiod } /* end of switch (md) */ 61195c7671fSmiod } 61295c7671fSmiod 61395c7671fSmiod static void 61452de38dfSmpi f_38(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 61595c7671fSmiod { 61695c7671fSmiod int rn, rm, md; 61795c7671fSmiod 618f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 619f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 620f0152d4fSmiod md = (insn & 0x0003); 62195c7671fSmiod 62295c7671fSmiod switch (md) { 62395c7671fSmiod case 0: 62495c7671fSmiod snprintf(buf, bufsiz, "sub r%d, r%d", rm, rn); 62595c7671fSmiod break; 62695c7671fSmiod case 2: 62795c7671fSmiod snprintf(buf, bufsiz, "subc r%d, r%d", rm, rn); 62895c7671fSmiod break; 62995c7671fSmiod case 3: 63095c7671fSmiod snprintf(buf, bufsiz, "subv r%d, r%d", rm, rn); 63195c7671fSmiod break; 63295c7671fSmiod } /* end of switch (md) */ 63395c7671fSmiod } 63495c7671fSmiod 63595c7671fSmiod static void 63652de38dfSmpi f_3c(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 63795c7671fSmiod { 63895c7671fSmiod int rn, rm, md; 63995c7671fSmiod 640f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 641f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 642f0152d4fSmiod md = (insn & 0x0003); 64395c7671fSmiod 64495c7671fSmiod switch (md) { 64595c7671fSmiod case 0: 64695c7671fSmiod snprintf(buf, bufsiz, "add r%d, r%d", rm, rn); 64795c7671fSmiod break; 64895c7671fSmiod case 1: 64995c7671fSmiod snprintf(buf, bufsiz, "dmulu.l r%d, r%d", rm, rn); 65095c7671fSmiod break; 65195c7671fSmiod case 2: 65295c7671fSmiod snprintf(buf, bufsiz, "addc r%d, r%d", rm, rn); 65395c7671fSmiod break; 65495c7671fSmiod case 3: 65595c7671fSmiod snprintf(buf, bufsiz, "addv r%d, r%d", rm, rn); 65695c7671fSmiod break; 65795c7671fSmiod } /* end of switch (md) */ 65895c7671fSmiod } 65995c7671fSmiod 66095c7671fSmiod static void 66152de38dfSmpi f_40(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 66295c7671fSmiod { 66395c7671fSmiod int rn, fx; 66495c7671fSmiod 665f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 666f0152d4fSmiod fx = (insn & 0x00f0) >> 4; 66795c7671fSmiod 66895c7671fSmiod switch (fx) { 66995c7671fSmiod case 0: 67095c7671fSmiod snprintf(buf, bufsiz, "shll r%d", rn); 67195c7671fSmiod break; 67295c7671fSmiod case 1: 67395c7671fSmiod snprintf(buf, bufsiz, "dt r%d", rn); 67495c7671fSmiod break; 67595c7671fSmiod case 2: 67695c7671fSmiod snprintf(buf, bufsiz, "shal r%d", rn); 67795c7671fSmiod break; 67895c7671fSmiod } /* end of switch (fx) */ 67995c7671fSmiod } 68095c7671fSmiod 68195c7671fSmiod static void 68252de38dfSmpi f_41(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 68395c7671fSmiod { 68495c7671fSmiod int rn, fx; 68595c7671fSmiod 686f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 687f0152d4fSmiod fx = (insn & 0x00f0) >> 4; 68895c7671fSmiod 68995c7671fSmiod switch (fx) { 69095c7671fSmiod case 0: 69195c7671fSmiod snprintf(buf, bufsiz, "shlr r%d", rn); 69295c7671fSmiod break; 69395c7671fSmiod case 1: 69495c7671fSmiod snprintf(buf, bufsiz, "cmp/pz r%d", rn); 69595c7671fSmiod break; 69695c7671fSmiod case 2: 69795c7671fSmiod snprintf(buf, bufsiz, "shar r%d", rn); 69895c7671fSmiod break; 69995c7671fSmiod } /* end of switch (fx) */ 70095c7671fSmiod } 70195c7671fSmiod 70295c7671fSmiod static void 70352de38dfSmpi f_42(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 70495c7671fSmiod { 70595c7671fSmiod int rn, type, md; 70695c7671fSmiod 707f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 708f0152d4fSmiod type = (insn & 0x00c0) >> 6; 709f0152d4fSmiod md = (insn & 0x0030) >> 4; 71095c7671fSmiod 71195c7671fSmiod switch (type) { 71295c7671fSmiod case 0: 71395c7671fSmiod switch (md) { 71495c7671fSmiod case 0: 71595c7671fSmiod snprintf(buf, bufsiz, "sts.l mach, @-r%d", rn); 71695c7671fSmiod break; 71795c7671fSmiod case 1: 71895c7671fSmiod snprintf(buf, bufsiz, "sts.l macl, @-r%d", rn); 71995c7671fSmiod break; 72095c7671fSmiod case 2: 72195c7671fSmiod snprintf(buf, bufsiz, "sts.l pr, @-r%d", rn); 72295c7671fSmiod break; 72395c7671fSmiod } 72495c7671fSmiod break; 72595c7671fSmiod case 1: 72695c7671fSmiod switch (md) { 72795c7671fSmiod case 1: 72895c7671fSmiod snprintf(buf, bufsiz, "sts.l fpul, @-r%d", rn); 72995c7671fSmiod break; 73095c7671fSmiod case 2: 73195c7671fSmiod snprintf(buf, bufsiz, "sts.l fpscr, @-r%d", rn); 73295c7671fSmiod break; 73395c7671fSmiod } 73495c7671fSmiod break; 73595c7671fSmiod } /* end of switch (type) */ 73695c7671fSmiod } 73795c7671fSmiod 73895c7671fSmiod static void 73952de38dfSmpi f_43(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 74095c7671fSmiod { 74195c7671fSmiod int rn, type, md; 74295c7671fSmiod 743f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 744f0152d4fSmiod type = (insn & 0x00c0) >> 6; 745f0152d4fSmiod md = (insn & 0x0030) >> 4; 74695c7671fSmiod 74795c7671fSmiod switch (type) { 74895c7671fSmiod case 0: 74995c7671fSmiod switch (md) { 75095c7671fSmiod case 0: 75195c7671fSmiod snprintf(buf, bufsiz, "stc.l sr, @-r%d", rn); 75295c7671fSmiod break; 75395c7671fSmiod case 1: 75495c7671fSmiod snprintf(buf, bufsiz, "stc.l gbr, @-r%d", rn); 75595c7671fSmiod break; 75695c7671fSmiod case 2: 75795c7671fSmiod snprintf(buf, bufsiz, "stc.l vbr, @-r%d", rn); 75895c7671fSmiod break; 75995c7671fSmiod case 3: 76095c7671fSmiod snprintf(buf, bufsiz, "stc.l ssr, @-r%d", rn); 76195c7671fSmiod break; 76295c7671fSmiod } 76395c7671fSmiod break; 76495c7671fSmiod case 1: 76595c7671fSmiod switch (md) { 76695c7671fSmiod case 0: 76795c7671fSmiod snprintf(buf, bufsiz, "stc.l spc, @-r%d", rn); 76895c7671fSmiod break; 76995c7671fSmiod } 77095c7671fSmiod break; 77195c7671fSmiod case 2: 77295c7671fSmiod snprintf(buf, bufsiz, "stc.l r%d_bank, @-r%d", md, rn); 77395c7671fSmiod break; 77495c7671fSmiod case 3: 77595c7671fSmiod snprintf(buf, bufsiz, "stc.l r%d_bank, @-r%d", md + 4, rn); 77695c7671fSmiod break; 77795c7671fSmiod } /* end of switch (type) */ 77895c7671fSmiod } 77995c7671fSmiod 78095c7671fSmiod static void 78152de38dfSmpi f_44(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 78295c7671fSmiod { 78395c7671fSmiod int rn, fx; 78495c7671fSmiod 785f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 786f0152d4fSmiod fx = (insn & 0x00f0) >> 4; 78795c7671fSmiod 78895c7671fSmiod switch (fx) { 78995c7671fSmiod case 0: 79095c7671fSmiod snprintf(buf, bufsiz, "rotl r%d", rn); 79195c7671fSmiod break; 79295c7671fSmiod case 2: 79395c7671fSmiod snprintf(buf, bufsiz, "rotcl r%d", rn); 79495c7671fSmiod break; 79595c7671fSmiod } /* end of switch (fx) */ 79695c7671fSmiod } 79795c7671fSmiod 79895c7671fSmiod static void 79952de38dfSmpi f_45(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 80095c7671fSmiod { 80195c7671fSmiod int rn, fx; 80295c7671fSmiod 803f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 804f0152d4fSmiod fx = (insn & 0x00f0) >> 4; 80595c7671fSmiod 80695c7671fSmiod switch (fx) { 80795c7671fSmiod case 0: 80895c7671fSmiod snprintf(buf, bufsiz, "rotr r%d", rn); 80995c7671fSmiod break; 81095c7671fSmiod case 1: 81195c7671fSmiod snprintf(buf, bufsiz, "cmp/pl r%d", rn); 81295c7671fSmiod break; 81395c7671fSmiod case 2: 81495c7671fSmiod snprintf(buf, bufsiz, "rotcr r%d", rn); 81595c7671fSmiod break; 81695c7671fSmiod } /* end of switch (fx) */ 81795c7671fSmiod } 81895c7671fSmiod 81995c7671fSmiod static void 82052de38dfSmpi f_46(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 82195c7671fSmiod { 82295c7671fSmiod int rm, type, md; 82395c7671fSmiod 824f0152d4fSmiod rm = (insn & 0x0f00) >> 8; 825f0152d4fSmiod type = (insn & 0x00c0) >> 6; 826f0152d4fSmiod md = (insn & 0x0030) >> 4; 82795c7671fSmiod 82895c7671fSmiod switch (type) { 82995c7671fSmiod case 0: 83095c7671fSmiod switch (md) { 83195c7671fSmiod case 0: 83295c7671fSmiod snprintf(buf, bufsiz, "lds.l @r%d+, mach", rm); 83395c7671fSmiod break; 83495c7671fSmiod case 1: 83595c7671fSmiod snprintf(buf, bufsiz, "lds.l @r%d+, macl", rm); 83695c7671fSmiod break; 83795c7671fSmiod case 2: 83895c7671fSmiod snprintf(buf, bufsiz, "lds.l @r%d+, pr", rm); 83995c7671fSmiod break; 84095c7671fSmiod } 84195c7671fSmiod break; 84295c7671fSmiod case 1: 84395c7671fSmiod switch (md) { 84495c7671fSmiod case 1: 84595c7671fSmiod snprintf(buf, bufsiz, "lds.l @r%d+, fpul", rm); 84695c7671fSmiod break; 84795c7671fSmiod case 2: 84895c7671fSmiod snprintf(buf, bufsiz, "lds.l @r%d+, fpscr", rm); 84995c7671fSmiod break; 85095c7671fSmiod } 85195c7671fSmiod break; 85295c7671fSmiod } /* end of switch (type) */ 85395c7671fSmiod } 85495c7671fSmiod 85595c7671fSmiod static void 85652de38dfSmpi f_47(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 85795c7671fSmiod { 85895c7671fSmiod int rm, type, md; 85995c7671fSmiod 860f0152d4fSmiod rm = (insn & 0x0f00) >> 8; 861f0152d4fSmiod type = (insn & 0x00c0) >> 6; 862f0152d4fSmiod md = (insn & 0x0030) >> 4; 86395c7671fSmiod 86495c7671fSmiod switch (type) { 86595c7671fSmiod case 0: 86695c7671fSmiod switch (md) { 86795c7671fSmiod case 0: 86895c7671fSmiod snprintf(buf, bufsiz, "ldc.l @r%d+, sr", rm); 86995c7671fSmiod break; 87095c7671fSmiod case 1: 87195c7671fSmiod snprintf(buf, bufsiz, "ldc.l @r%d+, gbr", rm); 87295c7671fSmiod break; 87395c7671fSmiod case 2: 87495c7671fSmiod snprintf(buf, bufsiz, "ldc.l @r%d+, vbr", rm); 87595c7671fSmiod break; 87695c7671fSmiod case 3: 87795c7671fSmiod snprintf(buf, bufsiz, "ldc.l @r%d+, ssr", rm); 87895c7671fSmiod break; 87995c7671fSmiod } 88095c7671fSmiod break; 88195c7671fSmiod case 1: 88295c7671fSmiod switch (md) { 88395c7671fSmiod case 0: 88495c7671fSmiod snprintf(buf, bufsiz, "ldc.l @r%d+, spc", rm); 88595c7671fSmiod break; 88695c7671fSmiod } 88795c7671fSmiod break; 88895c7671fSmiod case 2: 88995c7671fSmiod snprintf(buf, bufsiz, "ldc.l @r%d+, r%d_bank", rm, md); 89095c7671fSmiod break; 89195c7671fSmiod case 3: 89295c7671fSmiod snprintf(buf, bufsiz, "ldc.l @r%d+, r%d_bank", rm, md + 4); 89395c7671fSmiod break; 89495c7671fSmiod } /* end of switch (type) */ 89595c7671fSmiod } 89695c7671fSmiod 89795c7671fSmiod static void 89852de38dfSmpi f_48(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 89995c7671fSmiod { 90095c7671fSmiod int rn, fx; 90195c7671fSmiod 902f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 903f0152d4fSmiod fx = (insn & 0x00f0) >> 4; 90495c7671fSmiod 90595c7671fSmiod switch (fx) { 90695c7671fSmiod case 0: 90795c7671fSmiod snprintf(buf, bufsiz, "shll2 r%d", rn); 90895c7671fSmiod break; 90995c7671fSmiod case 1: 91095c7671fSmiod snprintf(buf, bufsiz, "shll8 r%d", rn); 91195c7671fSmiod break; 91295c7671fSmiod case 2: 91395c7671fSmiod snprintf(buf, bufsiz, "shll16 r%d", rn); 91495c7671fSmiod break; 91595c7671fSmiod } /* end of switch (fx) */ 91695c7671fSmiod } 91795c7671fSmiod 91895c7671fSmiod static void 91952de38dfSmpi f_49(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 92095c7671fSmiod { 92195c7671fSmiod int rn, fx; 92295c7671fSmiod 923f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 924f0152d4fSmiod fx = (insn & 0x00f0) >> 4; 92595c7671fSmiod 92695c7671fSmiod switch (fx) { 92795c7671fSmiod case 0: 92895c7671fSmiod snprintf(buf, bufsiz, "shlr2 r%d", rn); 92995c7671fSmiod break; 93095c7671fSmiod case 1: 93195c7671fSmiod snprintf(buf, bufsiz, "shlr8 r%d", rn); 93295c7671fSmiod break; 93395c7671fSmiod case 2: 93495c7671fSmiod snprintf(buf, bufsiz, "shlr16 r%d", rn); 93595c7671fSmiod break; 93695c7671fSmiod } /* end of switch (fx) */ 93795c7671fSmiod } 93895c7671fSmiod 93995c7671fSmiod static void 94052de38dfSmpi f_4a(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 94195c7671fSmiod { 94295c7671fSmiod int rm, type, md; 94395c7671fSmiod 944f0152d4fSmiod rm = (insn & 0x0f00) >> 8; 945f0152d4fSmiod type = (insn & 0x00c0) >> 6; 946f0152d4fSmiod md = (insn & 0x0030) >> 4; 94795c7671fSmiod 94895c7671fSmiod switch (type) { 94995c7671fSmiod case 0: 95095c7671fSmiod switch (md) { 95195c7671fSmiod case 0: 95295c7671fSmiod snprintf(buf, bufsiz, "lds r%d, mach", rm); 95395c7671fSmiod break; 95495c7671fSmiod case 1: 95595c7671fSmiod snprintf(buf, bufsiz, "lds r%d, macl", rm); 95695c7671fSmiod break; 95795c7671fSmiod case 2: 95895c7671fSmiod snprintf(buf, bufsiz, "lds r%d, pr", rm); 95995c7671fSmiod break; 96095c7671fSmiod } 96195c7671fSmiod break; 96295c7671fSmiod case 1: 96395c7671fSmiod switch (md) { 96495c7671fSmiod case 1: 96595c7671fSmiod snprintf(buf, bufsiz, "lds r%d, fpul", rm); 96695c7671fSmiod break; 96795c7671fSmiod case 2: 96895c7671fSmiod snprintf(buf, bufsiz, "lds r%d, fpscr", rm); 96995c7671fSmiod break; 97095c7671fSmiod } 97195c7671fSmiod break; 97295c7671fSmiod } /* end of switch (type) */ 97395c7671fSmiod } 97495c7671fSmiod 97595c7671fSmiod static void 97652de38dfSmpi f_4b(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 97795c7671fSmiod { 97895c7671fSmiod int rm, fx; 97995c7671fSmiod 980f0152d4fSmiod rm = (insn & 0x0f00) >> 8; 981f0152d4fSmiod fx = (insn & 0x00f0) >> 4; 98295c7671fSmiod 98395c7671fSmiod switch (fx) { 98495c7671fSmiod case 0: 98595c7671fSmiod snprintf(buf, bufsiz, "jsr @r%d", rm); 98695c7671fSmiod break; 98795c7671fSmiod case 1: 98895c7671fSmiod snprintf(buf, bufsiz, "tas.b @r%d", rm); 98995c7671fSmiod break; 99095c7671fSmiod case 2: 99195c7671fSmiod snprintf(buf, bufsiz, "jmp @r%d", rm); 99295c7671fSmiod break; 99395c7671fSmiod } /* end of switch (fx) */ 99495c7671fSmiod } 99595c7671fSmiod 99695c7671fSmiod static void 99752de38dfSmpi f_4c(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 99895c7671fSmiod { 99995c7671fSmiod int rn, rm; 100095c7671fSmiod 1001f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1002f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 100395c7671fSmiod snprintf(buf, bufsiz, "shad r%d, r%d", rm, rn); 100495c7671fSmiod } 100595c7671fSmiod 100695c7671fSmiod static void 100752de38dfSmpi f_4d(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 100895c7671fSmiod { 100995c7671fSmiod int rn, rm; 101095c7671fSmiod 1011f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1012f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 101395c7671fSmiod snprintf(buf, bufsiz, "shld r%d, r%d", rm, rn); 101495c7671fSmiod } 101595c7671fSmiod 101695c7671fSmiod static void 101752de38dfSmpi f_4e(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 101895c7671fSmiod { 101995c7671fSmiod int rm, type, md; 102095c7671fSmiod 1021f0152d4fSmiod rm = (insn & 0x0f00) >> 8; 1022f0152d4fSmiod type = (insn & 0x00c0) >> 6; 1023f0152d4fSmiod md = (insn & 0x0030) >> 4; 102495c7671fSmiod 102595c7671fSmiod switch (type) { 102695c7671fSmiod case 0: 102795c7671fSmiod switch (md) { 102895c7671fSmiod case 0: 102995c7671fSmiod snprintf(buf, bufsiz, "ldc r%d, sr", rm); 103095c7671fSmiod break; 103195c7671fSmiod case 1: 103295c7671fSmiod snprintf(buf, bufsiz, "ldc r%d, gbr", rm); 103395c7671fSmiod break; 103495c7671fSmiod case 2: 103595c7671fSmiod snprintf(buf, bufsiz, "ldc r%d, vbr", rm); 103695c7671fSmiod break; 103795c7671fSmiod case 3: 103895c7671fSmiod snprintf(buf, bufsiz, "ldc r%d, ssr", rm); 103995c7671fSmiod break; 104095c7671fSmiod } 104195c7671fSmiod break; 104295c7671fSmiod case 1: 104395c7671fSmiod switch (md) { 104495c7671fSmiod case 0: 104595c7671fSmiod snprintf(buf, bufsiz, "ldc r%d, spc", rm); 104695c7671fSmiod break; 104795c7671fSmiod } 104895c7671fSmiod break; 104995c7671fSmiod case 2: 105095c7671fSmiod snprintf(buf, bufsiz, "ldc r%d, r%d_bank", rm, md); 105195c7671fSmiod break; 105295c7671fSmiod case 3: 105395c7671fSmiod snprintf(buf, bufsiz, "ldc r%d, r%d_bank", rm, md + 4); 105495c7671fSmiod break; 105595c7671fSmiod } /* end of switch (type) */ 105695c7671fSmiod } 105795c7671fSmiod 105895c7671fSmiod static void 105952de38dfSmpi f_4f(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 106095c7671fSmiod { 106195c7671fSmiod int rn, rm; 106295c7671fSmiod 1063f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1064f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 106595c7671fSmiod snprintf(buf, bufsiz, "mac.w @r%d+, @r%d+", rm, rn); 106695c7671fSmiod } 106795c7671fSmiod 106895c7671fSmiod static void 106952de38dfSmpi f_50(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 107095c7671fSmiod { 107195c7671fSmiod int rn, rm, disp; 107295c7671fSmiod 1073f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1074f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 1075f0152d4fSmiod disp = (insn & 0x000f); 107695c7671fSmiod disp *= 4; 107795c7671fSmiod 107895c7671fSmiod snprintf(buf, bufsiz, "mov.l @(%d, r%d), r%d", disp, rm, rn); 107995c7671fSmiod } 108095c7671fSmiod 108195c7671fSmiod static void 108252de38dfSmpi f_60(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 108395c7671fSmiod { 108495c7671fSmiod int rn, rm, md; 108595c7671fSmiod 1086f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1087f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 1088f0152d4fSmiod md = (insn & 0x0003); 108995c7671fSmiod 109095c7671fSmiod switch (md) { 109195c7671fSmiod case 0: 109295c7671fSmiod snprintf(buf, bufsiz, "mov.b @r%d, r%d", rm, rn); 109395c7671fSmiod break; 109495c7671fSmiod case 1: 109595c7671fSmiod snprintf(buf, bufsiz, "mov.w @r%d, r%d", rm, rn); 109695c7671fSmiod break; 109795c7671fSmiod case 2: 109895c7671fSmiod snprintf(buf, bufsiz, "mov.l @r%d, r%d", rm, rn); 109995c7671fSmiod break; 110095c7671fSmiod case 3: 110195c7671fSmiod snprintf(buf, bufsiz, "mov r%d, r%d", rm, rn); 110295c7671fSmiod break; 110395c7671fSmiod } /* end of switch (md) */ 110495c7671fSmiod } 110595c7671fSmiod 110695c7671fSmiod static void 110752de38dfSmpi f_64(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 110895c7671fSmiod { 110995c7671fSmiod int rn, rm, md; 111095c7671fSmiod 1111f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1112f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 1113f0152d4fSmiod md = (insn & 0x0003); 111495c7671fSmiod 111595c7671fSmiod switch (md) { 111695c7671fSmiod case 0: 111795c7671fSmiod snprintf(buf, bufsiz, "mov.b @r%d+, r%d", rm, rn); 111895c7671fSmiod break; 111995c7671fSmiod case 1: 112095c7671fSmiod snprintf(buf, bufsiz, "mov.w @r%d+, r%d", rm, rn); 112195c7671fSmiod break; 112295c7671fSmiod case 2: 112395c7671fSmiod snprintf(buf, bufsiz, "mov.l @r%d+, r%d", rm, rn); 112495c7671fSmiod break; 112595c7671fSmiod case 3: 112695c7671fSmiod snprintf(buf, bufsiz, "not r%d, r%d", rm, rn); 112795c7671fSmiod break; 112895c7671fSmiod } /* end of switch (md) */ 112995c7671fSmiod } 113095c7671fSmiod 113195c7671fSmiod static void 113252de38dfSmpi f_68(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 113395c7671fSmiod { 113495c7671fSmiod int rn, rm, md; 113595c7671fSmiod 1136f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1137f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 1138f0152d4fSmiod md = (insn & 0x0003); 113995c7671fSmiod 114095c7671fSmiod switch (md) { 114195c7671fSmiod case 0: 114295c7671fSmiod snprintf(buf, bufsiz, "swap.b r%d, r%d", rm, rn); 114395c7671fSmiod break; 114495c7671fSmiod case 1: 114595c7671fSmiod snprintf(buf, bufsiz, "swap.w r%d, r%d", rm, rn); 114695c7671fSmiod break; 114795c7671fSmiod case 2: 114895c7671fSmiod snprintf(buf, bufsiz, "negc r%d, r%d", rm, rn); 114995c7671fSmiod break; 115095c7671fSmiod case 3: 115195c7671fSmiod snprintf(buf, bufsiz, "neg r%d, r%d", rm, rn); 115295c7671fSmiod break; 115395c7671fSmiod } /* end of switch (md) */ 115495c7671fSmiod } 115595c7671fSmiod 115695c7671fSmiod static void 115752de38dfSmpi f_6c(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 115895c7671fSmiod { 115995c7671fSmiod int rn, rm, md; 116095c7671fSmiod 1161f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1162f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 1163f0152d4fSmiod md = (insn & 0x0003); 116495c7671fSmiod 116595c7671fSmiod switch (md) { 116695c7671fSmiod case 0: 116795c7671fSmiod snprintf(buf, bufsiz, "extu.b r%d, r%d", rm, rn); 116895c7671fSmiod break; 116995c7671fSmiod case 1: 117095c7671fSmiod snprintf(buf, bufsiz, "extu.w r%d, r%d", rm, rn); 117195c7671fSmiod break; 117295c7671fSmiod case 2: 117395c7671fSmiod snprintf(buf, bufsiz, "exts.b r%d, r%d", rm, rn); 117495c7671fSmiod break; 117595c7671fSmiod case 3: 117695c7671fSmiod snprintf(buf, bufsiz, "exts.w r%d, r%d", rm, rn); 117795c7671fSmiod break; 117895c7671fSmiod } /* end of switch (md) */ 117995c7671fSmiod } 118095c7671fSmiod 118195c7671fSmiod static void 118252de38dfSmpi f_70(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 118395c7671fSmiod { 118495c7671fSmiod int rn, imm; 118595c7671fSmiod 1186f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1187f0152d4fSmiod imm = (int) ((char) (insn & 0x00ff)); 118895c7671fSmiod 118995c7671fSmiod snprintf(buf, bufsiz, "add #0x%x, r%d", imm, rn); 119095c7671fSmiod } 119195c7671fSmiod 119295c7671fSmiod static void 119352de38dfSmpi f_80(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 119495c7671fSmiod { 119595c7671fSmiod int type, md, rn, disp; 119695c7671fSmiod 1197f0152d4fSmiod type = (insn & 0x0c00) >> 10; 1198f0152d4fSmiod md = (insn & 0x0300) >> 8; 119995c7671fSmiod 120095c7671fSmiod switch (type) { 120195c7671fSmiod case 0: 1202f0152d4fSmiod rn = (insn & 0x00f0) >> 4; 1203f0152d4fSmiod disp = (insn & 0x000f); 120495c7671fSmiod 120595c7671fSmiod switch (md) { 120695c7671fSmiod case 0: 120795c7671fSmiod snprintf(buf, bufsiz, "mov.b r0, @(%d, r%d)", 120895c7671fSmiod disp, rn); 120995c7671fSmiod break; 121095c7671fSmiod case 1: 121195c7671fSmiod disp *= 2; 121295c7671fSmiod snprintf(buf, bufsiz, "mov.w r0, @(%d, r%d)", 121395c7671fSmiod disp, rn); 121495c7671fSmiod break; 121595c7671fSmiod } 121695c7671fSmiod break; 121795c7671fSmiod case 1: 1218f0152d4fSmiod rn = (insn & 0x00f0) >> 4; 1219f0152d4fSmiod disp = (insn & 0x000f); 122095c7671fSmiod 122195c7671fSmiod switch (md) { 122295c7671fSmiod case 0: 122395c7671fSmiod snprintf(buf, bufsiz, "mov.b @(%d, r%d), r0", 122495c7671fSmiod disp, rn); 122595c7671fSmiod break; 122695c7671fSmiod case 1: 122795c7671fSmiod disp *= 2; 122895c7671fSmiod snprintf(buf, bufsiz, "mov.w @(%d, r%d), r0", 122995c7671fSmiod disp, rn); 123095c7671fSmiod break; 123195c7671fSmiod } 123295c7671fSmiod break; 123395c7671fSmiod case 2: 1234f0152d4fSmiod disp = (insn & 0x00ff); 123595c7671fSmiod 123695c7671fSmiod switch (md) { 123795c7671fSmiod case 0: 123895c7671fSmiod snprintf(buf, bufsiz, "cmp/eq #%d, r0", disp); 123995c7671fSmiod break; 124095c7671fSmiod case 1: 124195c7671fSmiod disp = (int) ((char) disp); 124295c7671fSmiod disp *= 2; 1243f0152d4fSmiod disasm_branch(buf, bufsiz, "bt", loc + 4 + disp); 124495c7671fSmiod break; 124595c7671fSmiod case 3: 124695c7671fSmiod disp = (int) ((char) disp); 124795c7671fSmiod disp *= 2; 1248f0152d4fSmiod disasm_branch(buf, bufsiz, "bf", loc + 4 + disp); 124995c7671fSmiod break; 125095c7671fSmiod } 125195c7671fSmiod break; 125295c7671fSmiod case 3: 1253f0152d4fSmiod disp = (int) ((char) (insn & 0x00ff)); 125495c7671fSmiod disp *= 2; 125595c7671fSmiod 125695c7671fSmiod switch (md) { 125795c7671fSmiod case 1: 1258f0152d4fSmiod disasm_branch(buf, bufsiz, "bt/s", loc + 4 + disp); 125995c7671fSmiod break; 126095c7671fSmiod case 3: 1261f0152d4fSmiod disasm_branch(buf, bufsiz, "bf/s", loc + 4 + disp); 126295c7671fSmiod break; 126395c7671fSmiod } 126495c7671fSmiod break; 126595c7671fSmiod } /* end of switch (type) */ 126695c7671fSmiod } 126795c7671fSmiod 126895c7671fSmiod static void 126952de38dfSmpi f_90(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 127095c7671fSmiod { 127195c7671fSmiod int rn, disp; 127295c7671fSmiod 1273f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1274f0152d4fSmiod disp = (insn & 0x00ff); 127595c7671fSmiod disp *= 2; 127695c7671fSmiod 127795c7671fSmiod snprintf(buf, bufsiz, "mov.w @(%d, pc), r%d", disp, rn); 127895c7671fSmiod } 127995c7671fSmiod 128095c7671fSmiod static void 128152de38dfSmpi f_a0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 128295c7671fSmiod { 128395c7671fSmiod int disp; 128495c7671fSmiod 1285f0152d4fSmiod disp = (insn & 0x0fff); 128695c7671fSmiod if (disp & 0x0800) /* negative displacement? */ 128795c7671fSmiod disp |= 0xfffff000; /* sign extend */ 128895c7671fSmiod disp *= 2; 128995c7671fSmiod 1290f0152d4fSmiod disasm_branch(buf, bufsiz, "bra", loc + 4 + disp); 129195c7671fSmiod } 129295c7671fSmiod 129395c7671fSmiod static void 129452de38dfSmpi f_b0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 129595c7671fSmiod { 129695c7671fSmiod int disp; 129795c7671fSmiod 1298f0152d4fSmiod disp = (insn & 0x0fff); 129995c7671fSmiod if (disp & 0x0800) /* negative displacement? */ 130095c7671fSmiod disp |= 0xfffff000; /* sign extend */ 130195c7671fSmiod disp *= 2; 130295c7671fSmiod 1303f0152d4fSmiod disasm_branch(buf, bufsiz, "bsr", loc + 4 + disp); 130495c7671fSmiod } 130595c7671fSmiod 130695c7671fSmiod static void 130752de38dfSmpi f_c0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 130895c7671fSmiod { 130995c7671fSmiod int type, md, imm; 131095c7671fSmiod 1311f0152d4fSmiod type = (insn & 0x0c00) >> 10; 1312f0152d4fSmiod md = (insn & 0x0300) >> 8; 1313f0152d4fSmiod imm = (insn & 0x00ff); 131495c7671fSmiod 131595c7671fSmiod switch (type) { 131695c7671fSmiod case 0: 131795c7671fSmiod switch (md) { 131895c7671fSmiod case 0: 131995c7671fSmiod snprintf(buf, bufsiz, "mov.b r0, @(%d, gbr)", imm); 132095c7671fSmiod break; 132195c7671fSmiod case 1: 132295c7671fSmiod imm *= 2; 132395c7671fSmiod snprintf(buf, bufsiz, "mov.w r0, @(%d, gbr)", imm); 132495c7671fSmiod break; 132595c7671fSmiod case 2: 132695c7671fSmiod imm *= 4; 132795c7671fSmiod snprintf(buf, bufsiz, "mov.l r0, @(%d, gbr)", imm); 132895c7671fSmiod break; 132995c7671fSmiod case 3: 133095c7671fSmiod snprintf(buf, bufsiz, "trapa #%d", imm); 133195c7671fSmiod break; 133295c7671fSmiod } 133395c7671fSmiod break; 133495c7671fSmiod case 1: 133595c7671fSmiod switch (md) { 133695c7671fSmiod case 0: 133795c7671fSmiod snprintf(buf, bufsiz, "mov.b @(%d, gbr), r0", imm); 133895c7671fSmiod break; 133995c7671fSmiod case 1: 134095c7671fSmiod imm *= 2; 134195c7671fSmiod snprintf(buf, bufsiz, "mov.w @(%d, gbr), r0", imm); 134295c7671fSmiod break; 134395c7671fSmiod case 2: 134495c7671fSmiod imm *= 4; 134595c7671fSmiod snprintf(buf, bufsiz, "mov.l @(%d, gbr), r0", imm); 134695c7671fSmiod break; 134795c7671fSmiod case 3: 134895c7671fSmiod imm *= 4; 134995c7671fSmiod snprintf(buf, bufsiz, "mova @(%d, pc), r0", imm); 135095c7671fSmiod break; 135195c7671fSmiod } 135295c7671fSmiod break; 135395c7671fSmiod case 2: 135495c7671fSmiod switch (md) { 135595c7671fSmiod case 0: 135695c7671fSmiod snprintf(buf, bufsiz, "tst #%d, r0", imm); 135795c7671fSmiod break; 135895c7671fSmiod case 1: 135995c7671fSmiod snprintf(buf, bufsiz, "and #%d, r0", imm); 136095c7671fSmiod break; 136195c7671fSmiod case 2: 136295c7671fSmiod snprintf(buf, bufsiz, "xor #%d, r0", imm); 136395c7671fSmiod break; 136495c7671fSmiod case 3: 136595c7671fSmiod snprintf(buf, bufsiz, "or #%d, r0", imm); 136695c7671fSmiod break; 136795c7671fSmiod } 136895c7671fSmiod break; 136995c7671fSmiod case 3: 137095c7671fSmiod switch (md) { 137195c7671fSmiod case 0: 137295c7671fSmiod snprintf(buf, bufsiz, "tst.b #%d, @(r0, gbr)", imm); 137395c7671fSmiod break; 137495c7671fSmiod case 1: 137595c7671fSmiod snprintf(buf, bufsiz, "and.b #%d, @(r0, gbr)", imm); 137695c7671fSmiod break; 137795c7671fSmiod case 2: 137895c7671fSmiod snprintf(buf, bufsiz, "xor.b #%d, @(r0, gbr)", imm); 137995c7671fSmiod break; 138095c7671fSmiod case 3: 138195c7671fSmiod snprintf(buf, bufsiz, "or.b #%d, @(r0, gbr)", imm); 138295c7671fSmiod break; 138395c7671fSmiod } 138495c7671fSmiod break; 138595c7671fSmiod } /* end of switch (type) */ 138695c7671fSmiod } 138795c7671fSmiod 138895c7671fSmiod static void 138952de38dfSmpi f_d0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 139095c7671fSmiod { 139195c7671fSmiod int rn, disp; 139295c7671fSmiod 1393f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1394f0152d4fSmiod disp = (insn & 0x00ff); 139595c7671fSmiod disp *= 4; 139695c7671fSmiod 139795c7671fSmiod snprintf(buf, bufsiz, "mov.l @(%d, pc), r%d", disp, rn); 139895c7671fSmiod } 139995c7671fSmiod 140095c7671fSmiod static void 140152de38dfSmpi f_e0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 140295c7671fSmiod { 140395c7671fSmiod int rn, imm; 140495c7671fSmiod 1405f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1406f0152d4fSmiod imm = (int) ((char) (insn & 0x00ff)); 140795c7671fSmiod 140895c7671fSmiod snprintf(buf, bufsiz, "mov #0x%x, r%d", imm, rn); 140995c7671fSmiod } 141095c7671fSmiod 141195c7671fSmiod static void 141252de38dfSmpi f_f0(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 141395c7671fSmiod { 141495c7671fSmiod int rn, rm, md; 141595c7671fSmiod 1416f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1417f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 1418f0152d4fSmiod md = (insn & 0x0003); 141995c7671fSmiod 142095c7671fSmiod switch (md) { 142195c7671fSmiod case 0: 142295c7671fSmiod snprintf(buf, bufsiz, "fadd fr%d, fr%d", rm, rn); 142395c7671fSmiod break; 142495c7671fSmiod case 1: 142595c7671fSmiod snprintf(buf, bufsiz, "fsub fr%d, fr%d", rm, rn); 142695c7671fSmiod break; 142795c7671fSmiod case 2: 142895c7671fSmiod snprintf(buf, bufsiz, "fmul fr%d, fr%d", rm, rn); 142995c7671fSmiod break; 143095c7671fSmiod case 3: 143195c7671fSmiod snprintf(buf, bufsiz, "fdiv fr%d, fr%d", rm, rn); 143295c7671fSmiod break; 143395c7671fSmiod } /* end of switch (md) */ 143495c7671fSmiod } 143595c7671fSmiod 143695c7671fSmiod static void 143752de38dfSmpi f_f4(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 143895c7671fSmiod { 143995c7671fSmiod int rn, rm, md; 144095c7671fSmiod 1441f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1442f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 1443f0152d4fSmiod md = (insn & 0x0003); 144495c7671fSmiod 144595c7671fSmiod switch (md) { 144695c7671fSmiod case 0: 144795c7671fSmiod snprintf(buf, bufsiz, "fcmp/eq fr%d, fr%d", rm, rn); 144895c7671fSmiod break; 144995c7671fSmiod case 1: 145095c7671fSmiod snprintf(buf, bufsiz, "fcmp/gt fr%d, fr%d", rm, rn); 145195c7671fSmiod break; 145295c7671fSmiod case 2: 145395c7671fSmiod snprintf(buf, bufsiz, "fmov.s @(r0, r%d), fr%d", rm, rn); 145495c7671fSmiod break; 145595c7671fSmiod case 3: 145695c7671fSmiod snprintf(buf, bufsiz, "fmov.s fr%d, @(r0, r%d)", rm, rn); 145795c7671fSmiod break; 145895c7671fSmiod } /* end of switch (md) */ 145995c7671fSmiod } 146095c7671fSmiod 146195c7671fSmiod static void 146252de38dfSmpi f_f8(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 146395c7671fSmiod { 146495c7671fSmiod int rn, rm, md; 146595c7671fSmiod 1466f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1467f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 1468f0152d4fSmiod md = (insn & 0x0003); 146995c7671fSmiod 147095c7671fSmiod switch (md) { 147195c7671fSmiod case 0: 147295c7671fSmiod snprintf(buf, bufsiz, "fmov.s @r%d, fr%d", rm, rn); 147395c7671fSmiod break; 147495c7671fSmiod case 1: 147595c7671fSmiod snprintf(buf, bufsiz, "fmov.s @r%d+, fr%d", rm, rn); 147695c7671fSmiod break; 147795c7671fSmiod case 2: 147895c7671fSmiod snprintf(buf, bufsiz, "fmov.s fr%d, @r%d", rm, rn); 147995c7671fSmiod break; 148095c7671fSmiod case 3: 148195c7671fSmiod snprintf(buf, bufsiz, "fmov.s fr%d, @-r%d", rm, rn); 148295c7671fSmiod break; 148395c7671fSmiod } /* end of switch (md) */ 148495c7671fSmiod } 148595c7671fSmiod 148695c7671fSmiod static void 148752de38dfSmpi f_fc(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 148895c7671fSmiod { 148995c7671fSmiod int rn, rm; 149095c7671fSmiod 1491f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1492f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 149395c7671fSmiod 149495c7671fSmiod snprintf(buf, bufsiz, "fmov fr%d, fr%d", rm, rn); 149595c7671fSmiod } 149695c7671fSmiod 149795c7671fSmiod static void 149852de38dfSmpi f_fd(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 149995c7671fSmiod { 150095c7671fSmiod int rn, type, md; 150195c7671fSmiod 1502f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1503f0152d4fSmiod type = (insn & 0x00c0) >> 6; 1504f0152d4fSmiod md = (insn & 0x0030) >> 4; 150595c7671fSmiod 150695c7671fSmiod switch (type) { 150795c7671fSmiod case 0: 150895c7671fSmiod switch (md) { 150995c7671fSmiod case 0: 151095c7671fSmiod snprintf(buf, bufsiz, "fsts fpul, fr%d", rn); 151195c7671fSmiod break; 151295c7671fSmiod case 1: 151395c7671fSmiod snprintf(buf, bufsiz, "flds fr%d, fpul", rn); 151495c7671fSmiod break; 151595c7671fSmiod case 2: 151695c7671fSmiod snprintf(buf, bufsiz, "float fpul, fr%d", rn); 151795c7671fSmiod break; 151895c7671fSmiod case 3: 151995c7671fSmiod snprintf(buf, bufsiz, "ftrc fr%d, fpul", rn); 152095c7671fSmiod break; 152195c7671fSmiod } 152295c7671fSmiod break; 152395c7671fSmiod case 1: 152495c7671fSmiod switch (md) { 152595c7671fSmiod case 0: 152695c7671fSmiod snprintf(buf, bufsiz, "fneg fr%d", rn); 152795c7671fSmiod break; 152895c7671fSmiod case 1: 152995c7671fSmiod snprintf(buf, bufsiz, "fabs fr%d", rn); 153095c7671fSmiod break; 153195c7671fSmiod case 2: 153295c7671fSmiod snprintf(buf, bufsiz, "fsqrt fr%d", rn); 153395c7671fSmiod break; 153495c7671fSmiod } 153595c7671fSmiod break; 153695c7671fSmiod case 2: 153795c7671fSmiod switch (md) { 153895c7671fSmiod case 0: 153995c7671fSmiod case 1: 154095c7671fSmiod snprintf(buf, bufsiz, "fldi%d fr%d", md, rn); 154195c7671fSmiod break; 154295c7671fSmiod } 154395c7671fSmiod break; 154495c7671fSmiod } /* end of switch (type) */ 154595c7671fSmiod } 154695c7671fSmiod 154795c7671fSmiod static void 154852de38dfSmpi f_fe(vaddr_t loc, u_int insn, char *buf, size_t bufsiz) 154995c7671fSmiod { 155095c7671fSmiod int rn, rm; 155195c7671fSmiod 1552f0152d4fSmiod rn = (insn & 0x0f00) >> 8; 1553f0152d4fSmiod rm = (insn & 0x00f0) >> 4; 155495c7671fSmiod 155595c7671fSmiod snprintf(buf, bufsiz, "fmac fr0, fr%d, fr%d", rm, rn); 155695c7671fSmiod } 1557