// -*- C -*-

// Simulator definition for the MIPS MDMX ASE.
// Copyright (C) 2002-2022 Free Software Foundation, Inc.
// Contributed by Ed Satterthwaite and Chris Demetriou, of Broadcom
// Corporation (SiByte).
//
// 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/>.

//  Reference: MIPS64 Architecture Volume IV-b:
//             The MDMX Application-Specific Extension

//  Notes on "format selectors" (FMTSEL):
//
//   A selector with final bit 0 indicates OB format.
//   A selector with final bits 01 indicates QH format.
//   A selector with final bits 11 has UNPREDICTABLE result per the spec.
//
//  Similarly, for the single-bit fields which differentiate between
//  formats (FMTOP), 0 is OB format and 1 is QH format.

//  If you change this file to add instructions, please make sure that model
//  "sb1" configurations still build, and that you've added no new
//  instructions to the "sb1" model.


// Helper:
//
// Check whether MDMX is usable, and if not signal an appropriate exception.
//

:function:::void:check_mdmx:instruction_word insn
*mdmx:
{
  if (! COP_Usable (1))
    SignalExceptionCoProcessorUnusable (1);
  if ((SR & (status_MX|status_FR)) != (status_MX|status_FR))
    SignalExceptionMDMX ();
  check_u64 (SD_, insn);
}


// Helper:
//
// Check whether a given MDMX format selector indicates a valid and usable
// format, and if not signal an appropriate exception.
//

:function:::int:check_mdmx_fmtsel:instruction_word insn, int fmtsel
*mdmx:
{
  switch (fmtsel & 0x03)
    {
    case 0x00:     /* ob */
    case 0x02:
    case 0x01:     /* qh */
      return 1;
    case 0x03:     /* UNPREDICTABLE */
      SignalException (ReservedInstruction, insn);
      return 0;
    }
  return 0;
}


// Helper:
//
// Check whether a given MDMX format bit indicates a valid and usable
// format, and if not signal an appropriate exception.
//

:function:::int:check_mdmx_fmtop:instruction_word insn, int fmtop
*mdmx:
{
  switch (fmtop & 0x01)
    {
    case 0x00:     /* ob */
    case 0x01:     /* qh */
      return 1;
    }
  return 0;
}


:%s::::FMTSEL:int fmtsel
*mdmx:
*sb1:
{
  if ((fmtsel & 0x1) == 0)
    return "ob";
  else if ((fmtsel & 0x3) == 1)
    return "qh";
  else
    return "?";
}


:%s::::FMTOP:int fmtop
*mdmx:
*sb1:
{
  switch (fmtop)
    {
    case 0: return "ob";
    case 1: return "qh";
    default: return "?";
    }
}


:%s::::SHOP:int shop
*mdmx:
*sb1:
{
  if ((shop & 0x11) == 0x00)
    switch ((shop >> 1) & 0x07)
      {
      case 3:  return "upsl.ob";
      case 4:  return "pach.ob";
      case 6:  return "mixh.ob";
      case 7:  return "mixl.ob";
      default: return "?";
      }
  else if ((shop & 0x03) == 0x01)
    switch ((shop >> 2) & 0x07)
      {
      case 0:  return "mixh.qh";
      case 1:  return "mixl.qh";
      case 2:  return "pach.qh";
      case 4:  return "bfla.qh";
      case 6:  return "repa.qh";
      case 7:  return "repb.qh";
      default: return "?";
      }
  else
    return "?";
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,001011:MDMX:64::ADD.fmt
"add.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_Add(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,5.FMTSEL,5.VT,5.VS,0,0000,110111:MDMX:64::ADDA.fmt
"adda.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_AddA(ValueFPR(VS,fmt_mdmx),VT,FMTSEL);
}


011110,5.FMTSEL,5.VT,5.VS,1,0000,110111:MDMX:64::ADDL.fmt
"addl.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_AddL(ValueFPR(VS,fmt_mdmx),VT,FMTSEL);
}


011110,00,3.IMM,5.VT,5.VS,5.VD,0110,1.FMTOP,0:MDMX:64::ALNI.fmt
"alni.%s<FMTOP> v<VD>, v<VS>, v<VT>, <IMM>"
*mdmx:
*sb1:
{
  uint64_t result;
  int s;
  check_mdmx (SD_, instruction_0);
  check_mdmx_fmtop (SD_, instruction_0, FMTOP);
  s = (IMM << 3);
  result = ValueFPR(VS,fmt_mdmx) << s;
  if (s != 0)  // x86 gcc treats >> 64 as >> 0
    result |= ValueFPR(VT,fmt_mdmx) >> (64 - s);
  StoreFPR(VD,fmt_mdmx,result);
}


011110,5.RS,5.VT,5.VS,5.VD,0110,1.FMTOP,1:MDMX:64::ALNV.fmt
"alnv.%s<FMTOP> v<VD>, v<VS>, v<VT>, r<RS>"
*mdmx:
*sb1:
{
  uint64_t result;
  int s;
  check_mdmx (SD_, instruction_0);
  check_mdmx_fmtop (SD_, instruction_0, FMTOP);
  s = ((GPR[RS] & 0x7) << 3);
  result = ValueFPR(VS,fmt_mdmx) << s;
  if (s != 0)  // x86 gcc treats >> 64 as >> 0
    result |= ValueFPR(VT,fmt_mdmx) >> (64 - s);
  StoreFPR(VD,fmt_mdmx,result);
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,001100:MDMX:64::AND.fmt
"and.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_And(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,5.FMTSEL,5.VT,5.VS,00000,000001:MDMX:64::C.EQ.fmt
"c.eq.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_Comp(ValueFPR(VS,fmt_mdmx),MX_C_EQ,VT,FMTSEL);
}


011110,5.FMTSEL,5.VT,5.VS,00000,000101:MDMX:64::C.LE.fmt
"c.le.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_Comp(ValueFPR(VS,fmt_mdmx),MX_C_LT|MX_C_EQ,VT,FMTSEL);
}


011110,5.FMTSEL,5.VT,5.VS,00000,000100:MDMX:64::C.LT.fmt
"c.lt.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_Comp(ValueFPR(VS,fmt_mdmx),MX_C_LT,VT,FMTSEL);
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,000111:MDMX:64::MAX.fmt
"max.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_Max(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,000110:MDMX:64::MIN.fmt
"min.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_Min(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,3.SEL,01,5.VT,5.VS,5.VD,000000:MDMX:64::MSGN.QH
"msgn.qh v<VD>, v<VS>, v<VT>"
*mdmx:
{
  check_mdmx (SD_, instruction_0);
  StoreFPR(VD,fmt_mdmx,MX_Msgn(ValueFPR(VS,fmt_mdmx),VT,qh_fmtsel(SEL)));
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,110000:MDMX:64::MUL.fmt
"mul.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_Mul(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,5.FMTSEL,5.VT,5.VS,0,0000,110011:MDMX:64::MULA.fmt
"mula.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_MulA(ValueFPR(VS,fmt_mdmx),VT,FMTSEL);
}


011110,5.FMTSEL,5.VT,5.VS,1,0000,110011:MDMX:64::MULL.fmt
"mull.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_MulL(ValueFPR(VS,fmt_mdmx),VT,FMTSEL);
}


011110,5.FMTSEL,5.VT,5.VS,0,0000,110010:MDMX:64::MULS.fmt
"muls.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_MulS(ValueFPR(VS,fmt_mdmx),VT,FMTSEL);
}


011110,5.FMTSEL,5.VT,5.VS,1,0000,110010:MDMX:64::MULSL.fmt
"mulsl.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_MulSL(ValueFPR(VS,fmt_mdmx),VT,FMTSEL);
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,001111:MDMX:64::NOR.fmt
"nor.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_Nor(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,001110:MDMX:64::OR.fmt
"or.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_Or(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,000010:MDMX:64::PICKF.fmt
"pickf.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_Pick(0,ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,000011:MDMX:64::PICKT.fmt
"pickt.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_Pick(1,ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,1000,1.FMTOP,00000,00000,5.VD,111111:MDMX:64::RACH.fmt
"rach.%s<FMTOP> v<VD>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  check_mdmx_fmtop (SD_, instruction_0, FMTOP);
  StoreFPR(VD,fmt_mdmx,MX_RAC(MX_RAC_H,FMTOP));
}


011110,0000,1.FMTOP,00000,00000,5.VD,111111:MDMX:64::RACL.fmt
"racl.%s<FMTOP> v<VD>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  check_mdmx_fmtop (SD_, instruction_0, FMTOP);
  StoreFPR(VD,fmt_mdmx,MX_RAC(MX_RAC_L,FMTOP));
}


011110,0100,1.FMTOP,00000,00000,5.VD,111111:MDMX:64::RACM.fmt
"racm.%s<FMTOP> v<VD>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  check_mdmx_fmtop (SD_, instruction_0, FMTOP);
  StoreFPR(VD,fmt_mdmx,MX_RAC(MX_RAC_M,FMTOP));
}


011110,3.SEL,01,5.VT,00000,5.VD,100101:MDMX:64::RNAS.QH
"rnas.qh v<VD>, v<VT>"
*mdmx:
{
  check_mdmx (SD_, instruction_0);
  StoreFPR(VD,fmt_mdmx,MX_RNAS(VT,qh_fmtsel(SEL)));
}


011110,5.FMTSEL,5.VT,00000,5.VD,100001:MDMX:64::RNAU.fmt
"rnau.%s<FMTSEL> v<VD>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_RNAU(VT,FMTSEL));
}


011110,3.SEL,01,5.VT,00000,5.VD,100110:MDMX:64::RNES.QH
"rnes.qh v<VD>, v<VT>"
*mdmx:
{
  check_mdmx (SD_, instruction_0);
  StoreFPR(VD,fmt_mdmx,MX_RNES(VT,qh_fmtsel(SEL)));
}


011110,5.FMTSEL,5.VT,00000,5.VD,100010:MDMX:64::RNEU.fmt
"rneu.%s<FMTSEL> v<VD>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_RNEU(VT,FMTSEL));
}


011110,3.SEL,01,5.VT,00000,5.VD,100100:MDMX:64::RZS.QH
"rzs.qh v<VD>, v<VT>"
*mdmx:
{
  check_mdmx (SD_, instruction_0);
  StoreFPR(VD,fmt_mdmx,MX_RZS(VT,qh_fmtsel(SEL)));
}


011110,5.FMTSEL,5.VT,00000,5.VD,100000:MDMX:64::RZU.fmt
"rzu.%s<FMTSEL> v<VD>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_RZU(VT,FMTSEL));
}


011110,5.SHOP,5.VT,5.VS,5.VD,011111:MDMX:64::SHFL.op.fmt
"shfl.%s<SHOP> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, SHOP))
    StoreFPR(VD,fmt_mdmx,MX_SHFL(SHOP,ValueFPR(VS,fmt_mdmx),ValueFPR(VT,fmt_mdmx)));
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,010000:MDMX:64::SLL.fmt
"sll.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_ShiftLeftLogical(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,3.SEL,01,5.VT,5.VS,5.VD,010011:MDMX:64::SRA.QH
"sra.qh v<VD>, v<VS>, v<VT>"
*mdmx:
{
  check_mdmx (SD_, instruction_0);
  StoreFPR(VD,fmt_mdmx,MX_ShiftRightArith(ValueFPR(VS,fmt_mdmx),VT,qh_fmtsel(SEL)));
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,010010:MDMX:64::SRL.fmt
"srl.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_ShiftRightLogical(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,001010:MDMX:64::SUB.fmt
"sub.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_Sub(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}


011110,5.FMTSEL,5.VT,5.VS,0,0000,110110:MDMX:64::SUBA.fmt
"suba.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_SubA(ValueFPR(VS,fmt_mdmx),VT,FMTSEL);
}


011110,5.FMTSEL,5.VT,5.VS,1,0000,110110:MDMX:64::SUBL.fmt
"subl.%s<FMTSEL> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    MX_SubL(ValueFPR(VS,fmt_mdmx),VT,FMTSEL);
}


011110,1000,1.FMTOP,00000,5.VS,00000,111110:MDMX:64::WACH.fmt
"wach.%s<FMTOP> v<VS>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  check_mdmx_fmtop (SD_, instruction_0, FMTOP);
  MX_WACH(FMTOP,ValueFPR(VS,fmt_mdmx));
}


011110,0000,1.FMTOP,5.VT,5.VS,00000,111110:MDMX:64::WACL.fmt
"wacl.%s<FMTOP> v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  check_mdmx_fmtop (SD_, instruction_0, FMTOP);
  MX_WACL(FMTOP,ValueFPR(VS,fmt_mdmx),ValueFPR(VT,fmt_mdmx));
}


011110,5.FMTSEL,5.VT,5.VS,5.VD,001101:MDMX:64::XOR.fmt
"xor.%s<FMTSEL> v<VD>, v<VS>, v<VT>"
*mdmx:
*sb1:
{
  check_mdmx (SD_, instruction_0);
  if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL))
    StoreFPR(VD,fmt_mdmx,MX_Xor(ValueFPR(VS,fmt_mdmx),VT,FMTSEL));
}
