1 // [AsmJit]
2 // Machine Code Generation for C++.
3 //
4 // [License]
5 // Zlib - See LICENSE.md file in the package.
6 
7 #include "./asmjit.h"
8 
9 using namespace asmjit;
10 
11 // ============================================================================
12 // [DumpCpu]
13 // ============================================================================
14 
15 struct DumpCpuFeature {
16   uint32_t feature;
17   const char* name;
18 };
19 
hostArch()20 static const char* hostArch() noexcept {
21   switch (ArchInfo::kIdHost) {
22     case ArchInfo::kIdX86: return "X86";
23     case ArchInfo::kIdX64: return "X64";
24     case ArchInfo::kIdA32: return "ARM32";
25     case ArchInfo::kIdA64: return "ARM64";
26     default: return "Unknown";
27   }
28 }
29 
dumpFeatures(const CpuInfo & cpu,const DumpCpuFeature * data,size_t count)30 static void dumpFeatures(const CpuInfo& cpu, const DumpCpuFeature* data, size_t count) noexcept {
31   for (size_t i = 0; i < count; i++)
32     if (cpu.hasFeature(data[i].feature))
33       INFO("  %s", data[i].name);
34 }
35 
dumpCpu(void)36 static void dumpCpu(void) noexcept {
37   const CpuInfo& cpu = CpuInfo::host();
38 
39   INFO("Host CPU:");
40   INFO("  Vendor                  : %s", cpu.vendor());
41   INFO("  Brand                   : %s", cpu.brand());
42   INFO("  Model ID                : %u", cpu.modelId());
43   INFO("  Brand ID                : %u", cpu.brandId());
44   INFO("  Family ID               : %u", cpu.familyId());
45   INFO("  Stepping                : %u", cpu.stepping());
46   INFO("  Processor Type          : %u", cpu.processorType());
47   INFO("  Max logical Processors  : %u", cpu.maxLogicalProcessors());
48   INFO("  Cache-Line Size         : %u", cpu.cacheLineSize());
49   INFO("  HW-Thread Count         : %u", cpu.hwThreadCount());
50   INFO("");
51 
52   // --------------------------------------------------------------------------
53   // [X86]
54   // --------------------------------------------------------------------------
55 
56   #if ASMJIT_ARCH_X86
57   static const DumpCpuFeature x86FeaturesList[] = {
58     { x86::Features::kNX              , "NX"               },
59     { x86::Features::kMT              , "MT"               },
60     { x86::Features::k3DNOW           , "3DNOW"            },
61     { x86::Features::k3DNOW2          , "3DNOW2"           },
62     { x86::Features::kADX             , "ADX"              },
63     { x86::Features::kAESNI           , "AESNI"            },
64     { x86::Features::kALTMOVCR8       , "ALTMOVCR8"        },
65     { x86::Features::kAVX             , "AVX"              },
66     { x86::Features::kAVX2            , "AVX2"             },
67     { x86::Features::kAVX512_4FMAPS   , "AVX512_4FMAPS"    },
68     { x86::Features::kAVX512_4VNNIW   , "AVX512_4VNNIW"    },
69     { x86::Features::kAVX512_BITALG   , "AVX512_BITALG"    },
70     { x86::Features::kAVX512_BW       , "AVX512_BW"        },
71     { x86::Features::kAVX512_CDI      , "AVX512_CDI"       },
72     { x86::Features::kAVX512_DQ       , "AVX512_DQ"        },
73     { x86::Features::kAVX512_ERI      , "AVX512_ERI"       },
74     { x86::Features::kAVX512_F        , "AVX512_F"         },
75     { x86::Features::kAVX512_IFMA     , "AVX512_IFMA"      },
76     { x86::Features::kAVX512_PFI      , "AVX512_PFI"       },
77     { x86::Features::kAVX512_VBMI     , "AVX512_VBMI"      },
78     { x86::Features::kAVX512_VBMI2    , "AVX512_VBMI2"     },
79     { x86::Features::kAVX512_VL       , "AVX512_VL"        },
80     { x86::Features::kAVX512_VNNI     , "AVX512_VNNI"      },
81     { x86::Features::kAVX512_VPOPCNTDQ, "AVX512_VPOPCNTDQ" },
82     { x86::Features::kBMI             , "BMI"              },
83     { x86::Features::kBMI2            , "BMI2"             },
84     { x86::Features::kCLFLUSH         , "CLFLUSH"          },
85     { x86::Features::kCLFLUSHOPT      , "CLFLUSHOPT"       },
86     { x86::Features::kCLWB            , "CLWB"             },
87     { x86::Features::kCLZERO          , "CLZERO"           },
88     { x86::Features::kCMOV            , "CMOV"             },
89     { x86::Features::kCMPXCHG16B      , "CMPXCHG16B"       },
90     { x86::Features::kCMPXCHG8B       , "CMPXCHG8B"        },
91     { x86::Features::kERMS            , "ERMS"             },
92     { x86::Features::kF16C            , "F16C"             },
93     { x86::Features::kFMA             , "FMA"              },
94     { x86::Features::kFMA4            , "FMA4"             },
95     { x86::Features::kFPU             , "FPU"              },
96     { x86::Features::kFSGSBASE        , "FSGSBASE"         },
97     { x86::Features::kFXSR            , "FXSR"             },
98     { x86::Features::kFXSROPT         , "FXSROPT"          },
99     { x86::Features::kGEODE           , "GEODE"            },
100     { x86::Features::kGFNI            , "GFNI"             },
101     { x86::Features::kHLE             , "HLE"              },
102     { x86::Features::kI486            , "I486"             },
103     { x86::Features::kLAHFSAHF        , "LAHFSAHF"         },
104     { x86::Features::kLWP             , "LWP"              },
105     { x86::Features::kLZCNT           , "LZCNT"            },
106     { x86::Features::kMMX             , "MMX"              },
107     { x86::Features::kMMX2            , "MMX2"             },
108     { x86::Features::kMONITOR         , "MONITOR"          },
109     { x86::Features::kMONITORX        , "MONITORX"         },
110     { x86::Features::kMOVBE           , "MOVBE"            },
111     { x86::Features::kMPX             , "MPX"              },
112     { x86::Features::kMSR             , "MSR"              },
113     { x86::Features::kMSSE            , "MSSE"             },
114     { x86::Features::kOSXSAVE         , "OSXSAVE"          },
115     { x86::Features::kPCLMULQDQ       , "PCLMULQDQ"        },
116     { x86::Features::kPCOMMIT         , "PCOMMIT"          },
117     { x86::Features::kPOPCNT          , "POPCNT"           },
118     { x86::Features::kPREFETCHW       , "PREFETCHW"        },
119     { x86::Features::kPREFETCHWT1     , "PREFETCHWT1"      },
120     { x86::Features::kRDRAND          , "RDRAND"           },
121     { x86::Features::kRDSEED          , "RDSEED"           },
122     { x86::Features::kRDTSC           , "RDTSC"            },
123     { x86::Features::kRDTSCP          , "RDTSCP"           },
124     { x86::Features::kRTM             , "RTM"              },
125     { x86::Features::kSHA             , "SHA"              },
126     { x86::Features::kSKINIT          , "SKINIT"           },
127     { x86::Features::kSMAP            , "SMAP"             },
128     { x86::Features::kSMEP            , "SMEP"             },
129     { x86::Features::kSMX             , "SMX"              },
130     { x86::Features::kSSE             , "SSE"              },
131     { x86::Features::kSSE2            , "SSE2"             },
132     { x86::Features::kSSE3            , "SSE3"             },
133     { x86::Features::kSSE4_1          , "SSE4.1"           },
134     { x86::Features::kSSE4_2          , "SSE4.2"           },
135     { x86::Features::kSSE4A           , "SSE4A"            },
136     { x86::Features::kSSSE3           , "SSSE3"            },
137     { x86::Features::kSVM             , "SVM"              },
138     { x86::Features::kTBM             , "TBM"              },
139     { x86::Features::kTSX             , "TSX"              },
140     { x86::Features::kVAES            , "VAES"             },
141     { x86::Features::kVMX             , "VMX"              },
142     { x86::Features::kVPCLMULQDQ      , "VPCLMULQDQ"       },
143     { x86::Features::kXOP             , "XOP"              },
144     { x86::Features::kXSAVE           , "XSAVE"            },
145     { x86::Features::kXSAVEC          , "XSAVEC"           },
146     { x86::Features::kXSAVEOPT        , "XSAVEOPT"         },
147     { x86::Features::kXSAVES          , "XSAVES"           }
148   };
149 
150   INFO("X86 Features:");
151   dumpFeatures(cpu, x86FeaturesList, ASMJIT_ARRAY_SIZE(x86FeaturesList));
152   INFO("");
153   #endif
154 
155   // --------------------------------------------------------------------------
156   // [ARM]
157   // --------------------------------------------------------------------------
158 
159   #if ASMJIT_ARCH_ARM
160   static const DumpCpuFeature armFeaturesList[] = {
161     { arm::Features::kARMv6           , "ARMv6"            },
162     { arm::Features::kARMv7           , "ARMv7"            },
163     { arm::Features::kARMv8           , "ARMv8"            },
164     { arm::Features::kTHUMB           , "THUMB"            },
165     { arm::Features::kTHUMBv2         , "THUMBv2"          },
166     { arm::Features::kVFP2            , "VFPv2"            },
167     { arm::Features::kVFP3            , "VFPv3"            },
168     { arm::Features::kVFP4            , "VFPv4"            },
169     { arm::Features::kVFP_D32         , "VFP D32"          },
170     { arm::Features::kNEON            , "NEON"             },
171     { arm::Features::kDSP             , "DSP"              },
172     { arm::Features::kIDIV            , "IDIV"             },
173     { arm::Features::kAES             , "AES"              },
174     { arm::Features::kCRC32           , "CRC32"            },
175     { arm::Features::kSHA1            , "SHA1"             },
176     { arm::Features::kSHA256          , "SHA256"           },
177     { arm::Features::kATOMIC64        , "ATOMIC64"         }
178   };
179 
180   INFO("ARM Features:");
181   dumpFeatures(cpu, armFeaturesList, ASMJIT_ARRAY_SIZE(armFeaturesList));
182   INFO("");
183   #endif
184 }
185 
186 // ============================================================================
187 // [DumpSizeOf]
188 // ============================================================================
189 
dumpSizeOf(void)190 static void dumpSizeOf(void) noexcept {
191   #define DUMP_TYPE(...) \
192     INFO("  %-26s: %u", #__VA_ARGS__, uint32_t(sizeof(__VA_ARGS__)))
193 
194   INFO("Size of C++ types:");
195     DUMP_TYPE(int8_t);
196     DUMP_TYPE(int16_t);
197     DUMP_TYPE(int32_t);
198     DUMP_TYPE(int64_t);
199     DUMP_TYPE(int);
200     DUMP_TYPE(long);
201     DUMP_TYPE(size_t);
202     DUMP_TYPE(intptr_t);
203     DUMP_TYPE(float);
204     DUMP_TYPE(double);
205     DUMP_TYPE(void*);
206   INFO("");
207 
208   INFO("Size of base classes:");
209     DUMP_TYPE(BaseAssembler);
210     DUMP_TYPE(BaseEmitter);
211     DUMP_TYPE(CodeBuffer);
212     DUMP_TYPE(CodeHolder);
213     DUMP_TYPE(ConstPool);
214     DUMP_TYPE(LabelEntry);
215     DUMP_TYPE(RelocEntry);
216     DUMP_TYPE(Section);
217     DUMP_TYPE(String);
218     DUMP_TYPE(Target);
219     DUMP_TYPE(Zone);
220     DUMP_TYPE(ZoneAllocator);
221     DUMP_TYPE(ZoneBitVector);
222     DUMP_TYPE(ZoneHashNode);
223     DUMP_TYPE(ZoneHash<ZoneHashNode>);
224     DUMP_TYPE(ZoneList<int>);
225     DUMP_TYPE(ZoneVector<int>);
226   INFO("");
227 
228   INFO("Size of operand classes:");
229     DUMP_TYPE(Operand);
230     DUMP_TYPE(BaseReg);
231     DUMP_TYPE(BaseMem);
232     DUMP_TYPE(Imm);
233     DUMP_TYPE(Label);
234   INFO("");
235 
236   INFO("Size of function classes:");
237     DUMP_TYPE(CallConv);
238     DUMP_TYPE(FuncFrame);
239     DUMP_TYPE(FuncValue);
240     DUMP_TYPE(FuncDetail);
241     DUMP_TYPE(FuncSignature);
242     DUMP_TYPE(FuncArgsAssignment);
243   INFO("");
244 
245   #ifndef ASMJIT_NO_BUILDER
246   INFO("Size of builder classes:");
247     DUMP_TYPE(BaseBuilder);
248     DUMP_TYPE(BaseNode);
249     DUMP_TYPE(InstNode);
250     DUMP_TYPE(InstExNode);
251     DUMP_TYPE(AlignNode);
252     DUMP_TYPE(LabelNode);
253     DUMP_TYPE(EmbedDataNode);
254     DUMP_TYPE(EmbedLabelNode);
255     DUMP_TYPE(ConstPoolNode);
256     DUMP_TYPE(CommentNode);
257     DUMP_TYPE(SentinelNode);
258   INFO("");
259   #endif
260 
261   #ifndef ASMJIT_NO_COMPILER
262   INFO("Size of compiler classes:");
263     DUMP_TYPE(BaseCompiler);
264     DUMP_TYPE(FuncNode);
265     DUMP_TYPE(FuncRetNode);
266     DUMP_TYPE(FuncCallNode);
267   INFO("");
268   #endif
269 
270   #ifdef ASMJIT_BUILD_X86
271   INFO("Size of x86-specific classes:");
272     DUMP_TYPE(x86::Assembler);
273     #ifndef ASMJIT_NO_BUILDER
274     DUMP_TYPE(x86::Builder);
275     #endif
276     #ifndef ASMJIT_NO_COMPILER
277     DUMP_TYPE(x86::Compiler);
278     #endif
279     DUMP_TYPE(x86::InstDB::InstInfo);
280     DUMP_TYPE(x86::InstDB::CommonInfo);
281     DUMP_TYPE(x86::InstDB::OpSignature);
282     DUMP_TYPE(x86::InstDB::InstSignature);
283   INFO("");
284   #endif
285 
286   #undef DUMP_TYPE
287 }
288 
289 // ============================================================================
290 // [Main]
291 // ============================================================================
292 
onBeforeRun(void)293 static void onBeforeRun(void) noexcept {
294   dumpCpu();
295   dumpSizeOf();
296 }
297 
main(int argc,const char * argv[])298 int main(int argc, const char* argv[]) {
299   #if defined(ASMJIT_BUILD_DEBUG)
300   const char buildType[] = "Debug";
301   #else
302   const char buildType[] = "Release";
303   #endif
304 
305   INFO("AsmJit Unit-Test v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
306     unsigned((ASMJIT_LIBRARY_VERSION >> 16)       ),
307     unsigned((ASMJIT_LIBRARY_VERSION >>  8) & 0xFF),
308     unsigned((ASMJIT_LIBRARY_VERSION      ) & 0xFF),
309     hostArch(),
310     buildType
311   );
312 
313   return BrokenAPI::run(argc, argv, onBeforeRun);
314 }
315