1d5cabcceSRichard Henderson /* 2d5cabcceSRichard Henderson * OpenRISC disassembler 3d5cabcceSRichard Henderson * 4d5cabcceSRichard Henderson * Copyright (c) 2018 Richard Henderson <rth@twiddle.net> 5d5cabcceSRichard Henderson * 6d5cabcceSRichard Henderson * This program is free software: you can redistribute it and/or modify 7d5cabcceSRichard Henderson * it under the terms of the GNU General Public License as published by 8d5cabcceSRichard Henderson * the Free Software Foundation, either version 2 of the License, or 9d5cabcceSRichard Henderson * (at your option) any later version. 10d5cabcceSRichard Henderson * 11d5cabcceSRichard Henderson * This program is distributed in the hope that it will be useful, 12d5cabcceSRichard Henderson * but WITHOUT ANY WARRANTY; without even the implied warranty of 13d5cabcceSRichard Henderson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14d5cabcceSRichard Henderson * GNU General Public License for more details. 15d5cabcceSRichard Henderson * 16d5cabcceSRichard Henderson * You should have received a copy of the GNU General Public License 17d5cabcceSRichard Henderson * along with this program. If not, see <http://www.gnu.org/licenses/>. 18d5cabcceSRichard Henderson */ 19d5cabcceSRichard Henderson 20d5cabcceSRichard Henderson #include "qemu/osdep.h" 213979fca4SMarkus Armbruster #include "disas/dis-asm.h" 22d5cabcceSRichard Henderson #include "qemu/bitops.h" 23d5cabcceSRichard Henderson #include "cpu.h" 24d5cabcceSRichard Henderson 25d5cabcceSRichard Henderson typedef disassemble_info DisasContext; 26d5cabcceSRichard Henderson 27d5cabcceSRichard Henderson /* Include the auto-generated decoder. */ 28d5cabcceSRichard Henderson #include "decode.inc.c" 29d5cabcceSRichard Henderson 30d5cabcceSRichard Henderson #define output(mnemonic, format, ...) \ 31d5cabcceSRichard Henderson (info->fprintf_func(info->stream, "%-9s " format, \ 32d5cabcceSRichard Henderson mnemonic, ##__VA_ARGS__)) 33d5cabcceSRichard Henderson 34d5cabcceSRichard Henderson int print_insn_or1k(bfd_vma addr, disassemble_info *info) 35d5cabcceSRichard Henderson { 36d5cabcceSRichard Henderson bfd_byte buffer[4]; 37d5cabcceSRichard Henderson uint32_t insn; 38d5cabcceSRichard Henderson int status; 39d5cabcceSRichard Henderson 40d5cabcceSRichard Henderson status = info->read_memory_func(addr, buffer, 4, info); 41d5cabcceSRichard Henderson if (status != 0) { 42d5cabcceSRichard Henderson info->memory_error_func(status, addr, info); 43d5cabcceSRichard Henderson return -1; 44d5cabcceSRichard Henderson } 45d5cabcceSRichard Henderson insn = bfd_getb32(buffer); 46d5cabcceSRichard Henderson 47d5cabcceSRichard Henderson if (!decode(info, insn)) { 48d5cabcceSRichard Henderson output(".long", "%#08x", insn); 49d5cabcceSRichard Henderson } 50d5cabcceSRichard Henderson return 4; 51d5cabcceSRichard Henderson } 52d5cabcceSRichard Henderson 53d5cabcceSRichard Henderson #define INSN(opcode, format, ...) \ 543a7be554SRichard Henderson static bool trans_l_##opcode(disassemble_info *info, arg_l_##opcode *a) \ 55d5cabcceSRichard Henderson { \ 56d5cabcceSRichard Henderson output("l." #opcode, format, ##__VA_ARGS__); \ 57d5cabcceSRichard Henderson return true; \ 58d5cabcceSRichard Henderson } 59d5cabcceSRichard Henderson 60d5cabcceSRichard Henderson INSN(add, "r%d, r%d, r%d", a->d, a->a, a->b) 61d5cabcceSRichard Henderson INSN(addc, "r%d, r%d, r%d", a->d, a->a, a->b) 62d5cabcceSRichard Henderson INSN(sub, "r%d, r%d, r%d", a->d, a->a, a->b) 63d5cabcceSRichard Henderson INSN(and, "r%d, r%d, r%d", a->d, a->a, a->b) 64d5cabcceSRichard Henderson INSN(or, "r%d, r%d, r%d", a->d, a->a, a->b) 65d5cabcceSRichard Henderson INSN(xor, "r%d, r%d, r%d", a->d, a->a, a->b) 66d5cabcceSRichard Henderson INSN(sll, "r%d, r%d, r%d", a->d, a->a, a->b) 67d5cabcceSRichard Henderson INSN(srl, "r%d, r%d, r%d", a->d, a->a, a->b) 68d5cabcceSRichard Henderson INSN(sra, "r%d, r%d, r%d", a->d, a->a, a->b) 69d5cabcceSRichard Henderson INSN(ror, "r%d, r%d, r%d", a->d, a->a, a->b) 70d5cabcceSRichard Henderson INSN(exths, "r%d, r%d", a->d, a->a) 71d5cabcceSRichard Henderson INSN(extbs, "r%d, r%d", a->d, a->a) 72d5cabcceSRichard Henderson INSN(exthz, "r%d, r%d", a->d, a->a) 73d5cabcceSRichard Henderson INSN(extbz, "r%d, r%d", a->d, a->a) 74d5cabcceSRichard Henderson INSN(cmov, "r%d, r%d, r%d", a->d, a->a, a->b) 75d5cabcceSRichard Henderson INSN(ff1, "r%d, r%d", a->d, a->a) 76d5cabcceSRichard Henderson INSN(fl1, "r%d, r%d", a->d, a->a) 77d5cabcceSRichard Henderson INSN(mul, "r%d, r%d, r%d", a->d, a->a, a->b) 78d5cabcceSRichard Henderson INSN(mulu, "r%d, r%d, r%d", a->d, a->a, a->b) 79d5cabcceSRichard Henderson INSN(div, "r%d, r%d, r%d", a->d, a->a, a->b) 80d5cabcceSRichard Henderson INSN(divu, "r%d, r%d, r%d", a->d, a->a, a->b) 81d5cabcceSRichard Henderson INSN(muld, "r%d, r%d", a->a, a->b) 82d5cabcceSRichard Henderson INSN(muldu, "r%d, r%d", a->a, a->b) 83d5cabcceSRichard Henderson INSN(j, "%d", a->n) 84d5cabcceSRichard Henderson INSN(jal, "%d", a->n) 85d5cabcceSRichard Henderson INSN(bf, "%d", a->n) 86d5cabcceSRichard Henderson INSN(bnf, "%d", a->n) 87d5cabcceSRichard Henderson INSN(jr, "r%d", a->b) 88d5cabcceSRichard Henderson INSN(jalr, "r%d", a->b) 89d5cabcceSRichard Henderson INSN(lwa, "r%d, %d(r%d)", a->d, a->i, a->a) 90d5cabcceSRichard Henderson INSN(lwz, "r%d, %d(r%d)", a->d, a->i, a->a) 91d5cabcceSRichard Henderson INSN(lws, "r%d, %d(r%d)", a->d, a->i, a->a) 92d5cabcceSRichard Henderson INSN(lbz, "r%d, %d(r%d)", a->d, a->i, a->a) 93d5cabcceSRichard Henderson INSN(lbs, "r%d, %d(r%d)", a->d, a->i, a->a) 94d5cabcceSRichard Henderson INSN(lhz, "r%d, %d(r%d)", a->d, a->i, a->a) 95d5cabcceSRichard Henderson INSN(lhs, "r%d, %d(r%d)", a->d, a->i, a->a) 96d5cabcceSRichard Henderson INSN(swa, "%d(r%d), r%d", a->i, a->a, a->b) 97d5cabcceSRichard Henderson INSN(sw, "%d(r%d), r%d", a->i, a->a, a->b) 98d5cabcceSRichard Henderson INSN(sb, "%d(r%d), r%d", a->i, a->a, a->b) 99d5cabcceSRichard Henderson INSN(sh, "%d(r%d), r%d", a->i, a->a, a->b) 100d5cabcceSRichard Henderson INSN(nop, "") 101d5cabcceSRichard Henderson INSN(addi, "r%d, r%d, %d", a->d, a->a, a->i) 102d5cabcceSRichard Henderson INSN(addic, "r%d, r%d, %d", a->d, a->a, a->i) 103d5cabcceSRichard Henderson INSN(muli, "r%d, r%d, %d", a->d, a->a, a->i) 104d5cabcceSRichard Henderson INSN(maci, "r%d, %d", a->a, a->i) 105d5cabcceSRichard Henderson INSN(andi, "r%d, r%d, %d", a->d, a->a, a->k) 106d5cabcceSRichard Henderson INSN(ori, "r%d, r%d, %d", a->d, a->a, a->k) 107d5cabcceSRichard Henderson INSN(xori, "r%d, r%d, %d", a->d, a->a, a->i) 108d5cabcceSRichard Henderson INSN(mfspr, "r%d, r%d, %d", a->d, a->a, a->k) 109d5cabcceSRichard Henderson INSN(mtspr, "r%d, r%d, %d", a->a, a->b, a->k) 110d5cabcceSRichard Henderson INSN(mac, "r%d, r%d", a->a, a->b) 111d5cabcceSRichard Henderson INSN(msb, "r%d, r%d", a->a, a->b) 112d5cabcceSRichard Henderson INSN(macu, "r%d, r%d", a->a, a->b) 113d5cabcceSRichard Henderson INSN(msbu, "r%d, r%d", a->a, a->b) 114d5cabcceSRichard Henderson INSN(slli, "r%d, r%d, %d", a->d, a->a, a->l) 115d5cabcceSRichard Henderson INSN(srli, "r%d, r%d, %d", a->d, a->a, a->l) 116d5cabcceSRichard Henderson INSN(srai, "r%d, r%d, %d", a->d, a->a, a->l) 117d5cabcceSRichard Henderson INSN(rori, "r%d, r%d, %d", a->d, a->a, a->l) 118d5cabcceSRichard Henderson INSN(movhi, "r%d, %d", a->d, a->k) 119d5cabcceSRichard Henderson INSN(macrc, "r%d", a->d) 120d5cabcceSRichard Henderson INSN(sfeq, "r%d, r%d", a->a, a->b) 121d5cabcceSRichard Henderson INSN(sfne, "r%d, r%d", a->a, a->b) 122d5cabcceSRichard Henderson INSN(sfgtu, "r%d, r%d", a->a, a->b) 123d5cabcceSRichard Henderson INSN(sfgeu, "r%d, r%d", a->a, a->b) 124d5cabcceSRichard Henderson INSN(sfltu, "r%d, r%d", a->a, a->b) 125d5cabcceSRichard Henderson INSN(sfleu, "r%d, r%d", a->a, a->b) 126d5cabcceSRichard Henderson INSN(sfgts, "r%d, r%d", a->a, a->b) 127d5cabcceSRichard Henderson INSN(sfges, "r%d, r%d", a->a, a->b) 128d5cabcceSRichard Henderson INSN(sflts, "r%d, r%d", a->a, a->b) 129d5cabcceSRichard Henderson INSN(sfles, "r%d, r%d", a->a, a->b) 130d5cabcceSRichard Henderson INSN(sfeqi, "r%d, %d", a->a, a->i) 131d5cabcceSRichard Henderson INSN(sfnei, "r%d, %d", a->a, a->i) 132d5cabcceSRichard Henderson INSN(sfgtui, "r%d, %d", a->a, a->i) 133d5cabcceSRichard Henderson INSN(sfgeui, "r%d, %d", a->a, a->i) 134d5cabcceSRichard Henderson INSN(sfltui, "r%d, %d", a->a, a->i) 135d5cabcceSRichard Henderson INSN(sfleui, "r%d, %d", a->a, a->i) 136d5cabcceSRichard Henderson INSN(sfgtsi, "r%d, %d", a->a, a->i) 137d5cabcceSRichard Henderson INSN(sfgesi, "r%d, %d", a->a, a->i) 138d5cabcceSRichard Henderson INSN(sfltsi, "r%d, %d", a->a, a->i) 139d5cabcceSRichard Henderson INSN(sflesi, "r%d, %d", a->a, a->i) 140d5cabcceSRichard Henderson INSN(sys, "%d", a->k) 141d5cabcceSRichard Henderson INSN(trap, "%d", a->k) 142d5cabcceSRichard Henderson INSN(msync, "") 143d5cabcceSRichard Henderson INSN(psync, "") 144d5cabcceSRichard Henderson INSN(csync, "") 145d5cabcceSRichard Henderson INSN(rfe, "") 146d5cabcceSRichard Henderson 147d5cabcceSRichard Henderson #define FP_INSN(opcode, suffix, format, ...) \ 148d5cabcceSRichard Henderson static bool trans_lf_##opcode##_##suffix(disassemble_info *info, \ 1493a7be554SRichard Henderson arg_lf_##opcode##_##suffix *a) \ 150d5cabcceSRichard Henderson { \ 151d5cabcceSRichard Henderson output("lf." #opcode "." #suffix, format, ##__VA_ARGS__); \ 152d5cabcceSRichard Henderson return true; \ 153d5cabcceSRichard Henderson } 154d5cabcceSRichard Henderson 155d5cabcceSRichard Henderson FP_INSN(add, s, "r%d, r%d, r%d", a->d, a->a, a->b) 156d5cabcceSRichard Henderson FP_INSN(sub, s, "r%d, r%d, r%d", a->d, a->a, a->b) 157d5cabcceSRichard Henderson FP_INSN(mul, s, "r%d, r%d, r%d", a->d, a->a, a->b) 158d5cabcceSRichard Henderson FP_INSN(div, s, "r%d, r%d, r%d", a->d, a->a, a->b) 159d5cabcceSRichard Henderson FP_INSN(rem, s, "r%d, r%d, r%d", a->d, a->a, a->b) 160d5cabcceSRichard Henderson FP_INSN(itof, s, "r%d, r%d", a->d, a->a) 161d5cabcceSRichard Henderson FP_INSN(ftoi, s, "r%d, r%d", a->d, a->a) 162d5cabcceSRichard Henderson FP_INSN(madd, s, "r%d, r%d, r%d", a->d, a->a, a->b) 163d5cabcceSRichard Henderson FP_INSN(sfeq, s, "r%d, r%d", a->a, a->b) 164d5cabcceSRichard Henderson FP_INSN(sfne, s, "r%d, r%d", a->a, a->b) 165d5cabcceSRichard Henderson FP_INSN(sfgt, s, "r%d, r%d", a->a, a->b) 166d5cabcceSRichard Henderson FP_INSN(sfge, s, "r%d, r%d", a->a, a->b) 167d5cabcceSRichard Henderson FP_INSN(sflt, s, "r%d, r%d", a->a, a->b) 168d5cabcceSRichard Henderson FP_INSN(sfle, s, "r%d, r%d", a->a, a->b) 169*62f2b038SRichard Henderson 170*62f2b038SRichard Henderson FP_INSN(add, d, "r%d,r%d, r%d,r%d, r%d,r%d", 171*62f2b038SRichard Henderson a->d, a->d + a->dp + 1, 172*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 173*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 174*62f2b038SRichard Henderson FP_INSN(sub, d, "r%d,r%d, r%d,r%d, r%d,r%d", 175*62f2b038SRichard Henderson a->d, a->d + a->dp + 1, 176*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 177*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 178*62f2b038SRichard Henderson FP_INSN(mul, d, "r%d,r%d, r%d,r%d, r%d,r%d", 179*62f2b038SRichard Henderson a->d, a->d + a->dp + 1, 180*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 181*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 182*62f2b038SRichard Henderson FP_INSN(div, d, "r%d,r%d, r%d,r%d, r%d,r%d", 183*62f2b038SRichard Henderson a->d, a->d + a->dp + 1, 184*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 185*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 186*62f2b038SRichard Henderson FP_INSN(rem, d, "r%d,r%d, r%d,r%d, r%d,r%d", 187*62f2b038SRichard Henderson a->d, a->d + a->dp + 1, 188*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 189*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 190*62f2b038SRichard Henderson FP_INSN(madd, d, "r%d,r%d, r%d,r%d, r%d,r%d", 191*62f2b038SRichard Henderson a->d, a->d + a->dp + 1, 192*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 193*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 194*62f2b038SRichard Henderson 195*62f2b038SRichard Henderson FP_INSN(itof, d, "r%d,r%d, r%d,r%d", 196*62f2b038SRichard Henderson a->d, a->d + a->dp + 1, 197*62f2b038SRichard Henderson a->a, a->a + a->ap + 1) 198*62f2b038SRichard Henderson FP_INSN(ftoi, d, "r%d,r%d, r%d,r%d", 199*62f2b038SRichard Henderson a->d, a->d + a->dp + 1, 200*62f2b038SRichard Henderson a->a, a->a + a->ap + 1) 201*62f2b038SRichard Henderson 202*62f2b038SRichard Henderson FP_INSN(stod, d, "r%d,r%d, r%d", 203*62f2b038SRichard Henderson a->d, a->d + a->dp + 1, a->a) 204*62f2b038SRichard Henderson FP_INSN(dtos, d, "r%d r%d,r%d", 205*62f2b038SRichard Henderson a->d, a->a, a->a + a->ap + 1) 206*62f2b038SRichard Henderson 207*62f2b038SRichard Henderson FP_INSN(sfeq, d, "r%d,r%d, r%d,r%d", 208*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 209*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 210*62f2b038SRichard Henderson FP_INSN(sfne, d, "r%d,r%d, r%d,r%d", 211*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 212*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 213*62f2b038SRichard Henderson FP_INSN(sfgt, d, "r%d,r%d, r%d,r%d", 214*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 215*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 216*62f2b038SRichard Henderson FP_INSN(sfge, d, "r%d,r%d, r%d,r%d", 217*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 218*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 219*62f2b038SRichard Henderson FP_INSN(sflt, d, "r%d,r%d, r%d,r%d", 220*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 221*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 222*62f2b038SRichard Henderson FP_INSN(sfle, d, "r%d,r%d, r%d,r%d", 223*62f2b038SRichard Henderson a->a, a->a + a->ap + 1, 224*62f2b038SRichard Henderson a->b, a->b + a->bp + 1) 225