Alien-LibJIT
view release on metacpan or search on metacpan
libjit/jit/jit-rules-x86.c view on Meta::CPAN
x86_mov_membase_reg(inst, dreg, doffset + offset, temp_reg, 4);
size -= 4;
offset += 4;
}
#endif
if(size >= 2)
{
x86_mov_reg_membase(inst, temp_reg, sreg, soffset + offset, 2);
x86_mov_membase_reg(inst, dreg, doffset + offset, temp_reg, 2);
size -= 2;
offset += 2;
}
if(size >= 1)
{
/* We assume that temp_reg is EAX, ECX, or EDX, which it
should be after calling "get_temp_reg" */
x86_mov_reg_membase(inst, temp_reg, sreg, soffset + offset, 1);
x86_mov_membase_reg(inst, dreg, doffset + offset, temp_reg, 1);
}
}
else
{
/* Call out to "jit_memcpy" to effect the copy */
x86_push_imm(inst, size);
if(soffset == 0)
{
x86_push_reg(inst, sreg);
}
else
{
x86_lea_membase(inst, temp_reg, sreg, soffset);
x86_push_reg(inst, temp_reg);
}
if(dreg != X86_ESP)
{
if(doffset == 0)
{
x86_push_reg(inst, dreg);
}
else
{
x86_lea_membase(inst, temp_reg, dreg, doffset);
x86_push_reg(inst, temp_reg);
}
}
else
{
/* Copying a structure value onto the stack */
x86_lea_membase(inst, temp_reg, X86_ESP,
doffset + 2 * sizeof(void *));
x86_push_reg(inst, temp_reg);
}
x86_call_code(inst, jit_memcpy);
x86_alu_reg_imm(inst, X86_ADD, X86_ESP, 3 * sizeof(void *));
}
return inst;
}
#define TODO() \
do { \
fprintf(stderr, "TODO at %s, %d\n", __FILE__, (int)__LINE__); \
} while (0)
void _jit_gen_insn(jit_gencode_t gen, jit_function_t func,
jit_block_t block, jit_insn_t insn)
{
switch(insn->opcode)
{
#define JIT_INCLUDE_RULES
#include "jit-rules-x86.inc"
#undef JIT_INCLUDE_RULES
default:
{
fprintf(stderr, "TODO(%x) at %s, %d\n",
(int)(insn->opcode), __FILE__, (int)__LINE__);
}
break;
}
}
void _jit_gen_start_block(jit_gencode_t gen, jit_block_t block)
{
void **fixup;
void **next;
/* Set the address of this block */
block->address = (void *)(gen->ptr);
/* If this block has pending fixups, then apply them now */
fixup = (void **)(block->fixup_list);
while(fixup != 0)
{
next = (void **)(fixup[0]);
fixup[0] = (void *)
(((jit_nint)(block->address)) - ((jit_nint)fixup) - 4);
fixup = next;
}
block->fixup_list = 0;
fixup = (void**)(block->fixup_absolute_list);
while(fixup != 0)
{
next = (void **)(fixup[0]);
fixup[0] = (void *)((jit_nint)(block->address));
fixup = next;
}
block->fixup_absolute_list = 0;
}
void _jit_gen_end_block(jit_gencode_t gen, jit_block_t block)
{
/* Nothing to do here for x86 */
}
int _jit_gen_is_global_candidate(jit_type_t type)
{
switch(jit_type_remove_tags(type)->kind)
{
case JIT_TYPE_INT:
case JIT_TYPE_UINT:
case JIT_TYPE_NINT:
case JIT_TYPE_NUINT:
case JIT_TYPE_PTR:
case JIT_TYPE_SIGNATURE: return 1;
}
return 0;
}
int
_jit_reg_get_pair(jit_type_t type, int reg)
{
type = jit_type_normalize(type);
if(type)
{
( run in 0.924 second using v1.01-cache-2.11-cpan-677af5a14d3 )