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 FP_INSN(sfun, s, "r%d, r%d", a->a, a->b) 170 FP_INSN(sfueq, s, "r%d, r%d", a->a, a->b) 171 FP_INSN(sfuge, s, "r%d, r%d", a->a, a->b) 172 FP_INSN(sfugt, s, "r%d, r%d", a->a, a->b) 173 FP_INSN(sfule, s, "r%d, r%d", a->a, a->b) 174 FP_INSN(sfult, s, "r%d, r%d", a->a, a->b) 175 176 FP_INSN(add, d, "r%d,r%d, r%d,r%d, r%d,r%d", 177 a->d, a->d + a->dp + 1, 178 a->a, a->a + a->ap + 1, 179 a->b, a->b + a->bp + 1) 180 FP_INSN(sub, d, "r%d,r%d, r%d,r%d, r%d,r%d", 181 a->d, a->d + a->dp + 1, 182 a->a, a->a + a->ap + 1, 183 a->b, a->b + a->bp + 1) 184 FP_INSN(mul, d, "r%d,r%d, r%d,r%d, r%d,r%d", 185 a->d, a->d + a->dp + 1, 186 a->a, a->a + a->ap + 1, 187 a->b, a->b + a->bp + 1) 188 FP_INSN(div, d, "r%d,r%d, r%d,r%d, r%d,r%d", 189 a->d, a->d + a->dp + 1, 190 a->a, a->a + a->ap + 1, 191 a->b, a->b + a->bp + 1) 192 FP_INSN(rem, d, "r%d,r%d, r%d,r%d, r%d,r%d", 193 a->d, a->d + a->dp + 1, 194 a->a, a->a + a->ap + 1, 195 a->b, a->b + a->bp + 1) 196 FP_INSN(madd, d, "r%d,r%d, r%d,r%d, r%d,r%d", 197 a->d, a->d + a->dp + 1, 198 a->a, a->a + a->ap + 1, 199 a->b, a->b + a->bp + 1) 200 201 FP_INSN(itof, d, "r%d,r%d, r%d,r%d", 202 a->d, a->d + a->dp + 1, 203 a->a, a->a + a->ap + 1) 204 FP_INSN(ftoi, d, "r%d,r%d, r%d,r%d", 205 a->d, a->d + a->dp + 1, 206 a->a, a->a + a->ap + 1) 207 208 FP_INSN(stod, d, "r%d,r%d, r%d", 209 a->d, a->d + a->dp + 1, a->a) 210 FP_INSN(dtos, d, "r%d r%d,r%d", 211 a->d, a->a, a->a + a->ap + 1) 212 213 FP_INSN(sfeq, 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(sfne, 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(sfgt, 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(sfge, 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 FP_INSN(sflt, d, "r%d,r%d, r%d,r%d", 226 a->a, a->a + a->ap + 1, 227 a->b, a->b + a->bp + 1) 228 FP_INSN(sfle, d, "r%d,r%d, r%d,r%d", 229 a->a, a->a + a->ap + 1, 230 a->b, a->b + a->bp + 1) 231 FP_INSN(sfun, d, "r%d,r%d, r%d,r%d", 232 a->a, a->a + a->ap + 1, 233 a->b, a->b + a->bp + 1) 234 FP_INSN(sfueq, d, "r%d,r%d, r%d,r%d", 235 a->a, a->a + a->ap + 1, 236 a->b, a->b + a->bp + 1) 237 FP_INSN(sfuge, d, "r%d,r%d, r%d,r%d", 238 a->a, a->a + a->ap + 1, 239 a->b, a->b + a->bp + 1) 240 FP_INSN(sfugt, d, "r%d,r%d, r%d,r%d", 241 a->a, a->a + a->ap + 1, 242 a->b, a->b + a->bp + 1) 243 FP_INSN(sfule, d, "r%d,r%d, r%d,r%d", 244 a->a, a->a + a->ap + 1, 245 a->b, a->b + a->bp + 1) 246 FP_INSN(sfult, d, "r%d,r%d, r%d,r%d", 247 a->a, a->a + a->ap + 1, 248 a->b, a->b + a->bp + 1) 249