xref: /openbmc/qemu/target/rx/disas.c (revision 4aea3d0c)
1*4aea3d0cSYoshinori Sato /*
2*4aea3d0cSYoshinori Sato  * Renesas RX Disassembler
3*4aea3d0cSYoshinori Sato  *
4*4aea3d0cSYoshinori Sato  * Copyright (c) 2019 Yoshinori Sato <ysato@users.sourceforge.jp>
5*4aea3d0cSYoshinori Sato  *
6*4aea3d0cSYoshinori Sato  * This program is free software; you can redistribute it and/or modify it
7*4aea3d0cSYoshinori Sato  * under the terms and conditions of the GNU General Public License,
8*4aea3d0cSYoshinori Sato  * version 2 or later, as published by the Free Software Foundation.
9*4aea3d0cSYoshinori Sato  *
10*4aea3d0cSYoshinori Sato  * This program is distributed in the hope it will be useful, but WITHOUT
11*4aea3d0cSYoshinori Sato  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12*4aea3d0cSYoshinori Sato  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13*4aea3d0cSYoshinori Sato  * more details.
14*4aea3d0cSYoshinori Sato  *
15*4aea3d0cSYoshinori Sato  * You should have received a copy of the GNU General Public License along with
16*4aea3d0cSYoshinori Sato  * this program.  If not, see <http://www.gnu.org/licenses/>.
17*4aea3d0cSYoshinori Sato  */
18*4aea3d0cSYoshinori Sato 
19*4aea3d0cSYoshinori Sato #include "qemu/osdep.h"
20*4aea3d0cSYoshinori Sato #include "disas/dis-asm.h"
21*4aea3d0cSYoshinori Sato #include "qemu/bitops.h"
22*4aea3d0cSYoshinori Sato #include "cpu.h"
23*4aea3d0cSYoshinori Sato 
24*4aea3d0cSYoshinori Sato typedef struct DisasContext {
25*4aea3d0cSYoshinori Sato     disassemble_info *dis;
26*4aea3d0cSYoshinori Sato     uint32_t addr;
27*4aea3d0cSYoshinori Sato     uint32_t pc;
28*4aea3d0cSYoshinori Sato } DisasContext;
29*4aea3d0cSYoshinori Sato 
30*4aea3d0cSYoshinori Sato 
31*4aea3d0cSYoshinori Sato static uint32_t decode_load_bytes(DisasContext *ctx, uint32_t insn,
32*4aea3d0cSYoshinori Sato                            int i, int n)
33*4aea3d0cSYoshinori Sato {
34*4aea3d0cSYoshinori Sato     bfd_byte buf;
35*4aea3d0cSYoshinori Sato     while (++i <= n) {
36*4aea3d0cSYoshinori Sato         ctx->dis->read_memory_func(ctx->addr++, &buf, 1, ctx->dis);
37*4aea3d0cSYoshinori Sato         insn |= buf << (32 - i * 8);
38*4aea3d0cSYoshinori Sato     }
39*4aea3d0cSYoshinori Sato     return insn;
40*4aea3d0cSYoshinori Sato }
41*4aea3d0cSYoshinori Sato 
42*4aea3d0cSYoshinori Sato static int32_t li(DisasContext *ctx, int sz)
43*4aea3d0cSYoshinori Sato {
44*4aea3d0cSYoshinori Sato     int32_t addr;
45*4aea3d0cSYoshinori Sato     bfd_byte buf[4];
46*4aea3d0cSYoshinori Sato     addr = ctx->addr;
47*4aea3d0cSYoshinori Sato 
48*4aea3d0cSYoshinori Sato     switch (sz) {
49*4aea3d0cSYoshinori Sato     case 1:
50*4aea3d0cSYoshinori Sato         ctx->addr += 1;
51*4aea3d0cSYoshinori Sato         ctx->dis->read_memory_func(addr, buf, 1, ctx->dis);
52*4aea3d0cSYoshinori Sato         return (int8_t)buf[0];
53*4aea3d0cSYoshinori Sato     case 2:
54*4aea3d0cSYoshinori Sato         ctx->addr += 2;
55*4aea3d0cSYoshinori Sato         ctx->dis->read_memory_func(addr, buf, 2, ctx->dis);
56*4aea3d0cSYoshinori Sato         return ldsw_le_p(buf);
57*4aea3d0cSYoshinori Sato     case 3:
58*4aea3d0cSYoshinori Sato         ctx->addr += 3;
59*4aea3d0cSYoshinori Sato         ctx->dis->read_memory_func(addr, buf, 3, ctx->dis);
60*4aea3d0cSYoshinori Sato         return (int8_t)buf[2] << 16 | lduw_le_p(buf);
61*4aea3d0cSYoshinori Sato     case 0:
62*4aea3d0cSYoshinori Sato         ctx->addr += 4;
63*4aea3d0cSYoshinori Sato         ctx->dis->read_memory_func(addr, buf, 4, ctx->dis);
64*4aea3d0cSYoshinori Sato         return ldl_le_p(buf);
65*4aea3d0cSYoshinori Sato     default:
66*4aea3d0cSYoshinori Sato         g_assert_not_reached();
67*4aea3d0cSYoshinori Sato     }
68*4aea3d0cSYoshinori Sato }
69*4aea3d0cSYoshinori Sato 
70*4aea3d0cSYoshinori Sato static int bdsp_s(DisasContext *ctx, int d)
71*4aea3d0cSYoshinori Sato {
72*4aea3d0cSYoshinori Sato     /*
73*4aea3d0cSYoshinori Sato      * 0 -> 8
74*4aea3d0cSYoshinori Sato      * 1 -> 9
75*4aea3d0cSYoshinori Sato      * 2 -> 10
76*4aea3d0cSYoshinori Sato      * 3 -> 3
77*4aea3d0cSYoshinori Sato      * :
78*4aea3d0cSYoshinori Sato      * 7 -> 7
79*4aea3d0cSYoshinori Sato      */
80*4aea3d0cSYoshinori Sato     if (d < 3) {
81*4aea3d0cSYoshinori Sato         d += 8;
82*4aea3d0cSYoshinori Sato     }
83*4aea3d0cSYoshinori Sato     return d;
84*4aea3d0cSYoshinori Sato }
85*4aea3d0cSYoshinori Sato 
86*4aea3d0cSYoshinori Sato /* Include the auto-generated decoder.  */
87*4aea3d0cSYoshinori Sato #include "decode.inc.c"
88*4aea3d0cSYoshinori Sato 
89*4aea3d0cSYoshinori Sato #define prt(...) (ctx->dis->fprintf_func)((ctx->dis->stream), __VA_ARGS__)
90*4aea3d0cSYoshinori Sato 
91*4aea3d0cSYoshinori Sato #define RX_MEMORY_BYTE 0
92*4aea3d0cSYoshinori Sato #define RX_MEMORY_WORD 1
93*4aea3d0cSYoshinori Sato #define RX_MEMORY_LONG 2
94*4aea3d0cSYoshinori Sato 
95*4aea3d0cSYoshinori Sato #define RX_IM_BYTE 0
96*4aea3d0cSYoshinori Sato #define RX_IM_WORD 1
97*4aea3d0cSYoshinori Sato #define RX_IM_LONG 2
98*4aea3d0cSYoshinori Sato #define RX_IM_UWORD 3
99*4aea3d0cSYoshinori Sato 
100*4aea3d0cSYoshinori Sato static const char size[] = {'b', 'w', 'l'};
101*4aea3d0cSYoshinori Sato static const char cond[][4] = {
102*4aea3d0cSYoshinori Sato     "eq", "ne", "c", "nc", "gtu", "leu", "pz", "n",
103*4aea3d0cSYoshinori Sato     "ge", "lt", "gt", "le", "o", "no", "ra", "f"
104*4aea3d0cSYoshinori Sato };
105*4aea3d0cSYoshinori Sato static const char psw[] = {
106*4aea3d0cSYoshinori Sato     'c', 'z', 's', 'o', 0, 0, 0, 0,
107*4aea3d0cSYoshinori Sato     'i', 'u', 0, 0, 0, 0, 0, 0,
108*4aea3d0cSYoshinori Sato };
109*4aea3d0cSYoshinori Sato 
110*4aea3d0cSYoshinori Sato static uint32_t rx_index_addr(int ld, int size, DisasContext *ctx)
111*4aea3d0cSYoshinori Sato {
112*4aea3d0cSYoshinori Sato     bfd_byte buf[2];
113*4aea3d0cSYoshinori Sato     switch (ld) {
114*4aea3d0cSYoshinori Sato     case 0:
115*4aea3d0cSYoshinori Sato         return 0;
116*4aea3d0cSYoshinori Sato     case 1:
117*4aea3d0cSYoshinori Sato         ctx->dis->read_memory_func(ctx->addr, buf, 1, ctx->dis);
118*4aea3d0cSYoshinori Sato         ctx->addr += 1;
119*4aea3d0cSYoshinori Sato         return ((uint8_t)buf[0]) << size;
120*4aea3d0cSYoshinori Sato     case 2:
121*4aea3d0cSYoshinori Sato         ctx->dis->read_memory_func(ctx->addr, buf, 2, ctx->dis);
122*4aea3d0cSYoshinori Sato         ctx->addr += 2;
123*4aea3d0cSYoshinori Sato         return lduw_le_p(buf) << size;
124*4aea3d0cSYoshinori Sato     }
125*4aea3d0cSYoshinori Sato     g_assert_not_reached();
126*4aea3d0cSYoshinori Sato }
127*4aea3d0cSYoshinori Sato 
128*4aea3d0cSYoshinori Sato static void operand(DisasContext *ctx, int ld, int mi, int rs, int rd)
129*4aea3d0cSYoshinori Sato {
130*4aea3d0cSYoshinori Sato     int dsp;
131*4aea3d0cSYoshinori Sato     static const char sizes[][4] = {".b", ".w", ".l", ".uw", ".ub"};
132*4aea3d0cSYoshinori Sato     if (ld < 3) {
133*4aea3d0cSYoshinori Sato         switch (mi) {
134*4aea3d0cSYoshinori Sato         case 4:
135*4aea3d0cSYoshinori Sato             /* dsp[rs].ub */
136*4aea3d0cSYoshinori Sato             dsp = rx_index_addr(ld, RX_MEMORY_BYTE, ctx);
137*4aea3d0cSYoshinori Sato             break;
138*4aea3d0cSYoshinori Sato         case 3:
139*4aea3d0cSYoshinori Sato             /* dsp[rs].uw */
140*4aea3d0cSYoshinori Sato             dsp = rx_index_addr(ld, RX_MEMORY_WORD, ctx);
141*4aea3d0cSYoshinori Sato             break;
142*4aea3d0cSYoshinori Sato         default:
143*4aea3d0cSYoshinori Sato             /* dsp[rs].b */
144*4aea3d0cSYoshinori Sato             /* dsp[rs].w */
145*4aea3d0cSYoshinori Sato             /* dsp[rs].l */
146*4aea3d0cSYoshinori Sato             dsp = rx_index_addr(ld, mi, ctx);
147*4aea3d0cSYoshinori Sato             break;
148*4aea3d0cSYoshinori Sato         }
149*4aea3d0cSYoshinori Sato         if (dsp > 0) {
150*4aea3d0cSYoshinori Sato             prt("%d", dsp);
151*4aea3d0cSYoshinori Sato         }
152*4aea3d0cSYoshinori Sato         prt("[r%d]%s", rs, sizes[mi]);
153*4aea3d0cSYoshinori Sato     } else {
154*4aea3d0cSYoshinori Sato         prt("r%d", rs);
155*4aea3d0cSYoshinori Sato     }
156*4aea3d0cSYoshinori Sato     prt(", r%d", rd);
157*4aea3d0cSYoshinori Sato }
158*4aea3d0cSYoshinori Sato 
159*4aea3d0cSYoshinori Sato static void prt_ir(DisasContext *ctx, const char *insn, int imm, int rd)
160*4aea3d0cSYoshinori Sato {
161*4aea3d0cSYoshinori Sato     if (imm < 0x100) {
162*4aea3d0cSYoshinori Sato         prt("%s\t#%d, r%d", insn, imm, rd);
163*4aea3d0cSYoshinori Sato     } else {
164*4aea3d0cSYoshinori Sato         prt("%s\t#0x%08x, r%d", insn, imm, rd);
165*4aea3d0cSYoshinori Sato     }
166*4aea3d0cSYoshinori Sato }
167*4aea3d0cSYoshinori Sato 
168*4aea3d0cSYoshinori Sato /* mov.[bwl] rs,dsp:[rd] */
169*4aea3d0cSYoshinori Sato static bool trans_MOV_rm(DisasContext *ctx, arg_MOV_rm *a)
170*4aea3d0cSYoshinori Sato {
171*4aea3d0cSYoshinori Sato     if (a->dsp > 0) {
172*4aea3d0cSYoshinori Sato         prt("mov.%c\tr%d,%d[r%d]",
173*4aea3d0cSYoshinori Sato             size[a->sz], a->rs, a->dsp << a->sz, a->rd);
174*4aea3d0cSYoshinori Sato     } else {
175*4aea3d0cSYoshinori Sato         prt("mov.%c\tr%d,[r%d]",
176*4aea3d0cSYoshinori Sato             size[a->sz], a->rs, a->rd);
177*4aea3d0cSYoshinori Sato     }
178*4aea3d0cSYoshinori Sato     return true;
179*4aea3d0cSYoshinori Sato }
180*4aea3d0cSYoshinori Sato 
181*4aea3d0cSYoshinori Sato /* mov.[bwl] dsp:[rs],rd */
182*4aea3d0cSYoshinori Sato static bool trans_MOV_mr(DisasContext *ctx, arg_MOV_mr *a)
183*4aea3d0cSYoshinori Sato {
184*4aea3d0cSYoshinori Sato     if (a->dsp > 0) {
185*4aea3d0cSYoshinori Sato         prt("mov.%c\t%d[r%d], r%d",
186*4aea3d0cSYoshinori Sato             size[a->sz], a->dsp << a->sz, a->rs, a->rd);
187*4aea3d0cSYoshinori Sato     } else {
188*4aea3d0cSYoshinori Sato         prt("mov.%c\t[r%d], r%d",
189*4aea3d0cSYoshinori Sato             size[a->sz], a->rs, a->rd);
190*4aea3d0cSYoshinori Sato     }
191*4aea3d0cSYoshinori Sato     return true;
192*4aea3d0cSYoshinori Sato }
193*4aea3d0cSYoshinori Sato 
194*4aea3d0cSYoshinori Sato /* mov.l #uimm4,rd */
195*4aea3d0cSYoshinori Sato /* mov.l #uimm8,rd */
196*4aea3d0cSYoshinori Sato /* mov.l #imm,rd */
197*4aea3d0cSYoshinori Sato static bool trans_MOV_ir(DisasContext *ctx, arg_MOV_ir *a)
198*4aea3d0cSYoshinori Sato {
199*4aea3d0cSYoshinori Sato     prt_ir(ctx, "mov.l", a->imm, a->rd);
200*4aea3d0cSYoshinori Sato     return true;
201*4aea3d0cSYoshinori Sato }
202*4aea3d0cSYoshinori Sato 
203*4aea3d0cSYoshinori Sato /* mov.[bwl] #uimm8,dsp:[rd] */
204*4aea3d0cSYoshinori Sato /* mov #imm, dsp:[rd] */
205*4aea3d0cSYoshinori Sato static bool trans_MOV_im(DisasContext *ctx, arg_MOV_im *a)
206*4aea3d0cSYoshinori Sato {
207*4aea3d0cSYoshinori Sato     if (a->dsp > 0) {
208*4aea3d0cSYoshinori Sato         prt("mov.%c\t#%d,%d[r%d]",
209*4aea3d0cSYoshinori Sato             size[a->sz], a->imm, a->dsp << a->sz, a->rd);
210*4aea3d0cSYoshinori Sato     } else {
211*4aea3d0cSYoshinori Sato         prt("mov.%c\t#%d,[r%d]",
212*4aea3d0cSYoshinori Sato             size[a->sz], a->imm, a->rd);
213*4aea3d0cSYoshinori Sato     }
214*4aea3d0cSYoshinori Sato     return true;
215*4aea3d0cSYoshinori Sato }
216*4aea3d0cSYoshinori Sato 
217*4aea3d0cSYoshinori Sato /* mov.[bwl] [ri,rb],rd */
218*4aea3d0cSYoshinori Sato static bool trans_MOV_ar(DisasContext *ctx, arg_MOV_ar *a)
219*4aea3d0cSYoshinori Sato {
220*4aea3d0cSYoshinori Sato     prt("mov.%c\t[r%d,r%d], r%d", size[a->sz], a->ri, a->rb, a->rd);
221*4aea3d0cSYoshinori Sato     return true;
222*4aea3d0cSYoshinori Sato }
223*4aea3d0cSYoshinori Sato 
224*4aea3d0cSYoshinori Sato /* mov.[bwl] rd,[ri,rb] */
225*4aea3d0cSYoshinori Sato static bool trans_MOV_ra(DisasContext *ctx, arg_MOV_ra *a)
226*4aea3d0cSYoshinori Sato {
227*4aea3d0cSYoshinori Sato     prt("mov.%c\tr%d, [r%d, r%d]", size[a->sz], a->rs, a->ri, a->rb);
228*4aea3d0cSYoshinori Sato     return true;
229*4aea3d0cSYoshinori Sato }
230*4aea3d0cSYoshinori Sato 
231*4aea3d0cSYoshinori Sato 
232*4aea3d0cSYoshinori Sato /* mov.[bwl] dsp:[rs],dsp:[rd] */
233*4aea3d0cSYoshinori Sato /* mov.[bwl] rs,dsp:[rd] */
234*4aea3d0cSYoshinori Sato /* mov.[bwl] dsp:[rs],rd */
235*4aea3d0cSYoshinori Sato /* mov.[bwl] rs,rd */
236*4aea3d0cSYoshinori Sato static bool trans_MOV_mm(DisasContext *ctx, arg_MOV_mm *a)
237*4aea3d0cSYoshinori Sato {
238*4aea3d0cSYoshinori Sato     int dsp;
239*4aea3d0cSYoshinori Sato 
240*4aea3d0cSYoshinori Sato     prt("mov.%c\t", size[a->sz]);
241*4aea3d0cSYoshinori Sato     if (a->lds == 3 && a->ldd == 3) {
242*4aea3d0cSYoshinori Sato         /* mov.[bwl] rs,rd */
243*4aea3d0cSYoshinori Sato         prt("r%d, r%d", a->rs, a->rd);
244*4aea3d0cSYoshinori Sato         return true;
245*4aea3d0cSYoshinori Sato     }
246*4aea3d0cSYoshinori Sato     if (a->lds == 3) {
247*4aea3d0cSYoshinori Sato         prt("r%d, ", a->rd);
248*4aea3d0cSYoshinori Sato         dsp = rx_index_addr(a->ldd, a->sz, ctx);
249*4aea3d0cSYoshinori Sato         if (dsp > 0) {
250*4aea3d0cSYoshinori Sato             prt("%d", dsp);
251*4aea3d0cSYoshinori Sato         }
252*4aea3d0cSYoshinori Sato         prt("[r%d]", a->rs);
253*4aea3d0cSYoshinori Sato     } else if (a->ldd == 3) {
254*4aea3d0cSYoshinori Sato         dsp = rx_index_addr(a->lds, a->sz, ctx);
255*4aea3d0cSYoshinori Sato         if (dsp > 0) {
256*4aea3d0cSYoshinori Sato             prt("%d", dsp);
257*4aea3d0cSYoshinori Sato         }
258*4aea3d0cSYoshinori Sato         prt("[r%d], r%d", a->rs, a->rd);
259*4aea3d0cSYoshinori Sato     } else {
260*4aea3d0cSYoshinori Sato         dsp = rx_index_addr(a->lds, a->sz, ctx);
261*4aea3d0cSYoshinori Sato         if (dsp > 0) {
262*4aea3d0cSYoshinori Sato             prt("%d", dsp);
263*4aea3d0cSYoshinori Sato         }
264*4aea3d0cSYoshinori Sato         prt("[r%d], ", a->rs);
265*4aea3d0cSYoshinori Sato         dsp = rx_index_addr(a->ldd, a->sz, ctx);
266*4aea3d0cSYoshinori Sato         if (dsp > 0) {
267*4aea3d0cSYoshinori Sato             prt("%d", dsp);
268*4aea3d0cSYoshinori Sato         }
269*4aea3d0cSYoshinori Sato         prt("[r%d]", a->rd);
270*4aea3d0cSYoshinori Sato     }
271*4aea3d0cSYoshinori Sato     return true;
272*4aea3d0cSYoshinori Sato }
273*4aea3d0cSYoshinori Sato 
274*4aea3d0cSYoshinori Sato /* mov.[bwl] rs,[rd+] */
275*4aea3d0cSYoshinori Sato /* mov.[bwl] rs,[-rd] */
276*4aea3d0cSYoshinori Sato static bool trans_MOV_rp(DisasContext *ctx, arg_MOV_rp *a)
277*4aea3d0cSYoshinori Sato {
278*4aea3d0cSYoshinori Sato     prt("mov.%c\tr%d, ", size[a->sz], a->rs);
279*4aea3d0cSYoshinori Sato     prt((a->ad == 0) ? "[r%d+]" : "[-r%d]", a->rd);
280*4aea3d0cSYoshinori Sato     return true;
281*4aea3d0cSYoshinori Sato }
282*4aea3d0cSYoshinori Sato 
283*4aea3d0cSYoshinori Sato /* mov.[bwl] [rd+],rs */
284*4aea3d0cSYoshinori Sato /* mov.[bwl] [-rd],rs */
285*4aea3d0cSYoshinori Sato static bool trans_MOV_pr(DisasContext *ctx, arg_MOV_pr *a)
286*4aea3d0cSYoshinori Sato {
287*4aea3d0cSYoshinori Sato     prt("mov.%c\t", size[a->sz]);
288*4aea3d0cSYoshinori Sato     prt((a->ad == 0) ? "[r%d+]" : "[-r%d]", a->rd);
289*4aea3d0cSYoshinori Sato     prt(", r%d", a->rs);
290*4aea3d0cSYoshinori Sato     return true;
291*4aea3d0cSYoshinori Sato }
292*4aea3d0cSYoshinori Sato 
293*4aea3d0cSYoshinori Sato /* movu.[bw] dsp5:[rs],rd */
294*4aea3d0cSYoshinori Sato static bool trans_MOVU_mr(DisasContext *ctx, arg_MOVU_mr *a)
295*4aea3d0cSYoshinori Sato {
296*4aea3d0cSYoshinori Sato     if (a->dsp > 0) {
297*4aea3d0cSYoshinori Sato         prt("movu.%c\t%d[r%d], r%d", size[a->sz],
298*4aea3d0cSYoshinori Sato             a->dsp << a->sz, a->rs, a->rd);
299*4aea3d0cSYoshinori Sato     } else {
300*4aea3d0cSYoshinori Sato         prt("movu.%c\t[r%d], r%d", size[a->sz], a->rs, a->rd);
301*4aea3d0cSYoshinori Sato     }
302*4aea3d0cSYoshinori Sato     return true;
303*4aea3d0cSYoshinori Sato }
304*4aea3d0cSYoshinori Sato 
305*4aea3d0cSYoshinori Sato /* movu.[bw] rs,rd */
306*4aea3d0cSYoshinori Sato static bool trans_MOVU_rr(DisasContext *ctx, arg_MOVU_rr *a)
307*4aea3d0cSYoshinori Sato {
308*4aea3d0cSYoshinori Sato     prt("movu.%c\tr%d, r%d", size[a->sz], a->rs, a->rd);
309*4aea3d0cSYoshinori Sato     return true;
310*4aea3d0cSYoshinori Sato }
311*4aea3d0cSYoshinori Sato 
312*4aea3d0cSYoshinori Sato /* movu.[bw] [ri,rb],rd */
313*4aea3d0cSYoshinori Sato static bool trans_MOVU_ar(DisasContext *ctx, arg_MOVU_ar *a)
314*4aea3d0cSYoshinori Sato {
315*4aea3d0cSYoshinori Sato     prt("mov.%c\t[r%d,r%d], r%d", size[a->sz], a->ri, a->rb, a->rd);
316*4aea3d0cSYoshinori Sato     return true;
317*4aea3d0cSYoshinori Sato }
318*4aea3d0cSYoshinori Sato 
319*4aea3d0cSYoshinori Sato /* movu.[bw] [rs+],rd */
320*4aea3d0cSYoshinori Sato /* movu.[bw] [-rs],rd */
321*4aea3d0cSYoshinori Sato static bool trans_MOVU_pr(DisasContext *ctx, arg_MOVU_pr *a)
322*4aea3d0cSYoshinori Sato {
323*4aea3d0cSYoshinori Sato     prt("movu.%c\t", size[a->sz]);
324*4aea3d0cSYoshinori Sato     prt((a->ad == 0) ? "[r%d+]" : "[-r%d]", a->rd);
325*4aea3d0cSYoshinori Sato     prt(", r%d", a->rs);
326*4aea3d0cSYoshinori Sato     return true;
327*4aea3d0cSYoshinori Sato }
328*4aea3d0cSYoshinori Sato 
329*4aea3d0cSYoshinori Sato /* pop rd */
330*4aea3d0cSYoshinori Sato static bool trans_POP(DisasContext *ctx, arg_POP *a)
331*4aea3d0cSYoshinori Sato {
332*4aea3d0cSYoshinori Sato     prt("pop\tr%d", a->rd);
333*4aea3d0cSYoshinori Sato     return true;
334*4aea3d0cSYoshinori Sato }
335*4aea3d0cSYoshinori Sato 
336*4aea3d0cSYoshinori Sato /* popc rx */
337*4aea3d0cSYoshinori Sato static bool trans_POPC(DisasContext *ctx, arg_POPC *a)
338*4aea3d0cSYoshinori Sato {
339*4aea3d0cSYoshinori Sato     prt("pop\tr%s", rx_crname(a->cr));
340*4aea3d0cSYoshinori Sato     return true;
341*4aea3d0cSYoshinori Sato }
342*4aea3d0cSYoshinori Sato 
343*4aea3d0cSYoshinori Sato /* popm rd-rd2 */
344*4aea3d0cSYoshinori Sato static bool trans_POPM(DisasContext *ctx, arg_POPM *a)
345*4aea3d0cSYoshinori Sato {
346*4aea3d0cSYoshinori Sato     prt("popm\tr%d-r%d", a->rd, a->rd2);
347*4aea3d0cSYoshinori Sato     return true;
348*4aea3d0cSYoshinori Sato }
349*4aea3d0cSYoshinori Sato 
350*4aea3d0cSYoshinori Sato /* push rs */
351*4aea3d0cSYoshinori Sato static bool trans_PUSH_r(DisasContext *ctx, arg_PUSH_r *a)
352*4aea3d0cSYoshinori Sato {
353*4aea3d0cSYoshinori Sato     prt("push\tr%d", a->rs);
354*4aea3d0cSYoshinori Sato     return true;
355*4aea3d0cSYoshinori Sato }
356*4aea3d0cSYoshinori Sato 
357*4aea3d0cSYoshinori Sato /* push dsp[rs] */
358*4aea3d0cSYoshinori Sato static bool trans_PUSH_m(DisasContext *ctx, arg_PUSH_m *a)
359*4aea3d0cSYoshinori Sato {
360*4aea3d0cSYoshinori Sato     prt("push\t");
361*4aea3d0cSYoshinori Sato     int dsp = rx_index_addr(a->ld, a->sz, ctx);
362*4aea3d0cSYoshinori Sato     if (dsp > 0) {
363*4aea3d0cSYoshinori Sato         prt("%d", dsp);
364*4aea3d0cSYoshinori Sato     }
365*4aea3d0cSYoshinori Sato     prt("[r%d]", a->rs);
366*4aea3d0cSYoshinori Sato     return true;
367*4aea3d0cSYoshinori Sato }
368*4aea3d0cSYoshinori Sato 
369*4aea3d0cSYoshinori Sato /* pushc rx */
370*4aea3d0cSYoshinori Sato static bool trans_PUSHC(DisasContext *ctx, arg_PUSHC *a)
371*4aea3d0cSYoshinori Sato {
372*4aea3d0cSYoshinori Sato     prt("push\t%s", rx_crname(a->cr));
373*4aea3d0cSYoshinori Sato     return true;
374*4aea3d0cSYoshinori Sato }
375*4aea3d0cSYoshinori Sato 
376*4aea3d0cSYoshinori Sato /* pushm rs-rs2*/
377*4aea3d0cSYoshinori Sato static bool trans_PUSHM(DisasContext *ctx, arg_PUSHM *a)
378*4aea3d0cSYoshinori Sato {
379*4aea3d0cSYoshinori Sato     prt("pushm\tr%d-r%d", a->rs, a->rs2);
380*4aea3d0cSYoshinori Sato     return true;
381*4aea3d0cSYoshinori Sato }
382*4aea3d0cSYoshinori Sato 
383*4aea3d0cSYoshinori Sato /* xchg rs,rd */
384*4aea3d0cSYoshinori Sato static bool trans_XCHG_rr(DisasContext *ctx, arg_XCHG_rr *a)
385*4aea3d0cSYoshinori Sato {
386*4aea3d0cSYoshinori Sato     prt("xchg\tr%d, r%d", a->rs, a->rd);
387*4aea3d0cSYoshinori Sato     return true;
388*4aea3d0cSYoshinori Sato }
389*4aea3d0cSYoshinori Sato /* xchg dsp[rs].<mi>,rd */
390*4aea3d0cSYoshinori Sato static bool trans_XCHG_mr(DisasContext *ctx, arg_XCHG_mr *a)
391*4aea3d0cSYoshinori Sato {
392*4aea3d0cSYoshinori Sato     int dsp;
393*4aea3d0cSYoshinori Sato     static const char msize[][4] = {
394*4aea3d0cSYoshinori Sato         "b", "w", "l", "ub", "uw",
395*4aea3d0cSYoshinori Sato     };
396*4aea3d0cSYoshinori Sato 
397*4aea3d0cSYoshinori Sato     prt("xchg\t");
398*4aea3d0cSYoshinori Sato     dsp = rx_index_addr(a->ld, a->mi, ctx);
399*4aea3d0cSYoshinori Sato     if (dsp > 0) {
400*4aea3d0cSYoshinori Sato         prt("%d", dsp);
401*4aea3d0cSYoshinori Sato     }
402*4aea3d0cSYoshinori Sato     prt("[r%d].%s, r%d", a->rs, msize[a->mi], a->rd);
403*4aea3d0cSYoshinori Sato     return true;
404*4aea3d0cSYoshinori Sato }
405*4aea3d0cSYoshinori Sato 
406*4aea3d0cSYoshinori Sato /* stz #imm,rd */
407*4aea3d0cSYoshinori Sato static bool trans_STZ(DisasContext *ctx, arg_STZ *a)
408*4aea3d0cSYoshinori Sato {
409*4aea3d0cSYoshinori Sato     prt_ir(ctx, "stz", a->imm, a->rd);
410*4aea3d0cSYoshinori Sato     return true;
411*4aea3d0cSYoshinori Sato }
412*4aea3d0cSYoshinori Sato 
413*4aea3d0cSYoshinori Sato /* stnz #imm,rd */
414*4aea3d0cSYoshinori Sato static bool trans_STNZ(DisasContext *ctx, arg_STNZ *a)
415*4aea3d0cSYoshinori Sato {
416*4aea3d0cSYoshinori Sato     prt_ir(ctx, "stnz", a->imm, a->rd);
417*4aea3d0cSYoshinori Sato     return true;
418*4aea3d0cSYoshinori Sato }
419*4aea3d0cSYoshinori Sato 
420*4aea3d0cSYoshinori Sato /* rtsd #imm */
421*4aea3d0cSYoshinori Sato static bool trans_RTSD_i(DisasContext *ctx, arg_RTSD_i *a)
422*4aea3d0cSYoshinori Sato {
423*4aea3d0cSYoshinori Sato     prt("rtsd\t#%d", a->imm << 2);
424*4aea3d0cSYoshinori Sato     return true;
425*4aea3d0cSYoshinori Sato }
426*4aea3d0cSYoshinori Sato 
427*4aea3d0cSYoshinori Sato /* rtsd #imm, rd-rd2 */
428*4aea3d0cSYoshinori Sato static bool trans_RTSD_irr(DisasContext *ctx, arg_RTSD_irr *a)
429*4aea3d0cSYoshinori Sato {
430*4aea3d0cSYoshinori Sato     prt("rtsd\t#%d, r%d - r%d", a->imm << 2, a->rd, a->rd2);
431*4aea3d0cSYoshinori Sato     return true;
432*4aea3d0cSYoshinori Sato }
433*4aea3d0cSYoshinori Sato 
434*4aea3d0cSYoshinori Sato /* and #uimm:4, rd */
435*4aea3d0cSYoshinori Sato /* and #imm, rd */
436*4aea3d0cSYoshinori Sato static bool trans_AND_ir(DisasContext *ctx, arg_AND_ir *a)
437*4aea3d0cSYoshinori Sato {
438*4aea3d0cSYoshinori Sato     prt_ir(ctx, "and", a->imm, a->rd);
439*4aea3d0cSYoshinori Sato     return true;
440*4aea3d0cSYoshinori Sato }
441*4aea3d0cSYoshinori Sato 
442*4aea3d0cSYoshinori Sato /* and dsp[rs], rd */
443*4aea3d0cSYoshinori Sato /* and rs,rd */
444*4aea3d0cSYoshinori Sato static bool trans_AND_mr(DisasContext *ctx, arg_AND_mr *a)
445*4aea3d0cSYoshinori Sato {
446*4aea3d0cSYoshinori Sato     prt("and\t");
447*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
448*4aea3d0cSYoshinori Sato     return true;
449*4aea3d0cSYoshinori Sato }
450*4aea3d0cSYoshinori Sato 
451*4aea3d0cSYoshinori Sato /* and rs,rs2,rd */
452*4aea3d0cSYoshinori Sato static bool trans_AND_rrr(DisasContext *ctx, arg_AND_rrr *a)
453*4aea3d0cSYoshinori Sato {
454*4aea3d0cSYoshinori Sato     prt("and\tr%d,r%d, r%d", a->rs, a->rs2, a->rd);
455*4aea3d0cSYoshinori Sato     return true;
456*4aea3d0cSYoshinori Sato }
457*4aea3d0cSYoshinori Sato 
458*4aea3d0cSYoshinori Sato /* or #uimm:4, rd */
459*4aea3d0cSYoshinori Sato /* or #imm, rd */
460*4aea3d0cSYoshinori Sato static bool trans_OR_ir(DisasContext *ctx, arg_OR_ir *a)
461*4aea3d0cSYoshinori Sato {
462*4aea3d0cSYoshinori Sato     prt_ir(ctx, "or", a->imm, a->rd);
463*4aea3d0cSYoshinori Sato     return true;
464*4aea3d0cSYoshinori Sato }
465*4aea3d0cSYoshinori Sato 
466*4aea3d0cSYoshinori Sato /* or dsp[rs], rd */
467*4aea3d0cSYoshinori Sato /* or rs,rd */
468*4aea3d0cSYoshinori Sato static bool trans_OR_mr(DisasContext *ctx, arg_OR_mr *a)
469*4aea3d0cSYoshinori Sato {
470*4aea3d0cSYoshinori Sato     prt("or\t");
471*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
472*4aea3d0cSYoshinori Sato     return true;
473*4aea3d0cSYoshinori Sato }
474*4aea3d0cSYoshinori Sato 
475*4aea3d0cSYoshinori Sato /* or rs,rs2,rd */
476*4aea3d0cSYoshinori Sato static bool trans_OR_rrr(DisasContext *ctx, arg_OR_rrr *a)
477*4aea3d0cSYoshinori Sato {
478*4aea3d0cSYoshinori Sato     prt("or\tr%d, r%d, r%d", a->rs, a->rs2, a->rd);
479*4aea3d0cSYoshinori Sato     return true;
480*4aea3d0cSYoshinori Sato }
481*4aea3d0cSYoshinori Sato 
482*4aea3d0cSYoshinori Sato /* xor #imm, rd */
483*4aea3d0cSYoshinori Sato static bool trans_XOR_ir(DisasContext *ctx, arg_XOR_ir *a)
484*4aea3d0cSYoshinori Sato {
485*4aea3d0cSYoshinori Sato     prt_ir(ctx, "xor", a->imm, a->rd);
486*4aea3d0cSYoshinori Sato     return true;
487*4aea3d0cSYoshinori Sato }
488*4aea3d0cSYoshinori Sato 
489*4aea3d0cSYoshinori Sato /* xor dsp[rs], rd */
490*4aea3d0cSYoshinori Sato /* xor rs,rd */
491*4aea3d0cSYoshinori Sato static bool trans_XOR_mr(DisasContext *ctx, arg_XOR_mr *a)
492*4aea3d0cSYoshinori Sato {
493*4aea3d0cSYoshinori Sato     prt("xor\t");
494*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
495*4aea3d0cSYoshinori Sato     return true;
496*4aea3d0cSYoshinori Sato }
497*4aea3d0cSYoshinori Sato 
498*4aea3d0cSYoshinori Sato /* tst #imm, rd */
499*4aea3d0cSYoshinori Sato static bool trans_TST_ir(DisasContext *ctx, arg_TST_ir *a)
500*4aea3d0cSYoshinori Sato {
501*4aea3d0cSYoshinori Sato     prt_ir(ctx, "tst", a->imm, a->rd);
502*4aea3d0cSYoshinori Sato     return true;
503*4aea3d0cSYoshinori Sato }
504*4aea3d0cSYoshinori Sato 
505*4aea3d0cSYoshinori Sato /* tst dsp[rs], rd */
506*4aea3d0cSYoshinori Sato /* tst rs, rd */
507*4aea3d0cSYoshinori Sato static bool trans_TST_mr(DisasContext *ctx, arg_TST_mr *a)
508*4aea3d0cSYoshinori Sato {
509*4aea3d0cSYoshinori Sato     prt("tst\t");
510*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
511*4aea3d0cSYoshinori Sato     return true;
512*4aea3d0cSYoshinori Sato }
513*4aea3d0cSYoshinori Sato 
514*4aea3d0cSYoshinori Sato /* not rd */
515*4aea3d0cSYoshinori Sato /* not rs, rd */
516*4aea3d0cSYoshinori Sato static bool trans_NOT_rr(DisasContext *ctx, arg_NOT_rr *a)
517*4aea3d0cSYoshinori Sato {
518*4aea3d0cSYoshinori Sato     prt("not\t");
519*4aea3d0cSYoshinori Sato     if (a->rs != a->rd) {
520*4aea3d0cSYoshinori Sato         prt("r%d, ", a->rs);
521*4aea3d0cSYoshinori Sato     }
522*4aea3d0cSYoshinori Sato     prt("r%d", a->rd);
523*4aea3d0cSYoshinori Sato     return true;
524*4aea3d0cSYoshinori Sato }
525*4aea3d0cSYoshinori Sato 
526*4aea3d0cSYoshinori Sato /* neg rd */
527*4aea3d0cSYoshinori Sato /* neg rs, rd */
528*4aea3d0cSYoshinori Sato static bool trans_NEG_rr(DisasContext *ctx, arg_NEG_rr *a)
529*4aea3d0cSYoshinori Sato {
530*4aea3d0cSYoshinori Sato     prt("neg\t");
531*4aea3d0cSYoshinori Sato     if (a->rs != a->rd) {
532*4aea3d0cSYoshinori Sato         prt("r%d, ", a->rs);
533*4aea3d0cSYoshinori Sato     }
534*4aea3d0cSYoshinori Sato     prt("r%d", a->rd);
535*4aea3d0cSYoshinori Sato     return true;
536*4aea3d0cSYoshinori Sato }
537*4aea3d0cSYoshinori Sato 
538*4aea3d0cSYoshinori Sato /* adc #imm, rd */
539*4aea3d0cSYoshinori Sato static bool trans_ADC_ir(DisasContext *ctx, arg_ADC_ir *a)
540*4aea3d0cSYoshinori Sato {
541*4aea3d0cSYoshinori Sato     prt_ir(ctx, "adc", a->imm, a->rd);
542*4aea3d0cSYoshinori Sato     return true;
543*4aea3d0cSYoshinori Sato }
544*4aea3d0cSYoshinori Sato 
545*4aea3d0cSYoshinori Sato /* adc rs, rd */
546*4aea3d0cSYoshinori Sato static bool trans_ADC_rr(DisasContext *ctx, arg_ADC_rr *a)
547*4aea3d0cSYoshinori Sato {
548*4aea3d0cSYoshinori Sato     prt("adc\tr%d, r%d", a->rs, a->rd);
549*4aea3d0cSYoshinori Sato     return true;
550*4aea3d0cSYoshinori Sato }
551*4aea3d0cSYoshinori Sato 
552*4aea3d0cSYoshinori Sato /* adc dsp[rs], rd */
553*4aea3d0cSYoshinori Sato static bool trans_ADC_mr(DisasContext *ctx, arg_ADC_mr *a)
554*4aea3d0cSYoshinori Sato {
555*4aea3d0cSYoshinori Sato     int dsp;
556*4aea3d0cSYoshinori Sato     prt("adc\t");
557*4aea3d0cSYoshinori Sato     dsp = rx_index_addr(a->ld, 2, ctx);
558*4aea3d0cSYoshinori Sato     if (dsp > 0) {
559*4aea3d0cSYoshinori Sato         prt("%d", dsp);
560*4aea3d0cSYoshinori Sato     }
561*4aea3d0cSYoshinori Sato     prt("[r%d], r%d", a->rs, a->rd);
562*4aea3d0cSYoshinori Sato     return true;
563*4aea3d0cSYoshinori Sato }
564*4aea3d0cSYoshinori Sato 
565*4aea3d0cSYoshinori Sato /* add #uimm4, rd */
566*4aea3d0cSYoshinori Sato /* add #imm, rs, rd */
567*4aea3d0cSYoshinori Sato static bool trans_ADD_irr(DisasContext *ctx, arg_ADD_irr *a)
568*4aea3d0cSYoshinori Sato {
569*4aea3d0cSYoshinori Sato     if (a->imm < 0x10 && a->rs2 == a->rd) {
570*4aea3d0cSYoshinori Sato         prt("add\t#%d, r%d", a->imm, a->rd);
571*4aea3d0cSYoshinori Sato     } else {
572*4aea3d0cSYoshinori Sato         prt("add\t#0x%08x, r%d, r%d", a->imm, a->rs2, a->rd);
573*4aea3d0cSYoshinori Sato     }
574*4aea3d0cSYoshinori Sato     return true;
575*4aea3d0cSYoshinori Sato }
576*4aea3d0cSYoshinori Sato 
577*4aea3d0cSYoshinori Sato /* add rs, rd */
578*4aea3d0cSYoshinori Sato /* add dsp[rs], rd */
579*4aea3d0cSYoshinori Sato static bool trans_ADD_mr(DisasContext *ctx, arg_ADD_mr *a)
580*4aea3d0cSYoshinori Sato {
581*4aea3d0cSYoshinori Sato     prt("add\t");
582*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
583*4aea3d0cSYoshinori Sato     return true;
584*4aea3d0cSYoshinori Sato }
585*4aea3d0cSYoshinori Sato 
586*4aea3d0cSYoshinori Sato /* add rs, rs2, rd */
587*4aea3d0cSYoshinori Sato static bool trans_ADD_rrr(DisasContext *ctx, arg_ADD_rrr *a)
588*4aea3d0cSYoshinori Sato {
589*4aea3d0cSYoshinori Sato     prt("add\tr%d, r%d, r%d", a->rs, a->rs2, a->rd);
590*4aea3d0cSYoshinori Sato     return true;
591*4aea3d0cSYoshinori Sato }
592*4aea3d0cSYoshinori Sato 
593*4aea3d0cSYoshinori Sato /* cmp #imm4, rd */
594*4aea3d0cSYoshinori Sato /* cmp #imm8, rd */
595*4aea3d0cSYoshinori Sato /* cmp #imm, rs2 */
596*4aea3d0cSYoshinori Sato static bool trans_CMP_ir(DisasContext *ctx, arg_CMP_ir *a)
597*4aea3d0cSYoshinori Sato {
598*4aea3d0cSYoshinori Sato     prt_ir(ctx, "cmp", a->imm, a->rs2);
599*4aea3d0cSYoshinori Sato     return true;
600*4aea3d0cSYoshinori Sato }
601*4aea3d0cSYoshinori Sato 
602*4aea3d0cSYoshinori Sato /* cmp rs, rs2 */
603*4aea3d0cSYoshinori Sato /* cmp dsp[rs], rs2 */
604*4aea3d0cSYoshinori Sato static bool trans_CMP_mr(DisasContext *ctx, arg_CMP_mr *a)
605*4aea3d0cSYoshinori Sato {
606*4aea3d0cSYoshinori Sato     prt("cmp\t");
607*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
608*4aea3d0cSYoshinori Sato     return true;
609*4aea3d0cSYoshinori Sato }
610*4aea3d0cSYoshinori Sato 
611*4aea3d0cSYoshinori Sato /* sub #imm4, rd */
612*4aea3d0cSYoshinori Sato static bool trans_SUB_ir(DisasContext *ctx, arg_SUB_ir *a)
613*4aea3d0cSYoshinori Sato {
614*4aea3d0cSYoshinori Sato     prt("sub\t#%d, r%d", a->imm, a->rd);
615*4aea3d0cSYoshinori Sato     return true;
616*4aea3d0cSYoshinori Sato }
617*4aea3d0cSYoshinori Sato 
618*4aea3d0cSYoshinori Sato /* sub rs, rd */
619*4aea3d0cSYoshinori Sato /* sub dsp[rs], rd */
620*4aea3d0cSYoshinori Sato static bool trans_SUB_mr(DisasContext *ctx, arg_SUB_mr *a)
621*4aea3d0cSYoshinori Sato {
622*4aea3d0cSYoshinori Sato     prt("sub\t");
623*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
624*4aea3d0cSYoshinori Sato     return true;
625*4aea3d0cSYoshinori Sato }
626*4aea3d0cSYoshinori Sato 
627*4aea3d0cSYoshinori Sato /* sub rs, rs2, rd */
628*4aea3d0cSYoshinori Sato static bool trans_SUB_rrr(DisasContext *ctx, arg_SUB_rrr *a)
629*4aea3d0cSYoshinori Sato {
630*4aea3d0cSYoshinori Sato     prt("sub\tr%d, r%d, r%d", a->rs, a->rs2, a->rd);
631*4aea3d0cSYoshinori Sato     return true;
632*4aea3d0cSYoshinori Sato }
633*4aea3d0cSYoshinori Sato 
634*4aea3d0cSYoshinori Sato /* sbb rs, rd */
635*4aea3d0cSYoshinori Sato static bool trans_SBB_rr(DisasContext *ctx, arg_SBB_rr *a)
636*4aea3d0cSYoshinori Sato {
637*4aea3d0cSYoshinori Sato     prt("sbb\tr%d, r%d", a->rs, a->rd);
638*4aea3d0cSYoshinori Sato     return true;
639*4aea3d0cSYoshinori Sato }
640*4aea3d0cSYoshinori Sato 
641*4aea3d0cSYoshinori Sato /* sbb dsp[rs], rd */
642*4aea3d0cSYoshinori Sato static bool trans_SBB_mr(DisasContext *ctx, arg_SBB_mr *a)
643*4aea3d0cSYoshinori Sato {
644*4aea3d0cSYoshinori Sato     prt("sbb\t");
645*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, RX_IM_LONG, a->rs, a->rd);
646*4aea3d0cSYoshinori Sato     return true;
647*4aea3d0cSYoshinori Sato }
648*4aea3d0cSYoshinori Sato 
649*4aea3d0cSYoshinori Sato /* abs rd */
650*4aea3d0cSYoshinori Sato /* abs rs, rd */
651*4aea3d0cSYoshinori Sato static bool trans_ABS_rr(DisasContext *ctx, arg_ABS_rr *a)
652*4aea3d0cSYoshinori Sato {
653*4aea3d0cSYoshinori Sato     prt("abs\t");
654*4aea3d0cSYoshinori Sato     if (a->rs == a->rd) {
655*4aea3d0cSYoshinori Sato         prt("r%d", a->rd);
656*4aea3d0cSYoshinori Sato     } else {
657*4aea3d0cSYoshinori Sato         prt("r%d, r%d", a->rs, a->rd);
658*4aea3d0cSYoshinori Sato     }
659*4aea3d0cSYoshinori Sato     return true;
660*4aea3d0cSYoshinori Sato }
661*4aea3d0cSYoshinori Sato 
662*4aea3d0cSYoshinori Sato /* max #imm, rd */
663*4aea3d0cSYoshinori Sato static bool trans_MAX_ir(DisasContext *ctx, arg_MAX_ir *a)
664*4aea3d0cSYoshinori Sato {
665*4aea3d0cSYoshinori Sato     prt_ir(ctx, "max", a->imm, a->rd);
666*4aea3d0cSYoshinori Sato     return true;
667*4aea3d0cSYoshinori Sato }
668*4aea3d0cSYoshinori Sato 
669*4aea3d0cSYoshinori Sato /* max rs, rd */
670*4aea3d0cSYoshinori Sato /* max dsp[rs], rd */
671*4aea3d0cSYoshinori Sato static bool trans_MAX_mr(DisasContext *ctx, arg_MAX_mr *a)
672*4aea3d0cSYoshinori Sato {
673*4aea3d0cSYoshinori Sato     prt("max\t");
674*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
675*4aea3d0cSYoshinori Sato     return true;
676*4aea3d0cSYoshinori Sato }
677*4aea3d0cSYoshinori Sato 
678*4aea3d0cSYoshinori Sato /* min #imm, rd */
679*4aea3d0cSYoshinori Sato static bool trans_MIN_ir(DisasContext *ctx, arg_MIN_ir *a)
680*4aea3d0cSYoshinori Sato {
681*4aea3d0cSYoshinori Sato     prt_ir(ctx, "min", a->imm, a->rd);
682*4aea3d0cSYoshinori Sato     return true;
683*4aea3d0cSYoshinori Sato }
684*4aea3d0cSYoshinori Sato 
685*4aea3d0cSYoshinori Sato /* min rs, rd */
686*4aea3d0cSYoshinori Sato /* min dsp[rs], rd */
687*4aea3d0cSYoshinori Sato static bool trans_MIN_mr(DisasContext *ctx, arg_MIN_mr *a)
688*4aea3d0cSYoshinori Sato {
689*4aea3d0cSYoshinori Sato     prt("max\t");
690*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
691*4aea3d0cSYoshinori Sato     return true;
692*4aea3d0cSYoshinori Sato }
693*4aea3d0cSYoshinori Sato 
694*4aea3d0cSYoshinori Sato /* mul #uimm4, rd */
695*4aea3d0cSYoshinori Sato /* mul #imm, rd */
696*4aea3d0cSYoshinori Sato static bool trans_MUL_ir(DisasContext *ctx, arg_MUL_ir *a)
697*4aea3d0cSYoshinori Sato {
698*4aea3d0cSYoshinori Sato     prt_ir(ctx, "mul", a->imm, a->rd);
699*4aea3d0cSYoshinori Sato     return true;
700*4aea3d0cSYoshinori Sato }
701*4aea3d0cSYoshinori Sato 
702*4aea3d0cSYoshinori Sato /* mul rs, rd */
703*4aea3d0cSYoshinori Sato /* mul dsp[rs], rd */
704*4aea3d0cSYoshinori Sato static bool trans_MUL_mr(DisasContext *ctx, arg_MUL_mr *a)
705*4aea3d0cSYoshinori Sato {
706*4aea3d0cSYoshinori Sato     prt("mul\t");
707*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
708*4aea3d0cSYoshinori Sato     return true;
709*4aea3d0cSYoshinori Sato }
710*4aea3d0cSYoshinori Sato 
711*4aea3d0cSYoshinori Sato /* mul rs, rs2, rd */
712*4aea3d0cSYoshinori Sato static bool trans_MUL_rrr(DisasContext *ctx, arg_MUL_rrr *a)
713*4aea3d0cSYoshinori Sato {
714*4aea3d0cSYoshinori Sato     prt("mul\tr%d,r%d,r%d", a->rs, a->rs2, a->rd);
715*4aea3d0cSYoshinori Sato     return true;
716*4aea3d0cSYoshinori Sato }
717*4aea3d0cSYoshinori Sato 
718*4aea3d0cSYoshinori Sato /* emul #imm, rd */
719*4aea3d0cSYoshinori Sato static bool trans_EMUL_ir(DisasContext *ctx, arg_EMUL_ir *a)
720*4aea3d0cSYoshinori Sato {
721*4aea3d0cSYoshinori Sato     prt_ir(ctx, "emul", a->imm, a->rd);
722*4aea3d0cSYoshinori Sato     return true;
723*4aea3d0cSYoshinori Sato }
724*4aea3d0cSYoshinori Sato 
725*4aea3d0cSYoshinori Sato /* emul rs, rd */
726*4aea3d0cSYoshinori Sato /* emul dsp[rs], rd */
727*4aea3d0cSYoshinori Sato static bool trans_EMUL_mr(DisasContext *ctx, arg_EMUL_mr *a)
728*4aea3d0cSYoshinori Sato {
729*4aea3d0cSYoshinori Sato     prt("emul\t");
730*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
731*4aea3d0cSYoshinori Sato     return true;
732*4aea3d0cSYoshinori Sato }
733*4aea3d0cSYoshinori Sato 
734*4aea3d0cSYoshinori Sato /* emulu #imm, rd */
735*4aea3d0cSYoshinori Sato static bool trans_EMULU_ir(DisasContext *ctx, arg_EMULU_ir *a)
736*4aea3d0cSYoshinori Sato {
737*4aea3d0cSYoshinori Sato     prt_ir(ctx, "emulu", a->imm, a->rd);
738*4aea3d0cSYoshinori Sato     return true;
739*4aea3d0cSYoshinori Sato }
740*4aea3d0cSYoshinori Sato 
741*4aea3d0cSYoshinori Sato /* emulu rs, rd */
742*4aea3d0cSYoshinori Sato /* emulu dsp[rs], rd */
743*4aea3d0cSYoshinori Sato static bool trans_EMULU_mr(DisasContext *ctx, arg_EMULU_mr *a)
744*4aea3d0cSYoshinori Sato {
745*4aea3d0cSYoshinori Sato     prt("emulu\t");
746*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
747*4aea3d0cSYoshinori Sato     return true;
748*4aea3d0cSYoshinori Sato }
749*4aea3d0cSYoshinori Sato 
750*4aea3d0cSYoshinori Sato /* div #imm, rd */
751*4aea3d0cSYoshinori Sato static bool trans_DIV_ir(DisasContext *ctx, arg_DIV_ir *a)
752*4aea3d0cSYoshinori Sato {
753*4aea3d0cSYoshinori Sato     prt_ir(ctx, "div", a->imm, a->rd);
754*4aea3d0cSYoshinori Sato     return true;
755*4aea3d0cSYoshinori Sato }
756*4aea3d0cSYoshinori Sato 
757*4aea3d0cSYoshinori Sato /* div rs, rd */
758*4aea3d0cSYoshinori Sato /* div dsp[rs], rd */
759*4aea3d0cSYoshinori Sato static bool trans_DIV_mr(DisasContext *ctx, arg_DIV_mr *a)
760*4aea3d0cSYoshinori Sato {
761*4aea3d0cSYoshinori Sato     prt("div\t");
762*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
763*4aea3d0cSYoshinori Sato     return true;
764*4aea3d0cSYoshinori Sato }
765*4aea3d0cSYoshinori Sato 
766*4aea3d0cSYoshinori Sato /* divu #imm, rd */
767*4aea3d0cSYoshinori Sato static bool trans_DIVU_ir(DisasContext *ctx, arg_DIVU_ir *a)
768*4aea3d0cSYoshinori Sato {
769*4aea3d0cSYoshinori Sato     prt_ir(ctx, "divu", a->imm, a->rd);
770*4aea3d0cSYoshinori Sato     return true;
771*4aea3d0cSYoshinori Sato }
772*4aea3d0cSYoshinori Sato 
773*4aea3d0cSYoshinori Sato /* divu rs, rd */
774*4aea3d0cSYoshinori Sato /* divu dsp[rs], rd */
775*4aea3d0cSYoshinori Sato static bool trans_DIVU_mr(DisasContext *ctx, arg_DIVU_mr *a)
776*4aea3d0cSYoshinori Sato {
777*4aea3d0cSYoshinori Sato     prt("divu\t");
778*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, a->mi, a->rs, a->rd);
779*4aea3d0cSYoshinori Sato     return true;
780*4aea3d0cSYoshinori Sato }
781*4aea3d0cSYoshinori Sato 
782*4aea3d0cSYoshinori Sato 
783*4aea3d0cSYoshinori Sato /* shll #imm:5, rd */
784*4aea3d0cSYoshinori Sato /* shll #imm:5, rs, rd */
785*4aea3d0cSYoshinori Sato static bool trans_SHLL_irr(DisasContext *ctx, arg_SHLL_irr *a)
786*4aea3d0cSYoshinori Sato {
787*4aea3d0cSYoshinori Sato     prt("shll\t#%d, ", a->imm);
788*4aea3d0cSYoshinori Sato     if (a->rs2 != a->rd) {
789*4aea3d0cSYoshinori Sato         prt("r%d, ", a->rs2);
790*4aea3d0cSYoshinori Sato     }
791*4aea3d0cSYoshinori Sato     prt("r%d", a->rd);
792*4aea3d0cSYoshinori Sato     return true;
793*4aea3d0cSYoshinori Sato }
794*4aea3d0cSYoshinori Sato 
795*4aea3d0cSYoshinori Sato /* shll rs, rd */
796*4aea3d0cSYoshinori Sato static bool trans_SHLL_rr(DisasContext *ctx, arg_SHLL_rr *a)
797*4aea3d0cSYoshinori Sato {
798*4aea3d0cSYoshinori Sato     prt("shll\tr%d, r%d", a->rs, a->rd);
799*4aea3d0cSYoshinori Sato     return true;
800*4aea3d0cSYoshinori Sato }
801*4aea3d0cSYoshinori Sato 
802*4aea3d0cSYoshinori Sato /* shar #imm:5, rd */
803*4aea3d0cSYoshinori Sato /* shar #imm:5, rs, rd */
804*4aea3d0cSYoshinori Sato static bool trans_SHAR_irr(DisasContext *ctx, arg_SHAR_irr *a)
805*4aea3d0cSYoshinori Sato {
806*4aea3d0cSYoshinori Sato     prt("shar\t#%d,", a->imm);
807*4aea3d0cSYoshinori Sato     if (a->rs2 != a->rd) {
808*4aea3d0cSYoshinori Sato         prt("r%d, ", a->rs2);
809*4aea3d0cSYoshinori Sato     }
810*4aea3d0cSYoshinori Sato     prt("r%d", a->rd);
811*4aea3d0cSYoshinori Sato     return true;
812*4aea3d0cSYoshinori Sato }
813*4aea3d0cSYoshinori Sato 
814*4aea3d0cSYoshinori Sato /* shar rs, rd */
815*4aea3d0cSYoshinori Sato static bool trans_SHAR_rr(DisasContext *ctx, arg_SHAR_rr *a)
816*4aea3d0cSYoshinori Sato {
817*4aea3d0cSYoshinori Sato     prt("shar\tr%d, r%d", a->rs, a->rd);
818*4aea3d0cSYoshinori Sato     return true;
819*4aea3d0cSYoshinori Sato }
820*4aea3d0cSYoshinori Sato 
821*4aea3d0cSYoshinori Sato /* shlr #imm:5, rd */
822*4aea3d0cSYoshinori Sato /* shlr #imm:5, rs, rd */
823*4aea3d0cSYoshinori Sato static bool trans_SHLR_irr(DisasContext *ctx, arg_SHLR_irr *a)
824*4aea3d0cSYoshinori Sato {
825*4aea3d0cSYoshinori Sato     prt("shlr\t#%d, ", a->imm);
826*4aea3d0cSYoshinori Sato     if (a->rs2 != a->rd) {
827*4aea3d0cSYoshinori Sato         prt("r%d, ", a->rs2);
828*4aea3d0cSYoshinori Sato     }
829*4aea3d0cSYoshinori Sato     prt("r%d", a->rd);
830*4aea3d0cSYoshinori Sato     return true;
831*4aea3d0cSYoshinori Sato }
832*4aea3d0cSYoshinori Sato 
833*4aea3d0cSYoshinori Sato /* shlr rs, rd */
834*4aea3d0cSYoshinori Sato static bool trans_SHLR_rr(DisasContext *ctx, arg_SHLR_rr *a)
835*4aea3d0cSYoshinori Sato {
836*4aea3d0cSYoshinori Sato     prt("shlr\tr%d, r%d", a->rs, a->rd);
837*4aea3d0cSYoshinori Sato     return true;
838*4aea3d0cSYoshinori Sato }
839*4aea3d0cSYoshinori Sato 
840*4aea3d0cSYoshinori Sato /* rolc rd */
841*4aea3d0cSYoshinori Sato static bool trans_ROLC(DisasContext *ctx, arg_ROLC *a)
842*4aea3d0cSYoshinori Sato {
843*4aea3d0cSYoshinori Sato     prt("rorc\tr%d", a->rd);
844*4aea3d0cSYoshinori Sato     return true;
845*4aea3d0cSYoshinori Sato }
846*4aea3d0cSYoshinori Sato 
847*4aea3d0cSYoshinori Sato /* rorc rd */
848*4aea3d0cSYoshinori Sato static bool trans_RORC(DisasContext *ctx, arg_RORC *a)
849*4aea3d0cSYoshinori Sato {
850*4aea3d0cSYoshinori Sato     prt("rorc\tr%d", a->rd);
851*4aea3d0cSYoshinori Sato     return true;
852*4aea3d0cSYoshinori Sato }
853*4aea3d0cSYoshinori Sato 
854*4aea3d0cSYoshinori Sato /* rotl #imm, rd */
855*4aea3d0cSYoshinori Sato static bool trans_ROTL_ir(DisasContext *ctx, arg_ROTL_ir *a)
856*4aea3d0cSYoshinori Sato {
857*4aea3d0cSYoshinori Sato     prt("rotl\t#%d, r%d", a->imm, a->rd);
858*4aea3d0cSYoshinori Sato     return true;
859*4aea3d0cSYoshinori Sato }
860*4aea3d0cSYoshinori Sato 
861*4aea3d0cSYoshinori Sato /* rotl rs, rd */
862*4aea3d0cSYoshinori Sato static bool trans_ROTL_rr(DisasContext *ctx, arg_ROTL_rr *a)
863*4aea3d0cSYoshinori Sato {
864*4aea3d0cSYoshinori Sato     prt("rotl\tr%d, r%d", a->rs, a->rd);
865*4aea3d0cSYoshinori Sato     return true;
866*4aea3d0cSYoshinori Sato }
867*4aea3d0cSYoshinori Sato 
868*4aea3d0cSYoshinori Sato /* rotr #imm, rd */
869*4aea3d0cSYoshinori Sato static bool trans_ROTR_ir(DisasContext *ctx, arg_ROTR_ir *a)
870*4aea3d0cSYoshinori Sato {
871*4aea3d0cSYoshinori Sato     prt("rotr\t#%d, r%d", a->imm, a->rd);
872*4aea3d0cSYoshinori Sato     return true;
873*4aea3d0cSYoshinori Sato }
874*4aea3d0cSYoshinori Sato 
875*4aea3d0cSYoshinori Sato /* rotr rs, rd */
876*4aea3d0cSYoshinori Sato static bool trans_ROTR_rr(DisasContext *ctx, arg_ROTR_rr *a)
877*4aea3d0cSYoshinori Sato {
878*4aea3d0cSYoshinori Sato     prt("rotr\tr%d, r%d", a->rs, a->rd);
879*4aea3d0cSYoshinori Sato     return true;
880*4aea3d0cSYoshinori Sato }
881*4aea3d0cSYoshinori Sato 
882*4aea3d0cSYoshinori Sato /* revl rs, rd */
883*4aea3d0cSYoshinori Sato static bool trans_REVL(DisasContext *ctx, arg_REVL *a)
884*4aea3d0cSYoshinori Sato {
885*4aea3d0cSYoshinori Sato     prt("revl\tr%d, r%d", a->rs, a->rd);
886*4aea3d0cSYoshinori Sato     return true;
887*4aea3d0cSYoshinori Sato }
888*4aea3d0cSYoshinori Sato 
889*4aea3d0cSYoshinori Sato /* revw rs, rd */
890*4aea3d0cSYoshinori Sato static bool trans_REVW(DisasContext *ctx, arg_REVW *a)
891*4aea3d0cSYoshinori Sato {
892*4aea3d0cSYoshinori Sato     prt("revw\tr%d, r%d", a->rs, a->rd);
893*4aea3d0cSYoshinori Sato     return true;
894*4aea3d0cSYoshinori Sato }
895*4aea3d0cSYoshinori Sato 
896*4aea3d0cSYoshinori Sato /* conditional branch helper */
897*4aea3d0cSYoshinori Sato static void rx_bcnd_main(DisasContext *ctx, int cd, int len, int dst)
898*4aea3d0cSYoshinori Sato {
899*4aea3d0cSYoshinori Sato     static const char sz[] = {'s', 'b', 'w', 'a'};
900*4aea3d0cSYoshinori Sato     prt("b%s.%c\t%08x", cond[cd], sz[len - 1], ctx->pc + dst);
901*4aea3d0cSYoshinori Sato }
902*4aea3d0cSYoshinori Sato 
903*4aea3d0cSYoshinori Sato /* beq dsp:3 / bne dsp:3 */
904*4aea3d0cSYoshinori Sato /* beq dsp:8 / bne dsp:8 */
905*4aea3d0cSYoshinori Sato /* bc dsp:8 / bnc dsp:8 */
906*4aea3d0cSYoshinori Sato /* bgtu dsp:8 / bleu dsp:8 */
907*4aea3d0cSYoshinori Sato /* bpz dsp:8 / bn dsp:8 */
908*4aea3d0cSYoshinori Sato /* bge dsp:8 / blt dsp:8 */
909*4aea3d0cSYoshinori Sato /* bgt dsp:8 / ble dsp:8 */
910*4aea3d0cSYoshinori Sato /* bo dsp:8 / bno dsp:8 */
911*4aea3d0cSYoshinori Sato /* beq dsp:16 / bne dsp:16 */
912*4aea3d0cSYoshinori Sato static bool trans_BCnd(DisasContext *ctx, arg_BCnd *a)
913*4aea3d0cSYoshinori Sato {
914*4aea3d0cSYoshinori Sato     rx_bcnd_main(ctx, a->cd, a->sz, a->dsp);
915*4aea3d0cSYoshinori Sato     return true;
916*4aea3d0cSYoshinori Sato }
917*4aea3d0cSYoshinori Sato 
918*4aea3d0cSYoshinori Sato /* bra dsp:3 */
919*4aea3d0cSYoshinori Sato /* bra dsp:8 */
920*4aea3d0cSYoshinori Sato /* bra dsp:16 */
921*4aea3d0cSYoshinori Sato /* bra dsp:24 */
922*4aea3d0cSYoshinori Sato static bool trans_BRA(DisasContext *ctx, arg_BRA *a)
923*4aea3d0cSYoshinori Sato {
924*4aea3d0cSYoshinori Sato     rx_bcnd_main(ctx, 14, a->sz, a->dsp);
925*4aea3d0cSYoshinori Sato     return true;
926*4aea3d0cSYoshinori Sato }
927*4aea3d0cSYoshinori Sato 
928*4aea3d0cSYoshinori Sato /* bra rs */
929*4aea3d0cSYoshinori Sato static bool trans_BRA_l(DisasContext *ctx, arg_BRA_l *a)
930*4aea3d0cSYoshinori Sato {
931*4aea3d0cSYoshinori Sato     prt("bra.l\tr%d", a->rd);
932*4aea3d0cSYoshinori Sato     return true;
933*4aea3d0cSYoshinori Sato }
934*4aea3d0cSYoshinori Sato 
935*4aea3d0cSYoshinori Sato /* jmp rs */
936*4aea3d0cSYoshinori Sato static bool trans_JMP(DisasContext *ctx, arg_JMP *a)
937*4aea3d0cSYoshinori Sato {
938*4aea3d0cSYoshinori Sato     prt("jmp\tr%d", a->rs);
939*4aea3d0cSYoshinori Sato     return true;
940*4aea3d0cSYoshinori Sato }
941*4aea3d0cSYoshinori Sato 
942*4aea3d0cSYoshinori Sato /* jsr rs */
943*4aea3d0cSYoshinori Sato static bool trans_JSR(DisasContext *ctx, arg_JSR *a)
944*4aea3d0cSYoshinori Sato {
945*4aea3d0cSYoshinori Sato     prt("jsr\tr%d", a->rs);
946*4aea3d0cSYoshinori Sato     return true;
947*4aea3d0cSYoshinori Sato }
948*4aea3d0cSYoshinori Sato 
949*4aea3d0cSYoshinori Sato /* bsr dsp:16 */
950*4aea3d0cSYoshinori Sato /* bsr dsp:24 */
951*4aea3d0cSYoshinori Sato static bool trans_BSR(DisasContext *ctx, arg_BSR *a)
952*4aea3d0cSYoshinori Sato {
953*4aea3d0cSYoshinori Sato     static const char sz[] = {'w', 'a'};
954*4aea3d0cSYoshinori Sato     prt("bsr.%c\t%08x", sz[a->sz - 3], ctx->pc + a->dsp);
955*4aea3d0cSYoshinori Sato     return true;
956*4aea3d0cSYoshinori Sato }
957*4aea3d0cSYoshinori Sato 
958*4aea3d0cSYoshinori Sato /* bsr rs */
959*4aea3d0cSYoshinori Sato static bool trans_BSR_l(DisasContext *ctx, arg_BSR_l *a)
960*4aea3d0cSYoshinori Sato {
961*4aea3d0cSYoshinori Sato     prt("bsr.l\tr%d", a->rd);
962*4aea3d0cSYoshinori Sato     return true;
963*4aea3d0cSYoshinori Sato }
964*4aea3d0cSYoshinori Sato 
965*4aea3d0cSYoshinori Sato /* rts */
966*4aea3d0cSYoshinori Sato static bool trans_RTS(DisasContext *ctx, arg_RTS *a)
967*4aea3d0cSYoshinori Sato {
968*4aea3d0cSYoshinori Sato     prt("rts");
969*4aea3d0cSYoshinori Sato     return true;
970*4aea3d0cSYoshinori Sato }
971*4aea3d0cSYoshinori Sato 
972*4aea3d0cSYoshinori Sato /* nop */
973*4aea3d0cSYoshinori Sato static bool trans_NOP(DisasContext *ctx, arg_NOP *a)
974*4aea3d0cSYoshinori Sato {
975*4aea3d0cSYoshinori Sato     prt("nop");
976*4aea3d0cSYoshinori Sato     return true;
977*4aea3d0cSYoshinori Sato }
978*4aea3d0cSYoshinori Sato 
979*4aea3d0cSYoshinori Sato /* scmpu */
980*4aea3d0cSYoshinori Sato static bool trans_SCMPU(DisasContext *ctx, arg_SCMPU *a)
981*4aea3d0cSYoshinori Sato {
982*4aea3d0cSYoshinori Sato     prt("scmpu");
983*4aea3d0cSYoshinori Sato     return true;
984*4aea3d0cSYoshinori Sato }
985*4aea3d0cSYoshinori Sato 
986*4aea3d0cSYoshinori Sato /* smovu */
987*4aea3d0cSYoshinori Sato static bool trans_SMOVU(DisasContext *ctx, arg_SMOVU *a)
988*4aea3d0cSYoshinori Sato {
989*4aea3d0cSYoshinori Sato     prt("smovu");
990*4aea3d0cSYoshinori Sato     return true;
991*4aea3d0cSYoshinori Sato }
992*4aea3d0cSYoshinori Sato 
993*4aea3d0cSYoshinori Sato /* smovf */
994*4aea3d0cSYoshinori Sato static bool trans_SMOVF(DisasContext *ctx, arg_SMOVF *a)
995*4aea3d0cSYoshinori Sato {
996*4aea3d0cSYoshinori Sato     prt("smovf");
997*4aea3d0cSYoshinori Sato     return true;
998*4aea3d0cSYoshinori Sato }
999*4aea3d0cSYoshinori Sato 
1000*4aea3d0cSYoshinori Sato /* smovb */
1001*4aea3d0cSYoshinori Sato static bool trans_SMOVB(DisasContext *ctx, arg_SMOVB *a)
1002*4aea3d0cSYoshinori Sato {
1003*4aea3d0cSYoshinori Sato     prt("smovb");
1004*4aea3d0cSYoshinori Sato     return true;
1005*4aea3d0cSYoshinori Sato }
1006*4aea3d0cSYoshinori Sato 
1007*4aea3d0cSYoshinori Sato /* suntile */
1008*4aea3d0cSYoshinori Sato static bool trans_SUNTIL(DisasContext *ctx, arg_SUNTIL *a)
1009*4aea3d0cSYoshinori Sato {
1010*4aea3d0cSYoshinori Sato     prt("suntil.%c", size[a->sz]);
1011*4aea3d0cSYoshinori Sato     return true;
1012*4aea3d0cSYoshinori Sato }
1013*4aea3d0cSYoshinori Sato 
1014*4aea3d0cSYoshinori Sato /* swhile */
1015*4aea3d0cSYoshinori Sato static bool trans_SWHILE(DisasContext *ctx, arg_SWHILE *a)
1016*4aea3d0cSYoshinori Sato {
1017*4aea3d0cSYoshinori Sato     prt("swhile.%c", size[a->sz]);
1018*4aea3d0cSYoshinori Sato     return true;
1019*4aea3d0cSYoshinori Sato }
1020*4aea3d0cSYoshinori Sato /* sstr */
1021*4aea3d0cSYoshinori Sato static bool trans_SSTR(DisasContext *ctx, arg_SSTR *a)
1022*4aea3d0cSYoshinori Sato {
1023*4aea3d0cSYoshinori Sato     prt("sstr.%c", size[a->sz]);
1024*4aea3d0cSYoshinori Sato     return true;
1025*4aea3d0cSYoshinori Sato }
1026*4aea3d0cSYoshinori Sato 
1027*4aea3d0cSYoshinori Sato /* rmpa */
1028*4aea3d0cSYoshinori Sato static bool trans_RMPA(DisasContext *ctx, arg_RMPA *a)
1029*4aea3d0cSYoshinori Sato {
1030*4aea3d0cSYoshinori Sato     prt("rmpa.%c", size[a->sz]);
1031*4aea3d0cSYoshinori Sato     return true;
1032*4aea3d0cSYoshinori Sato }
1033*4aea3d0cSYoshinori Sato 
1034*4aea3d0cSYoshinori Sato /* mulhi rs,rs2 */
1035*4aea3d0cSYoshinori Sato static bool trans_MULHI(DisasContext *ctx, arg_MULHI *a)
1036*4aea3d0cSYoshinori Sato {
1037*4aea3d0cSYoshinori Sato     prt("mulhi\tr%d,r%d", a->rs, a->rs2);
1038*4aea3d0cSYoshinori Sato     return true;
1039*4aea3d0cSYoshinori Sato }
1040*4aea3d0cSYoshinori Sato 
1041*4aea3d0cSYoshinori Sato /* mullo rs,rs2 */
1042*4aea3d0cSYoshinori Sato static bool trans_MULLO(DisasContext *ctx, arg_MULLO *a)
1043*4aea3d0cSYoshinori Sato {
1044*4aea3d0cSYoshinori Sato     prt("mullo\tr%d, r%d", a->rs, a->rs2);
1045*4aea3d0cSYoshinori Sato     return true;
1046*4aea3d0cSYoshinori Sato }
1047*4aea3d0cSYoshinori Sato 
1048*4aea3d0cSYoshinori Sato /* machi rs,rs2 */
1049*4aea3d0cSYoshinori Sato static bool trans_MACHI(DisasContext *ctx, arg_MACHI *a)
1050*4aea3d0cSYoshinori Sato {
1051*4aea3d0cSYoshinori Sato     prt("machi\tr%d, r%d", a->rs, a->rs2);
1052*4aea3d0cSYoshinori Sato     return true;
1053*4aea3d0cSYoshinori Sato }
1054*4aea3d0cSYoshinori Sato 
1055*4aea3d0cSYoshinori Sato /* maclo rs,rs2 */
1056*4aea3d0cSYoshinori Sato static bool trans_MACLO(DisasContext *ctx, arg_MACLO *a)
1057*4aea3d0cSYoshinori Sato {
1058*4aea3d0cSYoshinori Sato     prt("maclo\tr%d, r%d", a->rs, a->rs2);
1059*4aea3d0cSYoshinori Sato     return true;
1060*4aea3d0cSYoshinori Sato }
1061*4aea3d0cSYoshinori Sato 
1062*4aea3d0cSYoshinori Sato /* mvfachi rd */
1063*4aea3d0cSYoshinori Sato static bool trans_MVFACHI(DisasContext *ctx, arg_MVFACHI *a)
1064*4aea3d0cSYoshinori Sato {
1065*4aea3d0cSYoshinori Sato     prt("mvfachi\tr%d", a->rd);
1066*4aea3d0cSYoshinori Sato     return true;
1067*4aea3d0cSYoshinori Sato }
1068*4aea3d0cSYoshinori Sato 
1069*4aea3d0cSYoshinori Sato /* mvfacmi rd */
1070*4aea3d0cSYoshinori Sato static bool trans_MVFACMI(DisasContext *ctx, arg_MVFACMI *a)
1071*4aea3d0cSYoshinori Sato {
1072*4aea3d0cSYoshinori Sato     prt("mvfacmi\tr%d", a->rd);
1073*4aea3d0cSYoshinori Sato     return true;
1074*4aea3d0cSYoshinori Sato }
1075*4aea3d0cSYoshinori Sato 
1076*4aea3d0cSYoshinori Sato /* mvtachi rs */
1077*4aea3d0cSYoshinori Sato static bool trans_MVTACHI(DisasContext *ctx, arg_MVTACHI *a)
1078*4aea3d0cSYoshinori Sato {
1079*4aea3d0cSYoshinori Sato     prt("mvtachi\tr%d", a->rs);
1080*4aea3d0cSYoshinori Sato     return true;
1081*4aea3d0cSYoshinori Sato }
1082*4aea3d0cSYoshinori Sato 
1083*4aea3d0cSYoshinori Sato /* mvtaclo rs */
1084*4aea3d0cSYoshinori Sato static bool trans_MVTACLO(DisasContext *ctx, arg_MVTACLO *a)
1085*4aea3d0cSYoshinori Sato {
1086*4aea3d0cSYoshinori Sato     prt("mvtaclo\tr%d", a->rs);
1087*4aea3d0cSYoshinori Sato     return true;
1088*4aea3d0cSYoshinori Sato }
1089*4aea3d0cSYoshinori Sato 
1090*4aea3d0cSYoshinori Sato /* racw #imm */
1091*4aea3d0cSYoshinori Sato static bool trans_RACW(DisasContext *ctx, arg_RACW *a)
1092*4aea3d0cSYoshinori Sato {
1093*4aea3d0cSYoshinori Sato     prt("racw\t#%d", a->imm + 1);
1094*4aea3d0cSYoshinori Sato     return true;
1095*4aea3d0cSYoshinori Sato }
1096*4aea3d0cSYoshinori Sato 
1097*4aea3d0cSYoshinori Sato /* sat rd */
1098*4aea3d0cSYoshinori Sato static bool trans_SAT(DisasContext *ctx, arg_SAT *a)
1099*4aea3d0cSYoshinori Sato {
1100*4aea3d0cSYoshinori Sato     prt("sat\tr%d", a->rd);
1101*4aea3d0cSYoshinori Sato     return true;
1102*4aea3d0cSYoshinori Sato }
1103*4aea3d0cSYoshinori Sato 
1104*4aea3d0cSYoshinori Sato /* satr */
1105*4aea3d0cSYoshinori Sato static bool trans_SATR(DisasContext *ctx, arg_SATR *a)
1106*4aea3d0cSYoshinori Sato {
1107*4aea3d0cSYoshinori Sato     prt("satr");
1108*4aea3d0cSYoshinori Sato     return true;
1109*4aea3d0cSYoshinori Sato }
1110*4aea3d0cSYoshinori Sato 
1111*4aea3d0cSYoshinori Sato /* fadd #imm, rd */
1112*4aea3d0cSYoshinori Sato static bool trans_FADD_ir(DisasContext *ctx, arg_FADD_ir *a)
1113*4aea3d0cSYoshinori Sato {
1114*4aea3d0cSYoshinori Sato     prt("fadd\t#%d,r%d", li(ctx, 0), a->rd);
1115*4aea3d0cSYoshinori Sato     return true;
1116*4aea3d0cSYoshinori Sato }
1117*4aea3d0cSYoshinori Sato 
1118*4aea3d0cSYoshinori Sato /* fadd dsp[rs], rd */
1119*4aea3d0cSYoshinori Sato /* fadd rs, rd */
1120*4aea3d0cSYoshinori Sato static bool trans_FADD_mr(DisasContext *ctx, arg_FADD_mr *a)
1121*4aea3d0cSYoshinori Sato {
1122*4aea3d0cSYoshinori Sato     prt("fadd\t");
1123*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, RX_IM_LONG, a->rs, a->rd);
1124*4aea3d0cSYoshinori Sato     return true;
1125*4aea3d0cSYoshinori Sato }
1126*4aea3d0cSYoshinori Sato 
1127*4aea3d0cSYoshinori Sato /* fcmp #imm, rd */
1128*4aea3d0cSYoshinori Sato static bool trans_FCMP_ir(DisasContext *ctx, arg_FCMP_ir *a)
1129*4aea3d0cSYoshinori Sato {
1130*4aea3d0cSYoshinori Sato     prt("fadd\t#%d,r%d", li(ctx, 0), a->rd);
1131*4aea3d0cSYoshinori Sato     return true;
1132*4aea3d0cSYoshinori Sato }
1133*4aea3d0cSYoshinori Sato 
1134*4aea3d0cSYoshinori Sato /* fcmp dsp[rs], rd */
1135*4aea3d0cSYoshinori Sato /* fcmp rs, rd */
1136*4aea3d0cSYoshinori Sato static bool trans_FCMP_mr(DisasContext *ctx, arg_FCMP_mr *a)
1137*4aea3d0cSYoshinori Sato {
1138*4aea3d0cSYoshinori Sato     prt("fcmp\t");
1139*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, RX_IM_LONG, a->rs, a->rd);
1140*4aea3d0cSYoshinori Sato     return true;
1141*4aea3d0cSYoshinori Sato }
1142*4aea3d0cSYoshinori Sato 
1143*4aea3d0cSYoshinori Sato /* fsub #imm, rd */
1144*4aea3d0cSYoshinori Sato static bool trans_FSUB_ir(DisasContext *ctx, arg_FSUB_ir *a)
1145*4aea3d0cSYoshinori Sato {
1146*4aea3d0cSYoshinori Sato     prt("fsub\t#%d,r%d", li(ctx, 0), a->rd);
1147*4aea3d0cSYoshinori Sato     return true;
1148*4aea3d0cSYoshinori Sato }
1149*4aea3d0cSYoshinori Sato 
1150*4aea3d0cSYoshinori Sato /* fsub dsp[rs], rd */
1151*4aea3d0cSYoshinori Sato /* fsub rs, rd */
1152*4aea3d0cSYoshinori Sato static bool trans_FSUB_mr(DisasContext *ctx, arg_FSUB_mr *a)
1153*4aea3d0cSYoshinori Sato {
1154*4aea3d0cSYoshinori Sato     prt("fsub\t");
1155*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, RX_IM_LONG, a->rs, a->rd);
1156*4aea3d0cSYoshinori Sato     return true;
1157*4aea3d0cSYoshinori Sato }
1158*4aea3d0cSYoshinori Sato 
1159*4aea3d0cSYoshinori Sato /* ftoi dsp[rs], rd */
1160*4aea3d0cSYoshinori Sato /* ftoi rs, rd */
1161*4aea3d0cSYoshinori Sato static bool trans_FTOI(DisasContext *ctx, arg_FTOI *a)
1162*4aea3d0cSYoshinori Sato {
1163*4aea3d0cSYoshinori Sato     prt("ftoi\t");
1164*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, RX_IM_LONG, a->rs, a->rd);
1165*4aea3d0cSYoshinori Sato     return true;
1166*4aea3d0cSYoshinori Sato }
1167*4aea3d0cSYoshinori Sato 
1168*4aea3d0cSYoshinori Sato /* fmul #imm, rd */
1169*4aea3d0cSYoshinori Sato static bool trans_FMUL_ir(DisasContext *ctx, arg_FMUL_ir *a)
1170*4aea3d0cSYoshinori Sato {
1171*4aea3d0cSYoshinori Sato     prt("fmul\t#%d,r%d", li(ctx, 0), a->rd);
1172*4aea3d0cSYoshinori Sato     return true;
1173*4aea3d0cSYoshinori Sato }
1174*4aea3d0cSYoshinori Sato 
1175*4aea3d0cSYoshinori Sato /* fmul dsp[rs], rd */
1176*4aea3d0cSYoshinori Sato /* fmul rs, rd */
1177*4aea3d0cSYoshinori Sato static bool trans_FMUL_mr(DisasContext *ctx, arg_FMUL_mr *a)
1178*4aea3d0cSYoshinori Sato {
1179*4aea3d0cSYoshinori Sato     prt("fmul\t");
1180*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, RX_IM_LONG, a->rs, a->rd);
1181*4aea3d0cSYoshinori Sato     return true;
1182*4aea3d0cSYoshinori Sato }
1183*4aea3d0cSYoshinori Sato 
1184*4aea3d0cSYoshinori Sato /* fdiv #imm, rd */
1185*4aea3d0cSYoshinori Sato static bool trans_FDIV_ir(DisasContext *ctx, arg_FDIV_ir *a)
1186*4aea3d0cSYoshinori Sato {
1187*4aea3d0cSYoshinori Sato     prt("fdiv\t#%d,r%d", li(ctx, 0), a->rd);
1188*4aea3d0cSYoshinori Sato     return true;
1189*4aea3d0cSYoshinori Sato }
1190*4aea3d0cSYoshinori Sato 
1191*4aea3d0cSYoshinori Sato /* fdiv dsp[rs], rd */
1192*4aea3d0cSYoshinori Sato /* fdiv rs, rd */
1193*4aea3d0cSYoshinori Sato static bool trans_FDIV_mr(DisasContext *ctx, arg_FDIV_mr *a)
1194*4aea3d0cSYoshinori Sato {
1195*4aea3d0cSYoshinori Sato     prt("fdiv\t");
1196*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, RX_IM_LONG, a->rs, a->rd);
1197*4aea3d0cSYoshinori Sato     return true;
1198*4aea3d0cSYoshinori Sato }
1199*4aea3d0cSYoshinori Sato 
1200*4aea3d0cSYoshinori Sato /* round dsp[rs], rd */
1201*4aea3d0cSYoshinori Sato /* round rs, rd */
1202*4aea3d0cSYoshinori Sato static bool trans_ROUND(DisasContext *ctx, arg_ROUND *a)
1203*4aea3d0cSYoshinori Sato {
1204*4aea3d0cSYoshinori Sato     prt("round\t");
1205*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, RX_IM_LONG, a->rs, a->rd);
1206*4aea3d0cSYoshinori Sato     return true;
1207*4aea3d0cSYoshinori Sato }
1208*4aea3d0cSYoshinori Sato 
1209*4aea3d0cSYoshinori Sato /* itof rs, rd */
1210*4aea3d0cSYoshinori Sato /* itof dsp[rs], rd */
1211*4aea3d0cSYoshinori Sato static bool trans_ITOF(DisasContext *ctx, arg_ITOF *a)
1212*4aea3d0cSYoshinori Sato {
1213*4aea3d0cSYoshinori Sato     prt("itof\t");
1214*4aea3d0cSYoshinori Sato     operand(ctx, a->ld, RX_IM_LONG, a->rs, a->rd);
1215*4aea3d0cSYoshinori Sato     return true;
1216*4aea3d0cSYoshinori Sato }
1217*4aea3d0cSYoshinori Sato 
1218*4aea3d0cSYoshinori Sato #define BOP_IM(name, reg)                                       \
1219*4aea3d0cSYoshinori Sato     do {                                                        \
1220*4aea3d0cSYoshinori Sato         int dsp;                                                \
1221*4aea3d0cSYoshinori Sato         prt("b%s\t#%d, ", #name, a->imm);                       \
1222*4aea3d0cSYoshinori Sato         dsp = rx_index_addr(a->ld, RX_MEMORY_BYTE, ctx);        \
1223*4aea3d0cSYoshinori Sato         if (dsp > 0) {                                          \
1224*4aea3d0cSYoshinori Sato             prt("%d", dsp);                                     \
1225*4aea3d0cSYoshinori Sato         }                                                       \
1226*4aea3d0cSYoshinori Sato         prt("[r%d]", reg);                                      \
1227*4aea3d0cSYoshinori Sato         return true;                                            \
1228*4aea3d0cSYoshinori Sato     } while (0)
1229*4aea3d0cSYoshinori Sato 
1230*4aea3d0cSYoshinori Sato #define BOP_RM(name)                                            \
1231*4aea3d0cSYoshinori Sato     do {                                                        \
1232*4aea3d0cSYoshinori Sato         int dsp;                                                \
1233*4aea3d0cSYoshinori Sato         prt("b%s\tr%d, ", #name, a->rd);                        \
1234*4aea3d0cSYoshinori Sato         dsp = rx_index_addr(a->ld, RX_MEMORY_BYTE, ctx);        \
1235*4aea3d0cSYoshinori Sato         if (dsp > 0) {                                          \
1236*4aea3d0cSYoshinori Sato             prt("%d", dsp);                                     \
1237*4aea3d0cSYoshinori Sato         }                                                       \
1238*4aea3d0cSYoshinori Sato         prt("[r%d]", a->rs);                                    \
1239*4aea3d0cSYoshinori Sato         return true;                                            \
1240*4aea3d0cSYoshinori Sato     } while (0)
1241*4aea3d0cSYoshinori Sato 
1242*4aea3d0cSYoshinori Sato /* bset #imm, dsp[rd] */
1243*4aea3d0cSYoshinori Sato static bool trans_BSET_im(DisasContext *ctx, arg_BSET_im *a)
1244*4aea3d0cSYoshinori Sato {
1245*4aea3d0cSYoshinori Sato     BOP_IM(bset, a->rs);
1246*4aea3d0cSYoshinori Sato }
1247*4aea3d0cSYoshinori Sato 
1248*4aea3d0cSYoshinori Sato /* bset rs, dsp[rd] */
1249*4aea3d0cSYoshinori Sato static bool trans_BSET_rm(DisasContext *ctx, arg_BSET_rm *a)
1250*4aea3d0cSYoshinori Sato {
1251*4aea3d0cSYoshinori Sato     BOP_RM(set);
1252*4aea3d0cSYoshinori Sato }
1253*4aea3d0cSYoshinori Sato 
1254*4aea3d0cSYoshinori Sato /* bset rs, rd */
1255*4aea3d0cSYoshinori Sato static bool trans_BSET_rr(DisasContext *ctx, arg_BSET_rr *a)
1256*4aea3d0cSYoshinori Sato {
1257*4aea3d0cSYoshinori Sato     prt("bset\tr%d,r%d", a->rs, a->rd);
1258*4aea3d0cSYoshinori Sato     return true;
1259*4aea3d0cSYoshinori Sato }
1260*4aea3d0cSYoshinori Sato 
1261*4aea3d0cSYoshinori Sato /* bset #imm, rd */
1262*4aea3d0cSYoshinori Sato static bool trans_BSET_ir(DisasContext *ctx, arg_BSET_ir *a)
1263*4aea3d0cSYoshinori Sato {
1264*4aea3d0cSYoshinori Sato     prt("bset\t#%d, r%d", a->imm, a->rd);
1265*4aea3d0cSYoshinori Sato     return true;
1266*4aea3d0cSYoshinori Sato }
1267*4aea3d0cSYoshinori Sato 
1268*4aea3d0cSYoshinori Sato /* bclr #imm, dsp[rd] */
1269*4aea3d0cSYoshinori Sato static bool trans_BCLR_im(DisasContext *ctx, arg_BCLR_im *a)
1270*4aea3d0cSYoshinori Sato {
1271*4aea3d0cSYoshinori Sato     BOP_IM(clr, a->rs);
1272*4aea3d0cSYoshinori Sato }
1273*4aea3d0cSYoshinori Sato 
1274*4aea3d0cSYoshinori Sato /* bclr rs, dsp[rd] */
1275*4aea3d0cSYoshinori Sato static bool trans_BCLR_rm(DisasContext *ctx, arg_BCLR_rm *a)
1276*4aea3d0cSYoshinori Sato {
1277*4aea3d0cSYoshinori Sato     BOP_RM(clr);
1278*4aea3d0cSYoshinori Sato }
1279*4aea3d0cSYoshinori Sato 
1280*4aea3d0cSYoshinori Sato /* bclr rs, rd */
1281*4aea3d0cSYoshinori Sato static bool trans_BCLR_rr(DisasContext *ctx, arg_BCLR_rr *a)
1282*4aea3d0cSYoshinori Sato {
1283*4aea3d0cSYoshinori Sato     prt("bclr\tr%d, r%d", a->rs, a->rd);
1284*4aea3d0cSYoshinori Sato     return true;
1285*4aea3d0cSYoshinori Sato }
1286*4aea3d0cSYoshinori Sato 
1287*4aea3d0cSYoshinori Sato /* bclr #imm, rd */
1288*4aea3d0cSYoshinori Sato static bool trans_BCLR_ir(DisasContext *ctx, arg_BCLR_ir *a)
1289*4aea3d0cSYoshinori Sato {
1290*4aea3d0cSYoshinori Sato     prt("bclr\t#%d,r%d", a->imm, a->rd);
1291*4aea3d0cSYoshinori Sato     return true;
1292*4aea3d0cSYoshinori Sato }
1293*4aea3d0cSYoshinori Sato 
1294*4aea3d0cSYoshinori Sato /* btst #imm, dsp[rd] */
1295*4aea3d0cSYoshinori Sato static bool trans_BTST_im(DisasContext *ctx, arg_BTST_im *a)
1296*4aea3d0cSYoshinori Sato {
1297*4aea3d0cSYoshinori Sato     BOP_IM(tst, a->rs);
1298*4aea3d0cSYoshinori Sato }
1299*4aea3d0cSYoshinori Sato 
1300*4aea3d0cSYoshinori Sato /* btst rs, dsp[rd] */
1301*4aea3d0cSYoshinori Sato static bool trans_BTST_rm(DisasContext *ctx, arg_BTST_rm *a)
1302*4aea3d0cSYoshinori Sato {
1303*4aea3d0cSYoshinori Sato     BOP_RM(tst);
1304*4aea3d0cSYoshinori Sato }
1305*4aea3d0cSYoshinori Sato 
1306*4aea3d0cSYoshinori Sato /* btst rs, rd */
1307*4aea3d0cSYoshinori Sato static bool trans_BTST_rr(DisasContext *ctx, arg_BTST_rr *a)
1308*4aea3d0cSYoshinori Sato {
1309*4aea3d0cSYoshinori Sato     prt("btst\tr%d, r%d", a->rs, a->rd);
1310*4aea3d0cSYoshinori Sato     return true;
1311*4aea3d0cSYoshinori Sato }
1312*4aea3d0cSYoshinori Sato 
1313*4aea3d0cSYoshinori Sato /* btst #imm, rd */
1314*4aea3d0cSYoshinori Sato static bool trans_BTST_ir(DisasContext *ctx, arg_BTST_ir *a)
1315*4aea3d0cSYoshinori Sato {
1316*4aea3d0cSYoshinori Sato     prt("btst\t#%d, r%d", a->imm, a->rd);
1317*4aea3d0cSYoshinori Sato     return true;
1318*4aea3d0cSYoshinori Sato }
1319*4aea3d0cSYoshinori Sato 
1320*4aea3d0cSYoshinori Sato /* bnot rs, dsp[rd] */
1321*4aea3d0cSYoshinori Sato static bool trans_BNOT_rm(DisasContext *ctx, arg_BNOT_rm *a)
1322*4aea3d0cSYoshinori Sato {
1323*4aea3d0cSYoshinori Sato     BOP_RM(not);
1324*4aea3d0cSYoshinori Sato }
1325*4aea3d0cSYoshinori Sato 
1326*4aea3d0cSYoshinori Sato /* bnot rs, rd */
1327*4aea3d0cSYoshinori Sato static bool trans_BNOT_rr(DisasContext *ctx, arg_BNOT_rr *a)
1328*4aea3d0cSYoshinori Sato {
1329*4aea3d0cSYoshinori Sato     prt("bnot\tr%d, r%d", a->rs, a->rd);
1330*4aea3d0cSYoshinori Sato     return true;
1331*4aea3d0cSYoshinori Sato }
1332*4aea3d0cSYoshinori Sato 
1333*4aea3d0cSYoshinori Sato /* bnot #imm, dsp[rd] */
1334*4aea3d0cSYoshinori Sato static bool trans_BNOT_im(DisasContext *ctx, arg_BNOT_im *a)
1335*4aea3d0cSYoshinori Sato {
1336*4aea3d0cSYoshinori Sato     BOP_IM(not, a->rs);
1337*4aea3d0cSYoshinori Sato }
1338*4aea3d0cSYoshinori Sato 
1339*4aea3d0cSYoshinori Sato /* bnot #imm, rd */
1340*4aea3d0cSYoshinori Sato static bool trans_BNOT_ir(DisasContext *ctx, arg_BNOT_ir *a)
1341*4aea3d0cSYoshinori Sato {
1342*4aea3d0cSYoshinori Sato     prt("bnot\t#%d, r%d", a->imm, a->rd);
1343*4aea3d0cSYoshinori Sato     return true;
1344*4aea3d0cSYoshinori Sato }
1345*4aea3d0cSYoshinori Sato 
1346*4aea3d0cSYoshinori Sato /* bmcond #imm, dsp[rd] */
1347*4aea3d0cSYoshinori Sato static bool trans_BMCnd_im(DisasContext *ctx, arg_BMCnd_im *a)
1348*4aea3d0cSYoshinori Sato {
1349*4aea3d0cSYoshinori Sato     int dsp = rx_index_addr(a->ld, RX_MEMORY_BYTE, ctx);
1350*4aea3d0cSYoshinori Sato     prt("bm%s\t#%d, ", cond[a->cd], a->imm);
1351*4aea3d0cSYoshinori Sato     if (dsp > 0) {
1352*4aea3d0cSYoshinori Sato         prt("%d", dsp);
1353*4aea3d0cSYoshinori Sato     }
1354*4aea3d0cSYoshinori Sato     prt("[%d]", a->rd);
1355*4aea3d0cSYoshinori Sato     return true;
1356*4aea3d0cSYoshinori Sato }
1357*4aea3d0cSYoshinori Sato 
1358*4aea3d0cSYoshinori Sato /* bmcond #imm, rd */
1359*4aea3d0cSYoshinori Sato static bool trans_BMCnd_ir(DisasContext *ctx, arg_BMCnd_ir *a)
1360*4aea3d0cSYoshinori Sato {
1361*4aea3d0cSYoshinori Sato     prt("bm%s\t#%d, r%d", cond[a->cd], a->imm, a->rd);
1362*4aea3d0cSYoshinori Sato     return true;
1363*4aea3d0cSYoshinori Sato }
1364*4aea3d0cSYoshinori Sato 
1365*4aea3d0cSYoshinori Sato /* clrpsw psw */
1366*4aea3d0cSYoshinori Sato static bool trans_CLRPSW(DisasContext *ctx, arg_CLRPSW *a)
1367*4aea3d0cSYoshinori Sato {
1368*4aea3d0cSYoshinori Sato     prt("clrpsw\t%c", psw[a->cb]);
1369*4aea3d0cSYoshinori Sato     return true;
1370*4aea3d0cSYoshinori Sato }
1371*4aea3d0cSYoshinori Sato 
1372*4aea3d0cSYoshinori Sato /* setpsw psw */
1373*4aea3d0cSYoshinori Sato static bool trans_SETPSW(DisasContext *ctx, arg_SETPSW *a)
1374*4aea3d0cSYoshinori Sato {
1375*4aea3d0cSYoshinori Sato     prt("setpsw\t%c", psw[a->cb]);
1376*4aea3d0cSYoshinori Sato     return true;
1377*4aea3d0cSYoshinori Sato }
1378*4aea3d0cSYoshinori Sato 
1379*4aea3d0cSYoshinori Sato /* mvtipl #imm */
1380*4aea3d0cSYoshinori Sato static bool trans_MVTIPL(DisasContext *ctx, arg_MVTIPL *a)
1381*4aea3d0cSYoshinori Sato {
1382*4aea3d0cSYoshinori Sato     prt("movtipl\t#%d", a->imm);
1383*4aea3d0cSYoshinori Sato     return true;
1384*4aea3d0cSYoshinori Sato }
1385*4aea3d0cSYoshinori Sato 
1386*4aea3d0cSYoshinori Sato /* mvtc #imm, rd */
1387*4aea3d0cSYoshinori Sato static bool trans_MVTC_i(DisasContext *ctx, arg_MVTC_i *a)
1388*4aea3d0cSYoshinori Sato {
1389*4aea3d0cSYoshinori Sato     prt("mvtc\t#0x%08x, %s", a->imm, rx_crname(a->cr));
1390*4aea3d0cSYoshinori Sato     return true;
1391*4aea3d0cSYoshinori Sato }
1392*4aea3d0cSYoshinori Sato 
1393*4aea3d0cSYoshinori Sato /* mvtc rs, rd */
1394*4aea3d0cSYoshinori Sato static bool trans_MVTC_r(DisasContext *ctx, arg_MVTC_r *a)
1395*4aea3d0cSYoshinori Sato {
1396*4aea3d0cSYoshinori Sato     prt("mvtc\tr%d, %s", a->rs, rx_crname(a->cr));
1397*4aea3d0cSYoshinori Sato     return true;
1398*4aea3d0cSYoshinori Sato }
1399*4aea3d0cSYoshinori Sato 
1400*4aea3d0cSYoshinori Sato /* mvfc rs, rd */
1401*4aea3d0cSYoshinori Sato static bool trans_MVFC(DisasContext *ctx, arg_MVFC *a)
1402*4aea3d0cSYoshinori Sato {
1403*4aea3d0cSYoshinori Sato     prt("mvfc\t%s, r%d", rx_crname(a->cr), a->rd);
1404*4aea3d0cSYoshinori Sato     return true;
1405*4aea3d0cSYoshinori Sato }
1406*4aea3d0cSYoshinori Sato 
1407*4aea3d0cSYoshinori Sato /* rtfi */
1408*4aea3d0cSYoshinori Sato static bool trans_RTFI(DisasContext *ctx, arg_RTFI *a)
1409*4aea3d0cSYoshinori Sato {
1410*4aea3d0cSYoshinori Sato     prt("rtfi");
1411*4aea3d0cSYoshinori Sato     return true;
1412*4aea3d0cSYoshinori Sato }
1413*4aea3d0cSYoshinori Sato 
1414*4aea3d0cSYoshinori Sato /* rte */
1415*4aea3d0cSYoshinori Sato static bool trans_RTE(DisasContext *ctx, arg_RTE *a)
1416*4aea3d0cSYoshinori Sato {
1417*4aea3d0cSYoshinori Sato     prt("rte");
1418*4aea3d0cSYoshinori Sato     return true;
1419*4aea3d0cSYoshinori Sato }
1420*4aea3d0cSYoshinori Sato 
1421*4aea3d0cSYoshinori Sato /* brk */
1422*4aea3d0cSYoshinori Sato static bool trans_BRK(DisasContext *ctx, arg_BRK *a)
1423*4aea3d0cSYoshinori Sato {
1424*4aea3d0cSYoshinori Sato     prt("brk");
1425*4aea3d0cSYoshinori Sato     return true;
1426*4aea3d0cSYoshinori Sato }
1427*4aea3d0cSYoshinori Sato 
1428*4aea3d0cSYoshinori Sato /* int #imm */
1429*4aea3d0cSYoshinori Sato static bool trans_INT(DisasContext *ctx, arg_INT *a)
1430*4aea3d0cSYoshinori Sato {
1431*4aea3d0cSYoshinori Sato     prt("int\t#%d", a->imm);
1432*4aea3d0cSYoshinori Sato     return true;
1433*4aea3d0cSYoshinori Sato }
1434*4aea3d0cSYoshinori Sato 
1435*4aea3d0cSYoshinori Sato /* wait */
1436*4aea3d0cSYoshinori Sato static bool trans_WAIT(DisasContext *ctx, arg_WAIT *a)
1437*4aea3d0cSYoshinori Sato {
1438*4aea3d0cSYoshinori Sato     prt("wait");
1439*4aea3d0cSYoshinori Sato     return true;
1440*4aea3d0cSYoshinori Sato }
1441*4aea3d0cSYoshinori Sato 
1442*4aea3d0cSYoshinori Sato /* sccnd.[bwl] rd */
1443*4aea3d0cSYoshinori Sato /* sccnd.[bwl] dsp:[rd] */
1444*4aea3d0cSYoshinori Sato static bool trans_SCCnd(DisasContext *ctx, arg_SCCnd *a)
1445*4aea3d0cSYoshinori Sato {
1446*4aea3d0cSYoshinori Sato     int dsp;
1447*4aea3d0cSYoshinori Sato     prt("sc%s.%c\t", cond[a->cd], size[a->sz]);
1448*4aea3d0cSYoshinori Sato     if (a->ld < 3) {
1449*4aea3d0cSYoshinori Sato         dsp = rx_index_addr(a->sz, a->ld, ctx);
1450*4aea3d0cSYoshinori Sato         if (dsp > 0) {
1451*4aea3d0cSYoshinori Sato             prt("%d", dsp);
1452*4aea3d0cSYoshinori Sato         }
1453*4aea3d0cSYoshinori Sato         prt("[r%d]", a->rd);
1454*4aea3d0cSYoshinori Sato     } else {
1455*4aea3d0cSYoshinori Sato         prt("r%d", a->rd);
1456*4aea3d0cSYoshinori Sato     }
1457*4aea3d0cSYoshinori Sato     return true;
1458*4aea3d0cSYoshinori Sato }
1459*4aea3d0cSYoshinori Sato 
1460*4aea3d0cSYoshinori Sato int print_insn_rx(bfd_vma addr, disassemble_info *dis)
1461*4aea3d0cSYoshinori Sato {
1462*4aea3d0cSYoshinori Sato     DisasContext ctx;
1463*4aea3d0cSYoshinori Sato     uint32_t insn;
1464*4aea3d0cSYoshinori Sato     int i;
1465*4aea3d0cSYoshinori Sato     ctx.dis = dis;
1466*4aea3d0cSYoshinori Sato     ctx.pc = ctx.addr = addr;
1467*4aea3d0cSYoshinori Sato 
1468*4aea3d0cSYoshinori Sato     insn = decode_load(&ctx);
1469*4aea3d0cSYoshinori Sato     if (!decode(&ctx, insn)) {
1470*4aea3d0cSYoshinori Sato         ctx.dis->fprintf_func(ctx.dis->stream, ".byte\t");
1471*4aea3d0cSYoshinori Sato         for (i = 0; i < ctx.addr - addr; i++) {
1472*4aea3d0cSYoshinori Sato             if (i > 0) {
1473*4aea3d0cSYoshinori Sato                 ctx.dis->fprintf_func(ctx.dis->stream, ",");
1474*4aea3d0cSYoshinori Sato             }
1475*4aea3d0cSYoshinori Sato             ctx.dis->fprintf_func(ctx.dis->stream, "0x%02x", insn >> 24);
1476*4aea3d0cSYoshinori Sato             insn <<= 8;
1477*4aea3d0cSYoshinori Sato         }
1478*4aea3d0cSYoshinori Sato     }
1479*4aea3d0cSYoshinori Sato     return ctx.addr - addr;
1480*4aea3d0cSYoshinori Sato }
1481