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.inc.c" 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(addi, "r%d, r%d, %d", a->d, a->a, a->i) 102 INSN(addic, "r%d, r%d, %d", a->d, a->a, a->i) 103 INSN(muli, "r%d, r%d, %d", a->d, a->a, a->i) 104 INSN(maci, "r%d, %d", a->a, a->i) 105 INSN(andi, "r%d, r%d, %d", a->d, a->a, a->k) 106 INSN(ori, "r%d, r%d, %d", a->d, a->a, a->k) 107 INSN(xori, "r%d, r%d, %d", a->d, a->a, a->i) 108 INSN(mfspr, "r%d, r%d, %d", a->d, a->a, a->k) 109 INSN(mtspr, "r%d, r%d, %d", a->a, a->b, a->k) 110 INSN(mac, "r%d, r%d", a->a, a->b) 111 INSN(msb, "r%d, r%d", a->a, a->b) 112 INSN(macu, "r%d, r%d", a->a, a->b) 113 INSN(msbu, "r%d, r%d", a->a, a->b) 114 INSN(slli, "r%d, r%d, %d", a->d, a->a, a->l) 115 INSN(srli, "r%d, r%d, %d", a->d, a->a, a->l) 116 INSN(srai, "r%d, r%d, %d", a->d, a->a, a->l) 117 INSN(rori, "r%d, r%d, %d", a->d, a->a, a->l) 118 INSN(movhi, "r%d, %d", a->d, a->k) 119 INSN(macrc, "r%d", a->d) 120 INSN(sfeq, "r%d, r%d", a->a, a->b) 121 INSN(sfne, "r%d, r%d", a->a, a->b) 122 INSN(sfgtu, "r%d, r%d", a->a, a->b) 123 INSN(sfgeu, "r%d, r%d", a->a, a->b) 124 INSN(sfltu, "r%d, r%d", a->a, a->b) 125 INSN(sfleu, "r%d, r%d", a->a, a->b) 126 INSN(sfgts, "r%d, r%d", a->a, a->b) 127 INSN(sfges, "r%d, r%d", a->a, a->b) 128 INSN(sflts, "r%d, r%d", a->a, a->b) 129 INSN(sfles, "r%d, r%d", a->a, a->b) 130 INSN(sfeqi, "r%d, %d", a->a, a->i) 131 INSN(sfnei, "r%d, %d", a->a, a->i) 132 INSN(sfgtui, "r%d, %d", a->a, a->i) 133 INSN(sfgeui, "r%d, %d", a->a, a->i) 134 INSN(sfltui, "r%d, %d", a->a, a->i) 135 INSN(sfleui, "r%d, %d", a->a, a->i) 136 INSN(sfgtsi, "r%d, %d", a->a, a->i) 137 INSN(sfgesi, "r%d, %d", a->a, a->i) 138 INSN(sfltsi, "r%d, %d", a->a, a->i) 139 INSN(sflesi, "r%d, %d", a->a, a->i) 140 INSN(sys, "%d", a->k) 141 INSN(trap, "%d", a->k) 142 INSN(msync, "") 143 INSN(psync, "") 144 INSN(csync, "") 145 INSN(rfe, "") 146 147 #define FP_INSN(opcode, suffix, format, ...) \ 148 static 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 155 FP_INSN(add, s, "r%d, r%d, r%d", a->d, a->a, a->b) 156 FP_INSN(sub, s, "r%d, r%d, r%d", a->d, a->a, a->b) 157 FP_INSN(mul, s, "r%d, r%d, r%d", a->d, a->a, a->b) 158 FP_INSN(div, s, "r%d, r%d, r%d", a->d, a->a, a->b) 159 FP_INSN(rem, s, "r%d, r%d, r%d", a->d, a->a, a->b) 160 FP_INSN(itof, s, "r%d, r%d", a->d, a->a) 161 FP_INSN(ftoi, s, "r%d, r%d", a->d, a->a) 162 FP_INSN(madd, s, "r%d, r%d, r%d", a->d, a->a, a->b) 163 FP_INSN(sfeq, s, "r%d, r%d", a->a, a->b) 164 FP_INSN(sfne, s, "r%d, r%d", a->a, a->b) 165 FP_INSN(sfgt, s, "r%d, r%d", a->a, a->b) 166 FP_INSN(sfge, s, "r%d, r%d", a->a, a->b) 167 FP_INSN(sflt, s, "r%d, r%d", a->a, a->b) 168 FP_INSN(sfle, s, "r%d, r%d", a->a, a->b) 169 170 FP_INSN(add, d, "r%d,r%d, r%d,r%d, r%d,r%d", 171 a->d, a->d + a->dp + 1, 172 a->a, a->a + a->ap + 1, 173 a->b, a->b + a->bp + 1) 174 FP_INSN(sub, d, "r%d,r%d, r%d,r%d, r%d,r%d", 175 a->d, a->d + a->dp + 1, 176 a->a, a->a + a->ap + 1, 177 a->b, a->b + a->bp + 1) 178 FP_INSN(mul, d, "r%d,r%d, r%d,r%d, r%d,r%d", 179 a->d, a->d + a->dp + 1, 180 a->a, a->a + a->ap + 1, 181 a->b, a->b + a->bp + 1) 182 FP_INSN(div, d, "r%d,r%d, r%d,r%d, r%d,r%d", 183 a->d, a->d + a->dp + 1, 184 a->a, a->a + a->ap + 1, 185 a->b, a->b + a->bp + 1) 186 FP_INSN(rem, d, "r%d,r%d, r%d,r%d, r%d,r%d", 187 a->d, a->d + a->dp + 1, 188 a->a, a->a + a->ap + 1, 189 a->b, a->b + a->bp + 1) 190 FP_INSN(madd, d, "r%d,r%d, r%d,r%d, r%d,r%d", 191 a->d, a->d + a->dp + 1, 192 a->a, a->a + a->ap + 1, 193 a->b, a->b + a->bp + 1) 194 195 FP_INSN(itof, d, "r%d,r%d, r%d,r%d", 196 a->d, a->d + a->dp + 1, 197 a->a, a->a + a->ap + 1) 198 FP_INSN(ftoi, d, "r%d,r%d, r%d,r%d", 199 a->d, a->d + a->dp + 1, 200 a->a, a->a + a->ap + 1) 201 202 FP_INSN(stod, d, "r%d,r%d, r%d", 203 a->d, a->d + a->dp + 1, a->a) 204 FP_INSN(dtos, d, "r%d r%d,r%d", 205 a->d, a->a, a->a + a->ap + 1) 206 207 FP_INSN(sfeq, d, "r%d,r%d, r%d,r%d", 208 a->a, a->a + a->ap + 1, 209 a->b, a->b + a->bp + 1) 210 FP_INSN(sfne, d, "r%d,r%d, r%d,r%d", 211 a->a, a->a + a->ap + 1, 212 a->b, a->b + a->bp + 1) 213 FP_INSN(sfgt, d, "r%d,r%d, r%d,r%d", 214 a->a, a->a + a->ap + 1, 215 a->b, a->b + a->bp + 1) 216 FP_INSN(sfge, d, "r%d,r%d, r%d,r%d", 217 a->a, a->a + a->ap + 1, 218 a->b, a->b + a->bp + 1) 219 FP_INSN(sflt, d, "r%d,r%d, r%d,r%d", 220 a->a, a->a + a->ap + 1, 221 a->b, a->b + a->bp + 1) 222 FP_INSN(sfle, d, "r%d,r%d, r%d,r%d", 223 a->a, a->a + a->ap + 1, 224 a->b, a->b + a->bp + 1) 225