14aea3d0cSYoshinori Sato /* 24aea3d0cSYoshinori Sato * Renesas RX Disassembler 34aea3d0cSYoshinori Sato * 44aea3d0cSYoshinori Sato * Copyright (c) 2019 Yoshinori Sato <ysato@users.sourceforge.jp> 54aea3d0cSYoshinori Sato * 64aea3d0cSYoshinori Sato * This program is free software; you can redistribute it and/or modify it 74aea3d0cSYoshinori Sato * under the terms and conditions of the GNU General Public License, 84aea3d0cSYoshinori Sato * version 2 or later, as published by the Free Software Foundation. 94aea3d0cSYoshinori Sato * 104aea3d0cSYoshinori Sato * This program is distributed in the hope it will be useful, but WITHOUT 114aea3d0cSYoshinori Sato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 124aea3d0cSYoshinori Sato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 134aea3d0cSYoshinori Sato * more details. 144aea3d0cSYoshinori Sato * 154aea3d0cSYoshinori Sato * You should have received a copy of the GNU General Public License along with 164aea3d0cSYoshinori Sato * this program. If not, see <http://www.gnu.org/licenses/>. 174aea3d0cSYoshinori Sato */ 184aea3d0cSYoshinori Sato 194aea3d0cSYoshinori Sato #include "qemu/osdep.h" 204aea3d0cSYoshinori Sato #include "disas/dis-asm.h" 214aea3d0cSYoshinori Sato #include "qemu/bitops.h" 224aea3d0cSYoshinori Sato #include "cpu.h" 234aea3d0cSYoshinori Sato 244aea3d0cSYoshinori Sato typedef struct DisasContext { 254aea3d0cSYoshinori Sato disassemble_info *dis; 264aea3d0cSYoshinori Sato uint32_t addr; 274aea3d0cSYoshinori Sato uint32_t pc; 284aea3d0cSYoshinori Sato } DisasContext; 294aea3d0cSYoshinori Sato 304aea3d0cSYoshinori Sato 314aea3d0cSYoshinori Sato static uint32_t decode_load_bytes(DisasContext *ctx, uint32_t insn, 324aea3d0cSYoshinori Sato int i, int n) 334aea3d0cSYoshinori Sato { 344aea3d0cSYoshinori Sato bfd_byte buf; 354aea3d0cSYoshinori Sato while (++i <= n) { 364aea3d0cSYoshinori Sato ctx->dis->read_memory_func(ctx->addr++, &buf, 1, ctx->dis); 374aea3d0cSYoshinori Sato insn |= buf << (32 - i * 8); 384aea3d0cSYoshinori Sato } 394aea3d0cSYoshinori Sato return insn; 404aea3d0cSYoshinori Sato } 414aea3d0cSYoshinori Sato 424aea3d0cSYoshinori Sato static int32_t li(DisasContext *ctx, int sz) 434aea3d0cSYoshinori Sato { 444aea3d0cSYoshinori Sato int32_t addr; 454aea3d0cSYoshinori Sato bfd_byte buf[4]; 464aea3d0cSYoshinori Sato addr = ctx->addr; 474aea3d0cSYoshinori Sato 484aea3d0cSYoshinori Sato switch (sz) { 494aea3d0cSYoshinori Sato case 1: 504aea3d0cSYoshinori Sato ctx->addr += 1; 514aea3d0cSYoshinori Sato ctx->dis->read_memory_func(addr, buf, 1, ctx->dis); 524aea3d0cSYoshinori Sato return (int8_t)buf[0]; 534aea3d0cSYoshinori Sato case 2: 544aea3d0cSYoshinori Sato ctx->addr += 2; 554aea3d0cSYoshinori Sato ctx->dis->read_memory_func(addr, buf, 2, ctx->dis); 564aea3d0cSYoshinori Sato return ldsw_le_p(buf); 574aea3d0cSYoshinori Sato case 3: 584aea3d0cSYoshinori Sato ctx->addr += 3; 594aea3d0cSYoshinori Sato ctx->dis->read_memory_func(addr, buf, 3, ctx->dis); 604aea3d0cSYoshinori Sato return (int8_t)buf[2] << 16 | lduw_le_p(buf); 614aea3d0cSYoshinori Sato case 0: 624aea3d0cSYoshinori Sato ctx->addr += 4; 634aea3d0cSYoshinori Sato ctx->dis->read_memory_func(addr, buf, 4, ctx->dis); 644aea3d0cSYoshinori Sato return ldl_le_p(buf); 654aea3d0cSYoshinori Sato default: 664aea3d0cSYoshinori Sato g_assert_not_reached(); 674aea3d0cSYoshinori Sato } 684aea3d0cSYoshinori Sato } 694aea3d0cSYoshinori Sato 704aea3d0cSYoshinori Sato static int bdsp_s(DisasContext *ctx, int d) 714aea3d0cSYoshinori Sato { 724aea3d0cSYoshinori Sato /* 734aea3d0cSYoshinori Sato * 0 -> 8 744aea3d0cSYoshinori Sato * 1 -> 9 754aea3d0cSYoshinori Sato * 2 -> 10 764aea3d0cSYoshinori Sato * 3 -> 3 774aea3d0cSYoshinori Sato * : 784aea3d0cSYoshinori Sato * 7 -> 7 794aea3d0cSYoshinori Sato */ 804aea3d0cSYoshinori Sato if (d < 3) { 814aea3d0cSYoshinori Sato d += 8; 824aea3d0cSYoshinori Sato } 834aea3d0cSYoshinori Sato return d; 844aea3d0cSYoshinori Sato } 854aea3d0cSYoshinori Sato 864aea3d0cSYoshinori Sato /* Include the auto-generated decoder. */ 874aea3d0cSYoshinori Sato #include "decode.inc.c" 884aea3d0cSYoshinori Sato 894aea3d0cSYoshinori Sato #define prt(...) (ctx->dis->fprintf_func)((ctx->dis->stream), __VA_ARGS__) 904aea3d0cSYoshinori Sato 914aea3d0cSYoshinori Sato #define RX_MEMORY_BYTE 0 924aea3d0cSYoshinori Sato #define RX_MEMORY_WORD 1 934aea3d0cSYoshinori Sato #define RX_MEMORY_LONG 2 944aea3d0cSYoshinori Sato 954aea3d0cSYoshinori Sato #define RX_IM_BYTE 0 964aea3d0cSYoshinori Sato #define RX_IM_WORD 1 974aea3d0cSYoshinori Sato #define RX_IM_LONG 2 984aea3d0cSYoshinori Sato #define RX_IM_UWORD 3 994aea3d0cSYoshinori Sato 1004aea3d0cSYoshinori Sato static const char size[] = {'b', 'w', 'l'}; 1014aea3d0cSYoshinori Sato static const char cond[][4] = { 1024aea3d0cSYoshinori Sato "eq", "ne", "c", "nc", "gtu", "leu", "pz", "n", 1034aea3d0cSYoshinori Sato "ge", "lt", "gt", "le", "o", "no", "ra", "f" 1044aea3d0cSYoshinori Sato }; 1054aea3d0cSYoshinori Sato static const char psw[] = { 1064aea3d0cSYoshinori Sato 'c', 'z', 's', 'o', 0, 0, 0, 0, 1074aea3d0cSYoshinori Sato 'i', 'u', 0, 0, 0, 0, 0, 0, 1084aea3d0cSYoshinori Sato }; 1094aea3d0cSYoshinori Sato 110fa6289e2SRichard Henderson static void rx_index_addr(DisasContext *ctx, char out[8], int ld, int mi) 1114aea3d0cSYoshinori Sato { 112fa6289e2SRichard Henderson uint32_t addr = ctx->addr; 113fa6289e2SRichard Henderson uint8_t buf[2]; 114fa6289e2SRichard Henderson uint16_t dsp; 115fa6289e2SRichard Henderson 1164aea3d0cSYoshinori Sato switch (ld) { 1174aea3d0cSYoshinori Sato case 0: 118fa6289e2SRichard Henderson /* No index; return empty string. */ 119fa6289e2SRichard Henderson out[0] = '\0'; 120fa6289e2SRichard Henderson return; 1214aea3d0cSYoshinori Sato case 1: 1224aea3d0cSYoshinori Sato ctx->addr += 1; 123fa6289e2SRichard Henderson ctx->dis->read_memory_func(addr, buf, 1, ctx->dis); 124fa6289e2SRichard Henderson dsp = buf[0]; 125fa6289e2SRichard Henderson break; 1264aea3d0cSYoshinori Sato case 2: 1274aea3d0cSYoshinori Sato ctx->addr += 2; 128fa6289e2SRichard Henderson ctx->dis->read_memory_func(addr, buf, 2, ctx->dis); 129fa6289e2SRichard Henderson dsp = lduw_le_p(buf); 130fa6289e2SRichard Henderson break; 131fa6289e2SRichard Henderson default: 1324aea3d0cSYoshinori Sato g_assert_not_reached(); 1334aea3d0cSYoshinori Sato } 1344aea3d0cSYoshinori Sato 135fa6289e2SRichard Henderson sprintf(out, "%u", dsp << (mi < 3 ? mi : 4 - mi)); 136fa6289e2SRichard Henderson } 137fa6289e2SRichard Henderson 138e283adeaSRichard Henderson static void prt_ldmi(DisasContext *ctx, const char *insn, 139e283adeaSRichard Henderson int ld, int mi, int rs, int rd) 1404aea3d0cSYoshinori Sato { 1414aea3d0cSYoshinori Sato static const char sizes[][4] = {".b", ".w", ".l", ".uw", ".ub"}; 142fa6289e2SRichard Henderson char dsp[8]; 143fa6289e2SRichard Henderson 1444aea3d0cSYoshinori Sato if (ld < 3) { 145fa6289e2SRichard Henderson rx_index_addr(ctx, dsp, ld, mi); 146e283adeaSRichard Henderson prt("%s\t%s[r%d]%s, r%d", insn, dsp, rs, sizes[mi], rd); 1474aea3d0cSYoshinori Sato } else { 148e283adeaSRichard Henderson prt("%s\tr%d, r%d", insn, rs, rd); 1494aea3d0cSYoshinori Sato } 1504aea3d0cSYoshinori Sato } 1514aea3d0cSYoshinori Sato 1524aea3d0cSYoshinori Sato static void prt_ir(DisasContext *ctx, const char *insn, int imm, int rd) 1534aea3d0cSYoshinori Sato { 1544aea3d0cSYoshinori Sato if (imm < 0x100) { 1554aea3d0cSYoshinori Sato prt("%s\t#%d, r%d", insn, imm, rd); 1564aea3d0cSYoshinori Sato } else { 1574aea3d0cSYoshinori Sato prt("%s\t#0x%08x, r%d", insn, imm, rd); 1584aea3d0cSYoshinori Sato } 1594aea3d0cSYoshinori Sato } 1604aea3d0cSYoshinori Sato 1614aea3d0cSYoshinori Sato /* mov.[bwl] rs,dsp:[rd] */ 1624aea3d0cSYoshinori Sato static bool trans_MOV_rm(DisasContext *ctx, arg_MOV_rm *a) 1634aea3d0cSYoshinori Sato { 1644aea3d0cSYoshinori Sato if (a->dsp > 0) { 1654aea3d0cSYoshinori Sato prt("mov.%c\tr%d,%d[r%d]", 1664aea3d0cSYoshinori Sato size[a->sz], a->rs, a->dsp << a->sz, a->rd); 1674aea3d0cSYoshinori Sato } else { 1684aea3d0cSYoshinori Sato prt("mov.%c\tr%d,[r%d]", 1694aea3d0cSYoshinori Sato size[a->sz], a->rs, a->rd); 1704aea3d0cSYoshinori Sato } 1714aea3d0cSYoshinori Sato return true; 1724aea3d0cSYoshinori Sato } 1734aea3d0cSYoshinori Sato 1744aea3d0cSYoshinori Sato /* mov.[bwl] dsp:[rs],rd */ 1754aea3d0cSYoshinori Sato static bool trans_MOV_mr(DisasContext *ctx, arg_MOV_mr *a) 1764aea3d0cSYoshinori Sato { 1774aea3d0cSYoshinori Sato if (a->dsp > 0) { 1784aea3d0cSYoshinori Sato prt("mov.%c\t%d[r%d], r%d", 1794aea3d0cSYoshinori Sato size[a->sz], a->dsp << a->sz, a->rs, a->rd); 1804aea3d0cSYoshinori Sato } else { 1814aea3d0cSYoshinori Sato prt("mov.%c\t[r%d], r%d", 1824aea3d0cSYoshinori Sato size[a->sz], a->rs, a->rd); 1834aea3d0cSYoshinori Sato } 1844aea3d0cSYoshinori Sato return true; 1854aea3d0cSYoshinori Sato } 1864aea3d0cSYoshinori Sato 1874aea3d0cSYoshinori Sato /* mov.l #uimm4,rd */ 1884aea3d0cSYoshinori Sato /* mov.l #uimm8,rd */ 1894aea3d0cSYoshinori Sato /* mov.l #imm,rd */ 1904aea3d0cSYoshinori Sato static bool trans_MOV_ir(DisasContext *ctx, arg_MOV_ir *a) 1914aea3d0cSYoshinori Sato { 1924aea3d0cSYoshinori Sato prt_ir(ctx, "mov.l", a->imm, a->rd); 1934aea3d0cSYoshinori Sato return true; 1944aea3d0cSYoshinori Sato } 1954aea3d0cSYoshinori Sato 1964aea3d0cSYoshinori Sato /* mov.[bwl] #uimm8,dsp:[rd] */ 1974aea3d0cSYoshinori Sato /* mov #imm, dsp:[rd] */ 1984aea3d0cSYoshinori Sato static bool trans_MOV_im(DisasContext *ctx, arg_MOV_im *a) 1994aea3d0cSYoshinori Sato { 2004aea3d0cSYoshinori Sato if (a->dsp > 0) { 2014aea3d0cSYoshinori Sato prt("mov.%c\t#%d,%d[r%d]", 2024aea3d0cSYoshinori Sato size[a->sz], a->imm, a->dsp << a->sz, a->rd); 2034aea3d0cSYoshinori Sato } else { 2044aea3d0cSYoshinori Sato prt("mov.%c\t#%d,[r%d]", 2054aea3d0cSYoshinori Sato size[a->sz], a->imm, a->rd); 2064aea3d0cSYoshinori Sato } 2074aea3d0cSYoshinori Sato return true; 2084aea3d0cSYoshinori Sato } 2094aea3d0cSYoshinori Sato 2104aea3d0cSYoshinori Sato /* mov.[bwl] [ri,rb],rd */ 2114aea3d0cSYoshinori Sato static bool trans_MOV_ar(DisasContext *ctx, arg_MOV_ar *a) 2124aea3d0cSYoshinori Sato { 2134aea3d0cSYoshinori Sato prt("mov.%c\t[r%d,r%d], r%d", size[a->sz], a->ri, a->rb, a->rd); 2144aea3d0cSYoshinori Sato return true; 2154aea3d0cSYoshinori Sato } 2164aea3d0cSYoshinori Sato 2174aea3d0cSYoshinori Sato /* mov.[bwl] rd,[ri,rb] */ 2184aea3d0cSYoshinori Sato static bool trans_MOV_ra(DisasContext *ctx, arg_MOV_ra *a) 2194aea3d0cSYoshinori Sato { 2204aea3d0cSYoshinori Sato prt("mov.%c\tr%d, [r%d, r%d]", size[a->sz], a->rs, a->ri, a->rb); 2214aea3d0cSYoshinori Sato return true; 2224aea3d0cSYoshinori Sato } 2234aea3d0cSYoshinori Sato 2244aea3d0cSYoshinori Sato 2254aea3d0cSYoshinori Sato /* mov.[bwl] dsp:[rs],dsp:[rd] */ 2264aea3d0cSYoshinori Sato /* mov.[bwl] rs,dsp:[rd] */ 2274aea3d0cSYoshinori Sato /* mov.[bwl] dsp:[rs],rd */ 2284aea3d0cSYoshinori Sato /* mov.[bwl] rs,rd */ 2294aea3d0cSYoshinori Sato static bool trans_MOV_mm(DisasContext *ctx, arg_MOV_mm *a) 2304aea3d0cSYoshinori Sato { 231fa6289e2SRichard Henderson char dspd[8], dsps[8]; 2324aea3d0cSYoshinori Sato 2334aea3d0cSYoshinori Sato prt("mov.%c\t", size[a->sz]); 2344aea3d0cSYoshinori Sato if (a->lds == 3 && a->ldd == 3) { 2354aea3d0cSYoshinori Sato /* mov.[bwl] rs,rd */ 2364aea3d0cSYoshinori Sato prt("r%d, r%d", a->rs, a->rd); 2374aea3d0cSYoshinori Sato return true; 2384aea3d0cSYoshinori Sato } 2394aea3d0cSYoshinori Sato if (a->lds == 3) { 240fa6289e2SRichard Henderson rx_index_addr(ctx, dspd, a->ldd, a->sz); 241fa6289e2SRichard Henderson prt("r%d, %s[r%d]", a->rs, dspd, a->rd); 2424aea3d0cSYoshinori Sato } else if (a->ldd == 3) { 243fa6289e2SRichard Henderson rx_index_addr(ctx, dsps, a->lds, a->sz); 244fa6289e2SRichard Henderson prt("%s[r%d], r%d", dsps, a->rs, a->rd); 2454aea3d0cSYoshinori Sato } else { 246fa6289e2SRichard Henderson rx_index_addr(ctx, dsps, a->lds, a->sz); 247fa6289e2SRichard Henderson rx_index_addr(ctx, dspd, a->ldd, a->sz); 248fa6289e2SRichard Henderson prt("%s[r%d], %s[r%d]", dsps, a->rs, dspd, a->rd); 2494aea3d0cSYoshinori Sato } 2504aea3d0cSYoshinori Sato return true; 2514aea3d0cSYoshinori Sato } 2524aea3d0cSYoshinori Sato 2534aea3d0cSYoshinori Sato /* mov.[bwl] rs,[rd+] */ 2544aea3d0cSYoshinori Sato /* mov.[bwl] rs,[-rd] */ 2554aea3d0cSYoshinori Sato static bool trans_MOV_rp(DisasContext *ctx, arg_MOV_rp *a) 2564aea3d0cSYoshinori Sato { 2574aea3d0cSYoshinori Sato prt("mov.%c\tr%d, ", size[a->sz], a->rs); 2584aea3d0cSYoshinori Sato prt((a->ad == 0) ? "[r%d+]" : "[-r%d]", a->rd); 2594aea3d0cSYoshinori Sato return true; 2604aea3d0cSYoshinori Sato } 2614aea3d0cSYoshinori Sato 2624aea3d0cSYoshinori Sato /* mov.[bwl] [rd+],rs */ 2634aea3d0cSYoshinori Sato /* mov.[bwl] [-rd],rs */ 2644aea3d0cSYoshinori Sato static bool trans_MOV_pr(DisasContext *ctx, arg_MOV_pr *a) 2654aea3d0cSYoshinori Sato { 2664aea3d0cSYoshinori Sato prt("mov.%c\t", size[a->sz]); 2674aea3d0cSYoshinori Sato prt((a->ad == 0) ? "[r%d+]" : "[-r%d]", a->rd); 2684aea3d0cSYoshinori Sato prt(", r%d", a->rs); 2694aea3d0cSYoshinori Sato return true; 2704aea3d0cSYoshinori Sato } 2714aea3d0cSYoshinori Sato 2724aea3d0cSYoshinori Sato /* movu.[bw] dsp5:[rs],rd */ 2734aea3d0cSYoshinori Sato static bool trans_MOVU_mr(DisasContext *ctx, arg_MOVU_mr *a) 2744aea3d0cSYoshinori Sato { 2754aea3d0cSYoshinori Sato if (a->dsp > 0) { 2764aea3d0cSYoshinori Sato prt("movu.%c\t%d[r%d], r%d", size[a->sz], 2774aea3d0cSYoshinori Sato a->dsp << a->sz, a->rs, a->rd); 2784aea3d0cSYoshinori Sato } else { 2794aea3d0cSYoshinori Sato prt("movu.%c\t[r%d], r%d", size[a->sz], a->rs, a->rd); 2804aea3d0cSYoshinori Sato } 2814aea3d0cSYoshinori Sato return true; 2824aea3d0cSYoshinori Sato } 2834aea3d0cSYoshinori Sato 2844aea3d0cSYoshinori Sato /* movu.[bw] rs,rd */ 2854aea3d0cSYoshinori Sato static bool trans_MOVU_rr(DisasContext *ctx, arg_MOVU_rr *a) 2864aea3d0cSYoshinori Sato { 2874aea3d0cSYoshinori Sato prt("movu.%c\tr%d, r%d", size[a->sz], a->rs, a->rd); 2884aea3d0cSYoshinori Sato return true; 2894aea3d0cSYoshinori Sato } 2904aea3d0cSYoshinori Sato 2914aea3d0cSYoshinori Sato /* movu.[bw] [ri,rb],rd */ 2924aea3d0cSYoshinori Sato static bool trans_MOVU_ar(DisasContext *ctx, arg_MOVU_ar *a) 2934aea3d0cSYoshinori Sato { 2944aea3d0cSYoshinori Sato prt("mov.%c\t[r%d,r%d], r%d", size[a->sz], a->ri, a->rb, a->rd); 2954aea3d0cSYoshinori Sato return true; 2964aea3d0cSYoshinori Sato } 2974aea3d0cSYoshinori Sato 2984aea3d0cSYoshinori Sato /* movu.[bw] [rs+],rd */ 2994aea3d0cSYoshinori Sato /* movu.[bw] [-rs],rd */ 3004aea3d0cSYoshinori Sato static bool trans_MOVU_pr(DisasContext *ctx, arg_MOVU_pr *a) 3014aea3d0cSYoshinori Sato { 3024aea3d0cSYoshinori Sato prt("movu.%c\t", size[a->sz]); 3034aea3d0cSYoshinori Sato prt((a->ad == 0) ? "[r%d+]" : "[-r%d]", a->rd); 3044aea3d0cSYoshinori Sato prt(", r%d", a->rs); 3054aea3d0cSYoshinori Sato return true; 3064aea3d0cSYoshinori Sato } 3074aea3d0cSYoshinori Sato 3084aea3d0cSYoshinori Sato /* pop rd */ 3094aea3d0cSYoshinori Sato static bool trans_POP(DisasContext *ctx, arg_POP *a) 3104aea3d0cSYoshinori Sato { 3114aea3d0cSYoshinori Sato prt("pop\tr%d", a->rd); 3124aea3d0cSYoshinori Sato return true; 3134aea3d0cSYoshinori Sato } 3144aea3d0cSYoshinori Sato 3154aea3d0cSYoshinori Sato /* popc rx */ 3164aea3d0cSYoshinori Sato static bool trans_POPC(DisasContext *ctx, arg_POPC *a) 3174aea3d0cSYoshinori Sato { 3184aea3d0cSYoshinori Sato prt("pop\tr%s", rx_crname(a->cr)); 3194aea3d0cSYoshinori Sato return true; 3204aea3d0cSYoshinori Sato } 3214aea3d0cSYoshinori Sato 3224aea3d0cSYoshinori Sato /* popm rd-rd2 */ 3234aea3d0cSYoshinori Sato static bool trans_POPM(DisasContext *ctx, arg_POPM *a) 3244aea3d0cSYoshinori Sato { 3254aea3d0cSYoshinori Sato prt("popm\tr%d-r%d", a->rd, a->rd2); 3264aea3d0cSYoshinori Sato return true; 3274aea3d0cSYoshinori Sato } 3284aea3d0cSYoshinori Sato 3294aea3d0cSYoshinori Sato /* push rs */ 3304aea3d0cSYoshinori Sato static bool trans_PUSH_r(DisasContext *ctx, arg_PUSH_r *a) 3314aea3d0cSYoshinori Sato { 3324aea3d0cSYoshinori Sato prt("push\tr%d", a->rs); 3334aea3d0cSYoshinori Sato return true; 3344aea3d0cSYoshinori Sato } 3354aea3d0cSYoshinori Sato 3364aea3d0cSYoshinori Sato /* push dsp[rs] */ 3374aea3d0cSYoshinori Sato static bool trans_PUSH_m(DisasContext *ctx, arg_PUSH_m *a) 3384aea3d0cSYoshinori Sato { 339fa6289e2SRichard Henderson char dsp[8]; 340fa6289e2SRichard Henderson 341fa6289e2SRichard Henderson rx_index_addr(ctx, dsp, a->ld, a->sz); 342fa6289e2SRichard Henderson prt("push\t%s[r%d]", dsp, a->rs); 3434aea3d0cSYoshinori Sato return true; 3444aea3d0cSYoshinori Sato } 3454aea3d0cSYoshinori Sato 3464aea3d0cSYoshinori Sato /* pushc rx */ 3474aea3d0cSYoshinori Sato static bool trans_PUSHC(DisasContext *ctx, arg_PUSHC *a) 3484aea3d0cSYoshinori Sato { 3494aea3d0cSYoshinori Sato prt("push\t%s", rx_crname(a->cr)); 3504aea3d0cSYoshinori Sato return true; 3514aea3d0cSYoshinori Sato } 3524aea3d0cSYoshinori Sato 3534aea3d0cSYoshinori Sato /* pushm rs-rs2*/ 3544aea3d0cSYoshinori Sato static bool trans_PUSHM(DisasContext *ctx, arg_PUSHM *a) 3554aea3d0cSYoshinori Sato { 3564aea3d0cSYoshinori Sato prt("pushm\tr%d-r%d", a->rs, a->rs2); 3574aea3d0cSYoshinori Sato return true; 3584aea3d0cSYoshinori Sato } 3594aea3d0cSYoshinori Sato 3604aea3d0cSYoshinori Sato /* xchg rs,rd */ 3614aea3d0cSYoshinori Sato static bool trans_XCHG_rr(DisasContext *ctx, arg_XCHG_rr *a) 3624aea3d0cSYoshinori Sato { 3634aea3d0cSYoshinori Sato prt("xchg\tr%d, r%d", a->rs, a->rd); 3644aea3d0cSYoshinori Sato return true; 3654aea3d0cSYoshinori Sato } 3664aea3d0cSYoshinori Sato /* xchg dsp[rs].<mi>,rd */ 3674aea3d0cSYoshinori Sato static bool trans_XCHG_mr(DisasContext *ctx, arg_XCHG_mr *a) 3684aea3d0cSYoshinori Sato { 369*5cf7c960SRichard Henderson prt_ldmi(ctx, "xchg", a->ld, a->mi, a->rs, a->rd); 3704aea3d0cSYoshinori Sato return true; 3714aea3d0cSYoshinori Sato } 3724aea3d0cSYoshinori Sato 3734aea3d0cSYoshinori Sato /* stz #imm,rd */ 3744aea3d0cSYoshinori Sato static bool trans_STZ(DisasContext *ctx, arg_STZ *a) 3754aea3d0cSYoshinori Sato { 3764aea3d0cSYoshinori Sato prt_ir(ctx, "stz", a->imm, a->rd); 3774aea3d0cSYoshinori Sato return true; 3784aea3d0cSYoshinori Sato } 3794aea3d0cSYoshinori Sato 3804aea3d0cSYoshinori Sato /* stnz #imm,rd */ 3814aea3d0cSYoshinori Sato static bool trans_STNZ(DisasContext *ctx, arg_STNZ *a) 3824aea3d0cSYoshinori Sato { 3834aea3d0cSYoshinori Sato prt_ir(ctx, "stnz", a->imm, a->rd); 3844aea3d0cSYoshinori Sato return true; 3854aea3d0cSYoshinori Sato } 3864aea3d0cSYoshinori Sato 3874aea3d0cSYoshinori Sato /* rtsd #imm */ 3884aea3d0cSYoshinori Sato static bool trans_RTSD_i(DisasContext *ctx, arg_RTSD_i *a) 3894aea3d0cSYoshinori Sato { 3904aea3d0cSYoshinori Sato prt("rtsd\t#%d", a->imm << 2); 3914aea3d0cSYoshinori Sato return true; 3924aea3d0cSYoshinori Sato } 3934aea3d0cSYoshinori Sato 3944aea3d0cSYoshinori Sato /* rtsd #imm, rd-rd2 */ 3954aea3d0cSYoshinori Sato static bool trans_RTSD_irr(DisasContext *ctx, arg_RTSD_irr *a) 3964aea3d0cSYoshinori Sato { 3974aea3d0cSYoshinori Sato prt("rtsd\t#%d, r%d - r%d", a->imm << 2, a->rd, a->rd2); 3984aea3d0cSYoshinori Sato return true; 3994aea3d0cSYoshinori Sato } 4004aea3d0cSYoshinori Sato 4014aea3d0cSYoshinori Sato /* and #uimm:4, rd */ 4024aea3d0cSYoshinori Sato /* and #imm, rd */ 4034aea3d0cSYoshinori Sato static bool trans_AND_ir(DisasContext *ctx, arg_AND_ir *a) 4044aea3d0cSYoshinori Sato { 4054aea3d0cSYoshinori Sato prt_ir(ctx, "and", a->imm, a->rd); 4064aea3d0cSYoshinori Sato return true; 4074aea3d0cSYoshinori Sato } 4084aea3d0cSYoshinori Sato 4094aea3d0cSYoshinori Sato /* and dsp[rs], rd */ 4104aea3d0cSYoshinori Sato /* and rs,rd */ 4114aea3d0cSYoshinori Sato static bool trans_AND_mr(DisasContext *ctx, arg_AND_mr *a) 4124aea3d0cSYoshinori Sato { 413e283adeaSRichard Henderson prt_ldmi(ctx, "and", a->ld, a->mi, a->rs, a->rd); 4144aea3d0cSYoshinori Sato return true; 4154aea3d0cSYoshinori Sato } 4164aea3d0cSYoshinori Sato 4174aea3d0cSYoshinori Sato /* and rs,rs2,rd */ 4184aea3d0cSYoshinori Sato static bool trans_AND_rrr(DisasContext *ctx, arg_AND_rrr *a) 4194aea3d0cSYoshinori Sato { 4204aea3d0cSYoshinori Sato prt("and\tr%d,r%d, r%d", a->rs, a->rs2, a->rd); 4214aea3d0cSYoshinori Sato return true; 4224aea3d0cSYoshinori Sato } 4234aea3d0cSYoshinori Sato 4244aea3d0cSYoshinori Sato /* or #uimm:4, rd */ 4254aea3d0cSYoshinori Sato /* or #imm, rd */ 4264aea3d0cSYoshinori Sato static bool trans_OR_ir(DisasContext *ctx, arg_OR_ir *a) 4274aea3d0cSYoshinori Sato { 4284aea3d0cSYoshinori Sato prt_ir(ctx, "or", a->imm, a->rd); 4294aea3d0cSYoshinori Sato return true; 4304aea3d0cSYoshinori Sato } 4314aea3d0cSYoshinori Sato 4324aea3d0cSYoshinori Sato /* or dsp[rs], rd */ 4334aea3d0cSYoshinori Sato /* or rs,rd */ 4344aea3d0cSYoshinori Sato static bool trans_OR_mr(DisasContext *ctx, arg_OR_mr *a) 4354aea3d0cSYoshinori Sato { 436e283adeaSRichard Henderson prt_ldmi(ctx, "or", a->ld, a->mi, a->rs, a->rd); 4374aea3d0cSYoshinori Sato return true; 4384aea3d0cSYoshinori Sato } 4394aea3d0cSYoshinori Sato 4404aea3d0cSYoshinori Sato /* or rs,rs2,rd */ 4414aea3d0cSYoshinori Sato static bool trans_OR_rrr(DisasContext *ctx, arg_OR_rrr *a) 4424aea3d0cSYoshinori Sato { 4434aea3d0cSYoshinori Sato prt("or\tr%d, r%d, r%d", a->rs, a->rs2, a->rd); 4444aea3d0cSYoshinori Sato return true; 4454aea3d0cSYoshinori Sato } 4464aea3d0cSYoshinori Sato 4474aea3d0cSYoshinori Sato /* xor #imm, rd */ 4484aea3d0cSYoshinori Sato static bool trans_XOR_ir(DisasContext *ctx, arg_XOR_ir *a) 4494aea3d0cSYoshinori Sato { 4504aea3d0cSYoshinori Sato prt_ir(ctx, "xor", a->imm, a->rd); 4514aea3d0cSYoshinori Sato return true; 4524aea3d0cSYoshinori Sato } 4534aea3d0cSYoshinori Sato 4544aea3d0cSYoshinori Sato /* xor dsp[rs], rd */ 4554aea3d0cSYoshinori Sato /* xor rs,rd */ 4564aea3d0cSYoshinori Sato static bool trans_XOR_mr(DisasContext *ctx, arg_XOR_mr *a) 4574aea3d0cSYoshinori Sato { 458e283adeaSRichard Henderson prt_ldmi(ctx, "xor", a->ld, a->mi, a->rs, a->rd); 4594aea3d0cSYoshinori Sato return true; 4604aea3d0cSYoshinori Sato } 4614aea3d0cSYoshinori Sato 4624aea3d0cSYoshinori Sato /* tst #imm, rd */ 4634aea3d0cSYoshinori Sato static bool trans_TST_ir(DisasContext *ctx, arg_TST_ir *a) 4644aea3d0cSYoshinori Sato { 4654aea3d0cSYoshinori Sato prt_ir(ctx, "tst", a->imm, a->rd); 4664aea3d0cSYoshinori Sato return true; 4674aea3d0cSYoshinori Sato } 4684aea3d0cSYoshinori Sato 4694aea3d0cSYoshinori Sato /* tst dsp[rs], rd */ 4704aea3d0cSYoshinori Sato /* tst rs, rd */ 4714aea3d0cSYoshinori Sato static bool trans_TST_mr(DisasContext *ctx, arg_TST_mr *a) 4724aea3d0cSYoshinori Sato { 473e283adeaSRichard Henderson prt_ldmi(ctx, "tst", a->ld, a->mi, a->rs, a->rd); 4744aea3d0cSYoshinori Sato return true; 4754aea3d0cSYoshinori Sato } 4764aea3d0cSYoshinori Sato 4774aea3d0cSYoshinori Sato /* not rd */ 4784aea3d0cSYoshinori Sato /* not rs, rd */ 4794aea3d0cSYoshinori Sato static bool trans_NOT_rr(DisasContext *ctx, arg_NOT_rr *a) 4804aea3d0cSYoshinori Sato { 4814aea3d0cSYoshinori Sato prt("not\t"); 4824aea3d0cSYoshinori Sato if (a->rs != a->rd) { 4834aea3d0cSYoshinori Sato prt("r%d, ", a->rs); 4844aea3d0cSYoshinori Sato } 4854aea3d0cSYoshinori Sato prt("r%d", a->rd); 4864aea3d0cSYoshinori Sato return true; 4874aea3d0cSYoshinori Sato } 4884aea3d0cSYoshinori Sato 4894aea3d0cSYoshinori Sato /* neg rd */ 4904aea3d0cSYoshinori Sato /* neg rs, rd */ 4914aea3d0cSYoshinori Sato static bool trans_NEG_rr(DisasContext *ctx, arg_NEG_rr *a) 4924aea3d0cSYoshinori Sato { 4934aea3d0cSYoshinori Sato prt("neg\t"); 4944aea3d0cSYoshinori Sato if (a->rs != a->rd) { 4954aea3d0cSYoshinori Sato prt("r%d, ", a->rs); 4964aea3d0cSYoshinori Sato } 4974aea3d0cSYoshinori Sato prt("r%d", a->rd); 4984aea3d0cSYoshinori Sato return true; 4994aea3d0cSYoshinori Sato } 5004aea3d0cSYoshinori Sato 5014aea3d0cSYoshinori Sato /* adc #imm, rd */ 5024aea3d0cSYoshinori Sato static bool trans_ADC_ir(DisasContext *ctx, arg_ADC_ir *a) 5034aea3d0cSYoshinori Sato { 5044aea3d0cSYoshinori Sato prt_ir(ctx, "adc", a->imm, a->rd); 5054aea3d0cSYoshinori Sato return true; 5064aea3d0cSYoshinori Sato } 5074aea3d0cSYoshinori Sato 5084aea3d0cSYoshinori Sato /* adc rs, rd */ 5094aea3d0cSYoshinori Sato static bool trans_ADC_rr(DisasContext *ctx, arg_ADC_rr *a) 5104aea3d0cSYoshinori Sato { 5114aea3d0cSYoshinori Sato prt("adc\tr%d, r%d", a->rs, a->rd); 5124aea3d0cSYoshinori Sato return true; 5134aea3d0cSYoshinori Sato } 5144aea3d0cSYoshinori Sato 5154aea3d0cSYoshinori Sato /* adc dsp[rs], rd */ 5164aea3d0cSYoshinori Sato static bool trans_ADC_mr(DisasContext *ctx, arg_ADC_mr *a) 5174aea3d0cSYoshinori Sato { 518fa6289e2SRichard Henderson char dsp[8]; 519fa6289e2SRichard Henderson 520fa6289e2SRichard Henderson rx_index_addr(ctx, dsp, a->ld, 2); 521fa6289e2SRichard Henderson prt("adc\t%s[r%d], r%d", dsp, a->rs, a->rd); 5224aea3d0cSYoshinori Sato return true; 5234aea3d0cSYoshinori Sato } 5244aea3d0cSYoshinori Sato 5254aea3d0cSYoshinori Sato /* add #uimm4, rd */ 5264aea3d0cSYoshinori Sato /* add #imm, rs, rd */ 5274aea3d0cSYoshinori Sato static bool trans_ADD_irr(DisasContext *ctx, arg_ADD_irr *a) 5284aea3d0cSYoshinori Sato { 5294aea3d0cSYoshinori Sato if (a->imm < 0x10 && a->rs2 == a->rd) { 5304aea3d0cSYoshinori Sato prt("add\t#%d, r%d", a->imm, a->rd); 5314aea3d0cSYoshinori Sato } else { 5324aea3d0cSYoshinori Sato prt("add\t#0x%08x, r%d, r%d", a->imm, a->rs2, a->rd); 5334aea3d0cSYoshinori Sato } 5344aea3d0cSYoshinori Sato return true; 5354aea3d0cSYoshinori Sato } 5364aea3d0cSYoshinori Sato 5374aea3d0cSYoshinori Sato /* add rs, rd */ 5384aea3d0cSYoshinori Sato /* add dsp[rs], rd */ 5394aea3d0cSYoshinori Sato static bool trans_ADD_mr(DisasContext *ctx, arg_ADD_mr *a) 5404aea3d0cSYoshinori Sato { 541e283adeaSRichard Henderson prt_ldmi(ctx, "add", a->ld, a->mi, a->rs, a->rd); 5424aea3d0cSYoshinori Sato return true; 5434aea3d0cSYoshinori Sato } 5444aea3d0cSYoshinori Sato 5454aea3d0cSYoshinori Sato /* add rs, rs2, rd */ 5464aea3d0cSYoshinori Sato static bool trans_ADD_rrr(DisasContext *ctx, arg_ADD_rrr *a) 5474aea3d0cSYoshinori Sato { 5484aea3d0cSYoshinori Sato prt("add\tr%d, r%d, r%d", a->rs, a->rs2, a->rd); 5494aea3d0cSYoshinori Sato return true; 5504aea3d0cSYoshinori Sato } 5514aea3d0cSYoshinori Sato 5524aea3d0cSYoshinori Sato /* cmp #imm4, rd */ 5534aea3d0cSYoshinori Sato /* cmp #imm8, rd */ 5544aea3d0cSYoshinori Sato /* cmp #imm, rs2 */ 5554aea3d0cSYoshinori Sato static bool trans_CMP_ir(DisasContext *ctx, arg_CMP_ir *a) 5564aea3d0cSYoshinori Sato { 5574aea3d0cSYoshinori Sato prt_ir(ctx, "cmp", a->imm, a->rs2); 5584aea3d0cSYoshinori Sato return true; 5594aea3d0cSYoshinori Sato } 5604aea3d0cSYoshinori Sato 5614aea3d0cSYoshinori Sato /* cmp rs, rs2 */ 5624aea3d0cSYoshinori Sato /* cmp dsp[rs], rs2 */ 5634aea3d0cSYoshinori Sato static bool trans_CMP_mr(DisasContext *ctx, arg_CMP_mr *a) 5644aea3d0cSYoshinori Sato { 565e283adeaSRichard Henderson prt_ldmi(ctx, "cmp", a->ld, a->mi, a->rs, a->rd); 5664aea3d0cSYoshinori Sato return true; 5674aea3d0cSYoshinori Sato } 5684aea3d0cSYoshinori Sato 5694aea3d0cSYoshinori Sato /* sub #imm4, rd */ 5704aea3d0cSYoshinori Sato static bool trans_SUB_ir(DisasContext *ctx, arg_SUB_ir *a) 5714aea3d0cSYoshinori Sato { 5724aea3d0cSYoshinori Sato prt("sub\t#%d, r%d", a->imm, a->rd); 5734aea3d0cSYoshinori Sato return true; 5744aea3d0cSYoshinori Sato } 5754aea3d0cSYoshinori Sato 5764aea3d0cSYoshinori Sato /* sub rs, rd */ 5774aea3d0cSYoshinori Sato /* sub dsp[rs], rd */ 5784aea3d0cSYoshinori Sato static bool trans_SUB_mr(DisasContext *ctx, arg_SUB_mr *a) 5794aea3d0cSYoshinori Sato { 580e283adeaSRichard Henderson prt_ldmi(ctx, "sub", a->ld, a->mi, a->rs, a->rd); 5814aea3d0cSYoshinori Sato return true; 5824aea3d0cSYoshinori Sato } 5834aea3d0cSYoshinori Sato 5844aea3d0cSYoshinori Sato /* sub rs, rs2, rd */ 5854aea3d0cSYoshinori Sato static bool trans_SUB_rrr(DisasContext *ctx, arg_SUB_rrr *a) 5864aea3d0cSYoshinori Sato { 5874aea3d0cSYoshinori Sato prt("sub\tr%d, r%d, r%d", a->rs, a->rs2, a->rd); 5884aea3d0cSYoshinori Sato return true; 5894aea3d0cSYoshinori Sato } 5904aea3d0cSYoshinori Sato 5914aea3d0cSYoshinori Sato /* sbb rs, rd */ 5924aea3d0cSYoshinori Sato static bool trans_SBB_rr(DisasContext *ctx, arg_SBB_rr *a) 5934aea3d0cSYoshinori Sato { 5944aea3d0cSYoshinori Sato prt("sbb\tr%d, r%d", a->rs, a->rd); 5954aea3d0cSYoshinori Sato return true; 5964aea3d0cSYoshinori Sato } 5974aea3d0cSYoshinori Sato 5984aea3d0cSYoshinori Sato /* sbb dsp[rs], rd */ 5994aea3d0cSYoshinori Sato static bool trans_SBB_mr(DisasContext *ctx, arg_SBB_mr *a) 6004aea3d0cSYoshinori Sato { 601e283adeaSRichard Henderson prt_ldmi(ctx, "sbb", a->ld, RX_IM_LONG, a->rs, a->rd); 6024aea3d0cSYoshinori Sato return true; 6034aea3d0cSYoshinori Sato } 6044aea3d0cSYoshinori Sato 6054aea3d0cSYoshinori Sato /* abs rd */ 6064aea3d0cSYoshinori Sato /* abs rs, rd */ 6074aea3d0cSYoshinori Sato static bool trans_ABS_rr(DisasContext *ctx, arg_ABS_rr *a) 6084aea3d0cSYoshinori Sato { 6094aea3d0cSYoshinori Sato prt("abs\t"); 6104aea3d0cSYoshinori Sato if (a->rs == a->rd) { 6114aea3d0cSYoshinori Sato prt("r%d", a->rd); 6124aea3d0cSYoshinori Sato } else { 6134aea3d0cSYoshinori Sato prt("r%d, r%d", a->rs, a->rd); 6144aea3d0cSYoshinori Sato } 6154aea3d0cSYoshinori Sato return true; 6164aea3d0cSYoshinori Sato } 6174aea3d0cSYoshinori Sato 6184aea3d0cSYoshinori Sato /* max #imm, rd */ 6194aea3d0cSYoshinori Sato static bool trans_MAX_ir(DisasContext *ctx, arg_MAX_ir *a) 6204aea3d0cSYoshinori Sato { 6214aea3d0cSYoshinori Sato prt_ir(ctx, "max", a->imm, a->rd); 6224aea3d0cSYoshinori Sato return true; 6234aea3d0cSYoshinori Sato } 6244aea3d0cSYoshinori Sato 6254aea3d0cSYoshinori Sato /* max rs, rd */ 6264aea3d0cSYoshinori Sato /* max dsp[rs], rd */ 6274aea3d0cSYoshinori Sato static bool trans_MAX_mr(DisasContext *ctx, arg_MAX_mr *a) 6284aea3d0cSYoshinori Sato { 629e283adeaSRichard Henderson prt_ldmi(ctx, "max", a->ld, a->mi, a->rs, a->rd); 6304aea3d0cSYoshinori Sato return true; 6314aea3d0cSYoshinori Sato } 6324aea3d0cSYoshinori Sato 6334aea3d0cSYoshinori Sato /* min #imm, rd */ 6344aea3d0cSYoshinori Sato static bool trans_MIN_ir(DisasContext *ctx, arg_MIN_ir *a) 6354aea3d0cSYoshinori Sato { 6364aea3d0cSYoshinori Sato prt_ir(ctx, "min", a->imm, a->rd); 6374aea3d0cSYoshinori Sato return true; 6384aea3d0cSYoshinori Sato } 6394aea3d0cSYoshinori Sato 6404aea3d0cSYoshinori Sato /* min rs, rd */ 6414aea3d0cSYoshinori Sato /* min dsp[rs], rd */ 6424aea3d0cSYoshinori Sato static bool trans_MIN_mr(DisasContext *ctx, arg_MIN_mr *a) 6434aea3d0cSYoshinori Sato { 644e283adeaSRichard Henderson prt_ldmi(ctx, "min", a->ld, a->mi, a->rs, a->rd); 6454aea3d0cSYoshinori Sato return true; 6464aea3d0cSYoshinori Sato } 6474aea3d0cSYoshinori Sato 6484aea3d0cSYoshinori Sato /* mul #uimm4, rd */ 6494aea3d0cSYoshinori Sato /* mul #imm, rd */ 6504aea3d0cSYoshinori Sato static bool trans_MUL_ir(DisasContext *ctx, arg_MUL_ir *a) 6514aea3d0cSYoshinori Sato { 6524aea3d0cSYoshinori Sato prt_ir(ctx, "mul", a->imm, a->rd); 6534aea3d0cSYoshinori Sato return true; 6544aea3d0cSYoshinori Sato } 6554aea3d0cSYoshinori Sato 6564aea3d0cSYoshinori Sato /* mul rs, rd */ 6574aea3d0cSYoshinori Sato /* mul dsp[rs], rd */ 6584aea3d0cSYoshinori Sato static bool trans_MUL_mr(DisasContext *ctx, arg_MUL_mr *a) 6594aea3d0cSYoshinori Sato { 660e283adeaSRichard Henderson prt_ldmi(ctx, "mul", a->ld, a->mi, a->rs, a->rd); 6614aea3d0cSYoshinori Sato return true; 6624aea3d0cSYoshinori Sato } 6634aea3d0cSYoshinori Sato 6644aea3d0cSYoshinori Sato /* mul rs, rs2, rd */ 6654aea3d0cSYoshinori Sato static bool trans_MUL_rrr(DisasContext *ctx, arg_MUL_rrr *a) 6664aea3d0cSYoshinori Sato { 6674aea3d0cSYoshinori Sato prt("mul\tr%d,r%d,r%d", a->rs, a->rs2, a->rd); 6684aea3d0cSYoshinori Sato return true; 6694aea3d0cSYoshinori Sato } 6704aea3d0cSYoshinori Sato 6714aea3d0cSYoshinori Sato /* emul #imm, rd */ 6724aea3d0cSYoshinori Sato static bool trans_EMUL_ir(DisasContext *ctx, arg_EMUL_ir *a) 6734aea3d0cSYoshinori Sato { 6744aea3d0cSYoshinori Sato prt_ir(ctx, "emul", a->imm, a->rd); 6754aea3d0cSYoshinori Sato return true; 6764aea3d0cSYoshinori Sato } 6774aea3d0cSYoshinori Sato 6784aea3d0cSYoshinori Sato /* emul rs, rd */ 6794aea3d0cSYoshinori Sato /* emul dsp[rs], rd */ 6804aea3d0cSYoshinori Sato static bool trans_EMUL_mr(DisasContext *ctx, arg_EMUL_mr *a) 6814aea3d0cSYoshinori Sato { 682e283adeaSRichard Henderson prt_ldmi(ctx, "emul", a->ld, a->mi, a->rs, a->rd); 6834aea3d0cSYoshinori Sato return true; 6844aea3d0cSYoshinori Sato } 6854aea3d0cSYoshinori Sato 6864aea3d0cSYoshinori Sato /* emulu #imm, rd */ 6874aea3d0cSYoshinori Sato static bool trans_EMULU_ir(DisasContext *ctx, arg_EMULU_ir *a) 6884aea3d0cSYoshinori Sato { 6894aea3d0cSYoshinori Sato prt_ir(ctx, "emulu", a->imm, a->rd); 6904aea3d0cSYoshinori Sato return true; 6914aea3d0cSYoshinori Sato } 6924aea3d0cSYoshinori Sato 6934aea3d0cSYoshinori Sato /* emulu rs, rd */ 6944aea3d0cSYoshinori Sato /* emulu dsp[rs], rd */ 6954aea3d0cSYoshinori Sato static bool trans_EMULU_mr(DisasContext *ctx, arg_EMULU_mr *a) 6964aea3d0cSYoshinori Sato { 697e283adeaSRichard Henderson prt_ldmi(ctx, "emulu", a->ld, a->mi, a->rs, a->rd); 6984aea3d0cSYoshinori Sato return true; 6994aea3d0cSYoshinori Sato } 7004aea3d0cSYoshinori Sato 7014aea3d0cSYoshinori Sato /* div #imm, rd */ 7024aea3d0cSYoshinori Sato static bool trans_DIV_ir(DisasContext *ctx, arg_DIV_ir *a) 7034aea3d0cSYoshinori Sato { 7044aea3d0cSYoshinori Sato prt_ir(ctx, "div", a->imm, a->rd); 7054aea3d0cSYoshinori Sato return true; 7064aea3d0cSYoshinori Sato } 7074aea3d0cSYoshinori Sato 7084aea3d0cSYoshinori Sato /* div rs, rd */ 7094aea3d0cSYoshinori Sato /* div dsp[rs], rd */ 7104aea3d0cSYoshinori Sato static bool trans_DIV_mr(DisasContext *ctx, arg_DIV_mr *a) 7114aea3d0cSYoshinori Sato { 712e283adeaSRichard Henderson prt_ldmi(ctx, "div", a->ld, a->mi, a->rs, a->rd); 7134aea3d0cSYoshinori Sato return true; 7144aea3d0cSYoshinori Sato } 7154aea3d0cSYoshinori Sato 7164aea3d0cSYoshinori Sato /* divu #imm, rd */ 7174aea3d0cSYoshinori Sato static bool trans_DIVU_ir(DisasContext *ctx, arg_DIVU_ir *a) 7184aea3d0cSYoshinori Sato { 7194aea3d0cSYoshinori Sato prt_ir(ctx, "divu", a->imm, a->rd); 7204aea3d0cSYoshinori Sato return true; 7214aea3d0cSYoshinori Sato } 7224aea3d0cSYoshinori Sato 7234aea3d0cSYoshinori Sato /* divu rs, rd */ 7244aea3d0cSYoshinori Sato /* divu dsp[rs], rd */ 7254aea3d0cSYoshinori Sato static bool trans_DIVU_mr(DisasContext *ctx, arg_DIVU_mr *a) 7264aea3d0cSYoshinori Sato { 727e283adeaSRichard Henderson prt_ldmi(ctx, "divu", a->ld, a->mi, a->rs, a->rd); 7284aea3d0cSYoshinori Sato return true; 7294aea3d0cSYoshinori Sato } 7304aea3d0cSYoshinori Sato 7314aea3d0cSYoshinori Sato 7324aea3d0cSYoshinori Sato /* shll #imm:5, rd */ 7334aea3d0cSYoshinori Sato /* shll #imm:5, rs, rd */ 7344aea3d0cSYoshinori Sato static bool trans_SHLL_irr(DisasContext *ctx, arg_SHLL_irr *a) 7354aea3d0cSYoshinori Sato { 7364aea3d0cSYoshinori Sato prt("shll\t#%d, ", a->imm); 7374aea3d0cSYoshinori Sato if (a->rs2 != a->rd) { 7384aea3d0cSYoshinori Sato prt("r%d, ", a->rs2); 7394aea3d0cSYoshinori Sato } 7404aea3d0cSYoshinori Sato prt("r%d", a->rd); 7414aea3d0cSYoshinori Sato return true; 7424aea3d0cSYoshinori Sato } 7434aea3d0cSYoshinori Sato 7444aea3d0cSYoshinori Sato /* shll rs, rd */ 7454aea3d0cSYoshinori Sato static bool trans_SHLL_rr(DisasContext *ctx, arg_SHLL_rr *a) 7464aea3d0cSYoshinori Sato { 7474aea3d0cSYoshinori Sato prt("shll\tr%d, r%d", a->rs, a->rd); 7484aea3d0cSYoshinori Sato return true; 7494aea3d0cSYoshinori Sato } 7504aea3d0cSYoshinori Sato 7514aea3d0cSYoshinori Sato /* shar #imm:5, rd */ 7524aea3d0cSYoshinori Sato /* shar #imm:5, rs, rd */ 7534aea3d0cSYoshinori Sato static bool trans_SHAR_irr(DisasContext *ctx, arg_SHAR_irr *a) 7544aea3d0cSYoshinori Sato { 7554aea3d0cSYoshinori Sato prt("shar\t#%d,", a->imm); 7564aea3d0cSYoshinori Sato if (a->rs2 != a->rd) { 7574aea3d0cSYoshinori Sato prt("r%d, ", a->rs2); 7584aea3d0cSYoshinori Sato } 7594aea3d0cSYoshinori Sato prt("r%d", a->rd); 7604aea3d0cSYoshinori Sato return true; 7614aea3d0cSYoshinori Sato } 7624aea3d0cSYoshinori Sato 7634aea3d0cSYoshinori Sato /* shar rs, rd */ 7644aea3d0cSYoshinori Sato static bool trans_SHAR_rr(DisasContext *ctx, arg_SHAR_rr *a) 7654aea3d0cSYoshinori Sato { 7664aea3d0cSYoshinori Sato prt("shar\tr%d, r%d", a->rs, a->rd); 7674aea3d0cSYoshinori Sato return true; 7684aea3d0cSYoshinori Sato } 7694aea3d0cSYoshinori Sato 7704aea3d0cSYoshinori Sato /* shlr #imm:5, rd */ 7714aea3d0cSYoshinori Sato /* shlr #imm:5, rs, rd */ 7724aea3d0cSYoshinori Sato static bool trans_SHLR_irr(DisasContext *ctx, arg_SHLR_irr *a) 7734aea3d0cSYoshinori Sato { 7744aea3d0cSYoshinori Sato prt("shlr\t#%d, ", a->imm); 7754aea3d0cSYoshinori Sato if (a->rs2 != a->rd) { 7764aea3d0cSYoshinori Sato prt("r%d, ", a->rs2); 7774aea3d0cSYoshinori Sato } 7784aea3d0cSYoshinori Sato prt("r%d", a->rd); 7794aea3d0cSYoshinori Sato return true; 7804aea3d0cSYoshinori Sato } 7814aea3d0cSYoshinori Sato 7824aea3d0cSYoshinori Sato /* shlr rs, rd */ 7834aea3d0cSYoshinori Sato static bool trans_SHLR_rr(DisasContext *ctx, arg_SHLR_rr *a) 7844aea3d0cSYoshinori Sato { 7854aea3d0cSYoshinori Sato prt("shlr\tr%d, r%d", a->rs, a->rd); 7864aea3d0cSYoshinori Sato return true; 7874aea3d0cSYoshinori Sato } 7884aea3d0cSYoshinori Sato 7894aea3d0cSYoshinori Sato /* rolc rd */ 7904aea3d0cSYoshinori Sato static bool trans_ROLC(DisasContext *ctx, arg_ROLC *a) 7914aea3d0cSYoshinori Sato { 7924aea3d0cSYoshinori Sato prt("rorc\tr%d", a->rd); 7934aea3d0cSYoshinori Sato return true; 7944aea3d0cSYoshinori Sato } 7954aea3d0cSYoshinori Sato 7964aea3d0cSYoshinori Sato /* rorc rd */ 7974aea3d0cSYoshinori Sato static bool trans_RORC(DisasContext *ctx, arg_RORC *a) 7984aea3d0cSYoshinori Sato { 7994aea3d0cSYoshinori Sato prt("rorc\tr%d", a->rd); 8004aea3d0cSYoshinori Sato return true; 8014aea3d0cSYoshinori Sato } 8024aea3d0cSYoshinori Sato 8034aea3d0cSYoshinori Sato /* rotl #imm, rd */ 8044aea3d0cSYoshinori Sato static bool trans_ROTL_ir(DisasContext *ctx, arg_ROTL_ir *a) 8054aea3d0cSYoshinori Sato { 8064aea3d0cSYoshinori Sato prt("rotl\t#%d, r%d", a->imm, a->rd); 8074aea3d0cSYoshinori Sato return true; 8084aea3d0cSYoshinori Sato } 8094aea3d0cSYoshinori Sato 8104aea3d0cSYoshinori Sato /* rotl rs, rd */ 8114aea3d0cSYoshinori Sato static bool trans_ROTL_rr(DisasContext *ctx, arg_ROTL_rr *a) 8124aea3d0cSYoshinori Sato { 8134aea3d0cSYoshinori Sato prt("rotl\tr%d, r%d", a->rs, a->rd); 8144aea3d0cSYoshinori Sato return true; 8154aea3d0cSYoshinori Sato } 8164aea3d0cSYoshinori Sato 8174aea3d0cSYoshinori Sato /* rotr #imm, rd */ 8184aea3d0cSYoshinori Sato static bool trans_ROTR_ir(DisasContext *ctx, arg_ROTR_ir *a) 8194aea3d0cSYoshinori Sato { 8204aea3d0cSYoshinori Sato prt("rotr\t#%d, r%d", a->imm, a->rd); 8214aea3d0cSYoshinori Sato return true; 8224aea3d0cSYoshinori Sato } 8234aea3d0cSYoshinori Sato 8244aea3d0cSYoshinori Sato /* rotr rs, rd */ 8254aea3d0cSYoshinori Sato static bool trans_ROTR_rr(DisasContext *ctx, arg_ROTR_rr *a) 8264aea3d0cSYoshinori Sato { 8274aea3d0cSYoshinori Sato prt("rotr\tr%d, r%d", a->rs, a->rd); 8284aea3d0cSYoshinori Sato return true; 8294aea3d0cSYoshinori Sato } 8304aea3d0cSYoshinori Sato 8314aea3d0cSYoshinori Sato /* revl rs, rd */ 8324aea3d0cSYoshinori Sato static bool trans_REVL(DisasContext *ctx, arg_REVL *a) 8334aea3d0cSYoshinori Sato { 8344aea3d0cSYoshinori Sato prt("revl\tr%d, r%d", a->rs, a->rd); 8354aea3d0cSYoshinori Sato return true; 8364aea3d0cSYoshinori Sato } 8374aea3d0cSYoshinori Sato 8384aea3d0cSYoshinori Sato /* revw rs, rd */ 8394aea3d0cSYoshinori Sato static bool trans_REVW(DisasContext *ctx, arg_REVW *a) 8404aea3d0cSYoshinori Sato { 8414aea3d0cSYoshinori Sato prt("revw\tr%d, r%d", a->rs, a->rd); 8424aea3d0cSYoshinori Sato return true; 8434aea3d0cSYoshinori Sato } 8444aea3d0cSYoshinori Sato 8454aea3d0cSYoshinori Sato /* conditional branch helper */ 8464aea3d0cSYoshinori Sato static void rx_bcnd_main(DisasContext *ctx, int cd, int len, int dst) 8474aea3d0cSYoshinori Sato { 8484aea3d0cSYoshinori Sato static const char sz[] = {'s', 'b', 'w', 'a'}; 8494aea3d0cSYoshinori Sato prt("b%s.%c\t%08x", cond[cd], sz[len - 1], ctx->pc + dst); 8504aea3d0cSYoshinori Sato } 8514aea3d0cSYoshinori Sato 8524aea3d0cSYoshinori Sato /* beq dsp:3 / bne dsp:3 */ 8534aea3d0cSYoshinori Sato /* beq dsp:8 / bne dsp:8 */ 8544aea3d0cSYoshinori Sato /* bc dsp:8 / bnc dsp:8 */ 8554aea3d0cSYoshinori Sato /* bgtu dsp:8 / bleu dsp:8 */ 8564aea3d0cSYoshinori Sato /* bpz dsp:8 / bn dsp:8 */ 8574aea3d0cSYoshinori Sato /* bge dsp:8 / blt dsp:8 */ 8584aea3d0cSYoshinori Sato /* bgt dsp:8 / ble dsp:8 */ 8594aea3d0cSYoshinori Sato /* bo dsp:8 / bno dsp:8 */ 8604aea3d0cSYoshinori Sato /* beq dsp:16 / bne dsp:16 */ 8614aea3d0cSYoshinori Sato static bool trans_BCnd(DisasContext *ctx, arg_BCnd *a) 8624aea3d0cSYoshinori Sato { 8634aea3d0cSYoshinori Sato rx_bcnd_main(ctx, a->cd, a->sz, a->dsp); 8644aea3d0cSYoshinori Sato return true; 8654aea3d0cSYoshinori Sato } 8664aea3d0cSYoshinori Sato 8674aea3d0cSYoshinori Sato /* bra dsp:3 */ 8684aea3d0cSYoshinori Sato /* bra dsp:8 */ 8694aea3d0cSYoshinori Sato /* bra dsp:16 */ 8704aea3d0cSYoshinori Sato /* bra dsp:24 */ 8714aea3d0cSYoshinori Sato static bool trans_BRA(DisasContext *ctx, arg_BRA *a) 8724aea3d0cSYoshinori Sato { 8734aea3d0cSYoshinori Sato rx_bcnd_main(ctx, 14, a->sz, a->dsp); 8744aea3d0cSYoshinori Sato return true; 8754aea3d0cSYoshinori Sato } 8764aea3d0cSYoshinori Sato 8774aea3d0cSYoshinori Sato /* bra rs */ 8784aea3d0cSYoshinori Sato static bool trans_BRA_l(DisasContext *ctx, arg_BRA_l *a) 8794aea3d0cSYoshinori Sato { 8804aea3d0cSYoshinori Sato prt("bra.l\tr%d", a->rd); 8814aea3d0cSYoshinori Sato return true; 8824aea3d0cSYoshinori Sato } 8834aea3d0cSYoshinori Sato 8844aea3d0cSYoshinori Sato /* jmp rs */ 8854aea3d0cSYoshinori Sato static bool trans_JMP(DisasContext *ctx, arg_JMP *a) 8864aea3d0cSYoshinori Sato { 8874aea3d0cSYoshinori Sato prt("jmp\tr%d", a->rs); 8884aea3d0cSYoshinori Sato return true; 8894aea3d0cSYoshinori Sato } 8904aea3d0cSYoshinori Sato 8914aea3d0cSYoshinori Sato /* jsr rs */ 8924aea3d0cSYoshinori Sato static bool trans_JSR(DisasContext *ctx, arg_JSR *a) 8934aea3d0cSYoshinori Sato { 8944aea3d0cSYoshinori Sato prt("jsr\tr%d", a->rs); 8954aea3d0cSYoshinori Sato return true; 8964aea3d0cSYoshinori Sato } 8974aea3d0cSYoshinori Sato 8984aea3d0cSYoshinori Sato /* bsr dsp:16 */ 8994aea3d0cSYoshinori Sato /* bsr dsp:24 */ 9004aea3d0cSYoshinori Sato static bool trans_BSR(DisasContext *ctx, arg_BSR *a) 9014aea3d0cSYoshinori Sato { 9024aea3d0cSYoshinori Sato static const char sz[] = {'w', 'a'}; 9034aea3d0cSYoshinori Sato prt("bsr.%c\t%08x", sz[a->sz - 3], ctx->pc + a->dsp); 9044aea3d0cSYoshinori Sato return true; 9054aea3d0cSYoshinori Sato } 9064aea3d0cSYoshinori Sato 9074aea3d0cSYoshinori Sato /* bsr rs */ 9084aea3d0cSYoshinori Sato static bool trans_BSR_l(DisasContext *ctx, arg_BSR_l *a) 9094aea3d0cSYoshinori Sato { 9104aea3d0cSYoshinori Sato prt("bsr.l\tr%d", a->rd); 9114aea3d0cSYoshinori Sato return true; 9124aea3d0cSYoshinori Sato } 9134aea3d0cSYoshinori Sato 9144aea3d0cSYoshinori Sato /* rts */ 9154aea3d0cSYoshinori Sato static bool trans_RTS(DisasContext *ctx, arg_RTS *a) 9164aea3d0cSYoshinori Sato { 9174aea3d0cSYoshinori Sato prt("rts"); 9184aea3d0cSYoshinori Sato return true; 9194aea3d0cSYoshinori Sato } 9204aea3d0cSYoshinori Sato 9214aea3d0cSYoshinori Sato /* nop */ 9224aea3d0cSYoshinori Sato static bool trans_NOP(DisasContext *ctx, arg_NOP *a) 9234aea3d0cSYoshinori Sato { 9244aea3d0cSYoshinori Sato prt("nop"); 9254aea3d0cSYoshinori Sato return true; 9264aea3d0cSYoshinori Sato } 9274aea3d0cSYoshinori Sato 9284aea3d0cSYoshinori Sato /* scmpu */ 9294aea3d0cSYoshinori Sato static bool trans_SCMPU(DisasContext *ctx, arg_SCMPU *a) 9304aea3d0cSYoshinori Sato { 9314aea3d0cSYoshinori Sato prt("scmpu"); 9324aea3d0cSYoshinori Sato return true; 9334aea3d0cSYoshinori Sato } 9344aea3d0cSYoshinori Sato 9354aea3d0cSYoshinori Sato /* smovu */ 9364aea3d0cSYoshinori Sato static bool trans_SMOVU(DisasContext *ctx, arg_SMOVU *a) 9374aea3d0cSYoshinori Sato { 9384aea3d0cSYoshinori Sato prt("smovu"); 9394aea3d0cSYoshinori Sato return true; 9404aea3d0cSYoshinori Sato } 9414aea3d0cSYoshinori Sato 9424aea3d0cSYoshinori Sato /* smovf */ 9434aea3d0cSYoshinori Sato static bool trans_SMOVF(DisasContext *ctx, arg_SMOVF *a) 9444aea3d0cSYoshinori Sato { 9454aea3d0cSYoshinori Sato prt("smovf"); 9464aea3d0cSYoshinori Sato return true; 9474aea3d0cSYoshinori Sato } 9484aea3d0cSYoshinori Sato 9494aea3d0cSYoshinori Sato /* smovb */ 9504aea3d0cSYoshinori Sato static bool trans_SMOVB(DisasContext *ctx, arg_SMOVB *a) 9514aea3d0cSYoshinori Sato { 9524aea3d0cSYoshinori Sato prt("smovb"); 9534aea3d0cSYoshinori Sato return true; 9544aea3d0cSYoshinori Sato } 9554aea3d0cSYoshinori Sato 9564aea3d0cSYoshinori Sato /* suntile */ 9574aea3d0cSYoshinori Sato static bool trans_SUNTIL(DisasContext *ctx, arg_SUNTIL *a) 9584aea3d0cSYoshinori Sato { 9594aea3d0cSYoshinori Sato prt("suntil.%c", size[a->sz]); 9604aea3d0cSYoshinori Sato return true; 9614aea3d0cSYoshinori Sato } 9624aea3d0cSYoshinori Sato 9634aea3d0cSYoshinori Sato /* swhile */ 9644aea3d0cSYoshinori Sato static bool trans_SWHILE(DisasContext *ctx, arg_SWHILE *a) 9654aea3d0cSYoshinori Sato { 9664aea3d0cSYoshinori Sato prt("swhile.%c", size[a->sz]); 9674aea3d0cSYoshinori Sato return true; 9684aea3d0cSYoshinori Sato } 9694aea3d0cSYoshinori Sato /* sstr */ 9704aea3d0cSYoshinori Sato static bool trans_SSTR(DisasContext *ctx, arg_SSTR *a) 9714aea3d0cSYoshinori Sato { 9724aea3d0cSYoshinori Sato prt("sstr.%c", size[a->sz]); 9734aea3d0cSYoshinori Sato return true; 9744aea3d0cSYoshinori Sato } 9754aea3d0cSYoshinori Sato 9764aea3d0cSYoshinori Sato /* rmpa */ 9774aea3d0cSYoshinori Sato static bool trans_RMPA(DisasContext *ctx, arg_RMPA *a) 9784aea3d0cSYoshinori Sato { 9794aea3d0cSYoshinori Sato prt("rmpa.%c", size[a->sz]); 9804aea3d0cSYoshinori Sato return true; 9814aea3d0cSYoshinori Sato } 9824aea3d0cSYoshinori Sato 9834aea3d0cSYoshinori Sato /* mulhi rs,rs2 */ 9844aea3d0cSYoshinori Sato static bool trans_MULHI(DisasContext *ctx, arg_MULHI *a) 9854aea3d0cSYoshinori Sato { 9864aea3d0cSYoshinori Sato prt("mulhi\tr%d,r%d", a->rs, a->rs2); 9874aea3d0cSYoshinori Sato return true; 9884aea3d0cSYoshinori Sato } 9894aea3d0cSYoshinori Sato 9904aea3d0cSYoshinori Sato /* mullo rs,rs2 */ 9914aea3d0cSYoshinori Sato static bool trans_MULLO(DisasContext *ctx, arg_MULLO *a) 9924aea3d0cSYoshinori Sato { 9934aea3d0cSYoshinori Sato prt("mullo\tr%d, r%d", a->rs, a->rs2); 9944aea3d0cSYoshinori Sato return true; 9954aea3d0cSYoshinori Sato } 9964aea3d0cSYoshinori Sato 9974aea3d0cSYoshinori Sato /* machi rs,rs2 */ 9984aea3d0cSYoshinori Sato static bool trans_MACHI(DisasContext *ctx, arg_MACHI *a) 9994aea3d0cSYoshinori Sato { 10004aea3d0cSYoshinori Sato prt("machi\tr%d, r%d", a->rs, a->rs2); 10014aea3d0cSYoshinori Sato return true; 10024aea3d0cSYoshinori Sato } 10034aea3d0cSYoshinori Sato 10044aea3d0cSYoshinori Sato /* maclo rs,rs2 */ 10054aea3d0cSYoshinori Sato static bool trans_MACLO(DisasContext *ctx, arg_MACLO *a) 10064aea3d0cSYoshinori Sato { 10074aea3d0cSYoshinori Sato prt("maclo\tr%d, r%d", a->rs, a->rs2); 10084aea3d0cSYoshinori Sato return true; 10094aea3d0cSYoshinori Sato } 10104aea3d0cSYoshinori Sato 10114aea3d0cSYoshinori Sato /* mvfachi rd */ 10124aea3d0cSYoshinori Sato static bool trans_MVFACHI(DisasContext *ctx, arg_MVFACHI *a) 10134aea3d0cSYoshinori Sato { 10144aea3d0cSYoshinori Sato prt("mvfachi\tr%d", a->rd); 10154aea3d0cSYoshinori Sato return true; 10164aea3d0cSYoshinori Sato } 10174aea3d0cSYoshinori Sato 10184aea3d0cSYoshinori Sato /* mvfacmi rd */ 10194aea3d0cSYoshinori Sato static bool trans_MVFACMI(DisasContext *ctx, arg_MVFACMI *a) 10204aea3d0cSYoshinori Sato { 10214aea3d0cSYoshinori Sato prt("mvfacmi\tr%d", a->rd); 10224aea3d0cSYoshinori Sato return true; 10234aea3d0cSYoshinori Sato } 10244aea3d0cSYoshinori Sato 10254aea3d0cSYoshinori Sato /* mvtachi rs */ 10264aea3d0cSYoshinori Sato static bool trans_MVTACHI(DisasContext *ctx, arg_MVTACHI *a) 10274aea3d0cSYoshinori Sato { 10284aea3d0cSYoshinori Sato prt("mvtachi\tr%d", a->rs); 10294aea3d0cSYoshinori Sato return true; 10304aea3d0cSYoshinori Sato } 10314aea3d0cSYoshinori Sato 10324aea3d0cSYoshinori Sato /* mvtaclo rs */ 10334aea3d0cSYoshinori Sato static bool trans_MVTACLO(DisasContext *ctx, arg_MVTACLO *a) 10344aea3d0cSYoshinori Sato { 10354aea3d0cSYoshinori Sato prt("mvtaclo\tr%d", a->rs); 10364aea3d0cSYoshinori Sato return true; 10374aea3d0cSYoshinori Sato } 10384aea3d0cSYoshinori Sato 10394aea3d0cSYoshinori Sato /* racw #imm */ 10404aea3d0cSYoshinori Sato static bool trans_RACW(DisasContext *ctx, arg_RACW *a) 10414aea3d0cSYoshinori Sato { 10424aea3d0cSYoshinori Sato prt("racw\t#%d", a->imm + 1); 10434aea3d0cSYoshinori Sato return true; 10444aea3d0cSYoshinori Sato } 10454aea3d0cSYoshinori Sato 10464aea3d0cSYoshinori Sato /* sat rd */ 10474aea3d0cSYoshinori Sato static bool trans_SAT(DisasContext *ctx, arg_SAT *a) 10484aea3d0cSYoshinori Sato { 10494aea3d0cSYoshinori Sato prt("sat\tr%d", a->rd); 10504aea3d0cSYoshinori Sato return true; 10514aea3d0cSYoshinori Sato } 10524aea3d0cSYoshinori Sato 10534aea3d0cSYoshinori Sato /* satr */ 10544aea3d0cSYoshinori Sato static bool trans_SATR(DisasContext *ctx, arg_SATR *a) 10554aea3d0cSYoshinori Sato { 10564aea3d0cSYoshinori Sato prt("satr"); 10574aea3d0cSYoshinori Sato return true; 10584aea3d0cSYoshinori Sato } 10594aea3d0cSYoshinori Sato 10604aea3d0cSYoshinori Sato /* fadd #imm, rd */ 10614aea3d0cSYoshinori Sato static bool trans_FADD_ir(DisasContext *ctx, arg_FADD_ir *a) 10624aea3d0cSYoshinori Sato { 10634aea3d0cSYoshinori Sato prt("fadd\t#%d,r%d", li(ctx, 0), a->rd); 10644aea3d0cSYoshinori Sato return true; 10654aea3d0cSYoshinori Sato } 10664aea3d0cSYoshinori Sato 10674aea3d0cSYoshinori Sato /* fadd dsp[rs], rd */ 10684aea3d0cSYoshinori Sato /* fadd rs, rd */ 10694aea3d0cSYoshinori Sato static bool trans_FADD_mr(DisasContext *ctx, arg_FADD_mr *a) 10704aea3d0cSYoshinori Sato { 1071e283adeaSRichard Henderson prt_ldmi(ctx, "fadd", a->ld, RX_IM_LONG, a->rs, a->rd); 10724aea3d0cSYoshinori Sato return true; 10734aea3d0cSYoshinori Sato } 10744aea3d0cSYoshinori Sato 10754aea3d0cSYoshinori Sato /* fcmp #imm, rd */ 10764aea3d0cSYoshinori Sato static bool trans_FCMP_ir(DisasContext *ctx, arg_FCMP_ir *a) 10774aea3d0cSYoshinori Sato { 10784aea3d0cSYoshinori Sato prt("fadd\t#%d,r%d", li(ctx, 0), a->rd); 10794aea3d0cSYoshinori Sato return true; 10804aea3d0cSYoshinori Sato } 10814aea3d0cSYoshinori Sato 10824aea3d0cSYoshinori Sato /* fcmp dsp[rs], rd */ 10834aea3d0cSYoshinori Sato /* fcmp rs, rd */ 10844aea3d0cSYoshinori Sato static bool trans_FCMP_mr(DisasContext *ctx, arg_FCMP_mr *a) 10854aea3d0cSYoshinori Sato { 1086e283adeaSRichard Henderson prt_ldmi(ctx, "fcmp", a->ld, RX_IM_LONG, a->rs, a->rd); 10874aea3d0cSYoshinori Sato return true; 10884aea3d0cSYoshinori Sato } 10894aea3d0cSYoshinori Sato 10904aea3d0cSYoshinori Sato /* fsub #imm, rd */ 10914aea3d0cSYoshinori Sato static bool trans_FSUB_ir(DisasContext *ctx, arg_FSUB_ir *a) 10924aea3d0cSYoshinori Sato { 10934aea3d0cSYoshinori Sato prt("fsub\t#%d,r%d", li(ctx, 0), a->rd); 10944aea3d0cSYoshinori Sato return true; 10954aea3d0cSYoshinori Sato } 10964aea3d0cSYoshinori Sato 10974aea3d0cSYoshinori Sato /* fsub dsp[rs], rd */ 10984aea3d0cSYoshinori Sato /* fsub rs, rd */ 10994aea3d0cSYoshinori Sato static bool trans_FSUB_mr(DisasContext *ctx, arg_FSUB_mr *a) 11004aea3d0cSYoshinori Sato { 1101e283adeaSRichard Henderson prt_ldmi(ctx, "fsub", a->ld, RX_IM_LONG, a->rs, a->rd); 11024aea3d0cSYoshinori Sato return true; 11034aea3d0cSYoshinori Sato } 11044aea3d0cSYoshinori Sato 11054aea3d0cSYoshinori Sato /* ftoi dsp[rs], rd */ 11064aea3d0cSYoshinori Sato /* ftoi rs, rd */ 11074aea3d0cSYoshinori Sato static bool trans_FTOI(DisasContext *ctx, arg_FTOI *a) 11084aea3d0cSYoshinori Sato { 1109e283adeaSRichard Henderson prt_ldmi(ctx, "ftoi", a->ld, RX_IM_LONG, a->rs, a->rd); 11104aea3d0cSYoshinori Sato return true; 11114aea3d0cSYoshinori Sato } 11124aea3d0cSYoshinori Sato 11134aea3d0cSYoshinori Sato /* fmul #imm, rd */ 11144aea3d0cSYoshinori Sato static bool trans_FMUL_ir(DisasContext *ctx, arg_FMUL_ir *a) 11154aea3d0cSYoshinori Sato { 11164aea3d0cSYoshinori Sato prt("fmul\t#%d,r%d", li(ctx, 0), a->rd); 11174aea3d0cSYoshinori Sato return true; 11184aea3d0cSYoshinori Sato } 11194aea3d0cSYoshinori Sato 11204aea3d0cSYoshinori Sato /* fmul dsp[rs], rd */ 11214aea3d0cSYoshinori Sato /* fmul rs, rd */ 11224aea3d0cSYoshinori Sato static bool trans_FMUL_mr(DisasContext *ctx, arg_FMUL_mr *a) 11234aea3d0cSYoshinori Sato { 1124e283adeaSRichard Henderson prt_ldmi(ctx, "fmul", a->ld, RX_IM_LONG, a->rs, a->rd); 11254aea3d0cSYoshinori Sato return true; 11264aea3d0cSYoshinori Sato } 11274aea3d0cSYoshinori Sato 11284aea3d0cSYoshinori Sato /* fdiv #imm, rd */ 11294aea3d0cSYoshinori Sato static bool trans_FDIV_ir(DisasContext *ctx, arg_FDIV_ir *a) 11304aea3d0cSYoshinori Sato { 11314aea3d0cSYoshinori Sato prt("fdiv\t#%d,r%d", li(ctx, 0), a->rd); 11324aea3d0cSYoshinori Sato return true; 11334aea3d0cSYoshinori Sato } 11344aea3d0cSYoshinori Sato 11354aea3d0cSYoshinori Sato /* fdiv dsp[rs], rd */ 11364aea3d0cSYoshinori Sato /* fdiv rs, rd */ 11374aea3d0cSYoshinori Sato static bool trans_FDIV_mr(DisasContext *ctx, arg_FDIV_mr *a) 11384aea3d0cSYoshinori Sato { 1139e283adeaSRichard Henderson prt_ldmi(ctx, "fdiv", a->ld, RX_IM_LONG, a->rs, a->rd); 11404aea3d0cSYoshinori Sato return true; 11414aea3d0cSYoshinori Sato } 11424aea3d0cSYoshinori Sato 11434aea3d0cSYoshinori Sato /* round dsp[rs], rd */ 11444aea3d0cSYoshinori Sato /* round rs, rd */ 11454aea3d0cSYoshinori Sato static bool trans_ROUND(DisasContext *ctx, arg_ROUND *a) 11464aea3d0cSYoshinori Sato { 1147e283adeaSRichard Henderson prt_ldmi(ctx, "round", a->ld, RX_IM_LONG, a->rs, a->rd); 11484aea3d0cSYoshinori Sato return true; 11494aea3d0cSYoshinori Sato } 11504aea3d0cSYoshinori Sato 11514aea3d0cSYoshinori Sato /* itof rs, rd */ 11524aea3d0cSYoshinori Sato /* itof dsp[rs], rd */ 11534aea3d0cSYoshinori Sato static bool trans_ITOF(DisasContext *ctx, arg_ITOF *a) 11544aea3d0cSYoshinori Sato { 1155e283adeaSRichard Henderson prt_ldmi(ctx, "itof", a->ld, RX_IM_LONG, a->rs, a->rd); 11564aea3d0cSYoshinori Sato return true; 11574aea3d0cSYoshinori Sato } 11584aea3d0cSYoshinori Sato 11594aea3d0cSYoshinori Sato #define BOP_IM(name, reg) \ 11604aea3d0cSYoshinori Sato do { \ 1161fa6289e2SRichard Henderson char dsp[8]; \ 1162fa6289e2SRichard Henderson rx_index_addr(ctx, dsp, a->ld, RX_MEMORY_BYTE); \ 1163fa6289e2SRichard Henderson prt("b%s\t#%d, %s[r%d]", #name, a->imm, dsp, reg); \ 11644aea3d0cSYoshinori Sato return true; \ 11654aea3d0cSYoshinori Sato } while (0) 11664aea3d0cSYoshinori Sato 11674aea3d0cSYoshinori Sato #define BOP_RM(name) \ 11684aea3d0cSYoshinori Sato do { \ 1169fa6289e2SRichard Henderson char dsp[8]; \ 1170fa6289e2SRichard Henderson rx_index_addr(ctx, dsp, a->ld, RX_MEMORY_BYTE); \ 1171fa6289e2SRichard Henderson prt("b%s\tr%d, %s[r%d]", #name, a->rd, dsp, a->rs); \ 11724aea3d0cSYoshinori Sato return true; \ 11734aea3d0cSYoshinori Sato } while (0) 11744aea3d0cSYoshinori Sato 11754aea3d0cSYoshinori Sato /* bset #imm, dsp[rd] */ 11764aea3d0cSYoshinori Sato static bool trans_BSET_im(DisasContext *ctx, arg_BSET_im *a) 11774aea3d0cSYoshinori Sato { 11784aea3d0cSYoshinori Sato BOP_IM(bset, a->rs); 11794aea3d0cSYoshinori Sato } 11804aea3d0cSYoshinori Sato 11814aea3d0cSYoshinori Sato /* bset rs, dsp[rd] */ 11824aea3d0cSYoshinori Sato static bool trans_BSET_rm(DisasContext *ctx, arg_BSET_rm *a) 11834aea3d0cSYoshinori Sato { 11844aea3d0cSYoshinori Sato BOP_RM(set); 11854aea3d0cSYoshinori Sato } 11864aea3d0cSYoshinori Sato 11874aea3d0cSYoshinori Sato /* bset rs, rd */ 11884aea3d0cSYoshinori Sato static bool trans_BSET_rr(DisasContext *ctx, arg_BSET_rr *a) 11894aea3d0cSYoshinori Sato { 11904aea3d0cSYoshinori Sato prt("bset\tr%d,r%d", a->rs, a->rd); 11914aea3d0cSYoshinori Sato return true; 11924aea3d0cSYoshinori Sato } 11934aea3d0cSYoshinori Sato 11944aea3d0cSYoshinori Sato /* bset #imm, rd */ 11954aea3d0cSYoshinori Sato static bool trans_BSET_ir(DisasContext *ctx, arg_BSET_ir *a) 11964aea3d0cSYoshinori Sato { 11974aea3d0cSYoshinori Sato prt("bset\t#%d, r%d", a->imm, a->rd); 11984aea3d0cSYoshinori Sato return true; 11994aea3d0cSYoshinori Sato } 12004aea3d0cSYoshinori Sato 12014aea3d0cSYoshinori Sato /* bclr #imm, dsp[rd] */ 12024aea3d0cSYoshinori Sato static bool trans_BCLR_im(DisasContext *ctx, arg_BCLR_im *a) 12034aea3d0cSYoshinori Sato { 12044aea3d0cSYoshinori Sato BOP_IM(clr, a->rs); 12054aea3d0cSYoshinori Sato } 12064aea3d0cSYoshinori Sato 12074aea3d0cSYoshinori Sato /* bclr rs, dsp[rd] */ 12084aea3d0cSYoshinori Sato static bool trans_BCLR_rm(DisasContext *ctx, arg_BCLR_rm *a) 12094aea3d0cSYoshinori Sato { 12104aea3d0cSYoshinori Sato BOP_RM(clr); 12114aea3d0cSYoshinori Sato } 12124aea3d0cSYoshinori Sato 12134aea3d0cSYoshinori Sato /* bclr rs, rd */ 12144aea3d0cSYoshinori Sato static bool trans_BCLR_rr(DisasContext *ctx, arg_BCLR_rr *a) 12154aea3d0cSYoshinori Sato { 12164aea3d0cSYoshinori Sato prt("bclr\tr%d, r%d", a->rs, a->rd); 12174aea3d0cSYoshinori Sato return true; 12184aea3d0cSYoshinori Sato } 12194aea3d0cSYoshinori Sato 12204aea3d0cSYoshinori Sato /* bclr #imm, rd */ 12214aea3d0cSYoshinori Sato static bool trans_BCLR_ir(DisasContext *ctx, arg_BCLR_ir *a) 12224aea3d0cSYoshinori Sato { 12234aea3d0cSYoshinori Sato prt("bclr\t#%d,r%d", a->imm, a->rd); 12244aea3d0cSYoshinori Sato return true; 12254aea3d0cSYoshinori Sato } 12264aea3d0cSYoshinori Sato 12274aea3d0cSYoshinori Sato /* btst #imm, dsp[rd] */ 12284aea3d0cSYoshinori Sato static bool trans_BTST_im(DisasContext *ctx, arg_BTST_im *a) 12294aea3d0cSYoshinori Sato { 12304aea3d0cSYoshinori Sato BOP_IM(tst, a->rs); 12314aea3d0cSYoshinori Sato } 12324aea3d0cSYoshinori Sato 12334aea3d0cSYoshinori Sato /* btst rs, dsp[rd] */ 12344aea3d0cSYoshinori Sato static bool trans_BTST_rm(DisasContext *ctx, arg_BTST_rm *a) 12354aea3d0cSYoshinori Sato { 12364aea3d0cSYoshinori Sato BOP_RM(tst); 12374aea3d0cSYoshinori Sato } 12384aea3d0cSYoshinori Sato 12394aea3d0cSYoshinori Sato /* btst rs, rd */ 12404aea3d0cSYoshinori Sato static bool trans_BTST_rr(DisasContext *ctx, arg_BTST_rr *a) 12414aea3d0cSYoshinori Sato { 12424aea3d0cSYoshinori Sato prt("btst\tr%d, r%d", a->rs, a->rd); 12434aea3d0cSYoshinori Sato return true; 12444aea3d0cSYoshinori Sato } 12454aea3d0cSYoshinori Sato 12464aea3d0cSYoshinori Sato /* btst #imm, rd */ 12474aea3d0cSYoshinori Sato static bool trans_BTST_ir(DisasContext *ctx, arg_BTST_ir *a) 12484aea3d0cSYoshinori Sato { 12494aea3d0cSYoshinori Sato prt("btst\t#%d, r%d", a->imm, a->rd); 12504aea3d0cSYoshinori Sato return true; 12514aea3d0cSYoshinori Sato } 12524aea3d0cSYoshinori Sato 12534aea3d0cSYoshinori Sato /* bnot rs, dsp[rd] */ 12544aea3d0cSYoshinori Sato static bool trans_BNOT_rm(DisasContext *ctx, arg_BNOT_rm *a) 12554aea3d0cSYoshinori Sato { 12564aea3d0cSYoshinori Sato BOP_RM(not); 12574aea3d0cSYoshinori Sato } 12584aea3d0cSYoshinori Sato 12594aea3d0cSYoshinori Sato /* bnot rs, rd */ 12604aea3d0cSYoshinori Sato static bool trans_BNOT_rr(DisasContext *ctx, arg_BNOT_rr *a) 12614aea3d0cSYoshinori Sato { 12624aea3d0cSYoshinori Sato prt("bnot\tr%d, r%d", a->rs, a->rd); 12634aea3d0cSYoshinori Sato return true; 12644aea3d0cSYoshinori Sato } 12654aea3d0cSYoshinori Sato 12664aea3d0cSYoshinori Sato /* bnot #imm, dsp[rd] */ 12674aea3d0cSYoshinori Sato static bool trans_BNOT_im(DisasContext *ctx, arg_BNOT_im *a) 12684aea3d0cSYoshinori Sato { 12694aea3d0cSYoshinori Sato BOP_IM(not, a->rs); 12704aea3d0cSYoshinori Sato } 12714aea3d0cSYoshinori Sato 12724aea3d0cSYoshinori Sato /* bnot #imm, rd */ 12734aea3d0cSYoshinori Sato static bool trans_BNOT_ir(DisasContext *ctx, arg_BNOT_ir *a) 12744aea3d0cSYoshinori Sato { 12754aea3d0cSYoshinori Sato prt("bnot\t#%d, r%d", a->imm, a->rd); 12764aea3d0cSYoshinori Sato return true; 12774aea3d0cSYoshinori Sato } 12784aea3d0cSYoshinori Sato 12794aea3d0cSYoshinori Sato /* bmcond #imm, dsp[rd] */ 12804aea3d0cSYoshinori Sato static bool trans_BMCnd_im(DisasContext *ctx, arg_BMCnd_im *a) 12814aea3d0cSYoshinori Sato { 1282fa6289e2SRichard Henderson char dsp[8]; 1283fa6289e2SRichard Henderson 1284fa6289e2SRichard Henderson rx_index_addr(ctx, dsp, a->ld, RX_MEMORY_BYTE); 1285fa6289e2SRichard Henderson prt("bm%s\t#%d, %s[r%d]", cond[a->cd], a->imm, dsp, a->rd); 12864aea3d0cSYoshinori Sato return true; 12874aea3d0cSYoshinori Sato } 12884aea3d0cSYoshinori Sato 12894aea3d0cSYoshinori Sato /* bmcond #imm, rd */ 12904aea3d0cSYoshinori Sato static bool trans_BMCnd_ir(DisasContext *ctx, arg_BMCnd_ir *a) 12914aea3d0cSYoshinori Sato { 12924aea3d0cSYoshinori Sato prt("bm%s\t#%d, r%d", cond[a->cd], a->imm, a->rd); 12934aea3d0cSYoshinori Sato return true; 12944aea3d0cSYoshinori Sato } 12954aea3d0cSYoshinori Sato 12964aea3d0cSYoshinori Sato /* clrpsw psw */ 12974aea3d0cSYoshinori Sato static bool trans_CLRPSW(DisasContext *ctx, arg_CLRPSW *a) 12984aea3d0cSYoshinori Sato { 12994aea3d0cSYoshinori Sato prt("clrpsw\t%c", psw[a->cb]); 13004aea3d0cSYoshinori Sato return true; 13014aea3d0cSYoshinori Sato } 13024aea3d0cSYoshinori Sato 13034aea3d0cSYoshinori Sato /* setpsw psw */ 13044aea3d0cSYoshinori Sato static bool trans_SETPSW(DisasContext *ctx, arg_SETPSW *a) 13054aea3d0cSYoshinori Sato { 13064aea3d0cSYoshinori Sato prt("setpsw\t%c", psw[a->cb]); 13074aea3d0cSYoshinori Sato return true; 13084aea3d0cSYoshinori Sato } 13094aea3d0cSYoshinori Sato 13104aea3d0cSYoshinori Sato /* mvtipl #imm */ 13114aea3d0cSYoshinori Sato static bool trans_MVTIPL(DisasContext *ctx, arg_MVTIPL *a) 13124aea3d0cSYoshinori Sato { 13134aea3d0cSYoshinori Sato prt("movtipl\t#%d", a->imm); 13144aea3d0cSYoshinori Sato return true; 13154aea3d0cSYoshinori Sato } 13164aea3d0cSYoshinori Sato 13174aea3d0cSYoshinori Sato /* mvtc #imm, rd */ 13184aea3d0cSYoshinori Sato static bool trans_MVTC_i(DisasContext *ctx, arg_MVTC_i *a) 13194aea3d0cSYoshinori Sato { 13204aea3d0cSYoshinori Sato prt("mvtc\t#0x%08x, %s", a->imm, rx_crname(a->cr)); 13214aea3d0cSYoshinori Sato return true; 13224aea3d0cSYoshinori Sato } 13234aea3d0cSYoshinori Sato 13244aea3d0cSYoshinori Sato /* mvtc rs, rd */ 13254aea3d0cSYoshinori Sato static bool trans_MVTC_r(DisasContext *ctx, arg_MVTC_r *a) 13264aea3d0cSYoshinori Sato { 13274aea3d0cSYoshinori Sato prt("mvtc\tr%d, %s", a->rs, rx_crname(a->cr)); 13284aea3d0cSYoshinori Sato return true; 13294aea3d0cSYoshinori Sato } 13304aea3d0cSYoshinori Sato 13314aea3d0cSYoshinori Sato /* mvfc rs, rd */ 13324aea3d0cSYoshinori Sato static bool trans_MVFC(DisasContext *ctx, arg_MVFC *a) 13334aea3d0cSYoshinori Sato { 13344aea3d0cSYoshinori Sato prt("mvfc\t%s, r%d", rx_crname(a->cr), a->rd); 13354aea3d0cSYoshinori Sato return true; 13364aea3d0cSYoshinori Sato } 13374aea3d0cSYoshinori Sato 13384aea3d0cSYoshinori Sato /* rtfi */ 13394aea3d0cSYoshinori Sato static bool trans_RTFI(DisasContext *ctx, arg_RTFI *a) 13404aea3d0cSYoshinori Sato { 13414aea3d0cSYoshinori Sato prt("rtfi"); 13424aea3d0cSYoshinori Sato return true; 13434aea3d0cSYoshinori Sato } 13444aea3d0cSYoshinori Sato 13454aea3d0cSYoshinori Sato /* rte */ 13464aea3d0cSYoshinori Sato static bool trans_RTE(DisasContext *ctx, arg_RTE *a) 13474aea3d0cSYoshinori Sato { 13484aea3d0cSYoshinori Sato prt("rte"); 13494aea3d0cSYoshinori Sato return true; 13504aea3d0cSYoshinori Sato } 13514aea3d0cSYoshinori Sato 13524aea3d0cSYoshinori Sato /* brk */ 13534aea3d0cSYoshinori Sato static bool trans_BRK(DisasContext *ctx, arg_BRK *a) 13544aea3d0cSYoshinori Sato { 13554aea3d0cSYoshinori Sato prt("brk"); 13564aea3d0cSYoshinori Sato return true; 13574aea3d0cSYoshinori Sato } 13584aea3d0cSYoshinori Sato 13594aea3d0cSYoshinori Sato /* int #imm */ 13604aea3d0cSYoshinori Sato static bool trans_INT(DisasContext *ctx, arg_INT *a) 13614aea3d0cSYoshinori Sato { 13624aea3d0cSYoshinori Sato prt("int\t#%d", a->imm); 13634aea3d0cSYoshinori Sato return true; 13644aea3d0cSYoshinori Sato } 13654aea3d0cSYoshinori Sato 13664aea3d0cSYoshinori Sato /* wait */ 13674aea3d0cSYoshinori Sato static bool trans_WAIT(DisasContext *ctx, arg_WAIT *a) 13684aea3d0cSYoshinori Sato { 13694aea3d0cSYoshinori Sato prt("wait"); 13704aea3d0cSYoshinori Sato return true; 13714aea3d0cSYoshinori Sato } 13724aea3d0cSYoshinori Sato 13734aea3d0cSYoshinori Sato /* sccnd.[bwl] rd */ 13744aea3d0cSYoshinori Sato /* sccnd.[bwl] dsp:[rd] */ 13754aea3d0cSYoshinori Sato static bool trans_SCCnd(DisasContext *ctx, arg_SCCnd *a) 13764aea3d0cSYoshinori Sato { 13774aea3d0cSYoshinori Sato if (a->ld < 3) { 1378fa6289e2SRichard Henderson char dsp[8]; 1379fa6289e2SRichard Henderson rx_index_addr(ctx, dsp, a->sz, a->ld); 1380fa6289e2SRichard Henderson prt("sc%s.%c\t%s[r%d]", cond[a->cd], size[a->sz], dsp, a->rd); 13814aea3d0cSYoshinori Sato } else { 1382fa6289e2SRichard Henderson prt("sc%s.%c\tr%d", cond[a->cd], size[a->sz], a->rd); 13834aea3d0cSYoshinori Sato } 13844aea3d0cSYoshinori Sato return true; 13854aea3d0cSYoshinori Sato } 13864aea3d0cSYoshinori Sato 13874aea3d0cSYoshinori Sato int print_insn_rx(bfd_vma addr, disassemble_info *dis) 13884aea3d0cSYoshinori Sato { 13894aea3d0cSYoshinori Sato DisasContext ctx; 13904aea3d0cSYoshinori Sato uint32_t insn; 13914aea3d0cSYoshinori Sato int i; 13924aea3d0cSYoshinori Sato ctx.dis = dis; 13934aea3d0cSYoshinori Sato ctx.pc = ctx.addr = addr; 13944aea3d0cSYoshinori Sato 13954aea3d0cSYoshinori Sato insn = decode_load(&ctx); 13964aea3d0cSYoshinori Sato if (!decode(&ctx, insn)) { 13974aea3d0cSYoshinori Sato ctx.dis->fprintf_func(ctx.dis->stream, ".byte\t"); 13984aea3d0cSYoshinori Sato for (i = 0; i < ctx.addr - addr; i++) { 13994aea3d0cSYoshinori Sato if (i > 0) { 14004aea3d0cSYoshinori Sato ctx.dis->fprintf_func(ctx.dis->stream, ","); 14014aea3d0cSYoshinori Sato } 14024aea3d0cSYoshinori Sato ctx.dis->fprintf_func(ctx.dis->stream, "0x%02x", insn >> 24); 14034aea3d0cSYoshinori Sato insn <<= 8; 14044aea3d0cSYoshinori Sato } 14054aea3d0cSYoshinori Sato } 14064aea3d0cSYoshinori Sato return ctx.addr - addr; 14074aea3d0cSYoshinori Sato } 1408