2011-01-01 15:34:07 +00:00
|
|
|
/* Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
|
2009-09-23 20:01:47 +00:00
|
|
|
|
|
|
|
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)
|