19#define EMIT_CHECK(x) \
21 infix_status _s = (x); \
22 if (_s != INFIX_SUCCESS) \
26#define EMIT_REG_NEEDS_REX(reg) ((reg) >= 8)
30 uint8_t rex = 0x40 | (w << 3) | (r << 2) | (x << 1) | b;
138 if (imm >= -128 && imm <= 127) {
278 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F};
365 uint8_t mod = (offset == 0 && (base & 0x07) != 5) ? 0x00 : ((offset >= -128 && offset <= 127) ? 0x40 : 0x80);
369 if ((base & 0x07) == 4)
373 else if (mod == 0x80)
384 uint8_t mod = (offset == 0 && (base & 0x07) != 5) ? 0x00 : ((offset >= -128 && offset <= 127) ? 0x40 : 0x80);
388 if ((base & 0x07) == 4)
392 else if (mod == 0x80)
infix_registry_t * reg
Definition 501_direct_marshalling.c:209
INFIX_API INFIX_NODISCARD infix_status emit_add_relocation(emit_context_t *ctx, const char *name, uint64_t offset, uint8_t size, uint8_t inst_size)
Definition emit.c:333
Public API for the emit JIT code generation system.
INFIX_EMIT_API infix_status emit_emit_u8(emit_context_t *ctx, uint8_t value)
Definition emit.c:282
@ EMIT_ARCH_X86_64
Definition emit.h:31
INFIX_EMIT_API infix_status emit_emit_u64(emit_context_t *ctx, uint64_t value)
Definition emit.c:299
INFIX_EMIT_API infix_status emit_emit_u32(emit_context_t *ctx, uint32_t value)
Definition emit.c:291
Internal structures for the emit JIT code generation system.
INFIX_API infix_status emit_math_movsd_reg(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:423
INFIX_API infix_status emit_math_addsd(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:434
INFIX_API infix_status emit_math_subsd(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:445
INFIX_API infix_status emit_math_and(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:152
INFIX_API infix_status emit_math_movq_gpr_xmm(emit_context_t *ctx, emit_register_t gpr_dest, emit_register_t xmm_src)
Definition emit_math.c:47
static const uint8_t x86_jcc_opcodes[16]
Definition emit_math.c:277
INFIX_API infix_status emit_math_pop(emit_context_t *ctx, emit_register_t reg)
Definition emit_math.c:352
INFIX_API infix_status emit_math_add_imm(emit_context_t *ctx, emit_register_t dest, int32_t imm)
Definition emit_math.c:82
INFIX_API infix_status emit_math_store_reg(emit_context_t *ctx, emit_register_t base, int32_t offset, emit_register_t src)
Definition emit_math.c:379
INFIX_API infix_status emit_math_load_sym(emit_context_t *ctx, emit_register_t dest, const char *sym)
Definition emit_math.c:398
INFIX_API infix_status emit_math_jmp(emit_context_t *ctx, const char *label)
Definition emit_math.c:280
INFIX_API infix_status emit_math_not(emit_context_t *ctx, emit_register_t reg)
Definition emit_math.c:188
INFIX_API infix_status emit_math_shl(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:212
INFIX_API infix_status emit_math_or(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:164
INFIX_API infix_status emit_math_add(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:70
INFIX_API infix_status emit_math_store_sym(emit_context_t *ctx, const char *sym, emit_register_t src)
Definition emit_math.c:410
INFIX_API infix_status emit_math_epilogue(emit_context_t *ctx)
Definition emit_math.c:330
INFIX_API infix_status emit_math_jmp_cc(emit_context_t *ctx, emit_cc_t cc, const char *label)
Definition emit_math.c:293
INFIX_API infix_status emit_math_mul(emit_context_t *ctx, emit_register_t src)
Definition emit_math.c:120
INFIX_API infix_status emit_math_test(emit_context_t *ctx, emit_register_t a, emit_register_t b)
Definition emit_math.c:265
INFIX_API infix_status emit_math_load_reg(emit_context_t *ctx, emit_register_t dest, emit_register_t base, int32_t offset)
Definition emit_math.c:360
INFIX_API infix_status emit_math_prologue(emit_context_t *ctx)
Definition emit_math.c:320
INFIX_API infix_status emit_math_sub(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:95
INFIX_API infix_status emit_math_neg(emit_context_t *ctx, emit_register_t reg)
Definition emit_math.c:200
INFIX_API infix_status emit_math_xor(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:176
#define EMIT_REG_NEEDS_REX(reg)
Definition emit_math.c:26
#define EMIT_CHECK(x)
Definition emit_math.c:19
INFIX_API infix_status emit_math_imul_imm(emit_context_t *ctx, emit_register_t dest, int32_t imm)
Definition emit_math.c:132
INFIX_API infix_status emit_math_mov_reg(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:58
INFIX_API infix_status emit_math_cmp(emit_context_t *ctx, emit_register_t a, emit_register_t b)
Definition emit_math.c:240
static infix_status emit_x86_rex(emit_context_t *ctx, bool w, bool r, bool x, bool b)
Definition emit_math.c:28
INFIX_API infix_status emit_math_shr(emit_context_t *ctx, emit_register_t dest, emit_register_t src)
Definition emit_math.c:226
INFIX_API infix_status emit_math_cmp_imm(emit_context_t *ctx, emit_register_t reg, int32_t imm)
Definition emit_math.c:252
INFIX_API infix_status emit_math_sub_imm(emit_context_t *ctx, emit_register_t dest, int32_t imm)
Definition emit_math.c:107
INFIX_API infix_status emit_math_push(emit_context_t *ctx, emit_register_t reg)
Definition emit_math.c:344
INFIX_API infix_status emit_math_call(emit_context_t *ctx, const char *name)
Definition emit_math.c:307
INFIX_API infix_status emit_math_ret(emit_context_t *ctx)
Definition emit_math.c:338
INFIX_API infix_status emit_math_mov_imm(emit_context_t *ctx, emit_register_t dest, uint64_t imm)
Definition emit_math.c:36
Math operations for JIT code generation.
emit_cc_t
Definition emit_math.h:24
emit_register_t
Definition emit_math.h:43
@ EMIT_REG_RCX
Definition emit_math.h:45
infix_status
Enumerates the possible status codes returned by infix API functions.
Definition infix.h:435
@ INFIX_SUCCESS
Definition infix.h:436
@ INFIX_ERROR_INVALID_ARGUMENT
Definition infix.h:438
#define INFIX_API
Symbol visibility macro.
Definition infix.h:114
INFIX_INTERNAL void _infix_clear_error(void)
Clears the thread-local error state.
Definition error.c:268
Definition emit_internals.h:50
emit_architecture_t arch
Definition emit_internals.h:51
emit_section_t * current_section
Definition emit_internals.h:55
uint64_t size
Definition emit_internals.h:26