mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-07 17:00:43 +00:00
79 lines
2.7 KiB
C++
79 lines
2.7 KiB
C++
// [AsmJit]
|
|
// Complete x86/x64 JIT and Remote Assembler for C++.
|
|
//
|
|
// [License]
|
|
// Zlib - See LICENSE.md file in the package.
|
|
|
|
// [Guard]
|
|
#ifndef _ASMJIT_X86_X86INTERNAL_P_H
|
|
#define _ASMJIT_X86_X86INTERNAL_P_H
|
|
|
|
#include "../asmjit_build.h"
|
|
|
|
// [Dependencies]
|
|
#include "../base/func.h"
|
|
#include "../x86/x86emitter.h"
|
|
#include "../x86/x86operand.h"
|
|
|
|
// [Api-Begin]
|
|
#include "../asmjit_apibegin.h"
|
|
|
|
namespace asmjit {
|
|
|
|
//! \addtogroup asmjit_base
|
|
//! \{
|
|
|
|
// ============================================================================
|
|
// [asmjit::X86Internal]
|
|
// ============================================================================
|
|
|
|
//! \internal
|
|
//!
|
|
//! X86 utilities used at multiple places, not part of public API, not exported.
|
|
struct X86Internal {
|
|
//! Initialize `CallConv` to X86/X64 specific calling convention.
|
|
static Error initCallConv(CallConv& cc, uint32_t ccId) noexcept;
|
|
|
|
//! Initialize `FuncDetail` to X86/X64 specific function signature.
|
|
static Error initFuncDetail(FuncDetail& func, const FuncSignature& sign, uint32_t gpSize) noexcept;
|
|
|
|
//! Initialize `FuncFrameLayout` from X86/X64 specific function detail and frame information.
|
|
static Error initFrameLayout(FuncFrameLayout& layout, const FuncDetail& func, const FuncFrameInfo& ffi) noexcept;
|
|
|
|
static Error argsToFrameInfo(const FuncArgsMapper& args, FuncFrameInfo& ffi) noexcept;
|
|
|
|
//! Emit function prolog.
|
|
static Error emitProlog(X86Emitter* emitter, const FuncFrameLayout& layout);
|
|
|
|
//! Emit function epilog.
|
|
static Error emitEpilog(X86Emitter* emitter, const FuncFrameLayout& layout);
|
|
|
|
//! Emit a pure move operation between two registers or the same type or
|
|
//! between a register and its home slot. This function does not handle
|
|
//! register conversion.
|
|
static Error emitRegMove(X86Emitter* emitter,
|
|
const Operand_& dst_,
|
|
const Operand_& src_, uint32_t typeId, bool avxEnabled, const char* comment = nullptr);
|
|
|
|
//! Emit move from a function argument (either register or stack) to a register.
|
|
//!
|
|
//! This function can handle the necessary conversion from one argument to
|
|
//! another, and from one register type to another, if it's possible. Any
|
|
//! attempt of conversion that requires third register of a different kind
|
|
//! (for example conversion from K to MMX) will fail.
|
|
static Error emitArgMove(X86Emitter* emitter,
|
|
const X86Reg& dst_, uint32_t dstTypeId,
|
|
const Operand_& src_, uint32_t srcTypeId, bool avxEnabled, const char* comment = nullptr);
|
|
|
|
static Error allocArgs(X86Emitter* emitter, const FuncFrameLayout& layout, const FuncArgsMapper& args);
|
|
};
|
|
|
|
//! \}
|
|
|
|
} // asmjit namespace
|
|
|
|
// [Api-End]
|
|
#include "../asmjit_apiend.h"
|
|
|
|
// [Guard]
|
|
#endif // _ASMJIT_X86_X86INTERNAL_P_H
|