x86assembler.h 3.3 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
// [AsmJit]
// Complete x86/x64 JIT and Remote Assembler for C++.
//
// [License]
// Zlib - See LICENSE.md file in the package.

// [Guard]
#ifndef _ASMJIT_X86_X86ASSEMBLER_H
#define _ASMJIT_X86_X86ASSEMBLER_H

11
// [Dependencies]
12
#include "../base/assembler.h"
13
14
#include "../base/utils.h"
#include "../x86/x86emitter.h"
15
16
17
#include "../x86/x86operand.h"

// [Api-Begin]
18
#include "../asmjit_apibegin.h"
19
20
21

namespace asmjit {

22
//! \addtogroup asmjit_x86
23
24
25
26
27
28
29
30
//! \{

// ============================================================================
// [asmjit::X86Assembler]
// ============================================================================

//! X86/X64 assembler.
//!
31
32
33
34
//! X86/X64 assembler emits machine-code into buffers managed by \ref CodeHolder.
class ASMJIT_VIRTAPI X86Assembler
  : public Assembler,
    public X86EmitterImplicitT<X86Assembler> {
35

36
37
public:
  typedef Assembler Base;
38
39

  // --------------------------------------------------------------------------
40
  // [Construction / Destruction]
41
42
  // --------------------------------------------------------------------------

43
44
  ASMJIT_API X86Assembler(CodeHolder* code = nullptr) noexcept;
  ASMJIT_API virtual ~X86Assembler() noexcept;
45
46

  // --------------------------------------------------------------------------
47
  // [Compatibility]
48
49
  // --------------------------------------------------------------------------

50
51
52
53
  //! Explicit cast to `X86Emitter`.
  ASMJIT_INLINE X86Emitter* asEmitter() noexcept { return reinterpret_cast<X86Emitter*>(this); }
  //! Explicit cast to `X86Emitter` (const).
  ASMJIT_INLINE const X86Emitter* asEmitter() const noexcept { return reinterpret_cast<const X86Emitter*>(this); }
54

55
56
57
58
  //! Implicit cast to `X86Emitter`.
  ASMJIT_INLINE operator X86Emitter&() noexcept { return *asEmitter(); }
  //! Implicit cast to `X86Emitter` (const).
  ASMJIT_INLINE operator const X86Emitter&() const noexcept { return *asEmitter(); }
59
60

  // --------------------------------------------------------------------------
61
  // [Accessors]
62
  // --------------------------------------------------------------------------
63

64
65
66
67
68
69
  // NOTE: X86Assembler uses _privateData to store 'address-override' bit that
  // is used to decide whether to emit address-override (67H) prefix based on
  // the memory BASE+INDEX registers. It's either `kX86MemInfo_67H_X86` or
  // `kX86MemInfo_67H_X64`.
  ASMJIT_INLINE uint32_t _getAddressOverrideMask() const noexcept { return _privateData; }
  ASMJIT_INLINE void _setAddressOverrideMask(uint32_t m) noexcept { _privateData = m; }
70
71

  // --------------------------------------------------------------------------
72
  // [Events]
73
74
  // --------------------------------------------------------------------------

75
76
  ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
  ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
77
78

  // --------------------------------------------------------------------------
79
  // [Code-Generation]
80
81
  // --------------------------------------------------------------------------

82
  using CodeEmitter::_emit;
83

84
85
  ASMJIT_API Error _emit(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) override;
  ASMJIT_API Error align(uint32_t mode, uint32_t alignment) override;
86
87
88
89
90
91
92
};

//! \}

} // asmjit namespace

// [Api-End]
93
#include "../asmjit_apiend.h"
94
95
96

// [Guard]
#endif // _ASMJIT_X86_X86ASSEMBLER_H