mirror of
https://github.com/asmjit/asmjit
synced 2026-06-08 13:13:30 +00:00
3fcd65cf80
- Compiler no longer works on its own, it requires Assembler. - Labels created by Assembler and Compiler now share their IDs, so they can be used nearly interchangeably without weird side-effects and hacks. - Renamed getError() and setError() to getLastError() and setLastError(). - Renamed compiler nodes to "HL" nodes (preparation for HLStream). - Renamed FuncConv to CallConv. - Function calling convention is now part of FuncPrototype. - Added a possibility to align by inserting zeros (kAlignZero) - Fixed assertion in X86Compiler that didn't like unhandled function argument(s). - Added Compiler::embedConstPool() helper, which can be handy if you use your own ConstPool. - Code refactorization and other minor changes. - CpuTicks::now() renamed to Utils::getTickCount(). - error.h merged with globals.h - Documentation updates related to recent API changes.
227 lines
8.9 KiB
C++
227 lines
8.9 KiB
C++
// [AsmJit]
|
|
// Complete x86/x64 JIT and Remote Assembler for C++.
|
|
//
|
|
// [License]
|
|
// Zlib - See LICENSE.md file in the package.
|
|
|
|
// [Dependencies - AsmJit]
|
|
#include "../asmjit/asmjit.h"
|
|
#include "../asmjit/base/compilercontext_p.h"
|
|
#include "../asmjit/x86/x86compilercontext_p.h"
|
|
|
|
// ============================================================================
|
|
// [DumpCpu]
|
|
// ============================================================================
|
|
|
|
struct DumpCpuFeature {
|
|
uint32_t feature;
|
|
const char* name;
|
|
};
|
|
|
|
static void dumpCpuFeatures(const asmjit::CpuInfo* cpuInfo, const DumpCpuFeature* data, size_t count) {
|
|
for (size_t i = 0; i < count; i++)
|
|
if (cpuInfo->hasFeature(data[i].feature))
|
|
INFO(" %s", data[i].name);
|
|
}
|
|
|
|
static void dumpCpu(void) {
|
|
const asmjit::CpuInfo* cpu = asmjit::CpuInfo::getHost();
|
|
|
|
INFO("Host CPU Info:");
|
|
INFO(" Vendor string : %s", cpu->getVendorString());
|
|
INFO(" Brand string : %s", cpu->getBrandString());
|
|
INFO(" Family : %u", cpu->getFamily());
|
|
INFO(" Model : %u", cpu->getModel());
|
|
INFO(" Stepping : %u", cpu->getStepping());
|
|
INFO(" HW-Threads Count : %u", cpu->getHwThreadsCount());
|
|
INFO("");
|
|
|
|
// --------------------------------------------------------------------------
|
|
// [X86]
|
|
// --------------------------------------------------------------------------
|
|
|
|
#if ASMJIT_ARCH_X86 || ASMJIT_ARCH_X64
|
|
const asmjit::X86CpuInfo* x86Cpu = static_cast<const asmjit::X86CpuInfo*>(cpu);
|
|
|
|
static const DumpCpuFeature x86FeaturesList[] = {
|
|
{ asmjit::kX86CpuFeatureNX , "NX (Non-Execute Bit)" },
|
|
{ asmjit::kX86CpuFeatureMT , "MT (Multi-Threading)" },
|
|
{ asmjit::kX86CpuFeatureRDTSC , "RDTSC" },
|
|
{ asmjit::kX86CpuFeatureRDTSCP , "RDTSCP" },
|
|
{ asmjit::kX86CpuFeatureCMOV , "CMOV" },
|
|
{ asmjit::kX86CpuFeatureCMPXCHG8B , "CMPXCHG8B" },
|
|
{ asmjit::kX86CpuFeatureCMPXCHG16B , "CMPXCHG16B" },
|
|
{ asmjit::kX86CpuFeatureCLFLUSH , "CLFLUSH" },
|
|
{ asmjit::kX86CpuFeatureCLFLUSH_OPT , "CLFLUSH (Opt)" },
|
|
{ asmjit::kX86CpuFeaturePREFETCH , "PREFETCH" },
|
|
{ asmjit::kX86CpuFeaturePREFETCHWT1 , "PREFETCHWT1" },
|
|
{ asmjit::kX86CpuFeatureLahfSahf , "LAHF/SAHF" },
|
|
{ asmjit::kX86CpuFeatureFXSR , "FXSR" },
|
|
{ asmjit::kX86CpuFeatureFXSR_OPT , "FXSR (Opt)" },
|
|
{ asmjit::kX86CpuFeatureMMX , "MMX" },
|
|
{ asmjit::kX86CpuFeatureMMX2 , "MMX2" },
|
|
{ asmjit::kX86CpuFeature3DNOW , "3DNOW" },
|
|
{ asmjit::kX86CpuFeature3DNOW2 , "3DNOW2" },
|
|
{ asmjit::kX86CpuFeatureSSE , "SSE" },
|
|
{ asmjit::kX86CpuFeatureSSE2 , "SSE2" },
|
|
{ asmjit::kX86CpuFeatureSSE3 , "SSE3" },
|
|
{ asmjit::kX86CpuFeatureSSSE3 , "SSSE3" },
|
|
{ asmjit::kX86CpuFeatureSSE4A , "SSE4A" },
|
|
{ asmjit::kX86CpuFeatureSSE4_1 , "SSE4.1" },
|
|
{ asmjit::kX86CpuFeatureSSE4_2 , "SSE4.2" },
|
|
{ asmjit::kX86CpuFeatureMSSE , "Misaligned SSE" },
|
|
{ asmjit::kX86CpuFeatureMONITOR , "MONITOR/MWAIT" },
|
|
{ asmjit::kX86CpuFeatureMOVBE , "MOVBE" },
|
|
{ asmjit::kX86CpuFeaturePOPCNT , "POPCNT" },
|
|
{ asmjit::kX86CpuFeatureLZCNT , "LZCNT" },
|
|
{ asmjit::kX86CpuFeatureAESNI , "AESNI" },
|
|
{ asmjit::kX86CpuFeaturePCLMULQDQ , "PCLMULQDQ" },
|
|
{ asmjit::kX86CpuFeatureRDRAND , "RDRAND" },
|
|
{ asmjit::kX86CpuFeatureRDSEED , "RDSEED" },
|
|
{ asmjit::kX86CpuFeatureSHA , "SHA" },
|
|
{ asmjit::kX86CpuFeatureXSAVE , "XSAVE" },
|
|
{ asmjit::kX86CpuFeatureXSAVE_OS , "XSAVE (OS)" },
|
|
{ asmjit::kX86CpuFeatureAVX , "AVX" },
|
|
{ asmjit::kX86CpuFeatureAVX2 , "AVX2" },
|
|
{ asmjit::kX86CpuFeatureF16C , "F16C" },
|
|
{ asmjit::kX86CpuFeatureFMA3 , "FMA3" },
|
|
{ asmjit::kX86CpuFeatureFMA4 , "FMA4" },
|
|
{ asmjit::kX86CpuFeatureXOP , "XOP" },
|
|
{ asmjit::kX86CpuFeatureBMI , "BMI" },
|
|
{ asmjit::kX86CpuFeatureBMI2 , "BMI2" },
|
|
{ asmjit::kX86CpuFeatureHLE , "HLE" },
|
|
{ asmjit::kX86CpuFeatureRTM , "RTM" },
|
|
{ asmjit::kX86CpuFeatureADX , "ADX" },
|
|
{ asmjit::kX86CpuFeatureMPX , "MPX" },
|
|
{ asmjit::kX86CpuFeatureFSGSBASE , "FS/GS Base" },
|
|
{ asmjit::kX86CpuFeatureMOVSBSTOSB_OPT, "REP MOVSB/STOSB (Opt)" },
|
|
{ asmjit::kX86CpuFeatureAVX512F , "AVX512F" },
|
|
{ asmjit::kX86CpuFeatureAVX512CD , "AVX512CD" },
|
|
{ asmjit::kX86CpuFeatureAVX512PF , "AVX512PF" },
|
|
{ asmjit::kX86CpuFeatureAVX512ER , "AVX512ER" },
|
|
{ asmjit::kX86CpuFeatureAVX512DQ , "AVX512DQ" },
|
|
{ asmjit::kX86CpuFeatureAVX512BW , "AVX512BW" },
|
|
{ asmjit::kX86CpuFeatureAVX512VL , "AVX512VL" }
|
|
};
|
|
|
|
INFO("Host CPU Info (X86/X64):");
|
|
INFO(" Processor Type : %u", x86Cpu->getProcessorType());
|
|
INFO(" Brand Index : %u", x86Cpu->getBrandIndex());
|
|
INFO(" CL Flush Cache Line : %u", x86Cpu->getFlushCacheLineSize());
|
|
INFO(" Max logical Processors : %u", x86Cpu->getMaxLogicalProcessors());
|
|
INFO("");
|
|
|
|
INFO("Host CPU Features (X86/X64):");
|
|
dumpCpuFeatures(x86Cpu, x86FeaturesList, ASMJIT_ARRAY_SIZE(x86FeaturesList));
|
|
INFO("");
|
|
#endif
|
|
}
|
|
|
|
// ============================================================================
|
|
// [DumpSizeOf]
|
|
// ============================================================================
|
|
|
|
#define DUMP_TYPE(_Type_) \
|
|
INFO(" %-27s: %u", #_Type_, static_cast<uint32_t>(sizeof(_Type_)))
|
|
|
|
static void dumpSizeOf(void) {
|
|
INFO("SizeOf Types:");
|
|
DUMP_TYPE(int8_t);
|
|
DUMP_TYPE(int16_t);
|
|
DUMP_TYPE(int32_t);
|
|
DUMP_TYPE(int64_t);
|
|
DUMP_TYPE(int);
|
|
DUMP_TYPE(long);
|
|
DUMP_TYPE(size_t);
|
|
DUMP_TYPE(intptr_t);
|
|
DUMP_TYPE(float);
|
|
DUMP_TYPE(double);
|
|
DUMP_TYPE(void*);
|
|
INFO("");
|
|
|
|
INFO("SizeOf Base:");
|
|
DUMP_TYPE(asmjit::ConstPool);
|
|
DUMP_TYPE(asmjit::Runtime);
|
|
DUMP_TYPE(asmjit::Zone);
|
|
DUMP_TYPE(asmjit::Ptr);
|
|
DUMP_TYPE(asmjit::SignedPtr);
|
|
INFO("");
|
|
|
|
INFO("SizeOf Operand:");
|
|
DUMP_TYPE(asmjit::Operand);
|
|
DUMP_TYPE(asmjit::Reg);
|
|
DUMP_TYPE(asmjit::Var);
|
|
DUMP_TYPE(asmjit::BaseMem);
|
|
DUMP_TYPE(asmjit::Imm);
|
|
DUMP_TYPE(asmjit::Label);
|
|
INFO("");
|
|
|
|
INFO("SizeOf Assembler:");
|
|
DUMP_TYPE(asmjit::Assembler);
|
|
DUMP_TYPE(asmjit::LabelData);
|
|
DUMP_TYPE(asmjit::RelocData);
|
|
INFO("");
|
|
|
|
#if !defined(ASMJIT_DISABLE_COMPILER)
|
|
INFO("SizeOf Compiler:");
|
|
DUMP_TYPE(asmjit::Compiler);
|
|
DUMP_TYPE(asmjit::VarMap);
|
|
DUMP_TYPE(asmjit::VarAttr);
|
|
DUMP_TYPE(asmjit::VarData);
|
|
DUMP_TYPE(asmjit::VarState);
|
|
DUMP_TYPE(asmjit::HLNode);
|
|
DUMP_TYPE(asmjit::HLInst);
|
|
DUMP_TYPE(asmjit::HLJump);
|
|
DUMP_TYPE(asmjit::HLData);
|
|
DUMP_TYPE(asmjit::HLAlign);
|
|
DUMP_TYPE(asmjit::HLLabel);
|
|
DUMP_TYPE(asmjit::HLComment);
|
|
DUMP_TYPE(asmjit::HLSentinel);
|
|
DUMP_TYPE(asmjit::HLFunc);
|
|
DUMP_TYPE(asmjit::HLCall);
|
|
DUMP_TYPE(asmjit::FuncDecl);
|
|
DUMP_TYPE(asmjit::FuncInOut);
|
|
DUMP_TYPE(asmjit::FuncPrototype);
|
|
INFO("");
|
|
#endif // !ASMJIT_DISABLE_COMPILER
|
|
|
|
// --------------------------------------------------------------------------
|
|
// [X86/X64]
|
|
// --------------------------------------------------------------------------
|
|
|
|
#if defined(ASMJIT_BUILD_X86) || defined(ASMJIT_BUILD_X64)
|
|
INFO("SizeOf X86/X64:");
|
|
DUMP_TYPE(asmjit::X86Assembler);
|
|
DUMP_TYPE(asmjit::X86InstInfo);
|
|
DUMP_TYPE(asmjit::X86InstExtendedInfo);
|
|
|
|
#if !defined(ASMJIT_DISABLE_COMPILER)
|
|
DUMP_TYPE(asmjit::X86Compiler);
|
|
DUMP_TYPE(asmjit::X86VarMap);
|
|
DUMP_TYPE(asmjit::X86VarInfo);
|
|
DUMP_TYPE(asmjit::X86VarState);
|
|
DUMP_TYPE(asmjit::X86CallNode);
|
|
DUMP_TYPE(asmjit::X86FuncNode);
|
|
DUMP_TYPE(asmjit::X86FuncDecl);
|
|
#endif // !ASMJIT_DISABLE_COMPILER
|
|
|
|
INFO("");
|
|
#endif // ASMJIT_BUILD_X86
|
|
}
|
|
|
|
#undef DUMP_TYPE
|
|
|
|
// ============================================================================
|
|
// [Main]
|
|
// ============================================================================
|
|
|
|
static void onBeforeRun(void) {
|
|
dumpCpu();
|
|
dumpSizeOf();
|
|
}
|
|
|
|
int main(int argc, const char* argv[]) {
|
|
INFO("AsmJit Unit-Test\n\n");
|
|
return BrokenAPI::run(argc, argv, onBeforeRun);
|
|
}
|