// -*- C -*-
//
// Simulator definition for the SmartMIPS extensions.
// Copyright (C) 2005-2024 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:
{
  uint64_t res;
  uint64_t 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:
{
  uint64_t res;
  uint64_t 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;
  }
}
