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