xref: /openbmc/qemu/target/rx/disas.c (revision e283adea)
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 
138*e283adeaSRichard Henderson static void prt_ldmi(DisasContext *ctx, const char *insn,
139*e283adeaSRichard 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);
146*e283adeaSRichard Henderson         prt("%s\t%s[r%d]%s, r%d", insn, dsp, rs, sizes[mi], rd);
1474aea3d0cSYoshinori Sato     } else {
148*e283adeaSRichard 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 {
3694aea3d0cSYoshinori Sato     static const char msize[][4] = {
3704aea3d0cSYoshinori Sato         "b", "w", "l", "ub", "uw",
3714aea3d0cSYoshinori Sato     };
372fa6289e2SRichard Henderson     char dsp[8];
3734aea3d0cSYoshinori Sato 
374fa6289e2SRichard Henderson     rx_index_addr(ctx, dsp, a->ld, a->mi);
375fa6289e2SRichard Henderson     prt("xchg\t%s[r%d].%s, r%d", dsp, a->rs, msize[a->mi], a->rd);
3764aea3d0cSYoshinori Sato     return true;
3774aea3d0cSYoshinori Sato }
3784aea3d0cSYoshinori Sato 
3794aea3d0cSYoshinori Sato /* stz #imm,rd */
3804aea3d0cSYoshinori Sato static bool trans_STZ(DisasContext *ctx, arg_STZ *a)
3814aea3d0cSYoshinori Sato {
3824aea3d0cSYoshinori Sato     prt_ir(ctx, "stz", a->imm, a->rd);
3834aea3d0cSYoshinori Sato     return true;
3844aea3d0cSYoshinori Sato }
3854aea3d0cSYoshinori Sato 
3864aea3d0cSYoshinori Sato /* stnz #imm,rd */
3874aea3d0cSYoshinori Sato static bool trans_STNZ(DisasContext *ctx, arg_STNZ *a)
3884aea3d0cSYoshinori Sato {
3894aea3d0cSYoshinori Sato     prt_ir(ctx, "stnz", a->imm, a->rd);
3904aea3d0cSYoshinori Sato     return true;
3914aea3d0cSYoshinori Sato }
3924aea3d0cSYoshinori Sato 
3934aea3d0cSYoshinori Sato /* rtsd #imm */
3944aea3d0cSYoshinori Sato static bool trans_RTSD_i(DisasContext *ctx, arg_RTSD_i *a)
3954aea3d0cSYoshinori Sato {
3964aea3d0cSYoshinori Sato     prt("rtsd\t#%d", a->imm << 2);
3974aea3d0cSYoshinori Sato     return true;
3984aea3d0cSYoshinori Sato }
3994aea3d0cSYoshinori Sato 
4004aea3d0cSYoshinori Sato /* rtsd #imm, rd-rd2 */
4014aea3d0cSYoshinori Sato static bool trans_RTSD_irr(DisasContext *ctx, arg_RTSD_irr *a)
4024aea3d0cSYoshinori Sato {
4034aea3d0cSYoshinori Sato     prt("rtsd\t#%d, r%d - r%d", a->imm << 2, a->rd, a->rd2);
4044aea3d0cSYoshinori Sato     return true;
4054aea3d0cSYoshinori Sato }
4064aea3d0cSYoshinori Sato 
4074aea3d0cSYoshinori Sato /* and #uimm:4, rd */
4084aea3d0cSYoshinori Sato /* and #imm, rd */
4094aea3d0cSYoshinori Sato static bool trans_AND_ir(DisasContext *ctx, arg_AND_ir *a)
4104aea3d0cSYoshinori Sato {
4114aea3d0cSYoshinori Sato     prt_ir(ctx, "and", a->imm, a->rd);
4124aea3d0cSYoshinori Sato     return true;
4134aea3d0cSYoshinori Sato }
4144aea3d0cSYoshinori Sato 
4154aea3d0cSYoshinori Sato /* and dsp[rs], rd */
4164aea3d0cSYoshinori Sato /* and rs,rd */
4174aea3d0cSYoshinori Sato static bool trans_AND_mr(DisasContext *ctx, arg_AND_mr *a)
4184aea3d0cSYoshinori Sato {
419*e283adeaSRichard Henderson     prt_ldmi(ctx, "and", a->ld, a->mi, a->rs, a->rd);
4204aea3d0cSYoshinori Sato     return true;
4214aea3d0cSYoshinori Sato }
4224aea3d0cSYoshinori Sato 
4234aea3d0cSYoshinori Sato /* and rs,rs2,rd */
4244aea3d0cSYoshinori Sato static bool trans_AND_rrr(DisasContext *ctx, arg_AND_rrr *a)
4254aea3d0cSYoshinori Sato {
4264aea3d0cSYoshinori Sato     prt("and\tr%d,r%d, r%d", a->rs, a->rs2, a->rd);
4274aea3d0cSYoshinori Sato     return true;
4284aea3d0cSYoshinori Sato }
4294aea3d0cSYoshinori Sato 
4304aea3d0cSYoshinori Sato /* or #uimm:4, rd */
4314aea3d0cSYoshinori Sato /* or #imm, rd */
4324aea3d0cSYoshinori Sato static bool trans_OR_ir(DisasContext *ctx, arg_OR_ir *a)
4334aea3d0cSYoshinori Sato {
4344aea3d0cSYoshinori Sato     prt_ir(ctx, "or", a->imm, a->rd);
4354aea3d0cSYoshinori Sato     return true;
4364aea3d0cSYoshinori Sato }
4374aea3d0cSYoshinori Sato 
4384aea3d0cSYoshinori Sato /* or dsp[rs], rd */
4394aea3d0cSYoshinori Sato /* or rs,rd */
4404aea3d0cSYoshinori Sato static bool trans_OR_mr(DisasContext *ctx, arg_OR_mr *a)
4414aea3d0cSYoshinori Sato {
442*e283adeaSRichard Henderson     prt_ldmi(ctx, "or", a->ld, a->mi, a->rs, a->rd);
4434aea3d0cSYoshinori Sato     return true;
4444aea3d0cSYoshinori Sato }
4454aea3d0cSYoshinori Sato 
4464aea3d0cSYoshinori Sato /* or rs,rs2,rd */
4474aea3d0cSYoshinori Sato static bool trans_OR_rrr(DisasContext *ctx, arg_OR_rrr *a)
4484aea3d0cSYoshinori Sato {
4494aea3d0cSYoshinori Sato     prt("or\tr%d, r%d, r%d", a->rs, a->rs2, a->rd);
4504aea3d0cSYoshinori Sato     return true;
4514aea3d0cSYoshinori Sato }
4524aea3d0cSYoshinori Sato 
4534aea3d0cSYoshinori Sato /* xor #imm, rd */
4544aea3d0cSYoshinori Sato static bool trans_XOR_ir(DisasContext *ctx, arg_XOR_ir *a)
4554aea3d0cSYoshinori Sato {
4564aea3d0cSYoshinori Sato     prt_ir(ctx, "xor", a->imm, a->rd);
4574aea3d0cSYoshinori Sato     return true;
4584aea3d0cSYoshinori Sato }
4594aea3d0cSYoshinori Sato 
4604aea3d0cSYoshinori Sato /* xor dsp[rs], rd */
4614aea3d0cSYoshinori Sato /* xor rs,rd */
4624aea3d0cSYoshinori Sato static bool trans_XOR_mr(DisasContext *ctx, arg_XOR_mr *a)
4634aea3d0cSYoshinori Sato {
464*e283adeaSRichard Henderson     prt_ldmi(ctx, "xor", a->ld, a->mi, a->rs, a->rd);
4654aea3d0cSYoshinori Sato     return true;
4664aea3d0cSYoshinori Sato }
4674aea3d0cSYoshinori Sato 
4684aea3d0cSYoshinori Sato /* tst #imm, rd */
4694aea3d0cSYoshinori Sato static bool trans_TST_ir(DisasContext *ctx, arg_TST_ir *a)
4704aea3d0cSYoshinori Sato {
4714aea3d0cSYoshinori Sato     prt_ir(ctx, "tst", a->imm, a->rd);
4724aea3d0cSYoshinori Sato     return true;
4734aea3d0cSYoshinori Sato }
4744aea3d0cSYoshinori Sato 
4754aea3d0cSYoshinori Sato /* tst dsp[rs], rd */
4764aea3d0cSYoshinori Sato /* tst rs, rd */
4774aea3d0cSYoshinori Sato static bool trans_TST_mr(DisasContext *ctx, arg_TST_mr *a)
4784aea3d0cSYoshinori Sato {
479*e283adeaSRichard Henderson     prt_ldmi(ctx, "tst", a->ld, a->mi, a->rs, a->rd);
4804aea3d0cSYoshinori Sato     return true;
4814aea3d0cSYoshinori Sato }
4824aea3d0cSYoshinori Sato 
4834aea3d0cSYoshinori Sato /* not rd */
4844aea3d0cSYoshinori Sato /* not rs, rd */
4854aea3d0cSYoshinori Sato static bool trans_NOT_rr(DisasContext *ctx, arg_NOT_rr *a)
4864aea3d0cSYoshinori Sato {
4874aea3d0cSYoshinori Sato     prt("not\t");
4884aea3d0cSYoshinori Sato     if (a->rs != a->rd) {
4894aea3d0cSYoshinori Sato         prt("r%d, ", a->rs);
4904aea3d0cSYoshinori Sato     }
4914aea3d0cSYoshinori Sato     prt("r%d", a->rd);
4924aea3d0cSYoshinori Sato     return true;
4934aea3d0cSYoshinori Sato }
4944aea3d0cSYoshinori Sato 
4954aea3d0cSYoshinori Sato /* neg rd */
4964aea3d0cSYoshinori Sato /* neg rs, rd */
4974aea3d0cSYoshinori Sato static bool trans_NEG_rr(DisasContext *ctx, arg_NEG_rr *a)
4984aea3d0cSYoshinori Sato {
4994aea3d0cSYoshinori Sato     prt("neg\t");
5004aea3d0cSYoshinori Sato     if (a->rs != a->rd) {
5014aea3d0cSYoshinori Sato         prt("r%d, ", a->rs);
5024aea3d0cSYoshinori Sato     }
5034aea3d0cSYoshinori Sato     prt("r%d", a->rd);
5044aea3d0cSYoshinori Sato     return true;
5054aea3d0cSYoshinori Sato }
5064aea3d0cSYoshinori Sato 
5074aea3d0cSYoshinori Sato /* adc #imm, rd */
5084aea3d0cSYoshinori Sato static bool trans_ADC_ir(DisasContext *ctx, arg_ADC_ir *a)
5094aea3d0cSYoshinori Sato {
5104aea3d0cSYoshinori Sato     prt_ir(ctx, "adc", a->imm, a->rd);
5114aea3d0cSYoshinori Sato     return true;
5124aea3d0cSYoshinori Sato }
5134aea3d0cSYoshinori Sato 
5144aea3d0cSYoshinori Sato /* adc rs, rd */
5154aea3d0cSYoshinori Sato static bool trans_ADC_rr(DisasContext *ctx, arg_ADC_rr *a)
5164aea3d0cSYoshinori Sato {
5174aea3d0cSYoshinori Sato     prt("adc\tr%d, r%d", a->rs, a->rd);
5184aea3d0cSYoshinori Sato     return true;
5194aea3d0cSYoshinori Sato }
5204aea3d0cSYoshinori Sato 
5214aea3d0cSYoshinori Sato /* adc dsp[rs], rd */
5224aea3d0cSYoshinori Sato static bool trans_ADC_mr(DisasContext *ctx, arg_ADC_mr *a)
5234aea3d0cSYoshinori Sato {
524fa6289e2SRichard Henderson     char dsp[8];
525fa6289e2SRichard Henderson 
526fa6289e2SRichard Henderson     rx_index_addr(ctx, dsp, a->ld, 2);
527fa6289e2SRichard Henderson     prt("adc\t%s[r%d], r%d", dsp, a->rs, a->rd);
5284aea3d0cSYoshinori Sato     return true;
5294aea3d0cSYoshinori Sato }
5304aea3d0cSYoshinori Sato 
5314aea3d0cSYoshinori Sato /* add #uimm4, rd */
5324aea3d0cSYoshinori Sato /* add #imm, rs, rd */
5334aea3d0cSYoshinori Sato static bool trans_ADD_irr(DisasContext *ctx, arg_ADD_irr *a)
5344aea3d0cSYoshinori Sato {
5354aea3d0cSYoshinori Sato     if (a->imm < 0x10 && a->rs2 == a->rd) {
5364aea3d0cSYoshinori Sato         prt("add\t#%d, r%d", a->imm, a->rd);
5374aea3d0cSYoshinori Sato     } else {
5384aea3d0cSYoshinori Sato         prt("add\t#0x%08x, r%d, r%d", a->imm, a->rs2, a->rd);
5394aea3d0cSYoshinori Sato     }
5404aea3d0cSYoshinori Sato     return true;
5414aea3d0cSYoshinori Sato }
5424aea3d0cSYoshinori Sato 
5434aea3d0cSYoshinori Sato /* add rs, rd */
5444aea3d0cSYoshinori Sato /* add dsp[rs], rd */
5454aea3d0cSYoshinori Sato static bool trans_ADD_mr(DisasContext *ctx, arg_ADD_mr *a)
5464aea3d0cSYoshinori Sato {
547*e283adeaSRichard Henderson     prt_ldmi(ctx, "add", a->ld, a->mi, a->rs, a->rd);
5484aea3d0cSYoshinori Sato     return true;
5494aea3d0cSYoshinori Sato }
5504aea3d0cSYoshinori Sato 
5514aea3d0cSYoshinori Sato /* add rs, rs2, rd */
5524aea3d0cSYoshinori Sato static bool trans_ADD_rrr(DisasContext *ctx, arg_ADD_rrr *a)
5534aea3d0cSYoshinori Sato {
5544aea3d0cSYoshinori Sato     prt("add\tr%d, r%d, r%d", a->rs, a->rs2, a->rd);
5554aea3d0cSYoshinori Sato     return true;
5564aea3d0cSYoshinori Sato }
5574aea3d0cSYoshinori Sato 
5584aea3d0cSYoshinori Sato /* cmp #imm4, rd */
5594aea3d0cSYoshinori Sato /* cmp #imm8, rd */
5604aea3d0cSYoshinori Sato /* cmp #imm, rs2 */
5614aea3d0cSYoshinori Sato static bool trans_CMP_ir(DisasContext *ctx, arg_CMP_ir *a)
5624aea3d0cSYoshinori Sato {
5634aea3d0cSYoshinori Sato     prt_ir(ctx, "cmp", a->imm, a->rs2);
5644aea3d0cSYoshinori Sato     return true;
5654aea3d0cSYoshinori Sato }
5664aea3d0cSYoshinori Sato 
5674aea3d0cSYoshinori Sato /* cmp rs, rs2 */
5684aea3d0cSYoshinori Sato /* cmp dsp[rs], rs2 */
5694aea3d0cSYoshinori Sato static bool trans_CMP_mr(DisasContext *ctx, arg_CMP_mr *a)
5704aea3d0cSYoshinori Sato {
571*e283adeaSRichard Henderson     prt_ldmi(ctx, "cmp", a->ld, a->mi, a->rs, a->rd);
5724aea3d0cSYoshinori Sato     return true;
5734aea3d0cSYoshinori Sato }
5744aea3d0cSYoshinori Sato 
5754aea3d0cSYoshinori Sato /* sub #imm4, rd */
5764aea3d0cSYoshinori Sato static bool trans_SUB_ir(DisasContext *ctx, arg_SUB_ir *a)
5774aea3d0cSYoshinori Sato {
5784aea3d0cSYoshinori Sato     prt("sub\t#%d, r%d", a->imm, a->rd);
5794aea3d0cSYoshinori Sato     return true;
5804aea3d0cSYoshinori Sato }
5814aea3d0cSYoshinori Sato 
5824aea3d0cSYoshinori Sato /* sub rs, rd */
5834aea3d0cSYoshinori Sato /* sub dsp[rs], rd */
5844aea3d0cSYoshinori Sato static bool trans_SUB_mr(DisasContext *ctx, arg_SUB_mr *a)
5854aea3d0cSYoshinori Sato {
586*e283adeaSRichard Henderson     prt_ldmi(ctx, "sub", a->ld, a->mi, a->rs, a->rd);
5874aea3d0cSYoshinori Sato     return true;
5884aea3d0cSYoshinori Sato }
5894aea3d0cSYoshinori Sato 
5904aea3d0cSYoshinori Sato /* sub rs, rs2, rd */
5914aea3d0cSYoshinori Sato static bool trans_SUB_rrr(DisasContext *ctx, arg_SUB_rrr *a)
5924aea3d0cSYoshinori Sato {
5934aea3d0cSYoshinori Sato     prt("sub\tr%d, r%d, r%d", a->rs, a->rs2, a->rd);
5944aea3d0cSYoshinori Sato     return true;
5954aea3d0cSYoshinori Sato }
5964aea3d0cSYoshinori Sato 
5974aea3d0cSYoshinori Sato /* sbb rs, rd */
5984aea3d0cSYoshinori Sato static bool trans_SBB_rr(DisasContext *ctx, arg_SBB_rr *a)
5994aea3d0cSYoshinori Sato {
6004aea3d0cSYoshinori Sato     prt("sbb\tr%d, r%d", a->rs, a->rd);
6014aea3d0cSYoshinori Sato     return true;
6024aea3d0cSYoshinori Sato }
6034aea3d0cSYoshinori Sato 
6044aea3d0cSYoshinori Sato /* sbb dsp[rs], rd */
6054aea3d0cSYoshinori Sato static bool trans_SBB_mr(DisasContext *ctx, arg_SBB_mr *a)
6064aea3d0cSYoshinori Sato {
607*e283adeaSRichard Henderson     prt_ldmi(ctx, "sbb", a->ld, RX_IM_LONG, a->rs, a->rd);
6084aea3d0cSYoshinori Sato     return true;
6094aea3d0cSYoshinori Sato }
6104aea3d0cSYoshinori Sato 
6114aea3d0cSYoshinori Sato /* abs rd */
6124aea3d0cSYoshinori Sato /* abs rs, rd */
6134aea3d0cSYoshinori Sato static bool trans_ABS_rr(DisasContext *ctx, arg_ABS_rr *a)
6144aea3d0cSYoshinori Sato {
6154aea3d0cSYoshinori Sato     prt("abs\t");
6164aea3d0cSYoshinori Sato     if (a->rs == a->rd) {
6174aea3d0cSYoshinori Sato         prt("r%d", a->rd);
6184aea3d0cSYoshinori Sato     } else {
6194aea3d0cSYoshinori Sato         prt("r%d, r%d", a->rs, a->rd);
6204aea3d0cSYoshinori Sato     }
6214aea3d0cSYoshinori Sato     return true;
6224aea3d0cSYoshinori Sato }
6234aea3d0cSYoshinori Sato 
6244aea3d0cSYoshinori Sato /* max #imm, rd */
6254aea3d0cSYoshinori Sato static bool trans_MAX_ir(DisasContext *ctx, arg_MAX_ir *a)
6264aea3d0cSYoshinori Sato {
6274aea3d0cSYoshinori Sato     prt_ir(ctx, "max", a->imm, a->rd);
6284aea3d0cSYoshinori Sato     return true;
6294aea3d0cSYoshinori Sato }
6304aea3d0cSYoshinori Sato 
6314aea3d0cSYoshinori Sato /* max rs, rd */
6324aea3d0cSYoshinori Sato /* max dsp[rs], rd */
6334aea3d0cSYoshinori Sato static bool trans_MAX_mr(DisasContext *ctx, arg_MAX_mr *a)
6344aea3d0cSYoshinori Sato {
635*e283adeaSRichard Henderson     prt_ldmi(ctx, "max", a->ld, a->mi, a->rs, a->rd);
6364aea3d0cSYoshinori Sato     return true;
6374aea3d0cSYoshinori Sato }
6384aea3d0cSYoshinori Sato 
6394aea3d0cSYoshinori Sato /* min #imm, rd */
6404aea3d0cSYoshinori Sato static bool trans_MIN_ir(DisasContext *ctx, arg_MIN_ir *a)
6414aea3d0cSYoshinori Sato {
6424aea3d0cSYoshinori Sato     prt_ir(ctx, "min", a->imm, a->rd);
6434aea3d0cSYoshinori Sato     return true;
6444aea3d0cSYoshinori Sato }
6454aea3d0cSYoshinori Sato 
6464aea3d0cSYoshinori Sato /* min rs, rd */
6474aea3d0cSYoshinori Sato /* min dsp[rs], rd */
6484aea3d0cSYoshinori Sato static bool trans_MIN_mr(DisasContext *ctx, arg_MIN_mr *a)
6494aea3d0cSYoshinori Sato {
650*e283adeaSRichard Henderson     prt_ldmi(ctx, "min", a->ld, a->mi, a->rs, a->rd);
6514aea3d0cSYoshinori Sato     return true;
6524aea3d0cSYoshinori Sato }
6534aea3d0cSYoshinori Sato 
6544aea3d0cSYoshinori Sato /* mul #uimm4, rd */
6554aea3d0cSYoshinori Sato /* mul #imm, rd */
6564aea3d0cSYoshinori Sato static bool trans_MUL_ir(DisasContext *ctx, arg_MUL_ir *a)
6574aea3d0cSYoshinori Sato {
6584aea3d0cSYoshinori Sato     prt_ir(ctx, "mul", a->imm, a->rd);
6594aea3d0cSYoshinori Sato     return true;
6604aea3d0cSYoshinori Sato }
6614aea3d0cSYoshinori Sato 
6624aea3d0cSYoshinori Sato /* mul rs, rd */
6634aea3d0cSYoshinori Sato /* mul dsp[rs], rd */
6644aea3d0cSYoshinori Sato static bool trans_MUL_mr(DisasContext *ctx, arg_MUL_mr *a)
6654aea3d0cSYoshinori Sato {
666*e283adeaSRichard Henderson     prt_ldmi(ctx, "mul", a->ld, a->mi, a->rs, a->rd);
6674aea3d0cSYoshinori Sato     return true;
6684aea3d0cSYoshinori Sato }
6694aea3d0cSYoshinori Sato 
6704aea3d0cSYoshinori Sato /* mul rs, rs2, rd */
6714aea3d0cSYoshinori Sato static bool trans_MUL_rrr(DisasContext *ctx, arg_MUL_rrr *a)
6724aea3d0cSYoshinori Sato {
6734aea3d0cSYoshinori Sato     prt("mul\tr%d,r%d,r%d", a->rs, a->rs2, a->rd);
6744aea3d0cSYoshinori Sato     return true;
6754aea3d0cSYoshinori Sato }
6764aea3d0cSYoshinori Sato 
6774aea3d0cSYoshinori Sato /* emul #imm, rd */
6784aea3d0cSYoshinori Sato static bool trans_EMUL_ir(DisasContext *ctx, arg_EMUL_ir *a)
6794aea3d0cSYoshinori Sato {
6804aea3d0cSYoshinori Sato     prt_ir(ctx, "emul", a->imm, a->rd);
6814aea3d0cSYoshinori Sato     return true;
6824aea3d0cSYoshinori Sato }
6834aea3d0cSYoshinori Sato 
6844aea3d0cSYoshinori Sato /* emul rs, rd */
6854aea3d0cSYoshinori Sato /* emul dsp[rs], rd */
6864aea3d0cSYoshinori Sato static bool trans_EMUL_mr(DisasContext *ctx, arg_EMUL_mr *a)
6874aea3d0cSYoshinori Sato {
688*e283adeaSRichard Henderson     prt_ldmi(ctx, "emul", a->ld, a->mi, a->rs, a->rd);
6894aea3d0cSYoshinori Sato     return true;
6904aea3d0cSYoshinori Sato }
6914aea3d0cSYoshinori Sato 
6924aea3d0cSYoshinori Sato /* emulu #imm, rd */
6934aea3d0cSYoshinori Sato static bool trans_EMULU_ir(DisasContext *ctx, arg_EMULU_ir *a)
6944aea3d0cSYoshinori Sato {
6954aea3d0cSYoshinori Sato     prt_ir(ctx, "emulu", a->imm, a->rd);
6964aea3d0cSYoshinori Sato     return true;
6974aea3d0cSYoshinori Sato }
6984aea3d0cSYoshinori Sato 
6994aea3d0cSYoshinori Sato /* emulu rs, rd */
7004aea3d0cSYoshinori Sato /* emulu dsp[rs], rd */
7014aea3d0cSYoshinori Sato static bool trans_EMULU_mr(DisasContext *ctx, arg_EMULU_mr *a)
7024aea3d0cSYoshinori Sato {
703*e283adeaSRichard Henderson     prt_ldmi(ctx, "emulu", a->ld, a->mi, a->rs, a->rd);
7044aea3d0cSYoshinori Sato     return true;
7054aea3d0cSYoshinori Sato }
7064aea3d0cSYoshinori Sato 
7074aea3d0cSYoshinori Sato /* div #imm, rd */
7084aea3d0cSYoshinori Sato static bool trans_DIV_ir(DisasContext *ctx, arg_DIV_ir *a)
7094aea3d0cSYoshinori Sato {
7104aea3d0cSYoshinori Sato     prt_ir(ctx, "div", a->imm, a->rd);
7114aea3d0cSYoshinori Sato     return true;
7124aea3d0cSYoshinori Sato }
7134aea3d0cSYoshinori Sato 
7144aea3d0cSYoshinori Sato /* div rs, rd */
7154aea3d0cSYoshinori Sato /* div dsp[rs], rd */
7164aea3d0cSYoshinori Sato static bool trans_DIV_mr(DisasContext *ctx, arg_DIV_mr *a)
7174aea3d0cSYoshinori Sato {
718*e283adeaSRichard Henderson     prt_ldmi(ctx, "div", a->ld, a->mi, a->rs, a->rd);
7194aea3d0cSYoshinori Sato     return true;
7204aea3d0cSYoshinori Sato }
7214aea3d0cSYoshinori Sato 
7224aea3d0cSYoshinori Sato /* divu #imm, rd */
7234aea3d0cSYoshinori Sato static bool trans_DIVU_ir(DisasContext *ctx, arg_DIVU_ir *a)
7244aea3d0cSYoshinori Sato {
7254aea3d0cSYoshinori Sato     prt_ir(ctx, "divu", a->imm, a->rd);
7264aea3d0cSYoshinori Sato     return true;
7274aea3d0cSYoshinori Sato }
7284aea3d0cSYoshinori Sato 
7294aea3d0cSYoshinori Sato /* divu rs, rd */
7304aea3d0cSYoshinori Sato /* divu dsp[rs], rd */
7314aea3d0cSYoshinori Sato static bool trans_DIVU_mr(DisasContext *ctx, arg_DIVU_mr *a)
7324aea3d0cSYoshinori Sato {
733*e283adeaSRichard Henderson     prt_ldmi(ctx, "divu", a->ld, a->mi, a->rs, a->rd);
7344aea3d0cSYoshinori Sato     return true;
7354aea3d0cSYoshinori Sato }
7364aea3d0cSYoshinori Sato 
7374aea3d0cSYoshinori Sato 
7384aea3d0cSYoshinori Sato /* shll #imm:5, rd */
7394aea3d0cSYoshinori Sato /* shll #imm:5, rs, rd */
7404aea3d0cSYoshinori Sato static bool trans_SHLL_irr(DisasContext *ctx, arg_SHLL_irr *a)
7414aea3d0cSYoshinori Sato {
7424aea3d0cSYoshinori Sato     prt("shll\t#%d, ", a->imm);
7434aea3d0cSYoshinori Sato     if (a->rs2 != a->rd) {
7444aea3d0cSYoshinori Sato         prt("r%d, ", a->rs2);
7454aea3d0cSYoshinori Sato     }
7464aea3d0cSYoshinori Sato     prt("r%d", a->rd);
7474aea3d0cSYoshinori Sato     return true;
7484aea3d0cSYoshinori Sato }
7494aea3d0cSYoshinori Sato 
7504aea3d0cSYoshinori Sato /* shll rs, rd */
7514aea3d0cSYoshinori Sato static bool trans_SHLL_rr(DisasContext *ctx, arg_SHLL_rr *a)
7524aea3d0cSYoshinori Sato {
7534aea3d0cSYoshinori Sato     prt("shll\tr%d, r%d", a->rs, a->rd);
7544aea3d0cSYoshinori Sato     return true;
7554aea3d0cSYoshinori Sato }
7564aea3d0cSYoshinori Sato 
7574aea3d0cSYoshinori Sato /* shar #imm:5, rd */
7584aea3d0cSYoshinori Sato /* shar #imm:5, rs, rd */
7594aea3d0cSYoshinori Sato static bool trans_SHAR_irr(DisasContext *ctx, arg_SHAR_irr *a)
7604aea3d0cSYoshinori Sato {
7614aea3d0cSYoshinori Sato     prt("shar\t#%d,", a->imm);
7624aea3d0cSYoshinori Sato     if (a->rs2 != a->rd) {
7634aea3d0cSYoshinori Sato         prt("r%d, ", a->rs2);
7644aea3d0cSYoshinori Sato     }
7654aea3d0cSYoshinori Sato     prt("r%d", a->rd);
7664aea3d0cSYoshinori Sato     return true;
7674aea3d0cSYoshinori Sato }
7684aea3d0cSYoshinori Sato 
7694aea3d0cSYoshinori Sato /* shar rs, rd */
7704aea3d0cSYoshinori Sato static bool trans_SHAR_rr(DisasContext *ctx, arg_SHAR_rr *a)
7714aea3d0cSYoshinori Sato {
7724aea3d0cSYoshinori Sato     prt("shar\tr%d, r%d", a->rs, a->rd);
7734aea3d0cSYoshinori Sato     return true;
7744aea3d0cSYoshinori Sato }
7754aea3d0cSYoshinori Sato 
7764aea3d0cSYoshinori Sato /* shlr #imm:5, rd */
7774aea3d0cSYoshinori Sato /* shlr #imm:5, rs, rd */
7784aea3d0cSYoshinori Sato static bool trans_SHLR_irr(DisasContext *ctx, arg_SHLR_irr *a)
7794aea3d0cSYoshinori Sato {
7804aea3d0cSYoshinori Sato     prt("shlr\t#%d, ", a->imm);
7814aea3d0cSYoshinori Sato     if (a->rs2 != a->rd) {
7824aea3d0cSYoshinori Sato         prt("r%d, ", a->rs2);
7834aea3d0cSYoshinori Sato     }
7844aea3d0cSYoshinori Sato     prt("r%d", a->rd);
7854aea3d0cSYoshinori Sato     return true;
7864aea3d0cSYoshinori Sato }
7874aea3d0cSYoshinori Sato 
7884aea3d0cSYoshinori Sato /* shlr rs, rd */
7894aea3d0cSYoshinori Sato static bool trans_SHLR_rr(DisasContext *ctx, arg_SHLR_rr *a)
7904aea3d0cSYoshinori Sato {
7914aea3d0cSYoshinori Sato     prt("shlr\tr%d, r%d", a->rs, a->rd);
7924aea3d0cSYoshinori Sato     return true;
7934aea3d0cSYoshinori Sato }
7944aea3d0cSYoshinori Sato 
7954aea3d0cSYoshinori Sato /* rolc rd */
7964aea3d0cSYoshinori Sato static bool trans_ROLC(DisasContext *ctx, arg_ROLC *a)
7974aea3d0cSYoshinori Sato {
7984aea3d0cSYoshinori Sato     prt("rorc\tr%d", a->rd);
7994aea3d0cSYoshinori Sato     return true;
8004aea3d0cSYoshinori Sato }
8014aea3d0cSYoshinori Sato 
8024aea3d0cSYoshinori Sato /* rorc rd */
8034aea3d0cSYoshinori Sato static bool trans_RORC(DisasContext *ctx, arg_RORC *a)
8044aea3d0cSYoshinori Sato {
8054aea3d0cSYoshinori Sato     prt("rorc\tr%d", a->rd);
8064aea3d0cSYoshinori Sato     return true;
8074aea3d0cSYoshinori Sato }
8084aea3d0cSYoshinori Sato 
8094aea3d0cSYoshinori Sato /* rotl #imm, rd */
8104aea3d0cSYoshinori Sato static bool trans_ROTL_ir(DisasContext *ctx, arg_ROTL_ir *a)
8114aea3d0cSYoshinori Sato {
8124aea3d0cSYoshinori Sato     prt("rotl\t#%d, r%d", a->imm, a->rd);
8134aea3d0cSYoshinori Sato     return true;
8144aea3d0cSYoshinori Sato }
8154aea3d0cSYoshinori Sato 
8164aea3d0cSYoshinori Sato /* rotl rs, rd */
8174aea3d0cSYoshinori Sato static bool trans_ROTL_rr(DisasContext *ctx, arg_ROTL_rr *a)
8184aea3d0cSYoshinori Sato {
8194aea3d0cSYoshinori Sato     prt("rotl\tr%d, r%d", a->rs, a->rd);
8204aea3d0cSYoshinori Sato     return true;
8214aea3d0cSYoshinori Sato }
8224aea3d0cSYoshinori Sato 
8234aea3d0cSYoshinori Sato /* rotr #imm, rd */
8244aea3d0cSYoshinori Sato static bool trans_ROTR_ir(DisasContext *ctx, arg_ROTR_ir *a)
8254aea3d0cSYoshinori Sato {
8264aea3d0cSYoshinori Sato     prt("rotr\t#%d, r%d", a->imm, a->rd);
8274aea3d0cSYoshinori Sato     return true;
8284aea3d0cSYoshinori Sato }
8294aea3d0cSYoshinori Sato 
8304aea3d0cSYoshinori Sato /* rotr rs, rd */
8314aea3d0cSYoshinori Sato static bool trans_ROTR_rr(DisasContext *ctx, arg_ROTR_rr *a)
8324aea3d0cSYoshinori Sato {
8334aea3d0cSYoshinori Sato     prt("rotr\tr%d, r%d", a->rs, a->rd);
8344aea3d0cSYoshinori Sato     return true;
8354aea3d0cSYoshinori Sato }
8364aea3d0cSYoshinori Sato 
8374aea3d0cSYoshinori Sato /* revl rs, rd */
8384aea3d0cSYoshinori Sato static bool trans_REVL(DisasContext *ctx, arg_REVL *a)
8394aea3d0cSYoshinori Sato {
8404aea3d0cSYoshinori Sato     prt("revl\tr%d, r%d", a->rs, a->rd);
8414aea3d0cSYoshinori Sato     return true;
8424aea3d0cSYoshinori Sato }
8434aea3d0cSYoshinori Sato 
8444aea3d0cSYoshinori Sato /* revw rs, rd */
8454aea3d0cSYoshinori Sato static bool trans_REVW(DisasContext *ctx, arg_REVW *a)
8464aea3d0cSYoshinori Sato {
8474aea3d0cSYoshinori Sato     prt("revw\tr%d, r%d", a->rs, a->rd);
8484aea3d0cSYoshinori Sato     return true;
8494aea3d0cSYoshinori Sato }
8504aea3d0cSYoshinori Sato 
8514aea3d0cSYoshinori Sato /* conditional branch helper */
8524aea3d0cSYoshinori Sato static void rx_bcnd_main(DisasContext *ctx, int cd, int len, int dst)
8534aea3d0cSYoshinori Sato {
8544aea3d0cSYoshinori Sato     static const char sz[] = {'s', 'b', 'w', 'a'};
8554aea3d0cSYoshinori Sato     prt("b%s.%c\t%08x", cond[cd], sz[len - 1], ctx->pc + dst);
8564aea3d0cSYoshinori Sato }
8574aea3d0cSYoshinori Sato 
8584aea3d0cSYoshinori Sato /* beq dsp:3 / bne dsp:3 */
8594aea3d0cSYoshinori Sato /* beq dsp:8 / bne dsp:8 */
8604aea3d0cSYoshinori Sato /* bc dsp:8 / bnc dsp:8 */
8614aea3d0cSYoshinori Sato /* bgtu dsp:8 / bleu dsp:8 */
8624aea3d0cSYoshinori Sato /* bpz dsp:8 / bn dsp:8 */
8634aea3d0cSYoshinori Sato /* bge dsp:8 / blt dsp:8 */
8644aea3d0cSYoshinori Sato /* bgt dsp:8 / ble dsp:8 */
8654aea3d0cSYoshinori Sato /* bo dsp:8 / bno dsp:8 */
8664aea3d0cSYoshinori Sato /* beq dsp:16 / bne dsp:16 */
8674aea3d0cSYoshinori Sato static bool trans_BCnd(DisasContext *ctx, arg_BCnd *a)
8684aea3d0cSYoshinori Sato {
8694aea3d0cSYoshinori Sato     rx_bcnd_main(ctx, a->cd, a->sz, a->dsp);
8704aea3d0cSYoshinori Sato     return true;
8714aea3d0cSYoshinori Sato }
8724aea3d0cSYoshinori Sato 
8734aea3d0cSYoshinori Sato /* bra dsp:3 */
8744aea3d0cSYoshinori Sato /* bra dsp:8 */
8754aea3d0cSYoshinori Sato /* bra dsp:16 */
8764aea3d0cSYoshinori Sato /* bra dsp:24 */
8774aea3d0cSYoshinori Sato static bool trans_BRA(DisasContext *ctx, arg_BRA *a)
8784aea3d0cSYoshinori Sato {
8794aea3d0cSYoshinori Sato     rx_bcnd_main(ctx, 14, a->sz, a->dsp);
8804aea3d0cSYoshinori Sato     return true;
8814aea3d0cSYoshinori Sato }
8824aea3d0cSYoshinori Sato 
8834aea3d0cSYoshinori Sato /* bra rs */
8844aea3d0cSYoshinori Sato static bool trans_BRA_l(DisasContext *ctx, arg_BRA_l *a)
8854aea3d0cSYoshinori Sato {
8864aea3d0cSYoshinori Sato     prt("bra.l\tr%d", a->rd);
8874aea3d0cSYoshinori Sato     return true;
8884aea3d0cSYoshinori Sato }
8894aea3d0cSYoshinori Sato 
8904aea3d0cSYoshinori Sato /* jmp rs */
8914aea3d0cSYoshinori Sato static bool trans_JMP(DisasContext *ctx, arg_JMP *a)
8924aea3d0cSYoshinori Sato {
8934aea3d0cSYoshinori Sato     prt("jmp\tr%d", a->rs);
8944aea3d0cSYoshinori Sato     return true;
8954aea3d0cSYoshinori Sato }
8964aea3d0cSYoshinori Sato 
8974aea3d0cSYoshinori Sato /* jsr rs */
8984aea3d0cSYoshinori Sato static bool trans_JSR(DisasContext *ctx, arg_JSR *a)
8994aea3d0cSYoshinori Sato {
9004aea3d0cSYoshinori Sato     prt("jsr\tr%d", a->rs);
9014aea3d0cSYoshinori Sato     return true;
9024aea3d0cSYoshinori Sato }
9034aea3d0cSYoshinori Sato 
9044aea3d0cSYoshinori Sato /* bsr dsp:16 */
9054aea3d0cSYoshinori Sato /* bsr dsp:24 */
9064aea3d0cSYoshinori Sato static bool trans_BSR(DisasContext *ctx, arg_BSR *a)
9074aea3d0cSYoshinori Sato {
9084aea3d0cSYoshinori Sato     static const char sz[] = {'w', 'a'};
9094aea3d0cSYoshinori Sato     prt("bsr.%c\t%08x", sz[a->sz - 3], ctx->pc + a->dsp);
9104aea3d0cSYoshinori Sato     return true;
9114aea3d0cSYoshinori Sato }
9124aea3d0cSYoshinori Sato 
9134aea3d0cSYoshinori Sato /* bsr rs */
9144aea3d0cSYoshinori Sato static bool trans_BSR_l(DisasContext *ctx, arg_BSR_l *a)
9154aea3d0cSYoshinori Sato {
9164aea3d0cSYoshinori Sato     prt("bsr.l\tr%d", a->rd);
9174aea3d0cSYoshinori Sato     return true;
9184aea3d0cSYoshinori Sato }
9194aea3d0cSYoshinori Sato 
9204aea3d0cSYoshinori Sato /* rts */
9214aea3d0cSYoshinori Sato static bool trans_RTS(DisasContext *ctx, arg_RTS *a)
9224aea3d0cSYoshinori Sato {
9234aea3d0cSYoshinori Sato     prt("rts");
9244aea3d0cSYoshinori Sato     return true;
9254aea3d0cSYoshinori Sato }
9264aea3d0cSYoshinori Sato 
9274aea3d0cSYoshinori Sato /* nop */
9284aea3d0cSYoshinori Sato static bool trans_NOP(DisasContext *ctx, arg_NOP *a)
9294aea3d0cSYoshinori Sato {
9304aea3d0cSYoshinori Sato     prt("nop");
9314aea3d0cSYoshinori Sato     return true;
9324aea3d0cSYoshinori Sato }
9334aea3d0cSYoshinori Sato 
9344aea3d0cSYoshinori Sato /* scmpu */
9354aea3d0cSYoshinori Sato static bool trans_SCMPU(DisasContext *ctx, arg_SCMPU *a)
9364aea3d0cSYoshinori Sato {
9374aea3d0cSYoshinori Sato     prt("scmpu");
9384aea3d0cSYoshinori Sato     return true;
9394aea3d0cSYoshinori Sato }
9404aea3d0cSYoshinori Sato 
9414aea3d0cSYoshinori Sato /* smovu */
9424aea3d0cSYoshinori Sato static bool trans_SMOVU(DisasContext *ctx, arg_SMOVU *a)
9434aea3d0cSYoshinori Sato {
9444aea3d0cSYoshinori Sato     prt("smovu");
9454aea3d0cSYoshinori Sato     return true;
9464aea3d0cSYoshinori Sato }
9474aea3d0cSYoshinori Sato 
9484aea3d0cSYoshinori Sato /* smovf */
9494aea3d0cSYoshinori Sato static bool trans_SMOVF(DisasContext *ctx, arg_SMOVF *a)
9504aea3d0cSYoshinori Sato {
9514aea3d0cSYoshinori Sato     prt("smovf");
9524aea3d0cSYoshinori Sato     return true;
9534aea3d0cSYoshinori Sato }
9544aea3d0cSYoshinori Sato 
9554aea3d0cSYoshinori Sato /* smovb */
9564aea3d0cSYoshinori Sato static bool trans_SMOVB(DisasContext *ctx, arg_SMOVB *a)
9574aea3d0cSYoshinori Sato {
9584aea3d0cSYoshinori Sato     prt("smovb");
9594aea3d0cSYoshinori Sato     return true;
9604aea3d0cSYoshinori Sato }
9614aea3d0cSYoshinori Sato 
9624aea3d0cSYoshinori Sato /* suntile */
9634aea3d0cSYoshinori Sato static bool trans_SUNTIL(DisasContext *ctx, arg_SUNTIL *a)
9644aea3d0cSYoshinori Sato {
9654aea3d0cSYoshinori Sato     prt("suntil.%c", size[a->sz]);
9664aea3d0cSYoshinori Sato     return true;
9674aea3d0cSYoshinori Sato }
9684aea3d0cSYoshinori Sato 
9694aea3d0cSYoshinori Sato /* swhile */
9704aea3d0cSYoshinori Sato static bool trans_SWHILE(DisasContext *ctx, arg_SWHILE *a)
9714aea3d0cSYoshinori Sato {
9724aea3d0cSYoshinori Sato     prt("swhile.%c", size[a->sz]);
9734aea3d0cSYoshinori Sato     return true;
9744aea3d0cSYoshinori Sato }
9754aea3d0cSYoshinori Sato /* sstr */
9764aea3d0cSYoshinori Sato static bool trans_SSTR(DisasContext *ctx, arg_SSTR *a)
9774aea3d0cSYoshinori Sato {
9784aea3d0cSYoshinori Sato     prt("sstr.%c", size[a->sz]);
9794aea3d0cSYoshinori Sato     return true;
9804aea3d0cSYoshinori Sato }
9814aea3d0cSYoshinori Sato 
9824aea3d0cSYoshinori Sato /* rmpa */
9834aea3d0cSYoshinori Sato static bool trans_RMPA(DisasContext *ctx, arg_RMPA *a)
9844aea3d0cSYoshinori Sato {
9854aea3d0cSYoshinori Sato     prt("rmpa.%c", size[a->sz]);
9864aea3d0cSYoshinori Sato     return true;
9874aea3d0cSYoshinori Sato }
9884aea3d0cSYoshinori Sato 
9894aea3d0cSYoshinori Sato /* mulhi rs,rs2 */
9904aea3d0cSYoshinori Sato static bool trans_MULHI(DisasContext *ctx, arg_MULHI *a)
9914aea3d0cSYoshinori Sato {
9924aea3d0cSYoshinori Sato     prt("mulhi\tr%d,r%d", a->rs, a->rs2);
9934aea3d0cSYoshinori Sato     return true;
9944aea3d0cSYoshinori Sato }
9954aea3d0cSYoshinori Sato 
9964aea3d0cSYoshinori Sato /* mullo rs,rs2 */
9974aea3d0cSYoshinori Sato static bool trans_MULLO(DisasContext *ctx, arg_MULLO *a)
9984aea3d0cSYoshinori Sato {
9994aea3d0cSYoshinori Sato     prt("mullo\tr%d, r%d", a->rs, a->rs2);
10004aea3d0cSYoshinori Sato     return true;
10014aea3d0cSYoshinori Sato }
10024aea3d0cSYoshinori Sato 
10034aea3d0cSYoshinori Sato /* machi rs,rs2 */
10044aea3d0cSYoshinori Sato static bool trans_MACHI(DisasContext *ctx, arg_MACHI *a)
10054aea3d0cSYoshinori Sato {
10064aea3d0cSYoshinori Sato     prt("machi\tr%d, r%d", a->rs, a->rs2);
10074aea3d0cSYoshinori Sato     return true;
10084aea3d0cSYoshinori Sato }
10094aea3d0cSYoshinori Sato 
10104aea3d0cSYoshinori Sato /* maclo rs,rs2 */
10114aea3d0cSYoshinori Sato static bool trans_MACLO(DisasContext *ctx, arg_MACLO *a)
10124aea3d0cSYoshinori Sato {
10134aea3d0cSYoshinori Sato     prt("maclo\tr%d, r%d", a->rs, a->rs2);
10144aea3d0cSYoshinori Sato     return true;
10154aea3d0cSYoshinori Sato }
10164aea3d0cSYoshinori Sato 
10174aea3d0cSYoshinori Sato /* mvfachi rd */
10184aea3d0cSYoshinori Sato static bool trans_MVFACHI(DisasContext *ctx, arg_MVFACHI *a)
10194aea3d0cSYoshinori Sato {
10204aea3d0cSYoshinori Sato     prt("mvfachi\tr%d", a->rd);
10214aea3d0cSYoshinori Sato     return true;
10224aea3d0cSYoshinori Sato }
10234aea3d0cSYoshinori Sato 
10244aea3d0cSYoshinori Sato /* mvfacmi rd */
10254aea3d0cSYoshinori Sato static bool trans_MVFACMI(DisasContext *ctx, arg_MVFACMI *a)
10264aea3d0cSYoshinori Sato {
10274aea3d0cSYoshinori Sato     prt("mvfacmi\tr%d", a->rd);
10284aea3d0cSYoshinori Sato     return true;
10294aea3d0cSYoshinori Sato }
10304aea3d0cSYoshinori Sato 
10314aea3d0cSYoshinori Sato /* mvtachi rs */
10324aea3d0cSYoshinori Sato static bool trans_MVTACHI(DisasContext *ctx, arg_MVTACHI *a)
10334aea3d0cSYoshinori Sato {
10344aea3d0cSYoshinori Sato     prt("mvtachi\tr%d", a->rs);
10354aea3d0cSYoshinori Sato     return true;
10364aea3d0cSYoshinori Sato }
10374aea3d0cSYoshinori Sato 
10384aea3d0cSYoshinori Sato /* mvtaclo rs */
10394aea3d0cSYoshinori Sato static bool trans_MVTACLO(DisasContext *ctx, arg_MVTACLO *a)
10404aea3d0cSYoshinori Sato {
10414aea3d0cSYoshinori Sato     prt("mvtaclo\tr%d", a->rs);
10424aea3d0cSYoshinori Sato     return true;
10434aea3d0cSYoshinori Sato }
10444aea3d0cSYoshinori Sato 
10454aea3d0cSYoshinori Sato /* racw #imm */
10464aea3d0cSYoshinori Sato static bool trans_RACW(DisasContext *ctx, arg_RACW *a)
10474aea3d0cSYoshinori Sato {
10484aea3d0cSYoshinori Sato     prt("racw\t#%d", a->imm + 1);
10494aea3d0cSYoshinori Sato     return true;
10504aea3d0cSYoshinori Sato }
10514aea3d0cSYoshinori Sato 
10524aea3d0cSYoshinori Sato /* sat rd */
10534aea3d0cSYoshinori Sato static bool trans_SAT(DisasContext *ctx, arg_SAT *a)
10544aea3d0cSYoshinori Sato {
10554aea3d0cSYoshinori Sato     prt("sat\tr%d", a->rd);
10564aea3d0cSYoshinori Sato     return true;
10574aea3d0cSYoshinori Sato }
10584aea3d0cSYoshinori Sato 
10594aea3d0cSYoshinori Sato /* satr */
10604aea3d0cSYoshinori Sato static bool trans_SATR(DisasContext *ctx, arg_SATR *a)
10614aea3d0cSYoshinori Sato {
10624aea3d0cSYoshinori Sato     prt("satr");
10634aea3d0cSYoshinori Sato     return true;
10644aea3d0cSYoshinori Sato }
10654aea3d0cSYoshinori Sato 
10664aea3d0cSYoshinori Sato /* fadd #imm, rd */
10674aea3d0cSYoshinori Sato static bool trans_FADD_ir(DisasContext *ctx, arg_FADD_ir *a)
10684aea3d0cSYoshinori Sato {
10694aea3d0cSYoshinori Sato     prt("fadd\t#%d,r%d", li(ctx, 0), a->rd);
10704aea3d0cSYoshinori Sato     return true;
10714aea3d0cSYoshinori Sato }
10724aea3d0cSYoshinori Sato 
10734aea3d0cSYoshinori Sato /* fadd dsp[rs], rd */
10744aea3d0cSYoshinori Sato /* fadd rs, rd */
10754aea3d0cSYoshinori Sato static bool trans_FADD_mr(DisasContext *ctx, arg_FADD_mr *a)
10764aea3d0cSYoshinori Sato {
1077*e283adeaSRichard Henderson     prt_ldmi(ctx, "fadd", a->ld, RX_IM_LONG, a->rs, a->rd);
10784aea3d0cSYoshinori Sato     return true;
10794aea3d0cSYoshinori Sato }
10804aea3d0cSYoshinori Sato 
10814aea3d0cSYoshinori Sato /* fcmp #imm, rd */
10824aea3d0cSYoshinori Sato static bool trans_FCMP_ir(DisasContext *ctx, arg_FCMP_ir *a)
10834aea3d0cSYoshinori Sato {
10844aea3d0cSYoshinori Sato     prt("fadd\t#%d,r%d", li(ctx, 0), a->rd);
10854aea3d0cSYoshinori Sato     return true;
10864aea3d0cSYoshinori Sato }
10874aea3d0cSYoshinori Sato 
10884aea3d0cSYoshinori Sato /* fcmp dsp[rs], rd */
10894aea3d0cSYoshinori Sato /* fcmp rs, rd */
10904aea3d0cSYoshinori Sato static bool trans_FCMP_mr(DisasContext *ctx, arg_FCMP_mr *a)
10914aea3d0cSYoshinori Sato {
1092*e283adeaSRichard Henderson     prt_ldmi(ctx, "fcmp", a->ld, RX_IM_LONG, a->rs, a->rd);
10934aea3d0cSYoshinori Sato     return true;
10944aea3d0cSYoshinori Sato }
10954aea3d0cSYoshinori Sato 
10964aea3d0cSYoshinori Sato /* fsub #imm, rd */
10974aea3d0cSYoshinori Sato static bool trans_FSUB_ir(DisasContext *ctx, arg_FSUB_ir *a)
10984aea3d0cSYoshinori Sato {
10994aea3d0cSYoshinori Sato     prt("fsub\t#%d,r%d", li(ctx, 0), a->rd);
11004aea3d0cSYoshinori Sato     return true;
11014aea3d0cSYoshinori Sato }
11024aea3d0cSYoshinori Sato 
11034aea3d0cSYoshinori Sato /* fsub dsp[rs], rd */
11044aea3d0cSYoshinori Sato /* fsub rs, rd */
11054aea3d0cSYoshinori Sato static bool trans_FSUB_mr(DisasContext *ctx, arg_FSUB_mr *a)
11064aea3d0cSYoshinori Sato {
1107*e283adeaSRichard Henderson     prt_ldmi(ctx, "fsub", a->ld, RX_IM_LONG, a->rs, a->rd);
11084aea3d0cSYoshinori Sato     return true;
11094aea3d0cSYoshinori Sato }
11104aea3d0cSYoshinori Sato 
11114aea3d0cSYoshinori Sato /* ftoi dsp[rs], rd */
11124aea3d0cSYoshinori Sato /* ftoi rs, rd */
11134aea3d0cSYoshinori Sato static bool trans_FTOI(DisasContext *ctx, arg_FTOI *a)
11144aea3d0cSYoshinori Sato {
1115*e283adeaSRichard Henderson     prt_ldmi(ctx, "ftoi", a->ld, RX_IM_LONG, a->rs, a->rd);
11164aea3d0cSYoshinori Sato     return true;
11174aea3d0cSYoshinori Sato }
11184aea3d0cSYoshinori Sato 
11194aea3d0cSYoshinori Sato /* fmul #imm, rd */
11204aea3d0cSYoshinori Sato static bool trans_FMUL_ir(DisasContext *ctx, arg_FMUL_ir *a)
11214aea3d0cSYoshinori Sato {
11224aea3d0cSYoshinori Sato     prt("fmul\t#%d,r%d", li(ctx, 0), a->rd);
11234aea3d0cSYoshinori Sato     return true;
11244aea3d0cSYoshinori Sato }
11254aea3d0cSYoshinori Sato 
11264aea3d0cSYoshinori Sato /* fmul dsp[rs], rd */
11274aea3d0cSYoshinori Sato /* fmul rs, rd */
11284aea3d0cSYoshinori Sato static bool trans_FMUL_mr(DisasContext *ctx, arg_FMUL_mr *a)
11294aea3d0cSYoshinori Sato {
1130*e283adeaSRichard Henderson     prt_ldmi(ctx, "fmul", a->ld, RX_IM_LONG, a->rs, a->rd);
11314aea3d0cSYoshinori Sato     return true;
11324aea3d0cSYoshinori Sato }
11334aea3d0cSYoshinori Sato 
11344aea3d0cSYoshinori Sato /* fdiv #imm, rd */
11354aea3d0cSYoshinori Sato static bool trans_FDIV_ir(DisasContext *ctx, arg_FDIV_ir *a)
11364aea3d0cSYoshinori Sato {
11374aea3d0cSYoshinori Sato     prt("fdiv\t#%d,r%d", li(ctx, 0), a->rd);
11384aea3d0cSYoshinori Sato     return true;
11394aea3d0cSYoshinori Sato }
11404aea3d0cSYoshinori Sato 
11414aea3d0cSYoshinori Sato /* fdiv dsp[rs], rd */
11424aea3d0cSYoshinori Sato /* fdiv rs, rd */
11434aea3d0cSYoshinori Sato static bool trans_FDIV_mr(DisasContext *ctx, arg_FDIV_mr *a)
11444aea3d0cSYoshinori Sato {
1145*e283adeaSRichard Henderson     prt_ldmi(ctx, "fdiv", a->ld, RX_IM_LONG, a->rs, a->rd);
11464aea3d0cSYoshinori Sato     return true;
11474aea3d0cSYoshinori Sato }
11484aea3d0cSYoshinori Sato 
11494aea3d0cSYoshinori Sato /* round dsp[rs], rd */
11504aea3d0cSYoshinori Sato /* round rs, rd */
11514aea3d0cSYoshinori Sato static bool trans_ROUND(DisasContext *ctx, arg_ROUND *a)
11524aea3d0cSYoshinori Sato {
1153*e283adeaSRichard Henderson     prt_ldmi(ctx, "round", a->ld, RX_IM_LONG, a->rs, a->rd);
11544aea3d0cSYoshinori Sato     return true;
11554aea3d0cSYoshinori Sato }
11564aea3d0cSYoshinori Sato 
11574aea3d0cSYoshinori Sato /* itof rs, rd */
11584aea3d0cSYoshinori Sato /* itof dsp[rs], rd */
11594aea3d0cSYoshinori Sato static bool trans_ITOF(DisasContext *ctx, arg_ITOF *a)
11604aea3d0cSYoshinori Sato {
1161*e283adeaSRichard Henderson     prt_ldmi(ctx, "itof", a->ld, RX_IM_LONG, a->rs, a->rd);
11624aea3d0cSYoshinori Sato     return true;
11634aea3d0cSYoshinori Sato }
11644aea3d0cSYoshinori Sato 
11654aea3d0cSYoshinori Sato #define BOP_IM(name, reg)                                       \
11664aea3d0cSYoshinori Sato     do {                                                        \
1167fa6289e2SRichard Henderson         char dsp[8];                                            \
1168fa6289e2SRichard Henderson         rx_index_addr(ctx, dsp, a->ld, RX_MEMORY_BYTE);         \
1169fa6289e2SRichard Henderson         prt("b%s\t#%d, %s[r%d]", #name, a->imm, dsp, reg);      \
11704aea3d0cSYoshinori Sato         return true;                                            \
11714aea3d0cSYoshinori Sato     } while (0)
11724aea3d0cSYoshinori Sato 
11734aea3d0cSYoshinori Sato #define BOP_RM(name)                                            \
11744aea3d0cSYoshinori Sato     do {                                                        \
1175fa6289e2SRichard Henderson         char dsp[8];                                            \
1176fa6289e2SRichard Henderson         rx_index_addr(ctx, dsp, a->ld, RX_MEMORY_BYTE);         \
1177fa6289e2SRichard Henderson         prt("b%s\tr%d, %s[r%d]", #name, a->rd, dsp, a->rs);     \
11784aea3d0cSYoshinori Sato         return true;                                            \
11794aea3d0cSYoshinori Sato     } while (0)
11804aea3d0cSYoshinori Sato 
11814aea3d0cSYoshinori Sato /* bset #imm, dsp[rd] */
11824aea3d0cSYoshinori Sato static bool trans_BSET_im(DisasContext *ctx, arg_BSET_im *a)
11834aea3d0cSYoshinori Sato {
11844aea3d0cSYoshinori Sato     BOP_IM(bset, a->rs);
11854aea3d0cSYoshinori Sato }
11864aea3d0cSYoshinori Sato 
11874aea3d0cSYoshinori Sato /* bset rs, dsp[rd] */
11884aea3d0cSYoshinori Sato static bool trans_BSET_rm(DisasContext *ctx, arg_BSET_rm *a)
11894aea3d0cSYoshinori Sato {
11904aea3d0cSYoshinori Sato     BOP_RM(set);
11914aea3d0cSYoshinori Sato }
11924aea3d0cSYoshinori Sato 
11934aea3d0cSYoshinori Sato /* bset rs, rd */
11944aea3d0cSYoshinori Sato static bool trans_BSET_rr(DisasContext *ctx, arg_BSET_rr *a)
11954aea3d0cSYoshinori Sato {
11964aea3d0cSYoshinori Sato     prt("bset\tr%d,r%d", a->rs, a->rd);
11974aea3d0cSYoshinori Sato     return true;
11984aea3d0cSYoshinori Sato }
11994aea3d0cSYoshinori Sato 
12004aea3d0cSYoshinori Sato /* bset #imm, rd */
12014aea3d0cSYoshinori Sato static bool trans_BSET_ir(DisasContext *ctx, arg_BSET_ir *a)
12024aea3d0cSYoshinori Sato {
12034aea3d0cSYoshinori Sato     prt("bset\t#%d, r%d", a->imm, a->rd);
12044aea3d0cSYoshinori Sato     return true;
12054aea3d0cSYoshinori Sato }
12064aea3d0cSYoshinori Sato 
12074aea3d0cSYoshinori Sato /* bclr #imm, dsp[rd] */
12084aea3d0cSYoshinori Sato static bool trans_BCLR_im(DisasContext *ctx, arg_BCLR_im *a)
12094aea3d0cSYoshinori Sato {
12104aea3d0cSYoshinori Sato     BOP_IM(clr, a->rs);
12114aea3d0cSYoshinori Sato }
12124aea3d0cSYoshinori Sato 
12134aea3d0cSYoshinori Sato /* bclr rs, dsp[rd] */
12144aea3d0cSYoshinori Sato static bool trans_BCLR_rm(DisasContext *ctx, arg_BCLR_rm *a)
12154aea3d0cSYoshinori Sato {
12164aea3d0cSYoshinori Sato     BOP_RM(clr);
12174aea3d0cSYoshinori Sato }
12184aea3d0cSYoshinori Sato 
12194aea3d0cSYoshinori Sato /* bclr rs, rd */
12204aea3d0cSYoshinori Sato static bool trans_BCLR_rr(DisasContext *ctx, arg_BCLR_rr *a)
12214aea3d0cSYoshinori Sato {
12224aea3d0cSYoshinori Sato     prt("bclr\tr%d, r%d", a->rs, a->rd);
12234aea3d0cSYoshinori Sato     return true;
12244aea3d0cSYoshinori Sato }
12254aea3d0cSYoshinori Sato 
12264aea3d0cSYoshinori Sato /* bclr #imm, rd */
12274aea3d0cSYoshinori Sato static bool trans_BCLR_ir(DisasContext *ctx, arg_BCLR_ir *a)
12284aea3d0cSYoshinori Sato {
12294aea3d0cSYoshinori Sato     prt("bclr\t#%d,r%d", a->imm, a->rd);
12304aea3d0cSYoshinori Sato     return true;
12314aea3d0cSYoshinori Sato }
12324aea3d0cSYoshinori Sato 
12334aea3d0cSYoshinori Sato /* btst #imm, dsp[rd] */
12344aea3d0cSYoshinori Sato static bool trans_BTST_im(DisasContext *ctx, arg_BTST_im *a)
12354aea3d0cSYoshinori Sato {
12364aea3d0cSYoshinori Sato     BOP_IM(tst, a->rs);
12374aea3d0cSYoshinori Sato }
12384aea3d0cSYoshinori Sato 
12394aea3d0cSYoshinori Sato /* btst rs, dsp[rd] */
12404aea3d0cSYoshinori Sato static bool trans_BTST_rm(DisasContext *ctx, arg_BTST_rm *a)
12414aea3d0cSYoshinori Sato {
12424aea3d0cSYoshinori Sato     BOP_RM(tst);
12434aea3d0cSYoshinori Sato }
12444aea3d0cSYoshinori Sato 
12454aea3d0cSYoshinori Sato /* btst rs, rd */
12464aea3d0cSYoshinori Sato static bool trans_BTST_rr(DisasContext *ctx, arg_BTST_rr *a)
12474aea3d0cSYoshinori Sato {
12484aea3d0cSYoshinori Sato     prt("btst\tr%d, r%d", a->rs, a->rd);
12494aea3d0cSYoshinori Sato     return true;
12504aea3d0cSYoshinori Sato }
12514aea3d0cSYoshinori Sato 
12524aea3d0cSYoshinori Sato /* btst #imm, rd */
12534aea3d0cSYoshinori Sato static bool trans_BTST_ir(DisasContext *ctx, arg_BTST_ir *a)
12544aea3d0cSYoshinori Sato {
12554aea3d0cSYoshinori Sato     prt("btst\t#%d, r%d", a->imm, a->rd);
12564aea3d0cSYoshinori Sato     return true;
12574aea3d0cSYoshinori Sato }
12584aea3d0cSYoshinori Sato 
12594aea3d0cSYoshinori Sato /* bnot rs, dsp[rd] */
12604aea3d0cSYoshinori Sato static bool trans_BNOT_rm(DisasContext *ctx, arg_BNOT_rm *a)
12614aea3d0cSYoshinori Sato {
12624aea3d0cSYoshinori Sato     BOP_RM(not);
12634aea3d0cSYoshinori Sato }
12644aea3d0cSYoshinori Sato 
12654aea3d0cSYoshinori Sato /* bnot rs, rd */
12664aea3d0cSYoshinori Sato static bool trans_BNOT_rr(DisasContext *ctx, arg_BNOT_rr *a)
12674aea3d0cSYoshinori Sato {
12684aea3d0cSYoshinori Sato     prt("bnot\tr%d, r%d", a->rs, a->rd);
12694aea3d0cSYoshinori Sato     return true;
12704aea3d0cSYoshinori Sato }
12714aea3d0cSYoshinori Sato 
12724aea3d0cSYoshinori Sato /* bnot #imm, dsp[rd] */
12734aea3d0cSYoshinori Sato static bool trans_BNOT_im(DisasContext *ctx, arg_BNOT_im *a)
12744aea3d0cSYoshinori Sato {
12754aea3d0cSYoshinori Sato     BOP_IM(not, a->rs);
12764aea3d0cSYoshinori Sato }
12774aea3d0cSYoshinori Sato 
12784aea3d0cSYoshinori Sato /* bnot #imm, rd */
12794aea3d0cSYoshinori Sato static bool trans_BNOT_ir(DisasContext *ctx, arg_BNOT_ir *a)
12804aea3d0cSYoshinori Sato {
12814aea3d0cSYoshinori Sato     prt("bnot\t#%d, r%d", a->imm, a->rd);
12824aea3d0cSYoshinori Sato     return true;
12834aea3d0cSYoshinori Sato }
12844aea3d0cSYoshinori Sato 
12854aea3d0cSYoshinori Sato /* bmcond #imm, dsp[rd] */
12864aea3d0cSYoshinori Sato static bool trans_BMCnd_im(DisasContext *ctx, arg_BMCnd_im *a)
12874aea3d0cSYoshinori Sato {
1288fa6289e2SRichard Henderson     char dsp[8];
1289fa6289e2SRichard Henderson 
1290fa6289e2SRichard Henderson     rx_index_addr(ctx, dsp, a->ld, RX_MEMORY_BYTE);
1291fa6289e2SRichard Henderson     prt("bm%s\t#%d, %s[r%d]", cond[a->cd], a->imm, dsp, a->rd);
12924aea3d0cSYoshinori Sato     return true;
12934aea3d0cSYoshinori Sato }
12944aea3d0cSYoshinori Sato 
12954aea3d0cSYoshinori Sato /* bmcond #imm, rd */
12964aea3d0cSYoshinori Sato static bool trans_BMCnd_ir(DisasContext *ctx, arg_BMCnd_ir *a)
12974aea3d0cSYoshinori Sato {
12984aea3d0cSYoshinori Sato     prt("bm%s\t#%d, r%d", cond[a->cd], a->imm, a->rd);
12994aea3d0cSYoshinori Sato     return true;
13004aea3d0cSYoshinori Sato }
13014aea3d0cSYoshinori Sato 
13024aea3d0cSYoshinori Sato /* clrpsw psw */
13034aea3d0cSYoshinori Sato static bool trans_CLRPSW(DisasContext *ctx, arg_CLRPSW *a)
13044aea3d0cSYoshinori Sato {
13054aea3d0cSYoshinori Sato     prt("clrpsw\t%c", psw[a->cb]);
13064aea3d0cSYoshinori Sato     return true;
13074aea3d0cSYoshinori Sato }
13084aea3d0cSYoshinori Sato 
13094aea3d0cSYoshinori Sato /* setpsw psw */
13104aea3d0cSYoshinori Sato static bool trans_SETPSW(DisasContext *ctx, arg_SETPSW *a)
13114aea3d0cSYoshinori Sato {
13124aea3d0cSYoshinori Sato     prt("setpsw\t%c", psw[a->cb]);
13134aea3d0cSYoshinori Sato     return true;
13144aea3d0cSYoshinori Sato }
13154aea3d0cSYoshinori Sato 
13164aea3d0cSYoshinori Sato /* mvtipl #imm */
13174aea3d0cSYoshinori Sato static bool trans_MVTIPL(DisasContext *ctx, arg_MVTIPL *a)
13184aea3d0cSYoshinori Sato {
13194aea3d0cSYoshinori Sato     prt("movtipl\t#%d", a->imm);
13204aea3d0cSYoshinori Sato     return true;
13214aea3d0cSYoshinori Sato }
13224aea3d0cSYoshinori Sato 
13234aea3d0cSYoshinori Sato /* mvtc #imm, rd */
13244aea3d0cSYoshinori Sato static bool trans_MVTC_i(DisasContext *ctx, arg_MVTC_i *a)
13254aea3d0cSYoshinori Sato {
13264aea3d0cSYoshinori Sato     prt("mvtc\t#0x%08x, %s", a->imm, rx_crname(a->cr));
13274aea3d0cSYoshinori Sato     return true;
13284aea3d0cSYoshinori Sato }
13294aea3d0cSYoshinori Sato 
13304aea3d0cSYoshinori Sato /* mvtc rs, rd */
13314aea3d0cSYoshinori Sato static bool trans_MVTC_r(DisasContext *ctx, arg_MVTC_r *a)
13324aea3d0cSYoshinori Sato {
13334aea3d0cSYoshinori Sato     prt("mvtc\tr%d, %s", a->rs, rx_crname(a->cr));
13344aea3d0cSYoshinori Sato     return true;
13354aea3d0cSYoshinori Sato }
13364aea3d0cSYoshinori Sato 
13374aea3d0cSYoshinori Sato /* mvfc rs, rd */
13384aea3d0cSYoshinori Sato static bool trans_MVFC(DisasContext *ctx, arg_MVFC *a)
13394aea3d0cSYoshinori Sato {
13404aea3d0cSYoshinori Sato     prt("mvfc\t%s, r%d", rx_crname(a->cr), a->rd);
13414aea3d0cSYoshinori Sato     return true;
13424aea3d0cSYoshinori Sato }
13434aea3d0cSYoshinori Sato 
13444aea3d0cSYoshinori Sato /* rtfi */
13454aea3d0cSYoshinori Sato static bool trans_RTFI(DisasContext *ctx, arg_RTFI *a)
13464aea3d0cSYoshinori Sato {
13474aea3d0cSYoshinori Sato     prt("rtfi");
13484aea3d0cSYoshinori Sato     return true;
13494aea3d0cSYoshinori Sato }
13504aea3d0cSYoshinori Sato 
13514aea3d0cSYoshinori Sato /* rte */
13524aea3d0cSYoshinori Sato static bool trans_RTE(DisasContext *ctx, arg_RTE *a)
13534aea3d0cSYoshinori Sato {
13544aea3d0cSYoshinori Sato     prt("rte");
13554aea3d0cSYoshinori Sato     return true;
13564aea3d0cSYoshinori Sato }
13574aea3d0cSYoshinori Sato 
13584aea3d0cSYoshinori Sato /* brk */
13594aea3d0cSYoshinori Sato static bool trans_BRK(DisasContext *ctx, arg_BRK *a)
13604aea3d0cSYoshinori Sato {
13614aea3d0cSYoshinori Sato     prt("brk");
13624aea3d0cSYoshinori Sato     return true;
13634aea3d0cSYoshinori Sato }
13644aea3d0cSYoshinori Sato 
13654aea3d0cSYoshinori Sato /* int #imm */
13664aea3d0cSYoshinori Sato static bool trans_INT(DisasContext *ctx, arg_INT *a)
13674aea3d0cSYoshinori Sato {
13684aea3d0cSYoshinori Sato     prt("int\t#%d", a->imm);
13694aea3d0cSYoshinori Sato     return true;
13704aea3d0cSYoshinori Sato }
13714aea3d0cSYoshinori Sato 
13724aea3d0cSYoshinori Sato /* wait */
13734aea3d0cSYoshinori Sato static bool trans_WAIT(DisasContext *ctx, arg_WAIT *a)
13744aea3d0cSYoshinori Sato {
13754aea3d0cSYoshinori Sato     prt("wait");
13764aea3d0cSYoshinori Sato     return true;
13774aea3d0cSYoshinori Sato }
13784aea3d0cSYoshinori Sato 
13794aea3d0cSYoshinori Sato /* sccnd.[bwl] rd */
13804aea3d0cSYoshinori Sato /* sccnd.[bwl] dsp:[rd] */
13814aea3d0cSYoshinori Sato static bool trans_SCCnd(DisasContext *ctx, arg_SCCnd *a)
13824aea3d0cSYoshinori Sato {
13834aea3d0cSYoshinori Sato     if (a->ld < 3) {
1384fa6289e2SRichard Henderson         char dsp[8];
1385fa6289e2SRichard Henderson         rx_index_addr(ctx, dsp, a->sz, a->ld);
1386fa6289e2SRichard Henderson         prt("sc%s.%c\t%s[r%d]", cond[a->cd], size[a->sz], dsp, a->rd);
13874aea3d0cSYoshinori Sato     } else {
1388fa6289e2SRichard Henderson         prt("sc%s.%c\tr%d", cond[a->cd], size[a->sz], a->rd);
13894aea3d0cSYoshinori Sato     }
13904aea3d0cSYoshinori Sato     return true;
13914aea3d0cSYoshinori Sato }
13924aea3d0cSYoshinori Sato 
13934aea3d0cSYoshinori Sato int print_insn_rx(bfd_vma addr, disassemble_info *dis)
13944aea3d0cSYoshinori Sato {
13954aea3d0cSYoshinori Sato     DisasContext ctx;
13964aea3d0cSYoshinori Sato     uint32_t insn;
13974aea3d0cSYoshinori Sato     int i;
13984aea3d0cSYoshinori Sato     ctx.dis = dis;
13994aea3d0cSYoshinori Sato     ctx.pc = ctx.addr = addr;
14004aea3d0cSYoshinori Sato 
14014aea3d0cSYoshinori Sato     insn = decode_load(&ctx);
14024aea3d0cSYoshinori Sato     if (!decode(&ctx, insn)) {
14034aea3d0cSYoshinori Sato         ctx.dis->fprintf_func(ctx.dis->stream, ".byte\t");
14044aea3d0cSYoshinori Sato         for (i = 0; i < ctx.addr - addr; i++) {
14054aea3d0cSYoshinori Sato             if (i > 0) {
14064aea3d0cSYoshinori Sato                 ctx.dis->fprintf_func(ctx.dis->stream, ",");
14074aea3d0cSYoshinori Sato             }
14084aea3d0cSYoshinori Sato             ctx.dis->fprintf_func(ctx.dis->stream, "0x%02x", insn >> 24);
14094aea3d0cSYoshinori Sato             insn <<= 8;
14104aea3d0cSYoshinori Sato         }
14114aea3d0cSYoshinori Sato     }
14124aea3d0cSYoshinori Sato     return ctx.addr - addr;
14134aea3d0cSYoshinori Sato }
1414