#include "jit-internal.h"
#include "jit-rules.h"
static jit_value_t alloc_value(jit_function_t func, jit_type_t type)
{
jit_value_t value;
if(!_jit_function_ensure_builder(func))
{
return 0;
}
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_value_t value;
jit_type_t stripped;
if(!_jit_function_ensure_builder(func))
{
return 0;
}
if(!const_value)
{
stripped = jit_type_remove_tags(type);
if(jit_type_is_pointer(stripped) || stripped == jit_type_nint)
{
if(func->builder->null_constant)
{
return func->builder->null_constant;
}
}
else if(stripped == jit_type_int)
{
if(func->builder->zero_constant)
{
return func->builder->zero_constant;
}
}
}
value = alloc_value(func, type);
if(!value)
{
return 0;
}
value->is_constant = 1;
value->is_nint_constant = 1;
value->address = const_value;
if(!const_value)
{
stripped = jit_type_remove_tags(type);
if(jit_type_is_pointer(stripped) || stripped == jit_type_nint)
{
func->builder->null_constant = value;
}
else if(stripped == 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->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_normalize(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:
return jit_value_create_nint_constant
(func, const_value->type, const_value->un.nint_value);
case JIT_TYPE_LONG:
case JIT_TYPE_ULONG:
#ifdef JIT_NATIVE_INT64
return jit_value_create_nint_constant
(func, const_value->type, const_value->un.long_value);
#else
return jit_value_create_long_constant
(func, const_value->type, const_value->un.long_value);
#endif
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)
{
jit_type_t signature;
unsigned int num_params, current;
jit_value_t *values;
if(!_jit_function_ensure_builder(func))
{
return 0;
}
signature = func->signature;
num_params = jit_type_num_params(signature);
if(param >= num_params)
{
return 0;
}
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)
{
values[current] = jit_value_create(func, jit_type_get_param(signature, current));
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_normalize(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(!value || !_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)
{
if(value)
{
return value->type;
}
else
{
return 0;
}
}
jit_function_t jit_value_get_function(jit_value_t value)
{
if(value)
{
return value->block->func;
}
else
{
return 0;
}
}
jit_block_t jit_value_get_block(jit_value_t value)
{
if(value)
{
return value->block;
}
else
{
return 0;
}
}
jit_context_t jit_value_get_context(jit_value_t value)
{
if(value)
{
return value->block->func->context;
}
else
{
return 0;
}
}
jit_constant_t jit_value_get_constant(jit_value_t value)
{
jit_constant_t result;
if(!value || !(value->is_constant))
{
result.type = jit_type_void;
return result;
}
result.type = value->type;
switch(jit_type_normalize(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:
{
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 (jit_nint)(value->address);
}
else
{
return 0;
}
}
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))
{
return (jit_float32)0.0;
}
if(jit_type_normalize(value->type)->kind == JIT_TYPE_FLOAT32)
{
return *((jit_float32 *)(value->address));
}
return (jit_float32)0.0;
}
jit_float64 jit_value_get_float64_constant(jit_value_t value)
{
if(!(value->is_constant))
{
return (jit_float64)0.0;
}
if(jit_type_normalize(value->type)->kind == JIT_TYPE_FLOAT64)
{
return *((jit_float64 *)(value->address));
}
return (jit_float64)0.0;
}
jit_nfloat jit_value_get_nfloat_constant(jit_value_t value)
{
if(!(value->is_constant))
{
return (jit_nfloat)0.0;
}
if(jit_type_normalize(value->type)->kind == JIT_TYPE_NFLOAT)
{
return *((jit_nfloat *)(value->address));
}
return (jit_nfloat)0.0;
}
int jit_value_is_true(jit_value_t value)
{
if(!value || !(value->is_constant))
{
return 0;
}
else if(value->is_nint_constant)
{
return (value->address != 0);
}
else
{
switch(jit_type_normalize(value->type)->kind)
{
case JIT_TYPE_LONG:
case JIT_TYPE_ULONG:
{
if(jit_value_get_long_constant(value) != 0)
{
return 1;
}
}
break;
case JIT_TYPE_FLOAT32:
{
if(jit_value_get_float32_constant(value) != (jit_float32)0.0)
{
return 1;
}
}
break;
case JIT_TYPE_FLOAT64:
{
if(jit_value_get_float64_constant(value) != (jit_float64)0.0)
{
return 1;
}
}
break;
case JIT_TYPE_NFLOAT:
{
if(jit_value_get_nfloat_constant(value) != (jit_nfloat)0.0)
{
return 1;
}
}
break;
}
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;
if(!result || !value)
{
return 0;
}
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));
}
}