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/dis-asm.h" 23 #include "qemu/bitops.h" 24 #include "cpu.h" 25 26 typedef 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 35 int 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, ...) \ 55 static bool trans_l_##opcode(disassemble_info *info, arg_l_##opcode *a) \ 56 { \ 57 output("l." #opcode, format, ##__VA_ARGS__); \ 58 return true; \ 59 } 60 61 INSN(add, "r%d, r%d, r%d", a->d, a->a, a->b) 62 INSN(addc, "r%d, r%d, r%d", a->d, a->a, a->b) 63 INSN(sub, "r%d, r%d, r%d", a->d, a->a, a->b) 64 INSN(and, "r%d, r%d, r%d", a->d, a->a, a->b) 65 INSN(or, "r%d, r%d, r%d", a->d, a->a, a->b) 66 INSN(xor, "r%d, r%d, r%d", a->d, a->a, a->b) 67 INSN(sll, "r%d, r%d, r%d", a->d, a->a, a->b) 68 INSN(srl, "r%d, r%d, r%d", a->d, a->a, a->b) 69 INSN(sra, "r%d, r%d, r%d", a->d, a->a, a->b) 70 INSN(ror, "r%d, r%d, r%d", a->d, a->a, a->b) 71 INSN(exths, "r%d, r%d", a->d, a->a) 72 INSN(extbs, "r%d, r%d", a->d, a->a) 73 INSN(exthz, "r%d, r%d", a->d, a->a) 74 INSN(extbz, "r%d, r%d", a->d, a->a) 75 INSN(cmov, "r%d, r%d, r%d", a->d, a->a, a->b) 76 INSN(ff1, "r%d, r%d", a->d, a->a) 77 INSN(fl1, "r%d, r%d", a->d, a->a) 78 INSN(mul, "r%d, r%d, r%d", a->d, a->a, a->b) 79 INSN(mulu, "r%d, r%d, r%d", a->d, a->a, a->b) 80 INSN(div, "r%d, r%d, r%d", a->d, a->a, a->b) 81 INSN(divu, "r%d, r%d, r%d", a->d, a->a, a->b) 82 INSN(muld, "r%d, r%d", a->a, a->b) 83 INSN(muldu, "r%d, r%d", a->a, a->b) 84 INSN(j, "%d", a->n) 85 INSN(jal, "%d", a->n) 86 INSN(bf, "%d", a->n) 87 INSN(bnf, "%d", a->n) 88 INSN(jr, "r%d", a->b) 89 INSN(jalr, "r%d", a->b) 90 INSN(lwa, "r%d, %d(r%d)", a->d, a->i, a->a) 91 INSN(lwz, "r%d, %d(r%d)", a->d, a->i, a->a) 92 INSN(lws, "r%d, %d(r%d)", a->d, a->i, a->a) 93 INSN(lbz, "r%d, %d(r%d)", a->d, a->i, a->a) 94 INSN(lbs, "r%d, %d(r%d)", a->d, a->i, a->a) 95 INSN(lhz, "r%d, %d(r%d)", a->d, a->i, a->a) 96 INSN(lhs, "r%d, %d(r%d)", a->d, a->i, a->a) 97 INSN(swa, "%d(r%d), r%d", a->i, a->a, a->b) 98 INSN(sw, "%d(r%d), r%d", a->i, a->a, a->b) 99 INSN(sb, "%d(r%d), r%d", a->i, a->a, a->b) 100 INSN(sh, "%d(r%d), r%d", a->i, a->a, a->b) 101 INSN(nop, "") 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