Alien-LibJIT
view release on metacpan or search on metacpan
libjit/jit/jit-rules-x86-64.c view on Meta::CPAN
{
if(!jit_insn_return_reg(func, return_value, X86_64_REG_XMM0))
{
return 0;
}
}
else if(return_type == jit_type_nfloat)
{
if(!jit_insn_return_reg(func, return_value, X86_64_REG_ST0))
{
return 0;
}
}
else if(return_type->kind != JIT_TYPE_VOID)
{
if(!jit_insn_return_reg(func, return_value, X86_64_REG_RAX))
{
return 0;
}
}
return 1;
}
void
_jit_init_args(int abi, jit_param_passing_t *passing)
{
passing->max_word_regs = _jit_num_word_regs;
passing->word_regs = _jit_word_arg_regs;
passing->max_float_regs = _jit_num_float_regs;
passing->float_regs = _jit_float_arg_regs;
}
int
_jit_create_entry_insns(jit_function_t func)
{
jit_value_t value;
int has_struct_return = 0;
jit_type_t signature = func->signature;
int abi = jit_type_get_abi(signature);
unsigned int num_args = jit_type_num_params(signature);
jit_param_passing_t passing;
_jit_param_t param[num_args];
_jit_param_t nested_param;
_jit_param_t struct_return_param;
int current_param;
/* Reset the local variable frame size for this function */
func->builder->frame_size = JIT_INITIAL_FRAME_SIZE;
/* Initialize the param passing structure */
jit_memset(&passing, 0, sizeof(jit_param_passing_t));
jit_memset(param, 0, sizeof(_jit_param_t) * num_args);
passing.params = param;
passing.stack_size = JIT_INITIAL_STACK_OFFSET;
/* Let the specific backend initialize it's part of the params */
_jit_init_args(abi, &passing);
/* If the function is nested, then we need an extra parameter
to pass the pointer to the parent's local variable frame */
if(func->nested_parent)
{
jit_memset(&nested_param, 0, sizeof(_jit_param_t));
if(!(_jit_classify_param(&passing, &nested_param,
jit_type_void_ptr)))
{
return 0;
}
}
/* Allocate the structure return pointer */
if((value = jit_value_get_struct_pointer(func)))
{
jit_memset(&struct_return_param, 0, sizeof(_jit_param_t));
if(!(_jit_classify_param(&passing, &struct_return_param,
jit_type_void_ptr)))
{
return 0;
}
struct_return_param.value = value;
has_struct_return = 1;
}
/* Let the backend classify the parameters */
for(current_param = 0; current_param < num_args; current_param++)
{
jit_type_t param_type;
param_type = jit_type_get_param(signature, current_param);
param_type = jit_type_normalize(param_type);
if(!(_jit_classify_param(&passing, &(passing.params[current_param]),
param_type)))
{
return 0;
}
}
/* Now we can setup the incoming parameters */
for(current_param = 0; current_param < num_args; current_param++)
{
jit_type_t param_type;
param_type = jit_type_get_param(signature, current_param);
if(!(param[current_param].value))
{
if(!(param[current_param].value = jit_value_get_param(func, current_param)))
{
return 0;
}
}
if(!_jit_setup_incoming_param(func, &(param[current_param]), param_type))
{
return 0;
}
}
if(has_struct_return)
{
if(!_jit_setup_incoming_param(func, &struct_return_param, jit_type_void_ptr))
{
( run in 1.129 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )