summaryrefslogtreecommitdiff
path: root/sim/microblaze/microblaze.isa
diff options
context:
space:
mode:
Diffstat (limited to 'sim/microblaze/microblaze.isa')
-rw-r--r--sim/microblaze/microblaze.isa823
1 files changed, 823 insertions, 0 deletions
diff --git a/sim/microblaze/microblaze.isa b/sim/microblaze/microblaze.isa
new file mode 100644
index 00000000000..d1369b2eaf6
--- /dev/null
+++ b/sim/microblaze/microblaze.isa
@@ -0,0 +1,823 @@
+/* Copyright 2009 Free Software Foundation, Inc.
+
+ This file is part of the Xilinx MicroBlaze simulator.
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
+/*
+ * MICROBLAZE Instruction Set Architecture
+ *
+ * INSTRUCTION(NAME,
+ * OPCODE,
+ * TYPE,
+ * SEMANTICS)
+ *
+ */
+
+INSTRUCTION(add,
+ 0x00,
+ INST_TYPE_RD_RA_RB,
+ CARRY = C_calc(RA, RB, 0);
+ RD = RA + RB;
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(rsub,
+ 0x01,
+ INST_TYPE_RD_RA_RB,
+ CARRY = C_calc(RB, ~RA, 1);
+ RD = RB + ~RA + 1;
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(addc,
+ 0x02,
+ INST_TYPE_RD_RA_RB,
+ CARRY = C_calc(RA, RB, C_rd);
+ RD = RA + RB + C_rd;
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(rsubc,
+ 0x03,
+ INST_TYPE_RD_RA_RB,
+ CARRY = C_calc(RB, ~RA, C_rd);
+ RD = RB + ~RA + C_rd;
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(addk,
+ 0x04,
+ INST_TYPE_RD_RA_RB,
+ RD = RA + RB;
+ PC += INST_SIZE)
+
+INSTRUCTION(rsubk,
+ 0x05,
+ INST_TYPE_RD_RA_RB,
+ RD = RB + ~RA + 1;
+ PC += INST_SIZE)
+
+INSTRUCTION(cmp,
+ 0x05,
+ INST_TYPE_RD_RA_RB,
+ {
+ int tmp_reg = RB + ~RA + 1;
+ if ((RB & 0x80000000) ^ (RA & 0x80000000)) {
+ tmp_reg = ((tmp_reg & 0x7fffffff) | (RB & 0x80000000));
+ }
+ RD = tmp_reg;
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(cmpu,
+ 0x05,
+ INST_TYPE_RD_RA_RB,
+ {
+ int tmp_reg = RB + ~RA + 1;
+ if ((RB & 0x80000000) ^ (RA & 0x80000000)) {
+ tmp_reg = ((tmp_reg & 0x7fffffff) | (RA & 0x80000000));
+ }
+ RD = tmp_reg;
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(addkc,
+ 0x06,
+ INST_TYPE_RD_RA_RB,
+ RD = RA + RB + C_rd;
+ PC += INST_SIZE)
+
+INSTRUCTION(rsubkc,
+ 0x07,
+ INST_TYPE_RD_RA_RB,
+ RD = RB + ~RA + C_rd;
+ PC += INST_SIZE)
+
+INSTRUCTION(addi,
+ 0x08,
+ INST_TYPE_RD_RA_IMM,
+ CARRY = C_calc(RA, IMM, 0);
+ RD = RA + IMM;
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(rsubi,
+ 0x09,
+ INST_TYPE_RD_RA_IMM,
+ CARRY = C_calc(IMM, ~RA, 1);
+ RD = IMM + ~RA + 1;
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(addic,
+ 0x0A,
+ INST_TYPE_RD_RA_IMM,
+ CARRY = C_calc(RA, IMM, C_rd);
+ RD = RA + IMM + C_rd;
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(rsubic,
+ 0x0B,
+ INST_TYPE_RD_RA_IMM,
+ CARRY = C_calc(IMM, ~RA, C_rd);
+ RD = IMM + ~RA + C_rd;
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(addik,
+ 0x0C,
+ INST_TYPE_RD_RA_IMM,
+ RD = RA + IMM;
+ PC += INST_SIZE)
+
+INSTRUCTION(rsubik,
+ 0x0D,
+ INST_TYPE_RD_RA_IMM,
+ RD = IMM + ~RA + 1;
+ PC += INST_SIZE)
+
+INSTRUCTION(addikc,
+ 0x0E,
+ INST_TYPE_RD_RA_IMM,
+ RD = RA + IMM + C_rd;
+ PC += INST_SIZE)
+
+INSTRUCTION(rsubikc,
+ 0x0F,
+ INST_TYPE_RD_RA_IMM,
+ RD = IMM + ~RA + C_rd;
+ PC += INST_SIZE)
+
+INSTRUCTION(mul,
+ 0x10,
+ INST_TYPE_RD_RA_RB,
+ RD = RA * RB;
+ PC += INST_SIZE)
+
+INSTRUCTION(bsrl,
+ 0x11,
+ INST_TYPE_RD_RA_RB,
+ RD = (uword)RA >> RB;
+ PC += INST_SIZE)
+
+INSTRUCTION(bsra,
+ 0x11,
+ INST_TYPE_RD_RA_RB,
+ RD = (word)RA >> RB;
+ PC += INST_SIZE)
+
+INSTRUCTION(bsll,
+ 0x11,
+ INST_TYPE_RD_RA_RB,
+ RD = (uword)RA << RB;
+ PC += INST_SIZE)
+
+INSTRUCTION(idiv,
+ 0x12,
+ INST_TYPE_RD_RA_RB,
+ RD = (word) RB / (word) RA;
+ PC += INST_SIZE)
+
+INSTRUCTION(idivu,
+ 0x12,
+ INST_TYPE_RD_RA_RB,
+ RD = (uword) RB / (uword) RA;
+ PC += INST_SIZE)
+
+INSTRUCTION(muli,
+ 0x18,
+ INST_TYPE_RD_RA_IMM,
+ RD = RA * IMM;
+ PC += INST_SIZE)
+
+INSTRUCTION(bsrli,
+ 0x19,
+ INST_TYPE_RD_RA_IMM5,
+ RD = (uword)RA >> (IMM & 0x1F);
+ PC += INST_SIZE)
+
+INSTRUCTION(bsrai,
+ 0x19,
+ INST_TYPE_RD_RA_IMM5,
+ RD = (word)RA >> (IMM & 0x1F);
+ PC += INST_SIZE)
+
+INSTRUCTION(bslli,
+ 0x19,
+ INST_TYPE_RD_RA_IMM5,
+ RD = (uword)RA << (IMM & 0x1F);
+ PC += INST_SIZE)
+
+INSTRUCTION(get,
+ 0x1b,
+ INST_TYPE_RD_IMM12,
+ PC += INST_SIZE)
+
+INSTRUCTION(put,
+ 0x1b,
+ INST_TYPE_R1_IMM12,
+ PC += INST_SIZE)
+
+INSTRUCTION(nget,
+ 0x1b,
+ INST_TYPE_RD_IMM12,
+ PC += INST_SIZE)
+
+INSTRUCTION(nput,
+ 0x1b,
+ INST_TYPE_R1_IMM12,
+ PC += INST_SIZE)
+
+INSTRUCTION(cget,
+ 0x1b,
+ INST_TYPE_RD_IMM12,
+ PC += INST_SIZE)
+
+INSTRUCTION(cput,
+ 0x1b,
+ INST_TYPE_R1_IMM12,
+ PC += INST_SIZE)
+
+INSTRUCTION(ncget,
+ 0x1b,
+ INST_TYPE_RD_IMM12,
+ PC += INST_SIZE)
+
+INSTRUCTION(ncput,
+ 0x1b,
+ INST_TYPE_R1_IMM12,
+ PC += INST_SIZE)
+
+INSTRUCTION(or,
+ 0x20,
+ INST_TYPE_RD_RA_RB,
+ RD = RA | RB;
+ PC += INST_SIZE)
+
+INSTRUCTION(and,
+ 0x21,
+ INST_TYPE_RD_RA_RB,
+ RD = RA & RB;
+ PC += INST_SIZE)
+
+INSTRUCTION(xor,
+ 0x22,
+ INST_TYPE_RD_RA_RB,
+ RD = RA ^ RB;
+ PC += INST_SIZE)
+
+INSTRUCTION(andn,
+ 0x23,
+ INST_TYPE_RD_RA_RB,
+ RD = RA & ~RB;
+ PC += INST_SIZE)
+
+INSTRUCTION(sra,
+ 0x24,
+ INST_TYPE_RD_RA,
+ CARRY = (RA & 0x1);
+ RD = (int) (RA >> 1);
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(src,
+ 0x24,
+ INST_TYPE_RD_RA,
+ CARRY = (RA & 0x1);
+ RD = ((((int) (RA >> 1)) & 0x7FFFFFFF) | (uword)(C_rd << 31));
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(srl,
+ 0x24,
+ INST_TYPE_RD_RA,
+ CARRY = (RA & 0x1);
+ RD = (uword) ((RA >> 1) & 0x7FFFFFFF);
+ C_wr(CARRY);
+ PC += INST_SIZE)
+
+INSTRUCTION(sext8,
+ 0x24,
+ INST_TYPE_RD_RA,
+ RD = MICROBLAZE_SEXT8(RA);
+ PC += INST_SIZE)
+
+INSTRUCTION(sext16,
+ 0x24,
+ INST_TYPE_RD_RA,
+ RD = MICROBLAZE_SEXT16(RA);
+ PC += INST_SIZE)
+
+INSTRUCTION(wdc,
+ 0x24,
+ INST_TYPE_RA_RB,
+ PC += INST_SIZE)
+
+INSTRUCTION(wic,
+ 0x24,
+ INST_TYPE_RA_RB,
+ PC += INST_SIZE)
+
+INSTRUCTION(mts,
+ 0x25,
+ INST_TYPE_SA_RA,
+ SA = RA;
+ PC += INST_SIZE)
+
+INSTRUCTION(mfs,
+ 0x25,
+ INST_TYPE_RD_SA,
+ RD = SA;
+ PC += INST_SIZE)
+
+INSTRUCTION(br,
+ 0x26,
+ INST_TYPE_RB,
+ PC += RB;
+ BRANCH)
+
+INSTRUCTION(brd,
+ 0x26,
+ INST_TYPE_RB,
+ PC += RB;
+ BRANCH;
+ DELAY_SLOT)
+
+INSTRUCTION(brld,
+ 0x26,
+ INST_TYPE_RD_RB,
+ RD = PC;
+ PC += RB;
+ BRANCH;
+ DELAY_SLOT)
+
+INSTRUCTION(bra,
+ 0x26,
+ INST_TYPE_RB,
+ PC = RB;
+ BRANCH)
+
+INSTRUCTION(brad,
+ 0x26,
+ INST_TYPE_RB,
+ PC = RB;
+ BRANCH;
+ DELAY_SLOT)
+
+INSTRUCTION(brald,
+ 0x26,
+ INST_TYPE_RD_RB,
+ RD = PC;
+ PC = RB;
+ BRANCH;
+ DELAY_SLOT)
+
+INSTRUCTION(microblaze_brk,
+ 0x26,
+ INST_TYPE_RD_RB,
+ RD = PC;
+ PC = RB;
+ MSR = MSR | BIP_MASK;
+ BRANCH)
+
+INSTRUCTION(beq,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA == 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(beqd,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA == 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(bne,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA != 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(bned,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA != 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(blt,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA < 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(bltd,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA < 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(ble,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA <= 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(bled,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA <= 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(bgt,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA > 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(bgtd,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA > 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(bge,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA >= 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(bged,
+ 0x27,
+ INST_TYPE_RA_RB,
+ if (RA >= 0) {
+ PC += RB;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(ori,
+ 0x28,
+ INST_TYPE_RD_RA_IMM,
+ RD = RA | IMM;
+ PC += INST_SIZE)
+
+INSTRUCTION(andi,
+ 0x29,
+ INST_TYPE_RD_RA_IMM,
+ RD = RA & IMM;
+ PC += INST_SIZE)
+
+INSTRUCTION(xori,
+ 0x2A,
+ INST_TYPE_RD_RA_IMM,
+ RD = RA ^ IMM;
+ PC += INST_SIZE)
+
+INSTRUCTION(andni,
+ 0x2B,
+ INST_TYPE_RD_RA_IMM,
+ RD = RA & ~IMM;
+ PC += INST_SIZE)
+
+INSTRUCTION(imm,
+ 0x2C,
+ INST_TYPE_IMM,
+ IMM_H = IMM_L;
+ PC += INST_SIZE)
+
+INSTRUCTION(rtsd,
+ 0x2D,
+ INST_TYPE_RA_IMM,
+ PC = RA + IMM;
+ BRANCH;
+ DELAY_SLOT)
+
+INSTRUCTION(rtid,
+ 0x2D,
+ INST_TYPE_RA_IMM,
+ PC = RA + IMM;
+ MSR = MSR | INTR_EN_MASK;
+ BRANCH;
+ DELAY_SLOT)
+
+INSTRUCTION(rtbd,
+ 0x2D,
+ INST_TYPE_RA_IMM,
+ PC = RA + IMM;
+ MSR = MSR & ~BIP_MASK;
+ BRANCH;
+ DELAY_SLOT;)
+
+INSTRUCTION(bri,
+ 0x2E,
+ INST_TYPE_IMM,
+ PC += IMM;
+ BRANCH)
+
+INSTRUCTION(brid,
+ 0x2E,
+ INST_TYPE_IMM,
+ PC += IMM;
+ BRANCH;
+ DELAY_SLOT)
+
+INSTRUCTION(brlid,
+ 0x2E,
+ INST_TYPE_RD_IMM,
+ RD = PC;
+ PC += IMM;
+ BRANCH;
+ DELAY_SLOT)
+
+INSTRUCTION(brai,
+ 0x2E,
+ INST_TYPE_IMM,
+ PC = IMM;
+ BRANCH)
+
+INSTRUCTION(braid,
+ 0x2E,
+ INST_TYPE_IMM,
+ PC = IMM;
+ BRANCH;
+ DELAY_SLOT)
+
+INSTRUCTION(bralid,
+ 0x2E,
+ INST_TYPE_RD_IMM,
+ RD = PC;
+ PC = IMM;
+ BRANCH;
+ DELAY_SLOT)
+
+INSTRUCTION(brki,
+ 0x2E,
+ INST_TYPE_RD_IMM,
+ RD = PC;
+ PC = IMM;
+ MSR = MSR | BIP_MASK;
+ BRANCH)
+
+INSTRUCTION(beqi,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA == 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(beqid,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA == 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(bnei,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA != 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(bneid,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA != 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(blti,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA < 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(bltid,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA < 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(blei,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA <= 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(bleid,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA <= 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(bgti,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA > 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(bgtid,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA > 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(bgei,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA >= 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ })
+
+INSTRUCTION(bgeid,
+ 0x2F,
+ INST_TYPE_RA_IMM,
+ if (RA >= 0) {
+ PC += IMM;
+ BRANCH;
+ } else {
+ PC += INST_SIZE;
+ }
+ DELAY_SLOT)
+
+INSTRUCTION(lbu,
+ 0x30,
+ INST_TYPE_RD_RA_RB,
+ RD = (MEM_RD_UBYTE(RA + RB));
+ PC += INST_SIZE)
+
+INSTRUCTION(lhu,
+ 0x31,
+ INST_TYPE_RD_RA_RB,
+ RD = (MEM_RD_UHALF((RA + RB) & ~0x1));
+ PC += INST_SIZE)
+
+INSTRUCTION(lw,
+ 0x32,
+ INST_TYPE_RD_RA_RB,
+ RD = (MEM_RD_WORD((RA + RB) & ~0x3));
+ PC += INST_SIZE)
+
+INSTRUCTION(sb,
+ 0x34,
+ INST_TYPE_RD_RA_RB,
+ MEM_WR_BYTE(RA + RB, RD);
+ PC += INST_SIZE)
+
+INSTRUCTION(sh,
+ 0x35,
+ INST_TYPE_RD_RA_RB,
+ MEM_WR_HALF((RA + RB) & ~0x1, RD);
+ PC += INST_SIZE)
+
+INSTRUCTION(sw,
+ 0x36,
+ INST_TYPE_RD_RA_RB,
+ MEM_WR_WORD((RA + RB) & ~0x3, RD);
+ PC += INST_SIZE)
+
+INSTRUCTION(lbui,
+ 0x38,
+ INST_TYPE_RD_RA_IMM,
+ RD = (MEM_RD_UBYTE(RA + IMM));
+ PC += INST_SIZE)
+
+INSTRUCTION(lhui,
+ 0x39,
+ INST_TYPE_RD_RA_IMM,
+ RD = (MEM_RD_UHALF((RA+IMM) & ~0x1));
+ PC += INST_SIZE)
+
+INSTRUCTION(lwi,
+ 0x3A,
+ INST_TYPE_RD_RA_IMM,
+ RD = (MEM_RD_WORD((RA+IMM) & ~0x3));
+ PC += INST_SIZE)
+
+INSTRUCTION(sbi,
+ 0x3C,
+ INST_TYPE_RD_RA_IMM,
+ MEM_WR_BYTE(RA + IMM, RD);
+ PC += INST_SIZE)
+
+INSTRUCTION(shi,
+ 0x3D,
+ INST_TYPE_RD_RA_IMM,
+ MEM_WR_HALF((RA + IMM) & ~0x1, RD);
+ PC += INST_SIZE)
+
+INSTRUCTION(swi,
+ 0x3E,
+ INST_TYPE_RD_RA_IMM,
+ MEM_WR_WORD((RA + IMM) & ~0x3, RD);
+ PC += INST_SIZE)