llvm-project/llvm/lib/Target/PowerPC/P9InstrResources.td

809 lines
13 KiB
TableGen
Raw Normal View History

//===- P9InstrResources.td - P9 Instruction Resource Defs -*- tablegen -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines resources required by some of P9 instruction. This is part
// P9 processor model used for instruction scheduling. Not every instruction
// is listed here. Instructions in this file belong to itinerary classes that
// have instructions with different resource requirements.
//
//===----------------------------------------------------------------------===//
def : InstRW<[P9_ALUE_2C, P9_ALUO_2C, IP_EXECE_1C, IP_EXECO_1C,
DISP_1C, DISP_1C],
(instrs
VADDCUW,
VADDUBM,
VADDUDM,
VADDUHM,
VADDUWM,
VAND,
VANDC,
VCMPEQUB,
VCMPEQUBo,
VCMPEQUD,
VCMPEQUDo,
VCMPEQUH,
VCMPEQUHo,
VCMPEQUW,
VCMPEQUWo,
VCMPGTSB,
VCMPGTSBo,
VCMPGTSD,
VCMPGTSDo,
VCMPGTSH,
VCMPGTSHo,
VCMPGTSW,
VCMPGTSWo,
VCMPGTUB,
VCMPGTUBo,
VCMPGTUD,
VCMPGTUDo,
VCMPGTUH,
VCMPGTUHo,
VCMPGTUW,
VCMPGTUWo,
VCMPNEB,
VCMPNEBo,
VCMPNEH,
VCMPNEHo,
VCMPNEW,
VCMPNEWo,
VCMPNEZB,
VCMPNEZBo,
VCMPNEZH,
VCMPNEZHo,
VCMPNEZW,
VCMPNEZWo,
VEQV,
VEXTSB2D,
VEXTSB2W,
VEXTSH2D,
VEXTSH2W,
VEXTSW2D,
VMRGEW,
VMRGOW,
VNAND,
VNEGD,
VNEGW,
VNOR,
VOR,
VORC,
VPOPCNTB,
VPOPCNTH,
VPOPCNTW,
VSEL,
VSUBCUW,
VSUBUBM,
VSUBUDM,
VSUBUHM,
VSUBUWM,
VXOR,
V_SET0B,
V_SET0H,
V_SET0,
XVABSDP,
XVABSSP,
XVCPSGNDP,
XVCPSGNSP,
XVIEXPDP,
XVNABSDP,
XVNABSSP,
XVNEGDP,
XVNEGSP,
XVXEXPDP,
XXLAND,
XXLANDC,
XXLEQV,
XXLNAND,
XXLNOR,
XXLOR,
XXLORf,
XXLORC,
XXLXOR,
XXSEL
)>;
def : InstRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C],
(instrs
XSABSQP,
XSCPSGNQP,
XSIEXPQP,
XSNABSQP,
XSNEGQP,
XSXEXPQP,
XSABSDP,
XSCPSGNDP,
XSIEXPDP,
XSNABSDP,
XSNEGDP,
XSXEXPDP
)>;
def : InstRW<[P9_ALUE_3C, P9_ALUO_3C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C, DISP_1C],
(instrs
VMINSB,
VMINSD,
VMINSH,
VMINSW,
VMINUB,
VMINUD,
VMINUH,
VMINUW,
VPOPCNTD,
VPRTYBD,
VPRTYBW,
VRLB,
VRLD,
VRLDMI,
VRLDNM,
VRLH,
VRLW,
VRLWMI,
VRLWNM,
VSHASIGMAD,
VSHASIGMAW,
VSLB,
VSLD,
VSLH,
VSLW,
VSRAB,
VSRAD,
VSRAH,
VSRAW,
VSRB,
VSRD,
VSRH,
VSRW,
VSUBSBS,
VSUBSHS,
VSUBSWS,
VSUBUBS,
VSUBUHS,
VSUBUWS,
XSCMPEQDP,
XSCMPEXPDP,
XSCMPGEDP,
XSCMPGTDP,
XSCMPODP,
XSCMPUDP,
XSCVSPDPN,
XSMAXCDP,
XSMAXDP,
XSMAXJDP,
XSMINCDP,
XSMINDP,
XSMINJDP,
XSTDIVDP,
XSTSQRTDP,
XSTSTDCDP,
XSTSTDCSP,
XSXSIGDP,
XVCMPEQDP,
XVCMPEQDPo,
XVCMPEQSP,
XVCMPEQSPo,
XVCMPGEDP,
XVCMPGEDPo,
XVCMPGESP,
XVCMPGESPo,
XVCMPGTDP,
XVCMPGTDPo,
XVCMPGTSP,
XVCMPGTSPo,
XVIEXPSP,
XVMAXDP,
XVMAXSP,
XVMINDP,
XVMINSP,
XVTDIVDP,
XVTDIVSP,
XVTSQRTDP,
XVTSQRTSP,
XVTSTDCDP,
XVTSTDCSP,
XVXEXPSP,
XVXSIGDP,
XVXSIGSP
)>;
def : InstRW<[P9_ALUE_4C, P9_ALUO_4C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C, DISP_1C],
(instrs
VABSDUB,
VABSDUH,
VABSDUW,
VADDSBS,
VADDSHS,
VADDSWS,
VADDUBS,
VADDUHS,
VADDUWS,
VAVGSB,
VAVGSH,
VAVGSW,
VAVGUB,
VAVGUH,
VAVGUW,
VBPERMD,
VCLZB,
VCLZD,
VCLZH,
VCLZW,
VCMPBFP,
VCMPBFPo,
VCMPGTFP,
VCMPGTFPo,
VCTZB,
VCTZD,
VCTZH,
VCTZW,
VMAXFP,
VMAXSB,
VMAXSD,
VMAXSH,
VMAXSW,
VMAXUB,
VMAXUD,
VMAXUH,
VMAXUW,
VMINFP,
VCMPEQFP,
VCMPEQFPo,
VCMPGEFP,
VCMPGEFPo
)>;
def : InstRW<[P9_DPE_7C, P9_DPO_7C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C, DISP_1C],
(instrs
VADDFP,
VCTSXS,
VCTSXS_0,
VCTUXS,
VCTUXS_0,
VEXPTEFP,
VLOGEFP,
VMADDFP,
VMHADDSHS,
VNMSUBFP,
VREFP,
VRFIM,
VRFIN,
VRFIP,
VRFIZ,
VRSQRTEFP,
VSUBFP,
XVADDDP,
XVADDSP,
XVCVDPSP,
XVCVDPSXDS,
XVCVDPSXWS,
XVCVDPUXDS,
XVCVDPUXWS,
XVCVHPSP,
XVCVSPDP,
XVCVSPHP,
XVCVSPSXDS,
XVCVSPSXWS,
XVCVSPUXDS,
XVCVSPUXWS,
XVCVSXDDP,
XVCVSXDSP,
XVCVSXWDP,
XVCVSXWSP,
XVCVUXDDP,
XVCVUXDSP,
XVCVUXWDP,
XVCVUXWSP,
XVMADDADP,
XVMADDASP,
XVMADDMDP,
XVMADDMSP,
XVMSUBADP,
XVMSUBASP,
XVMSUBMDP,
XVMSUBMSP,
XVMULDP,
XVMULSP,
XVNMADDADP,
XVNMADDASP,
XVNMADDMDP,
XVNMADDMSP,
XVNMSUBADP,
XVNMSUBASP,
XVNMSUBMDP,
XVNMSUBMSP,
XVRDPI,
XVRDPIC,
XVRDPIM,
XVRDPIP,
XVRDPIZ,
XVREDP,
XVRESP,
XVRSPI,
XVRSPIC,
XVRSPIM,
XVRSPIP,
XVRSPIZ,
XVRSQRTEDP,
XVRSQRTESP,
XVSUBDP,
XVSUBSP,
VCFSX,
VCFSX_0,
VCFUX,
VCFUX_0,
VMHRADDSHS,
VMLADDUHM,
VMSUMMBM,
VMSUMSHM,
VMSUMSHS,
VMSUMUBM,
VMSUMUHM,
VMSUMUHS,
VMULESB,
VMULESH,
VMULESW,
VMULEUB,
VMULEUH,
VMULEUW,
VMULOSB,
VMULOSH,
VMULOSW,
VMULOUB,
VMULOUH,
VMULOUW,
VMULUWM,
VSUM2SWS,
VSUM4SBS,
VSUM4SHS,
VSUM4UBS,
VSUMSWS
)>;
def : InstRW<[P9_DP_7C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
XSMADDADP,
XSMADDASP,
XSMADDMDP,
XSMADDMSP,
XSMSUBADP,
XSMSUBASP,
XSMSUBMDP,
XSMSUBMSP,
XSMULDP,
XSMULSP,
XSNMADDADP,
XSNMADDASP,
XSNMADDMDP,
XSNMADDMSP,
XSNMSUBADP,
XSNMSUBASP,
XSNMSUBMDP,
XSNMSUBMSP
)>;
def : InstRW<[P9_DP_7C, IP_EXEC_1C, DISP_1C, DISP_1C],
(instrs
XSADDDP,
XSADDSP,
XSCVDPHP,
XSCVDPSP,
XSCVDPSXDS,
XSCVDPSXWS,
XSCVDPUXDS,
XSCVDPUXWS,
XSCVHPDP,
XSCVSPDP,
XSCVSXDDP,
XSCVSXDSP,
XSCVUXDDP,
XSCVUXDSP,
XSRDPI,
XSRDPIC,
XSRDPIM,
XSRDPIP,
XSRDPIZ,
XSREDP,
XSRESP,
//XSRSP,
XSRSQRTEDP,
XSRSQRTESP,
XSSUBDP,
XSSUBSP,
XSCVDPSPN
)>;
def : InstRW<[P9_PM_3C, IP_EXECO_1C, IP_EXECE_1C, DISP_1C, DISP_1C],
(instrs
VBPERMQ,
VCLZLSBB,
VCTZLSBB,
VEXTRACTD,
VEXTRACTUB,
VEXTRACTUH,
VEXTRACTUW,
VEXTUBLX,
VEXTUBRX,
VEXTUHLX,
VEXTUHRX,
VEXTUWLX,
VEXTUWRX,
VGBBD,
VINSERTB,
VINSERTD,
VINSERTH,
VINSERTW,
VMRGHB,
VMRGHH,
VMRGHW,
VMRGLB,
VMRGLH,
VMRGLW,
VPERM,
VPERMR,
VPERMXOR,
VPKPX,
VPKSDSS,
VPKSDUS,
VPKSHSS,
VPKSHUS,
VPKSWSS,
VPKSWUS,
VPKUDUM,
VPKUDUS,
VPKUHUM,
VPKUHUS,
VPKUWUM,
VPKUWUS,
VPRTYBQ,
VSL,
VSLDOI,
VSLO,
VSLV,
VSPLTB,
VSPLTH,
VSPLTISB,
VSPLTISH,
VSPLTISW,
VSPLTW,
VSR,
VSRO,
VSRV,
VUPKHPX,
VUPKHSB,
VUPKHSH,
VUPKHSW,
VUPKLPX,
VUPKLSB,
VUPKLSH,
VUPKLSW,
XXBRD,
XXBRH,
XXBRQ,
XXBRW,
XXEXTRACTUW,
XXINSERTW,
XXMRGHW,
XXMRGLW,
XXPERM,
XXPERMR,
XXSLDWI,
XXSPLTIB,
XXSPLTW,
VADDCUQ,
VADDECUQ,
VADDEUQM,
VADDUQM,
VMUL10CUQ,
VMUL10ECUQ,
VMUL10EUQ,
VMUL10UQ,
VSUBCUQ,
VSUBECUQ,
VSUBEUQM,
VSUBUQM,
XSCMPEXPQP,
XSCMPOQP,
XSCMPUQP,
XSTSTDCQP,
XSXSIGQP
)>;
def : InstRW<[P9_DFU_12C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C, DISP_1C],
(instrs
XSADDQP,
XSADDQPO,
XSCVDPQP,
XSCVQPDP,
XSCVQPDPO,
XSCVQPSDZ,
XSCVQPSWZ,
XSCVQPUDZ,
XSCVQPUWZ,
XSCVSDQP,
XSCVUDQP,
XSRQPI,
XSRQPXP,
XSSUBQP,
XSSUBQPO
)>;
def : InstRW<[P9_DFU_24C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C, DISP_1C],
(instrs
XSMADDQP,
XSMADDQPO,
XSMSUBQP,
XSMSUBQPO,
XSMULQP,
XSMULQPO,
XSNMADDQP,
XSNMADDQPO,
XSNMSUBQP,
XSNMSUBQPO
)>;
def : InstRW<[P9_DFU_58C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C, DISP_1C],
(instrs
XSDIVQP,
XSDIVQPO
)>;
def : InstRW<[P9_DFU_76C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C, DISP_1C],
(instrs
XSSQRTQP,
XSSQRTQPO
)>;
// Load Operation in IIC_LdStLFD
def : InstRW<[P9_LS_5C, IP_AGEN_1C, DISP_1C, DISP_1C],
(instrs
LXSDX,
LXVD2X,
LXSIWZX,
LXV,
LXSD
)>;
def : InstRW<[P9_LS_5C, IP_AGEN_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
LFIWZX,
LFDX,
LFD
)>;
def : InstRW<[P9_LoadAndALUOp_7C, IP_AGEN_1C, IP_EXEC_1C,
DISP_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
LXSSPX,
LXSIWAX,
LXSSP
)>;
def : InstRW<[P9_LoadAndALUOp_7C, IP_AGEN_1C, IP_EXEC_1C,
DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
LFIWAX,
LFSX,
LFS
)>;
def : InstRW<[P9_LoadAndPMOp_8C, IP_AGEN_1C, IP_EXEC_1C, DISP_1C, DISP_1C],
(instrs
LXVDSX,
LXVW4X
)>;
// Store Operations in IIC_LdStSTFD.
def : InstRW<[P9_LS_1C, IP_EXEC_1C, IP_AGEN_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
STFS,
STFD,
STFIWX,
STFSX,
STFDX,
STXSDX,
STXSSPX,
STXSIWX
)>;
def : InstRW<[P9_LS_1C, IP_EXEC_1C, IP_EXEC_1C, IP_AGEN_1C, DISP_1C, DISP_1C],
(instrs
STXVD2X,
STXVW4X
)>;
// Divide Operations in IIC_IntDivW, IIC_IntDivD.
def : InstRW<[P9_DIV_16C_8, IP_EXECE_1C, DISP_1C, DISP_1C],
(instrs
DIVW,
DIVWU
)>;
def : InstRW<[P9_DIV_24C_8, IP_EXECE_1C, DISP_1C, DISP_1C],
(instrs
DIVWE,
DIVD,
DIVWEU,
DIVDU
)>;
def : InstRW<[P9_DIV_40C_8, IP_EXECE_1C, DISP_1C, DISP_1C],
(instrs
DIVDE,
DIVDEU
)>;
def : InstRW<[P9_IntDivAndALUOp_26C_8, IP_EXECE_1C, IP_EXEC_1C,
DISP_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
DIVWEo,
DIVWEUo
)>;
def : InstRW<[P9_IntDivAndALUOp_42C_8, IP_EXECE_1C, IP_EXEC_1C,
DISP_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
DIVDEo,
DIVDEUo
)>;
// Rotate Operations in IIC_IntRotateD, IIC_IntRotateDI
def : InstRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C],
(instrs
SLD,
SRD,
SRAD,
SRADI,
RLDIC
)>;
def : InstRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
RLDCL,
RLDCR,
RLDIMI,
RLDICL,
RLDICR,
RLDICL_32_64
)>;
// CR access instructions in _BrMCR, IIC_BrMCRX.
def : InstRW<[P9_ALU_2C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C,
DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
MTOCRF,
MTOCRF8,
MTCRF,
MTCRF8
)>;
def : InstRW<[P9_ALU_5C, IP_EXEC_1C, DISP_1C, DISP_1C],
(instrs
MCRF,
MCRXRX
)>;
def : InstRW<[P9_ALU_5C, P9_ALU_5C, IP_EXEC_1C, IP_EXEC_1C,
DISP_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
MCRFS
)>;
// FP Div instructions in IIC_FPDivD and IIC_FPDivS.
def : InstRW<[P9_DP_33C_8, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
FDIV,
XSDIVDP
)>;
def : InstRW<[P9_DP_22C_5, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
FDIVS,
XSDIVSP
)>;
def : InstRW<[P9_DP_24C_8, IP_EXECE_1C, IP_EXECO_1C, DISP_1C, DISP_1C],
(instrs
XVDIVSP
)>;
def : InstRW<[P9_DP_33C_8, IP_EXECE_1C, IP_EXECO_1C, DISP_1C, DISP_1C],
(instrs
XVDIVDP
)>;
// FP Instructions in IIC_FPGeneral, IIC_FPFused
def : InstRW<[P9_DP_7C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
FRSP,
FRIND,
FRINS,
FRIPD,
FRIPS,
FRIZD,
FRIZS,
FRIMD,
FRIMS,
FRE,
FRES,
FRSQRTE,
FRSQRTES,
FMADDS,
FMADD,
FMSUBS,
FMSUB,
FNMADDS,
FNMADD,
FNMSUBS,
FNMSUB,
FSELD,
FSELS,
FADDS,
FMULS,
FMUL,
FSUBS,
FCFID,
FCTID,
FCTIDZ,
FCFIDU,
FCFIDS,
FCFIDUS,
FCTIDUZ,
FCTIWUZ,
FCTIW,
FCTIWZ
)>;
def : InstRW<[P9_DP_7C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
FMR,
FABSD,
FABSS,
FNABSD,
FNABSS,
FNEGD,
FNEGS,
FCPSGND,
FCPSGNS
)>;
def : InstRW<[P9_ALU_3C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
FCMPUS,
FCMPUD
)>;
// Load instructions in IIC_LdStLFDU and IIC_LdStLFDUX.
def : InstRW<[P9_LoadAndALUOp_7C, P9_ALU_2C,
IP_AGEN_1C, IP_EXEC_1C, IP_EXEC_1C,
DISP_1C, DISP_1C, DISP_1C, DISP_1C,
DISP_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
LFSU,
LFSUX
)>;
def : InstRW<[P9_LS_5C, P9_ALU_2C, IP_AGEN_1C, IP_EXEC_1C,
DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C],
(instrs
LFDU,
LFDUX
)>;