Added ability to disable logging at completely at compile-time (reducing asmjit size a bit).

Added ability to disable Compiler completely at compile-time (reducing asmjit size a lot).
This commit is contained in:
kobalicek
2014-05-30 17:02:03 +02:00
parent f77a04ba04
commit 02a9d6abbd
19 changed files with 185 additions and 53 deletions

View File

@@ -216,8 +216,10 @@ Error BaseAssembler::embed(const void* data, uint32_t size) {
::memcpy(cursor, data, size);
setCursor(cursor + size);
#if !defined(ASMJIT_DISABLE_LOGGER)
if (_logger)
_logger->logBinary(kLoggerStyleData, data, size);
#endif // !ASMJIT_DISABLE_LOGGER
return kErrorOk;
}

View File

@@ -40,10 +40,12 @@ CodeGen::~CodeGen() {
// [asmjit::CodeGen - Logging]
// ============================================================================
#if !defined(ASMJIT_DISABLE_LOGGER)
Error CodeGen::setLogger(Logger* logger) {
_logger = logger;
return kErrorOk;
}
#endif // !ASMJIT_DISABLE_LOGGER
// ============================================================================
// [asmjit::CodeGen - Error]
@@ -64,16 +66,19 @@ Error CodeGen::setError(Error error, const char* message) {
if (handler != NULL && handler->handleError(error, message))
return error;
#if !defined(ASMJIT_DISABLE_LOGGER)
Logger* logger = _logger;
if (logger != NULL) {
logger->logFormat(kLoggerStyleComment,
"*** ERROR: %s (%u).\n", message, static_cast<unsigned int>(error));
}
#endif // !ASMJIT_DISABLE_LOGGER
// The handler->handleError() function may throw an exception or longjmp()
// to terminate the execution of setError(). This is the reason why we have
// delayed changing the _error member until now.
_error = error;
return error;
}

View File

@@ -104,46 +104,72 @@ struct CodeGen {
// --------------------------------------------------------------------------
//! Get runtime.
ASMJIT_INLINE Runtime* getRuntime() const { return _runtime; }
ASMJIT_INLINE Runtime* getRuntime() const {
return _runtime;
}
// --------------------------------------------------------------------------
// [Logger]
// --------------------------------------------------------------------------
#if !defined(ASMJIT_DISABLE_LOGGER)
//! Get whether the code generator has a logger.
ASMJIT_INLINE bool hasLogger() const { return _logger != NULL; }
ASMJIT_INLINE bool hasLogger() const {
return _logger != NULL;
}
//! Get logger.
ASMJIT_INLINE Logger* getLogger() const { return _logger; }
ASMJIT_INLINE Logger* getLogger() const {
return _logger;
}
//! Set logger to `logger`.
ASMJIT_API Error setLogger(Logger* logger);
#endif // !ASMJIT_DISABLE_LOGGER
// --------------------------------------------------------------------------
// [Arch]
// --------------------------------------------------------------------------
//! Get target architecture.
ASMJIT_INLINE uint32_t getArch() const { return _arch; }
ASMJIT_INLINE uint32_t getArch() const {
return _arch;
}
//! Get default register size (4 or 8 bytes).
ASMJIT_INLINE uint32_t getRegSize() const { return _regSize; }
ASMJIT_INLINE uint32_t getRegSize() const {
return _regSize;
}
// --------------------------------------------------------------------------
// [Error]
// --------------------------------------------------------------------------
//! Get last error code.
ASMJIT_INLINE Error getError() const { return _error; }
ASMJIT_INLINE Error getError() const {
return _error;
}
//! Set last error code and propagate it through the error handler.
ASMJIT_API Error setError(Error error, const char* message = NULL);
//! Clear the last error code.
ASMJIT_INLINE void clearError() { _error = kErrorOk; }
ASMJIT_INLINE void clearError() {
_error = kErrorOk;
}
//! Get error handler.
ASMJIT_INLINE ErrorHandler* getErrorHandler() const { return _errorHandler; }
ASMJIT_INLINE ErrorHandler* getErrorHandler() const {
return _errorHandler;
}
//! Set error handler.
ASMJIT_API Error setErrorHandler(ErrorHandler* handler);
//! Clear error handler.
ASMJIT_INLINE Error clearErrorHandler() { return setErrorHandler(NULL); }
ASMJIT_INLINE Error clearErrorHandler() {
return setErrorHandler(NULL);
}
// --------------------------------------------------------------------------
// [Features]
@@ -201,8 +227,15 @@ struct CodeGen {
//! Runtime.
Runtime* _runtime;
#if !defined(ASMJIT_DISABLE_LOGGER)
//! Logger.
Logger* _logger;
#else
// Makes the libraries built with/without logging support binary compatible.
void* _logger;
#endif // ASMJIT_DISABLE_LOGGER
//! Error handler, called by \ref setError().
ErrorHandler* _errorHandler;

View File

@@ -7,6 +7,10 @@
// [Export]
#define ASMJIT_EXPORTS
// [Guard]
#include "../build.h"
#if !defined(ASMJIT_DISABLE_COMPILER)
// [Dependencies - AsmJit]
#include "../base/assembler.h"
#include "../base/compiler.h"
@@ -583,3 +587,6 @@ void BaseCompiler::rename(BaseVar& var, const char* name) {
// [Api-End]
#include "../apiend.h"
// [Guard]
#endif // !ASMJIT_DISABLE_COMPILER

View File

@@ -8,6 +8,9 @@
#ifndef _ASMJIT_BASE_COMPILER_H
#define _ASMJIT_BASE_COMPILER_H
#include "../build.h"
#if !defined(ASMJIT_DISABLE_COMPILER)
// [Dependencies - AsmJit]
#include "../base/assembler.h"
#include "../base/codegen.h"
@@ -2103,4 +2106,5 @@ ASMJIT_INLINE Node::Node(BaseCompiler* compiler, uint32_t type) {
#include "../apiend.h"
// [Guard]
#endif // !ASMJIT_DISABLE_COMPILER
#endif // _ASMJIT_BASE_COMPILER_H

View File

@@ -7,6 +7,10 @@
// [Export]
#define ASMJIT_EXPORTS
// [Guard]
#include "../build.h"
#if !defined(ASMJIT_DISABLE_COMPILER)
// [Dependencies - AsmJit]
#include "../base/context_p.h"
#include "../base/intutil.h"
@@ -329,8 +333,10 @@ Error BaseContext::compile(FuncNode* func) {
ASMJIT_PROPAGATE_ERROR(removeUnreachableCode());
ASMJIT_PROPAGATE_ERROR(analyze());
#if !defined(ASMJIT_DISABLE_LOGGER)
if (_compiler->hasLogger())
ASMJIT_PROPAGATE_ERROR(annotate());
#endif // !ASMJIT_DISABLE_LOGGER
ASMJIT_PROPAGATE_ERROR(translate());
@@ -346,3 +352,6 @@ Error BaseContext::compile(FuncNode* func) {
// [Api-End]
#include "../apiend.h"
// [Guard]
#endif // !ASMJIT_DISABLE_COMPILER

View File

@@ -8,6 +8,9 @@
#ifndef _ASMJIT_BASE_CONTEXT_P_H
#define _ASMJIT_BASE_CONTEXT_P_H
#include "../build.h"
#if !defined(ASMJIT_DISABLE_COMPILER)
// [Dependencies - AsmJit]
#include "../base/compiler.h"
#include "../base/zone.h"
@@ -285,4 +288,5 @@ struct BaseContext {
#include "../apiend.h"
// [Guard]
#endif // !ASMJIT_DISABLE_COMPILER
#endif // _ASMJIT_BASE_CONTEXT_P_H

View File

@@ -8,6 +8,9 @@
#ifndef _ASMJIT_BASE_FUNC_H
#define _ASMJIT_BASE_FUNC_H
#include "../build.h"
#if !defined(ASMJIT_DISABLE_COMPILER)
// [Dependencies - AsmJit]
#include "../base/operand.h"
@@ -644,4 +647,5 @@ struct FuncBuilder10 : public FuncPrototype {
#include "../apiend.h"
// [Guard]
#endif // !ASMJIT_DISABLE_COMPILER
#endif // _ASMJIT_BASE_FUNC_H

View File

@@ -7,6 +7,10 @@
// [Export]
#define ASMJIT_EXPORTS
// [Guard]
#include "../build.h"
#if !defined(ASMJIT_DISABLE_LOGGER)
// [Dependencies - AsmJit]
#include "../base/intutil.h"
#include "../base/logger.h"
@@ -158,3 +162,6 @@ void StringLogger::logString(uint32_t style, const char* buf, size_t len) {
// [Api-End]
#include "../apiend.h"
// [Guard]
#endif // !ASMJIT_DISABLE_LOGGER

View File

@@ -8,6 +8,9 @@
#ifndef _ASMJIT_BASE_LOGGER_H
#define _ASMJIT_BASE_LOGGER_H
#include "../build.h"
#if !defined(ASMJIT_DISABLE_LOGGER)
// [Dependencies - AsmJit]
#include "../base/string.h"
@@ -229,4 +232,5 @@ struct StringLogger : public Logger {
#include "../apiend.h"
// [Guard]
#endif // !ASMJIT_DISABLE_LOGGER
#endif // _ASMJIT_BASE_LOGGER_H

View File

@@ -19,14 +19,14 @@
// ============================================================================
// #define ASMJIT_DEBUG // Define to enable debug-mode.
// #define ASMJIT_RELEASE // Define to enable release-mode (no debugging).
// #define ASMJIT_RELEASE // Define to enable release-mode.
// ============================================================================
// [AsmJit - Library]
// ============================================================================
// #define ASMJIT_EMBED // Asmjit is embedded (implies ASMJIT_STATIC).
// #define ASMJIT_STATIC // Define to enable static-library build.
// #define ASMJIT_API // Define to override ASMJIT_API decorator.
// ============================================================================
// [AsmJit - Features]
@@ -38,5 +38,8 @@
// #define ASMJIT_BUILD_X64 // Define to enable x64 instruction set (64-bit).
// #define ASMJIT_BUILD_HOST // Define to enable host instruction set.
// #define ASMJIT_DISABLE_COMPILER // Disable Compiler.
// #define ASMJIT_DISABLE_LOGGER // Disable Logger (completely).
// [Guard]
#endif // _ASMJIT_CONFIG_H

View File

@@ -222,9 +222,10 @@ void X86X64Assembler::_bind(const Label& label) {
// Label can be bound only once.
ASMJIT_ASSERT(data->offset == -1);
// Log.
#if !defined(ASMJIT_DISABLE_LOGGER)
if (_logger)
_logger->logFormat(kLoggerStyleLabel, "L%u:\n", index);
#endif // !ASMJIT_DISABLE_LOGGER
size_t pos = getOffset();
@@ -295,9 +296,10 @@ Error X86X64Assembler::embedLabel(const Label& op) {
LabelData* label = getLabelDataById(op.getId());
RelocData reloc;
if (_logger) {
#if !defined(ASMJIT_DISABLE_LOGGER)
if (_logger)
_logger->logFormat(kLoggerStyleData, regSize == 4 ? ".dd L%u\n" : ".dq L%u\n", op.getId());
}
#endif // !ASMJIT_DISABLE_LOGGER
reloc.type = kRelocRelToAbs;
reloc.size = regSize;
@@ -338,10 +340,11 @@ Error X86X64Assembler::embedLabel(const Label& op) {
// ============================================================================
Error X86X64Assembler::_align(uint32_t mode, uint32_t offset) {
if (_logger) {
#if !defined(ASMJIT_DISABLE_LOGGER)
if (_logger)
_logger->logFormat(kLoggerStyleDirective,
"%s.align %u\n", _logger->getIndentation(), static_cast<unsigned int>(offset));
}
#endif // !ASMJIT_DISABLE_LOGGER
if (offset <= 1 || !IntUtil::isPowerOf2(offset) || offset > 64)
return setError(kErrorInvalidArgument);
@@ -542,8 +545,10 @@ static ASMJIT_INLINE size_t X86X64Assembler_relocCode(const X86X64Assembler* sel
// Advance trampoline pointer.
tramp += 8;
#if !defined(ASMJIT_DISABLE_LOGGER)
if (self->_logger)
self->_logger->logFormat(kLoggerStyleComment, "; Trampoline %llX\n", r.data);
#endif // !ASMJIT_DISABLE_LOGGER
}
}
@@ -557,6 +562,7 @@ static ASMJIT_INLINE size_t X86X64Assembler_relocCode(const X86X64Assembler* sel
// [asmjit::x86x64::Assembler - Logging]
// ============================================================================
#if !defined(ASMJIT_DISABLE_LOGGER)
// Logging helpers.
static const char* AssemblerX86_operandSize[] = {
"",
@@ -884,6 +890,7 @@ static bool X86Assembler_dumpComment(StringBuilder& sb, size_t len, const uint8_
return sb.appendChar('\n');
}
#endif // !ASMJIT_DISABLE_LOGGER
// ============================================================================
// [asmjit::x86x64::Assembler - Emit]
@@ -4068,11 +4075,12 @@ _EmitDisplacement:
// --------------------------------------------------------------------------
_EmitDone:
#if defined(ASMJIT_DEBUG)
#if !defined(ASMJIT_DISABLE_LOGGER)
# if defined(ASMJIT_DEBUG)
if (self->_logger || assertIllegal) {
#else
# else
if (self->_logger) {
#endif // ASMJIT_DEBUG
# endif // ASMJIT_DEBUG
StringBuilderT<512> sb;
uint32_t loggerOptions = 0;
@@ -4088,17 +4096,22 @@ _EmitDone:
else
X86Assembler_dumpComment(sb, sb.getLength(), NULL, 0, 0, self->_comment);
#if defined(ASMJIT_DEBUG)
# if defined(ASMJIT_DEBUG)
if (self->_logger)
#endif // ASMJIT_DEBUG
# endif // ASMJIT_DEBUG
self->_logger->logString(kLoggerStyleDefault, sb.getData(), sb.getLength());
#if defined(ASMJIT_DEBUG)
# if defined(ASMJIT_DEBUG)
// Raise an assertion failure, because this situation shouldn't happen.
if (assertIllegal)
assertionFailed(sb.getData(), __FILE__, __LINE__);
#endif // ASMJIT_DEBUG
# endif // ASMJIT_DEBUG
}
#else
# if defined(ASMJIT_DEBUG)
ASMJIT_ASSERT(!assertIllegal);
# endif // ASMJIT_DEBUG
#endif // !ASMJIT_DISABLE_LOGGER
self->_comment = NULL;
self->setCursor(cursor);

View File

@@ -9,7 +9,7 @@
// [Guard]
#include "../build.h"
#if defined(ASMJIT_BUILD_X86) || defined(ASMJIT_BUILD_X64)
#if !defined(ASMJIT_DISABLE_COMPILER) && (defined(ASMJIT_BUILD_X86) || defined(ASMJIT_BUILD_X64))
// [Dependencies - AsmJit]
#include "../base/intutil.h"
@@ -624,11 +624,12 @@ _OnError:
template<typename Assembler>
static ASMJIT_INLINE void* X86X64Compiler_make(X86X64Compiler* self) {
Assembler assembler(self->_runtime);
Logger* logger = self->_logger;
if (logger) {
#if !defined(ASMJIT_DISABLE_LOGGER)
Logger* logger = self->_logger;
if (logger)
assembler.setLogger(logger);
}
#endif // !ASMJIT_DISABLE_LOGGER
assembler._features = self->_features;
@@ -642,13 +643,15 @@ static ASMJIT_INLINE void* X86X64Compiler_make(X86X64Compiler* self) {
}
void* result = assembler.make();
if (logger) {
#if !defined(ASMJIT_DISABLE_LOGGER)
if (logger)
logger->logFormat(kLoggerStyleComment,
"*** COMPILER SUCCESS - Wrote %u bytes, code: %u, trampolines: %u.\n\n",
static_cast<unsigned int>(assembler.getCodeSize()),
static_cast<unsigned int>(assembler.getOffset()),
static_cast<unsigned int>(assembler.getTrampolineSize()));
}
#endif // !ASMJIT_DISABLE_LOGGER
return result;
}
@@ -762,4 +765,4 @@ Compiler::~Compiler() {}
#include "../apiend.h"
// [Guard]
#endif // ASMJIT_BUILD_X86 || ASMJIT_BUILD_X64
#endif // !ASMJIT_DISABLE_COMPILER && (ASMJIT_BUILD_X86 || ASMJIT_BUILD_X64)

View File

@@ -8,6 +8,9 @@
#ifndef _ASMJIT_X86_X86COMPILER_H
#define _ASMJIT_X86_X86COMPILER_H
#include "../build.h"
#if !defined(ASMJIT_DISABLE_COMPILER)
// [Dependencies - AsmJit]
#include "../base/compiler.h"
#include "../base/vectypes.h"
@@ -4217,4 +4220,5 @@ struct Compiler : public X86X64Compiler {
#include "../apiend.h"
// [Guard]
#endif // !ASMJIT_DISABLE_COMPILER
#endif // _ASMJIT_X86_X86COMPILER_H

View File

@@ -9,7 +9,7 @@
// [Guard]
#include "../build.h"
#if defined(ASMJIT_BUILD_X86) || defined(ASMJIT_BUILD_X64)
#if !defined(ASMJIT_DISABLE_COMPILER) && (defined(ASMJIT_BUILD_X86) || defined(ASMJIT_BUILD_X64))
// [Dependencies - AsmJit]
#include "../base/intutil.h"
@@ -59,9 +59,11 @@ X86X64Context::X86X64Context(X86X64Compiler* compiler) : BaseContext(compiler) {
}
#endif // ASMJIT_BUILD_X64
_state = &_x86State;
_emitComments = compiler->getLogger() != NULL;
#if !defined(ASMJIT_DISABLE_LOGGER)
_emitComments = compiler->hasLogger();
#endif // !ASMJIT_DISABLE_LOGGER
_state = &_x86State;
reset();
}
@@ -2802,6 +2804,7 @@ _NoMemory:
// [asmjit::x86x64::X86X64Context - Annotate]
// ============================================================================
#if !defined(ASMJIT_DISABLE_LOGGER)
static void X86X64Context_annotateVariable(X86X64Context* self,
StringBuilder& sb, const VarData* vd) {
@@ -2908,8 +2911,10 @@ static bool X86X64Context_annotateInstruction(X86X64Context* self,
}
return true;
}
#endif // !ASMJIT_DISABLE_LOGGER
Error X86X64Context::annotate() {
#if !defined(ASMJIT_DISABLE_LOGGER)
FuncNode* func = getFunc();
Node* node_ = func;
@@ -2935,8 +2940,9 @@ Error X86X64Context::annotate() {
node_ = node_->getNext();
}
_annotationLength = maxLen + 1;
#endif // !ASMJIT_DISABLE_LOGGER
return kErrorOk;
}
@@ -4758,8 +4764,10 @@ static Error X86X64Context_translatePrologEpilog(X86X64Context* self, X86X64Func
compiler->_setCursor(func->getEntryNode());
if (compiler->getLogger())
#if !defined(ASMJIT_DISABLE_LOGGER)
if (compiler->hasLogger())
compiler->comment("Prolog");
#endif // !ASMJIT_DISABLE_LOGGER
// Entry.
if (func->isNaked()) {
@@ -4873,8 +4881,10 @@ static Error X86X64Context_translatePrologEpilog(X86X64Context* self, X86X64Func
}
}
if (compiler->getLogger())
#if !defined(ASMJIT_DISABLE_LOGGER)
if (compiler->hasLogger())
compiler->comment("Body");
#endif // !ASMJIT_DISABLE_LOGGER
// --------------------------------------------------------------------------
// [Epilog]
@@ -4882,8 +4892,10 @@ static Error X86X64Context_translatePrologEpilog(X86X64Context* self, X86X64Func
compiler->_setCursor(func->getExitNode());
if (compiler->getLogger())
#if !defined(ASMJIT_DISABLE_LOGGER)
if (compiler->hasLogger())
compiler->comment("Epilog");
#endif // !ASMJIT_DISABLE_LOGGER
// Restore Xmm/Mm/Gp (Mov).
stackPtr = stackBase;
@@ -5305,22 +5317,26 @@ static ASMJIT_INLINE Error X86X64Context_serialize(X86X64Context* self, X86X64As
Node* node_ = start;
StringBuilder& sb = self->_stringBuilder;
Logger* logger;
#if !defined(ASMJIT_DISABLE_LOGGER)
uint32_t vdCount;
uint32_t annotationLength;
Logger* logger;
if (LoggingEnabled) {
logger = assembler->getLogger();
vdCount = static_cast<uint32_t>(self->_contextVd.getLength());
annotationLength = self->_annotationLength;
}
#endif // !ASMJIT_DISABLE_LOGGER
// Create labels on Assembler side.
ASMJIT_PROPAGATE_ERROR(
assembler->_registerIndexedLabels(self->getCompiler()->_targets.getLength()));
do {
#if !defined(ASMJIT_DISABLE_LOGGER)
if (LoggingEnabled) {
sb.clear();
@@ -5368,6 +5384,7 @@ static ASMJIT_INLINE Error X86X64Context_serialize(X86X64Context* self, X86X64As
assembler->_comment = sb.getData();
}
#endif // !ASMJIT_DISABLE_LOGGER
switch (node_->getType()) {
case kNodeTypeAlign: {
@@ -5384,10 +5401,13 @@ static ASMJIT_INLINE Error X86X64Context_serialize(X86X64Context* self, X86X64As
case kNodeTypeComment: {
CommentNode* node = static_cast<CommentNode*>(node_);
if (LoggingEnabled) {
#if !defined(ASMJIT_DISABLE_LOGGER)
if (LoggingEnabled)
logger->logFormat(kLoggerStyleComment,
"%s; %s\n", logger->getIndentation(), node->getComment());
}
#endif // !ASMJIT_DISABLE_LOGGER
break;
}
@@ -5570,10 +5590,12 @@ static ASMJIT_INLINE Error X86X64Context_serialize(X86X64Context* self, X86X64As
}
Error X86X64Context::serialize(BaseAssembler* assembler, Node* start, Node* stop) {
if (!assembler->hasLogger())
return X86X64Context_serialize<0>(this, static_cast<X86X64Assembler*>(assembler), start, stop);
else
#if !defined(ASMJIT_DISABLE_LOGGER)
if (assembler->hasLogger())
return X86X64Context_serialize<1>(this, static_cast<X86X64Assembler*>(assembler), start, stop);
#endif // !ASMJIT_DISABLE_LOGGER
return X86X64Context_serialize<0>(this, static_cast<X86X64Assembler*>(assembler), start, stop);
}
} // x86x64 namespace
@@ -5583,4 +5605,4 @@ Error X86X64Context::serialize(BaseAssembler* assembler, Node* start, Node* stop
#include "../apiend.h"
// [Guard]
#endif // ASMJIT_BUILD_X86 || ASMJIT_BUILD_X64
#endif // !ASMJIT_DISABLE_COMPILER && (ASMJIT_BUILD_X86 || ASMJIT_BUILD_X64)

View File

@@ -8,6 +8,9 @@
#ifndef _ASMJIT_X86_X86CONTEXT_P_H
#define _ASMJIT_X86_X86CONTEXT_P_H
#include "../build.h"
#if !defined(ASMJIT_DISABLE_COMPILER)
// [Dependencies - AsmJit]
#include "../base/compiler.h"
#include "../base/context_p.h"
@@ -515,4 +518,5 @@ struct X86X64Context : public BaseContext {
#include "../apiend.h"
// [Guard]
#endif // !ASMJIT_DISABLE_COMPILER
#endif // _ASMJIT_X86_X86CONTEXT_P_H

View File

@@ -9,7 +9,7 @@
// [Guard]
#include "../build.h"
#if defined(ASMJIT_BUILD_X86) || defined(ASMJIT_BUILD_X64)
#if !defined(ASMJIT_DISABLE_COMPILER) && (defined(ASMJIT_BUILD_X86) || defined(ASMJIT_BUILD_X64))
// [Dependencies - AsmJit]
#include "../base/globals.h"
@@ -544,4 +544,4 @@ void X86X64FuncDecl::reset() {
#include "../apiend.h"
// [Guard]
#endif // ASMJIT_BUILD_X86 || ASMJIT_BUILD_X64
#endif // !ASMJIT_DISABLE_COMPILER && (ASMJIT_BUILD_X86 || ASMJIT_BUILD_X64)

View File

@@ -8,6 +8,9 @@
#ifndef _ASMJIT_X86_X86FUNC_H
#define _ASMJIT_X86_X86FUNC_H
#include "../build.h"
#if !defined(ASMJIT_DISABLE_COMPILER)
// [Dependencies - AsmJit]
#include "../base/func.h"
#include "../x86/x86util.h"
@@ -485,4 +488,5 @@ struct X86X64FuncDecl : public FuncDecl {
#include "../apiend.h"
// [Guard]
#endif // !ASMJIT_DISABLE_COMPILER
#endif // _ASMJIT_X86_X86FUNC_H