#ifndef _JIT_RULES_H
#define _JIT_RULES_H
#include "jit-config.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct
{
const char *name;
short cpu_reg;
short other_reg;
int flags;
} jit_reginfo_t;
#define JIT_REG_WORD (1 << 0)
#define JIT_REG_LONG (1 << 1)
#define JIT_REG_FLOAT32 (1 << 2)
#define JIT_REG_FLOAT64 (1 << 3)
#define JIT_REG_NFLOAT (1 << 4)
#define JIT_REG_FRAME (1 << 5)
#define JIT_REG_STACK_PTR (1 << 6)
#define JIT_REG_FIXED (1 << 7)
#define JIT_REG_CALL_USED (1 << 8)
#define JIT_REG_IN_STACK (1 << 9)
#define JIT_REG_GLOBAL (1 << 10)
#define JIT_REG_ALL (JIT_REG_WORD | JIT_REG_LONG \
| JIT_REG_FLOAT32 | JIT_REG_FLOAT64 \
| JIT_REG_NFLOAT)
#if defined(JIT_BACKEND_INTERP)
# include "jit-rules-interp.h"
#elif defined(JIT_BACKEND_ALPHA)
# include "jit-rules-alpha.h"
#elif defined(JIT_BACKEND_ARM)
# include "jit-rules-arm.h"
#elif defined(JIT_BACKEND_X86)
# include "jit-rules-x86.h"
#elif defined(JIT_BACKEND_X86_64)
# include "jit-rules-x86-64.h"
#else
# error "unknown jit backend type"
#endif
extern jit_reginfo_t const _jit_reg_info[JIT_NUM_REGS];
#define jit_reg_name(reg) (_jit_reg_info[reg].name)
#define jit_reg_flags(reg) (_jit_reg_info[reg].flags)
#define jit_reg_code(reg) (_jit_reg_info[reg].cpu_reg)
#define jit_reg_other_reg(reg) (_jit_reg_info[reg].other_reg)
#if defined(JIT_NATIVE_INT32) && !defined(JIT_BACKEND_INTERP)
# define jit_reg_get_pair(type,reg) _jit_reg_get_pair(type, reg)
#else
# define jit_reg_get_pair(type,reg) (-1)
#endif
#if !defined(jit_regused_init)
typedef jit_uint jit_regused_t;
#define jit_regused_init (0)
#define jit_regused_init_used (~0)
#define jit_reg_is_used(mask,reg) (((mask) & (((jit_uint)1) << (reg))) != 0)
#define jit_reg_set_used(mask,reg) ((mask) |= (((jit_uint)1) << (reg)))
#define jit_reg_clear_used(mask,reg) ((mask) &= ~(((jit_uint)1) << (reg)))
#endif
#define JIT_MAX_REG_VALUES 8
typedef struct jit_regcontents jit_regcontents_t;
struct jit_regcontents
{
jit_value_t values[JIT_MAX_REG_VALUES];
int num_values;
int age;
char is_long_start;
char is_long_end;
char used_for_temp;
};
typedef struct jit_gencode *jit_gencode_t;
struct jit_gencode
{
jit_context_t context;
unsigned char *ptr;
unsigned char *mem_start;
unsigned char *mem_limit;
unsigned char *code_start;
unsigned char *code_end;
jit_regused_t permanent;
jit_regused_t touched;
jit_regused_t inhibit;
jit_regcontents_t contents[JIT_NUM_REGS];
int current_age;
#ifdef JIT_REG_STACK
int reg_stack_top;
#endif
#ifdef jit_extra_gen_state
jit_extra_gen_state;
#endif
void *epilog_fixup;
int stack_changed;
jit_varint_encoder_t offset_encoder;
};
typedef struct jit_elf_info jit_elf_info_t;
struct jit_elf_info
{
int machine;
int abi;
int abi_version;
};
void _jit_gen_check_space(jit_gencode_t gen, int space);
void *_jit_gen_alloc(jit_gencode_t gen, unsigned long size);
void _jit_init_backend(void);
void _jit_gen_get_elf_info(jit_elf_info_t *info);
int _jit_create_entry_insns(jit_function_t func);
int _jit_create_call_setup_insns
(jit_function_t func, jit_type_t signature,
jit_value_t *args, unsigned int num_args,
int is_nested, jit_value_t parent_frame, jit_value_t *struct_return, int flags);
int _jit_setup_indirect_pointer(jit_function_t func, jit_value_t value);
int _jit_create_call_return_insns
(jit_function_t func, jit_type_t signature,
jit_value_t *args, unsigned int num_args,
jit_value_t return_value, int is_nested);
int _jit_opcode_is_supported(int opcode);
void *_jit_gen_prolog(jit_gencode_t gen, jit_function_t func, void *buf);
void _jit_gen_epilog(jit_gencode_t gen, jit_function_t func);
void *_jit_gen_redirector(jit_gencode_t gen, jit_function_t func);
void _jit_gen_spill_reg(jit_gencode_t gen, int reg,
int other_reg, jit_value_t value);
void _jit_gen_free_reg(jit_gencode_t gen, int reg,
int other_reg, int value_used);
void _jit_gen_load_value
(jit_gencode_t gen, int reg, int other_reg, jit_value_t value);
void _jit_gen_spill_global(jit_gencode_t gen, int reg, jit_value_t value);
void _jit_gen_load_global(jit_gencode_t gen, int reg, jit_value_t value);
void _jit_gen_exch_top(jit_gencode_t gen, int reg);
void _jit_gen_move_top(jit_gencode_t gen, int reg);
void _jit_gen_spill_top(jit_gencode_t gen, int reg, jit_value_t value, int pop);
void _jit_gen_fix_value(jit_value_t value);
void _jit_gen_insn(jit_gencode_t gen, jit_function_t func,
jit_block_t block, jit_insn_t insn);
void _jit_gen_start_block(jit_gencode_t gen, jit_block_t block);
void _jit_gen_end_block(jit_gencode_t gen, jit_block_t block);
int _jit_gen_is_global_candidate(jit_type_t type);
#if defined(JIT_NATIVE_INT32) && !defined(JIT_BACKEND_INTERP)
int _jit_reg_get_pair(jit_type_t type, int reg);
#endif
int _jit_int_lowest_byte(void);
int _jit_int_lowest_short(void);
int _jit_nint_lowest_byte(void);
int _jit_nint_lowest_short(void);
int _jit_nint_lowest_int(void);
#ifdef __cplusplus
};
#endif
#endif