qemu/target/openrisc/disas.c
<<
>>
Prefs
   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
  25typedef disassemble_info DisasContext;
  26
  27/* Include the auto-generated decoder.  */
  28#include "decode.inc.c"
  29
  30#define output(mnemonic, format, ...) \
  31    (info->fprintf_func(info->stream, "%-9s " format, \
  32                        mnemonic, ##__VA_ARGS__))
  33
  34int 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, ...)                                       \
  54static bool trans_l_##opcode(disassemble_info *info, arg_l_##opcode *a) \
  55{                                                                       \
  56    output("l." #opcode, format, ##__VA_ARGS__);                        \
  57    return true;                                                        \
  58}
  59
  60INSN(add,    "r%d, r%d, r%d", a->d, a->a, a->b)
  61INSN(addc,   "r%d, r%d, r%d", a->d, a->a, a->b)
  62INSN(sub,    "r%d, r%d, r%d", a->d, a->a, a->b)
  63INSN(and,    "r%d, r%d, r%d", a->d, a->a, a->b)
  64INSN(or,     "r%d, r%d, r%d", a->d, a->a, a->b)
  65INSN(xor,    "r%d, r%d, r%d", a->d, a->a, a->b)
  66INSN(sll,    "r%d, r%d, r%d", a->d, a->a, a->b)
  67INSN(srl,    "r%d, r%d, r%d", a->d, a->a, a->b)
  68INSN(sra,    "r%d, r%d, r%d", a->d, a->a, a->b)
  69INSN(ror,    "r%d, r%d, r%d", a->d, a->a, a->b)
  70INSN(exths,  "r%d, r%d", a->d, a->a)
  71INSN(extbs,  "r%d, r%d", a->d, a->a)
  72INSN(exthz,  "r%d, r%d", a->d, a->a)
  73INSN(extbz,  "r%d, r%d", a->d, a->a)
  74INSN(cmov,   "r%d, r%d, r%d", a->d, a->a, a->b)
  75INSN(ff1,    "r%d, r%d", a->d, a->a)
  76INSN(fl1,    "r%d, r%d", a->d, a->a)
  77INSN(mul,    "r%d, r%d, r%d", a->d, a->a, a->b)
  78INSN(mulu,   "r%d, r%d, r%d", a->d, a->a, a->b)
  79INSN(div,    "r%d, r%d, r%d", a->d, a->a, a->b)
  80INSN(divu,   "r%d, r%d, r%d", a->d, a->a, a->b)
  81INSN(muld,   "r%d, r%d", a->a, a->b)
  82INSN(muldu,  "r%d, r%d", a->a, a->b)
  83INSN(j,      "%d", a->n)
  84INSN(jal,    "%d", a->n)
  85INSN(bf,     "%d", a->n)
  86INSN(bnf,    "%d", a->n)
  87INSN(jr,     "r%d", a->b)
  88INSN(jalr,   "r%d", a->b)
  89INSN(lwa,    "r%d, %d(r%d)", a->d, a->i, a->a)
  90INSN(lwz,    "r%d, %d(r%d)", a->d, a->i, a->a)
  91INSN(lws,    "r%d, %d(r%d)", a->d, a->i, a->a)
  92INSN(lbz,    "r%d, %d(r%d)", a->d, a->i, a->a)
  93INSN(lbs,    "r%d, %d(r%d)", a->d, a->i, a->a)
  94INSN(lhz,    "r%d, %d(r%d)", a->d, a->i, a->a)
  95INSN(lhs,    "r%d, %d(r%d)", a->d, a->i, a->a)
  96INSN(swa,    "%d(r%d), r%d", a->i, a->a, a->b)
  97INSN(sw,     "%d(r%d), r%d", a->i, a->a, a->b)
  98INSN(sb,     "%d(r%d), r%d", a->i, a->a, a->b)
  99INSN(sh,     "%d(r%d), r%d", a->i, a->a, a->b)
 100INSN(nop,    "")
 101INSN(addi,   "r%d, r%d, %d", a->d, a->a, a->i)
 102INSN(addic,  "r%d, r%d, %d", a->d, a->a, a->i)
 103INSN(muli,   "r%d, r%d, %d", a->d, a->a, a->i)
 104INSN(maci,   "r%d, %d", a->a, a->i)
 105INSN(andi,   "r%d, r%d, %d", a->d, a->a, a->k)
 106INSN(ori,    "r%d, r%d, %d", a->d, a->a, a->k)
 107INSN(xori,   "r%d, r%d, %d", a->d, a->a, a->i)
 108INSN(mfspr,  "r%d, r%d, %d", a->d, a->a, a->k)
 109INSN(mtspr,  "r%d, r%d, %d", a->a, a->b, a->k)
 110INSN(mac,    "r%d, r%d", a->a, a->b)
 111INSN(msb,    "r%d, r%d", a->a, a->b)
 112INSN(macu,   "r%d, r%d", a->a, a->b)
 113INSN(msbu,   "r%d, r%d", a->a, a->b)
 114INSN(slli,   "r%d, r%d, %d", a->d, a->a, a->l)
 115INSN(srli,   "r%d, r%d, %d", a->d, a->a, a->l)
 116INSN(srai,   "r%d, r%d, %d", a->d, a->a, a->l)
 117INSN(rori,   "r%d, r%d, %d", a->d, a->a, a->l)
 118INSN(movhi,  "r%d, %d", a->d, a->k)
 119INSN(macrc,  "r%d", a->d)
 120INSN(sfeq,   "r%d, r%d", a->a, a->b)
 121INSN(sfne,   "r%d, r%d", a->a, a->b)
 122INSN(sfgtu,  "r%d, r%d", a->a, a->b)
 123INSN(sfgeu,  "r%d, r%d", a->a, a->b)
 124INSN(sfltu,  "r%d, r%d", a->a, a->b)
 125INSN(sfleu,  "r%d, r%d", a->a, a->b)
 126INSN(sfgts,  "r%d, r%d", a->a, a->b)
 127INSN(sfges,  "r%d, r%d", a->a, a->b)
 128INSN(sflts,  "r%d, r%d", a->a, a->b)
 129INSN(sfles,  "r%d, r%d", a->a, a->b)
 130INSN(sfeqi,  "r%d, %d", a->a, a->i)
 131INSN(sfnei,  "r%d, %d", a->a, a->i)
 132INSN(sfgtui, "r%d, %d", a->a, a->i)
 133INSN(sfgeui, "r%d, %d", a->a, a->i)
 134INSN(sfltui, "r%d, %d", a->a, a->i)
 135INSN(sfleui, "r%d, %d", a->a, a->i)
 136INSN(sfgtsi, "r%d, %d", a->a, a->i)
 137INSN(sfgesi, "r%d, %d", a->a, a->i)
 138INSN(sfltsi, "r%d, %d", a->a, a->i)
 139INSN(sflesi, "r%d, %d", a->a, a->i)
 140INSN(sys,    "%d", a->k)
 141INSN(trap,   "%d", a->k)
 142INSN(msync,  "")
 143INSN(psync,  "")
 144INSN(csync,  "")
 145INSN(rfe,    "")
 146
 147#define FP_INSN(opcode, suffix, format, ...)                            \
 148static bool trans_lf_##opcode##_##suffix(disassemble_info *info,        \
 149                                         arg_lf_##opcode##_##suffix *a) \
 150{                                                                       \
 151    output("lf." #opcode "." #suffix, format, ##__VA_ARGS__);           \
 152    return true;                                                        \
 153}
 154
 155FP_INSN(add, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
 156FP_INSN(sub, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
 157FP_INSN(mul, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
 158FP_INSN(div, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
 159FP_INSN(rem, s,  "r%d, r%d, r%d", a->d, a->a, a->b)
 160FP_INSN(itof, s, "r%d, r%d", a->d, a->a)
 161FP_INSN(ftoi, s, "r%d, r%d", a->d, a->a)
 162FP_INSN(madd, s, "r%d, r%d, r%d", a->d, a->a, a->b)
 163FP_INSN(sfeq, s, "r%d, r%d", a->a, a->b)
 164FP_INSN(sfne, s, "r%d, r%d", a->a, a->b)
 165FP_INSN(sfgt, s, "r%d, r%d", a->a, a->b)
 166FP_INSN(sfge, s, "r%d, r%d", a->a, a->b)
 167FP_INSN(sflt, s, "r%d, r%d", a->a, a->b)
 168FP_INSN(sfle, s, "r%d, r%d", a->a, a->b)
 169