1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 05:01:59 +01:00

[SystemZ] Correct the SchedModel regarding vector unit / instructions.

* Use a generic vector unit to model the issue unit more accurately.
* Update some vector instructions that actually use the vector unit for more
  than one cycle.

Review: Ulrich Weigand
llvm-svn: 286112
This commit is contained in:
Jonas Paulsson 2016-11-07 15:45:06 +00:00
parent ff221e0718
commit 47ee9de1f5
4 changed files with 93 additions and 82 deletions

View File

@ -8,6 +8,9 @@
//===----------------------------------------------------------------------===//
// Scheduler resources
// Resources ending with a '2' use that resource for 2 cycles. An instruction
// using two such resources use the mapped unit for 4 cycles, and 2 is added
// to the total number of uops of the sched class.
// These three resources are used to express decoder grouping rules.
// The number of decoder slots needed by an instructions is normally
@ -38,6 +41,7 @@ def Lat30 : SchedWrite;
// Fixed-point
def FXa : SchedWrite;
def FXa2 : SchedWrite;
def FXb : SchedWrite;
def FXU : SchedWrite;
@ -50,11 +54,14 @@ def LSU : SchedWrite;
def LSU_lat1 : SchedWrite;
// Floating point unit (zEC12 and earlier)
def FPU : SchedWrite;
def FPU : SchedWrite;
def FPU2 : SchedWrite;
// Vector sub units (z13)
def VecBF : SchedWrite;
def VecBF2 : SchedWrite;
def VecDF : SchedWrite;
def VecDF2 : SchedWrite;
def VecFPd : SchedWrite; // Blocking BFP div/sqrt unit.
def VecMul : SchedWrite;
def VecStr : SchedWrite;

View File

@ -63,20 +63,19 @@ def : WriteRes<Lat30, []> { let Latency = 30; let NumMicroOps = 0;}
def Z13_FXaUnit : ProcResource<2>;
def Z13_FXbUnit : ProcResource<2>;
def Z13_LSUnit : ProcResource<2>;
def Z13_VecBFUnit : ProcResource<2>;
def Z13_VecDFUnit : ProcResource<2>;
def Z13_VecUnit : ProcResource<2>;
def Z13_VecFPdUnit : ProcResource<2> { let BufferSize = 1; /* blocking */ }
def Z13_VecMulUnit : ProcResource<2>;
def Z13_VecStrUnit : ProcResource<2>;
def Z13_VecXsPmUnit : ProcResource<2>;
def Z13_VBUnit : ProcResource<2>;
// Subtarget specific definitions of scheduling resources.
def : WriteRes<FXa, [Z13_FXaUnit]> { let Latency = 1; }
def : WriteRes<FXb, [Z13_FXbUnit]> { let Latency = 1; }
def : WriteRes<LSU, [Z13_LSUnit]> { let Latency = 4; }
def : WriteRes<VecBF, [Z13_VecBFUnit]> { let Latency = 8; }
def : WriteRes<VecDF, [Z13_VecDFUnit]>;
def : WriteRes<FXa, [Z13_FXaUnit]> { let Latency = 1; }
def : WriteRes<FXa2, [Z13_FXaUnit, Z13_FXaUnit]> { let Latency = 2; }
def : WriteRes<FXb, [Z13_FXbUnit]> { let Latency = 1; }
def : WriteRes<LSU, [Z13_LSUnit]> { let Latency = 4; }
def : WriteRes<VecBF, [Z13_VecUnit]> { let Latency = 8; }
def : WriteRes<VecBF2, [Z13_VecUnit, Z13_VecUnit]> { let Latency = 9; }
def : WriteRes<VecDF, [Z13_VecUnit]> { let Latency = 8; }
def : WriteRes<VecDF2, [Z13_VecUnit, Z13_VecUnit]> { let Latency = 9; }
def : WriteRes<VecFPd, [Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit,
Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit,
Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit,
@ -88,9 +87,9 @@ def : WriteRes<VecFPd, [Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit,
Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit,
Z13_VecFPdUnit, Z13_VecFPdUnit, Z13_VecFPdUnit]>
{ let Latency = 30; }
def : WriteRes<VecMul, [Z13_VecMulUnit]> { let Latency = 5; }
def : WriteRes<VecStr, [Z13_VecStrUnit]> { let Latency = 4; }
def : WriteRes<VecXsPm, [Z13_VecXsPmUnit]> { let Latency = 3; }
def : WriteRes<VecMul, [Z13_VecUnit]> { let Latency = 5; }
def : WriteRes<VecStr, [Z13_VecUnit]> { let Latency = 4; }
def : WriteRes<VecXsPm, [Z13_VecUnit]> { let Latency = 3; }
def : WriteRes<VBU, [Z13_VBUnit]>; // Virtual Branching Unit
// -------------------------- INSTRUCTIONS ---------------------------------- //
@ -443,9 +442,9 @@ def : InstRW<[FXa, LSU, Lat9], (instregex "MH(Y)?$")>;
def : InstRW<[FXa, Lat30, GroupAlone], (instregex "DSG(F)?R$")>;
def : InstRW<[LSU, FXa, Lat30, GroupAlone], (instregex "DSG(F)?$")>;
def : InstRW<[FXa, FXa, Lat20, GroupAlone], (instregex "DLR$")>;
def : InstRW<[FXa, FXa, Lat30, GroupAlone], (instregex "DLGR$")>;
def : InstRW<[FXa, FXa, LSU, Lat30, GroupAlone], (instregex "DL(G)?$")>;
def : InstRW<[FXa2, FXa2, Lat20, GroupAlone], (instregex "DLR$")>;
def : InstRW<[FXa2, FXa2, Lat30, GroupAlone], (instregex "DLGR$")>;
def : InstRW<[FXa2, FXa2, LSU, Lat30, GroupAlone], (instregex "DL(G)?$")>;
//===----------------------------------------------------------------------===//
// Shifts
@ -644,8 +643,8 @@ def : InstRW<[FXb, FXb, Lat2, GroupAlone], (instregex "LXR$")>;
def : InstRW<[VecXsPm, Lat4], (instregex "LT(D|E)BR$")>;
def : InstRW<[VecXsPm, Lat4], (instregex "LTEBRCompare(_VecPseudo)?$")>;
def : InstRW<[VecXsPm, Lat4], (instregex "LTDBRCompare(_VecPseudo)?$")>;
def : InstRW<[VecDF, VecDF, Lat11, GroupAlone], (instregex "LTXBR$")>;
def : InstRW<[VecDF, VecDF, Lat11, GroupAlone],
def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "LTXBR$")>;
def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone],
(instregex "LTXBRCompare(_VecPseudo)?$")>;
// Copy sign
@ -680,16 +679,16 @@ def : InstRW<[VecDF, VecDF, Lat20], (instregex "LDXBR(A)?$")>;
// Load lengthened
def : InstRW<[VecBF, LSU, Lat12], (instregex "LDEB$")>;
def : InstRW<[VecBF], (instregex "LDEBR$")>;
def : InstRW<[VecBF, VecBF, LSU, Lat12 , GroupAlone], (instregex "LX(D|E)B$")>;
def : InstRW<[VecBF, VecBF, Lat9 , GroupAlone], (instregex "LX(D|E)BR$")>;
def : InstRW<[VecBF2, VecBF2, LSU, Lat12 , GroupAlone], (instregex "LX(D|E)B$")>;
def : InstRW<[VecBF2, VecBF2, GroupAlone], (instregex "LX(D|E)BR$")>;
// Convert from fixed / logical
def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CE(F|G)BR$")>;
def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CD(F|G)BR$")>;
def : InstRW<[FXb, VecDF, VecDF, Lat12, GroupAlone], (instregex "CX(F|G)BR$")>;
def : InstRW<[FXb, VecDF2, VecDF2, Lat12, GroupAlone], (instregex "CX(F|G)BR$")>;
def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CEL(F|G)BR$")>;
def : InstRW<[FXb, VecBF, Lat9, BeginGroup], (instregex "CDL(F|G)BR$")>;
def : InstRW<[FXb, VecDF, VecDF, Lat12, GroupAlone], (instregex "CXL(F|G)BR$")>;
def : InstRW<[FXb, VecDF2, VecDF2, Lat12, GroupAlone], (instregex "CXL(F|G)BR$")>;
// Convert to fixed / logical
def : InstRW<[FXb, VecBF, Lat11, BeginGroup], (instregex "CF(E|D)BR$")>;
@ -710,7 +709,7 @@ def : InstRW<[VecXsPm, Lat4], (instregex "L(C|N|P)EBR$")>;
def : InstRW<[FXb], (instregex "LCDFR(_32)?$")>;
def : InstRW<[FXb], (instregex "LNDFR(_32)?$")>;
def : InstRW<[FXb], (instregex "LPDFR(_32)?$")>;
def : InstRW<[VecDF, VecDF, Lat11, GroupAlone], (instregex "L(C|N|P)XBR$")>;
def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "L(C|N|P)XBR$")>;
// Square root
def : InstRW<[VecFPd, LSU], (instregex "SQ(E|D)B$")>;
@ -720,7 +719,7 @@ def : InstRW<[VecFPd, VecFPd, GroupAlone], (instregex "SQXBR$")>;
// Load FP integer
def : InstRW<[VecBF], (instregex "FIEBR(A)?$")>;
def : InstRW<[VecBF], (instregex "FIDBR(A)?$")>;
def : InstRW<[VecDF, VecDF, Lat11, GroupAlone], (instregex "FIXBR(A)?$")>;
def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "FIXBR(A)?$")>;
//===----------------------------------------------------------------------===//
// FP: Binary arithmetic
@ -729,19 +728,19 @@ def : InstRW<[VecDF, VecDF, Lat11, GroupAlone], (instregex "FIXBR(A)?$")>;
// Addition
def : InstRW<[VecBF, LSU, Lat12], (instregex "A(E|D)B$")>;
def : InstRW<[VecBF], (instregex "A(E|D)BR$")>;
def : InstRW<[VecDF, VecDF, Lat11, GroupAlone], (instregex "AXBR$")>;
def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "AXBR$")>;
// Subtraction
def : InstRW<[VecBF, LSU, Lat12], (instregex "S(E|D)B$")>;
def : InstRW<[VecBF], (instregex "S(E|D)BR$")>;
def : InstRW<[VecDF, VecDF, Lat11, GroupAlone], (instregex "SXBR$")>;
def : InstRW<[VecDF2, VecDF2, Lat11, GroupAlone], (instregex "SXBR$")>;
// Multiply
def : InstRW<[VecBF, LSU, Lat12], (instregex "M(D|DE|EE)B$")>;
def : InstRW<[VecBF], (instregex "M(D|DE|EE)BR$")>;
def : InstRW<[VecBF, VecBF, LSU, Lat12, GroupAlone], (instregex "MXDB$")>;
def : InstRW<[VecBF, VecBF, Lat9, GroupAlone], (instregex "MXDBR$")>;
def : InstRW<[VecDF, VecDF, Lat20, GroupAlone], (instregex "MXBR$")>;
def : InstRW<[VecBF2, VecBF2, LSU, Lat12, GroupAlone], (instregex "MXDB$")>;
def : InstRW<[VecBF2, VecBF2, GroupAlone], (instregex "MXDBR$")>;
def : InstRW<[VecDF2, VecDF2, Lat20, GroupAlone], (instregex "MXBR$")>;
// Multiply and add / subtract
def : InstRW<[VecBF, LSU, Lat12, GroupAlone], (instregex "M(A|S)EB$")>;
@ -765,7 +764,7 @@ def : InstRW<[VecDF, VecDF, Lat20, GroupAlone], (instregex "CXBR$")>;
// Test Data Class
def : InstRW<[LSU, VecXsPm, Lat9], (instregex "TC(E|D)B$")>;
def : InstRW<[LSU, VecDF, VecDF, Lat15, GroupAlone], (instregex "TCXB$")>;
def : InstRW<[LSU, VecDF2, VecDF2, Lat15, GroupAlone], (instregex "TCXB$")>;
// --------------------------------- Vector --------------------------------- //
@ -921,26 +920,29 @@ def : InstRW<[VecStr, Lat5], (instregex "VTM$")>;
// Vector: Floating-point arithmetic
//===----------------------------------------------------------------------===//
def : InstRW<[VecBF], (instregex "VCD(G|GB|LG|LGB)$")>;
def : InstRW<[VecBF2], (instregex "VCD(G|GB|LG|LGB)$")>;
def : InstRW<[VecBF], (instregex "WCD(GB|LGB)$")>;
def : InstRW<[VecBF], (instregex "VC(L)?GD$")>;
def : InstRW<[VecBF], (instregex "(V|W)FADB$")>;
def : InstRW<[VecBF], (instregex "(V|W)CGDB$")>;
def : InstRW<[VecBF], (instregex "VF(I|M|A|S)$")>;
def : InstRW<[VecBF], (instregex "VF(I|M|S)DB$")>;
def : InstRW<[VecBF2], (instregex "VC(L)?GD$")>;
def : InstRW<[VecBF2], (instregex "VFADB$")>;
def : InstRW<[VecBF], (instregex "WFADB$")>;
def : InstRW<[VecBF2], (instregex "VCGDB$")>;
def : InstRW<[VecBF], (instregex "WCGDB$")>;
def : InstRW<[VecBF2], (instregex "VF(I|M|A|S)$")>;
def : InstRW<[VecBF2], (instregex "VF(I|M|S)DB$")>;
def : InstRW<[VecBF], (instregex "WF(I|M|S)DB$")>;
def : InstRW<[VecBF], (instregex "(V|W)CLGDB$")>;
def : InstRW<[VecBF2], (instregex "VCLGDB$")>;
def : InstRW<[VecBF], (instregex "WCLGDB$")>;
def : InstRW<[VecXsPm], (instregex "VFL(C|N|P)DB$")>;
def : InstRW<[VecXsPm], (instregex "WFL(C|N|P)DB$")>;
def : InstRW<[VecBF], (instregex "VFM(A|S)$")>;
def : InstRW<[VecBF], (instregex "VFM(A|S)DB$")>;
def : InstRW<[VecBF2], (instregex "VFM(A|S)$")>;
def : InstRW<[VecBF2], (instregex "VFM(A|S)DB$")>;
def : InstRW<[VecBF], (instregex "WFM(A|S)DB$")>;
def : InstRW<[VecXsPm], (instregex "VFPSO$")>;
def : InstRW<[VecXsPm], (instregex "(V|W)FPSODB$")>;
def : InstRW<[VecXsPm, Lat4], (instregex "VFTCI(DB)?$")>;
def : InstRW<[VecXsPm, Lat4], (instregex "WFTCIDB$")>;
def : InstRW<[VecBF], (instregex "VL(DE|ED)$")>;
def : InstRW<[VecBF], (instregex "VL(DE|ED)B$")>;
def : InstRW<[VecBF2], (instregex "VL(DE|ED)$")>;
def : InstRW<[VecBF2], (instregex "VL(DE|ED)B$")>;
def : InstRW<[VecBF], (instregex "WL(DE|ED)B$")>;
// divide / square root

View File

@ -65,6 +65,7 @@ def : WriteRes<FXU, [Z196_FXUnit]> { let Latency = 1; }
def : WriteRes<LSU, [Z196_LSUnit]> { let Latency = 4; }
def : WriteRes<LSU_lat1, [Z196_LSUnit]> { let Latency = 1; }
def : WriteRes<FPU, [Z196_FPUnit]> { let Latency = 8; }
def : WriteRes<FPU2, [Z196_FPUnit, Z196_FPUnit]> { let Latency = 9; }
// -------------------------- INSTRUCTIONS ---------------------------------- //
@ -410,13 +411,13 @@ def : InstRW<[FXU, LSU, Lat9], (instregex "MH(Y)?$")>;
// Division and remainder
//===----------------------------------------------------------------------===//
def : InstRW<[FPU, FPU, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
def : InstRW<[FPU2, FPU2, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
(instregex "DSG(F)?R$")>;
def : InstRW<[FPU, FPU, LSU, FXU, FXU, FXU, Lat30, GroupAlone],
def : InstRW<[FPU2, FPU2, LSU, FXU, FXU, FXU, Lat30, GroupAlone],
(instregex "DSG(F)?$")>;
def : InstRW<[FPU, FPU, FXU, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
def : InstRW<[FPU2, FPU2, FXU, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
(instregex "DL(G)?R$")>;
def : InstRW<[FPU, FPU, LSU, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
def : InstRW<[FPU2, FPU2, LSU, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
(instregex "DL(G)?$")>;
//===----------------------------------------------------------------------===//
@ -589,8 +590,8 @@ def : InstRW<[FXU, FXU, Lat2, GroupAlone], (instregex "LXR$")>;
def : InstRW<[FPU], (instregex "LT(D|E)BR$")>;
def : InstRW<[FPU], (instregex "LTEBRCompare(_VecPseudo)?$")>;
def : InstRW<[FPU], (instregex "LTDBRCompare(_VecPseudo)?$")>;
def : InstRW<[FPU, FPU, Lat9, GroupAlone], (instregex "LTXBR$")>;
def : InstRW<[FPU, FPU, Lat9, GroupAlone],
def : InstRW<[FPU2, FPU2, Lat9, GroupAlone], (instregex "LTXBR$")>;
def : InstRW<[FPU2, FPU2, Lat9, GroupAlone],
(instregex "LTXBRCompare(_VecPseudo)?$")>;
// Copy sign
@ -625,16 +626,16 @@ def : InstRW<[FPU, FPU, Lat20], (instregex "LDXBR(A)?$")>;
// Load lengthened
def : InstRW<[FPU, LSU, Lat12], (instregex "LDEB$")>;
def : InstRW<[FPU], (instregex "LDEBR$")>;
def : InstRW<[FPU, FPU, LSU, Lat15, GroupAlone], (instregex "LX(D|E)B$")>;
def : InstRW<[FPU, FPU, Lat10, GroupAlone], (instregex "LX(D|E)BR$")>;
def : InstRW<[FPU2, FPU2, LSU, Lat15, GroupAlone], (instregex "LX(D|E)B$")>;
def : InstRW<[FPU2, FPU2, Lat10, GroupAlone], (instregex "LX(D|E)BR$")>;
// Convert from fixed / logical
def : InstRW<[FXU, FPU, Lat9, GroupAlone], (instregex "CE(F|G)BR$")>;
def : InstRW<[FXU, FPU, Lat9, GroupAlone], (instregex "CD(F|G)BR$")>;
def : InstRW<[FXU, FPU, FPU, Lat11, GroupAlone], (instregex "CX(F|G)BR$")>;
def : InstRW<[FXU, FPU2, FPU2, Lat11, GroupAlone], (instregex "CX(F|G)BR$")>;
def : InstRW<[FXU, FPU, Lat9, GroupAlone], (instregex "CEL(F|G)BR$")>;
def : InstRW<[FXU, FPU, Lat9, GroupAlone], (instregex "CDL(F|G)BR$")>;
def : InstRW<[FXU, FPU, FPU, Lat11, GroupAlone], (instregex "CXL(F|G)BR$")>;
def : InstRW<[FXU, FPU2, FPU2, Lat11, GroupAlone], (instregex "CXL(F|G)BR$")>;
// Convert to fixed / logical
def : InstRW<[FXU, FPU, Lat12, GroupAlone], (instregex "CF(E|D)BR$")>;
@ -654,17 +655,17 @@ def : InstRW<[FPU], (instregex "L(C|N|P)EBR$")>;
def : InstRW<[FXU], (instregex "LCDFR(_32)?$")>;
def : InstRW<[FXU], (instregex "LNDFR(_32)?$")>;
def : InstRW<[FXU], (instregex "LPDFR(_32)?$")>;
def : InstRW<[FPU, FPU, Lat9, GroupAlone], (instregex "L(C|N|P)XBR$")>;
def : InstRW<[FPU2, FPU2, Lat9, GroupAlone], (instregex "L(C|N|P)XBR$")>;
// Square root
def : InstRW<[FPU, LSU, Lat30], (instregex "SQ(E|D)B$")>;
def : InstRW<[FPU, Lat30], (instregex "SQ(E|D)BR$")>;
def : InstRW<[FPU, FPU, Lat30, GroupAlone], (instregex "SQXBR$")>;
def : InstRW<[FPU2, FPU2, Lat30, GroupAlone], (instregex "SQXBR$")>;
// Load FP integer
def : InstRW<[FPU], (instregex "FIEBR(A)?$")>;
def : InstRW<[FPU], (instregex "FIDBR(A)?$")>;
def : InstRW<[FPU, FPU, Lat15, GroupAlone], (instregex "FIXBR(A)?$")>;
def : InstRW<[FPU2, FPU2, Lat15, GroupAlone], (instregex "FIXBR(A)?$")>;
//===----------------------------------------------------------------------===//
// FP: Binary arithmetic
@ -673,19 +674,19 @@ def : InstRW<[FPU, FPU, Lat15, GroupAlone], (instregex "FIXBR(A)?$")>;
// Addition
def : InstRW<[FPU, LSU, Lat12], (instregex "A(E|D)B$")>;
def : InstRW<[FPU], (instregex "A(E|D)BR$")>;
def : InstRW<[FPU, FPU, Lat20, GroupAlone], (instregex "AXBR$")>;
def : InstRW<[FPU2, FPU2, Lat20, GroupAlone], (instregex "AXBR$")>;
// Subtraction
def : InstRW<[FPU, LSU, Lat12], (instregex "S(E|D)B$")>;
def : InstRW<[FPU], (instregex "S(E|D)BR$")>;
def : InstRW<[FPU, FPU, Lat20, GroupAlone], (instregex "SXBR$")>;
def : InstRW<[FPU2, FPU2, Lat20, GroupAlone], (instregex "SXBR$")>;
// Multiply
def : InstRW<[FPU, LSU, Lat12], (instregex "M(D|DE|EE)B$")>;
def : InstRW<[FPU], (instregex "M(D|DE|EE)BR$")>;
def : InstRW<[FPU, FPU, LSU, Lat15, GroupAlone], (instregex "MXDB$")>;
def : InstRW<[FPU, FPU, Lat10, GroupAlone], (instregex "MXDBR$")>;
def : InstRW<[FPU, FPU, Lat30, GroupAlone], (instregex "MXBR$")>;
def : InstRW<[FPU2, FPU2, LSU, Lat15, GroupAlone], (instregex "MXDB$")>;
def : InstRW<[FPU2, FPU2, Lat10, GroupAlone], (instregex "MXDBR$")>;
def : InstRW<[FPU2, FPU2, Lat30, GroupAlone], (instregex "MXBR$")>;
// Multiply and add / subtract
def : InstRW<[FPU, LSU, Lat12, GroupAlone], (instregex "M(A|S)EB$")>;
@ -696,7 +697,7 @@ def : InstRW<[FPU, GroupAlone], (instregex "M(A|S)DBR$")>;
// Division
def : InstRW<[FPU, LSU, Lat30], (instregex "D(E|D)B$")>;
def : InstRW<[FPU, Lat30], (instregex "D(E|D)BR$")>;
def : InstRW<[FPU, FPU, Lat30, GroupAlone], (instregex "DXBR$")>;
def : InstRW<[FPU2, FPU2, Lat30, GroupAlone], (instregex "DXBR$")>;
//===----------------------------------------------------------------------===//
// FP: Comparisons
@ -709,7 +710,7 @@ def : InstRW<[FPU, FPU, Lat30], (instregex "CXBR$")>;
// Test Data Class
def : InstRW<[FPU, LSU, Lat15], (instregex "TC(E|D)B$")>;
def : InstRW<[FPU, FPU, LSU, Lat15, GroupAlone], (instregex "TCXB$")>;
def : InstRW<[FPU2, FPU2, LSU, Lat15, GroupAlone], (instregex "TCXB$")>;
}

View File

@ -66,6 +66,7 @@ def : WriteRes<FXU, [ZEC12_FXUnit]> { let Latency = 1; }
def : WriteRes<LSU, [ZEC12_LSUnit]> { let Latency = 4; }
def : WriteRes<LSU_lat1, [ZEC12_LSUnit]> { let Latency = 1; }
def : WriteRes<FPU, [ZEC12_FPUnit]> { let Latency = 8; }
def : WriteRes<FPU2, [ZEC12_FPUnit, ZEC12_FPUnit]> { let Latency = 9; }
def : WriteRes<VBU, [ZEC12_VBUnit]>; // Virtual Branching Unit
// -------------------------- INSTRUCTIONS ---------------------------------- //
@ -414,13 +415,13 @@ def : InstRW<[FXU, LSU, Lat9], (instregex "MH(Y)?$")>;
// Division and remainder
//===----------------------------------------------------------------------===//
def : InstRW<[FPU, FPU, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
def : InstRW<[FPU2, FPU2, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
(instregex "DSG(F)?R$")>;
def : InstRW<[FPU, FPU, LSU, FXU, FXU, FXU, Lat30, GroupAlone],
def : InstRW<[FPU2, FPU2, LSU, FXU, FXU, FXU, Lat30, GroupAlone],
(instregex "DSG(F)?$")>;
def : InstRW<[FPU, FPU, FXU, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
def : InstRW<[FPU2, FPU2, FXU, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
(instregex "DL(G)?R$")>;
def : InstRW<[FPU, FPU, LSU, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
def : InstRW<[FPU2, FPU2, LSU, FXU, FXU, FXU, FXU, Lat30, GroupAlone],
(instregex "DL(G)?$")>;
//===----------------------------------------------------------------------===//
@ -619,8 +620,8 @@ def : InstRW<[FXU, FXU, Lat2, GroupAlone], (instregex "LXR$")>;
def : InstRW<[FPU], (instregex "LT(D|E)BR$")>;
def : InstRW<[FPU], (instregex "LTEBRCompare(_VecPseudo)?$")>;
def : InstRW<[FPU], (instregex "LTDBRCompare(_VecPseudo)?$")>;
def : InstRW<[FPU, FPU, Lat9, GroupAlone], (instregex "LTXBR$")>;
def : InstRW<[FPU, FPU, Lat9, GroupAlone],
def : InstRW<[FPU2, FPU2, Lat9, GroupAlone], (instregex "LTXBR$")>;
def : InstRW<[FPU2, FPU2, Lat9, GroupAlone],
(instregex "LTXBRCompare(_VecPseudo)?$")>;
// Copy sign
@ -655,16 +656,16 @@ def : InstRW<[FPU, FPU, Lat20], (instregex "LDXBR(A)?$")>;
// Load lengthened
def : InstRW<[FPU, LSU, Lat12], (instregex "LDEB$")>;
def : InstRW<[FPU], (instregex "LDEBR$")>;
def : InstRW<[FPU, FPU, LSU, Lat15, GroupAlone], (instregex "LX(D|E)B$")>;
def : InstRW<[FPU, FPU, Lat10, GroupAlone], (instregex "LX(D|E)BR$")>;
def : InstRW<[FPU2, FPU2, LSU, Lat15, GroupAlone], (instregex "LX(D|E)B$")>;
def : InstRW<[FPU2, FPU2, Lat10, GroupAlone], (instregex "LX(D|E)BR$")>;
// Convert from fixed / logical
def : InstRW<[FXU, FPU, Lat9, GroupAlone], (instregex "CE(F|G)BR$")>;
def : InstRW<[FXU, FPU, Lat9, GroupAlone], (instregex "CD(F|G)BR$")>;
def : InstRW<[FXU, FPU, FPU, Lat11, GroupAlone], (instregex "CX(F|G)BR$")>;
def : InstRW<[FXU, FPU2, FPU2, Lat11, GroupAlone], (instregex "CX(F|G)BR$")>;
def : InstRW<[FXU, FPU, Lat9, GroupAlone], (instregex "CEL(F|G)BR$")>;
def : InstRW<[FXU, FPU, Lat9, GroupAlone], (instregex "CDL(F|G)BR$")>;
def : InstRW<[FXU, FPU, FPU, Lat11, GroupAlone], (instregex "CXL(F|G)BR$")>;
def : InstRW<[FXU, FPU2, FPU2, Lat11, GroupAlone], (instregex "CXL(F|G)BR$")>;
// Convert to fixed / logical
def : InstRW<[FXU, FPU, Lat12, GroupAlone], (instregex "CF(E|D)BR$")>;
@ -684,17 +685,17 @@ def : InstRW<[FPU], (instregex "L(C|N|P)EBR$")>;
def : InstRW<[FXU], (instregex "LCDFR(_32)?$")>;
def : InstRW<[FXU], (instregex "LNDFR(_32)?$")>;
def : InstRW<[FXU], (instregex "LPDFR(_32)?$")>;
def : InstRW<[FPU, FPU, Lat9, GroupAlone], (instregex "L(C|N|P)XBR$")>;
def : InstRW<[FPU2, FPU2, Lat9, GroupAlone], (instregex "L(C|N|P)XBR$")>;
// Square root
def : InstRW<[FPU, LSU, Lat30], (instregex "SQ(E|D)B$")>;
def : InstRW<[FPU, Lat30], (instregex "SQ(E|D)BR$")>;
def : InstRW<[FPU, FPU, Lat30, GroupAlone], (instregex "SQXBR$")>;
def : InstRW<[FPU2, FPU2, Lat30, GroupAlone], (instregex "SQXBR$")>;
// Load FP integer
def : InstRW<[FPU], (instregex "FIEBR(A)?$")>;
def : InstRW<[FPU], (instregex "FIDBR(A)?$")>;
def : InstRW<[FPU, FPU, Lat15, GroupAlone], (instregex "FIXBR(A)?$")>;
def : InstRW<[FPU2, FPU2, Lat15, GroupAlone], (instregex "FIXBR(A)?$")>;
//===----------------------------------------------------------------------===//
// FP: Binary arithmetic
@ -703,19 +704,19 @@ def : InstRW<[FPU, FPU, Lat15, GroupAlone], (instregex "FIXBR(A)?$")>;
// Addition
def : InstRW<[FPU, LSU, Lat12], (instregex "A(E|D)B$")>;
def : InstRW<[FPU], (instregex "A(E|D)BR$")>;
def : InstRW<[FPU, FPU, Lat20, GroupAlone], (instregex "AXBR$")>;
def : InstRW<[FPU2, FPU2, Lat20, GroupAlone], (instregex "AXBR$")>;
// Subtraction
def : InstRW<[FPU, LSU, Lat12], (instregex "S(E|D)B$")>;
def : InstRW<[FPU], (instregex "S(E|D)BR$")>;
def : InstRW<[FPU, FPU, Lat20, GroupAlone], (instregex "SXBR$")>;
def : InstRW<[FPU2, FPU2, Lat20, GroupAlone], (instregex "SXBR$")>;
// Multiply
def : InstRW<[FPU, LSU, Lat12], (instregex "M(D|DE|EE)B$")>;
def : InstRW<[FPU], (instregex "M(D|DE|EE)BR$")>;
def : InstRW<[FPU, FPU, LSU, Lat15, GroupAlone], (instregex "MXDB$")>;
def : InstRW<[FPU, FPU, Lat10, GroupAlone], (instregex "MXDBR$")>;
def : InstRW<[FPU, FPU, Lat30, GroupAlone], (instregex "MXBR$")>;
def : InstRW<[FPU2, FPU2, LSU, Lat15, GroupAlone], (instregex "MXDB$")>;
def : InstRW<[FPU2, FPU2, Lat10, GroupAlone], (instregex "MXDBR$")>;
def : InstRW<[FPU2, FPU2, Lat30, GroupAlone], (instregex "MXBR$")>;
// Multiply and add / subtract
def : InstRW<[FPU, LSU, Lat12, GroupAlone], (instregex "M(A|S)EB$")>;
@ -726,7 +727,7 @@ def : InstRW<[FPU, GroupAlone], (instregex "M(A|S)DBR$")>;
// Division
def : InstRW<[FPU, LSU, Lat30], (instregex "D(E|D)B$")>;
def : InstRW<[FPU, Lat30], (instregex "D(E|D)BR$")>;
def : InstRW<[FPU, FPU, Lat30, GroupAlone], (instregex "DXBR$")>;
def : InstRW<[FPU2, FPU2, Lat30, GroupAlone], (instregex "DXBR$")>;
//===----------------------------------------------------------------------===//
// FP: Comparisons
@ -739,7 +740,7 @@ def : InstRW<[FPU, FPU, Lat30], (instregex "CXBR$")>;
// Test Data Class
def : InstRW<[FPU, LSU, Lat15], (instregex "TC(E|D)B$")>;
def : InstRW<[FPU, FPU, LSU, Lat15, GroupAlone], (instregex "TCXB$")>;
def : InstRW<[FPU2, FPU2, LSU, Lat15, GroupAlone], (instregex "TCXB$")>;
}