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