// -*- C -*-
//
// Simulator definition for the SmartMIPS extensions.
// Copyright (C) 2005 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 2, or (at your option)
// any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

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;
  }
}
