// -*- C -*-
//
// Simulator definition for the SmartMIPS extensions.
// Copyright (C) 2005, 2010, 2012 Free Software Foundation, Inc.
// Contributed by Nigel Stephens (nigel@mips.com) and 
//                David Ung (davidu@mips.com) of MIPS Technologies.
//
// This file is part of GDB, the GNU debugger.
// 
// 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/>.

011100,5.BASE,5.INDEX,5.RD,00010,001000:SPECIAL:32::LWXS
"lwxs r<RD>, <INDEX>(r<BASE>)"
*smartmips:
{
  GPR[RD] = EXTEND32 (do_load(SD_, AccessLength_WORD, GPR[BASE], GPR[INDEX]<<2));
}

011100,5.RS,5.RT,00000,10001,000001:SPECIAL:32::MADDP
"maddp r<RS>, r<RT>"
*smartmips:
{
  unsigned64 res;
  unsigned64 rs, rt;
  int i;

  check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
  TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);

  res = 0;
  rs = GPR[RS];
  rt = GPR[RT];
  for (i = 0; i < 32; i++)
  {
      if (rs & 1)
	  res ^= rt;
      rs >>= 1;
      rt <<= 1;
  }
  LO ^= EXTEND32 (VL4_8 (res));
  HI ^= EXTEND32 (VH4_8 (res));
  TRACE_ALU_RESULT2 (HI, LO);
}


000000,0000000000,5.RD,00001,010010:SPECIAL:32::MFLHXU
"mflhxu r<RD>"
*smartmips:
{
  check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
  TRACE_ALU_INPUT3 (ACX,HI,LO);
  GPR[RD] = LO;
  LO = HI;
  HI = ACX;
  ACX = 0;
  TRACE_ALU_RESULT4 (ACX,HI,LO,GPR[RD]);
}

000000,5.RS,000000000000001,010011:SPECIAL:32::MTLHX
"mtlhx r<RS>"
*smartmips:
{
  check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
  TRACE_ALU_INPUT3 (HI,LO,GPR[RS]);
  ACX = HI;
  HI = LO;
  LO = GPR[RS];
  TRACE_ALU_RESULT4 (ACX,HI,LO,GPR[RS]);
}

000000,5.RS,5.RT,00000,10001,011001:SPECIAL:32::MULTP
"multp r<RS>, r<RT>"
*smartmips:
{
  unsigned64 res;
  unsigned64 rs, rt;
  int i;
  check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
  TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);

  res = 0;
  rs = GPR[RS];
  rt = GPR[RT];
  for (i = 0; i < 32; i++)
  {
      if (rs & 1)
	  res ^= rt;
      rs >>= 1;
      rt <<= 1;
  }
  LO = EXTEND32 (VL4_8 (res));
  HI = EXTEND32 (VH4_8 (res));
  ACX = 0;
  TRACE_ALU_RESULT2 (HI, LO);
}

011100,5.RS,5.RT,00000,10010,000001:SPECIAL:32::PPERM
"pperm r<RS>, r<RT>"
*smartmips:
{
  int i;
  ACX = (ACX << 6) | MSEXTRACTED(HI,26,31);
  HI = EXTEND32 ((HI << 6) | MSEXTRACTED(LO,26,31));
  LO = EXTEND32 (LO << 6);
  for (i = 0; i < 6; i++) {
    int sbit = 5*i;
    int ebit = sbit + 4;
    int tbit = EXTRACTED(GPR[RT],sbit,ebit);
    LO |= MSEXTRACTED(GPR[RS],tbit,tbit) << i;
  }
}
