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 )