//==- HexagonInstrFormatsV60.td - Hexagon Instruction Formats -*- tablegen -==//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file describes the Hexagon V60 instruction classes in TableGen format.
//
//===----------------------------------------------------------------------===//

//----------------------------------------------------------------------------//
//                         Hexagon Intruction Flags +
//
//                        *** Must match BaseInfo.h ***
//----------------------------------------------------------------------------//

def TypeCVI_VA         : IType<13>;
def TypeCVI_VA_DV      : IType<14>;
def TypeCVI_VX         : IType<15>;
def TypeCVI_VX_DV      : IType<16>;
def TypeCVI_VP         : IType<17>;
def TypeCVI_VP_VS      : IType<18>;
def TypeCVI_VS         : IType<19>;
def TypeCVI_VINLANESAT : IType<20>;
def TypeCVI_VM_LD      : IType<21>;
def TypeCVI_VM_TMP_LD  : IType<22>;
def TypeCVI_VM_CUR_LD  : IType<23>;
def TypeCVI_VM_VP_LDU  : IType<24>;
def TypeCVI_VM_ST      : IType<25>;
def TypeCVI_VM_NEW_ST  : IType<26>;
def TypeCVI_VM_STU     : IType<27>;
def TypeCVI_HIST       : IType<28>;
//----------------------------------------------------------------------------//
//                         Intruction Classes Definitions +
//----------------------------------------------------------------------------//

let validSubTargets = HasV60SubT in
{
class CVI_VA_Resource<dag outs, dag ins, string asmstr,
                       list<dag> pattern = [], string cstr = "",
                       InstrItinClass itin = CVI_VA>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VA>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VA_DV_Resource<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VA_DV>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VA_DV>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VX_Resource_long<dag outs, dag ins, string asmstr,
                       list<dag> pattern = [], string cstr = "",
                       InstrItinClass itin = CVI_VX_LONG>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VX>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VX_Resource_late<dag outs, dag ins, string asmstr,
                       list<dag> pattern = [], string cstr = "",
                       InstrItinClass itin = CVI_VX_LATE>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VX>,
     Requires<[HasV60T, UseHVX]>;

class CVI_VX_Resource<dag outs, dag ins, string asmstr,
                       list<dag> pattern = [], string cstr = "",
                       InstrItinClass itin = CVI_VX>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VX>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VX_DV_Resource<dag outs, dag ins, string asmstr,
                       list<dag> pattern = [], string cstr = "",
                       InstrItinClass itin = CVI_VX_DV>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VX_DV>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VX_DV_Slot2_Resource<dag outs, dag ins, string asmstr,
                       list<dag> pattern = [], string cstr = "",
                       InstrItinClass itin = CVI_VX_DV_SLOT2>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VX_DV>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VX_DV_Resource_long<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VX_DV_LONG>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VX_DV>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VP_Resource_long<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VP_LONG>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VP>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VP_VS_Resource_early<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VP_VS_EARLY>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VP_VS>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VP_VS_Resource_long<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VP_VS_LONG>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VP_VS>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VP_VS_Resource_long_early<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VP_VS_LONG_EARLY>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VP_VS>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VS_Resource<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VS>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VS>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VINLANESAT_Resource<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VINLANESAT>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VINLANESAT>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VS_Resource_long<dag outs, dag ins, string asmstr,
                           list<dag> pattern = [], string cstr = "",
                           InstrItinClass itin = CVI_VS>
  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VS>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_LD_Resource<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VM_LD>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_LD>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_LD_Resource_long<dag outs, dag ins, string asmstr,
                              list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VM_LD>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_LD>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_TMP_LD_Resource<dag outs, dag ins, string asmstr,
                             list<dag> pattern = [], string cstr = "",
                             InstrItinClass itin = CVI_VM_TMP_LD>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_TMP_LD>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_TMP_LD_Resource_long<dag outs, dag ins, string asmstr,
                                  list<dag> pattern = [], string cstr = "",
                                  InstrItinClass itin = CVI_VM_TMP_LD>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_TMP_LD>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_CUR_LD_Resource<dag outs, dag ins, string asmstr,
                             list<dag> pattern = [], string cstr = "",
                             InstrItinClass itin = CVI_VM_CUR_LD>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_CUR_LD>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_VP_LDU_Resource<dag outs, dag ins, string asmstr,
                             list<dag> pattern = [], string cstr = "",
                             InstrItinClass itin = CVI_VM_VP_LDU>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_VP_LDU>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_VP_LDU_Resource_long<dag outs, dag ins, string asmstr,
                                  list<dag> pattern = [], string cstr = "",
                                  InstrItinClass itin = CVI_VM_VP_LDU>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_VP_LDU>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_ST_Resource<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VM_ST>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_ST>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_ST_Resource_long<dag outs, dag ins, string asmstr,
                              list<dag> pattern = [], string cstr = "",
                              InstrItinClass itin = CVI_VM_ST>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_ST>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_NEW_ST_Resource<dag outs, dag ins, string asmstr,
                             list<dag> pattern = [], string cstr = "",
                             InstrItinClass itin = CVI_VM_NEW_ST>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_NEW_ST>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_NEW_ST_Resource_long<dag outs, dag ins, string asmstr,
                                  list<dag> pattern = [], string cstr = "",
                                  InstrItinClass itin = CVI_VM_NEW_ST>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_NEW_ST>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_STU_Resource<dag outs, dag ins, string asmstr,
                          list<dag> pattern = [], string cstr = "",
                          InstrItinClass itin = CVI_VM_STU>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_STU>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_VM_STU_Resource_long<dag outs, dag ins, string asmstr,
                               list<dag> pattern = [], string cstr = "",
                               InstrItinClass itin = CVI_VM_STU>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VM_STU>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;

class CVI_HIST_Resource<dag outs, dag ins, string asmstr,
                        list<dag> pattern = [], string cstr = "",
                        InstrItinClass itin = CVI_HIST>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_HIST>,
     OpcodeHexagon, Requires<[HasV60T, UseHVX]>;
}

let validSubTargets = HasV60SubT in
{
class CVI_VA_Resource1<dag outs, dag ins, string asmstr,
                       list<dag> pattern = [], string cstr = "",
                       InstrItinClass itin = CVI_VA>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VA>,
     Requires<[HasV60T, UseHVX]>;

class CVI_VX_DV_Resource1<dag outs, dag ins, string asmstr,
                         list<dag> pattern = [], string cstr = "",
                         InstrItinClass itin = CVI_VX_DV>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_VX_DV>,
     Requires<[HasV60T, UseHVX]>;

class CVI_HIST_Resource1<dag outs, dag ins, string asmstr,
                        list<dag> pattern = [], string cstr = "",
                        InstrItinClass itin = CVI_HIST>
   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCVI_HIST>,
     Requires<[HasV60T, UseHVX]>;
}