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