disas.c (9029B)
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 25typedef disassemble_info DisasContext; 26 27/* Include the auto-generated decoder. */ 28#include "decode-insns.c.inc" 29 30#define output(mnemonic, format, ...) \ 31 (info->fprintf_func(info->stream, "%-9s " format, \ 32 mnemonic, ##__VA_ARGS__)) 33 34int 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, ...) \ 54static bool trans_l_##opcode(disassemble_info *info, arg_l_##opcode *a) \ 55{ \ 56 output("l." #opcode, format, ##__VA_ARGS__); \ 57 return true; \ 58} 59 60INSN(add, "r%d, r%d, r%d", a->d, a->a, a->b) 61INSN(addc, "r%d, r%d, r%d", a->d, a->a, a->b) 62INSN(sub, "r%d, r%d, r%d", a->d, a->a, a->b) 63INSN(and, "r%d, r%d, r%d", a->d, a->a, a->b) 64INSN(or, "r%d, r%d, r%d", a->d, a->a, a->b) 65INSN(xor, "r%d, r%d, r%d", a->d, a->a, a->b) 66INSN(sll, "r%d, r%d, r%d", a->d, a->a, a->b) 67INSN(srl, "r%d, r%d, r%d", a->d, a->a, a->b) 68INSN(sra, "r%d, r%d, r%d", a->d, a->a, a->b) 69INSN(ror, "r%d, r%d, r%d", a->d, a->a, a->b) 70INSN(exths, "r%d, r%d", a->d, a->a) 71INSN(extbs, "r%d, r%d", a->d, a->a) 72INSN(exthz, "r%d, r%d", a->d, a->a) 73INSN(extbz, "r%d, r%d", a->d, a->a) 74INSN(cmov, "r%d, r%d, r%d", a->d, a->a, a->b) 75INSN(ff1, "r%d, r%d", a->d, a->a) 76INSN(fl1, "r%d, r%d", a->d, a->a) 77INSN(mul, "r%d, r%d, r%d", a->d, a->a, a->b) 78INSN(mulu, "r%d, r%d, r%d", a->d, a->a, a->b) 79INSN(div, "r%d, r%d, r%d", a->d, a->a, a->b) 80INSN(divu, "r%d, r%d, r%d", a->d, a->a, a->b) 81INSN(muld, "r%d, r%d", a->a, a->b) 82INSN(muldu, "r%d, r%d", a->a, a->b) 83INSN(j, "%d", a->n) 84INSN(jal, "%d", a->n) 85INSN(bf, "%d", a->n) 86INSN(bnf, "%d", a->n) 87INSN(jr, "r%d", a->b) 88INSN(jalr, "r%d", a->b) 89INSN(lwa, "r%d, %d(r%d)", a->d, a->i, a->a) 90INSN(lwz, "r%d, %d(r%d)", a->d, a->i, a->a) 91INSN(lws, "r%d, %d(r%d)", a->d, a->i, a->a) 92INSN(lbz, "r%d, %d(r%d)", a->d, a->i, a->a) 93INSN(lbs, "r%d, %d(r%d)", a->d, a->i, a->a) 94INSN(lhz, "r%d, %d(r%d)", a->d, a->i, a->a) 95INSN(lhs, "r%d, %d(r%d)", a->d, a->i, a->a) 96INSN(swa, "%d(r%d), r%d", a->i, a->a, a->b) 97INSN(sw, "%d(r%d), r%d", a->i, a->a, a->b) 98INSN(sb, "%d(r%d), r%d", a->i, a->a, a->b) 99INSN(sh, "%d(r%d), r%d", a->i, a->a, a->b) 100INSN(nop, "") 101INSN(adrp, "r%d, %d", a->d, a->i) 102INSN(addi, "r%d, r%d, %d", a->d, a->a, a->i) 103INSN(addic, "r%d, r%d, %d", a->d, a->a, a->i) 104INSN(muli, "r%d, r%d, %d", a->d, a->a, a->i) 105INSN(maci, "r%d, %d", a->a, a->i) 106INSN(andi, "r%d, r%d, %d", a->d, a->a, a->k) 107INSN(ori, "r%d, r%d, %d", a->d, a->a, a->k) 108INSN(xori, "r%d, r%d, %d", a->d, a->a, a->i) 109INSN(mfspr, "r%d, r%d, %d", a->d, a->a, a->k) 110INSN(mtspr, "r%d, r%d, %d", a->a, a->b, a->k) 111INSN(mac, "r%d, r%d", a->a, a->b) 112INSN(msb, "r%d, r%d", a->a, a->b) 113INSN(macu, "r%d, r%d", a->a, a->b) 114INSN(msbu, "r%d, r%d", a->a, a->b) 115INSN(slli, "r%d, r%d, %d", a->d, a->a, a->l) 116INSN(srli, "r%d, r%d, %d", a->d, a->a, a->l) 117INSN(srai, "r%d, r%d, %d", a->d, a->a, a->l) 118INSN(rori, "r%d, r%d, %d", a->d, a->a, a->l) 119INSN(movhi, "r%d, %d", a->d, a->k) 120INSN(macrc, "r%d", a->d) 121INSN(sfeq, "r%d, r%d", a->a, a->b) 122INSN(sfne, "r%d, r%d", a->a, a->b) 123INSN(sfgtu, "r%d, r%d", a->a, a->b) 124INSN(sfgeu, "r%d, r%d", a->a, a->b) 125INSN(sfltu, "r%d, r%d", a->a, a->b) 126INSN(sfleu, "r%d, r%d", a->a, a->b) 127INSN(sfgts, "r%d, r%d", a->a, a->b) 128INSN(sfges, "r%d, r%d", a->a, a->b) 129INSN(sflts, "r%d, r%d", a->a, a->b) 130INSN(sfles, "r%d, r%d", a->a, a->b) 131INSN(sfeqi, "r%d, %d", a->a, a->i) 132INSN(sfnei, "r%d, %d", a->a, a->i) 133INSN(sfgtui, "r%d, %d", a->a, a->i) 134INSN(sfgeui, "r%d, %d", a->a, a->i) 135INSN(sfltui, "r%d, %d", a->a, a->i) 136INSN(sfleui, "r%d, %d", a->a, a->i) 137INSN(sfgtsi, "r%d, %d", a->a, a->i) 138INSN(sfgesi, "r%d, %d", a->a, a->i) 139INSN(sfltsi, "r%d, %d", a->a, a->i) 140INSN(sflesi, "r%d, %d", a->a, a->i) 141INSN(sys, "%d", a->k) 142INSN(trap, "%d", a->k) 143INSN(msync, "") 144INSN(psync, "") 145INSN(csync, "") 146INSN(rfe, "") 147 148#define FP_INSN(opcode, suffix, format, ...) \ 149static 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 156FP_INSN(add, s, "r%d, r%d, r%d", a->d, a->a, a->b) 157FP_INSN(sub, s, "r%d, r%d, r%d", a->d, a->a, a->b) 158FP_INSN(mul, s, "r%d, r%d, r%d", a->d, a->a, a->b) 159FP_INSN(div, s, "r%d, r%d, r%d", a->d, a->a, a->b) 160FP_INSN(rem, s, "r%d, r%d, r%d", a->d, a->a, a->b) 161FP_INSN(itof, s, "r%d, r%d", a->d, a->a) 162FP_INSN(ftoi, s, "r%d, r%d", a->d, a->a) 163FP_INSN(madd, s, "r%d, r%d, r%d", a->d, a->a, a->b) 164FP_INSN(sfeq, s, "r%d, r%d", a->a, a->b) 165FP_INSN(sfne, s, "r%d, r%d", a->a, a->b) 166FP_INSN(sfgt, s, "r%d, r%d", a->a, a->b) 167FP_INSN(sfge, s, "r%d, r%d", a->a, a->b) 168FP_INSN(sflt, s, "r%d, r%d", a->a, a->b) 169FP_INSN(sfle, s, "r%d, r%d", a->a, a->b) 170FP_INSN(sfun, s, "r%d, r%d", a->a, a->b) 171FP_INSN(sfueq, s, "r%d, r%d", a->a, a->b) 172FP_INSN(sfuge, s, "r%d, r%d", a->a, a->b) 173FP_INSN(sfugt, s, "r%d, r%d", a->a, a->b) 174FP_INSN(sfule, s, "r%d, r%d", a->a, a->b) 175FP_INSN(sfult, s, "r%d, r%d", a->a, a->b) 176 177FP_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) 181FP_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) 185FP_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) 189FP_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) 193FP_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) 197FP_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 202FP_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) 205FP_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 209FP_INSN(stod, d, "r%d,r%d, r%d", 210 a->d, a->d + a->dp + 1, a->a) 211FP_INSN(dtos, d, "r%d r%d,r%d", 212 a->d, a->a, a->a + a->ap + 1) 213 214FP_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) 217FP_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) 220FP_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) 223FP_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) 226FP_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) 229FP_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) 232FP_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) 235FP_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) 238FP_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) 241FP_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) 244FP_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) 247FP_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)