Alien-LibJIT
view release on metacpan or search on metacpan
libjit/jit/jit-gen-x86.h view on Meta::CPAN
0x73, /* ge */
0x78, /* lz */
0x79, /* gez */
0x7a, /* p */
0x7b, /* np */
0x70, /* o */
0x71, /* no */
};
static const unsigned char
x86_cc_signed_map [X86_NCC] = {
0x74, /* eq */
0x75, /* ne */
0x7c, /* lt */
0x7e, /* le */
0x7f, /* gt */
0x7d, /* ge */
0x78, /* lz */
0x79, /* gez */
0x7a, /* p */
0x7b, /* np */
0x70, /* o */
0x71, /* no */
};
typedef union {
int val;
unsigned char b [4];
} x86_imm_buf;
#define X86_NOBASEREG (-1)
/*
// bitvector mask for callee-saved registers
*/
#define X86_ESI_MASK (1<<X86_ESI)
#define X86_EDI_MASK (1<<X86_EDI)
#define X86_EBX_MASK (1<<X86_EBX)
#define X86_EBP_MASK (1<<X86_EBP)
#define X86_CALLEE_REGS ((1<<X86_EAX) | (1<<X86_ECX) | (1<<X86_EDX))
#define X86_CALLER_REGS ((1<<X86_EBX) | (1<<X86_EBP) | (1<<X86_ESI) | (1<<X86_EDI))
#define X86_BYTE_REGS ((1<<X86_EAX) | (1<<X86_ECX) | (1<<X86_EDX) | (1<<X86_EBX))
#define X86_IS_SCRATCH(reg) (X86_CALLER_REGS & (1 << (reg))) /* X86_EAX, X86_ECX, or X86_EDX */
#define X86_IS_CALLEE(reg) (X86_CALLEE_REGS & (1 << (reg))) /* X86_ESI, X86_EDI, X86_EBX, or X86_EBP */
#define X86_IS_BYTE_REG(reg) ((reg) < 4)
/*
// Frame structure:
//
// +--------------------------------+
// | in_arg[0] = var[0] |
// | in_arg[1] = var[1] |
// | . . . |
// | in_arg[n_arg-1] = var[n_arg-1] |
// +--------------------------------+
// | return IP |
// +--------------------------------+
// | saved EBP | <-- frame pointer (EBP)
// +--------------------------------+
// | ... | n_extra
// +--------------------------------+
// | var[n_arg] |
// | var[n_arg+1] | local variables area
// | . . . |
// | var[n_var-1] |
// +--------------------------------+
// | |
// | |
// | spill area | area for spilling mimic stack
// | |
// +--------------------------------|
// | ebx |
// | ebp [ESP_Frame only] |
// | esi | 0..3 callee-saved regs
// | edi | <-- stack pointer (ESP)
// +--------------------------------+
// | stk0 |
// | stk1 | operand stack area/
// | . . . | out args
// | stkn-1 |
// +--------------------------------|
//
//
*/
/*
* useful building blocks
*/
#define x86_modrm_mod(modrm) ((modrm) >> 6)
#define x86_modrm_reg(modrm) (((modrm) >> 3) & 0x7)
#define x86_modrm_rm(modrm) ((modrm) & 0x7)
#define x86_address_byte(inst,m,o,r) do { *(inst)++ = ((((m)&0x03)<<6)|(((o)&0x07)<<3)|(((r)&0x07))); } while (0)
#define x86_imm_emit32(inst,imm) \
do { \
x86_imm_buf imb; imb.val = (int) (imm); \
*(inst)++ = imb.b [0]; \
*(inst)++ = imb.b [1]; \
*(inst)++ = imb.b [2]; \
*(inst)++ = imb.b [3]; \
} while (0)
#define x86_imm_emit16(inst,imm) do { *(short*)(inst) = (imm); (inst) += 2; } while (0)
#define x86_imm_emit8(inst,imm) do { *(inst) = (unsigned char)((imm) & 0xff); ++(inst); } while (0)
#define x86_is_imm8(imm) (((int)(imm) >= -128 && (int)(imm) <= 127))
#define x86_is_imm16(imm) (((int)(imm) >= -(1<<16) && (int)(imm) <= ((1<<16)-1)))
#define x86_reg_emit(inst,r,regno) do { x86_address_byte ((inst), 3, (r), (regno)); } while (0)
#define x86_reg8_emit(inst,r,regno,is_rh,is_rnoh) do {x86_address_byte ((inst), 3, (is_rh)?((r)|4):(r), (is_rnoh)?((regno)|4):(regno));} while (0)
#define x86_regp_emit(inst,r,regno) do { x86_address_byte ((inst), 0, (r), (regno)); } while (0)
#define x86_mem_emit(inst,r,disp) do { x86_address_byte ((inst), 0, (r), 5); x86_imm_emit32((inst), (disp)); } while (0)
#define x86_membase_emit(inst,r,basereg,disp) do {\
if ((basereg) == X86_ESP) { \
if ((disp) == 0) { \
x86_address_byte ((inst), 0, (r), X86_ESP); \
x86_address_byte ((inst), 0, X86_ESP, X86_ESP); \
} else if (x86_is_imm8((disp))) { \
libjit/jit/jit-gen-x86.h view on Meta::CPAN
do { \
*(inst)++ = (unsigned char)0xff; \
x86_mem_emit ((inst), 2, (mem)); \
} while (0)
#define x86_call_membase(inst,basereg,disp) \
do { \
*(inst)++ = (unsigned char)0xff; \
x86_membase_emit ((inst), 2, (basereg), (disp)); \
} while (0)
#define x86_call_code(inst,target) \
do { \
int _x86_offset = (unsigned char*)(target) - (inst); \
_x86_offset -= 5; \
x86_call_imm ((inst), _x86_offset); \
} while (0)
#define x86_ret(inst) do { *(inst)++ = (unsigned char)0xc3; } while (0)
#define x86_ret_imm(inst,imm) \
do { \
if ((imm) == 0) { \
x86_ret ((inst)); \
} else { \
*(inst)++ = (unsigned char)0xc2; \
x86_imm_emit16 ((inst), (imm)); \
} \
} while (0)
#define x86_cmov_reg(inst,cond,is_signed,dreg,reg) \
do { \
*(inst)++ = (unsigned char) 0x0f; \
if ((is_signed)) \
*(inst)++ = x86_cc_signed_map [(cond)] - 0x30; \
else \
*(inst)++ = x86_cc_unsigned_map [(cond)] - 0x30; \
x86_reg_emit ((inst), (dreg), (reg)); \
} while (0)
#define x86_cmov_mem(inst,cond,is_signed,reg,mem) \
do { \
*(inst)++ = (unsigned char) 0x0f; \
if ((is_signed)) \
*(inst)++ = x86_cc_signed_map [(cond)] - 0x30; \
else \
*(inst)++ = x86_cc_unsigned_map [(cond)] - 0x30; \
x86_mem_emit ((inst), (reg), (mem)); \
} while (0)
#define x86_cmov_membase(inst,cond,is_signed,reg,basereg,disp) \
do { \
*(inst)++ = (unsigned char) 0x0f; \
if ((is_signed)) \
*(inst)++ = x86_cc_signed_map [(cond)] - 0x30; \
else \
*(inst)++ = x86_cc_unsigned_map [(cond)] - 0x30; \
x86_membase_emit ((inst), (reg), (basereg), (disp)); \
} while (0)
#define x86_enter(inst,framesize) \
do { \
*(inst)++ = (unsigned char)0xc8; \
x86_imm_emit16 ((inst), (framesize)); \
*(inst)++ = 0; \
} while (0)
#define x86_leave(inst) do { *(inst)++ = (unsigned char)0xc9; } while (0)
#define x86_sahf(inst) do { *(inst)++ = (unsigned char)0x9e; } while (0)
#define x86_fsin(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xfe; } while (0)
#define x86_fcos(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xff; } while (0)
#define x86_fabs(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xe1; } while (0)
#define x86_ftst(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xe4; } while (0)
#define x86_fxam(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xe5; } while (0)
#define x86_fpatan(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xf3; } while (0)
#define x86_fprem(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xf8; } while (0)
#define x86_fprem1(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xf5; } while (0)
#define x86_frndint(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xfc; } while (0)
#define x86_fsqrt(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xfa; } while (0)
#define x86_fptan(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xf2; } while (0)
#define x86_padding(inst,size) \
do { \
switch ((size)) { \
case 1: x86_nop ((inst)); break; \
case 2: *(inst)++ = 0x8b; \
*(inst)++ = 0xc0; break; \
case 3: *(inst)++ = 0x8d; *(inst)++ = 0x6d; \
*(inst)++ = 0x00; break; \
case 4: *(inst)++ = 0x8d; *(inst)++ = 0x64; \
*(inst)++ = 0x24; *(inst)++ = 0x00; \
break; \
case 5: *(inst)++ = 0x8d; *(inst)++ = 0x64; \
*(inst)++ = 0x24; *(inst)++ = 0x00; \
x86_nop ((inst)); break; \
case 6: *(inst)++ = 0x8d; *(inst)++ = 0xad; \
*(inst)++ = 0x00; *(inst)++ = 0x00; \
*(inst)++ = 0x00; *(inst)++ = 0x00; \
break; \
case 7: *(inst)++ = 0x8d; *(inst)++ = 0xa4; \
*(inst)++ = 0x24; *(inst)++ = 0x00; \
*(inst)++ = 0x00; *(inst)++ = 0x00; \
*(inst)++ = 0x00; break; \
default: jit_assert (0); \
} \
} while (0)
#define x86_prolog(inst,frame_size,reg_mask) \
do { \
unsigned i, m = 1; \
x86_enter ((inst), (frame_size)); \
for (i = 0; i < X86_NREG; ++i, m <<= 1) { \
if ((reg_mask) & m) \
x86_push_reg ((inst), i); \
} \
} while (0)
#define x86_epilog(inst,reg_mask) \
do { \
unsigned i, m = 1 << X86_EDI; \
for (i = X86_EDI; m != 0; i--, m=m>>1) { \
if ((reg_mask) & m) \
x86_pop_reg ((inst), i); \
} \
x86_leave ((inst)); \
x86_ret ((inst)); \
} while (0)
#endif /* JIT_GEN_X86_H */
( run in 1.076 second using v1.01-cache-2.11-cpan-df04353d9ac )