1 #include "MemorySizeDistributions.h"
2 
3 #include "llvm/Support/ErrorHandling.h"
4 #include "llvm/Support/raw_ostream.h"
5 
6 namespace llvm {
7 namespace libc_benchmarks {
8 
9 static constexpr double MemcmpGoogleA[] = {
10 #include "distributions/MemcmpGoogleA.csv"
11 };
12 static constexpr double MemcmpGoogleB[] = {
13 #include "distributions/MemcmpGoogleB.csv"
14 };
15 static constexpr double MemcmpGoogleD[] = {
16 #include "distributions/MemcmpGoogleD.csv"
17 };
18 static constexpr double MemcmpGoogleQ[] = {
19 #include "distributions/MemcmpGoogleQ.csv"
20 };
21 static constexpr double MemcmpGoogleL[] = {
22 #include "distributions/MemcmpGoogleL.csv"
23 };
24 static constexpr double MemcmpGoogleM[] = {
25 #include "distributions/MemcmpGoogleM.csv"
26 };
27 static constexpr double MemcmpGoogleS[] = {
28 #include "distributions/MemcmpGoogleS.csv"
29 };
30 static constexpr double MemcmpGoogleW[] = {
31 #include "distributions/MemcmpGoogleW.csv"
32 };
33 static constexpr double MemcmpGoogleU[] = {
34 #include "distributions/MemcmpGoogleU.csv"
35 };
36 static constexpr double MemcpyGoogleA[] = {
37 #include "distributions/MemcpyGoogleA.csv"
38 };
39 static constexpr double MemcpyGoogleD[] = {
40 #include "distributions/MemcpyGoogleD.csv"
41 };
42 static constexpr double MemcpyGoogleB[] = {
43 #include "distributions/MemcpyGoogleB.csv"
44 };
45 static constexpr double MemcpyGoogleQ[] = {
46 #include "distributions/MemcpyGoogleQ.csv"
47 };
48 static constexpr double MemcpyGoogleL[] = {
49 #include "distributions/MemcpyGoogleL.csv"
50 };
51 static constexpr double MemcpyGoogleM[] = {
52 #include "distributions/MemcpyGoogleM.csv"
53 };
54 static constexpr double MemcpyGoogleS[] = {
55 #include "distributions/MemcpyGoogleS.csv"
56 };
57 static constexpr double MemcpyGoogleW[] = {
58 #include "distributions/MemcpyGoogleW.csv"
59 };
60 static constexpr double MemcpyGoogleU[] = {
61 #include "distributions/MemcpyGoogleU.csv"
62 };
63 static constexpr double MemsetGoogleA[] = {
64 #include "distributions/MemsetGoogleA.csv"
65 };
66 static constexpr double MemsetGoogleB[] = {
67 #include "distributions/MemsetGoogleB.csv"
68 };
69 static constexpr double MemsetGoogleD[] = {
70 #include "distributions/MemsetGoogleD.csv"
71 };
72 static constexpr double MemsetGoogleQ[] = {
73 #include "distributions/MemsetGoogleQ.csv"
74 };
75 static constexpr double MemsetGoogleL[] = {
76 #include "distributions/MemsetGoogleL.csv"
77 };
78 static constexpr double MemsetGoogleM[] = {
79 #include "distributions/MemsetGoogleM.csv"
80 };
81 static constexpr double MemsetGoogleS[] = {
82 #include "distributions/MemsetGoogleS.csv"
83 };
84 static constexpr double MemsetGoogleW[] = {
85 #include "distributions/MemsetGoogleW.csv"
86 };
87 static constexpr double MemsetGoogleU[] = {
88 #include "distributions/MemsetGoogleU.csv"
89 };
90 static constexpr double Uniform384To4096[] = {
91 #include "distributions/Uniform384To4096.csv"
92 };
93 
94 ArrayRef<MemorySizeDistribution> getMemcpySizeDistributions() {
95   static constexpr MemorySizeDistribution kDistributions[] = {
96       {"memcpy Google A", MemcpyGoogleA},
97       {"memcpy Google B", MemcpyGoogleB},
98       {"memcpy Google D", MemcpyGoogleD},
99       {"memcpy Google L", MemcpyGoogleL},
100       {"memcpy Google M", MemcpyGoogleM},
101       {"memcpy Google Q", MemcpyGoogleQ},
102       {"memcpy Google S", MemcpyGoogleS},
103       {"memcpy Google U", MemcpyGoogleU},
104       {"memcpy Google W", MemcpyGoogleW},
105       {"uniform 384 to 4096", Uniform384To4096},
106   };
107   return kDistributions;
108 }
109 
110 ArrayRef<MemorySizeDistribution> getMemsetSizeDistributions() {
111   static constexpr MemorySizeDistribution kDistributions[] = {
112       {"memset Google A", MemsetGoogleA},
113       {"memset Google B", MemsetGoogleB},
114       {"memset Google D", MemsetGoogleD},
115       {"memset Google L", MemsetGoogleL},
116       {"memset Google M", MemsetGoogleM},
117       {"memset Google Q", MemsetGoogleQ},
118       {"memset Google S", MemsetGoogleS},
119       {"memset Google U", MemsetGoogleU},
120       {"memset Google W", MemsetGoogleW},
121       {"uniform 384 to 4096", Uniform384To4096},
122   };
123   return kDistributions;
124 }
125 
126 ArrayRef<MemorySizeDistribution> getMemcmpSizeDistributions() {
127   static constexpr MemorySizeDistribution kDistributions[] = {
128       {"memcmp Google A", MemcmpGoogleA},
129       {"memcmp Google B", MemcmpGoogleB},
130       {"memcmp Google D", MemcmpGoogleD},
131       {"memcmp Google L", MemcmpGoogleL},
132       {"memcmp Google M", MemcmpGoogleM},
133       {"memcmp Google Q", MemcmpGoogleQ},
134       {"memcmp Google S", MemcmpGoogleS},
135       {"memcmp Google U", MemcmpGoogleU},
136       {"memcmp Google W", MemcmpGoogleW},
137       {"uniform 384 to 4096", Uniform384To4096},
138   };
139   return kDistributions;
140 }
141 
142 MemorySizeDistribution
143 getDistributionOrDie(ArrayRef<MemorySizeDistribution> Distributions,
144                      StringRef Name) {
145   size_t Index = 0;
146   for (const auto &MSD : Distributions) {
147     if (MSD.Name == Name)
148       return MSD;
149     ++Index;
150   }
151   std::string Message;
152   raw_string_ostream Stream(Message);
153   Stream << "Unknown MemorySizeDistribution '" << Name
154          << "', available distributions:\n";
155   for (const auto &MSD : Distributions)
156     Stream << "'" << MSD.Name << "'\n";
157   report_fatal_error(Stream.str());
158 }
159 
160 } // namespace libc_benchmarks
161 } // namespace llvm
162