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