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