// Simulator definition for the micromips ASE.
// Copyright (C) 2005-2021 Free Software Foundation, Inc.
// Contributed by Imagination Technologies, Ltd.
// Written by Andrew Bennett <andrew.bennett@imgtec.com>
//
// This file is part of the MIPS sim.
//
// This program 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, see <http://www.gnu.org/licenses/>.

:compute:::int:TBASE:BASE:((BASE < 2) ? (16 + BASE) \: BASE)
:compute:::int:TRD:RD:((RD < 2) ? (16 + RD) \: RD)
:compute:::int:TRS:RS:((RS < 2) ? (16 + RS) \: RS)
:compute:::int:TRT:RT:((RT < 2) ? (16 + RT) \: RT)
:compute:::int:TRT_S:RT_S:((RT_S == 1 ) ? 17 \: RT_S)
:compute:::int:ERT:RT:(compute_movep_src_reg (SD_, RT))
:compute:::int:ERS:RS:(compute_movep_src_reg (SD_, RS))

:compute:::int:IMM_DEC1:IMMEDIATE:((IMMEDIATE == 7) ? -1 \: ((IMMEDIATE == 0) ? 1 \: IMMEDIATE << 2))
:compute:::int:IMM_DEC2:IMMEDIATE:((IMMEDIATE < 8) ? IMMEDIATE \: (IMMEDIATE - 16))
:compute:::int:IMM_DEC3:IMMEDIATE:((IMMEDIATE < 2) ? IMMEDIATE + 256 \: ((IMMEDIATE < 256) ? IMMEDIATE \: ((IMMEDIATE < 510) ? IMMEDIATE - 512 \: IMMEDIATE - 768)))
:compute:::int:IMM_DEC4:IMMEDIATE:(compute_andi16_imm (SD_, IMMEDIATE))
:compute:::int:IMM_DEC5:IMMEDIATE:((IMMEDIATE < 15) ? IMMEDIATE \: -1)
:compute:::int:IMM_DEC6:IMMEDIATE:((IMMEDIATE < 127) ? IMMEDIATE \: -1)

:compute:::int:SHIFT_DEC:SHIFT:((SHIFT == 0) ? 8 \: SHIFT)

:compute:::int:IMM_SHIFT_1BIT:IMMEDIATE:(IMMEDIATE << 1)
:compute:::int:IMM_SHIFT_2BIT:IMMEDIATE:(IMMEDIATE << 2)

:function:::address_word:delayslot_micromips:address_word target, address_word nia, int delayslot_instruction_size
*micromips32:
*micromips64:
*micromipsdsp:
{
  instruction_word delay_insn;
  sim_events_slip (SD, 1);
  DSPC = CIA;
  CIA = nia;
  STATE |= simDELAYSLOT;
  ENGINE_ISSUE_PREFIX_HOOK();
  micromips_instruction_decode (SD, CPU, CIA, delayslot_instruction_size);
  STATE &= ~simDELAYSLOT;
  return target;
}

:function:::address_word:process_isa_mode:address_word target
*micromips32:
*micromips64:
{
  struct mips_sim_state *state = MIPS_SIM_STATE (SD);
  state->isa_mode = target & 0x1;
  return (target & (-(1 << 1)));
}

:function:::address_word:do_micromips_jalr:int rt, int rs, address_word nia, int delayslot_instruction_size
*micromips32:
*micromips64:
{
  GPR[rt] = (nia + delayslot_instruction_size) | ISA_MODE_MICROMIPS;
  return (process_isa_mode (SD_,
	delayslot_micromips (SD_, GPR[rs], nia, delayslot_instruction_size)));
}

:function:::address_word:do_micromips_jal:address_word target, address_word nia, int delayslot_instruction_size
*micromips32:
*micromips64:
{
  RA = (nia + delayslot_instruction_size) | ISA_MODE_MICROMIPS;
  return delayslot_micromips (SD_, target, nia, delayslot_instruction_size);
}


:function:::unsigned32:compute_movep_src_reg:int reg
*micromips32:
*micromips64:
{
  switch(reg)
    {
    case 0: return 0;
    case 1: return 17;
    case 2: return 2;
    case 3: return 3;
    case 4: return 16;
    case 5: return 18;
    case 6: return 19;
    case 7: return 20;
    default: return 0;
    }
}

:function:::unsigned32:compute_andi16_imm:int encoded_imm
*micromips32:
*micromips64:
{
  switch (encoded_imm)
    {
    case 0: return 128;
    case 1: return 1;
    case 2: return 2;
    case 3: return 3;
    case 4: return 4;
    case 5: return 7;
    case 6: return 8;
    case 7: return 15;
    case 8: return 16;
    case 9: return 31;
    case 10: return 32;
    case 11: return 63;
    case 12: return 64;
    case 13: return 255;
    case 14: return 32768;
    case 15: return 65535;
    default: return 0;
    }
}

:function:::FP_formats:convert_fmt_micromips:int fmt
*micromips32:
*micromips64:
{
  switch (fmt)
    {
    case 0: return fmt_single;
    case 1: return fmt_double;
    case 2: return fmt_ps;
    default: return fmt_unknown;
    }
}

:function:::FP_formats:convert_fmt_micromips_cvt_d:int fmt
*micromips32:
*micromips64:
{
  switch (fmt)
    {
    case 0: return fmt_single;
    case 1: return fmt_word;
    case 2: return fmt_long;
    default: return fmt_unknown;
    }
}


:function:::FP_formats:convert_fmt_micromips_cvt_s:int fmt
*micromips32:
*micromips64:
{
  switch (fmt)
    {
    case 0: return fmt_double;
    case 1: return fmt_word;
    case 2: return fmt_long;
    default: return fmt_unknown;
    }
}


011011,3.RD,6.IMMEDIATE,1:POOL16E:16::ADDIUR1SP
"addiur1sp r<TRD>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_addiu (SD_, SPIDX, TRD, IMMEDIATE << 2);
}


011011,3.RD,3.RS,3.IMMEDIATE,0:POOL16E:16::ADDIUR2
"addiur2 r<TRD>, r<TRS>, <IMM_DEC1>"
*micromips32:
*micromips64:
{
  do_addiu (SD_, TRS, TRD, IMM_DEC1);
}


010011,5.RD,4.IMMEDIATE,0:POOL16D:16::ADDIUS5
"addius5 r<RD>, <IMM_DEC2>"
*micromips32:
*micromips64:
{
  do_addiu (SD_, RD, RD, IMM_DEC2);
}


010011,9.IMMEDIATE,1:POOL16D:16::ADDIUSP
"addiusp <IMM_DEC3>"
*micromips32:
*micromips64:
{
  do_addiu (SD_, SPIDX, SPIDX, IMM_DEC3 << 2);
}


000001,3.RD,3.RT,3.RS,0:POOL16A:16::ADDU16
"addu16 r<TRD>, r<TRS>, r<TRT>"
*micromips32:
*micromips64:
{
  do_addu (SD_, TRS, TRT, TRD);
}


001011,3.RD,3.RS,4.IMMEDIATE:MICROMIPS:16::ANDI16
"andi16 r<TRD>, r<TRS>, <IMM_DEC4>"
*micromips32:
*micromips64:
{
  do_andi (SD_, TRS, TRD, IMM_DEC4);
}


010001,0010,3.RT,3.RS:POOL16C:16::AND16
"and16 r<TRT>, r<TRS>"
*micromips32:
*micromips64:
{
  do_and (SD_, TRS, TRT, TRT);
}


110011,10.IMMEDIATE:MICROMIPS:16::B16
"b16 <IMMEDIATE>"
*micromips32:
*micromips64:
{
  NIA = delayslot_micromips (SD_, NIA + (EXTEND11 (IMMEDIATE << 1)),
				  NIA, MICROMIPS_DELAYSLOT_SIZE_ANY);
}


100011,3.RS,7.IMMEDIATE:MICROMIPS:16::BEQZ16
"beqz16 r<TRS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  if (GPR[TRS] == 0)
    NIA = delayslot_micromips (SD_, NIA + (EXTEND8 (IMMEDIATE << 1)),
				    NIA, MICROMIPS_DELAYSLOT_SIZE_ANY);
}


101011,3.RS,7.IMMEDIATE:MICROMIPS:16::BNEZ16
"bnez16 r<TRS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  if (GPR[TRS] != 0)
    NIA = delayslot_micromips (SD_, NIA + (EXTEND8 (IMMEDIATE << 1)),
				    NIA, MICROMIPS_DELAYSLOT_SIZE_ANY);
}


010001,101000,4.CODE:POOL16C:16::BREAK16
"break16 %#lx<CODE>"
*micromips32:
*micromips64:
{
  do_break16 (SD_, instruction_0);
}


010001,01110,5.RS:POOL16C:16::JALR16
"jalr16 r<RS>"
*micromips32:
*micromips64:
{
  NIA = do_micromips_jalr (SD_, RAIDX, RS, NIA, MICROMIPS_DELAYSLOT_SIZE_32);
}


010001,01111,5.RS:POOL16C:16::JALRS16
"jalrs16 r<RS>"
*micromips32:
*micromips64:
{
  NIA = do_micromips_jalr (SD_, RAIDX, RS, NIA, MICROMIPS_DELAYSLOT_SIZE_16);
}


010001,01100,5.RS:POOL16C:16::JR16
"jr16 r<RS>"
*micromips32:
*micromips64:
{
  NIA = process_isa_mode (SD_,
	delayslot_micromips (SD_, GPR[RS], NIA, MICROMIPS_DELAYSLOT_SIZE_ANY));
}


010001,11000,5.IMMEDIATE:POOL16C:16::JRADDIUSP
"jraddiusp <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word temp = RA;
  do_addiu (SD_, SPIDX, SPIDX, IMMEDIATE << 2);
  NIA = process_isa_mode (SD_, temp);
}


010001,01101,5.RS:POOL16C:16::JRC
"jrc r<RS>"
*micromips32:
*micromips64:
{
  NIA = process_isa_mode (SD_, GPR[RS]);
}


000010,3.RT,3.BASE,4.IMMEDIATE:MICROMIPS:16::LBU16
"lbu16 r<TRT>, <IMM_DEC5>(r<TBASE>)"
*micromips32:
*micromips64:
{
  /* LBU can have a negative offset.  As the offset argument to do_load is
     unsigned we need to do the address calcuation before the function call so
     that the load address has been correctly calculated */

  GPR[TRT] = do_load (SD_, AccessLength_BYTE, GPR[TBASE] + IMM_DEC5, 0);
}


001010,3.RT,3.BASE,4.IMMEDIATE:MICROMIPS:16::LHU16
"lhu16 r<TRT>, <IMM_SHIFT_1BIT>(r<TBASE>)"
*micromips32:
*micromips64:
{
  GPR[TRT] = do_load (SD_, AccessLength_HALFWORD, GPR[TBASE], IMM_SHIFT_1BIT);
}


111011,3.RD,7.IMMEDIATE:MICROMIPS:16::LI16
"li16 r<TRD>, <IMM_DEC6>"
*micromips32:
*micromips64:
{
  GPR[TRD] = IMM_DEC6;
}


011010,3.RT,3.BASE,4.IMMEDIATE:MICROMIPS:16::LW16
"lw16 r<TRT>, <IMM_SHIFT_2BIT>(r<TBASE>)"
*micromips32:
*micromips64:
{
  GPR[TRT] = EXTEND32 (
	do_load (SD_, AccessLength_WORD, GPR[TBASE], IMM_SHIFT_2BIT));
}

:%s::::LWMREGS:int lwmregs
*micromips32:
*micromips64:
{
  if (lwmregs == 3)
    return "s0, s1, s2, s3, ra";
  else if (lwmregs == 2)
    return "s0, s1, s2, ra";
  else if (lwmregs == 1)
    return "s0, s1, ra";
  else if (lwmregs == 0)
    return "s0, ra";
  else
    return "";
}

010001,0100,2.LWMREGS,4.IMMEDIATE:POOL16C:16::LWM16
"lwm16 %s<LWMREGS>, <IMM_SHIFT_2BIT>(sp)"
*micromips32:
*micromips64:
{
  int address = GPR[SPIDX] + IMM_SHIFT_2BIT;
  int reg_offset;

  for (reg_offset = 0; reg_offset <= LWMREGS; reg_offset++)
    GPR[16 + reg_offset] = EXTEND32 (
	do_load (SD_, AccessLength_WORD, address, reg_offset * 4));

  RA = EXTEND32 (do_load (SD_, AccessLength_WORD, address, reg_offset * 4));
}


011001,3.RT,7.IMMEDIATE:MICROMIPS:16::LWGP
"lwgp r<TRT>, <IMM_SHIFT_2BIT>(gp)"
*micromips32:
*micromips64:
{
  GPR[TRT] = EXTEND32 (
	do_load (SD_, AccessLength_WORD, GPR[28], IMM_SHIFT_2BIT));
}


010010,5.RT,5.IMMEDIATE:MICROMIPS:16::LWSP
"lwsp r<RT>, <IMM_SHIFT_2BIT>(sp)"
*micromips32:
*micromips64:
{
  GPR[RT] = EXTEND32 (do_load (SD_, AccessLength_WORD, SP, IMM_SHIFT_2BIT));
}


010001,10000,5.RD:POOL16C:16::MFHI16
"mfhi16 r<RD>"
*micromips32:
*micromips64:
{
  do_mfhi (SD_, RD);
}


010001,10010,5.RD:POOL16C:16::MFLO16
"mflo16 r<RD>"
*micromips32:
*micromips64:
{
  do_mflo (SD_, RD);
}


000011,5.RD,5.RS:MICROMIPS:16::MOVE16
"nop":RD==0&&RS==0
"move16 r<RD>, r<RS>"
*micromips32:
*micromips64:
{
  GPR[RD] = GPR[RS];
}


:%s::::DESTREGS:int regs
*micromips32:
*micromips64:
{
  switch (regs)
    {
    case 0: return "a1, a2,";
    case 1: return "a1, a3,";
    case 2: return "a2, a3,";
    case 3: return "a0, s5,";
    case 4: return "a0, s6,";
    case 5: return "a0, a1,";
    case 6: return "a0, a2,";
    case 7: return "a0, a3,";
    default: return "";
    }
}

100001,3.DESTREGS,3.RT,3.RS,0:MICROMIPS:16::MOVEP
"movep %s<DESTREGS> r<ERS>, r<ERT>"
*micromips32:
*micromips64:
{
  int rd;
  int re;
  int dest = DESTREGS;

  if (dest == 0 || dest == 1)
    rd = 5;
  else if (dest == 2)
    rd = 6;
  else
    rd = 4;

  if (dest == 0 || dest == 6)
    re = 6;
  else if (dest == 1 || dest == 2 || dest == 7)
    re = 7;
  else if (dest == 3)
    re = 21;
  else if (dest == 4)
    re = 22;
  /* assume dest is 5 */
  else
    re = 5;

  GPR[rd] = GPR[ERS];
  GPR[re] = GPR[ERT];
}


010001,0000,3.RT,3.RS:POOL16C:16::NOT16
"not16 r<TRT>, r<TRS>"
*micromips32:
*micromips64:
{
  do_nor (SD_, 0, TRS, TRT);
}


010001,0011,3.RT,3.RS:POOL16C:16::OR16
"or16 r<TRT>, r<TRS>"
*micromips32:
*micromips64:
{
  do_or (SD_, TRS, TRT, TRT);
}


100010,3.RT_S,3.BASE,4.IMMEDIATE:MICROMIPS:16::SB16
"sb16 r<TRT_S>, <IMMEDIATE>(r<TBASE>)"
*micromips32:
*micromips64:
{
  do_store (SD_, AccessLength_BYTE, GPR[TBASE], IMMEDIATE, GPR[TRT_S]);
}


010001,101100,4.CODE:POOL16C:16::SDBBP16
"sdbbp16 %#lx<CODE>"
*micromips32:
*micromips64:
{
  SignalException (DebugBreakPoint, instruction_0);
}


101010,3.RT_S,3.BASE,4.IMMEDIATE:MICROMIPS:16::SH16
"sh16 r<TRT_S>, <IMM_SHIFT_1BIT>(r<TBASE>)"
*micromips32:
*micromips64:
{
  do_store (SD_, AccessLength_HALFWORD, GPR[TBASE], IMM_SHIFT_1BIT, GPR[TRT_S]);
}


001001,3.RD,3.RT,3.SHIFT,0:POOL16B:16::SLL16
"sll16 r<TRD>, r<TRT>, <SHIFT_DEC>"
*micromips32:
*micromips64:
{
  do_sll (SD_, TRT, TRD, SHIFT_DEC);
}


001001,3.RD,3.RT,3.SHIFT,1:POOL16B:16::SRL16
"srl16 r<TRD>, r<TRT>, <SHIFT_DEC>"
*micromips32:
*micromips64:
{
  do_srl (SD_, TRT, TRD, SHIFT_DEC);
}


000001,3.RD,3.RT,3.RS,1:POOL16A:16::SUBU16
"subu16 r<TRD>, r<TRS>, r<TRT>"
*micromips32:
*micromips64:
{
  do_subu (SD_, TRS, TRT, TRD);
}


111010,3.RT_S,3.BASE,4.IMMEDIATE:MICROMIPS:16::SW16
"sw16 r<TRT_S>, <IMM_SHIFT_2BIT>(r<TBASE>)"
*micromips32:
*micromips64:
{
  do_store (SD_, AccessLength_WORD, GPR[TBASE], IMM_SHIFT_2BIT, GPR[TRT_S]);
}


110010,5.RT,5.IMMEDIATE:MICROMIPS:16::SWSP
"swsp r<RT>, <IMM_SHIFT_2BIT>(sp)"
*micromips32:
*micromips64:
{
  do_store (SD_, AccessLength_WORD, SP, IMM_SHIFT_2BIT, GPR[RT]);
}


010001,0101,2.LWMREGS,4.IMMEDIATE:POOL16C:16::SWM16
"swm16 %s<LWMREGS>, <IMM_SHIFT_2BIT>(sp)"
*micromips32:
*micromips64:
{
  int address = GPR[SPIDX] + IMM_SHIFT_2BIT;
  int reg_offset;

  for (reg_offset = 0; reg_offset <= LWMREGS; reg_offset++)
    do_store (SD_, AccessLength_WORD, address, reg_offset * 4,
	GPR[16 + reg_offset]);

  do_store (SD_, AccessLength_WORD, address, reg_offset * 4, RA);
}


010001,0001,3.RT,3.RS:POOL16C:16::XOR16
"xor16 r<TRT>, r<TRS>"
*micromips32:
*micromips64:
{
  do_xor (SD_, TRS, TRT, TRT);
}


000000,5.RT,5.RS,5.RD,00100,010000:POOL32A:32::ADD
"add r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_add (SD_, RS, RT, RD);
}


000100,5.RT,5.RS,16.IMMEDIATE:MICROMIPS:32::ADDI
"addi r<RT>, r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_addi (SD_, RS, RT, IMMEDIATE);
}


001100,5.RT,5.RS,16.IMMEDIATE:MICROMIPS:32::ADDIU
"li r<RT>, <IMMEDIATE>":RS==0
"addiu r<RT>, r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_addiu (SD_, RS, RT, IMMEDIATE);
}


011110,3.RS,23.IMMEDIATE:MICROMIPS:32::ADDIUPC
"addiupc r<TRS>, <IMM_SHIFT_2BIT>"
*micromips32:
*micromips64:
{
  GPR[TRS] = EXTEND32 ((CIA & ~3) + EXTEND25 (IMM_SHIFT_2BIT));
}


000000,5.RT,5.RS,5.RD,00101,010000:POOL32A:32::ADDU
"addu r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_addu (SD_, RS, RT, RD);
}


000000,5.RT,5.RS,5.RD,01001,010000:POOL32A:32::AND
"and r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_and (SD_, RS, RT, RD);
}


110100,5.RT,5.RS,16.IMMEDIATE:MICROMIPS:32::ANDI
"andi r<RT>, r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_andi (SD_, RS, RT, IMMEDIATE);
}


010000,1110,1.TF,3.CC,00,16.IMMEDIATE:POOL32I:32,f::BC1a
"bc1%s<TF> <IMMEDIATE>":CC == 0
"bc1%s<TF> <CC>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  check_fpu (SD_);
  if (GETFCC(CC) == TF)
    {
      address_word dest = NIA + (EXTEND16 (IMMEDIATE) << 1);
      NIA = delayslot_micromips (SD_, dest, NIA, MICROMIPS_DELAYSLOT_SIZE_ANY);
    }
}


010000,1010,1.TF,3.CC,00,16.IMMEDIATE:POOL32I:32::BC2a
"bc2%s<TF> <CC>, <IMMEDIATE>":CC == 0
"bc2%s<TF> <CC>, <IMMEDIATE>"
*micromips32:
*micromips64:


100101,5.RT,5.RS,16.IMMEDIATE:MICROMIPS:32::BEQ
"b <IMMEDIATE>":RT == 0 && RS == 0
"beq r<RS>, r<RT>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
    NIA = delayslot_micromips (SD_, NIA + offset, NIA,
			       MICROMIPS_DELAYSLOT_SIZE_ANY);
}

010000,00010,5.RS,16.IMMEDIATE:POOL32I:32::BGEZ
"bgez r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if ((signed_word) GPR[RS] >= 0)
    NIA = delayslot_micromips (SD_, NIA + offset, NIA,
			       MICROMIPS_DELAYSLOT_SIZE_ANY);
}


010000,00111,5.RS,16.IMMEDIATE:POOL32I:32::BEQZC
"beqzc r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if (GPR[RS] == 0)
    NIA = NIA + offset;
}


010000,00011,5.RS,16.IMMEDIATE:POOL32I:32::BGEZAL
"bal <IMMEDIATE>":RS == 0
"bgezal r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if (RS == 31)
    Unpredictable ();
  RA = (NIA + MICROMIPS_DELAYSLOT_SIZE_32) | ISA_MODE_MICROMIPS;
  if ((signed_word) GPR[RS] >= 0)
    NIA = delayslot_micromips (SD_, NIA + offset, NIA,
			       MICROMIPS_DELAYSLOT_SIZE_32);
}


010000,00110,5.RS,16.IMMEDIATE:POOL32I:32::BGTZ
"bgtz r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if ((signed_word) GPR[RS] > 0)
    NIA = delayslot_micromips (SD_, NIA + offset, NIA,
			       MICROMIPS_DELAYSLOT_SIZE_ANY);
}


010000,10011,5.RS,16.IMMEDIATE:POOL32I:32::BGEZALS
"bal <IMMEDIATE>":RS == 0
"bgezals r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if (RS == 31)
    Unpredictable ();
  RA = (NIA + MICROMIPS_DELAYSLOT_SIZE_16) | ISA_MODE_MICROMIPS;
  if ((signed_word) GPR[RS] >= 0)
    NIA = delayslot_micromips (SD_, NIA + offset, NIA,
			       MICROMIPS_DELAYSLOT_SIZE_16);
}


010000,00100,5.RS,16.IMMEDIATE:POOL32I:32::BLEZ
"blez r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  /* NOTE: The branch occurs AFTER the next instruction has been
     executed */
  if ((signed_word) GPR[RS] <= 0)
    NIA = delayslot_micromips (SD_, NIA + offset, NIA,
			       MICROMIPS_DELAYSLOT_SIZE_ANY);
}


010000,00000,5.RS,16.IMMEDIATE:POOL32I:32::BLTZ
"bltz r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if ((signed_word) GPR[RS] < 0)
    NIA = delayslot_micromips (SD_, NIA + offset, NIA,
			       MICROMIPS_DELAYSLOT_SIZE_ANY);
}


010000,00001,5.RS,16.IMMEDIATE:POOL32I:32::BLTZAL
"bltzal r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if (RS == 31)
    Unpredictable ();
  RA = (NIA + MICROMIPS_DELAYSLOT_SIZE_32) | ISA_MODE_MICROMIPS;
  /* NOTE: The branch occurs AFTER the next instruction has been
     executed */
  if ((signed_word) GPR[RS] < 0)
    NIA = delayslot_micromips (SD_, NIA + offset, NIA,
			       MICROMIPS_DELAYSLOT_SIZE_32);
}

010000,10001,5.RS,16.IMMEDIATE:POOL32I:32::BLTZALS
"bltzals r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if (RS == 31)
    Unpredictable ();
  RA = (NIA + MICROMIPS_DELAYSLOT_SIZE_16) | ISA_MODE_MICROMIPS;
  if ((signed_word) GPR[RS] < 0)
    NIA = delayslot_micromips (SD_, NIA + offset, NIA,
			       MICROMIPS_DELAYSLOT_SIZE_16);
}


101101,5.RT,5.RS,16.IMMEDIATE:MICROMIPS:32::BNE
"bne r<RS>, r<RT>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
    NIA = delayslot_micromips (SD_, NIA + offset, NIA,
			       MICROMIPS_DELAYSLOT_SIZE_ANY);
}


010000,00101,5.RS,16.IMMEDIATE:POOL32I:32::BNEZC
"bnezc r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  address_word offset = EXTEND16 (IMMEDIATE) << 1;
  if ((signed_word) GPR[RS] != 0)
    NIA = NIA + offset;
}


000000,20.CODE,000111:POOL32A:32::BREAK
"break %#lx<CODE>"
*micromips32:
*micromips64:
{
  do_break (SD_, instruction_0);
}


001000,5.OP,5.BASE,0110,12.IMMEDIATE:POOL32B:32::CACHE
"cache <OP>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  address_word base = GPR[BASE];
  address_word offset = EXTEND12 (IMMEDIATE);
  address_word vaddr = loadstore_ea (SD_, base, offset);
  address_word paddr = vaddr;
  CacheOp (OP, vaddr, paddr, instruction_0);
}


011000,5.OP,5.BASE,1010011,9.IMMEDIATE:POOL32C:32::CACHEE
"cachee <OP>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


010101,5.RT,5.FS,0001000000,111011:POOL32F:32,f::CFC1
"cfc1 r<RT>, f<FS>"
*micromips32:
*micromips64:
{
  do_cfc1 (SD_, RT, FS);
}


000000,5.RT,5.IMPL,1100110100,111100:POOL32A:32::CFC2
"cfc2 r<RT>, <IMPL>"
*micromips32:
*micromips64:


000000,5.RT,5.RS,0100101100,111100:POOL32A:32::CLO
"clo r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  do_clo (SD_, RT, RS);
}


000000,5.RT,5.RS,0101101100,111100:POOL32A:32::CLZ
"clz r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  do_clz (SD_, RT, RS);
}


000000,23.COFUN,010:POOL32A:32::COP2
"cop2 <COFUN>"
*micromips32:
*micromips64:


010101,5.RT,5.FS,0001100000,111011:POOL32F:32,f::CTC1
"ctc1 r<RT>, f<FS>"
*micromips32:
*micromips64:
{
  do_ctc1 (SD_, RT, FS);
}


000000,5.RT,5.IMPL,1101110100,111100:POOL32A:32::CTC2
"ctc2 r<RT>, <IMPL>"
*micromips32:
*micromips64:


000000,00000000001110001101,111100:POOL32A:32::DERET
"deret"
*micromips32:
*micromips64:


000000,00000,5.RS,0100011101,111100:POOL32A:32::DI
"di":RS == 0
"di r<RS>"
*micromips32:
*micromips64:
{
  do_di (SD_, RS);
}

000000,5.RT,5.RS,1010101100,111100:POOL32A:32::DIV
"div r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_div (SD_, RS, RT);
}


000000,5.RT,5.RS,1011101100,111100:POOL32A:32::DIVU
"divu r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_divu (SD_, RS, RT);
}


000000,00000000000001100000,000000:POOL32A:32::EHB
"ehb"
*micromips32:
*micromips64:


000000,00000,5.RS,0101011101,111100:POOL32A:32::EI
"ei":RS == 0
"ei r<RS>"
*micromips32:
*micromips64:
{
  do_ei (SD_, RS);
}

000000,00000000001111001101,111100:POOL32A:32::ERET
"eret"
*micromips32:
*micromips64:
{
  if (SR & status_ERL)
    {
      /* Oops, not yet available */
      sim_io_printf (SD, "Warning: ERET when SR[ERL] set not supported");
      NIA = EPC;
      SR &= ~status_ERL;
    }
  else
    {
      NIA = EPC;
      SR &= ~status_EXL;
    }
}


000000,5.RT,5.RS,5.MSBD,5.LSB,101100:POOL32A:32::EXT
"ext r<RT>, r<RS>, <LSB>, <MSBD+1>"
*micromips32:
*micromips64:
{
  do_ext (SD_, RT, RS, LSB, MSBD);
}


000000,5.RT,5.RS,5.MSBD,5.LSB,001100:POOL32A:32::INS
"ins r<RT>, r<RS>, <LSB>, <MSBD-LSB+1>"
*micromips32:
*micromips64:
{
  do_ins (SD_, RT, RS, LSB, MSBD);
}


110101,26.IMMEDIATE:MICROMIPS:32::J
"j <IMM_SHIFT_1BIT>"
*micromips32:
*micromips64:
{
  address_word region = (NIA & MASK (63, 27));
  NIA = delayslot_micromips (SD_, region | (IMM_SHIFT_1BIT), NIA,
			     MICROMIPS_DELAYSLOT_SIZE_ANY);
}


111101,26.IMMEDIATE:MICROMIPS:32::JAL
"jal <IMM_SHIFT_1BIT>"
*micromips32:
*micromips64:
{
  /* NOTE: The region used is that of the delay slot and NOT the
     current instruction */
  address_word region = (NIA & MASK (63, 27));
  NIA = do_micromips_jal (SD_, (region | (IMM_SHIFT_1BIT)), NIA,
			  MICROMIPS_DELAYSLOT_SIZE_32);
}


011101,26.IMMEDIATE:MICROMIPS:32::JALS
"jals <IMM_SHIFT_1BIT>"
*micromips32:
*micromips64:
{
  address_word region = (NIA & MASK (63, 27));
  NIA = do_micromips_jal (SD_, (region | (IMM_SHIFT_1BIT)), NIA,
			  MICROMIPS_DELAYSLOT_SIZE_16);
}

000000,5.RT!0,5.RS,0000111100,111100:POOL32A:32::JALR
"jalr r<RS>":RT == 31
"jalr r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  if (RS == RT)
    Unpredictable ();
  NIA = do_micromips_jalr (SD_, RT, RS, NIA, MICROMIPS_DELAYSLOT_SIZE_32);
}

000000,5.RT,5.RS,0100111100,111100:POOL32A:32::JALRS
"jalrs r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  if (RS == RT)
    Unpredictable ();
  NIA = do_micromips_jalr (SD_, RT, RS, NIA, MICROMIPS_DELAYSLOT_SIZE_16);
}


111100,26.IMMEDIATE:MICROMIPS:32::JALX
"jalx <IMM_SHIFT_2BIT>"
*micromips32:
*micromips64:
{
  struct mips_sim_state *state = MIPS_SIM_STATE (SD);
  address_word region = (NIA & MASK (63, 26));
  NIA = do_micromips_jal (SD_, (region | (IMM_SHIFT_2BIT)) | ISA_MODE_MIPS32,
			  NIA, MICROMIPS_DELAYSLOT_SIZE_32);
  state->isa_mode = ISA_MODE_MIPS32;
}

000000,00000,5.RS,0000111100,111100:POOL32A:32::JR
"jr r<RS>"
*micromips32:
*micromips64:
{
  NIA = process_isa_mode (SD_,
			  delayslot_micromips (SD_, GPR[RS], NIA,
					       MICROMIPS_DELAYSLOT_SIZE_32));
}


000000,5.RT,5.RS,0001111100,111100:POOL32A:32::JALR.HB
"jalr.hb r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  if (RS == RT)
    Unpredictable ();
  NIA = do_micromips_jalr (SD_, RT, RS, NIA, MICROMIPS_DELAYSLOT_SIZE_32);
}


000000,5.RT,5.RS,0101111100,111100:POOL32A:32::JALRS.HB
"jalrs.hb r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  if (RS == RT)
    Unpredictable ();
  NIA = do_micromips_jalr (SD_, RT, RS, NIA, MICROMIPS_DELAYSLOT_SIZE_16);
}


000000,00000,5.RS,0111111100,111100:POOL32A:32::JR.HB
"jr.hb r<RS>"
*micromips32:
*micromips64:
{
  NIA = process_isa_mode (SD_,
			  delayslot_micromips (SD_, GPR[RS], NIA,
					       MICROMIPS_DELAYSLOT_SIZE_32));
}


000111,5.RT,5.BASE,16.IMMEDIATE:MICROMIPS:32::LB
"lb r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_lb (SD_, RT, IMMEDIATE, BASE);
}


011000,5.RT,5.BASE,0110100,9.IMMEDIATE:POOL32C:32::LBE
"lbe r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


000101,5.RT,5.BASE,16.IMMEDIATE:MICROMIPS:32::LBU
"lbu r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_lbu (SD_, RT, IMMEDIATE, BASE);
}


011000,5.RT,5.BASE,0110000,9.IMMEDIATE:POOL32C:32::LBUE
"lbue r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


101111,5.FT,5.BASE,16.IMMEDIATE:MICROMIPS:32,f::LDC1a
"ldc1 f<FT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
{
  check_fpu (SD_);
  COP_LD (1, FT, do_load_double (SD_, GPR[BASE], EXTEND16 (IMMEDIATE)));
}


101111,5.FT,5.BASE,16.IMMEDIATE:MICROMIPS:32,f::LDC1b
"ldc1 f<FT>, <IMMEDIATE>(r<BASE>)"
*micromips64:
{
  check_fpu (SD_);
  COP_LD (1, FT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE],
			  EXTEND16 (IMMEDIATE)));
}


001000,5.RT,5.BASE,0010,12.IMMEDIATE:POOL32B:32::LDC2
"ldc2 r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


001111,5.RT,5.BASE,16.IMMEDIATE:MICROMIPS:32::LH
"lh r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_lh (SD_, RT, IMMEDIATE, BASE);
}


011000,5.RT,5.BASE,0110101,9.IMMEDIATE:POOL32C:32::LHE
"lhe r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


001101,5.RT,5.BASE,16.IMMEDIATE:MICROMIPS:32::LHU
"lhu r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_lhu (SD_, RT, IMMEDIATE, BASE);
}


011000,5.RT,5.BASE,0110001,9.IMMEDIATE:POOL32C:32::LHUE
"lhue r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


011000,5.RT,5.BASE,0011,12.IMMEDIATE:POOL32C:32::LL
"ll r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_ll (SD_, RT, EXTEND12 (IMMEDIATE), BASE);
}


011000,5.RT,5.BASE,0110110,9.IMMEDIATE:POOL32C:32::LLE
"lle r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


010000,01101,5.RS,16.IMMEDIATE:POOL32I:32::LUI
"lui r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_lui (SD_, RS, IMMEDIATE);
}


010101,5.INDEX,5.BASE,5.FD,00101,001000:POOL32F:32,f::LUXC1
"luxc1 f<FD>, r<INDEX>(r<BASE>)"
*micromips32:
{
  do_luxc1_32 (SD_, FD, INDEX, BASE);
}


010101,5.INDEX,5.BASE,5.FD,00101,001000:POOL32F:64,f::LUXC1
"luxc1 f<FD>, r<INDEX>(r<BASE>)"
*micromips64:
{
  check_fpu (SD_);
  check_u64 (SD_, instruction_0);
  do_luxc1_64 (SD_, FD, INDEX, BASE);
}


111111,5.RT,5.BASE,16.IMMEDIATE:MICROMIPS:32::LW
"lw r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_lw (SD_, RT, IMMEDIATE, BASE);
}


100111,5.FT,5.BASE,16.IMMEDIATE:MICROMIPS:32,f::LWC1
"lwc1 f<FT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_lwc1 (SD_, FT, IMMEDIATE, BASE);
}


001000,5.RT,5.BASE,0000,12.IMMEDIATE:POOL32B:32::LWC2
"lwc2 r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


011000,5.RT,5.BASE,0110111,9.IMMEDIATE:POOL32C:32::LWE
"lwe r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


011000,5.RT,5.BASE,0110011,9.IMMEDIATE:POOL32C:32::LWEE
"lwee r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


011000,5.RT,5.BASE,0000,12.IMMEDIATE:POOL32C:32::LWL
"lwl r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_lwl (SD_, RT, EXTEND12 (IMMEDIATE), BASE);
}


011000,5.RT,5.BASE,0110010,9.IMMEDIATE:POOL32C:32::LWLE
"lwle r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:

:%s::::LWM32REGS:int lwmregs
*micromips32:
*micromips64:
{
  if (lwmregs & 0x10)
    {
      switch(lwmregs & 0xf)
        {
        case 0:
          return "ra";
        case 1:
          return "s0, ra";
        case 2:
          return "s0, s1, ra";
        case 3:
          return "s0, s1, s2, ra";
        case 4:
          return "s0, s1, s2, s3, ra";
        case 5:
          return "s0, s1, s2, s3, s4, ra";
        case 6:
          return "s0, s1, s2, s3, s4, s5, ra";
        case 7:
          return "s0, s1, s2, s3, s4, s5, s6, ra";
        case 8:
          return "s0, s1, s2, s3, s4, s5, s6, s7, ra";
        case 9:
          return "s0, s1, s2, s3, s4, s5, s6, s7, s8, ra";
        default:
          return "";
        }
    }
  else
    {
      switch(lwmregs & 0xf)
        {
        case 1:
          return "s0";
        case 2:
          return "s0, s1";
        case 3:
          return "s0, s1, s2";
        case 4:
          return "s0, s1, s2, s3";
        case 5:
          return "s0, s1, s2, s3, s4";
        case 6:
          return "s0, s1, s2, s3, s4, s5";
        case 7:
          return "s0, s1, s2, s3, s4, s5, s6";
        case 8:
          return "s0, s1, s2, s3, s4, s5, s6, s7";
        case 9:
          return "s0, s1, s2, s3, s4, s5, s6, s7, s8";
        default:
          return "";
        }
    }
}

001000,5.LWM32REGS,5.BASE,0101,12.IMMEDIATE:POOL32B:32::LWM32
"lwm32 %s<LWM32REGS>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  int address_base = GPR[BASE] + EXTEND12 (IMMEDIATE);
  int reg_offset;
  for (reg_offset = 0; reg_offset < (LWM32REGS & 0xf); reg_offset++)
    {
      int dst = (reg_offset == 8) ? 30 : 16 + reg_offset;
      GPR[dst] = EXTEND32 (do_load (SD_, AccessLength_WORD, address_base,
				    4 * reg_offset));
    }

  if (LWM32REGS & 0x10)
    RA = EXTEND32 (do_load (SD_, AccessLength_WORD, address_base,
			    4 * reg_offset));
}


001000,5.RD,5.BASE,0001,12.IMMEDIATE:POOL32B:32::LWP
"lwp r<RD>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  if (BASE == RD || RD == 31)
    Unpredictable ();
  else
    {
      do_lw (SD_, RD, EXTEND12 (IMMEDIATE), BASE);
      do_lw (SD_, RD + 1, EXTEND12 (IMMEDIATE) + 4, BASE);
    }
}


011000,5.RT,5.BASE,0001,12.IMMEDIATE:POOL32C:32::LWR
"lwr r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_lwr (SD_, RT, EXTEND12 (IMMEDIATE), BASE);
}


011000,5.RT,5.BASE,1110,12.IMMEDIATE:POOL32C:32::LWU
"lwu r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_lwu (SD_, RT, IMMEDIATE, BASE, instruction_0);
}


010101,5.INDEX,5.BASE,5.FD,00001,001000:POOL32F:32,f::LWXC1
"lwxc1 f<FD>, <INDEX>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_lwxc1 (SD_, FD, INDEX, BASE, instruction_0);
}


000000,5.INDEX,5.BASE,5.RD,00100,011000:POOL32A:32::LWXS
"lwxs r<RD>, r<INDEX>(r<BASE>)"
*micromips32:
*micromips64:
{
  GPR[RD] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[BASE],
			       GPR[INDEX] * 4));
}


000000,5.RT,5.RS,1100101100,111100:POOL32A:32::MADD
"madd r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_madd (SD_, RS, RT);
}


000000,5.RT,5.RS,1101101100,111100:POOL32A:32::MADDU
"maddu r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_maddu (SD_, RS, RT);
}


000000,5.RT,5.RS,00,3.SEL,00011,111100:POOL32A:32::MFC0
"mfc0 r<RS>, r<RT>": SEL == 0
"mfc0 r<RS>, r<RT>, <SEL>"
*micromips32:
*micromips64:
{
  DecodeCoproc (instruction_0, 0, cp0_mfc0, RT, RS, SEL);
}


010101,5.RT,5.FS,0010000000,111011:POOL32F:32,f::MFC1
"mfc1 r<RT>, f<FS>"
*micromips32:
*micromips64:
{
  do_mfc1b (SD_, RT, FS);
}


000000,5.RT,5.IMPL,0100110100,111100:POOL32A:32::MFC2
"mfc2 r<RT>, <IMPL>"
*micromips32:
*micromips64:


010101,5.RT,5.FS,0011000000,111011:POOL32F:32,f::MFHC1
"mfhc1 r<RT>, f<FS>"
*micromips32:
*micromips64:
{
  do_mfhc1 (SD_, RT, FS);
}


000000,5.RT,5.IMPL,1000110100,111100:POOL32A:32::MFHC2
"mfhc2 r<RT>, <IMPL>"
*micromips32:
*micromips64:


000000,00000,5.RS,0000110101,111100:POOL32A:32::MFHI
"mfhi r<RS>"
*micromips32:
*micromips64:
{
  do_mfhi (SD_, RS);
}


000000,00000,5.RS,0001110101,111100:POOL32A:32::MFLO
"mflo r<RS>"
*micromips32:
*micromips64:
{
  do_mflo (SD_, RS);
}


// MOVF
// MOVT
010101,5.RT,5.RS,3.CC,0,1.TF,00101,111011:POOL32F:32::MOVtf
"mov%s<TF> r<RT>, r<RS>, CC"
*micromips32:
*micromips64:
{
  do_movtf (SD_, TF, RT, RS, CC);
}


000000,5.RT,5.RS,5.RD,00000,011000:POOL32A:32::MOVN
"movn r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_movn (SD_, RD, RS, RT);
}


000000,5.RT,5.RS,5.RD,00001,011000:POOL32A:32::MOVZ
"movz r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_movz (SD_, RD, RS, RT);
}


000000,5.RT,5.RS,1110101100,111100:POOL32A:32::MSUB
"msub r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_msub (SD_, RS, RT);
}


000000,5.RT,5.RS,1111101100,111100:POOL32A:32::MSUBU
"msubu r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_msubu (SD_, RS, RT);
}


000000,5.RT,5.RS,00,3.SEL,01011,111100:POOL32A:32::MTC0
"mtc0 r<RS>, r<RT>": SEL == 0
"mtc0 r<RS>, r<RT>, <SEL>"
*micromips32:
*micromips64:
{
  DecodeCoproc (instruction_0, 0, cp0_mtc0, RT, RS, SEL);
}


010101,5.RT,5.FS,0010100000,111011:POOL32F:32,f::MTC1
"mtc1 r<RT>, f<FS>"
*micromips32:
*micromips64:
{
  do_mtc1b (SD_, RT, FS);
}


000000,5.RT,5.IMPL,0101110100,111100:POOL32A:32::MTC2
"mtc2 r<RT>, <IMPL>"
*micromips32:
*micromips64:


010101,5.RT,5.FS,0011100000,111011:POOL32F:32,f::MTHC1
"mthc1 r<RT>, f<FS>"
*micromips32:
*micromips64:
{
  do_mthc1 (SD_, RT, FS);
}


000000,5.RT,5.IMPL,1001110100,111100:POOL32A:32::MTHC2
"mthc2 r<RT>, <IMPL>"
*micromips32:
*micromips64:


000000,00000,5.RS,0010110101,111100:POOL32A:32::MTHI
"mthi r<RS>"
*micromips32:
*micromips64:
{
  do_mthi (SD_, RS);
}


000000,00000,5.RS,0011110101,111100:POOL32A:32::MTLO
"mtlo r<RS>"
*micromips32:
*micromips64:
{
  do_mtlo (SD_, RS);
}


000000,5.RT,5.RS,5.RD,01000,010000:POOL32A:32::MUL
"mul r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_mul (SD_, RD, RS, RT);
}


000000,5.RT,5.RS,1000101100,111100:POOL32A:32::MULT
"mult r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_mult (SD_, RS, RT, 0);
}


000000,5.RT,5.RS,1001101100,111100:POOL32A:32::MULTU
"multu r<RS> r<RT>"
*micromips32:
*micromips64:
{
  do_multu (SD_, RS, RT, 0);
}


000000,00000000000000000000,000000:POOL32A:32::NOP
"nop"
*micromips32:
*micromips64:
{
}


000000,5.RT,5.RS,5.RD,01011,010000:POOL32A:32::NOR
"nor r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_nor (SD_, RS, RT, RD);
}


000000,5.RT,5.RS,5.RD,01010,010000:POOL32A:32::OR
"or r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_or (SD_, RS, RT, RD);
}


010100,5.RT,5.RS,16.IMMEDIATE:MICROMIPS:32::ORI
"ori r<RT>, r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_ori (SD_, RS, RT, IMMEDIATE);
}


000000,00000000000010100000,000000:POOL32A:32::PAUSE
"pause"
*micromips32:
*micromips64:


011000,5.HINT,5.BASE,0010,12.IMMEDIATE:POOL32C:32::PREF
"pref <HINT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_pref (SD_, HINT, EXTEND12 (IMMEDIATE), BASE);
}


011000,5.HINT,5.BASE,1010010,9.IMMEDIATE:POOL32C:32::PREFE
"prefe <HINT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


010101,5.INDEX,5.BASE,5.HINT,00110,100000:POOL32F:32::PREFX
"prefx <HINT>, r<INDEX>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_prefx (SD_, HINT, INDEX, BASE);
}

000000,5.RT,5.RS,0110101100,111100:POOL32A:32::RDHWR
"rdhwr r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_rdhwr (SD_, RT, RS);
}

000000,5.RT,5.RS,1110000101,111100:POOL32A:32::RDPGPR
"rdpgpr r<RS>, r<RT>"
*micromips32:
*micromips64:


000000,5.RT,5.RS,5.SHIFT,00011,000000:POOL32A:32::ROTR
"rotr r<RT>, r<RS>, <SHIFT>"
*micromips32:
*micromips64:
{
  GPR[RT] = do_ror (SD_, GPR[RS], SHIFT);
}


000000,5.RT,5.RS,5.RD,00011,010000:POOL32A:32::ROTRV
"rotrv r<RD>, r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  GPR[RD] = do_ror (SD_, GPR[RT], GPR[RS]);
}


000110,5.RT,5.BASE,16.IMMEDIATE:MICROMIPS:32::SB
"sb r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_store (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (IMMEDIATE), GPR[RT]);
}


011000,5.RT,5.BASE,1010101,9.IMMEDIATE:POOL32C:32::SBE
"sbe r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


011000,5.RT,5.BASE,1011,12.IMMEDIATE:POOL32C:32::SC
"sc r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_sc (SD_, RT, EXTEND12 (IMMEDIATE), BASE, instruction_0);
}


011000,5.RT,5.BASE,1010110,9.IMMEDIATE:POOL32C:32::SCE
"sce r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


000000,10.CODE,1101101101,111100:POOL32A:32::SDBBP
"sdbbp %#lx<CODE>"
*micromips32:
*micromips64:
{
  SignalException (DebugBreakPoint, instruction_0);
}


101110,5.FT,5.BASE,16.IMMEDIATE:MICROMIPS:32,f::SDC1a
"sdc1 f<FT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
{
  do_sdc1 (SD_, FT, IMMEDIATE, BASE);
}


101110,5.FT,5.BASE,16.IMMEDIATE:MICROMIPS:32,f::SDC1b
"sdc1 f<FT>, <IMMEDIATE>(r<BASE>)"
*micromips64:
{
  check_fpu (SD_);
  do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (IMMEDIATE),
	    COP_SD (1, FT));
}


001000,5.RT,5.BASE,1010,12.IMMEDIATE:MICROMIPS:32::SDC2
"sdc2 r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


000000,5.RT,5.RS,0010101100,111100:POOL32A:32::SEB
"seb r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  do_seb (SD_, RT, RS);
}


000000,5.RT,5.RS,0011101100,111100:POOL32A:32::SEH
"seh r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  do_seh (SD_, RT, RS);
}


001110,5.RT,5.BASE,16.IMMEDIATE:MICROMIPS:32::SH
"sh r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_store (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (IMMEDIATE),
	    GPR[RT]);
}


011000,5.RT,5.BASE,1010100,9.IMMEDIATE:POOL32C:32::SHE
"she r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


000000,5.RT!0,5.RS!0,5.SHIFT,00000,000000:POOL32A:32::SLL
"sll r<RT>, r<RS>, <SHIFT>"
*micromips32:
*micromips64:
{
  do_sll (SD_, RS, RT, SHIFT);
}


000000,5.RT,5.RS,5.RD,00000,010000:POOL32A:32::SLLV
"sllv r<RD>, r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  do_sllv (SD_, RS, RT, RD);
}


000000,5.RT,5.RS,5.RD,01101,010000:POOL32A:32::SLT
"slt r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_slt (SD_, RS, RT, RD);
}


100100,5.RT,5.RS,16.IMMEDIATE:MICROMIPS:32::SLTI
"slti r<RT>, r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_slti (SD_, RS, RT, IMMEDIATE);
}


101100,5.RT,5.RS,16.IMMEDIATE:MICROMIPS:32::SLTIU
"sltiu r<RT>, r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_sltiu (SD_, RS, RT, IMMEDIATE);
}


000000,5.RT,5.RS,5.RD,01110,010000:POOL32A:32::SLTU
"sltu r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_sltu (SD_, RS, RT, RD);
}


000000,5.RT,5.RS,5.SHIFT,00010,000000:POOL32A:32::SRA
"sra r<RT>, r<RS>, <SHIFT>"
*micromips32:
*micromips64:
{
  do_sra (SD_, RS, RT, SHIFT);
}


000000,5.RT,5.RS,5.RD,00010,010000:POOL32A:32::SRAV
"srav r<RD>, r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  do_srav (SD_, RS, RT, RD);
}


000000,5.RT,5.RS,5.SHIFT,00001,000000:POOL32A:32::SRL
"srl r<RT>, r<RS>, <SHIFT>"
*micromips32:
*micromips64:
{
  do_srl (SD_, RS, RT, SHIFT);
}


000000,5.RT,5.RS,5.RD,00001,010000:POOL32A:32::SRLV
"srlv r<RD>, r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  do_srlv (SD_, RS, RT, RD);
}


000000,00000000000000100000,000000:POOL32A:32::SSNOP
"ssnop"
*micromips32:
*micromips64:
{
}


000000,5.RT,5.RS,5.RD,00110,010000:POOL32A:32::SUB
"sub r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_sub (SD_, RD, RS, RT);
}


000000,5.RT,5.RS,5.RD,00111,010000:POOL32A:32::SUBU
"subu r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_subu (SD_, RS, RT, RD);
}


010101,5.INDEX,5.BASE,5.FD,00110,001000:POOL32F:32,f::SUXC1
"suxc1 f<FD>, r<INDEX>(r<BASE>)"
*micromips32:
{
  do_suxc1_32 (SD_, FD, INDEX, BASE);
}


010101,5.INDEX,5.BASE,5.FD,00110,001000:POOL32F:64,f::SUXC1
"suxc1 f<FD>, r<INDEX>(r<BASE>)"
*micromips64:
{
  check_fpu (SD_);
  check_u64 (SD_, instruction_0);
  do_suxc1_64 (SD_, FD, INDEX, BASE);
}

111110,5.RT,5.BASE,16.IMMEDIATE:MICROMIPS:32::SW
"sw r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_store (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (IMMEDIATE), GPR[RT]);
}


100110,5.FT,5.BASE,16.IMMEDIATE:MICROMIPS:32,f::SWC1
"swc1 f<FT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_swc1 (SD_, FT, IMMEDIATE, BASE, instruction_0);
}


001000,5.RT,5.BASE,1000,12.IMMEDIATE:POOL32B:32::SWC2
"swc2 r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


011000,5.RT,5.BASE,1010111,9.IMMEDIATE:POOL32C:32::SWE
"swe r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


011000,5.RT,5.BASE,1000,12.IMMEDIATE:POOL32C:32::SWL
"swl r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_store_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND12 (IMMEDIATE),
		 GPR[RT]);
}


011000,5.RT,5.BASE,1010000,9.IMMEDIATE:POOL32C:32::SWLE
"swle r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


001000,5.LWM32REGS,5.BASE,1101,12.IMMEDIATE:POOL32B:32::SWM32
"swm32 %s<LWM32REGS>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  int address_base = GPR[BASE] + EXTEND12 (IMMEDIATE);
  int reg_offset;
  for (reg_offset = 0; reg_offset < (LWM32REGS & 0xf); reg_offset++)
    {
      int src = (reg_offset == 8) ? 30 : 16 + reg_offset;
      do_store (SD_, AccessLength_WORD, address_base, 4 * reg_offset,
		GPR[src]);
    }

  if (LWM32REGS & 0x10)
    do_store (SD_, AccessLength_WORD, address_base, 4 * reg_offset, RA);
}


001000,5.RS1,5.BASE,1001,12.IMMEDIATE:POOL32B:32::SWP
"swp r<RS1>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  if (RS1 == 31)
    Unpredictable ();
  else
    {
      do_sw (SD_, RS1, EXTEND12 (IMMEDIATE), BASE);
      do_sw (SD_, RS1 + 1, EXTEND12 (IMMEDIATE) + 4, BASE);
    }
}


011000,5.RT,5.BASE,1001,12.IMMEDIATE:POOL32C:32::SWR
"swr r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_store_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND12 (IMMEDIATE),
		  GPR[RT]);
}


011000,5.RT,5.BASE,1010001,9.IMMEDIATE:POOL32C:32::SWRE
"swre r<RT>, <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:


010101,5.INDEX,5.BASE,5.FD,00010,001000:POOL32F:32,f::SWXC1
"swxc1 f<FD>, r<INDEX>(r<BASE>)"
*micromips32:
*micromips64:
{
  do_swxc1 (SD_, FD, INDEX, BASE, instruction_0);
}


000000,00000,5.STYPE,0110101101,111100:POOL32A:32::SYNC
"sync <STYPE>"
*micromips32:
*micromips64:
{
  SyncOperation (STYPE);
}


010000,10000,5.BASE,16.IMMEDIATE:POOL32I:32::SYNCI
"synci <IMMEDIATE>(r<BASE>)"
*micromips32:
*micromips64:
{
}

000000,10.CODE,1000101101,111100:POOL32A:32::SYSCALL
"syscall %#lx<CODE>"
*micromips32:
*micromips64:
{
  SignalException (SystemCall, instruction_0);
}


000000,5.RT,5.RS,4.CODE,000000,111100:POOL32A:32::TEQ
"teq r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_teq (SD_, RS, RT, instruction_0);
}


010000,01110,5.RS,16.IMMEDIATE:POOL32I:32::TEQI
"teqi r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_teqi (SD_, RS, IMMEDIATE, instruction_0);
}


000000,5.RT,5.RS,4.CODE,001000,111100:POOL32A:32::TGE
"tge r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_tge (SD_, RS, RT, instruction_0);
}


010000,01001,5.RS,16.IMMEDIATE:POOL32I:32::TGEI
"tgei r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_tgei (SD_, RS, IMMEDIATE, instruction_0);
}


010000,01011,5.RS,16.IMMEDIATE:POOL32I:32::TGEIU
"tgeiu r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_tgeiu (SD_, RS, IMMEDIATE, instruction_0);
}


000000,5.RT,5.RS,4.CODE,010000,111100:POOL32A:32::TGEU
"tgeu r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_tgeu (SD_, RS, RT, instruction_0);
}


000000,00000000000000001101,111100:POOL32A:32::TLBP
"tlbp"
*micromips32:
*micromips64:


000000,00000000000001001101,111100:POOL32A:32::TLBR
"tlbr"
*micromips32:
*micromips64:


000000,00000000000010001101,111100:POOL32A:32::TLBWI
"tlbwi"
*micromips32:
*micromips64:


000000,00000000000011001101,111100:POOL32A:32::TLBWR
"tlbwr"
*micromips32:
*micromips64:


000000,5.RT,5.RS,4.CODE,100000,111100:POOL32A:32::TLT
"tlt r<RS>, r<RT>, %#lx<CODE>"
*micromips32:
*micromips64:
{
  do_tlt (SD_, RS, RT, instruction_0);
}


010000,01000,5.RS,16.IMMEDIATE:POOL32I:32::TLTI
"tlti r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_tlti (SD_, RS, IMMEDIATE, instruction_0);
}


010000,01010,5.RS,16.IMMEDIATE:POOL32I:32::TLTIU
"tltiu r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_tltiu (SD_, RS, IMMEDIATE, instruction_0);
}


000000,5.RT,5.RS,4.CODE,101000,111100:POOL32A:32::TLTU
"tltu r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_tltu (SD_, RS, RT, instruction_0);
}


000000,5.RT,5.RS,4.CODE,110000,111100:POOL32A:32::TNE
"tne r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_tne (SD_, RS, RT, instruction_0);
}


010000,01100,5.RS,16.IMMEDIATE:POOL32I:32::TNEI
"tnei r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_tnei (SD_, RS, IMMEDIATE, instruction_0);
}


000000,10.CODE,1001001101,111100:POOL32A:32::WAIT
"wait"
*micromips32:
*micromips64:


000000,5.RT,5.RS,1111000101,111100:POOL32A:32::WRPGPR
"wrpgpr r<RS>, r<RT>"
*micromips32:
*micromips64:


000000,5.RT,5.RS,0111101100,111100:POOL32A:32::WSBH
"wsbh r<RT>, r<RS>"
*micromips32:
*micromips64:
{
  do_wsbh (SD_, RT, RS);
}


000000,5.RT,5.RS,5.RD,01100,010000:POOL32A:32::XOR
"xor r<RD>, r<RS>, r<RT>"
*micromips32:
*micromips64:
{
  do_xor (SD_, RS, RT, RD);
}


011100,5.RT,5.RS,16.IMMEDIATE:MICROMIPS:32::XORI
"xori r<RT>, r<RS>, <IMMEDIATE>"
*micromips32:
*micromips64:
{
  do_xori (SD_, RS, RT, IMMEDIATE);
}


:%s::::FMT_MICROMIPS:int fmt
*micromips32:
*micromips64:
{
  switch (fmt)
    {
    case 0: return "s";
    case 1: return "d";
    case 2: return "ps";
    default: return "?";
    }
}


:%s::::FMT_MICROMIPS_CVT_D:int fmt
*micromips32:
*micromips64:
{
  switch (fmt)
    {
    case 0: return "s";
    case 1: return "w";
    case 2: return "l";
    default: return "?";
    }
}


:%s::::FMT_MICROMIPS_CVT_S:int fmt
*micromips32:
*micromips64:
{
  switch (fmt)
    {
    case 0: return "d";
    case 1: return "w";
    case 2: return "l";
    default: return "?";
    }
}


010101,5.FT,5.FS,0,2.FMT_MICROMIPS!3,0001101,111011:POOL32F:32,f::ABS.fmt
"abs.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_abs_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FT, FS,
	      instruction_0);
}


010101,5.FT,5.FS,5.FD,0,2.FMT_MICROMIPS!3,00,110000:POOL32F:32,f::ADD.fmt
"add.%s<FMT_MICROMIPS> f<FD>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_add_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FD, FS, FT,
	      instruction_0);
}


010101,5.FT,5.FS,5.FD,5.RS,011001:POOL32F:32,f::ALNV.PS
"alnv.ps f<FD>, f<FS>, f<FT>, r<RS>"
*micromips32:
*micromips64:
{
  do_alnv_ps (SD_, FD, FS, FT, RS, instruction_0);
}


010101,5.FT,5.FS,3.CC,0,2.FMT_MICROMIPS!3,4.COND,111100:POOL32F:32,f::C.cond.fmt
"c.%s<COND>.%s<FMT_MICROMIPS> f<FS>, f<FT>":CC == 0
"c.%s<COND>.%s<FMT_MICROMIPS> <CC>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_c_cond_fmt (SD_, COND, convert_fmt_micromips (SD_, FMT_MICROMIPS), CC,
		 FS, FT, instruction_0);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,01001100,111011:POOL32F:32,f::CEIL.L.fmt
"ceil.l.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_ceil_fmt (SD_, fmt_long, FMT_MICROMIPS, FT, FS, instruction_0);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,01101100,111011:POOL32F:32,f::CEIL.W.fmt
"ceil.w.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_ceil_fmt (SD_, fmt_word, FMT_MICROMIPS, FT, FS, instruction_0);
}


010101,5.FT,5.FS,0,2.FMT_MICROMIPS_CVT_D!3,1001101,111011:POOL32F:32,f::CVT.D.fmt
"cvt.d.%s<FMT_MICROMIPS_CVT_D> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_cvt_d_fmt (SD_, convert_fmt_micromips_cvt_d (SD_, FMT_MICROMIPS_CVT_D),
		FT, FS, instruction_0);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,00000100,111011:POOL32F:32,f::CVT.L.fmt
"cvt.l.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_cvt_l_fmt (SD_, FMT_MICROMIPS, FT, FS, instruction_0);
}


010101,5.FT,5.FS,5.FD,00110,000000:POOL32F:32,f::CVT.PS.S
"cvt.ps.s f<FD>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_cvt_ps_s (SD_, FD, FS, FT, instruction_0);
}


010101,5.FT,5.FS,0,2.FMT_MICROMIPS_CVT_S!3,1101101,111011:POOL32F:32,f::CVT.S.fmt
"cvt.s.%s<FMT_MICROMIPS_CVT_S> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_cvt_s_fmt (SD_, convert_fmt_micromips_cvt_s (SD_, FMT_MICROMIPS_CVT_S),
		FT, FS, instruction_0);
}


010101,5.FT,5.FS,00,10000100,111011:POOL32F:32,f::CVT.S.PL
"cvt.s.pl f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_cvt_s_pl (SD_, FT, FS, instruction_0);
}


010101,5.FT,5.FS,00,10100100,111011:POOL32F:32,f::CVT.S.PU
"cvt.s.pu f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_cvt_s_pu (SD_, FT, FS, instruction_0);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,00100100,111011:POOL32F:32,f::CVT.W.fmt
"cvt.w.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_cvt_w_fmt (SD_, FMT_MICROMIPS, FT, FS, instruction_0);
}


010101,5.FT,5.FS,5.FD,0,2.FMT_MICROMIPS!2!3,11,110000:POOL32F:32,f::DIV.fmt
"div.%s<FMT_MICROMIPS> f<FD>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_div_fmt (SD_, FMT_MICROMIPS, FD, FS, FT, instruction_0);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,00001100,111011:POOL32F:32,f::FLOOR.L.fmt
"floor.l.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_floor_fmt (SD_, fmt_long, FMT_MICROMIPS, FT, FS);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,00101100,111011:POOL32F:32,f::FLOOR.W.fmt
"floor.w.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_floor_fmt (SD_, fmt_word, FMT_MICROMIPS, FT, FS);
}


010101,5.FT,5.FS,5.FD,5.FR,0,2.FMT_MICROMIPS!3,001:POOL32F:32,f::MADD.fmt
"madd.%s<FMT_MICROMIPS> f<FD>, f<FR>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_madd_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FD, FR, FS,
	       FT, instruction_0);
}

010101,5.FT,5.FS,0,2.FMT_MICROMIPS!3,0000001,111011:POOL32F:32,f::MOV.fmt
"mov.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_mov_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FT, FS,
	      instruction_0);
}


010101,5.FT,5.FS,3.CC,00,2.FMT_MICROMIPS!3,00,1.TF,100000:POOL32F:32,f::MOVtf.fmt
"mov%s<TF>.%s<FMT_MICROMIPS> f<FT>, f<FS>, <CC>"
*micromips32:
*micromips64:
{
  do_movtf_fmt (SD_, TF, convert_fmt_micromips (SD_, FMT_MICROMIPS), FT,
		FS, CC);
}


010101,5.FT,5.FS,5.FD,0,2.FMT_MICROMIPS!3,00,111000:POOL32F:32,f::MOVN.fmt
"movn.%s<FMT_MICROMIPS> f<FD>, f<FS>, r<FT>"
*micromips32:
*micromips64:
{
  do_movn_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FD, FS, FT);
}

010101,5.FT,5.FS,5.FD,0,2.FMT_MICROMIPS!3,01,111000:POOL32F:32,f::MOVZ.fmt
"movz.%s<FMT_MICROMIPS> f<FD>, f<FS>, r<FT>"
*micromips32:
*micromips64:
{
  do_movz_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FD, FS, FT);
}


010101,5.FT,5.FS,5.FD,5.FR,1,2.FMT_MICROMIPS!3,001:POOL32F:32,f::MSUB.fmt
"msub.%s<FMT_MICROMIPS> f<FD>, f<FR>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_msub_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FD, FR, FS,
	       FT, instruction_0);
}

010101,5.FT,5.FS,5.FD,0,2.FMT_MICROMIPS!3,10,110000:POOL32F:32,f::MUL.fmt
"mul.%s<FMT_MICROMIPS> f<FD>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_mul_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FD, FS, FT,
	      instruction_0);
}


010101,5.FT,5.FS,0,2.FMT_MICROMIPS!3,0101101,111011:POOL32F:32,f::NEG.fmt
"neg.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_neg_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FT, FS,
	      instruction_0);
}


010101,5.FT,5.FS,5.FD,5.FR,0,2.FMT_MICROMIPS!3,010:POOL32F:32,f::NMADD.fmt
"nmadd.%s<FMT_MICROMIPS> f<FD>, f<FR>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_nmadd_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FD, FR, FS,
		FT, instruction_0);
}

010101,5.FT,5.FS,5.FD,5.FR,1,2.FMT_MICROMIPS!3,010:POOL32F:32,f::NMSUB.fmt
"nmsub.%s<FMT_MICROMIPS> f<FD>, f<FR>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_nmsub_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FD, FR, FS,
		FT, instruction_0);
}


010101,5.FT,5.FS,5.FD,00010,000000:POOL32F:32,f::PLL.PS
"pll.ps f<FD>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_pll_ps (SD_, FD, FS, FT, instruction_0);
}


010101,5.FT,5.FS,5.FD,00011,000000:POOL32F:32,f::PLU.PS
"plu.ps f<FD>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_plu_ps (SD_, FD, FS, FT, instruction_0);
}


010101,5.FT,5.FS,5.FD,00100,000000:POOL32F:32,f::PUL.PS
"pul.ps f<FD>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_pul_ps (SD_, FD, FS, FT, instruction_0);
}


010101,5.FT,5.FS,5.FD,00101,000000:POOL32F:32,f::PUU.PS
"puu.ps f<FD>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_puu_ps (SD_, FD, FS, FT, instruction_0);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,01001000,111011:POOL32F:32,f::RECIP.fmt
"recip.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_recip_fmt (SD_, FMT_MICROMIPS, FT, FS);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,11001100,111011:POOL32F:32,f::ROUND.L.fmt
"round.l.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_round_fmt (SD_, fmt_long, FMT_MICROMIPS, FT, FS);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,11101100,111011:POOL32F:32,f::ROUND.W.fmt
"round.w.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_round_fmt (SD_, fmt_word, FMT_MICROMIPS, FT, FS);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,00001000,111011:POOL32F:32,f::RSQRT.fmt
"rsqrt.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_rsqrt_fmt (SD_, FMT_MICROMIPS, FT, FS);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,00101000,111011:POOL32F:32,f::SQRT.fmt
"sqrt.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_sqrt_fmt (SD_, FMT_MICROMIPS, FT, FS);
}


010101,5.FT,5.FS,5.FD,0,2.FMT_MICROMIPS!3,01,110000:POOL32F:32,f::SUB.fmt
"sub.%s<FMT_MICROMIPS> f<FD>, f<FS>, f<FT>"
*micromips32:
*micromips64:
{
  do_sub_fmt (SD_, convert_fmt_micromips (SD_, FMT_MICROMIPS), FD, FS, FT,
	      instruction_0);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,10001100,111011:POOL32F:32,f::TRUNC.L.fmt
"trunc.l.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_trunc_fmt (SD_, fmt_long, FMT_MICROMIPS, FT, FS);
}


010101,5.FT,5.FS,0,1.FMT_MICROMIPS,10101100,111011:POOL32F:32,f::TRUNC.W.fmt
"trunc.w.%s<FMT_MICROMIPS> f<FT>, f<FS>"
*micromips32:
*micromips64:
{
  do_trunc_fmt (SD_, fmt_word, FMT_MICROMIPS, FT, FS);
}

001000,5.LWM32REGS,5.BASE,0111,12.OFFSET:POOL32B:64::LDM
"ldm %s<LWM32REGS>, <OFFSET>(r<BASE>)"
*micromips64:
{
  int address_base = GPR[BASE] + EXTEND12 (OFFSET);
  int reg_offset;
  for (reg_offset = 0; reg_offset < (LWM32REGS & 0xf); reg_offset++)
    {
      int dst = (reg_offset == 8) ? 30 : 16 + reg_offset;
      GPR[dst] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, address_base,
				    8 * reg_offset));
    }

  if (LWM32REGS & 0x10)
    RA = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, address_base,
			    8 * reg_offset));
}

001000,5.RD,5.BASE,0100,12.OFFSET:POOL32B:64::LDP
"ldp r<RD>, <OFFSET>(r<BASE>)"
*micromips64:
{
  if (BASE == RD || RD == 31)
    Unpredictable ();
  else
    {
      check_u64 (SD_, instruction_0);
      GPR[RD] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE],
				   EXTEND12 (OFFSET)));
      GPR[RD + 1] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE],
				       EXTEND12 (OFFSET) + 8));
    }
}

001000,5.LWM32REGS,5.BASE,1111,12.OFFSET:POOL32B:64::SDM
"sdm %s<LWM32REGS>, <OFFSET>(r<BASE>)"
*micromips64:
{
  int address_base = GPR[BASE] + EXTEND12 (OFFSET);
  int reg_offset;
  for (reg_offset = 0; reg_offset < (LWM32REGS & 0xf); reg_offset++)
    {
      int src = (reg_offset == 8) ? 30 : 16 + reg_offset;
      do_store (SD_, AccessLength_DOUBLEWORD, address_base, 8 * reg_offset,
		GPR[src]);
    }

  if (LWM32REGS & 0x10)
    do_store (SD_, AccessLength_DOUBLEWORD, address_base, 8 * reg_offset, RA);
}

001000,5.RD,5.BASE,1100,12.OFFSET:POOL32B:64::SDP
"sdp r<RD>, <OFFSET>(r<BASE>)"
*micromips64:
{
  if (RD == 31)
    Unpredictable ();
  else
    {
      check_u64 (SD_, instruction_0);
      do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND12 (OFFSET),
		GPR[RD]);
      do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND12 (OFFSET) + 8,
		GPR[RD + 1]);
    }
}

010110,5.RT,5.RS,5.RD,00,100010000:POOL32S:64::DADD
"dadd r<RD>, r<RS>, r<RT>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dadd (SD_, RD, RS, RT);
}

010110,5.RT,5.RS,10.IMMEDIATE,011100:POOL32S:64::DADDI
"daddi r<RT>, r<RS>, <IMMEDIATE>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_daddi (SD_, RT, RS, IMMEDIATE);
}

010111,5.RT,5.RS,16.IMMEDIATE:MICROMIPS:64::DADDIU
"daddiu r<RT>, r<RS>, <IMMEDIATE>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_daddiu (SD_, RS, RT, IMMEDIATE);
}

010110,5.RT,5.RS,5.RD,00,101010000:POOL32S:64::DADDU
"daddu r<RD>, r<RS>, r<RT>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_daddu (SD_, RS, RT, RD);
}

010110,5.RT,5.RS,0100101100,111100:POOL32S:64::DCLO
"dclo r<RT>, r<RS>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dclo (SD_, RT, RS);
}

010110,5.RT,5.RS,0101101100,111100:POOL32S:64::DCLZ
"dclz r<RT>, r<RS>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dclz (SD_, RT, RS);
}

010110,5.RT,5.RS,1010101100,111100:POOL32S:64::DDIV
"ddiv r<RS>, r<RT>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_ddiv (SD_, RS, RT);
}

010110,5.RT,5.RS,1011101100,111100:POOL32S:64::DDIVU
"ddivu r<RS>, r<RT>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_ddivu (SD_, RS, RT);
}

010110,5.RT,5.RS,5.SIZE,5.LSB,101100:POOL32S:64::DEXT
"dext r<RT>, r<RS>, <LSB>, <SIZE+1>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dext (SD_, RT, RS, LSB, SIZE);
}

010110,5.RT,5.RS,5.SIZE,5.LSB,100100:POOL32S:64::DEXTM
"dextm r<RT>, r<RS>, <LSB>, <SIZE+33>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dextm (SD_, RT, RS, LSB, SIZE);
}

010110,5.RT,5.RS,5.SIZE,5.LSB,010100:POOL32S:64::DEXTU
"dextu r<RT>, r<RS>, <LSB+32>, <SIZE+1>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dextu (SD_, RT, RS, LSB, SIZE);
}

010110,5.RT,5.RS,5.MSB,5.LSB,001100:POOL32S:64::DINS
"dins r<RT>, r<RS>, <LSB>, <MSB-LSB+1>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dins (SD_, RT, RS, LSB, MSB);
}

010110,5.RT,5.RS,5.MSB,5.LSB,000100:POOL32S:64::DINSM
"dinsm r<RT>, r<RS>, <LSB>, <MSB+32-LSB+1>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dinsm (SD_, RT, RS, LSB, MSB);
}

010110,5.RT,5.RS,5.MSB,5.LSB,110100:POOL32S:64::DINSU
"dinsu r<RT>, r<RS>, <LSB+32>, <MSB-LSB+1>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dinsu (SD_, RT, RS, LSB, MSB);
}

010110,5.RT,5.RS,00,3.SEL,00011,111100:POOL32S:64::DMFC0
"dmfc0 r<RT>, r<RS>": SEL == 0
"dmfc0 r<RT>, r<RS>, <SEL>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  DecodeCoproc (instruction_0, 0, cp0_dmfc0, RT, RS, SEL);
}

010101,5.RT,5.FS,00,10010000,111011:POOL32F:64::DMFC1
"dmfc1 r<RT>, f<FS>"
*micromips64:
{
  check_fpu (SD_);
  check_u64 (SD_, instruction_0);
  do_dmfc1b (SD_, RT, FS);
}

010110,5.RT,5.RS,00,3.SEL,01011,111100:POOL32S:64::DMTC0
"dmtc0 r<RT>, r<RS>": SEL == 0
"dmtc0 r<RT>, r<RS>, <SEL>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  DecodeCoproc (instruction_0, 0, cp0_dmtc0, RT, RS, SEL);
}

010101,5.RT,5.FS,00,10110000,111011:POOL32F:64::DMTC1
"dmtc1 r<RT>, f<FS>"
*micromips64:
{
  check_fpu (SD_);
  check_u64 (SD_, instruction_0);
  do_dmtc1b (SD_, RT, FS);
}

010110,5.RT,5.RS,1000101100,111100:POOL32S:64::DMULT
"dmult r<RS>, r<RT>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dmult (SD_, RS, RT, 0);
}

010110,5.RT,5.RS,1001101100,111100:POOL32S:64::DMULTU
"dmultu r<RS>, r<RT>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dmultu (SD_, RS, RT, 0);
}

010110,5.RT,5.RS,5.SA,00,011000000:POOL32S:64::DROTR
"drotr r<RT>, r<RS>, <SA>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  GPR[RT] = do_dror (SD_, GPR[RS], SA);
}

010110,5.RT,5.RS,5.SA,00,011001000:POOL32S:64::DROTR32
"drotr32 r<RT>, r<RS>, <SA+32>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  GPR[RT] = do_dror (SD_, GPR[RS], SA + 32);
}

010110,5.RT,5.RS,5.RD,00,011010000:POOL32S:64::DROTRV
"drotrv r<RD>, r<RT>, r<RS>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  GPR[RD] = do_dror (SD_, GPR[RT], GPR[RS]);
}

010110,5.RT,5.RS,0111101100,111100:POOL32S:64::DSBH
"dsbh r<RT>, r<RS>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsbh (SD_, RT, RS);
}

010110,5.RT,5.RS,1111101100,111100:POOL32S:64::DSHD
"dshd r<RT>, r<RS>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dshd (SD_, RS, RT);
}

010110,5.RT,5.RS,5.SA,00,000000000:POOL32S:64::DSLL
"dsll r<RT>, r<RS>, <SA>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsll (SD_, RS, RT, SA);
}

010110,5.RT,5.RS,5.SA,00,000001000:POOL32S:64::DSLL32
"dsll32 r<RT>, r<RS>, <SA>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsll32 (SD_, RT, RS, SA);
}

010110,5.RT,5.RS,5.RD,00,000010000:POOL32S:64::DSLLV
"dsllv r<RD>, r<RT>, r<RS>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsllv (SD_, RS, RT, RD);
}

010110,5.RT,5.RS,5.SA,00,010000000:POOL32S:64::DSRA
"dsra r<RT>, r<RS>, <SA>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsra (SD_, RS, RT, SA);
}

010110,5.RT,5.RS,5.SA,00,010001000:POOL32S:64::DSRA32
"dsra32 r<RT>, r<RS>, <SA>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsra32 (SD_, RT, RS, SA);
}

010110,5.RT,5.RS,5.RD,00,010010000:POOL32S:64::DSRAV
"dsrav r<RD>, r<RS>, r<RT>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsrav (SD_, RS, RT, RD);
}

010110,5.RT,5.RS,5.SA,00,001000000:POOL32S:64::DSRL
"dsrl r<RT>, r<RS>, <SA>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsrl (SD_, RS, RT, SA);
}

010110,5.RT,5.RS,5.SA,00,001001000:POOL32S:64::DSRL32
"dsrl32 r<RT>, r<RS>, <SA>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsrl32 (SD_, RT, RS, SA);
}

010110,5.RT,5.RS,5.RD,00,001010000:POOL32S:64::DSRLV
"dsrlv r<RD>, r<RT>, r<RS>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsrlv (SD_, RS, RT, RD);
}

010110,5.RT,5.RS,5.RD,00,110001000:POOL32S:64::DSUB
"dsub r<RD>, r<RS>, r<RT>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsub (SD_, RD, RS, RT);
}

010110,5.RT,5.RS,5.RD,00,111001000:POOL32S:64::DSUBU
"dsubu r<RD>, r<RS>, r<RT>"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_dsubu (SD_, RS, RT, RD);
}

110111,5.RT,5.BASE,16.OFFSET:MICROMIPS64:64::LD
"ld r<RT>, <OFFSET>(r<BASE>)"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  GPR[RT] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE],
			       EXTEND16 (OFFSET)));
}

011000,5.RT,5.BASE,0100,12.OFFSET:POOL32C:64::LDL
"ldl r<RT>, <OFFSET>(r<BASE>)"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  GPR[RT] = do_load_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE],
			  EXTEND12 (OFFSET), GPR[RT]);
}

011000,5.RT,5.BASE,0101,12.OFFSET:POOL32C:64::LDR
"ldr r<RT>, <OFFSET>(r<BASE>)"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  GPR[RT] = do_load_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE],
			   EXTEND12 (OFFSET), GPR[RT]);
}

010101,5.INDEX,5.BASE,5.FD,00,011001000:POOL32F:64,f::LDXC1
"ldxc1 f<FD>, r<INDEX>(r<BASE>)"
*micromips64:
{
  check_fpu (SD_);
  check_u64 (SD_, instruction_0);
  COP_LD (1, FD, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX]));
}

011000,5.RT,5.BASE,0111,12.OFFSET:POOL32C:64::LLD
"lld r<RT>, <OFFSET>(r<BASE>)"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_lld (SD_, RT, OFFSET, BASE);
}

011000,5.RT,5.BASE,1111,12.OFFSET:POOL32C:64::SCD
"scd r<RT>, <OFFSET>(r<BASE>)"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_scd (SD_, RT, OFFSET, BASE);
}

110110,5.RT,5.BASE,16.OFFSET:MICROMIPS64:64::SD
"sd r<RT>, <OFFSET>(r<BASE>)"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET),
	    GPR[RT]);
}

011000,5.RT,5.BASE,1100,12.OFFSET:POOL32C:64::SDL
"sdl r<RT>, <OFFSET>(r<BASE>)"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_store_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND12 (OFFSET),
		 GPR[RT]);
}

011000,5.RT,5.BASE,1101,12.OFFSET:POOL32C:64::SDR
"sdr r<RT>, <OFFSET>(r<BASE>)"
*micromips64:
{
  check_u64 (SD_, instruction_0);
  do_store_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND12 (OFFSET),
		  GPR[RT]);
}

010101,5.INDEX,5.BASE,5.FD,00,100001000:POOL32F:64,f::SDXC1
"sdxc1 f<FD>, r<INDEX>(r<BASE>)"
*micromips64:
{
  check_fpu (SD_);
  check_u64 (SD_, instruction_0);
  do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX],
	    COP_SD (1, FD));
}
