Alien-LibJIT

 view release on metacpan or  search on metacpan

libjit/jit/jit-rules.h  view on Meta::CPAN


#include "jit-config.h"

#ifdef	__cplusplus
extern	"C" {
#endif

/*
 * Information about a register.
 */
typedef struct
{
	const char		*name;		/* Name of the register, for debugging */
	short			cpu_reg;	/* CPU register number */
	short			other_reg;	/* Other register for a "long" pair, or -1 */
	int			flags;		/* Flags that define the register type */

} jit_reginfo_t;

/*
 * Register information flags.
 */
#define	JIT_REG_WORD		(1 << 0)	/* Can be used for word values */
#define	JIT_REG_LONG		(1 << 1)	/* Can be used for long values */
#define	JIT_REG_FLOAT32		(1 << 2)	/* Can be used for float32 values */
#define	JIT_REG_FLOAT64		(1 << 3)	/* Can be used for float64 values */
#define	JIT_REG_NFLOAT		(1 << 4)	/* Can be used for nfloat values */
#define	JIT_REG_FRAME		(1 << 5)	/* Contains frame pointer */
#define	JIT_REG_STACK_PTR	(1 << 6)	/* Contains CPU stack pointer */
#define	JIT_REG_FIXED		(1 << 7)	/* Fixed use; not for allocation */
#define	JIT_REG_CALL_USED	(1 << 8)	/* Destroyed by a call */
#define	JIT_REG_IN_STACK	(1 << 9)	/* Middle of stack-like allocation */
#define	JIT_REG_GLOBAL		(1 << 10)	/* Candidate for global allocation */
#define	JIT_REG_ALL		(JIT_REG_WORD | JIT_REG_LONG \
				 | JIT_REG_FLOAT32 | JIT_REG_FLOAT64 \
 				 | JIT_REG_NFLOAT)

/*
 * Include definitions that are specific to the backend.
 */
#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

/*
 * The information blocks for all registers in the system.
 */
extern jit_reginfo_t const _jit_reg_info[JIT_NUM_REGS];

/*
 * Macros for getting register information
 */

/* Get register name. */
#define jit_reg_name(reg)		(_jit_reg_info[reg].name)

/* Get register flags. */
#define jit_reg_flags(reg)		(_jit_reg_info[reg].flags)

/* Get CPU register number for machine instruction encoding. */
#define jit_reg_code(reg)		(_jit_reg_info[reg].cpu_reg)

/* Given the first register of a register pair get the other one. */
#define jit_reg_other_reg(reg)		(_jit_reg_info[reg].other_reg)

/* Given a register find if a value of the specified type requires
 * a register pair. Return the other register of the pair if it is
 * required and return -1 otherwise. */
#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

/*
 * Manipulate register usage masks.  The backend may override these
 * definitions if it has more registers than can fit in a "jit_uint".
 */
#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 /* !defined(jit_regused_init) */

/*
 * Information about a register's contents.
 */
#define	JIT_MAX_REG_VALUES		8
typedef struct jit_regcontents jit_regcontents_t;
struct jit_regcontents
{
	/* List of values that are currently stored in this register */
	jit_value_t		values[JIT_MAX_REG_VALUES];
	int			num_values;

	/* Current age of this register.  Older registers are reclaimed first */
	int			age;

	/* Flag that indicates if this register is holding the first
	   word of a double-word long value (32-bit platforms only) */
	char			is_long_start;



( run in 0.388 second using v1.01-cache-2.11-cpan-62a16548d74 )