using System;
using System.Diagnostics.CodeAnalysis;

namespace ARMeilleure.IntermediateRepresentation
{
    [Flags]
    enum Intrinsic : ushort
    {
        // X86 (SSE and AVX)

        X86Addpd,
        X86Addps,
        X86Addsd,
        X86Addss,
        X86Aesdec,
        X86Aesdeclast,
        X86Aesenc,
        X86Aesenclast,
        X86Aesimc,
        X86Andnpd,
        X86Andnps,
        X86Andpd,
        X86Andps,
        X86Blendvpd,
        X86Blendvps,
        X86Cmppd,
        X86Cmpps,
        X86Cmpsd,
        X86Cmpss,
        X86Comisdeq,
        X86Comisdge,
        X86Comisdlt,
        X86Comisseq,
        X86Comissge,
        X86Comisslt,
        X86Crc32,
        X86Crc32_16,
        X86Crc32_8,
        X86Cvtdq2pd,
        X86Cvtdq2ps,
        X86Cvtpd2dq,
        X86Cvtpd2ps,
        X86Cvtps2dq,
        X86Cvtps2pd,
        X86Cvtsd2si,
        X86Cvtsd2ss,
        X86Cvtsi2sd,
        X86Cvtsi2si,
        X86Cvtsi2ss,
        X86Cvtss2sd,
        X86Cvtss2si,
        X86Divpd,
        X86Divps,
        X86Divsd,
        X86Divss,
        X86Gf2p8affineqb,
        X86Haddpd,
        X86Haddps,
        X86Insertps,
        X86Ldmxcsr,
        X86Maxpd,
        X86Maxps,
        X86Maxsd,
        X86Maxss,
        X86Minpd,
        X86Minps,
        X86Minsd,
        X86Minss,
        X86Movhlps,
        X86Movlhps,
        X86Movss,
        X86Mulpd,
        X86Mulps,
        X86Mulsd,
        X86Mulss,
        X86Paddb,
        X86Paddd,
        X86Paddq,
        X86Paddw,
        X86Palignr,
        X86Pand,
        X86Pandn,
        X86Pavgb,
        X86Pavgw,
        X86Pblendvb,
        X86Pclmulqdq,
        X86Pcmpeqb,
        X86Pcmpeqd,
        X86Pcmpeqq,
        X86Pcmpeqw,
        X86Pcmpgtb,
        X86Pcmpgtd,
        X86Pcmpgtq,
        X86Pcmpgtw,
        X86Pmaxsb,
        X86Pmaxsd,
        X86Pmaxsw,
        X86Pmaxub,
        X86Pmaxud,
        X86Pmaxuw,
        X86Pminsb,
        X86Pminsd,
        X86Pminsw,
        X86Pminub,
        X86Pminud,
        X86Pminuw,
        X86Pmovsxbw,
        X86Pmovsxdq,
        X86Pmovsxwd,
        X86Pmovzxbw,
        X86Pmovzxdq,
        X86Pmovzxwd,
        X86Pmulld,
        X86Pmullw,
        X86Popcnt,
        X86Por,
        X86Pshufb,
        X86Pshufd,
        X86Pslld,
        X86Pslldq,
        X86Psllq,
        X86Psllw,
        X86Psrad,
        X86Psraw,
        X86Psrld,
        X86Psrlq,
        X86Psrldq,
        X86Psrlw,
        X86Psubb,
        X86Psubd,
        X86Psubq,
        X86Psubw,
        X86Punpckhbw,
        X86Punpckhdq,
        X86Punpckhqdq,
        X86Punpckhwd,
        X86Punpcklbw,
        X86Punpckldq,
        X86Punpcklqdq,
        X86Punpcklwd,
        X86Pxor,
        X86Rcpps,
        X86Rcpss,
        X86Roundpd,
        X86Roundps,
        X86Roundsd,
        X86Roundss,
        X86Rsqrtps,
        X86Rsqrtss,
        X86Sha256Msg1,
        X86Sha256Msg2,
        X86Sha256Rnds2,
        X86Shufpd,
        X86Shufps,
        X86Sqrtpd,
        X86Sqrtps,
        X86Sqrtsd,
        X86Sqrtss,
        X86Stmxcsr,
        X86Subpd,
        X86Subps,
        X86Subsd,
        X86Subss,
        X86Unpckhpd,
        X86Unpckhps,
        X86Unpcklpd,
        X86Unpcklps,
        X86Vcvtph2ps,
        X86Vcvtps2ph,
        X86Vfmadd231pd,
        X86Vfmadd231ps,
        X86Vfmadd231sd,
        X86Vfmadd231ss,
        X86Vfmsub231sd,
        X86Vfmsub231ss,
        X86Vfnmadd231pd,
        X86Vfnmadd231ps,
        X86Vfnmadd231sd,
        X86Vfnmadd231ss,
        X86Vfnmsub231sd,
        X86Vfnmsub231ss,
        X86Vpternlogd,
        X86Xorpd,
        X86Xorps,

        // Arm64 (FP and Advanced SIMD)

        Arm64AbsS,
        Arm64AbsV,
        Arm64AddhnV,
        Arm64AddpS,
        Arm64AddpV,
        Arm64AddvV,
        Arm64AddS,
        Arm64AddV,
        Arm64AesdV,
        Arm64AeseV,
        Arm64AesimcV,
        Arm64AesmcV,
        Arm64AndV,
        Arm64BicVi,
        Arm64BicV,
        Arm64BifV,
        Arm64BitV,
        Arm64BslV,
        Arm64ClsV,
        Arm64ClzV,
        Arm64CmeqS,
        Arm64CmeqV,
        Arm64CmeqSz,
        Arm64CmeqVz,
        Arm64CmgeS,
        Arm64CmgeV,
        Arm64CmgeSz,
        Arm64CmgeVz,
        Arm64CmgtS,
        Arm64CmgtV,
        Arm64CmgtSz,
        Arm64CmgtVz,
        Arm64CmhiS,
        Arm64CmhiV,
        Arm64CmhsS,
        Arm64CmhsV,
        Arm64CmleSz,
        Arm64CmleVz,
        Arm64CmltSz,
        Arm64CmltVz,
        Arm64CmtstS,
        Arm64CmtstV,
        Arm64CntV,
        Arm64DupSe,
        Arm64DupVe,
        Arm64DupGp,
        Arm64EorV,
        Arm64ExtV,
        Arm64FabdS,
        Arm64FabdV,
        Arm64FabsV,
        Arm64FabsS,
        Arm64FacgeS,
        Arm64FacgeV,
        Arm64FacgtS,
        Arm64FacgtV,
        Arm64FaddpS,
        Arm64FaddpV,
        Arm64FaddV,
        Arm64FaddS,
        Arm64FccmpeS,
        Arm64FccmpS,
        Arm64FcmeqS,
        Arm64FcmeqV,
        Arm64FcmeqSz,
        Arm64FcmeqVz,
        Arm64FcmgeS,
        Arm64FcmgeV,
        Arm64FcmgeSz,
        Arm64FcmgeVz,
        Arm64FcmgtS,
        Arm64FcmgtV,
        Arm64FcmgtSz,
        Arm64FcmgtVz,
        Arm64FcmleSz,
        Arm64FcmleVz,
        Arm64FcmltSz,
        Arm64FcmltVz,
        Arm64FcmpeS,
        Arm64FcmpS,
        Arm64FcselS,
        Arm64FcvtasS,
        Arm64FcvtasV,
        Arm64FcvtasGp,
        Arm64FcvtauS,
        Arm64FcvtauV,
        Arm64FcvtauGp,
        Arm64FcvtlV,
        Arm64FcvtmsS,
        Arm64FcvtmsV,
        Arm64FcvtmsGp,
        Arm64FcvtmuS,
        Arm64FcvtmuV,
        Arm64FcvtmuGp,
        Arm64FcvtnsS,
        Arm64FcvtnsV,
        Arm64FcvtnsGp,
        Arm64FcvtnuS,
        Arm64FcvtnuV,
        Arm64FcvtnuGp,
        Arm64FcvtnV,
        Arm64FcvtpsS,
        Arm64FcvtpsV,
        Arm64FcvtpsGp,
        Arm64FcvtpuS,
        Arm64FcvtpuV,
        Arm64FcvtpuGp,
        Arm64FcvtxnS,
        Arm64FcvtxnV,
        Arm64FcvtzsSFixed,
        Arm64FcvtzsVFixed,
        Arm64FcvtzsS,
        Arm64FcvtzsV,
        Arm64FcvtzsGpFixed,
        Arm64FcvtzsGp,
        Arm64FcvtzuSFixed,
        Arm64FcvtzuVFixed,
        Arm64FcvtzuS,
        Arm64FcvtzuV,
        Arm64FcvtzuGpFixed,
        Arm64FcvtzuGp,
        Arm64FcvtS,
        Arm64FdivV,
        Arm64FdivS,
        Arm64FmaddS,
        Arm64FmaxnmpS,
        Arm64FmaxnmpV,
        Arm64FmaxnmvV,
        Arm64FmaxnmV,
        Arm64FmaxnmS,
        Arm64FmaxpS,
        Arm64FmaxpV,
        Arm64FmaxvV,
        Arm64FmaxV,
        Arm64FmaxS,
        Arm64FminnmpS,
        Arm64FminnmpV,
        Arm64FminnmvV,
        Arm64FminnmV,
        Arm64FminnmS,
        Arm64FminpS,
        Arm64FminpV,
        Arm64FminvV,
        Arm64FminV,
        Arm64FminS,
        Arm64FmlaSe,
        Arm64FmlaVe,
        Arm64FmlaV,
        Arm64FmlsSe,
        Arm64FmlsVe,
        Arm64FmlsV,
        Arm64FmovVi,
        Arm64FmovS,
        Arm64FmovGp,
        Arm64FmovSi,
        Arm64FmsubS,
        Arm64FmulxSe,
        Arm64FmulxVe,
        Arm64FmulxS,
        Arm64FmulxV,
        Arm64FmulSe,
        Arm64FmulVe,
        Arm64FmulV,
        Arm64FmulS,
        Arm64FnegV,
        Arm64FnegS,
        Arm64FnmaddS,
        Arm64FnmsubS,
        Arm64FnmulS,
        Arm64FrecpeS,
        Arm64FrecpeV,
        Arm64FrecpsS,
        Arm64FrecpsV,
        Arm64FrecpxS,
        Arm64FrintaV,
        Arm64FrintaS,
        Arm64FrintiV,
        Arm64FrintiS,
        Arm64FrintmV,
        Arm64FrintmS,
        Arm64FrintnV,
        Arm64FrintnS,
        Arm64FrintpV,
        Arm64FrintpS,
        Arm64FrintxV,
        Arm64FrintxS,
        Arm64FrintzV,
        Arm64FrintzS,
        Arm64FrsqrteS,
        Arm64FrsqrteV,
        Arm64FrsqrtsS,
        Arm64FrsqrtsV,
        Arm64FsqrtV,
        Arm64FsqrtS,
        Arm64FsubV,
        Arm64FsubS,
        Arm64InsVe,
        Arm64InsGp,
        Arm64Ld1rV,
        Arm64Ld1Vms,
        Arm64Ld1Vss,
        Arm64Ld2rV,
        Arm64Ld2Vms,
        Arm64Ld2Vss,
        Arm64Ld3rV,
        Arm64Ld3Vms,
        Arm64Ld3Vss,
        Arm64Ld4rV,
        Arm64Ld4Vms,
        Arm64Ld4Vss,
        Arm64MlaVe,
        Arm64MlaV,
        Arm64MlsVe,
        Arm64MlsV,
        Arm64MoviV,
        Arm64MrsFpcr,
        Arm64MsrFpcr,
        Arm64MrsFpsr,
        Arm64MsrFpsr,
        Arm64MulVe,
        Arm64MulV,
        Arm64MvniV,
        Arm64NegS,
        Arm64NegV,
        Arm64NotV,
        Arm64OrnV,
        Arm64OrrVi,
        Arm64OrrV,
        Arm64PmullV,
        Arm64PmulV,
        Arm64RaddhnV,
        Arm64RbitV,
        Arm64Rev16V,
        Arm64Rev32V,
        Arm64Rev64V,
        Arm64RshrnV,
        Arm64RsubhnV,
        Arm64SabalV,
        Arm64SabaV,
        Arm64SabdlV,
        Arm64SabdV,
        Arm64SadalpV,
        Arm64SaddlpV,
        Arm64SaddlvV,
        Arm64SaddlV,
        Arm64SaddwV,
        Arm64ScvtfSFixed,
        Arm64ScvtfVFixed,
        Arm64ScvtfS,
        Arm64ScvtfV,
        Arm64ScvtfGpFixed,
        Arm64ScvtfGp,
        Arm64Sha1cV,
        Arm64Sha1hV,
        Arm64Sha1mV,
        Arm64Sha1pV,
        Arm64Sha1su0V,
        Arm64Sha1su1V,
        Arm64Sha256h2V,
        Arm64Sha256hV,
        Arm64Sha256su0V,
        Arm64Sha256su1V,
        Arm64ShaddV,
        Arm64ShllV,
        Arm64ShlS,
        Arm64ShlV,
        Arm64ShrnV,
        Arm64ShsubV,
        Arm64SliS,
        Arm64SliV,
        Arm64SmaxpV,
        Arm64SmaxvV,
        Arm64SmaxV,
        Arm64SminpV,
        Arm64SminvV,
        Arm64SminV,
        Arm64SmlalVe,
        Arm64SmlalV,
        Arm64SmlslVe,
        Arm64SmlslV,
        Arm64SmovV,
        Arm64SmullVe,
        Arm64SmullV,
        Arm64SqabsS,
        Arm64SqabsV,
        Arm64SqaddS,
        Arm64SqaddV,
        Arm64SqdmlalSe,
        Arm64SqdmlalVe,
        Arm64SqdmlalS,
        Arm64SqdmlalV,
        Arm64SqdmlslSe,
        Arm64SqdmlslVe,
        Arm64SqdmlslS,
        Arm64SqdmlslV,
        Arm64SqdmulhSe,
        Arm64SqdmulhVe,
        Arm64SqdmulhS,
        Arm64SqdmulhV,
        Arm64SqdmullSe,
        Arm64SqdmullVe,
        Arm64SqdmullS,
        Arm64SqdmullV,
        Arm64SqnegS,
        Arm64SqnegV,
        Arm64SqrdmulhSe,
        Arm64SqrdmulhVe,
        Arm64SqrdmulhS,
        Arm64SqrdmulhV,
        Arm64SqrshlS,
        Arm64SqrshlV,
        Arm64SqrshrnS,
        Arm64SqrshrnV,
        Arm64SqrshrunS,
        Arm64SqrshrunV,
        Arm64SqshluS,
        Arm64SqshluV,
        Arm64SqshlSi,
        Arm64SqshlVi,
        Arm64SqshlS,
        Arm64SqshlV,
        Arm64SqshrnS,
        Arm64SqshrnV,
        Arm64SqshrunS,
        Arm64SqshrunV,
        Arm64SqsubS,
        Arm64SqsubV,
        Arm64SqxtnS,
        Arm64SqxtnV,
        Arm64SqxtunS,
        Arm64SqxtunV,
        Arm64SrhaddV,
        Arm64SriS,
        Arm64SriV,
        Arm64SrshlS,
        Arm64SrshlV,
        Arm64SrshrS,
        Arm64SrshrV,
        Arm64SrsraS,
        Arm64SrsraV,
        Arm64SshllV,
        Arm64SshlS,
        Arm64SshlV,
        Arm64SshrS,
        Arm64SshrV,
        Arm64SsraS,
        Arm64SsraV,
        Arm64SsublV,
        Arm64SsubwV,
        Arm64St1Vms,
        Arm64St1Vss,
        Arm64St2Vms,
        Arm64St2Vss,
        Arm64St3Vms,
        Arm64St3Vss,
        Arm64St4Vms,
        Arm64St4Vss,
        Arm64SubhnV,
        Arm64SubS,
        Arm64SubV,
        Arm64SuqaddS,
        Arm64SuqaddV,
        Arm64TblV,
        Arm64TbxV,
        Arm64Trn1V,
        Arm64Trn2V,
        Arm64UabalV,
        Arm64UabaV,
        Arm64UabdlV,
        Arm64UabdV,
        Arm64UadalpV,
        Arm64UaddlpV,
        Arm64UaddlvV,
        Arm64UaddlV,
        Arm64UaddwV,
        Arm64UcvtfSFixed,
        Arm64UcvtfVFixed,
        Arm64UcvtfS,
        Arm64UcvtfV,
        Arm64UcvtfGpFixed,
        Arm64UcvtfGp,
        Arm64UhaddV,
        Arm64UhsubV,
        Arm64UmaxpV,
        Arm64UmaxvV,
        Arm64UmaxV,
        Arm64UminpV,
        Arm64UminvV,
        Arm64UminV,
        Arm64UmlalVe,
        Arm64UmlalV,
        Arm64UmlslVe,
        Arm64UmlslV,
        Arm64UmovV,
        Arm64UmullVe,
        Arm64UmullV,
        Arm64UqaddS,
        Arm64UqaddV,
        Arm64UqrshlS,
        Arm64UqrshlV,
        Arm64UqrshrnS,
        Arm64UqrshrnV,
        Arm64UqshlSi,
        Arm64UqshlVi,
        Arm64UqshlS,
        Arm64UqshlV,
        Arm64UqshrnS,
        Arm64UqshrnV,
        Arm64UqsubS,
        Arm64UqsubV,
        Arm64UqxtnS,
        Arm64UqxtnV,
        Arm64UrecpeV,
        Arm64UrhaddV,
        Arm64UrshlS,
        Arm64UrshlV,
        Arm64UrshrS,
        Arm64UrshrV,
        Arm64UrsqrteV,
        Arm64UrsraS,
        Arm64UrsraV,
        Arm64UshllV,
        Arm64UshlS,
        Arm64UshlV,
        Arm64UshrS,
        Arm64UshrV,
        Arm64UsqaddS,
        Arm64UsqaddV,
        Arm64UsraS,
        Arm64UsraV,
        Arm64UsublV,
        Arm64UsubwV,
        Arm64Uzp1V,
        Arm64Uzp2V,
        Arm64XtnV,
        Arm64Zip1V,
        Arm64Zip2V,

        Arm64VTypeShift = 13,
        Arm64VTypeMask = 1 << Arm64VTypeShift,
        Arm64V64 = 0 << Arm64VTypeShift,
        Arm64V128 = 1 << Arm64VTypeShift,

        Arm64VSizeShift = 14,
        Arm64VSizeMask = 3 << Arm64VSizeShift,
        Arm64VFloat = 0 << Arm64VSizeShift,
        Arm64VDouble = 1 << Arm64VSizeShift,
        Arm64VByte = 0 << Arm64VSizeShift,
        Arm64VHWord = 1 << Arm64VSizeShift,
        Arm64VWord = 2 << Arm64VSizeShift,
        Arm64VDWord = 3 << Arm64VSizeShift,
    }
}
