// -*- C -*-

// Simulator definition for the MIPS MDMX ASE.
// Copyright (C) 2002 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:
{
  unsigned64 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:
{
  unsigned64 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));
}
