summaryrefslogtreecommitdiff
path: root/lib/AsmJit/AsmJit.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/AsmJit/AsmJit.h')
-rw-r--r--lib/AsmJit/AsmJit.h370
1 files changed, 370 insertions, 0 deletions
diff --git a/lib/AsmJit/AsmJit.h b/lib/AsmJit/AsmJit.h
new file mode 100644
index 0000000..089c098
--- /dev/null
+++ b/lib/AsmJit/AsmJit.h
@@ -0,0 +1,370 @@
+// AsmJit - Complete JIT Assembler for C++ Language.
+
+// Copyright (c) 2008-2010, Petr Kobalicek <kobalicek.petr@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+// [Guard]
+#ifndef _ASMJIT_H
+#define _ASMJIT_H
+
+//! @mainpage
+//!
+//! @brief AsmJit is complete x86/x64 JIT Assembler for C++ language
+//!
+//! It supports FPU, MMX, 3dNow, SSE, SSE2, SSE3 and SSE4 intrinsics, powerful
+//! compiler that helps to write portable functions for 32-bit (x86) and 64-bit
+//! (x64) architectures. AsmJit can be used to create functions at runtime that
+//! can be called from existing (but also generated) C/C++ code.
+//!
+//! AsmJit is crossplatform library that supports various compilers and
+//! operating systems. Currently only limitation is x86 (32-bit) or x64 (64-bit)
+//! processor. Currently tested operating systems are Windows (32-bit and 64-bit),
+//! Linux (32-bit and 64-bit) and MacOSX (32-bit).
+//!
+//! @section AsmJit_Main_Introduction Introduction
+//!
+//! AsmJit library contains two main classes for code generation with different
+//! goals. First main code generation class is called @c AsmJit::Assembler and
+//! contains low level API that can be used to generate JIT binary code. It
+//! directly emits binary stream that represents encoded x86/x64 assembler
+//! opcodes. Together with operands and labels it can be used to generate
+//! complete code. For details look to @ref AsmJit_Core and @ref AsmJit_Compiler
+//! sections.
+//!
+//! There is also class named @c AsmJit::Compiler that allows to develop
+//! cross-platform assembler code without worring about function calling
+//! conventions and registers allocation. It can be also used to write 32-bit
+//! and 64-bit portable code. Compiler is recommended class to use for code
+//! generation.
+//!
+//! Everything in AsmJit library is in @c AsmJit namespace.
+//!
+//! @section AsmJit_Main_CodeGeneration Code Generation
+//!
+//! - @ref AsmJit_Core "Assembler core" - Operands, intrinsics and low-level assembler.
+//! - @ref AsmJit_Compiler "Compiler" - High level code generation.
+//! - @ref AsmJit_CpuInfo "Cpu Information" - Get information about host processor.
+//! - @ref AsmJit_Logging "Logging" - Logging and error handling.
+//! - @ref AsmJit_MemoryManagement "Memory Management" - Virtual memory management.
+//!
+//! @section AsmJit_Main_Configuration Configuration, Definitions and Utilities
+//!
+//! - @ref AsmJit_Config "Configuration" - Macros used to configure AsmJit.
+//! - @ref AsmJit_Util "Utilities" - Utilities and helper classes.
+//!
+//! @section AsmJit_Main_HomePage AsmJit Homepage
+//!
+//! - http://code.google.com/p/asmjit/
+//!
+//! @section AsmJit_Main_X86X64Resources External X86/X64 Assembler Resources
+//! - http://www.agner.org/optimize/
+//! - http://www.mark.masmcode.com/ (Assembler Tips)
+//! - http://avisynth.org/mediawiki/Filter_SDK/Assembler_optimizing (Optimizing)
+//! - http://www.ragestorm.net/distorm/ (Disassembling)
+//!
+//! @section AsmJit_Main_Terminology Terminology
+//!
+//! - <b>Non-volatile (preserved) register</b> - Register that can't be changed
+//! by callee (callee must save and restore it if it want to use it inside).
+//!
+//! - <b>Volatile (non-preserved) register</b> - The opossite. Register that can
+//! be freely used by callee. The caller must free all registers before calling
+//! other function.
+
+
+//! @defgroup AsmJit_Core Assembler core (operands, intrinsics and low-level assembler).
+//!
+//! Contains classes related to @c AsmJit::Assembler that're directly used
+//! to generate machine code stream. It's one of oldest and fastest method
+//! to generate machine code using AsmJit library.
+//!
+//! - See @c AsmJit::Assembler class for low level code generation
+//! documentation.
+//! - See @c AsmJit::Operand for AsmJit operand's overview.
+//!
+//! @section AsmJit_Core_Registers Registers
+//!
+//! There are static objects that represents X86 and X64 registers. They can
+//! be used directly (like @c eax, @c mm, @c xmm, ...) or created through
+//! these functions:
+//!
+//! - @c AsmJit::mk_gpb() - make general purpose byte register
+//! - @c AsmJit::mk_gpw() - make general purpose word register
+//! - @c AsmJit::mk_gpd() - make general purpose dword register
+//! - @c AsmJit::mk_gpq() - make general purpose qword register
+//! - @c AsmJit::mk_mm() - make mmx register
+//! - @c AsmJit::mk_xmm() - make sse register
+//! - @c AsmJit::st() - make x87 register
+//!
+//! @section AsmJit_Core_Addressing Addressing
+//!
+//! X86 and x64 architectures contains several addressing modes and most ones
+//! are possible with AsmJit library. Memory represents are represented by
+//! @c AsmJit::Mem class. These functions are used to make operands that
+//! represents memory addresses:
+//!
+//! - @c AsmJit::ptr()
+//! - @c AsmJit::byte_ptr()
+//! - @c AsmJit::word_ptr()
+//! - @c AsmJit::dword_ptr()
+//! - @c AsmJit::qword_ptr()
+//! - @c AsmJit::tword_ptr()
+//! - @c AsmJit::dqword_ptr()
+//! - @c AsmJit::mmword_ptr()
+//! - @c AsmJit::xmmword_ptr()
+//! - @c AsmJit::sysint_ptr()
+//!
+//! Most useful function to make pointer should be @c AsmJit::ptr(). It creates
+//! pointer to the target with unspecified size. Unspecified size works in all
+//! intrinsics where are used registers (this means that size is specified by
+//! register operand or by instruction itself). For example @c AsmJit::ptr()
+//! can't be used with @c AsmJit::Assembler::inc() instruction. In this case
+//! size must be specified and it's also reason to make difference between
+//! pointer sizes.
+//!
+//! Supported are simple address forms (register + displacement) and complex
+//! address forms (register + (register << shift) + displacement).
+//!
+//! @section AsmJit_Core_Immediates Immediates
+//!
+//! Immediate values are constants thats passed directly after instruction
+//! opcode. To create such value use @c AsmJit::imm() or @c AsmJit::uimm()
+//! methods to create signed or unsigned immediate value.
+//!
+//! @sa @c AsmJit::Compiler.
+
+
+//! @defgroup AsmJit_Compiler Compiler (high-level code generation).
+//!
+//! Contains classes related to @c AsmJit::Compiler that can be used
+//! to generate code using high-level constructs.
+//!
+//! - See @c AsmJit::Compiler class for high level code generation
+//! documentation - calling conventions, function declaration
+//! and variables management.
+
+//! @defgroup AsmJit_Config Configuration.
+//!
+//! Contains macros that can be redefined to fit into any project.
+
+
+//! @defgroup AsmJit_CpuInfo CPU information.
+//!
+//! X86 or x64 cpuid instruction allows to get information about processor
+//! vendor and it's features. It's always used to detect features like MMX,
+//! SSE and other newer ones.
+//!
+//! AsmJit library supports low level cpuid call implemented internally as
+//! C++ function using inline assembler or intrinsics and also higher level
+//! CPU features detection. The low level function (also used by higher level
+//! one) is @c AsmJit::cpuid().
+//!
+//! AsmJit library also contains higher level function @c AsmJit::getCpuInfo()
+//! that returns features detected by the library. The detection process is
+//! done only once and it's cached for all next calls. @c AsmJit::CpuInfo
+//! structure not contains only information through @c AsmJit::cpuid(), but
+//! there is also small multiplatform code to detect number of processors
+//! (or cores) throught operating system API.
+//!
+//! It's recommended to use @c AsmJit::cpuInfo to detect and check for
+//! host processor features.
+//!
+//! Example how to use AsmJit::cpuid():
+//!
+//! @code
+//! // All functions and structures are in AsmJit namesapce.
+//! using namespace AsmJit;
+//!
+//! // Here will be retrieved result of cpuid call.
+//! CpuId out;
+//!
+//! // Use cpuid function to do the job.
+//! cpuid(0 /* eax */, &out /* eax, ebx, ecx, edx */);
+//!
+//! // Id eax argument to cpuid is 0, ebx, ecx and edx registers
+//! // are filled with cpu vendor.
+//! char vendor[13];
+//! memcpy(i->vendor, &out.ebx, 4);
+//! memcpy(i->vendor + 4, &out.edx, 4);
+//! memcpy(i->vendor + 8, &out.ecx, 4);
+//! vendor[12] = '\0';
+//!
+//! // Print vendor
+//! puts(vendor);
+//! @endcode
+//!
+//! If you want to use AsmJit::cpuid() function instead of higher level
+//! @c AsmJit::getCpuInfo(), please read processor manuals provided by Intel,
+//! AMD or other manufacturers for cpuid instruction details.
+//!
+//! Example of using @c AsmJit::getCpuInfo():
+//!
+//! @code
+//! // All functions and structures are in AsmJit namesapce.
+//! using namespace AsmJit;
+//!
+//! // Call to cpuInfo return CpuInfo structure that shouldn't be modified.
+//! // Make it const by default.
+//! const CpuInfo *i = getCpuInfo();
+//!
+//! // Now you are able to get specific features.
+//!
+//! // Processor has SSE2
+//! if (i->features & CPU_FEATURE_SSE2)
+//! {
+//! // your code...
+//! }
+//! // Processor has MMX
+//! else if (i->features & CPU_FEATURE__MMX)
+//! {
+//! // your code...
+//! }
+//! // Processor is old, no SSE2 or MMX support.
+//! else
+//! {
+//! // your code...
+//! }
+//! @endcode
+//!
+//! Better example is in AsmJit/Test/testcpu.cpp file.
+//!
+//! @sa AsmJit::cpuid, @c AsmJit::cpuInfo.
+
+
+//! @defgroup AsmJit_Logging Logging and error handling.
+//!
+//! Contains classes related to loging assembler output. Currently logging
+//! is implemented in @c AsmJit::Logger class.You can override
+//! @c AsmJit::Logger::log() to log messages into your stream. There is also
+//! @c FILE based logger implemented in @c AsmJit::FileLogger class.
+//!
+//! To log your assembler output to FILE stream use this code:
+//!
+//! @code
+//! // Create assembler
+//! Assembler a;
+//!
+//! // Create and set file based logger
+//! FileLogger logger(stderr);
+//! a.setLogger(&logger);
+//! @endcode
+//!
+//! You can see that logging goes through @c AsmJit::Assembler. If you are
+//! using @c AsmJit::Compiler and you want to log messages in correct assembler
+//! order, you should look at @c AsmJit::Compiler::comment() method. It allows
+//! you to insert text message into @c AsmJit::Emittable list and
+//! @c AsmJit::Compiler will send your message to @c AsmJit::Assembler in
+//! correct order.
+//!
+//! @sa @c AsmJit::Logger, @c AsmJit::FileLogger.
+
+
+//! @defgroup AsmJit_MemoryManagement Virtual memory management.
+//!
+//! Using @c AsmJit::Assembler or @c AsmJit::Compiler to generate machine
+//! code is not final step. Each generated code needs to run in memory
+//! that is not protected against code execution. To alloc this code it's
+//! needed to use operating system functions provided to enable execution
+//! code in specified memory block or to allocate memory that is not
+//! protected. The solution is always to use @c See AsmJit::Assembler::make()
+//! and @c AsmJit::Compiler::make() functions that can allocate memory and
+//! relocate code for you. But AsmJit also contains classes for manual memory
+//! management thats internally used by AsmJit but can be used by programmers
+//! too.
+//!
+//! Memory management contains low level and high level classes related to
+//! allocating and freeing virtual memory. Low level class is
+//! @c AsmJit::VirtualMemory that can allocate and free full pages of
+//! virtual memory provided by operating system. Higher level class is
+//! @c AsmJit::MemoryManager that is able to manage complete allocation and
+//! free mechanism. It internally uses larger chunks of memory to make
+//! allocation fast and effective.
+//!
+//! Using @c AsmJit::VirtualMemory::alloc() is crossplatform way how to
+//! allocate this kind of memory without worrying about operating system
+//! and it's API. Each memory block that is no longer needed should be
+//! freed by @c AsmJit::VirtualMemory::free() method. If you want better
+//! comfort and malloc()/free() interface, look at the
+//! @c AsmJit::MemoryManager class.
+//!
+//! @sa @c AsmJit::VirtualMemory, @ AsmJit::MemoryManager.
+
+
+//! @defgroup AsmJit_Util Utilities and helper classes.
+//!
+//! Contains some helper classes that's used by AsmJit library.
+
+
+
+//! @addtogroup AsmJit_Config
+//! @{
+
+//! @def ASMJIT_WINDOWS
+//! @brief Macro that is declared if AsmJit is compiled for Windows.
+
+//! @def ASMJIT_POSIX
+//! @brief Macro that is declared if AsmJit is compiled for unix like
+//! operating system.
+
+//! @def ASMJIT_API
+//! @brief Attribute that's added to classes that can be exported if AsmJit
+//! is compiled as a dll library.
+
+//! @def ASMJIT_MALLOC
+//! @brief Function to call to allocate dynamic memory.
+
+//! @def ASMJIT_REALLOC
+//! @brief Function to call to reallocate dynamic memory.
+
+//! @def ASMJIT_FREE
+//! @brief Function to call to free dynamic memory.
+
+//! @def ASMJIT_ASSERT
+//! @brief Assertion macro. Default implementation calls
+//! @c AsmJit::assertionFailure() function.
+
+//! @}
+
+
+//! @namespace AsmJit
+//! @brief Main AsmJit library namespace.
+//!
+//! There are not other namespaces used in AsmJit library.
+
+
+// [Includes]
+#include "Build.h"
+#include "Assembler.h"
+#include "CodeGenerator.h"
+#include "Compiler.h"
+#include "CpuInfo.h"
+#include "Defs.h"
+#include "Logger.h"
+#include "MemoryManager.h"
+#include "Operand.h"
+#include "Platform.h"
+#include "Util.h"
+
+
+// [Guard]
+#endif // _ASMJIT_H