// -*- C -*-

// Simulator definition for the MIPS DSP ASE.
// Copyright (C) 2005-2025 Free Software Foundation, Inc.
// Contributed by MIPS Technologies, Inc.  Written by Chao-ying Fu.
//
// 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/>.


// op: 0 = ADD, 1 = SUB, 2 = MUL
// sat: 0 = no saturation, 1 = saturation
:function:::void:do_ph_op:int rd, int rs, int rt, int op, int sat
{
  int i;
  int32_t h0 = 0;
  int16_t h1, h2;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint32_t result = 0;
  for (i = 0; i < 32; i += 16, v1 >>= 16, v2 >>= 16)
    {
      h1 = (int16_t)(v1 & 0xffff);
      h2 = (int16_t)(v2 & 0xffff);
      if (op == 0) // ADD
	h0 = (int32_t)h1 + (int32_t)h2;
      else if (op == 1) // SUB
        h0 = (int32_t)h1 - (int32_t)h2;
      else // MUL
        h0 = (int32_t)h1 * (int32_t)h2;
      if (h0 > (int32_t)0x7fff || h0 < (int32_t)0xffff8000)
	{
	  if (op == 0 || op == 1) // ADD, SUB
	    DSPCR |= DSPCR_OUFLAG4;
	  else if (op == 2) // MUL
	    DSPCR |= DSPCR_OUFLAG5;
	  if (sat == 1)
	    {
	      if (h0 > (int32_t)0x7fff)
		h0 = 0x7fff;
	      else
		h0 = 0x8000;
	    }
	}
      result |= ((uint32_t)((uint16_t)h0) << i);
    }
  GPR[rd] = EXTEND32 (result);
}

// op: 0 = ADD, 1 = SUB
:function:::void:do_w_op:int rd, int rs, int rt, int op
{
  int64_t h0;
  int32_t h1, h2;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  h1 = (int32_t)v1;
  h2 = (int32_t)v2;
  if (op == 0) // ADD
    h0 = (int64_t)h1 + (int64_t)h2;
  else // SUB
    h0 = (int64_t)h1 - (int64_t)h2;
  if (((h0 & 0x100000000LL) >> 1) != (h0 & 0x80000000))
    {
      DSPCR |= DSPCR_OUFLAG4;
      if (h0 & 0x100000000LL)
	h0 = 0x80000000;
      else
	h0 = 0x7fffffff;
    }
  GPR[rd] = EXTEND32 (h0);
}

// op: 0 = ADD, 1 = SUB
// sat: 0 = no saturation, 1 = saturation
:function:::void:do_qb_op:int rd, int rs, int rt, int op, int sat
{
  int i;
  uint32_t h0;
  uint8_t h1, h2;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint32_t result = 0;
  for (i = 0; i < 32; i += 8, v1 >>= 8, v2 >>= 8)
    {
      h1 = (uint8_t)(v1 & 0xff);
      h2 = (uint8_t)(v2 & 0xff);
      if (op == 0) // ADD
	h0 = (uint32_t)h1 + (uint32_t)h2;
      else // SUB
	h0 = (uint32_t)h1 - (uint32_t)h2;
      if (h0 & 0x100)
	{
	  DSPCR |= DSPCR_OUFLAG4;
	  if (sat == 1)
	    {
	      if (op == 0) // ADD
		h0 = 0xff;
	      else // SUB
		h0 = 0;
	    }
	}
      result |= ((uint32_t)((uint8_t)h0) << i);
    }
  GPR[rd] = EXTEND32 (result);
}

// op: 0 = left, 1 = right
:function:::void:do_qb_shift:int rd, int rt, int shift, int op
{
  int i, j;
  uint8_t h0;
  uint32_t v1 = GPR[rt];
  uint32_t result = 0;
  for (i = 0; i < 32; i += 8, v1 >>= 8)
    {
      h0 = (uint8_t)(v1 & 0xff);
      if (op == 0) // left
	{
	  for (j = 7; j >= 8 - shift; j--)
	    {
	      if (h0 & (1<<j))
		{
		  DSPCR |= DSPCR_OUFLAG6;
		  break;
		}
	    }
          h0 = h0 << shift;
	}
      else // right
        h0 = h0 >> shift;
      result |= ((uint32_t)h0 << i);
    }
  GPR[rd] = EXTEND32 (result);
}

// op: 0 = left, 1 = right
// sat: 0 = no saturation/rounding, 1 = saturation/rounding
:function:::void:do_ph_shift:int rd, int rt, int shift, int op, int sat
{
  int i, j;
  int16_t h0;
  uint32_t v1 = GPR[rt];
  uint32_t result = 0;
  int setcond;
  for (i = 0; i < 32; i += 16, v1 >>= 16)
    {
      h0 = (int16_t)(v1 & 0xffff);
      if (op == 0) // left
	{
	  setcond = 0;
	  if (h0 & (1<<15))
	    {
	      for (j = 14; j >= 15 - shift; j--)
		{
		  if (!(h0 & (1 << j)))
		    {
		      DSPCR |= DSPCR_OUFLAG6;
		      setcond = 1;
		      break;
		    }
		}
	    }
	  else
	    {
	      for (j = 14; j >= 15 - shift; j--)
		{
		  if (h0 & (1 << j))
		    {
		      DSPCR |= DSPCR_OUFLAG6;
		      setcond = 2;
		      break;
		    }
		}
	    }
	  h0 = h0 << shift;
	  if (sat == 1)
	    {
	      if (setcond == 2)
		h0 = 0x7fff;
	      else if (setcond == 1)
		h0 = 0x8000;
	    }
	}
      else // right
	{
	  if (sat == 1 && shift != 0 && (h0 & (1 << (shift-1))))
	    h0 = (h0 >> shift) + 1;
	  else
	    h0 = h0 >> shift;
	}

      result |= ((uint32_t)((uint16_t)h0) << i);
    }
  GPR[rd] = EXTEND32 (result);
}

:function:::void:do_w_shll:int rd, int rt, int shift
{
  int i;
  uint32_t v1 = GPR[rt];
  uint32_t result = 0;
  int setcond = 0;
  if (v1 & (1 << 31))
    {
      for (i = 30; i >= 31 - shift; i--)
	{
	  if (!(v1 & (1 << i)))
	    {
	      DSPCR |= DSPCR_OUFLAG6;
	      setcond = 1;
	      break;
	    }
	}
    }
  else
    {
      for (i = 30; i >= 31 - shift; i--)
	{
	  if (v1 & (1 << i))
	    {
	      DSPCR |= DSPCR_OUFLAG6;
	      setcond = 2;
	      break;
	    }
	}
    }
  if (setcond == 2)
    result = 0x7fffffff;
  else if (setcond == 1)
    result = 0x80000000;
  else
    result = v1 << shift;
  GPR[rd] = EXTEND32 (result);
}

:function:::void:do_ph_s_absq:int rd, int rt
{
  int i;
  int16_t h0;
  uint32_t v1 = GPR[rt];
  uint32_t result = 0;
  for (i = 0; i < 32; i += 16, v1 >>= 16)
    {
      h0 = (int16_t)(v1 & 0xffff);
      if (h0 == (int16_t)0x8000)
	{
	  DSPCR |= DSPCR_OUFLAG4;
	  h0 = 0x7fff;
	}
      else if (h0 & 0x8000)
	h0 = -h0;
      result |= ((uint32_t)((uint16_t)h0) << i);
    }
  GPR[rd] = EXTEND32 (result);
}

:function:::void:do_w_s_absq:int rd, int rt
{
  uint32_t v1 = GPR[rt];
  int32_t h0 = (int32_t)v1;
  if (h0 == (int32_t)0x80000000)
    {
      DSPCR |= DSPCR_OUFLAG4;
      h0 = 0x7fffffff;
    }
  else if (h0 & 0x80000000)
    h0 = -h0;
  GPR[rd] = EXTEND32 (h0);
}

:function:::void:do_qb_s_absq:int rd, int rt
{
  int i;
  int8_t q0;
  uint32_t v1 = GPR[rt];
  uint32_t result = 0;
  for (i = 0; i < 32; i += 8, v1 >>= 8)
    {
      q0 = (int8_t)(v1 & 0xff);
      if (q0 == (int8_t)0x80)
	{
	  DSPCR |= DSPCR_OUFLAG4;
	  q0 = 0x7f;
	}
      else if (q0 & 0x80)
	q0 = -q0;
      result |= ((uint32_t)((uint8_t)q0) << i);
    }
  GPR[rd] = EXTEND32 (result);
}

:function:::void:do_addsc:int rd, int rs, int rt
{
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint64_t h0;
  h0 = (uint64_t)v1 + (uint64_t)v2;
  if (h0 & 0x100000000LL)
    DSPCR |= DSPCR_CARRY;
  GPR[rd] = EXTEND32 (h0);
}

:function:::void:do_addwc:int rd, int rs, int rt
{
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint64_t h0;
  int32_t h1 = (int32_t) v1;
  int32_t h2 = (int32_t) v2;
  h0 = (int64_t)h1 + (int64_t)h2
    + (int64_t)((DSPCR >> DSPCR_CARRY_SHIFT) & DSPCR_CARRY_MASK);
  if (((h0 & 0x100000000LL) >> 1) != (h0 & 0x80000000))
    DSPCR |= DSPCR_OUFLAG4;
  GPR[rd] = EXTEND32 (h0);
}

:function:::void:do_bitrev:int rd, int rt
{
  int i;
  uint32_t v1 = GPR[rt];
  uint32_t h1 = 0;
  for (i = 0; i < 16; i++)
    {
      if (v1 & (1 << i))
	h1 |= (1 << (15 - i));
    }
  GPR[rd] = EXTEND32 (h1);
}

// op: 0 = EXTPV, 1 = EXTPDPV
:function:::void:do_extpv:int rt, int ac, int rs, int op
{
  uint32_t size = GPR[rs] & 0x1f;
  do_extp (SD_, rt, ac, size, op);
}

// op: 0 = EXTRV, 1 = EXTRV_R, 2 = EXTRV_RS
:function:::void:do_extrv:int rt, int ac, int rs, int op
{
  uint32_t shift = GPR[rs] & 0x1f;
  do_w_extr (SD_, rt, ac, shift, op);
}

:function:::void:do_extrv_s_h:int rt, int ac, int rs
{
  uint32_t shift = GPR[rs] & 0x1f;
  do_h_extr (SD_, rt, ac, shift);
}

:function:::void:do_insv:int rt, int rs
{
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint32_t pos = (DSPCR >> DSPCR_POS_SHIFT) & DSPCR_POS_MASK;
  uint32_t size = (DSPCR >> DSPCR_SCOUNT_SHIFT) & DSPCR_SCOUNT_MASK;
  uint32_t mask1, mask2, mask3, result;
  if (size < 32)
    mask1 = (1 << size) - 1;
  else
    mask1 = 0xffffffff;
  mask2 = (1 << pos) - 1;
  if (pos + size < 32)
    mask3 = ~((1 << (pos + size)) - 1);
  else
    mask3 = 0;
  result = (v2 & mask3) | ((v1 & mask1) << pos) | (v2 & mask2);
  GPR[rt] = EXTEND32 (result);
}

// op: 0 = NORMAL,  1 = EXTEND16, 2 = EXTEND32
:function:::void:do_lxx:int rd, int base, int index, int op
{
  if (op == 0)
    GPR[rd] = do_load (SD_, AccessLength_BYTE, GPR[base], GPR[index]);
  else if (op == 1)
    GPR[rd] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[base], GPR[index]));
  else if (op == 2)
    GPR[rd] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[base], GPR[index]));
}

:function:::void:do_modsub:int rd, int rs, int rt
{
  uint32_t result = 0;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint32_t decr = v2 & 0xff;
  uint32_t lastindex = (v2 & 0xffff00) >> 8;
  if (v1 == 0)
    result = lastindex;
  else
    result =  v1 - decr;
  GPR[rd] = EXTEND32 (result);
}

:function:::void:do_mthlip:int rs, int ac
{
  uint32_t pos = (DSPCR >> DSPCR_POS_SHIFT) & DSPCR_POS_MASK;
  DSPHI(ac) = DSPLO(ac);
  DSPLO(ac) = GPR[rs];
  if (pos >= 32)
    Unpredictable ();
  else
    pos += 32;
  DSPCR &= (~DSPCR_POS_SMASK);
  DSPCR |= (pos & DSPCR_POS_MASK) << DSPCR_POS_SHIFT;
}

:function:::void:do_mulsaq_s_w_ph:int ac, int rs, int rt
{
  int i;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  int16_t h1, h2;
  int32_t result;
  uint32_t lo = DSPLO(ac);
  uint32_t hi = DSPHI(ac);
  int64_t prod = (int64_t)((((uint64_t)hi) << 32) + (uint64_t)lo);
  for (i = 0; i < 32; i += 16, v1 >>= 16, v2 >>= 16)
    {
      h1 = (int16_t)(v1 & 0xffff);
      h2 = (int16_t)(v2 & 0xffff);
      if (h1 == (int16_t)0x8000 && h2 == (int16_t)0x8000)
	{
	  DSPCR |= (1 << (DSPCR_OUFLAG_SHIFT + ac));
	  result = (int32_t) 0x7fffffff;
	}
      else
	result = ((int32_t)h1 * (int32_t)h2) << 1;

      if (i == 0)
	prod -= (int64_t) result;
      else
	prod += (int64_t) result;
    }
  DSPLO(ac) = EXTEND32 (prod);
  DSPHI(ac) = EXTEND32 (prod >> 32);
}

:function:::void:do_ph_packrl:int rd, int rs, int rt
{

  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  GPR[rd] = EXTEND32 ((v1 << 16) + (v2 >> 16));
}

:function:::void:do_qb_pick:int rd, int rs, int rt
{
  int i, j;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint8_t h1, h2;
  uint32_t result = 0;
  for (i = 0, j = 0; i < 32; i += 8, j++, v1 >>= 8, v2 >>= 8)
    {
      h1 = (uint8_t)(v1 & 0xff);
      h2 = (uint8_t)(v2 & 0xff);
      if (DSPCR & (1 << (DSPCR_CCOND_SHIFT + j)))
	result |= (uint32_t)(h1 << i);
      else
	result |= (uint32_t)(h2 << i);
    }
  GPR[rd] = EXTEND32 (result);
}

:function:::void:do_ph_pick:int rd, int rs, int rt
{
  int i, j;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint16_t h1, h2;
  uint32_t result = 0;
  for (i = 0, j = 0; i < 32; i += 16, j++, v1 >>= 16, v2 >>= 16)
    {
      h1 = (uint16_t)(v1 & 0xffff);
      h2 = (uint16_t)(v2 & 0xffff);
      if (DSPCR & (1 << (DSPCR_CCOND_SHIFT + j)))
	result |= (uint32_t)(h1 << i);
      else
	result |= (uint32_t)(h2 << i);
    }
  GPR[rd] = EXTEND32 (result);
}

// op: 0 = QBR, 1 = QBRA, 2 = QBL, 3 = QBLA
:function:::void:do_qb_ph_precequ:int rd, int rt, int op
{
  uint32_t v1 = GPR[rt];
  if (op == 0)
    GPR[rd] = EXTEND32 ((v1 & 0xff00) << 15) | ((v1 & 0xff) << 7);
  else if (op == 1)
    GPR[rd] = EXTEND32 ((v1 & 0xff0000) << 7) | ((v1 & 0xff) << 7);
  else if (op == 2)
    GPR[rd] = EXTEND32 ((v1 & 0xff000000) >> 1) | ((v1 & 0xff0000) >> 9);
  else if (op == 3)
    GPR[rd] = EXTEND32 ((v1 & 0xff000000) >> 1) | ((v1 & 0xff00) >> 1);
}

// op: 0 = QBR, 1 = QBRA, 2 = QBL, 3 = QBLA
:function:::void:do_qb_ph_preceu:int rd, int rt, int op
{
  uint32_t v1 = GPR[rt];
  if (op == 0)
    GPR[rd] = EXTEND32 ((v1 & 0xff00) << 8) | (v1 & 0xff);
  else if (op == 1)
    GPR[rd] = EXTEND32 ((v1 & 0xff0000) | (v1 & 0xff));
  else if (op == 2)
    GPR[rd] = EXTEND32 ((v1 & 0xff000000) >> 8) | ((v1 & 0xff0000) >> 16);
  else if (op == 3)
    GPR[rd] = EXTEND32 ((v1 & 0xff000000) >> 8) | ((v1 & 0xff00) >> 8);
}

// op: 0 = .PHL, 1 = PHR
:function:::void:do_w_preceq:int rd, int rt, int op
{
  uint32_t v1 = GPR[rt];
  if (op == 0)
    GPR[rd] = EXTEND32 (v1 & 0xffff0000);
  else if (op == 1)
    GPR[rd] = EXTEND32 ((v1 & 0xffff) << 16);
}

:function:::void:do_w_ph_precrq:int rd, int rs, int rt
{
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint32_t tempu = (v1 & 0xffff0000) >> 16;
  uint32_t tempv = (v2 & 0xffff0000) >> 16;
  GPR[rd] = EXTEND32 ((tempu << 16) | tempv);
}

// sat: 0 = PRECRQ.QB.PH, 1 = PRECRQU_S.QB.PH
:function:::void:do_ph_qb_precrq:int rd, int rs, int rt, int sat
{
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint32_t tempu = 0, tempv = 0, tempw = 0, tempx = 0;
  if (sat == 0)
    {
      tempu = (v1 & 0xff000000) >> 24;
      tempv = (v1 & 0xff00) >> 8;
      tempw = (v2 & 0xff000000) >> 24;
      tempx = (v2 & 0xff00) >> 8;
    }
  else if (sat == 1)
    {
      if (v1 & 0x80000000)
	{
	  DSPCR |= DSPCR_OUFLAG6;
	  tempu = 0;
	}
      else if (!(v1 & 0x80000000) && ((v1 >> 16) > (uint32_t)0x7f80))
	{
	  DSPCR |= DSPCR_OUFLAG6;
	  tempu = 0xff;
	}
      else
	tempu = (v1 & 0x7f800000) >> 23;
      if (v1 & 0x8000)
	{
	  DSPCR |= DSPCR_OUFLAG6;
	  tempv = 0;
	}
      else if (!(v1 & 0x8000) && ((v1 & 0xffff) > (uint32_t)0x7f80))
	{
	  DSPCR |= DSPCR_OUFLAG6;
	  tempv = 0xff;
	}
      else
	tempv = (v1 & 0x7f80) >> 7;
      if (v2 & 0x80000000)
	{
	  DSPCR |= DSPCR_OUFLAG6;
	  tempw = 0;
	}
      else if (!(v2 & 0x80000000) && ((v2 >> 16) > (uint32_t)0x7f80))
	{
	  DSPCR |= DSPCR_OUFLAG6;
	  tempw = 0xff;
	}
      else
	tempw = (v2 & 0x7f800000) >> 23;
      if (v2 & 0x8000)
	{
	  DSPCR |= DSPCR_OUFLAG6;
	  tempx = 0;
	}
      else if (!(v2 & 0x8000) && ((v2 & 0xffff) > (uint32_t)0x7f80))
	{
	  DSPCR |= DSPCR_OUFLAG6;
	  tempx = 0xff;
	}
      else
	tempx = (v2 & 0x7f80) >> 7;
    }
  GPR[rd] = EXTEND32 ((tempu << 24) | (tempv << 16) | (tempw << 8) | tempx);
}

:function:::void:do_w_ph_rs_precrq:int rd, int rs, int rt
{
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  int32_t h1 = (int32_t)v1;
  int32_t h2 = (int32_t)v2;
  int64_t temp1 = (int64_t)h1 + (int64_t)0x8000;
  int32_t temp2;
  int64_t temp3 = (int64_t)h2 + (int64_t)0x8000;
  int32_t temp4;
  if (((temp1 & 0x100000000LL) >> 1) != (temp1 & 0x80000000))
    {
      DSPCR |= DSPCR_OUFLAG6;
      temp2 = 0x7fff;
    }
  else
    temp2 = (int32_t)((temp1 & 0xffff0000) >> 16);
  if (((temp3 & 0x100000000LL) >> 1) != (temp3 & 0x80000000))
    {
      DSPCR |= DSPCR_OUFLAG6;
      temp4 = 0x7fff;
    }
  else
    temp4 = (int32_t)((temp3 & 0xffff0000) >> 16);
  GPR[rd] = EXTEND32 ((temp2 << 16) | temp4);
}

:function:::void:do_qb_w_raddu:int rd, int rs
{
  int i;
  uint8_t h0;
  uint32_t v1 = GPR[rs];
  uint32_t result = 0;
  for (i = 0; i < 32; i += 8, v1 >>= 8)
    {
      h0 = (uint8_t)(v1 & 0xff);
      result += (uint32_t)h0;
    }
  GPR[rd] = EXTEND32 (result);
}

:function:::void:do_rddsp:int rd, int mask
{
  uint32_t result = 0;
  if (mask & 0x1)
    {
      result &= (~DSPCR_POS_SMASK);
      result |= (DSPCR & DSPCR_POS_SMASK);
    }
  if (mask & 0x2)
    {
      result &= (~DSPCR_SCOUNT_SMASK);
      result |= (DSPCR & DSPCR_SCOUNT_SMASK);
    }
  if (mask & 0x4)
    {
      result &= (~DSPCR_CARRY_SMASK);
      result |= (DSPCR & DSPCR_CARRY_SMASK);
    }
  if (mask & 0x8)
    {
      result &= (~DSPCR_OUFLAG_SMASK);
      result |= (DSPCR & DSPCR_OUFLAG_SMASK);
    }
  if (mask & 0x10)
    {
      result &= (~DSPCR_CCOND_SMASK);
      result |= (DSPCR & DSPCR_CCOND_SMASK);
    }
  if (mask & 0x20)
    {
      result &= (~DSPCR_EFI_SMASK);
      result |= (DSPCR & DSPCR_EFI_SMASK);
    }
  GPR[rd] = EXTEND32 (result);
}

// op: 0 = REPL.QB, 1 = REPLV.QB, 2 = REPL.PH, 3 = REPLV.PH
:function:::void:do_repl:int rd, int p2, int op
{
  if (op == 0)
    GPR[rd] = EXTEND32 ((p2 << 24) | (p2 << 16) | (p2 << 8) | p2);
  else if (op == 1)
    {
      uint32_t v1 = GPR[p2] & 0xff;
      GPR[rd] = EXTEND32 ((v1 << 24) | (v1 << 16) | (v1 << 8) | v1);
    }
  else if (op == 2)
    {
      int32_t v1 = p2;
      if (v1 & 0x200)
	v1 |= 0xfffffc00;
      GPR[rd] = EXTEND32 ((v1 << 16) | (v1 & 0xffff));
    }
  else if (op == 3)
    {
      uint32_t v1 = GPR[p2];
      v1 = v1 & 0xffff;
      GPR[rd] = EXTEND32 ((v1 << 16) | v1);
    }
}

:function:::void:do_shilov:int ac, int rs
{
  int32_t shift = GPR[rs] & 0x3f;
  do_shilo (SD_, ac, shift);
}

// op: 0 = SHLLV, 1 = SHRAV
// sat: 0 =  normal, 1 = saturate/rounding
:function:::void:do_ph_shl:int rd, int rt, int rs, int op, int sat
{
  uint32_t shift = GPR[rs] & 0xf;
  do_ph_shift (SD_, rd, rt, shift, op, sat);
}

// op: 0 = SHLLV, 1 = SHRLV
:function:::void:do_qb_shl:int rd, int rt, int rs, int op
{
  uint32_t shift = GPR[rs] & 0x7;
  do_qb_shift (SD_, rd, rt, shift, op);
}

:function:::void:do_w_s_shllv:int rd, int rt, int rs
{
  uint32_t shift = GPR[rs] & 0x1f;
  do_w_shll (SD_, rd, rt, shift);
}

:function:::void:do_ph_shrlv:int rd, int rt, int rs
{
  uint32_t shift = GPR[rs] & 0xf;
  do_ph_shrl (SD_, rd, rt, shift);
}

:function:::void:do_w_r_shrav:int rd, int rt, int rs
{
  uint32_t shift = GPR[rs] & 0x1f;
  do_w_shra (SD_, rd, rt, shift);
}

:function:::void:do_wrdsp:int rs, int mask
{
  uint32_t v1 = GPR[rs];
  if (mask & 0x1)
    {
      DSPCR &= (~DSPCR_POS_SMASK);
      DSPCR |= (v1 & DSPCR_POS_SMASK);
    }
  if (mask & 0x2)
    {
      DSPCR &= (~DSPCR_SCOUNT_SMASK);
      DSPCR |= (v1 & DSPCR_SCOUNT_SMASK);
    }
  if (mask & 0x4)
    {
      DSPCR &= (~DSPCR_CARRY_SMASK);
      DSPCR |= (v1 & DSPCR_CARRY_SMASK);
    }
  if (mask & 0x8)
    {
      DSPCR &= (~DSPCR_OUFLAG_SMASK);
      DSPCR |= (v1 & DSPCR_OUFLAG_SMASK);
    }
  if (mask & 0x10)
    {
      DSPCR &= (~DSPCR_CCOND_SMASK);
      DSPCR |= (v1 & DSPCR_CCOND_SMASK);
    }
  if (mask & 0x20)
    {
      DSPCR &= (~DSPCR_EFI_SMASK);
      DSPCR |= (v1 & DSPCR_EFI_SMASK);
    }
}

// round: 0 = no rounding, 1 = rounding
:function:::void:do_qb_shrav:int rd, int rt, int rs, int round
{
  uint32_t shift = GPR[rs] & 0x7;
  do_qb_shra (SD_, rd, rt, shift, round);
}

:function:::void:do_append:int rt, int rs, int sa
{
  uint32_t v0 = GPR[rs];
  uint32_t v1 = GPR[rt];
  uint32_t result;
  uint32_t mask = (1 << sa) - 1;
  result = (v1 << sa) | (v0 & mask);
  GPR[rt] = EXTEND32 (result);
}

:function:::void:do_balign:int rt, int rs, int bp
{
  uint32_t v0 = GPR[rs];
  uint32_t v1 = GPR[rt];
  uint32_t result;
  if (bp == 0)
    result = v1;
  else
    result = (v1 << 8 * bp) | (v0 >> 8 * (4 - bp));
  GPR[rt] = EXTEND32 (result);
}

:function:::void:do_ph_w_mulsa:int ac, int rs, int rt
{
  int i;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  int16_t h1, h2;
  int32_t result;
  uint32_t lo = DSPLO(ac);
  uint32_t hi = DSPHI(ac);
  int64_t prod = (int64_t)((((uint64_t)hi) << 32) + (uint64_t)lo);
  for (i = 0; i < 32; i += 16, v1 >>= 16, v2 >>= 16)
    {
      h1 = (int16_t)(v1 & 0xffff);
      h2 = (int16_t)(v2 & 0xffff);
      result = (int32_t)h1 * (int32_t)h2;

      if (i == 0)
	prod -= (int64_t) result;
      else
	prod += (int64_t) result;
    }
  DSPLO(ac) = EXTEND32 (prod);
  DSPHI(ac) = EXTEND32 (prod >> 32);
}

:function:::void:do_ph_qb_precr:int rd, int rs, int rt
{
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint32_t tempu = (v1 & 0xff0000) >> 16;
  uint32_t tempv = (v1 & 0xff);
  uint32_t tempw = (v2 & 0xff0000) >> 16;
  uint32_t tempx = (v2 & 0xff);
  GPR[rd] = EXTEND32 ((tempu << 24) | (tempv << 16) | (tempw << 8) | tempx);
}

:function:::void:do_prepend:int rt, int rs, int sa
{
  uint32_t v0 = GPR[rs];
  uint32_t v1 = GPR[rt];
  uint32_t result;
  if (sa == 0)
    result = v1;
  else
    result = (v0 << (32 - sa)) | (v1 >> sa);
  GPR[rt] = EXTEND32 (result);
}

:function:::void:do_w_shra:int rd, int rt, int shift
{
  uint32_t result = GPR[rt];
  int32_t h0 = (int32_t)result;
  if (shift != 0 && (h0 & (1 << (shift-1))))
    h0 = (h0 >> shift) + 1;
  else
    h0 = h0 >> shift;
  GPR[rd] = EXTEND32 (h0);
}

011111,5.RS,5.RT,5.RD,01010,010000:SPECIAL3:32::ADDQ.PH
"addq.ph r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_op (SD_, RD, RS, RT, 0, 0);
}

011111,5.RS,5.RT,5.RD,01110,010000:SPECIAL3:32::ADDQ_S.PH
"addq_s.ph r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_op (SD_, RD, RS, RT, 0, 1);
}

011111,5.RS,5.RT,5.RD,10110,010000:SPECIAL3:32::ADDQ_S.W
"addq_s.w r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_w_op (SD_, RD, RS, RT, 0);
}

011111,5.RS,5.RT,5.RD,00000,010000:SPECIAL3:32::ADDU.QB
"addu.qb r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_qb_op (SD_, RD, RS, RT, 0, 0);
}

011111,5.RS,5.RT,5.RD,00100,010000:SPECIAL3:32::ADDU_S.QB
"addu_s.qb r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_qb_op (SD_, RD, RS, RT, 0, 1);
}

011111,5.RS,5.RT,5.RD,01011,010000:SPECIAL3:32::SUBQ.PH
"subq.ph r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_op (SD_, RD, RS, RT, 1, 0);
}

011111,5.RS,5.RT,5.RD,01111,010000:SPECIAL3:32::SUBQ_S.PH
"subq_s.ph r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_op (SD_, RD, RS, RT, 1, 1);
}

011111,5.RS,5.RT,5.RD,10111,010000:SPECIAL3:32::SUBQ_S.W
"subq_s.w r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_w_op (SD_, RD, RS, RT, 1);
}

011111,5.RS,5.RT,5.RD,00001,010000:SPECIAL3:32::SUBU.QB
"subu.qb r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_qb_op (SD_, RD, RS, RT, 1, 0);
}

011111,5.RS,5.RT,5.RD,00101,010000:SPECIAL3:32::SUBU_S.QB
"subu_s.qb r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_qb_op (SD_, RD, RS, RT, 1, 1);
}

011111,5.RS,5.RT,5.RD,10000,010000:SPECIAL3:32::ADDSC
"addsc r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_addsc (SD_, RD, RS, RT);
}

011111,5.RS,5.RT,5.RD,10001,010000:SPECIAL3:32::ADDWC
"addwc r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_addwc (SD_, RD, RS, RT);
}

011111,5.RS,5.RT,5.RD,10010,010000:SPECIAL3:32::MODSUB
"modsub r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_modsub (SD_, RD, RS, RT);
}

011111,5.RS,00000,5.RD,10100,010000:SPECIAL3:32::RADDU.W.QB
"raddu.w.qb r<RD>, r<RS>"
*dsp:
{
  do_qb_w_raddu (SD_, RD, RS);
}

011111,00000,5.RT,5.RD,01001,010010:SPECIAL3:32::ABSQ_S.PH
"absq_s.ph r<RD>, r<RT>"
*dsp:
{
  do_ph_s_absq (SD_, RD, RT);
}

011111,00000,5.RT,5.RD,10001,010010:SPECIAL3:32::ABSQ_S.W
"absq_s.w r<RD>, r<RT>"
*dsp:
{
  do_w_s_absq (SD_, RD, RT);
}

011111,5.RS,5.RT,5.RD,01100,010001:SPECIAL3:32::PRECRQ.QB.PH
"precrq.qb.ph r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_qb_precrq (SD_, RD, RS, RT, 0);
}

011111,5.RS,5.RT,5.RD,10100,010001:SPECIAL3:32::PRECRQ.PH.W
"precrq.ph.w r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_w_ph_precrq (SD_, RD, RS, RT);
}

011111,5.RS,5.RT,5.RD,10101,010001:SPECIAL3:32::PRECRQ_RS.PH.W
"precrq_rs.ph.w r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_w_ph_rs_precrq (SD_, RD, RS, RT);
}

011111,5.RS,5.RT,5.RD,01111,010001:SPECIAL3:32::PRECRQU_S.QB.PH
"precrqu_s.qb.ph r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_qb_precrq (SD_, RD, RS, RT, 1);
}

011111,00000,5.RT,5.RD,01100,010010:SPECIAL3:32::PRECEQ.W.PHL
"preceq.w.phl r<RD>, r<RT>"
*dsp:
{
  do_w_preceq (SD_, RD, RT, 0);
}

011111,00000,5.RT,5.RD,01101,010010:SPECIAL3:32::PRECEQ.W.PHR
"preceq.w.phr r<RD>, r<RT>"
*dsp:
{
  do_w_preceq (SD_, RD, RT, 1);
}

011111,00000,5.RT,5.RD,00100,010010:SPECIAL3:32::PRECEQU.PH.QBL
"precequ.ph.qbl r<RD>, r<RT>"
*dsp:
{
  do_qb_ph_precequ (SD_, RD, RT, 2);
}

011111,00000,5.RT,5.RD,00101,010010:SPECIAL3:32::PRECEQU.PH.QBR
"precequ.ph.qbr r<RD>, r<RT>"
*dsp:
{
  do_qb_ph_precequ (SD_, RD, RT, 0);
}

011111,00000,5.RT,5.RD,00110,010010:SPECIAL3:32::PRECEQU.PH.QBLA
"precequ.ph.qbla r<RD>, r<RT>"
*dsp:
{
  do_qb_ph_precequ (SD_, RD, RT, 3);
}

011111,00000,5.RT,5.RD,00111,010010:SPECIAL3:32::PRECEQU.PH.QBRA
"precequ.ph.qbra r<RD>, r<RT>"
*dsp:
{
  do_qb_ph_precequ (SD_, RD, RT, 1);
}

011111,00000,5.RT,5.RD,11100,010010:SPECIAL3:32::PRECEU.PH.QBL
"preceu.ph.qbl r<RD>, r<RT>"
*dsp:
{
  do_qb_ph_preceu (SD_, RD, RT, 2);
}

011111,00000,5.RT,5.RD,11101,010010:SPECIAL3:32::PRECEU.PH.QBR
"preceu.ph.qbr r<RD>, r<RT>"
*dsp:
{
  do_qb_ph_preceu (SD_, RD, RT, 0);
}

011111,00000,5.RT,5.RD,11110,010010:SPECIAL3:32::PRECEU.PH.QBLA
"preceu.ph.qbla r<RD>, r<RT>"
*dsp:
{
  do_qb_ph_preceu (SD_, RD, RT, 3);
}

011111,00000,5.RT,5.RD,11111,010010:SPECIAL3:32::PRECEU.PH.QBRA
"preceu.ph.qbra r<RD>, r<RT>"
*dsp:
{
  do_qb_ph_preceu (SD_, RD, RT, 1);
}

011111,00,3.SHIFT3,5.RT,5.RD,00000,010011:SPECIAL3:32::SHLL.QB
"shll.qb r<RD>, r<RT>, <SHIFT3>"
*dsp:
{
  do_qb_shift (SD_, RD, RT, SHIFT3, 0);
}

011111,5.RS,5.RT,5.RD,00010,010011:SPECIAL3:32::SHLLV.QB
"shllv.qb r<RD>, r<RT>, r<RS>"
*dsp:
{
  do_qb_shl (SD_, RD, RT, RS, 0);
}

011111,0,4.SHIFT4,5.RT,5.RD,01000,010011:SPECIAL3:32::SHLL.PH
"shll.ph r<RD>, r<RT>, <SHIFT4>"
*dsp:
{
  do_ph_shift (SD_, RD, RT, SHIFT4, 0, 0);
}

011111,5.RS,5.RT,5.RD,01010,010011:SPECIAL3:32::SHLLV.PH
"shllv.ph r<RD>, r<RT>, r<RS>"
*dsp:
{
  do_ph_shl (SD_, RD, RT, RS, 0, 0);
}

011111,0,4.SHIFT4,5.RT,5.RD,01100,010011:SPECIAL3:32::SHLL_S.PH
"shll_s.ph r<RD>, r<RT>, <SHIFT4>"
*dsp:
{
  do_ph_shift (SD_, RD, RT, SHIFT4, 0, 1);
}

011111,5.RS,5.RT,5.RD,01110,010011:SPECIAL3:32::SHLLV_S.PH
"shllv_s.ph r<RD>, r<RT>, r<RS>"
*dsp:
{
  do_ph_shl (SD_, RD, RT, RS, 0, 1);
}

011111,5.SHIFT5,5.RT,5.RD,10100,010011:SPECIAL3:32::SHLL_S.W
"shll_s.w r<RD>, r<RT>, <SHIFT5>"
*dsp:
{
  do_w_shll (SD_, RD, RT, SHIFT5);
}

011111,5.RS,5.RT,5.RD,10110,010011:SPECIAL3:32::SHLLV_S.W
"shllv_s.w r<RD>, r<RT>, r<RS>"
*dsp:
{
  do_w_s_shllv (SD_, RD, RT, RS);
}

011111,00,3.SHIFT3,5.RT,5.RD,00001,010011:SPECIAL3:32::SHRL.QB
"shrl.qb r<RD>, r<RT>, <SHIFT3>"
*dsp:
{
  do_qb_shift (SD_, RD, RT, SHIFT3, 1);
}

011111,5.RS,5.RT,5.RD,00011,010011:SPECIAL3:32::SHRLV.QB
"shrlv.qb r<RD>, r<RT>, r<RS>"
*dsp:
{
  do_qb_shl (SD_, RD, RT, RS, 1);
}

011111,0,4.SHIFT4,5.RT,5.RD,01001,010011:SPECIAL3:32::SHRA.PH
"shra.ph r<RD>, r<RT>, <SHIFT4>"
*dsp:
{
  do_ph_shift (SD_, RD, RT, SHIFT4, 1, 0);
}

011111,5.RS,5.RT,5.RD,01011,010011:SPECIAL3:32::SHRAV.PH
"shrav.ph r<RD>, r<RT>, r<RS>"
*dsp:
{
  do_ph_shl (SD_, RD, RT, RS, 1, 0);
}

011111,0,4.SHIFT4,5.RT,5.RD,01101,010011:SPECIAL3:32::SHRA_R.PH
"shra_r.ph r<RD>, r<RT>, <SHIFT4>"
*dsp:
{
  do_ph_shift (SD_, RD, RT, SHIFT4, 1, 1);
}

011111,5.RS,5.RT,5.RD,01111,010011:SPECIAL3:32::SHRAV_R.PH
"shrav_r.ph r<RD>, r<RT>, r<RS>"
*dsp:
{
  do_ph_shl (SD_, RD, RT, RS, 1, 1);
}

011111,5.SHIFT5,5.RT,5.RD,10101,010011:SPECIAL3:32::SHRA_R.W
"shra_r.w r<RD>, r<RT>, <SHIFT5>"
*dsp:
{
  do_w_shra (SD_, RD, RT, SHIFT5);
}

011111,5.RS,5.RT,5.RD,10111,010011:SPECIAL3:32::SHRAV_R.W
"shrav_r.w r<RD>, r<RT>, r<RS>"
*dsp:
{
  do_w_r_shrav (SD_, RD, RT, RS);
}

// loc: 0 = qhl, 1 = qhr
:function:::void:do_qb_muleu:int rd, int rs, int rt, int loc
{
  int i;
  uint32_t result = 0;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint16_t h1, h2;
  uint32_t prod;
  if (loc == 0)
    v1 >>= 16;
  for (i = 0; i < 32; i += 16, v1 >>= 8, v2 >>= 16)
    {
      h1 = (uint16_t)(v1 & 0xff);
      h2 = (uint16_t)(v2 & 0xffff);
      prod = (uint32_t)h1 * (uint32_t)h2;
      if (prod > 0xffff)
	{
	  DSPCR |= DSPCR_OUFLAG5;
	  prod = 0xffff;
	}
      result |= ((uint32_t)prod << i);
    }
  GPR[rd] = EXTEND32 (result);
}

011111,5.RS,5.RT,5.RD,00110,010000:SPECIAL3:32::MULEU_S.PH.QBL
"muleu_s.ph.qbl r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_qb_muleu (SD_, RD, RS, RT, 0);
}

011111,5.RS,5.RT,5.RD,00111,010000:SPECIAL3:32::MULEU_S.PH.QBR
"muleu_s.ph.qbr r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_qb_muleu (SD_, RD, RS, RT, 1);
}

// round: 0 = no rounding, 1 = rounding
:function:::void:do_ph_mulq:int rd, int rs, int rt, int round
{
  int i;
  uint32_t result = 0;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  int16_t h1, h2;
  int32_t prod;
  for (i = 0; i < 32; i += 16, v1 >>= 16, v2 >>= 16)
    {
      h1 = (int16_t)(v1 & 0xffff);
      h2 = (int16_t)(v2 & 0xffff);
      if (h1 == (int16_t)0x8000 && h2 == (int16_t)0x8000)
	{
	  DSPCR |= DSPCR_OUFLAG5;
	  prod = 0x7fffffff;
	}
      else
	{
	  prod = ((int32_t)h1 * (int32_t)h2) << 1;
	  if (round == 1)
	    prod += (int32_t)0x8000;
	}
      result |= (((uint32_t)prod >> 16) << i);
    }
  GPR[rd] = EXTEND32 (result);
}

011111,5.RS,5.RT,5.RD,11111,010000:SPECIAL3:32::MULQ_RS.PH
"mulq_rs.ph r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_mulq (SD_, RD, RS, RT, 1);
}

// loc: 0 = phl, 1 = phr
:function:::void:do_ph_muleq:int rd, int rs, int rt, int loc
{
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  int16_t h1, h2;
  int32_t prod;
  if (loc == 0)
    {
      h1 = (int16_t)(v1 >> 16);
      h2 = (int16_t)(v2 >> 16);
    }
  else
    {
      h1 = (int16_t)(v1 & 0xffff);
      h2 = (int16_t)(v2 & 0xffff);
    }
  if (h1 == (int16_t)0x8000 && h2 == (int16_t)0x8000)
    {
      DSPCR |= DSPCR_OUFLAG5;
      prod = 0x7fffffff;
    }
  else
    prod = ((int32_t)h1 * (int32_t)h2) << 1;
  GPR[rd] = EXTEND32 (prod);
}

011111,5.RS,5.RT,5.RD,11100,010000:SPECIAL3:32::MULEQ_S.W.PHL
"muleq_s.w.phl r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_muleq (SD_, RD, RS, RT, 0);
}

011111,5.RS,5.RT,5.RD,11101,010000:SPECIAL3:32::MULEQ_S.W.PHR
"muleq_s.w.phr r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_muleq (SD_, RD, RS, RT, 1);
}

// op: 0 = DPAU 1 = DPSU
// loc: 0 = qbl, 1 = qbr
:function:::void:do_qb_dot_product:int ac, int rs, int rt, int op, int loc
{
  int i;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint8_t h1, h2;
  uint32_t lo = DSPLO(ac);
  uint32_t hi = DSPHI(ac);
  uint64_t prod = (((uint64_t)hi) << 32) + (uint64_t)lo;
  if (loc == 0)
    {
      v1 >>= 16;
      v2 >>= 16;
    }
  for (i = 0; i < 16; i += 8, v1 >>= 8, v2 >>= 8)
    {
      h1 = (uint8_t)(v1 & 0xff);
      h2 = (uint8_t)(v2 & 0xff);
      if (op == 0) // DPAU
	prod += (uint64_t)h1 * (uint64_t)h2;
      else // DPSU
	prod -= (uint64_t)h1 * (uint64_t)h2;
    }
  DSPLO(ac) = EXTEND32 (prod);
  DSPHI(ac) = EXTEND32 (prod >> 32);
}

011111,5.RS,5.RT,000,2.AC,00011,110000:SPECIAL3:32::DPAU.H.QBL
"dpau.h.qbl ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_qb_dot_product (SD_, AC, RS, RT, 0, 0);
}

011111,5.RS,5.RT,000,2.AC,00111,110000:SPECIAL3:32::DPAU.H.QBR
"dpau.h.qbr ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_qb_dot_product (SD_, AC, RS, RT, 0, 1);
}

011111,5.RS,5.RT,000,2.AC,01011,110000:SPECIAL3:32::DPSU.H.QBL
"dpsu.h.qbl ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_qb_dot_product (SD_, AC, RS, RT, 1, 0);
}

011111,5.RS,5.RT,000,2.AC,01111,110000:SPECIAL3:32::DPSU.H.QBR
"dpsu.h.qbr ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_qb_dot_product (SD_, AC, RS, RT, 1, 1);
}

// op: 0 = DPAQ 1 = DPSQ
:function:::void:do_ph_dot_product:int ac, int rs, int rt, int op
{
  int i;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  int16_t h1, h2;
  int32_t result;
  uint32_t lo = DSPLO(ac);
  uint32_t hi = DSPHI(ac);
  int64_t prod = (int64_t)((((uint64_t)hi) << 32) + (uint64_t)lo);
  for (i = 0; i < 32; i += 16, v1 >>= 16, v2 >>= 16)
    {
      h1 = (int16_t)(v1 & 0xffff);
      h2 = (int16_t)(v2 & 0xffff);
      if (h1 == (int16_t)0x8000 && h2 == (int16_t)0x8000)
	{
	  DSPCR |= (1 << (DSPCR_OUFLAG_SHIFT + ac));
	  result = (int32_t)0x7fffffff;
	}
      else
	result = ((int32_t)h1 * (int32_t)h2) << 1;

      if (op == 0) // DPAQ
	prod += (int64_t)result;
      else // DPSQ
	prod -= (int64_t)result;
    }
  DSPLO(ac) = EXTEND32 (prod);
  DSPHI(ac) = EXTEND32 (prod >> 32);
}

011111,5.RS,5.RT,000,2.AC,00100,110000:SPECIAL3:32::DPAQ_S.W.PH
"dpaq_s.w.ph ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_ph_dot_product (SD_, AC, RS, RT, 0);
}

011111,5.RS,5.RT,000,2.AC,00101,110000:SPECIAL3:32::DPSQ_S.W.PH
"dpsq_s.w.ph ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_ph_dot_product (SD_, AC, RS, RT, 1);
}

011111,5.RS,5.RT,000,2.AC,00110,110000:SPECIAL3:32::MULSAQ_S.W.PH
"mulsaq_s.w.ph ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_mulsaq_s_w_ph (SD_, AC, RS, RT);
}

// op: 0 = DPAQ 1 = DPSQ
:function:::void:do_w_dot_product:int ac, int rs, int rt, int op
{
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  int32_t h1, h2;
  int64_t result;
  uint32_t lo = DSPLO(ac);
  uint32_t hi = DSPHI(ac);
  uint32_t resultlo;
  uint32_t resulthi;
  uint32_t carry;
  uint64_t temp1;
  int64_t temp2;
  h1 = (int32_t) v1;
  h2 = (int32_t) v2;
  if (h1 == 0x80000000 && h2 == 0x80000000)
    {
      DSPCR |= (1 << (DSPCR_OUFLAG_SHIFT + ac));
      result = (int64_t) 0x7fffffffffffffffLL;
    }
  else
    result = ((int64_t)h1 * (int64_t)h2) << 1;
  resultlo = (uint32_t)(result);
  resulthi = (uint32_t)(result >> 32);
  if (op ==0) // DPAQ
    {
      temp1 = (uint64_t)lo + (uint64_t)resultlo;
      carry = (uint32_t)((temp1 >> 32) & 1);
      temp2 = (int64_t)((int32_t)hi) + (int64_t)((int32_t)resulthi) +
	      (int64_t)((int32_t)carry);
    }
  else // DPSQ
    {
      temp1 = (uint64_t)lo - (uint64_t)resultlo;
      carry = (uint32_t)((temp1 >> 32) & 1);
      temp2 = (int64_t)((int32_t)hi) - (int64_t)((int32_t)resulthi) -
	      (int64_t)((int32_t)carry);
    }
  if (((temp2 & 0x100000000LL) >> 1) != (temp2 & 0x80000000LL))
    {
      DSPCR |= (1 << (DSPCR_OUFLAG_SHIFT + ac));
      if (temp2 & 0x100000000LL)
	{
	  DSPLO(ac) = EXTEND32 (0x00000000);
	  DSPHI(ac) = EXTEND32 (0x80000000);
	}
      else
	{
	  DSPLO(ac) = EXTEND32 (0xffffffff);
	  DSPHI(ac) = EXTEND32 (0x7fffffff);
	}
    }
  else
    {
      DSPLO(ac) = EXTEND32 (temp1);
      DSPHI(ac) = EXTEND32 (temp2);
    }
}

011111,5.RS,5.RT,000,2.AC,01100,110000:SPECIAL3:32::DPAQ_SA.L.W
"dpaq_sa.l.w ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_w_dot_product (SD_, AC, RS, RT, 0);
}

011111,5.RS,5.RT,000,2.AC,01101,110000:SPECIAL3:32::DPSQ_SA.L.W
"dpsq_sa.l.w ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_w_dot_product (SD_, AC, RS, RT, 1);
}

// op: 0 = MAQ_S 1 = MAQ_SA
// loc: 0 = phl, 1 = phr
:function:::void:do_ph_maq:int ac, int rs, int rt, int op, int loc
{
  int i;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  int16_t h1, h2;
  int32_t result;
  uint32_t lo = DSPLO(ac);
  uint32_t hi = DSPHI(ac);
  int64_t prod = (int64_t)((((uint64_t)hi) << 32) + (uint64_t)lo);
  if (loc == 0)
    {
      h1 = (int16_t)(v1 >> 16);
      h2 = (int16_t)(v2 >> 16);
    }
  else
    {
      h1 = (int16_t)(v1 & 0xffff);
      h2 = (int16_t)(v2 & 0xffff);
    }
  if (h1 == (int16_t)0x8000 && h2 == (int16_t)0x8000)
    {
      DSPCR |= (1 << (DSPCR_OUFLAG_SHIFT + ac));
      result = (int32_t)0x7fffffff;
    }
  else
    result = ((int32_t)h1 * (int32_t)h2) << 1;
  prod += (int64_t)result;
  if (op == 1) // MAQ_SA
    {
      if (prod & 0x8000000000000000LL)
	{
	  for (i = 62; i >= 31; i--)
	    {
	      if (!(prod & ((int64_t)1 << i)))
		{
		  DSPCR |= (1 << (DSPCR_OUFLAG_SHIFT + ac));
		  prod = 0xffffffff80000000LL;
		  break;
		}
	    }
	}
      else
	{
	  for (i = 62; i >= 31; i--)
	    {
	      if (prod & ((int64_t)1 << i))
		{
		  DSPCR |= (1 << (DSPCR_OUFLAG_SHIFT + ac));
		  prod = 0x7fffffff;
		  break;
		}
	    }
	}
    }
  DSPLO(ac) = EXTEND32 (prod);
  DSPHI(ac) = EXTEND32 (prod >> 32);
}

011111,5.RS,5.RT,000,2.AC,10100,110000:SPECIAL3:32::MAQ_S.W.PHL
"maq_s.w.phl ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_ph_maq (SD_, AC, RS, RT, 0, 0);
}

011111,5.RS,5.RT,000,2.AC,10110,110000:SPECIAL3:32::MAQ_S.W.PHR
"maq_s.w.phr ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_ph_maq (SD_, AC, RS, RT, 0, 1);
}

011111,5.RS,5.RT,000,2.AC,10000,110000:SPECIAL3:32::MAQ_SA.W.PHL
"maq_sa.w.phl ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_ph_maq (SD_, AC, RS, RT, 1, 0);
}

011111,5.RS,5.RT,000,2.AC,10010,110000:SPECIAL3:32::MAQ_SA.W.PHR
"maq_sa.w.phr ac<AC>, r<RS>, r<RT>"
*dsp:
{
  do_ph_maq (SD_, AC, RS, RT, 1, 1);
}

011111,00000,5.RT,5.RD,11011,010010:SPECIAL3:32::BITREV
"bitrev r<RD>, r<RT>"
*dsp:
{
  do_bitrev (SD_, RD, RT);
}

011111,5.RS,5.RT,00000,00000,001100:SPECIAL3:32::INSV
"insv r<RT>, r<RS>"
*dsp:
{
  do_insv (SD_, RT, RS);
}

011111,00,8.IMM8,5.RD,00010,010010:SPECIAL3:32::REPL.QB
"repl.qb r<RD>, <IMM8>"
*dsp:
{
  do_repl (SD_, RD, IMM8, 0);
}

011111,00000,5.RT,5.RD,00011,010010:SPECIAL3:32::REPLV.QB
"replv.qb r<RD>, r<RT>"
*dsp:
{
  do_repl (SD_, RD, RT, 1);
}

011111,10.IMM10,5.RD,01010,010010:SPECIAL3:32::REPL.PH
"repl.ph r<RD>, <IMM10>"
*dsp:
{
  do_repl (SD_, RD, IMM10, 2);
}

011111,00000,5.RT,5.RD,01011,010010:SPECIAL3:32::REPLV.PH
"replv.ph r<RD>, r<RT>"
*dsp:
{
  do_repl (SD_, RD, RT, 3);
}

// op: 0 = EQ, 1 = LT, 2 = LE
:function:::void:do_qb_cmpu:int rs, int rt, int op
{
  int i, j;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint8_t h1, h2;
  uint32_t mask;
  for (i = 0, j = 0; i < 32; i += 8, j++, v1 >>= 8, v2 >>= 8)
    {
      h1 = (uint8_t)(v1 & 0xff);
      h2 = (uint8_t)(v2 & 0xff);
      mask = ~(1 << (DSPCR_CCOND_SHIFT + j));
      DSPCR &= mask;
      if (op == 0) // EQ
	DSPCR |= ((h1 == h2) << (DSPCR_CCOND_SHIFT + j));
      else if (op == 1) // LT
	DSPCR |= ((h1 < h2) << (DSPCR_CCOND_SHIFT + j));
      else // LE
	DSPCR |= ((h1 <= h2) << (DSPCR_CCOND_SHIFT + j));
    }
}

011111,5.RS,5.RT,00000,00000,010001:SPECIAL3:32::CMPU.EQ.QB
"cmpu.eq.qb r<RS>, r<RT>"
*dsp:
{
  do_qb_cmpu (SD_, RS, RT, 0);
}

011111,5.RS,5.RT,00000,00001,010001:SPECIAL3:32::CMPU.LT.QB
"cmpu.lt.qb r<RS>, r<RT>"
*dsp:
{
  do_qb_cmpu (SD_, RS, RT, 1);
}

011111,5.RS,5.RT,00000,00010,010001:SPECIAL3:32::CMPU.LE.QB
"cmpu.le.qb r<RS>, r<RT>"
*dsp:
{
  do_qb_cmpu (SD_, RS, RT, 2);
}

// op: 0 = EQ, 1 = LT, 2 = LE
:function:::void:do_qb_cmpgu:int rd, int rs, int rt, int op
{
  int i, j;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  uint8_t h1, h2;
  uint32_t result = 0;
  for (i = 0, j = 0; i < 32; i += 8, j++, v1 >>= 8, v2 >>= 8)
    {
      h1 = (uint8_t)(v1 & 0xff);
      h2 = (uint8_t)(v2 & 0xff);
      if (op == 0) // EQ
	result |= ((h1 == h2) << j);
      else if (op == 1) // LT
	result |= ((h1 < h2) << j);
      else // LE
	result |= ((h1 <= h2) << j);
    }
  GPR[rd] = EXTEND32 (result);
}

011111,5.RS,5.RT,5.RD,00100,010001:SPECIAL3:32::CMPGU.EQ.QB
"cmpgu.eq.qb r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_qb_cmpgu (SD_, RD, RS, RT, 0);
}

011111,5.RS,5.RT,5.RD,00101,010001:SPECIAL3:32::CMPGU.LT.QB
"cmpgu.lt.qb r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_qb_cmpgu (SD_, RD, RS, RT, 1);
}

011111,5.RS,5.RT,5.RD,00110,010001:SPECIAL3:32::CMPGU.LE.QB
"cmpgu.le.qb r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_qb_cmpgu (SD_, RD, RS, RT, 2);
}

// op: 0 = EQ, 1 = LT, 2 = LE
:function:::void:do_ph_cmpu:int rs, int rt, int op
{
  int i, j;
  uint32_t v1 = GPR[rs];
  uint32_t v2 = GPR[rt];
  int16_t h1, h2;
  uint32_t mask;
  for (i = 0, j = 0; i < 32; i += 16, j++, v1 >>= 16, v2 >>= 16)
    {
      h1 = (int16_t)(v1 & 0xffff);
      h2 = (int16_t)(v2 & 0xffff);
      mask = ~(1 << (DSPCR_CCOND_SHIFT + j));
      DSPCR &= mask;
      if (op == 0) // EQ
	DSPCR |= ((h1 == h2) << (DSPCR_CCOND_SHIFT + j));
      else if (op == 1) // LT
	DSPCR |= ((h1 < h2) << (DSPCR_CCOND_SHIFT + j));
      else // LE
	DSPCR |= ((h1 <= h2) << (DSPCR_CCOND_SHIFT + j));
    }
}

011111,5.RS,5.RT,00000,01000,010001:SPECIAL3:32::CMP.EQ.PH
"cmp.eq.ph r<RS>, r<RT>"
*dsp:
{
  do_ph_cmpu (SD_, RS, RT, 0);
}

011111,5.RS,5.RT,00000,01001,010001:SPECIAL3:32::CMP.LT.PH
"cmp.lt.ph r<RS>, r<RT>"
*dsp:
{
  do_ph_cmpu (SD_, RS, RT, 1);
}

011111,5.RS,5.RT,00000,01010,010001:SPECIAL3:32::CMP.LE.PH
"cmp.le.ph r<RS>, r<RT>"
*dsp:
{
  do_ph_cmpu (SD_, RS, RT, 2);
}

011111,5.RS,5.RT,5.RD,00011,010001:SPECIAL3:32::PICK.QB
"pick.qb r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_qb_pick (SD_, RD, RS, RT);
}

011111,5.RS,5.RT,5.RD,01011,010001:SPECIAL3:32::PICK.PH
"pick.ph r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_pick (SD_, RD, RS, RT);
}

011111,5.RS,5.RT,5.RD,01110,010001:SPECIAL3:32::PACKRL.PH
"packrl.ph r<RD>, r<RS>, r<RT>"
*dsp:
{
  do_ph_packrl (SD_, RD, RS, RT);
}

// op: 0 = EXTR, 1 = EXTR_R, 2 = EXTR_RS
:function:::void:do_w_extr:int rt, int ac, int shift, int op
{
  int i;
  uint32_t lo = DSPLO(ac);
  uint32_t hi = DSPHI(ac);
  uint64_t prod = (((uint64_t)hi) << 32) + (uint64_t)lo;
  int64_t result = (int64_t)prod;
  int setcond = 0;
  if (!(prod & 0x8000000000000000LL))
    {
      for (i = 62; i >= (shift + 31); i--)
	{
	  if (prod & ((uint64_t)1 << i))
	    {
	      DSPCR |= DSPCR_OUFLAG7;
	      setcond = 1;
	      break;
	    }
	}
      if (((prod >> (shift - 1)) & 0xffffffffLL) == 0xffffffffLL)
	{
	  DSPCR |= DSPCR_OUFLAG7;
	  setcond = 1;
	}
    }
  else
    {
      for (i = 62; i >= (shift + 31); i--)
	{
	  if (!(prod & ((uint64_t)1 << i)))
	    {
	      DSPCR |= DSPCR_OUFLAG7;
	      setcond = 2;
	      break;
	    }
	}
    }
  if (op == 0) // EXTR
    result = result >> shift;
  else if (op == 1) // EXTR_R
    {
      if (shift != 0)
        result = ((result >> (shift - 1)) + 1) >> 1;
      else
	result = result >> shift;
    }
  else // EXTR_RS
    {
      if (setcond == 1)
	result = 0x7fffffff;
      else if (setcond == 2)
	result = 0x80000000;
      else
	{
	  if (shift != 0)
	    result = ((result >> (shift - 1)) + 1) >> 1;
	  else
	    result = result >> shift;
	}
    }
  GPR[rt] = EXTEND32 (result);
}

011111,5.SHIFT,5.RT,000,2.AC,00000,111000:SPECIAL3:32::EXTR.W
"extr.w r<RT>, ac<AC>, <SHIFT>"
*dsp:
{
  do_w_extr (SD_, RT, AC, SHIFT, 0);
}

011111,5.RS,5.RT,000,2.AC,00001,111000:SPECIAL3:32::EXTRV.W
"extrv.w r<RT>, ac<AC>, r<RS>"
*dsp:
{
  do_extrv (SD_, RT, AC, RS, 0);
}

011111,5.SHIFT,5.RT,000,2.AC,00100,111000:SPECIAL3:32::EXTR_R.W
"extr_r.w r<RT>, ac<AC>, <SHIFT>"
*dsp:
{
  do_w_extr (SD_, RT, AC, SHIFT, 1);
}

011111,5.RS,5.RT,000,2.AC,00101,111000:SPECIAL3:32::EXTRV_R.W
"extrv_r.w r<RT>, ac<AC>, r<RS>"
*dsp:
{
  do_extrv (SD_, RT, AC, RS, 1);
}

011111,5.SHIFT,5.RT,000,2.AC,00110,111000:SPECIAL3:32::EXTR_RS.W
"extr_rs.w r<RT>, ac<AC>, <SHIFT>"
*dsp:
{
  do_w_extr (SD_, RT, AC, SHIFT, 2);
}

011111,5.RS,5.RT,000,2.AC,00111,111000:SPECIAL3:32::EXTRV_RS.W
"extrv_rs.w r<RT>, ac<AC>, r<RS>"
*dsp:
{
  do_extrv (SD_, RT, AC, RS, 2);
}

:function:::void:do_h_extr:int rt, int ac, int shift
{
  uint32_t lo = DSPLO(ac);
  uint32_t hi = DSPHI(ac);
  uint64_t prod = (((uint64_t)hi) << 32) + (uint64_t)lo;
  int64_t result = (int64_t)prod;
  int64_t value = 0xffffffffffff8000LL;
  result >>= shift;
  if (result > 0x7fff)
    {
      result = 0x7fff;
      DSPCR |= DSPCR_OUFLAG7;
    }
  else if (result < value)
    {
      result = value;
      DSPCR |= DSPCR_OUFLAG7;
    }
  GPR[rt] = EXTEND32 (result);
}

011111,5.SHIFT,5.RT,000,2.AC,01110,111000:SPECIAL3:32::EXTR_S.H
"extr_s.h r<RT>, ac<AC>, <SHIFT>"
*dsp:
{
  do_h_extr (SD_, RT, AC, SHIFT);
}

011111,5.RS,5.RT,000,2.AC,01111,111000:SPECIAL3:32::EXTRV_S.H
"extrv_s.h r<RT>, ac<AC>, r<RS>"
*dsp:
{
  do_extrv_s_h (SD_, RT, AC, RS);
}

// op: 0 = EXTP, 1 = EXTPDP
:function:::void:do_extp:int rt, int ac, int size, int op
{
  int32_t pos = (DSPCR >> DSPCR_POS_SHIFT) & DSPCR_POS_MASK;
  uint32_t lo = DSPLO(ac);
  uint32_t hi = DSPHI(ac);
  uint64_t prod = (((uint64_t)hi) << 32) + (uint64_t)lo;
  uint64_t result = 0;
  if (pos - (size + 1) >= -1)
    {
      prod >>= (pos - size);
      result = prod & (((uint64_t)1 << (size + 1)) - 1);
      DSPCR &= (~DSPCR_EFI_SMASK);
      if (op == 1) // EXTPDP
	{
	  if (pos - (size + 1) >= 0)
	    {
	      DSPCR &= (~DSPCR_POS_SMASK);
	      DSPCR |= ((pos - (size + 1)) & DSPCR_POS_MASK) << DSPCR_POS_SHIFT;
	    }
	  else if (pos - (size + 1) == -1)
	    {
	      DSPCR |= DSPCR_POS_SMASK;
	    }
	}
    }
  else
    {
      DSPCR |= DSPCR_EFI;
      Unpredictable ();
    }
  GPR[rt] = EXTEND32 (result);
}

011111,5.SIZE,5.RT,000,2.AC,00010,111000:SPECIAL3:32::EXTP
"extp r<RT>, ac<AC>, <SIZE>"
*dsp:
{
  do_extp (SD_, RT, AC, SIZE, 0);
}

011111,5.RS,5.RT,000,2.AC,00011,111000:SPECIAL3:32::EXTPV
"extpv r<RT>, ac<AC>, r<RS>"
*dsp:
{
  do_extpv (SD_, RT, AC, RS, 0);
}

011111,5.SIZE,5.RT,000,2.AC,01010,111000:SPECIAL3:32::EXTPDP
"extpdp r<RT>, ac<AC>, <SIZE>"
*dsp:
{
  do_extp (SD_, RT, AC, SIZE, 1);
}

011111,5.RS,5.RT,000,2.AC,01011,111000:SPECIAL3:32::EXTPDPV
"extpdpv r<RT>, ac<AC>, r<RS>"
*dsp:
{
  do_extpv (SD_, RT, AC, RS, 1);
}

:function:::void:do_shilo:int ac, int shift
{
  uint32_t lo = DSPLO(ac);
  uint32_t hi = DSPHI(ac);
  uint64_t prod = (((uint64_t)hi) << 32) + (uint64_t)lo;
  if (shift > 31)
    shift = shift - 64;
  if (shift >= 0)
    prod >>= shift;
  else
    prod <<= (-shift);
  DSPLO(ac) = EXTEND32 (prod);
  DSPHI(ac) = EXTEND32 (prod >> 32);
}

011111,6.SHIFT6,0000,000,2.AC,11010,111000:SPECIAL3:32::SHILO
"shilo ac<AC>, <SHIFT6>"
*dsp:
{
  do_shilo (SD_, AC, SHIFT6);
}

011111,5.RS,00000,000,2.AC,11011,111000:SPECIAL3:32::SHILOV
"shilov ac<AC>, r<RS>"
*dsp:
{
  do_shilov (SD_, AC, RS);
}

011111,5.RS,00000,000,2.AC,11111,111000:SPECIAL3:32::MTHLIP
"mthlip r<RS>, ac<AC>"
*dsp:
{
  do_mthlip (SD_, RS, AC);
}

011111,5.RS,10.MASK10,10011,111000:SPECIAL3:32::WRDSP
"wrdsp r<RS>":MASK10 == 1111111111
"wrdsp r<RS>, <MASK10>"
*dsp:
{
  do_wrdsp (SD_, RS, MASK10);
}

011111,10.MASK10,5.RD,10010,111000:SPECIAL3:32::RDDSP
"rddsp r<RD>":MASK10 == 1111111111
"rddsp r<RD>, <MASK10>"
*dsp:
{
  do_rddsp (SD_, RD, MASK10);
}

011111,5.BASE,5.INDEX,5.RD,00110,001010:SPECIAL3:32::LBUX
"lbux r<RD>, r<INDEX>(r<BASE>)"
*dsp:
{
  do_lxx (SD_, RD, BASE, INDEX, 0);
}

011111,5.BASE,5.INDEX,5.RD,00100,001010:SPECIAL3:32::LHX
"lhx r<RD>, r<INDEX>(r<BASE>)"
*dsp:
{
  do_lxx (SD_, RD, BASE, INDEX, 1);
}

011111,5.BASE,5.INDEX,5.RD,00000,001010:SPECIAL3:32::LWX
"lwx r<RD>, r<INDEX>(r<BASE>)"
*dsp:
{
  do_lxx (SD_, RD, BASE, INDEX, 2);
}

000001,00000,11100,16.OFFSET:REGIMM:32::BPOSGE32
"bposge32 <OFFSET>"
*dsp:
{
  uint32_t pos = (DSPCR >> DSPCR_POS_SHIFT) & DSPCR_POS_MASK;
  address_word offset = EXTEND16 (OFFSET) << 2;
  if (pos >= 32)
    {
      DELAY_SLOT (NIA + offset);
    }
}
