#include "jit-internal.h"
#include "jit-rules.h"
static jit_value_t
alloc_value(jit_function_t func, jit_type_t type)
{
if(!_jit_function_ensure_builder(func))
{
return 0;
}
jit_value_t value = jit_memory_pool_alloc(&func->builder->value_pool, struct _jit_value);
if(!value)
{
return 0;
}
value->block = func->builder->current_block;
value->type = jit_type_copy(type);
value->reg = -1;
value->frame_offset = JIT_INVALID_FRAME_OFFSET;
value->index = -1;
return value;
}
jit_value_t
jit_value_create(jit_function_t func, jit_type_t type)
{
jit_value_t value = alloc_value(func, type);
if(!value)
{
return 0;
}
value->is_temporary = 1;
if(jit_type_has_tag(type, JIT_TYPETAG_VOLATILE))
{
value->is_volatile = 1;
}
return value;
}
jit_value_t
jit_value_create_nint_constant(jit_function_t func, jit_type_t type, jit_nint const_value)
{
jit_type_t stripped = 0;
if(!const_value)
{
stripped = jit_type_remove_tags(type);
if(stripped->kind == JIT_TYPE_SIGNATURE
|| stripped->kind == JIT_TYPE_PTR
|| stripped->kind == JIT_TYPE_NINT)
{
if(func && func->builder && func->builder->null_constant)
{
return func->builder->null_constant;
}
}
else if(stripped->kind == JIT_TYPE_INT)
{
if(func && func->builder && func->builder->zero_constant)
{
return func->builder->zero_constant;
}
}
}
jit_value_t value = alloc_value(func, type);
if(!value)
{
return 0;
}
value->is_constant = 1;
value->is_nint_constant = 1;
value->address = const_value;
if(stripped)
{
if(stripped->kind == JIT_TYPE_SIGNATURE
|| stripped->kind == JIT_TYPE_PTR
|| stripped->kind == JIT_TYPE_NINT)
{
func->builder->null_constant = value;
}
else if(stripped->kind == JIT_TYPE_INT)
{
func->builder->zero_constant = value;
}
}
return value;
}
jit_value_t
jit_value_create_long_constant(jit_function_t func, jit_type_t type, jit_long const_value)
{
jit_value_t value = alloc_value(func, type);
if(!value)
{
return 0;
}
value->is_constant = 1;
#ifdef JIT_NATIVE_INT64
value->is_nint_constant = 1;
value->address = (jit_nint) const_value;
#else
value->address = (jit_nint) jit_malloc(sizeof(jit_long));
if(!value->address)
{
return 0;
}
*((jit_long *) value->address) = const_value;
value->free_address = 1;
#endif
return value;
}
jit_value_t
jit_value_create_float32_constant(jit_function_t func, jit_type_t type, jit_float32 const_value)
{
jit_value_t value = alloc_value(func, type);
if(!value)
{
return 0;
}
value->is_constant = 1;
value->address = (jit_nint) jit_malloc(sizeof(jit_float32));
if(!value->address)
{
return 0;
}
*((jit_float32 *) value->address) = const_value;
value->free_address = 1;
return value;
}
jit_value_t
jit_value_create_float64_constant(jit_function_t func, jit_type_t type, jit_float64 const_value)
{
jit_value_t value = alloc_value(func, type);
if(!value)
{
return 0;
}
value->is_constant = 1;
value->address = (jit_nint) jit_malloc(sizeof(jit_float64));
if(!value->address)
{
return 0;
}
*((jit_float64 *) value->address) = const_value;
value->free_address = 1;
return value;
}
jit_value_t
jit_value_create_nfloat_constant(jit_function_t func, jit_type_t type, jit_nfloat const_value)
{
jit_value_t value = alloc_value(func, type);
if(!value)
{
return 0;
}
value->is_constant = 1;
value->address = (jit_nint) jit_malloc(sizeof(jit_nfloat));
if(!value->address)
{
return 0;
}
*((jit_nfloat *) value->address) = const_value;
value->free_address = 1;
return value;
}
jit_value_t
jit_value_create_constant(jit_function_t func, const jit_constant_t *const_value)
{
jit_type_t stripped = jit_type_remove_tags(const_value->type);
if(!stripped)
{
return 0;
}
switch(stripped->kind)
{
case JIT_TYPE_SBYTE:
case JIT_TYPE_UBYTE:
case JIT_TYPE_SHORT:
case JIT_TYPE_USHORT:
case JIT_TYPE_INT:
case JIT_TYPE_UINT:
return jit_value_create_nint_constant(func, const_value->type,
const_value->un.int_value);
case JIT_TYPE_NINT:
case JIT_TYPE_NUINT:
case JIT_TYPE_PTR:
case JIT_TYPE_SIGNATURE:
return jit_value_create_nint_constant(func, const_value->type,
const_value->un.nint_value);
case JIT_TYPE_LONG:
case JIT_TYPE_ULONG:
return jit_value_create_long_constant(func, const_value->type,
const_value->un.long_value);
case JIT_TYPE_FLOAT32:
return jit_value_create_float32_constant(func, const_value->type,
const_value->un.float32_value);
case JIT_TYPE_FLOAT64:
return jit_value_create_float64_constant(func, const_value->type,
const_value->un.float64_value);
case JIT_TYPE_NFLOAT:
return jit_value_create_nfloat_constant(func, const_value->type,
const_value->un.nfloat_value);
}
return 0;
}
jit_value_t
jit_value_get_param(jit_function_t func, unsigned int param)
{
unsigned int num_params, current;
if(!_jit_function_ensure_builder(func))
{
return 0;
}
jit_type_t signature = func->signature;
num_params = jit_type_num_params(signature);
if(param >= num_params)
{
return 0;
}
jit_value_t *values = func->builder->param_values;
if(values)
{
return values[param];
}
values = (jit_value_t *) jit_calloc(num_params, sizeof(jit_value_t));
if(!values)
{
return 0;
}
func->builder->param_values = values;
for(current = 0; current < num_params; ++current)
{
jit_type_t type = jit_type_get_param(signature, current);
values[current] = jit_value_create(func, type);
if(values[current])
{
values[current]->block = func->builder->entry_block;
values[current]->is_parameter = 1;
}
}
return values[param];
}
jit_value_t
jit_value_get_struct_pointer(jit_function_t func)
{
jit_type_t type;
jit_value_t value;
if(!_jit_function_ensure_builder(func))
{
return 0;
}
type = jit_type_remove_tags(jit_type_get_return(func->signature));
if(jit_type_is_struct(type) || jit_type_is_union(type))
{
if(jit_type_return_via_pointer(type))
{
if(!func->builder->struct_return)
{
type = jit_type_create_pointer(type, 1);
if(!type)
{
return 0;
}
value = jit_value_create(func, type);
func->builder->struct_return = value;
if(value)
{
value->block = func->builder->entry_block;
value->is_parameter = 1;
}
jit_type_free(type);
}
return func->builder->struct_return;
}
}
return 0;
}
int
jit_value_is_temporary(jit_value_t value)
{
return value->is_temporary;
}
int
jit_value_is_local(jit_value_t value)
{
return value->is_local;
}
int
jit_value_is_constant(jit_value_t value)
{
return value->is_constant;
}
int
jit_value_is_parameter(jit_value_t value)
{
return value->is_parameter;
}
void
jit_value_ref(jit_function_t func, jit_value_t value)
{
if(!_jit_function_ensure_builder(func))
{
return;
}
value->usage_count++;
if(value->is_temporary)
{
if(value->block->func != func)
{
value->is_temporary = 0;
value->is_local = 1;
value->is_addressable = 1;
value->block->func->builder->non_leaf = 1;
func->builder->non_leaf = 1;
}
else if(value->block != func->builder->current_block)
{
value->is_temporary = 0;
value->is_local = 1;
if(_jit_gen_is_global_candidate(value->type))
{
value->global_candidate = 1;
}
}
}
else if(value->is_local && value->block->func != func)
{
value->is_addressable = 1;
value->block->func->builder->non_leaf = 1;
func->builder->non_leaf = 1;
}
}
void _jit_value_ref_params(jit_function_t func)
{
unsigned int num_params;
unsigned int param;
if(func->builder->param_values)
{
num_params = jit_type_num_params(func->signature);
for(param = 0; param < num_params; ++param)
{
jit_value_ref(func, func->builder->param_values[param]);
}
}
jit_value_ref(func, func->builder->struct_return);
jit_value_ref(func, func->builder->parent_frame);
}
void
jit_value_set_volatile(jit_value_t value)
{
value->is_volatile = 1;
}
int
jit_value_is_volatile(jit_value_t value)
{
return value->is_volatile;
}
void
jit_value_set_addressable(jit_value_t value)
{
value->is_addressable = 1;
}
int
jit_value_is_addressable(jit_value_t value)
{
return value->is_addressable;
}
jit_type_t
jit_value_get_type(jit_value_t value)
{
return value->type;
}
jit_function_t
jit_value_get_function(jit_value_t value)
{
return value->block->func;
}
jit_block_t
jit_value_get_block(jit_value_t value)
{
return value->block;
}
jit_context_t
jit_value_get_context(jit_value_t value)
{
return value->block->func->context;
}
jit_constant_t
jit_value_get_constant(jit_value_t value)
{
jit_constant_t result;
if(!value->is_constant)
{
result.type = jit_type_void;
return result;
}
result.type = value->type;
switch(jit_type_remove_tags(value->type)->kind)
{
case JIT_TYPE_SBYTE:
case JIT_TYPE_UBYTE:
case JIT_TYPE_SHORT:
case JIT_TYPE_USHORT:
case JIT_TYPE_INT:
case JIT_TYPE_UINT:
result.un.int_value = (jit_int) value->address;
break;
case JIT_TYPE_NINT:
case JIT_TYPE_NUINT:
case JIT_TYPE_PTR:
case JIT_TYPE_SIGNATURE:
result.un.nint_value = value->address;
break;
case JIT_TYPE_LONG:
case JIT_TYPE_ULONG:
#ifdef JIT_NATIVE_INT64
result.un.long_value = (jit_long) value->address;
#else
result.un.long_value = *((jit_long *) value->address);
#endif
break;
case JIT_TYPE_FLOAT32:
result.un.float32_value = *((jit_float32 *) value->address);
break;
case JIT_TYPE_FLOAT64:
result.un.float64_value = *((jit_float64 *) value->address);
break;
case JIT_TYPE_NFLOAT:
result.un.nfloat_value = *((jit_nfloat *) value->address);
break;
default:
result.type = jit_type_void;
break;
}
return result;
}
jit_nint
jit_value_get_nint_constant(jit_value_t value)
{
if(!value->is_nint_constant)
{
return 0;
}
return (jit_nint) value->address;
}
jit_long
jit_value_get_long_constant(jit_value_t value)
{
if(!value->is_constant)
{
return 0;
}
switch(jit_type_normalize(value->type)->kind)
{
case JIT_TYPE_LONG:
case JIT_TYPE_ULONG:
#ifdef JIT_NATIVE_INT64
return (jit_long) value->address;
#else
return *((jit_long *) value->address);
#endif
}
return 0;
}
jit_float32
jit_value_get_float32_constant(jit_value_t value)
{
if(!value->is_constant || jit_type_normalize(value->type)->kind != JIT_TYPE_FLOAT32)
{
return (jit_float32) 0.0;
}
return *((jit_float32 *) value->address);
}
jit_float64
jit_value_get_float64_constant(jit_value_t value)
{
if(!value->is_constant || jit_type_normalize(value->type)->kind != JIT_TYPE_FLOAT64)
{
return (jit_float64) 0.0;
}
return *((jit_float64 *) value->address);
}
jit_nfloat
jit_value_get_nfloat_constant(jit_value_t value)
{
if(!value->is_constant || jit_type_normalize(value->type)->kind != JIT_TYPE_NFLOAT)
{
return (jit_nfloat) 0.0;
}
return *((jit_nfloat *) value->address);
}
int
jit_value_is_true(jit_value_t value)
{
if(!value || !value->is_constant)
{
return 0;
}
if(value->is_nint_constant)
{
return (value->address != 0);
}
switch(jit_type_remove_tags(value->type)->kind)
{
case JIT_TYPE_LONG:
case JIT_TYPE_ULONG:
return (jit_value_get_long_constant(value) != 0);
case JIT_TYPE_FLOAT32:
return (jit_value_get_float32_constant(value) != (jit_float32) 0.0);
case JIT_TYPE_FLOAT64:
return (jit_value_get_float64_constant(value) != (jit_float64) 0.0);
case JIT_TYPE_NFLOAT:
return (jit_value_get_nfloat_constant(value) != (jit_nfloat) 0.0);
}
return 0;
}
int
jit_constant_convert(jit_constant_t *result, const jit_constant_t *value, jit_type_t type,
int overflow_check)
{
jit_type_t srctype;
jit_type_t desttype;
srctype = jit_type_promote_int(jit_type_normalize(value->type));
if(!srctype)
{
return 0;
}
desttype = jit_type_normalize(type);
if(!desttype)
{
return 0;
}
result->type = type;
switch(desttype->kind)
{
case JIT_TYPE_SBYTE:
switch(srctype->kind)
{
case JIT_TYPE_INT:
if(overflow_check)
{
if(!jit_int_to_sbyte_ovf(&result->un.int_value,
value->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_int_to_sbyte(value->un.int_value);
}
break;
case JIT_TYPE_UINT:
if(overflow_check)
{
if(!jit_uint_to_int_ovf(&result->un.int_value,
value->un.uint_value))
{
return 0;
}
if(!jit_int_to_sbyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_int_to_sbyte(value->un.int_value);
}
break;
case JIT_TYPE_LONG:
if(overflow_check)
{
if(!jit_long_to_int_ovf(&result->un.int_value,
value->un.long_value))
{
return 0;
}
if(!jit_int_to_sbyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_sbyte(jit_long_to_int(value->un.long_value));
}
break;
case JIT_TYPE_ULONG:
if(overflow_check)
{
if(!jit_ulong_to_int_ovf(&result->un.int_value,
value->un.ulong_value))
{
return 0;
}
if(!jit_int_to_sbyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_sbyte(jit_ulong_to_int(value->un.ulong_value));
}
break;
case JIT_TYPE_FLOAT32:
if(overflow_check)
{
if(!jit_float32_to_int_ovf(&result->un.int_value,
value->un.float32_value))
{
return 0;
}
if(!jit_int_to_sbyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_sbyte(jit_float32_to_int(value->un.float32_value));
}
break;
case JIT_TYPE_FLOAT64:
if(overflow_check)
{
if(!jit_float64_to_int_ovf(&result->un.int_value,
value->un.float64_value))
{
return 0;
}
if(!jit_int_to_sbyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_sbyte(jit_float64_to_int(value->un.float64_value));
}
break;
case JIT_TYPE_NFLOAT:
if(overflow_check)
{
if(!jit_nfloat_to_int_ovf(&result->un.int_value,
value->un.nfloat_value))
{
return 0;
}
if(!jit_int_to_sbyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_sbyte(jit_nfloat_to_int(value->un.nfloat_value));
}
break;
default:
return 0;
}
break;
case JIT_TYPE_UBYTE:
switch(srctype->kind)
{
case JIT_TYPE_INT:
if(overflow_check)
{
if(!jit_int_to_ubyte_ovf(&result->un.int_value,
value->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_int_to_ubyte(value->un.int_value);
}
break;
case JIT_TYPE_UINT:
if(overflow_check)
{
if(!jit_uint_to_int_ovf(&result->un.int_value,
value->un.uint_value))
{
return 0;
}
if(!jit_int_to_ubyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_int_to_ubyte(value->un.int_value);
}
break;
case JIT_TYPE_LONG:
if(overflow_check)
{
if(!jit_long_to_int_ovf(&result->un.int_value,
value->un.long_value))
{
return 0;
}
if(!jit_int_to_ubyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_ubyte(jit_long_to_int(value->un.long_value));
}
break;
case JIT_TYPE_ULONG:
if(overflow_check)
{
if(!jit_ulong_to_int_ovf(&result->un.int_value,
value->un.ulong_value))
{
return 0;
}
if(!jit_int_to_ubyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_ubyte(jit_ulong_to_int(value->un.ulong_value));
}
break;
case JIT_TYPE_FLOAT32:
if(overflow_check)
{
if(!jit_float32_to_int_ovf(&result->un.int_value,
value->un.float32_value))
{
return 0;
}
if(!jit_int_to_ubyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_ubyte(jit_float32_to_int(value->un.float32_value));
}
break;
case JIT_TYPE_FLOAT64:
if(overflow_check)
{
if(!jit_float64_to_int_ovf(&result->un.int_value,
value->un.float64_value))
{
return 0;
}
if(!jit_int_to_ubyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_ubyte(jit_float64_to_int(value->un.float64_value));
}
break;
case JIT_TYPE_NFLOAT:
if(overflow_check)
{
if(!jit_nfloat_to_int_ovf(&result->un.int_value,
value->un.nfloat_value))
{
return 0;
}
if(!jit_int_to_ubyte_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_ubyte(jit_nfloat_to_int(value->un.nfloat_value));
}
break;
default:
return 0;
}
break;
case JIT_TYPE_SHORT:
switch(srctype->kind)
{
case JIT_TYPE_INT:
if(overflow_check)
{
if(!jit_int_to_short_ovf(&result->un.int_value,
value->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_int_to_short(value->un.int_value);
}
break;
case JIT_TYPE_UINT:
if(overflow_check)
{
if(!jit_uint_to_int_ovf(&result->un.int_value,
value->un.uint_value))
{
return 0;
}
if(!jit_int_to_short_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_int_to_short(value->un.int_value);
}
break;
case JIT_TYPE_LONG:
if(overflow_check)
{
if(!jit_long_to_int_ovf(&result->un.int_value,
value->un.long_value))
{
return 0;
}
if(!jit_int_to_short_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_short(
jit_long_to_int(value->un.long_value));
}
break;
case JIT_TYPE_ULONG:
if(overflow_check)
{
if(!jit_ulong_to_int_ovf(&result->un.int_value,
value->un.ulong_value))
{
return 0;
}
if(!jit_int_to_short_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_short(
jit_ulong_to_int(value->un.ulong_value));
}
break;
case JIT_TYPE_FLOAT32:
if(overflow_check)
{
if(!jit_float32_to_int_ovf(&result->un.int_value,
value->un.float32_value))
{
return 0;
}
if(!jit_int_to_short_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_short(
jit_float32_to_int(value->un.float32_value));
}
break;
case JIT_TYPE_FLOAT64:
if(overflow_check)
{
if(!jit_float64_to_int_ovf(&result->un.int_value,
value->un.float64_value))
{
return 0;
}
if(!jit_int_to_short_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_short(
jit_float64_to_int(value->un.float64_value));
}
break;
case JIT_TYPE_NFLOAT:
if(overflow_check)
{
if(!jit_nfloat_to_int_ovf(&result->un.int_value,
value->un.nfloat_value))
{
return 0;
}
if(!jit_int_to_short_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_short(
jit_nfloat_to_int(value->un.nfloat_value));
}
break;
default:
return 0;
}
break;
case JIT_TYPE_USHORT:
switch(srctype->kind)
{
case JIT_TYPE_INT:
if(overflow_check)
{
if(!jit_int_to_ushort_ovf(&result->un.int_value,
value->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_int_to_ushort(value->un.int_value);
}
break;
case JIT_TYPE_UINT:
if(overflow_check)
{
if(!jit_uint_to_int_ovf(&result->un.int_value,
value->un.uint_value))
{
return 0;
}
if(!jit_int_to_ushort_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_int_to_ushort(value->un.int_value);
}
break;
case JIT_TYPE_LONG:
if(overflow_check)
{
if(!jit_long_to_int_ovf(&result->un.int_value,
value->un.long_value))
{
return 0;
}
if(!jit_int_to_ushort_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_ushort(
jit_long_to_int(value->un.long_value));
}
break;
case JIT_TYPE_ULONG:
if(overflow_check)
{
if(!jit_ulong_to_int_ovf(&result->un.int_value,
value->un.ulong_value))
{
return 0;
}
if(!jit_int_to_ushort_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_ushort(
jit_ulong_to_int(value->un.ulong_value));
}
break;
case JIT_TYPE_FLOAT32:
if(overflow_check)
{
if(!jit_float32_to_int_ovf(&result->un.int_value,
value->un.float32_value))
{
return 0;
}
if(!jit_int_to_ushort_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_ushort(
jit_float32_to_int(value->un.float32_value));
}
break;
case JIT_TYPE_FLOAT64:
if(overflow_check)
{
if(!jit_float64_to_int_ovf(&result->un.int_value,
value->un.float64_value))
{
return 0;
}
if(!jit_int_to_ushort_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_ushort(
jit_float64_to_int(value->un.float64_value));
}
break;
case JIT_TYPE_NFLOAT:
if(overflow_check)
{
if(!jit_nfloat_to_int_ovf(&result->un.int_value,
value->un.nfloat_value))
{
return 0;
}
if(!jit_int_to_ushort_ovf(&result->un.int_value,
result->un.int_value))
{
return 0;
}
}
else
{
result->un.int_value =
jit_int_to_ushort(
jit_nfloat_to_int(value->un.nfloat_value));
}
break;
default:
return 0;
}
break;
case JIT_TYPE_INT:
switch(srctype->kind)
{
case JIT_TYPE_INT:
result->un.int_value = value->un.int_value;
break;
case JIT_TYPE_UINT:
if(overflow_check)
{
if(!jit_uint_to_int_ovf(&result->un.int_value,
value->un.uint_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_uint_to_int(value->un.uint_value);
}
break;
case JIT_TYPE_LONG:
if(overflow_check)
{
if(!jit_long_to_int_ovf(&result->un.int_value,
value->un.long_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_long_to_int(value->un.long_value);
}
break;
case JIT_TYPE_ULONG:
if(overflow_check)
{
if(!jit_ulong_to_int_ovf(&result->un.int_value,
value->un.ulong_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_ulong_to_int(value->un.ulong_value);
}
break;
case JIT_TYPE_FLOAT32:
if(overflow_check)
{
if(!jit_float32_to_int_ovf(&result->un.int_value,
value->un.float32_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_float32_to_int(value->un.float32_value);
}
break;
case JIT_TYPE_FLOAT64:
if(overflow_check)
{
if(!jit_float64_to_int_ovf(&result->un.int_value,
value->un.float64_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_float64_to_int(value->un.float64_value);
}
break;
case JIT_TYPE_NFLOAT:
if(overflow_check)
{
if(!jit_nfloat_to_int_ovf(&result->un.int_value,
value->un.nfloat_value))
{
return 0;
}
}
else
{
result->un.int_value = jit_nfloat_to_int(value->un.nfloat_value);
}
break;
default:
return 0;
}
break;
case JIT_TYPE_UINT:
switch(srctype->kind)
{
case JIT_TYPE_INT:
if(overflow_check)
{
if(!jit_int_to_uint_ovf(&result->un.uint_value,
value->un.uint_value))
{
return 0;
}
}
else
{
result->un.uint_value = jit_int_to_uint(value->un.int_value);
}
break;
case JIT_TYPE_UINT:
result->un.uint_value = value->un.uint_value;
break;
case JIT_TYPE_LONG:
if(overflow_check)
{
if(!jit_long_to_uint_ovf(&result->un.uint_value,
value->un.long_value))
{
return 0;
}
}
else
{
result->un.uint_value = jit_long_to_uint(value->un.long_value);
}
break;
case JIT_TYPE_ULONG:
if(overflow_check)
{
if(!jit_ulong_to_uint_ovf(&result->un.uint_value,
value->un.ulong_value))
{
return 0;
}
}
else
{
result->un.uint_value = jit_ulong_to_uint(value->un.ulong_value);
}
break;
case JIT_TYPE_FLOAT32:
if(overflow_check)
{
if(!jit_float32_to_uint_ovf(&result->un.uint_value,
value->un.float32_value))
{
return 0;
}
}
else
{
result->un.uint_value = jit_float32_to_uint(value->un.float32_value);
}
break;
case JIT_TYPE_FLOAT64:
if(overflow_check)
{
if(!jit_float64_to_uint_ovf(&result->un.uint_value,
value->un.float64_value))
{
return 0;
}
}
else
{
result->un.uint_value = jit_float64_to_uint(value->un.float64_value);
}
break;
case JIT_TYPE_NFLOAT:
if(overflow_check)
{
if(!jit_nfloat_to_uint_ovf(&result->un.uint_value,
value->un.nfloat_value))
{
return 0;
}
}
else
{
result->un.uint_value = jit_nfloat_to_uint(value->un.nfloat_value);
}
break;
default:
return 0;
}
break;
case JIT_TYPE_LONG:
switch(srctype->kind)
{
case JIT_TYPE_INT:
result->un.long_value =
jit_int_to_long(value->un.int_value);
break;
case JIT_TYPE_UINT:
result->un.long_value =
jit_uint_to_long(value->un.int_value);
break;
case JIT_TYPE_LONG:
result->un.long_value = value->un.long_value;
break;
case JIT_TYPE_ULONG:
if(overflow_check)
{
if(!jit_ulong_to_long_ovf(&result->un.long_value,
value->un.ulong_value))
{
return 0;
}
}
else
{
result->un.long_value = jit_ulong_to_long(value->un.ulong_value);
}
break;
case JIT_TYPE_FLOAT32:
if(overflow_check)
{
if(!jit_float32_to_long_ovf(&result->un.long_value,
value->un.float32_value))
{
return 0;
}
}
else
{
result->un.long_value = jit_float32_to_long(value->un.float32_value);
}
break;
case JIT_TYPE_FLOAT64:
if(overflow_check)
{
if(!jit_float64_to_long_ovf(&result->un.long_value,
value->un.float64_value))
{
return 0;
}
}
else
{
result->un.long_value = jit_float64_to_long(value->un.float64_value);
}
break;
case JIT_TYPE_NFLOAT:
if(overflow_check)
{
if(!jit_nfloat_to_long_ovf(&result->un.long_value,
value->un.nfloat_value))
{
return 0;
}
}
else
{
result->un.long_value = jit_nfloat_to_long(value->un.nfloat_value);
}
break;
default:
return 0;
}
break;
case JIT_TYPE_ULONG:
switch(srctype->kind)
{
case JIT_TYPE_INT:
if(overflow_check)
{
if(!jit_int_to_ulong_ovf(&result->un.ulong_value,
value->un.int_value))
{
return 0;
}
}
else
{
result->un.ulong_value = jit_int_to_ulong(value->un.int_value);
}
break;
case JIT_TYPE_UINT:
result->un.ulong_value =
jit_uint_to_ulong(value->un.uint_value);
break;
case JIT_TYPE_LONG:
if(overflow_check)
{
if(!jit_long_to_ulong_ovf(&result->un.ulong_value,
value->un.long_value))
{
return 0;
}
}
else
{
result->un.ulong_value = jit_long_to_ulong(value->un.long_value);
}
break;
case JIT_TYPE_ULONG:
result->un.ulong_value = value->un.ulong_value;
break;
case JIT_TYPE_FLOAT32:
if(overflow_check)
{
if(!jit_float32_to_ulong_ovf(&result->un.ulong_value,
value->un.float32_value))
{
return 0;
}
}
else
{
result->un.ulong_value = jit_float32_to_ulong(value->un.float32_value);
}
break;
case JIT_TYPE_FLOAT64:
if(overflow_check)
{
if(!jit_float64_to_ulong_ovf(&result->un.ulong_value,
value->un.float64_value))
{
return 0;
}
}
else
{
result->un.ulong_value = jit_float64_to_ulong(value->un.float64_value);
}
break;
case JIT_TYPE_NFLOAT:
if(overflow_check)
{
if(!jit_nfloat_to_ulong_ovf(&result->un.ulong_value,
value->un.nfloat_value))
{
return 0;
}
}
else
{
result->un.ulong_value = jit_nfloat_to_ulong(value->un.nfloat_value);
}
break;
default:
return 0;
}
break;
case JIT_TYPE_FLOAT32:
switch(srctype->kind)
{
case JIT_TYPE_INT:
result->un.float32_value = jit_int_to_float32(value->un.int_value);
break;
case JIT_TYPE_UINT:
result->un.float32_value = jit_uint_to_float32(value->un.uint_value);
break;
case JIT_TYPE_LONG:
result->un.float32_value = jit_long_to_float32(value->un.long_value);
break;
case JIT_TYPE_ULONG:
result->un.float32_value = jit_ulong_to_float32(value->un.ulong_value);
break;
case JIT_TYPE_FLOAT32:
result->un.float32_value = value->un.float32_value;
break;
case JIT_TYPE_FLOAT64:
result->un.float32_value = jit_float64_to_float32(value->un.float64_value);
break;
case JIT_TYPE_NFLOAT:
result->un.float32_value = jit_nfloat_to_float32(value->un.nfloat_value);
break;
default:
return 0;
}
break;
case JIT_TYPE_FLOAT64:
switch(srctype->kind)
{
case JIT_TYPE_INT:
result->un.float64_value = jit_int_to_float64(value->un.int_value);
break;
case JIT_TYPE_UINT:
result->un.float64_value = jit_uint_to_float64(value->un.uint_value);
break;
case JIT_TYPE_LONG:
result->un.float64_value = jit_long_to_float64(value->un.long_value);
break;
case JIT_TYPE_ULONG:
result->un.float64_value = jit_ulong_to_float64(value->un.ulong_value);
break;
case JIT_TYPE_FLOAT32:
result->un.float64_value = jit_float32_to_float64(value->un.float32_value);
break;
case JIT_TYPE_FLOAT64:
result->un.float64_value = value->un.float64_value;
break;
case JIT_TYPE_NFLOAT:
result->un.float64_value = jit_nfloat_to_float64(value->un.nfloat_value);
break;
default:
return 0;
}
break;
case JIT_TYPE_NFLOAT:
switch(srctype->kind)
{
case JIT_TYPE_INT:
result->un.nfloat_value = jit_int_to_nfloat(value->un.int_value);
break;
case JIT_TYPE_UINT:
result->un.nfloat_value = jit_uint_to_nfloat(value->un.uint_value);
break;
case JIT_TYPE_LONG:
result->un.nfloat_value = jit_long_to_nfloat(value->un.long_value);
break;
case JIT_TYPE_ULONG:
result->un.nfloat_value = jit_ulong_to_nfloat(value->un.ulong_value);
break;
case JIT_TYPE_FLOAT32:
result->un.nfloat_value = jit_float32_to_nfloat(value->un.float32_value);
break;
case JIT_TYPE_FLOAT64:
result->un.nfloat_value = jit_float64_to_nfloat(value->un.float64_value);
break;
case JIT_TYPE_NFLOAT:
result->un.nfloat_value = value->un.nfloat_value;
break;
default:
return 0;
}
break;
default:
return 0;
}
return 1;
}
void
_jit_value_free(void *_value)
{
jit_value_t value = (jit_value_t) _value;
jit_type_free(value->type);
if(value->free_address && value->address)
{
jit_free((void *) value->address);
}
}