infix
A JIT-Powered FFI Library for C
Loading...
Searching...
No Matches
emit_math.c File Reference

Math operations for JIT code generation (x86-64 and ARM64). More...

#include "emit/emit_math.h"
#include "emit/emit.h"
#include "emit_internals.h"
#include <stdio.h>
#include <string.h>
Include dependency graph for emit_math.c:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define EMIT_CHECK(x)
 
#define EMIT_REG_NEEDS_REX(reg)   ((reg) >= 8)
 

Functions

static infix_status emit_x86_rex (emit_context_t *ctx, bool w, bool r, bool x, bool b)
 
INFIX_API infix_status emit_math_mov_imm (emit_context_t *ctx, emit_register_t dest, uint64_t imm)
 
INFIX_API infix_status emit_math_movq_gpr_xmm (emit_context_t *ctx, emit_register_t gpr_dest, emit_register_t xmm_src)
 
INFIX_API infix_status emit_math_mov_reg (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 
INFIX_API infix_status emit_math_add (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 
INFIX_API infix_status emit_math_add_imm (emit_context_t *ctx, emit_register_t dest, int32_t imm)
 
INFIX_API infix_status emit_math_sub (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 
INFIX_API infix_status emit_math_sub_imm (emit_context_t *ctx, emit_register_t dest, int32_t imm)
 
INFIX_API infix_status emit_math_mul (emit_context_t *ctx, emit_register_t src)
 
INFIX_API infix_status emit_math_imul_imm (emit_context_t *ctx, emit_register_t dest, int32_t imm)
 
INFIX_API infix_status emit_math_and (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 
INFIX_API infix_status emit_math_or (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 
INFIX_API infix_status emit_math_xor (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 
INFIX_API infix_status emit_math_not (emit_context_t *ctx, emit_register_t reg)
 
INFIX_API infix_status emit_math_neg (emit_context_t *ctx, emit_register_t reg)
 
INFIX_API infix_status emit_math_shl (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 
INFIX_API infix_status emit_math_shr (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 
INFIX_API infix_status emit_math_cmp (emit_context_t *ctx, emit_register_t a, emit_register_t b)
 
INFIX_API infix_status emit_math_cmp_imm (emit_context_t *ctx, emit_register_t reg, int32_t imm)
 
INFIX_API infix_status emit_math_test (emit_context_t *ctx, emit_register_t a, emit_register_t b)
 
INFIX_API infix_status emit_math_jmp (emit_context_t *ctx, const char *label)
 
INFIX_API infix_status emit_math_jmp_cc (emit_context_t *ctx, emit_cc_t cc, const char *label)
 
INFIX_API infix_status emit_math_call (emit_context_t *ctx, const char *name)
 
INFIX_API infix_status emit_math_prologue (emit_context_t *ctx)
 
INFIX_API infix_status emit_math_epilogue (emit_context_t *ctx)
 
INFIX_API infix_status emit_math_ret (emit_context_t *ctx)
 
INFIX_API infix_status emit_math_push (emit_context_t *ctx, emit_register_t reg)
 
INFIX_API infix_status emit_math_pop (emit_context_t *ctx, emit_register_t reg)
 
INFIX_API infix_status emit_math_load_reg (emit_context_t *ctx, emit_register_t dest, emit_register_t base, int32_t offset)
 
INFIX_API infix_status emit_math_store_reg (emit_context_t *ctx, emit_register_t base, int32_t offset, emit_register_t src)
 
INFIX_API infix_status emit_math_load_sym (emit_context_t *ctx, emit_register_t dest, const char *sym)
 
INFIX_API infix_status emit_math_store_sym (emit_context_t *ctx, const char *sym, emit_register_t src)
 
INFIX_API infix_status emit_math_movsd_reg (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 
INFIX_API infix_status emit_math_addsd (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 
INFIX_API infix_status emit_math_subsd (emit_context_t *ctx, emit_register_t dest, emit_register_t src)
 

Variables

static const uint8_t x86_jcc_opcodes [16]
 

Detailed Description

Math operations for JIT code generation (x86-64 and ARM64).

Copyright (c) 2025 Sanko Robinson

This source code is dual-licensed under the Artistic License 2.0 or the MIT License. You may choose to use the code under the terms of either license.

SPDX-License-Identifier: (Artistic-2.0 OR MIT)

Macro Definition Documentation

◆ EMIT_CHECK

#define EMIT_CHECK (   x)
Value:
do { \
infix_status _s = (x); \
if (_s != INFIX_SUCCESS) \
return _s; \
} while (0)
infix_status
Enumerates the possible status codes returned by infix API functions.
Definition infix.h:435
@ INFIX_SUCCESS
Definition infix.h:436

◆ EMIT_REG_NEEDS_REX

#define EMIT_REG_NEEDS_REX (   reg)    ((reg) >= 8)

Function Documentation

◆ emit_math_add()

INFIX_API infix_status emit_math_add ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_math_add_imm()

INFIX_API infix_status emit_math_add_imm ( emit_context_t ctx,
emit_register_t  dest,
int32_t  imm 
)

◆ emit_math_addsd()

INFIX_API infix_status emit_math_addsd ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_math_and()

INFIX_API infix_status emit_math_and ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_math_call()

INFIX_API infix_status emit_math_call ( emit_context_t ctx,
const char *  name 
)

◆ emit_math_cmp()

INFIX_API infix_status emit_math_cmp ( emit_context_t ctx,
emit_register_t  a,
emit_register_t  b 
)

◆ emit_math_cmp_imm()

INFIX_API infix_status emit_math_cmp_imm ( emit_context_t ctx,
emit_register_t  reg,
int32_t  imm 
)

◆ emit_math_epilogue()

INFIX_API infix_status emit_math_epilogue ( emit_context_t ctx)

◆ emit_math_imul_imm()

INFIX_API infix_status emit_math_imul_imm ( emit_context_t ctx,
emit_register_t  dest,
int32_t  imm 
)

◆ emit_math_jmp()

INFIX_API infix_status emit_math_jmp ( emit_context_t ctx,
const char *  label 
)

◆ emit_math_jmp_cc()

INFIX_API infix_status emit_math_jmp_cc ( emit_context_t ctx,
emit_cc_t  cc,
const char *  label 
)

◆ emit_math_load_reg()

INFIX_API infix_status emit_math_load_reg ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  base,
int32_t  offset 
)

◆ emit_math_load_sym()

INFIX_API infix_status emit_math_load_sym ( emit_context_t ctx,
emit_register_t  dest,
const char *  sym 
)

◆ emit_math_mov_imm()

INFIX_API infix_status emit_math_mov_imm ( emit_context_t ctx,
emit_register_t  dest,
uint64_t  imm 
)

◆ emit_math_mov_reg()

INFIX_API infix_status emit_math_mov_reg ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_math_movq_gpr_xmm()

INFIX_API infix_status emit_math_movq_gpr_xmm ( emit_context_t ctx,
emit_register_t  gpr_dest,
emit_register_t  xmm_src 
)

◆ emit_math_movsd_reg()

INFIX_API infix_status emit_math_movsd_reg ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_math_mul()

INFIX_API infix_status emit_math_mul ( emit_context_t ctx,
emit_register_t  src 
)

◆ emit_math_neg()

INFIX_API infix_status emit_math_neg ( emit_context_t ctx,
emit_register_t  reg 
)

◆ emit_math_not()

INFIX_API infix_status emit_math_not ( emit_context_t ctx,
emit_register_t  reg 
)

◆ emit_math_or()

INFIX_API infix_status emit_math_or ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_math_pop()

INFIX_API infix_status emit_math_pop ( emit_context_t ctx,
emit_register_t  reg 
)

◆ emit_math_prologue()

INFIX_API infix_status emit_math_prologue ( emit_context_t ctx)

◆ emit_math_push()

INFIX_API infix_status emit_math_push ( emit_context_t ctx,
emit_register_t  reg 
)

◆ emit_math_ret()

INFIX_API infix_status emit_math_ret ( emit_context_t ctx)

◆ emit_math_shl()

INFIX_API infix_status emit_math_shl ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_math_shr()

INFIX_API infix_status emit_math_shr ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_math_store_reg()

INFIX_API infix_status emit_math_store_reg ( emit_context_t ctx,
emit_register_t  base,
int32_t  offset,
emit_register_t  src 
)

◆ emit_math_store_sym()

INFIX_API infix_status emit_math_store_sym ( emit_context_t ctx,
const char *  sym,
emit_register_t  src 
)

◆ emit_math_sub()

INFIX_API infix_status emit_math_sub ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_math_sub_imm()

INFIX_API infix_status emit_math_sub_imm ( emit_context_t ctx,
emit_register_t  dest,
int32_t  imm 
)

◆ emit_math_subsd()

INFIX_API infix_status emit_math_subsd ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_math_test()

INFIX_API infix_status emit_math_test ( emit_context_t ctx,
emit_register_t  a,
emit_register_t  b 
)

◆ emit_math_xor()

INFIX_API infix_status emit_math_xor ( emit_context_t ctx,
emit_register_t  dest,
emit_register_t  src 
)

◆ emit_x86_rex()

static infix_status emit_x86_rex ( emit_context_t ctx,
bool  w,
bool  r,
bool  x,
bool  b 
)
static

Variable Documentation

◆ x86_jcc_opcodes

const uint8_t x86_jcc_opcodes[16]
static
Initial value:
= {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F}