qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

disas.c (9029B)


      1 /*
      2  * OpenRISC disassembler
      3  *
      4  * Copyright (c) 2018 Richard Henderson <rth@twiddle.net>
      5  *
      6  * This program is free software: you can redistribute it and/or modify
      7  * it under the terms of the GNU General Public License as published by
      8  * the Free Software Foundation, either version 2 of the License, or
      9  * (at your option) any later version.
     10  *
     11  * This program is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14  * GNU General Public License for more details.
     15  *
     16  * You should have received a copy of the GNU General Public License
     17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     18  */
     19 
     20 #include "qemu/osdep.h"
     21 #include "disas/dis-asm.h"
     22 #include "qemu/bitops.h"
     23 #include "cpu.h"
     24 
     25 typedef disassemble_info DisasContext;
     26 
     27 /* Include the auto-generated decoder.  */
     28 #include "decode-insns.c.inc"
     29 
     30 #define output(mnemonic, format, ...) \
     31     (info->fprintf_func(info->stream, "%-9s " format, \
     32                         mnemonic, ##__VA_ARGS__))
     33 
     34 int print_insn_or1k(bfd_vma addr, disassemble_info *info)
     35 {
     36     bfd_byte buffer[4];
     37     uint32_t insn;
     38     int status;
     39 
     40     status = info->read_memory_func(addr, buffer, 4, info);
     41     if (status != 0) {
     42         info->memory_error_func(status, addr, info);
     43         return -1;
     44     }
     45     insn = bfd_getb32(buffer);
     46 
     47     if (!decode(info, insn)) {
     48         output(".long", "%#08x", insn);
     49     }
     50     return 4;
     51 }
     52 
     53 #define INSN(opcode, format, ...)                                       \
     54 static bool trans_l_##opcode(disassemble_info *info, arg_l_##opcode *a) \
     55 {                                                                       \
     56     output("l." #opcode, format, ##__VA_ARGS__);                        \
     57     return true;                                                        \
     58 }
     59 
     60 INSN(add,    "r%d, r%d, r%d", a->d, a->a, a->b)
     61 INSN(addc,   "r%d, r%d, r%d", a->d, a->a, a->b)
     62 INSN(sub,    "r%d, r%d, r%d", a->d, a->a, a->b)
     63 INSN(and,    "r%d, r%d, r%d", a->d, a->a, a->b)
     64 INSN(or,     "r%d, r%d, r%d", a->d, a->a, a->b)
     65 INSN(xor,    "r%d, r%d, r%d", a->d, a->a, a->b)
     66 INSN(sll,    "r%d, r%d, r%d", a->d, a->a, a->b)
     67 INSN(srl,    "r%d, r%d, r%d", a->d, a->a, a->b)
     68 INSN(sra,    "r%d, r%d, r%d", a->d, a->a, a->b)
     69 INSN(ror,    "r%d, r%d, r%d", a->d, a->a, a->b)
     70 INSN(exths,  "r%d, r%d", a->d, a->a)
     71 INSN(extbs,  "r%d, r%d", a->d, a->a)
     72 INSN(exthz,  "r%d, r%d", a->d, a->a)
     73 INSN(extbz,  "r%d, r%d", a->d, a->a)
     74 INSN(cmov,   "r%d, r%d, r%d", a->d, a->a, a->b)
     75 INSN(ff1,    "r%d, r%d", a->d, a->a)
     76 INSN(fl1,    "r%d, r%d", a->d, a->a)
     77 INSN(mul,    "r%d, r%d, r%d", a->d, a->a, a->b)
     78 INSN(mulu,   "r%d, r%d, r%d", a->d, a->a, a->b)
     79 INSN(div,    "r%d, r%d, r%d", a->d, a->a, a->b)
     80 INSN(divu,   "r%d, r%d, r%d", a->d, a->a, a->b)
     81 INSN(muld,   "r%d, r%d", a->a, a->b)
     82 INSN(muldu,  "r%d, r%d", a->a, a->b)
     83 INSN(j,      "%d", a->n)
     84 INSN(jal,    "%d", a->n)
     85 INSN(bf,     "%d", a->n)
     86 INSN(bnf,    "%d", a->n)
     87 INSN(jr,     "r%d", a->b)
     88 INSN(jalr,   "r%d", a->b)
     89 INSN(lwa,    "r%d, %d(r%d)", a->d, a->i, a->a)
     90 INSN(lwz,    "r%d, %d(r%d)", a->d, a->i, a->a)
     91 INSN(lws,    "r%d, %d(r%d)", a->d, a->i, a->a)
     92 INSN(lbz,    "r%d, %d(r%d)", a->d, a->i, a->a)
     93 INSN(lbs,    "r%d, %d(r%d)", a->d, a->i, a->a)
     94 INSN(lhz,    "r%d, %d(r%d)", a->d, a->i, a->a)
     95 INSN(lhs,    "r%d, %d(r%d)", a->d, a->i, a->a)
     96 INSN(swa,    "%d(r%d), r%d", a->i, a->a, a->b)
     97 INSN(sw,     "%d(r%d), r%d", a->i, a->a, a->b)
     98 INSN(sb,     "%d(r%d), r%d", a->i, a->a, a->b)
     99 INSN(sh,     "%d(r%d), r%d", a->i, a->a, a->b)
    100 INSN(nop,    "")
    101 INSN(adrp,   "r%d, %d", a->d, a->i)
    102 INSN(addi,   "r%d, r%d, %d", a->d, a->a, a->i)
    103 INSN(addic,  "r%d, r%d, %d", a->d, a->a, a->i)
    104 INSN(muli,   "r%d, r%d, %d", a->d, a->a, a->i)
    105 INSN(maci,   "r%d, %d", a->a, a->i)
    106 INSN(andi,   "r%d, r%d, %d", a->d, a->a, a->k)
    107 INSN(ori,    "r%d, r%d, %d", a->d, a->a, a->k)
    108 INSN(xori,   "r%d, r%d, %d", a->d, a->a, a->i)
    109 INSN(mfspr,  "r%d, r%d, %d", a->d, a->a, a->k)
    110 INSN(mtspr,  "r%d, r%d, %d", a->a, a->b, a->k)
    111 INSN(mac,    "r%d, r%d", a->a, a->b)
    112 INSN(msb,    "r%d, r%d", a->a, a->b)
    113 INSN(macu,   "r%d, r%d", a->a, a->b)
    114 INSN(msbu,   "r%d, r%d", a->a, a->b)
    115 INSN(slli,   "r%d, r%d, %d", a->d, a->a, a->l)
    116 INSN(srli,   "r%d, r%d, %d", a->d, a->a, a->l)
    117 INSN(srai,   "r%d, r%d, %d", a->d, a->a, a->l)
    118 INSN(rori,   "r%d, r%d, %d", a->d, a->a, a->l)
    119 INSN(movhi,  "r%d, %d", a->d, a->k)
    120 INSN(macrc,  "r%d", a->d)
    121 INSN(sfeq,   "r%d, r%d", a->a, a->b)
    122 INSN(sfne,   "r%d, r%d", a->a, a->b)
    123 INSN(sfgtu,  "r%d, r%d", a->a, a->b)
    124 INSN(sfgeu,  "r%d, r%d", a->a, a->b)
    125 INSN(sfltu,  "r%d, r%d", a->a, a->b)
    126 INSN(sfleu,  "r%d, r%d", a->a, a->b)
    127 INSN(sfgts,  "r%d, r%d", a->a, a->b)
    128 INSN(sfges,  "r%d, r%d", a->a, a->b)
    129 INSN(sflts,  "r%d, r%d", a->a, a->b)
    130 INSN(sfles,  "r%d, r%d", a->a, a->b)
    131 INSN(sfeqi,  "r%d, %d", a->a, a->i)
    132 INSN(sfnei,  "r%d, %d", a->a, a->i)
    133 INSN(sfgtui, "r%d, %d", a->a, a->i)
    134 INSN(sfgeui, "r%d, %d", a->a, a->i)
    135 INSN(sfltui, "r%d, %d", a->a, a->i)
    136 INSN(sfleui, "r%d, %d", a->a, a->i)
    137 INSN(sfgtsi, "r%d, %d", a->a, a->i)
    138 INSN(sfgesi, "r%d, %d", a->a, a->i)
    139 INSN(sfltsi, "r%d, %d", a->a, a->i)
    140 INSN(sflesi, "r%d, %d", a->a, a->i)
    141 INSN(sys,    "%d", a->k)
    142 INSN(trap,   "%d", a->k)
    143 INSN(msync,  "")
    144 INSN(psync,  "")
    145 INSN(csync,  "")
    146 INSN(rfe,    "")
    147 
    148 #define FP_INSN(opcode, suffix, format, ...)                            \
    149 static bool trans_lf_##opcode##_##suffix(disassemble_info *info,        \
    150                                          arg_lf_##opcode##_##suffix *a) \
    151 {                                                                       \
    152     output("lf." #opcode "." #suffix, format, ##__VA_ARGS__);           \
    153     return true;                                                        \
    154 }
    155 
    156 FP_INSN(add, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
    157 FP_INSN(sub, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
    158 FP_INSN(mul, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
    159 FP_INSN(div, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
    160 FP_INSN(rem, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
    161 FP_INSN(itof, s, "r%d, r%d", a->d, a->a)
    162 FP_INSN(ftoi, s, "r%d, r%d", a->d, a->a)
    163 FP_INSN(madd, s, "r%d, r%d, r%d", a->d, a->a, a->b)
    164 FP_INSN(sfeq, s, "r%d, r%d", a->a, a->b)
    165 FP_INSN(sfne, s, "r%d, r%d", a->a, a->b)
    166 FP_INSN(sfgt, s, "r%d, r%d", a->a, a->b)
    167 FP_INSN(sfge, s, "r%d, r%d", a->a, a->b)
    168 FP_INSN(sflt, s, "r%d, r%d", a->a, a->b)
    169 FP_INSN(sfle, s, "r%d, r%d", a->a, a->b)
    170 FP_INSN(sfun, s, "r%d, r%d", a->a, a->b)
    171 FP_INSN(sfueq, s, "r%d, r%d", a->a, a->b)
    172 FP_INSN(sfuge, s, "r%d, r%d", a->a, a->b)
    173 FP_INSN(sfugt, s, "r%d, r%d", a->a, a->b)
    174 FP_INSN(sfule, s, "r%d, r%d", a->a, a->b)
    175 FP_INSN(sfult, s, "r%d, r%d", a->a, a->b)
    176 
    177 FP_INSN(add, d,  "r%d,r%d, r%d,r%d, r%d,r%d",
    178         a->d, a->d + a->dp + 1,
    179         a->a, a->a + a->ap + 1,
    180         a->b, a->b + a->bp + 1)
    181 FP_INSN(sub, d,  "r%d,r%d, r%d,r%d, r%d,r%d",
    182         a->d, a->d + a->dp + 1,
    183         a->a, a->a + a->ap + 1,
    184         a->b, a->b + a->bp + 1)
    185 FP_INSN(mul, d,  "r%d,r%d, r%d,r%d, r%d,r%d",
    186         a->d, a->d + a->dp + 1,
    187         a->a, a->a + a->ap + 1,
    188         a->b, a->b + a->bp + 1)
    189 FP_INSN(div, d,  "r%d,r%d, r%d,r%d, r%d,r%d",
    190         a->d, a->d + a->dp + 1,
    191         a->a, a->a + a->ap + 1,
    192         a->b, a->b + a->bp + 1)
    193 FP_INSN(rem, d,  "r%d,r%d, r%d,r%d, r%d,r%d",
    194         a->d, a->d + a->dp + 1,
    195         a->a, a->a + a->ap + 1,
    196         a->b, a->b + a->bp + 1)
    197 FP_INSN(madd, d, "r%d,r%d, r%d,r%d, r%d,r%d",
    198         a->d, a->d + a->dp + 1,
    199         a->a, a->a + a->ap + 1,
    200         a->b, a->b + a->bp + 1)
    201 
    202 FP_INSN(itof, d, "r%d,r%d, r%d,r%d",
    203         a->d, a->d + a->dp + 1,
    204         a->a, a->a + a->ap + 1)
    205 FP_INSN(ftoi, d, "r%d,r%d, r%d,r%d",
    206         a->d, a->d + a->dp + 1,
    207         a->a, a->a + a->ap + 1)
    208 
    209 FP_INSN(stod, d, "r%d,r%d, r%d",
    210         a->d, a->d + a->dp + 1, a->a)
    211 FP_INSN(dtos, d, "r%d r%d,r%d",
    212         a->d, a->a, a->a + a->ap + 1)
    213 
    214 FP_INSN(sfeq, d, "r%d,r%d, r%d,r%d",
    215         a->a, a->a + a->ap + 1,
    216         a->b, a->b + a->bp + 1)
    217 FP_INSN(sfne, d, "r%d,r%d, r%d,r%d",
    218         a->a, a->a + a->ap + 1,
    219         a->b, a->b + a->bp + 1)
    220 FP_INSN(sfgt, d, "r%d,r%d, r%d,r%d",
    221         a->a, a->a + a->ap + 1,
    222         a->b, a->b + a->bp + 1)
    223 FP_INSN(sfge, d, "r%d,r%d, r%d,r%d",
    224         a->a, a->a + a->ap + 1,
    225         a->b, a->b + a->bp + 1)
    226 FP_INSN(sflt, d, "r%d,r%d, r%d,r%d",
    227         a->a, a->a + a->ap + 1,
    228         a->b, a->b + a->bp + 1)
    229 FP_INSN(sfle, d, "r%d,r%d, r%d,r%d",
    230         a->a, a->a + a->ap + 1,
    231         a->b, a->b + a->bp + 1)
    232 FP_INSN(sfun, d, "r%d,r%d, r%d,r%d",
    233         a->a, a->a + a->ap + 1,
    234         a->b, a->b + a->bp + 1)
    235 FP_INSN(sfueq, d, "r%d,r%d, r%d,r%d",
    236         a->a, a->a + a->ap + 1,
    237         a->b, a->b + a->bp + 1)
    238 FP_INSN(sfuge, d, "r%d,r%d, r%d,r%d",
    239         a->a, a->a + a->ap + 1,
    240         a->b, a->b + a->bp + 1)
    241 FP_INSN(sfugt, d, "r%d,r%d, r%d,r%d",
    242         a->a, a->a + a->ap + 1,
    243         a->b, a->b + a->bp + 1)
    244 FP_INSN(sfule, d, "r%d,r%d, r%d,r%d",
    245         a->a, a->a + a->ap + 1,
    246         a->b, a->b + a->bp + 1)
    247 FP_INSN(sfult, d, "r%d,r%d, r%d,r%d",
    248         a->a, a->a + a->ap + 1,
    249         a->b, a->b + a->bp + 1)