URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [sim/] [microblaze/] [microblaze.isa] - Rev 842
Compare with Previous | Blame | View Log
/* Copyright 2009, 2010 Free Software Foundation, Inc.This file is part of the Xilinx MicroBlaze simulator.This library is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, 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)
