Alien-LibJIT
view release on metacpan or search on metacpan
libjit/jit/jit-opcode-apply.c view on Meta::CPAN
{
jit_type_t srctype;
jit_constant_t const_value;
srctype = jit_type_promote_int(jit_type_normalize(value->type));
if(!srctype)
{
return 0;
}
const_value.type = srctype;
switch(srctype->kind)
{
case JIT_TYPE_INT:
const_value.un.int_value = value->address;
break;
case JIT_TYPE_UINT:
const_value.un.uint_value = value->address;
break;
case JIT_TYPE_LONG:
#ifdef JIT_NATIVE_INT64
const_value.un.long_value = value->address;
#else
const_value.un.long_value = *(jit_long *)(value->address);
#endif
break;
case JIT_TYPE_ULONG:
#ifdef JIT_NATIVE_INT64
const_value.un.ulong_value = value->address;
#else
const_value.un.ulong_value = *(jit_ulong *)(value->address);
#endif
break;
case JIT_TYPE_FLOAT32:
const_value.un.float32_value = *(jit_float32 *)(value->address);
break;
case JIT_TYPE_FLOAT64:
const_value.un.float64_value = *(jit_float64 *)(value->address);
break;
case JIT_TYPE_NFLOAT:
const_value.un.nfloat_value = *(jit_nfloat *)(value->address);
break;
default:
return 0;
}
return jit_constant_convert(const_result, &const_value,
const_result->type, overflow_check);
}
/*
* NOTE: value1 is guaranteed to be valid and a constant n entry of each
* of the apply_* functions.
* This is checked on entry of the public _jit_opcode_apply function.
*/
static int
apply_i_i(jit_constant_t *const_result, jit_value_t value1,
jit_cf_i_i_func intrinsic)
{
if(value1->is_nint_constant)
{
const_result->un.int_value = (*intrinsic)(value1->address);
return 1;
}
return 0;
}
static int
apply_i_ii(jit_constant_t *const_result,
jit_value_t value1, jit_value_t value2,
jit_cf_i_ii_func intrinsic)
{
if(value1->is_nint_constant && value2 && value2->is_nint_constant)
{
const_result->un.int_value = (*intrinsic)(value1->address,
value2->address);
return 1;
}
return 0;
}
static int
apply_i_piii(jit_constant_t *const_result,
jit_value_t value1, jit_value_t value2,
jit_cf_i_piii_func intrinsic)
{
if(value1->is_nint_constant && value2 && value2->is_nint_constant)
{
return (*intrinsic)(&(const_result->un.int_value),
value1->address, value2->address);
}
return 0;
}
static int
apply_i_iI(jit_constant_t *const_result,
jit_value_t value1, jit_value_t value2,
jit_cf_i_iI_func intrinsic)
{
if(value1->is_nint_constant && value2 && value2->is_nint_constant)
{
const_result->un.int_value = (*intrinsic)(value1->address,
value2->address);
return 1;
}
return 0;
}
static int
apply_i_II(jit_constant_t *const_result,
jit_value_t value1, jit_value_t value2,
jit_cf_i_II_func intrinsic)
{
if(value1->is_nint_constant && value2 && value2->is_nint_constant)
( run in 0.587 second using v1.01-cache-2.11-cpan-5623c5533a1 )