1 //===-- X86PfmCounters.td - X86 Hardware Counters ----------*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This describes the available hardware counters for various subtargets.
12 //===----------------------------------------------------------------------===//
14 def UnhaltedCoreCyclesPfmCounter : PfmCounter<"unhalted_core_cycles">;
15 def UopsIssuedPfmCounter : PfmCounter<"uops_issued:any">;
17 // No default counters on X86.
18 def DefaultPfmCounters : ProcPfmCounters {}
19 def : PfmCountersDefaultBinding<DefaultPfmCounters>;
21 // Intel X86 Counters.
22 def PentiumPfmCounters : ProcPfmCounters {
23 let CycleCounter = PfmCounter<"cpu_clk_unhalted">;
24 let UopsCounter = PfmCounter<"uops_retired">;
26 def : PfmCountersBinding<"pentiumpro", PentiumPfmCounters>;
27 def : PfmCountersBinding<"pentium2", PentiumPfmCounters>;
28 def : PfmCountersBinding<"pentium3", PentiumPfmCounters>;
29 def : PfmCountersBinding<"pentium3m", PentiumPfmCounters>;
30 def : PfmCountersBinding<"pentium-m", PentiumPfmCounters>;
32 def CorePfmCounters : ProcPfmCounters {
33 let CycleCounter = UnhaltedCoreCyclesPfmCounter;
34 let UopsCounter = PfmCounter<"uops_retired:any">;
36 def : PfmCountersBinding<"yonah", CorePfmCounters>;
37 def : PfmCountersBinding<"prescott", CorePfmCounters>;
38 def : PfmCountersBinding<"core2", CorePfmCounters>;
39 def : PfmCountersBinding<"penryn", CorePfmCounters>;
40 def : PfmCountersBinding<"nehalem", CorePfmCounters>;
41 def : PfmCountersBinding<"corei7", CorePfmCounters>;
42 def : PfmCountersBinding<"westmere", CorePfmCounters>;
44 def AtomPfmCounters : ProcPfmCounters {
45 let CycleCounter = UnhaltedCoreCyclesPfmCounter;
46 let UopsCounter = PfmCounter<"uops_retired:any">;
48 def : PfmCountersBinding<"bonnell", AtomPfmCounters>;
49 def : PfmCountersBinding<"atom", AtomPfmCounters>;
51 def SLMPfmCounters : ProcPfmCounters {
52 let CycleCounter = UnhaltedCoreCyclesPfmCounter;
53 let UopsCounter = PfmCounter<"uops_retired:any">;
55 def : PfmCountersBinding<"silvermont", SLMPfmCounters>;
56 def : PfmCountersBinding<"goldmont", SLMPfmCounters>;
57 def : PfmCountersBinding<"goldmont-plus", SLMPfmCounters>;
58 def : PfmCountersBinding<"tremont", SLMPfmCounters>;
60 def KnightPfmCounters : ProcPfmCounters {
61 let CycleCounter = UnhaltedCoreCyclesPfmCounter;
62 let UopsCounter = PfmCounter<"uops_retired:all">;
64 def : PfmCountersBinding<"knl", KnightPfmCounters>;
65 def : PfmCountersBinding<"knm", KnightPfmCounters>;
67 def SandyBridgePfmCounters : ProcPfmCounters {
68 let CycleCounter = UnhaltedCoreCyclesPfmCounter;
69 let UopsCounter = UopsIssuedPfmCounter;
71 PfmIssueCounter<"SBPort0", "uops_dispatched_port:port_0">,
72 PfmIssueCounter<"SBPort1", "uops_dispatched_port:port_1">,
73 PfmIssueCounter<"SBPort23", "uops_dispatched_port:port_2 + uops_dispatched_port:port_3">,
74 PfmIssueCounter<"SBPort4", "uops_dispatched_port:port_4">,
75 PfmIssueCounter<"SBPort5", "uops_dispatched_port:port_5">
78 def : PfmCountersBinding<"sandybridge", SandyBridgePfmCounters>;
79 def : PfmCountersBinding<"ivybridge", SandyBridgePfmCounters>;
81 def HaswellPfmCounters : ProcPfmCounters {
82 let CycleCounter = UnhaltedCoreCyclesPfmCounter;
83 let UopsCounter = UopsIssuedPfmCounter;
85 PfmIssueCounter<"HWPort0", "uops_dispatched_port:port_0">,
86 PfmIssueCounter<"HWPort1", "uops_dispatched_port:port_1">,
87 PfmIssueCounter<"HWPort2", "uops_dispatched_port:port_2">,
88 PfmIssueCounter<"HWPort3", "uops_dispatched_port:port_3">,
89 PfmIssueCounter<"HWPort4", "uops_dispatched_port:port_4">,
90 PfmIssueCounter<"HWPort5", "uops_dispatched_port:port_5">,
91 PfmIssueCounter<"HWPort6", "uops_dispatched_port:port_6">,
92 PfmIssueCounter<"HWPort7", "uops_dispatched_port:port_7">
95 def : PfmCountersBinding<"haswell", HaswellPfmCounters>;
97 def BroadwellPfmCounters : ProcPfmCounters {
98 let CycleCounter = UnhaltedCoreCyclesPfmCounter;
99 let UopsCounter = UopsIssuedPfmCounter;
100 let IssueCounters = [
101 PfmIssueCounter<"BWPort0", "uops_executed_port:port_0">,
102 PfmIssueCounter<"BWPort1", "uops_executed_port:port_1">,
103 PfmIssueCounter<"BWPort2", "uops_executed_port:port_2">,
104 PfmIssueCounter<"BWPort3", "uops_executed_port:port_3">,
105 PfmIssueCounter<"BWPort4", "uops_executed_port:port_4">,
106 PfmIssueCounter<"BWPort5", "uops_executed_port:port_5">,
107 PfmIssueCounter<"BWPort6", "uops_executed_port:port_6">,
108 PfmIssueCounter<"BWPort7", "uops_executed_port:port_7">
111 def : PfmCountersBinding<"broadwell", BroadwellPfmCounters>;
113 def SkylakeClientPfmCounters : ProcPfmCounters {
114 let CycleCounter = UnhaltedCoreCyclesPfmCounter;
115 let UopsCounter = UopsIssuedPfmCounter;
116 let IssueCounters = [
117 PfmIssueCounter<"SKLPort0", "uops_dispatched_port:port_0">,
118 PfmIssueCounter<"SKLPort1", "uops_dispatched_port:port_1">,
119 PfmIssueCounter<"SKLPort2", "uops_dispatched_port:port_2">,
120 PfmIssueCounter<"SKLPort3", "uops_dispatched_port:port_3">,
121 PfmIssueCounter<"SKLPort4", "uops_dispatched_port:port_4">,
122 PfmIssueCounter<"SKLPort5", "uops_dispatched_port:port_5">,
123 PfmIssueCounter<"SKLPort6", "uops_dispatched_port:port_6">,
124 PfmIssueCounter<"SKLPort7", "uops_dispatched_port:port_7">
127 def : PfmCountersBinding<"skylake", SkylakeClientPfmCounters>;
129 def SkylakeServerPfmCounters : ProcPfmCounters {
130 let CycleCounter = UnhaltedCoreCyclesPfmCounter;
131 let UopsCounter = UopsIssuedPfmCounter;
132 let IssueCounters = [
133 PfmIssueCounter<"SKXPort0", "uops_dispatched_port:port_0">,
134 PfmIssueCounter<"SKXPort1", "uops_dispatched_port:port_1">,
135 PfmIssueCounter<"SKXPort2", "uops_dispatched_port:port_2">,
136 PfmIssueCounter<"SKXPort3", "uops_dispatched_port:port_3">,
137 PfmIssueCounter<"SKXPort4", "uops_dispatched_port:port_4">,
138 PfmIssueCounter<"SKXPort5", "uops_dispatched_port:port_5">,
139 PfmIssueCounter<"SKXPort6", "uops_dispatched_port:port_6">,
140 PfmIssueCounter<"SKXPort7", "uops_dispatched_port:port_7">
143 def : PfmCountersBinding<"skylake-avx512", SkylakeServerPfmCounters>;
144 def : PfmCountersBinding<"cascadelake", SkylakeServerPfmCounters>;
145 def : PfmCountersBinding<"cannonlake", SkylakeServerPfmCounters>;
146 def : PfmCountersBinding<"icelake-client", SkylakeServerPfmCounters>;
147 def : PfmCountersBinding<"icelake-server", SkylakeServerPfmCounters>;
150 // Set basic counters for AMD cpus that we know libpfm4 supports.
151 def DefaultAMDPfmCounters : ProcPfmCounters {
152 let CycleCounter = PfmCounter<"cpu_clk_unhalted">;
153 let UopsCounter = PfmCounter<"retired_uops">;
155 def : PfmCountersBinding<"athlon", DefaultAMDPfmCounters>;
156 def : PfmCountersBinding<"athlon-tbird", DefaultAMDPfmCounters>;
157 def : PfmCountersBinding<"athlon-4", DefaultAMDPfmCounters>;
158 def : PfmCountersBinding<"athlon-xp", DefaultAMDPfmCounters>;
159 def : PfmCountersBinding<"athlon-mp", DefaultAMDPfmCounters>;
160 def : PfmCountersBinding<"k8", DefaultAMDPfmCounters>;
161 def : PfmCountersBinding<"opteron", DefaultAMDPfmCounters>;
162 def : PfmCountersBinding<"athlon64", DefaultAMDPfmCounters>;
163 def : PfmCountersBinding<"athlon-fx", DefaultAMDPfmCounters>;
164 def : PfmCountersBinding<"k8-sse3", DefaultAMDPfmCounters>;
165 def : PfmCountersBinding<"opteron-sse3", DefaultAMDPfmCounters>;
166 def : PfmCountersBinding<"athlon64-sse3", DefaultAMDPfmCounters>;
167 def : PfmCountersBinding<"amdfam10", DefaultAMDPfmCounters>;
168 def : PfmCountersBinding<"barcelona", DefaultAMDPfmCounters>;
170 def BdVer2PfmCounters : ProcPfmCounters {
171 let CycleCounter = PfmCounter<"cpu_clk_unhalted">;
172 let UopsCounter = PfmCounter<"retired_uops">;
173 let IssueCounters = [
174 PfmIssueCounter<"PdFPU0", "dispatched_fpu_ops:ops_pipe0 + dispatched_fpu_ops:ops_dual_pipe0">,
175 PfmIssueCounter<"PdFPU1", "dispatched_fpu_ops:ops_pipe1 + dispatched_fpu_ops:ops_dual_pipe1">,
176 PfmIssueCounter<"PdFPU2", "dispatched_fpu_ops:ops_pipe2 + dispatched_fpu_ops:ops_dual_pipe2">,
177 PfmIssueCounter<"PdFPU3", "dispatched_fpu_ops:ops_pipe3 + dispatched_fpu_ops:ops_dual_pipe3">
180 def : PfmCountersBinding<"bdver1", BdVer2PfmCounters>;
181 def : PfmCountersBinding<"bdver2", BdVer2PfmCounters>;
183 def BdVer3PfmCounters : ProcPfmCounters {
184 let CycleCounter = PfmCounter<"cpu_clk_unhalted">;
185 let UopsCounter = PfmCounter<"retired_uops">;
186 let IssueCounters = [
187 PfmIssueCounter<"SrFPU0", "dispatched_fpu_ops:ops_pipe0 + dispatched_fpu_ops:ops_dual_pipe0">,
188 PfmIssueCounter<"SrFPU1", "dispatched_fpu_ops:ops_pipe1 + dispatched_fpu_ops:ops_dual_pipe1">,
189 PfmIssueCounter<"SrFPU2", "dispatched_fpu_ops:ops_pipe2 + dispatched_fpu_ops:ops_dual_pipe2">
192 def : PfmCountersBinding<"bdver3", BdVer3PfmCounters>;
193 def : PfmCountersBinding<"bdver4", BdVer3PfmCounters>;
195 def BtVer1PfmCounters : ProcPfmCounters {
196 let CycleCounter = PfmCounter<"cpu_clk_unhalted">;
197 let UopsCounter = PfmCounter<"retired_uops">;
198 let IssueCounters = [
199 PfmIssueCounter<"BtFPU0", "dispatched_fpu:pipe0">,
200 PfmIssueCounter<"BtFPU1", "dispatched_fpu:pipe1">
203 def : PfmCountersBinding<"btver1", BtVer1PfmCounters>;
205 def BtVer2PfmCounters : ProcPfmCounters {
206 let CycleCounter = PfmCounter<"cpu_clk_unhalted">;
207 let UopsCounter = PfmCounter<"retired_uops">;
208 let IssueCounters = [
209 PfmIssueCounter<"JFPU0", "dispatched_fpu:pipe0">,
210 PfmIssueCounter<"JFPU1", "dispatched_fpu:pipe1">
213 def : PfmCountersBinding<"btver2", BtVer2PfmCounters>;
215 def ZnVer1PfmCounters : ProcPfmCounters {
216 let CycleCounter = PfmCounter<"cycles_not_in_halt">;
217 let UopsCounter = PfmCounter<"retired_uops">;
218 let IssueCounters = [
219 PfmIssueCounter<"ZnFPU0", "fpu_pipe_assignment:total0">,
220 PfmIssueCounter<"ZnFPU1", "fpu_pipe_assignment:total1">,
221 PfmIssueCounter<"ZnFPU2", "fpu_pipe_assignment:total2">,
222 PfmIssueCounter<"ZnFPU3", "fpu_pipe_assignment:total3">,
223 PfmIssueCounter<"ZnDivider", "div_op_count">
226 def : PfmCountersBinding<"znver1", ZnVer1PfmCounters>;