summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/PowerPC/P9InstrResources.td
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/PowerPC/P9InstrResources.td')
-rw-r--r--llvm/lib/Target/PowerPC/P9InstrResources.td229
1 files changed, 122 insertions, 107 deletions
diff --git a/llvm/lib/Target/PowerPC/P9InstrResources.td b/llvm/lib/Target/PowerPC/P9InstrResources.td
index f6cd8ed00c82..9b3d13989ee2 100644
--- a/llvm/lib/Target/PowerPC/P9InstrResources.td
+++ b/llvm/lib/Target/PowerPC/P9InstrResources.td
@@ -107,7 +107,7 @@ def : InstRW<[P9_ALU_3C, IP_EXEC_1C, DISP_1C],
(instregex "XSMAX(C|J)?DP$"),
(instregex "XSMIN(C|J)?DP$"),
(instregex "XSCMP(EQ|EXP|GE|GT|O|U)DP$"),
- (instregex "CNT(L|T)Z(D|W)(8)?(o)?$"),
+ (instregex "CNT(L|T)Z(D|W)(8)?(_rec)?$"),
(instregex "POPCNT(D|W)$"),
(instregex "CMPB(8)?$"),
(instregex "SETB(8)?$"),
@@ -129,26 +129,26 @@ def : InstRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C],
(instregex "MTV(S)?RW(A|Z)$"),
(instregex "CMP(WI|LWI|W|LW)(8)?$"),
(instregex "CMP(L)?D(I)?$"),
- (instregex "SUBF(I)?C(8)?$"),
- (instregex "ANDI(S)?o(8)?$"),
- (instregex "ADDC(8)?$"),
- (instregex "ADDIC(8)?(o)?$"),
- (instregex "ADD(8|4)(o)?$"),
- (instregex "ADD(E|ME|ZE)(8)?(o)?$"),
- (instregex "SUBF(E|ME|ZE)?(8)?(o)?$"),
- (instregex "NEG(8)?(o)?$"),
+ (instregex "SUBF(I)?C(8)?(O)?$"),
+ (instregex "ANDI(S)?(8)?(_rec)?$"),
+ (instregex "ADDC(8)?(O)?$"),
+ (instregex "ADDIC(8)?(_rec)?$"),
+ (instregex "ADD(8|4)(O)?(_rec)?$"),
+ (instregex "ADD(E|ME|ZE)(8)?(O)?(_rec)?$"),
+ (instregex "SUBF(E|ME|ZE)?(8)?(O)?(_rec)?$"),
+ (instregex "NEG(8)?(O)?(_rec)?$"),
(instregex "POPCNTB$"),
(instregex "ADD(I|IS)?(8)?$"),
(instregex "LI(S)?(8)?$"),
- (instregex "(X)?OR(I|IS)?(8)?(o)?$"),
- (instregex "NAND(8)?(o)?$"),
- (instregex "AND(C)?(8)?(o)?$"),
- (instregex "NOR(8)?(o)?$"),
- (instregex "OR(C)?(8)?(o)?$"),
- (instregex "EQV(8)?(o)?$"),
- (instregex "EXTS(B|H|W)(8)?(_32)?(_64)?(o)?$"),
+ (instregex "(X)?OR(I|IS)?(8)?(_rec)?$"),
+ (instregex "NAND(8)?(_rec)?$"),
+ (instregex "AND(C)?(8)?(_rec)?$"),
+ (instregex "NOR(8)?(_rec)?$"),
+ (instregex "OR(C)?(8)?(_rec)?$"),
+ (instregex "EQV(8)?(_rec)?$"),
+ (instregex "EXTS(B|H|W)(8)?(_32)?(_64)?(_rec)?$"),
(instregex "ADD(4|8)(TLS)?(_)?$"),
- (instregex "NEG(8)?$"),
+ (instregex "NEG(8)?(O)?$"),
(instregex "ADDI(S)?toc(HA|L)(8)?$"),
COPY,
MCRF,
@@ -211,8 +211,8 @@ def : InstRW<[P9_ALUE_3C, P9_ALUO_3C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
(instregex "VABSDU(B|H|W)$"),
(instregex "VADDU(B|H|W)S$"),
(instregex "VAVG(S|U)(B|H|W)$"),
- (instregex "VCMP(EQ|GE|GT)FP(o)?$"),
- (instregex "VCMPBFP(o)?$"),
+ (instregex "VCMP(EQ|GE|GT)FP(_rec)?$"),
+ (instregex "VCMPBFP(_rec)?$"),
(instregex "VC(L|T)Z(B|H|W|D)$"),
(instregex "VADDS(B|H|W)S$"),
(instregex "V(MIN|MAX)FP$"),
@@ -233,43 +233,43 @@ def : InstRW<[P9_ALUE_3C, P9_ALUO_3C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
VSUBUWS,
VSUBCUW,
VCMPGTSB,
- VCMPGTSBo,
+ VCMPGTSB_rec,
VCMPGTSD,
- VCMPGTSDo,
+ VCMPGTSD_rec,
VCMPGTSH,
- VCMPGTSHo,
+ VCMPGTSH_rec,
VCMPGTSW,
- VCMPGTSWo,
+ VCMPGTSW_rec,
VCMPGTUB,
- VCMPGTUBo,
+ VCMPGTUB_rec,
VCMPGTUD,
- VCMPGTUDo,
+ VCMPGTUD_rec,
VCMPGTUH,
- VCMPGTUHo,
+ VCMPGTUH_rec,
VCMPGTUW,
- VCMPGTUWo,
- VCMPNEBo,
- VCMPNEHo,
- VCMPNEWo,
- VCMPNEZBo,
- VCMPNEZHo,
- VCMPNEZWo,
- VCMPEQUBo,
- VCMPEQUDo,
- VCMPEQUHo,
- VCMPEQUWo,
+ VCMPGTUW_rec,
+ VCMPNEB_rec,
+ VCMPNEH_rec,
+ VCMPNEW_rec,
+ VCMPNEZB_rec,
+ VCMPNEZH_rec,
+ VCMPNEZW_rec,
+ VCMPEQUB_rec,
+ VCMPEQUD_rec,
+ VCMPEQUH_rec,
+ VCMPEQUW_rec,
XVCMPEQDP,
- XVCMPEQDPo,
+ XVCMPEQDP_rec,
XVCMPEQSP,
- XVCMPEQSPo,
+ XVCMPEQSP_rec,
XVCMPGEDP,
- XVCMPGEDPo,
+ XVCMPGEDP_rec,
XVCMPGESP,
- XVCMPGESPo,
+ XVCMPGESP_rec,
XVCMPGTDP,
- XVCMPGTDPo,
+ XVCMPGTDP_rec,
XVCMPGTSP,
- XVCMPGTSPo,
+ XVCMPGTSP_rec,
XVMAXDP,
XVMAXSP,
XVMINDP,
@@ -399,7 +399,7 @@ def : InstRW<[P9_DPE_7C, P9_DPO_7C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
def : InstRW<[P9_DP_5C, IP_EXEC_1C, DISP_3SLOTS_1C],
(instrs
(instregex "MADD(HD|HDU|LD|LD8)$"),
- (instregex "MUL(HD|HW|LD|LI|LI8|LW)(U)?$")
+ (instregex "MUL(HD|HW|LD|LI|LI8|LW)(U)?(O)?$")
)>;
// 7 cycle Restricted DP operation. One DP unit, one EXEC pipeline and all three
@@ -451,14 +451,14 @@ def : InstRW<[P9_DP_7C, IP_EXEC_1C, DISP_3SLOTS_1C],
def : InstRW<[P9_DP_7C, P9_ALU_3C, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_1C],
(instrs
- (instregex "FSEL(D|S)o$")
+ (instregex "FSEL(D|S)_rec$")
)>;
// 5 Cycle Restricted DP operation and one 2 cycle ALU operation.
def : InstRW<[P9_DPOpAndALUOp_7C, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_1C],
(instrs
- (instregex "MUL(H|L)(D|W)(U)?o$")
+ (instregex "MUL(H|L)(D|W)(U)?(O)?_rec$")
)>;
// 7 cycle Restricted DP operation and one 3 cycle ALU operation.
@@ -467,18 +467,18 @@ def : InstRW<[P9_DPOpAndALUOp_7C, IP_EXEC_1C, IP_EXEC_1C,
def : InstRW<[P9_DPOpAndALU2Op_10C, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_1C],
(instrs
- (instregex "FRI(N|P|Z|M)(D|S)o$"),
- (instregex "FRE(S)?o$"),
- (instregex "FADD(S)?o$"),
- (instregex "FSUB(S)?o$"),
- (instregex "F(N)?MSUB(S)?o$"),
- (instregex "F(N)?MADD(S)?o$"),
- (instregex "FCFID(U)?(S)?o$"),
- (instregex "FCTID(U)?(Z)?o$"),
- (instregex "FCTIW(U)?(Z)?o$"),
- (instregex "FMUL(S)?o$"),
- (instregex "FRSQRTE(S)?o$"),
- FRSPo
+ (instregex "FRI(N|P|Z|M)(D|S)_rec$"),
+ (instregex "FRE(S)?_rec$"),
+ (instregex "FADD(S)?_rec$"),
+ (instregex "FSUB(S)?_rec$"),
+ (instregex "F(N)?MSUB(S)?_rec$"),
+ (instregex "F(N)?MADD(S)?_rec$"),
+ (instregex "FCFID(U)?(S)?_rec$"),
+ (instregex "FCTID(U)?(Z)?_rec$"),
+ (instregex "FCTIW(U)?(Z)?_rec$"),
+ (instregex "FMUL(S)?_rec$"),
+ (instregex "FRSQRTE(S)?_rec$"),
+ FRSP_rec
)>;
// 7 cycle DP operation. One DP unit, one EXEC pipeline and 1 dispatch units.
@@ -613,16 +613,16 @@ def : InstRW<[P9_PM_3C, IP_EXECO_1C, IP_EXECE_1C, DISP_1C],
XSCMPUQP,
XSTSTDCQP,
XSXSIGQP,
- BCDCFNo,
- BCDCFZo,
- BCDCPSGNo,
- BCDCTNo,
- BCDCTZo,
- BCDSETSGNo,
- BCDSo,
- BCDTRUNCo,
- BCDUSo,
- BCDUTRUNCo
+ BCDCFN_rec,
+ BCDCFZ_rec,
+ BCDCPSGN_rec,
+ BCDCTN_rec,
+ BCDCTZ_rec,
+ BCDSETSGN_rec,
+ BCDS_rec,
+ BCDTRUNC_rec,
+ BCDUS_rec,
+ BCDUTRUNC_rec
)>;
// 12 Cycle DFU operation. Only one DFU unit per CPU so we use a whole
@@ -630,7 +630,7 @@ def : InstRW<[P9_PM_3C, IP_EXECO_1C, IP_EXECE_1C, DISP_1C],
// dispatch.
def : InstRW<[P9_DFU_12C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
(instrs
- BCDSRo,
+ BCDSR_rec,
XSADDQP,
XSADDQPO,
XSCVDPQP,
@@ -654,7 +654,7 @@ def : InstRW<[P9_DFU_12C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
// dispatch.
def : InstRW<[P9_DFU_23C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
(instrs
- BCDCTSQo
+ BCDCTSQ_rec
)>;
// 24 Cycle DFU operation. Only one DFU unit per CPU so we use a whole
@@ -679,7 +679,7 @@ def : InstRW<[P9_DFU_24C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
// dispatch.
def : InstRW<[P9_DFU_37C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
(instrs
- BCDCFSQo
+ BCDCFSQ_rec
)>;
// 58 Cycle DFU operation. Only one DFU unit per CPU so we use a whole
@@ -819,7 +819,7 @@ def : InstRW<[P9_LoadAndALUOp_6C, IP_EXEC_1C, IP_AGEN_1C,
DISP_1C, DISP_1C],
(instrs
(instregex "LHA(X)?(8)?$"),
- (instregex "CP_PASTE(8)?o$"),
+ (instregex "CP_PASTE(8)?_rec$"),
(instregex "LWA(X)?(_32)?$"),
TCHECK
)>;
@@ -946,7 +946,9 @@ def : InstRW<[P9_DIV_12C, IP_EXECE_1C, IP_EXECO_1C, DISP_EVEN_1C],
def : InstRW<[P9_DIV_16C_8, IP_EXECO_1C, IP_EXECE_1C, DISP_EVEN_1C],
(instrs
DIVW,
+ DIVWO,
DIVWU,
+ DIVWUO,
MODSW
)>;
@@ -956,9 +958,13 @@ def : InstRW<[P9_DIV_16C_8, IP_EXECO_1C, IP_EXECE_1C, DISP_EVEN_1C],
def : InstRW<[P9_DIV_24C_8, IP_EXECO_1C, IP_EXECE_1C, DISP_EVEN_1C],
(instrs
DIVWE,
+ DIVWEO,
DIVD,
+ DIVDO,
DIVWEU,
+ DIVWEUO,
DIVDU,
+ DIVDUO,
MODSD,
MODUD,
MODUW
@@ -970,7 +976,9 @@ def : InstRW<[P9_DIV_24C_8, IP_EXECO_1C, IP_EXECE_1C, DISP_EVEN_1C],
def : InstRW<[P9_DIV_40C_8, IP_EXECO_1C, IP_EXECE_1C, DISP_EVEN_1C],
(instrs
DIVDE,
- DIVDEU
+ DIVDEO,
+ DIVDEU,
+ DIVDEUO
)>;
// Cracked DIV and ALU operation. Requires one full slice for the ALU operation
@@ -979,7 +987,7 @@ def : InstRW<[P9_DIV_40C_8, IP_EXECO_1C, IP_EXECE_1C, DISP_EVEN_1C],
def : InstRW<[P9_IntDivAndALUOp_18C_8, IP_EXECE_1C, IP_EXECO_1C, IP_EXEC_1C,
DISP_EVEN_1C, DISP_1C],
(instrs
- (instregex "DIVW(U)?(O)?o$")
+ (instregex "DIVW(U)?(O)?_rec$")
)>;
// Cracked DIV and ALU operation. Requires one full slice for the ALU operation
@@ -988,10 +996,14 @@ def : InstRW<[P9_IntDivAndALUOp_18C_8, IP_EXECE_1C, IP_EXECO_1C, IP_EXEC_1C,
def : InstRW<[P9_IntDivAndALUOp_26C_8, IP_EXECE_1C, IP_EXECO_1C, IP_EXEC_1C,
DISP_EVEN_1C, DISP_1C],
(instrs
- DIVDo,
- DIVDUo,
- DIVWEo,
- DIVWEUo
+ DIVD_rec,
+ DIVDO_rec,
+ DIVDU_rec,
+ DIVDUO_rec,
+ DIVWE_rec,
+ DIVWEO_rec,
+ DIVWEU_rec,
+ DIVWEUO_rec
)>;
// Cracked DIV and ALU operation. Requires one full slice for the ALU operation
@@ -1000,8 +1012,10 @@ def : InstRW<[P9_IntDivAndALUOp_26C_8, IP_EXECE_1C, IP_EXECO_1C, IP_EXEC_1C,
def : InstRW<[P9_IntDivAndALUOp_42C_8, IP_EXECE_1C, IP_EXECO_1C, IP_EXEC_1C,
DISP_EVEN_1C, DISP_1C],
(instrs
- DIVDEo,
- DIVDEUo
+ DIVDE_rec,
+ DIVDEO_rec,
+ DIVDEU_rec,
+ DIVDEUO_rec
)>;
// CR access instructions in _BrMCR, IIC_BrMCRX.
@@ -1026,8 +1040,8 @@ def : InstRW<[P9_ALU_2C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C,
def : InstRW<[P9_ALU_2C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C,
DISP_1C, DISP_1C],
(instrs
- (instregex "ADDC(8)?o$"),
- (instregex "SUBFC(8)?o$")
+ (instregex "ADDC(8)?(O)?_rec$"),
+ (instregex "SUBFC(8)?(O)?_rec$")
)>;
// Cracked ALU operations.
@@ -1038,10 +1052,10 @@ def : InstRW<[P9_ALU_2C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C,
def : InstRW<[P9_ALU_2C, P9_ALU_3C, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_1C],
(instrs
- (instregex "F(N)?ABS(D|S)o$"),
- (instregex "FCPSGN(D|S)o$"),
- (instregex "FNEG(D|S)o$"),
- FMRo
+ (instregex "F(N)?ABS(D|S)_rec$"),
+ (instregex "FCPSGN(D|S)_rec$"),
+ (instregex "FNEG(D|S)_rec$"),
+ FMR_rec
)>;
// Cracked ALU operations.
@@ -1063,8 +1077,8 @@ def : InstRW<[P9_ALU_3C, P9_ALU_3C, IP_EXEC_1C, IP_EXEC_1C,
def : InstRW<[P9_ALU_3C, P9_ALU_3C, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_3SLOTS_1C],
(instrs
- (instregex "MTFSF(b|o)?$"),
- (instregex "MTFSFI(o)?$")
+ (instregex "MTFSF(b|_rec)?$"),
+ (instregex "MTFSFI(_rec)?$")
)>;
// Cracked instruction made of two ALU ops.
@@ -1073,13 +1087,13 @@ def : InstRW<[P9_ALU_3C, P9_ALU_3C, IP_EXEC_1C, IP_EXEC_1C,
def : InstRW<[P9_ALUOpAndALUOp_4C, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_1C],
(instrs
- (instregex "RLD(I)?C(R|L)o$"),
- (instregex "RLW(IMI|INM|NM)(8)?o$"),
- (instregex "SLW(8)?o$"),
- (instregex "SRAW(I)?o$"),
- (instregex "SRW(8)?o$"),
- RLDICL_32o,
- RLDIMIo
+ (instregex "RLD(I)?C(R|L)_rec$"),
+ (instregex "RLW(IMI|INM|NM)(8)?_rec$"),
+ (instregex "SLW(8)?_rec$"),
+ (instregex "SRAW(I)?_rec$"),
+ (instregex "SRW(8)?_rec$"),
+ RLDICL_32_rec,
+ RLDIMI_rec
)>;
// Cracked instruction made of two ALU ops.
@@ -1088,7 +1102,7 @@ def : InstRW<[P9_ALUOpAndALUOp_4C, IP_EXEC_1C, IP_EXEC_1C,
def : InstRW<[P9_ALU2OpAndALU2Op_6C, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_3SLOTS_1C],
(instrs
- (instregex "MFFS(L|CE|o)?$")
+ (instregex "MFFS(L|CE|_rec)?$")
)>;
// Cracked ALU instruction composed of three consecutive 2 cycle loads for a
@@ -1104,12 +1118,12 @@ def : InstRW<[P9_ALUOpAndALUOpAndALUOp_6C, IP_EXEC_1C, IP_EXEC_1C, IP_EXEC_1C,
// The two ops cannot be done in parallel.
def : InstRW<[P9_ALUOpAndALUOp_4C, IP_EXEC_1C, IP_EXEC_1C, DISP_1C, DISP_1C],
(instrs
- (instregex "EXTSWSLI_32_64o$"),
- (instregex "SRAD(I)?o$"),
- EXTSWSLIo,
- SLDo,
- SRDo,
- RLDICo
+ (instregex "EXTSWSLI_32_64_rec$"),
+ (instregex "SRAD(I)?_rec$"),
+ EXTSWSLI_rec,
+ SLD_rec,
+ SRD_rec,
+ RLDIC_rec
)>;
// 33 Cycle DP Instruction Restricted. Takes one slice and 3 dispatches.
@@ -1122,7 +1136,7 @@ def : InstRW<[P9_DP_33C_8, IP_EXEC_1C, DISP_3SLOTS_1C],
def : InstRW<[P9_DPOpAndALU2Op_36C_8, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_1C],
(instrs
- FDIVo
+ FDIV_rec
)>;
// 36 Cycle DP Instruction.
@@ -1156,7 +1170,7 @@ def : InstRW<[P9_DPE_27C_10, P9_DPO_27C_10, IP_EXECE_1C, IP_EXECO_1C,
def : InstRW<[P9_DPOpAndALU2Op_39C_10, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_1C],
(instrs
- FSQRTo
+ FSQRT_rec
)>;
// 26 Cycle DP Instruction.
@@ -1175,7 +1189,7 @@ def : InstRW<[P9_DP_26C_5, IP_EXEC_1C, DISP_3SLOTS_1C],
def : InstRW<[P9_DPOpAndALU2Op_29C_5, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_1C],
(instrs
- FSQRTSo
+ FSQRTS_rec
)>;
// 33 Cycle DP Instruction. Takes one slice and 1 dispatch.
@@ -1194,7 +1208,7 @@ def : InstRW<[P9_DP_22C_5, IP_EXEC_1C, DISP_3SLOTS_1C],
def : InstRW<[P9_DPOpAndALU2Op_25C_5, IP_EXEC_1C, IP_EXEC_1C,
DISP_3SLOTS_1C, DISP_1C],
(instrs
- FDIVSo
+ FDIVS_rec
)>;
// 22 Cycle DP Instruction. Takes one slice and 1 dispatch.
@@ -1304,6 +1318,7 @@ def : InstRW<[P9_BR_2C, DISP_BR_1C],
BCLalways,
BCLn,
BCTRL8_LDinto_toc,
+ BCTRL_LWZinto_toc,
BCn,
CTRL_DEP
)>;
@@ -1400,7 +1415,7 @@ def : InstRW<[],
MBAR,
MSYNC,
SLBSYNC,
- SLBFEEo,
+ SLBFEE_rec,
NAP,
STOP,
TRAP,