+2004-06-22 Rhys Weatherley <rweather@southern-storm.com.au>
+
+ * jit/jit-insn.c: properly set the "may_throw" flag for opcodes
+ that throw exceptions and which are also supported by the back end.
+
2004-06-21 Rhys Weatherley <rweather@southern-storm.com.au>
* jit/jit-rules-x86.c, jit/jit-rules-x86.sel: move the code
{
int oper;
jit_type_t result_type;
+ const jit_intrinsic_descr_t *desc;
if(!value1)
{
return 0;
if(result_type == jit_type_int)
{
oper = descr->ioper;
+ desc = descr->idesc;
}
else if(result_type == jit_type_uint)
{
oper = descr->iuoper;
+ desc = descr->iudesc;
}
else if(result_type == jit_type_long)
{
oper = descr->loper;
+ desc = descr->ldesc;
}
else if(result_type == jit_type_ulong)
{
oper = descr->luoper;
+ desc = descr->ludesc;
}
else if(result_type == jit_type_float32)
{
oper = descr->foper;
+ desc = descr->fdesc;
}
else if(result_type == jit_type_float64)
{
oper = descr->doper;
+ desc = descr->ddesc;
}
else
{
oper = descr->nfoper;
+ desc = descr->nfdesc;
+ }
+ if(desc && desc->ptr_result_type)
+ {
+ func->builder->may_throw = 1;
}
value1 = jit_insn_convert(func, value1, result_type, overflow_check);
if(_jit_opcode_is_supported(oper))
{
int oper;
jit_type_t result_type;
+ const jit_intrinsic_descr_t *desc;
if(!value1 || !value2)
{
return 0;
if(result_type == jit_type_int)
{
oper = descr->ioper;
+ desc = descr->idesc;
}
else if(result_type == jit_type_uint)
{
oper = descr->iuoper;
+ desc = descr->iudesc;
}
else if(result_type == jit_type_long)
{
oper = descr->loper;
+ desc = descr->ldesc;
}
else if(result_type == jit_type_ulong)
{
oper = descr->luoper;
+ desc = descr->ludesc;
}
else if(result_type == jit_type_float32)
{
oper = descr->foper;
+ desc = descr->fdesc;
}
else if(result_type == jit_type_float64)
{
oper = descr->doper;
+ desc = descr->ddesc;
}
else
{
oper = descr->nfoper;
+ desc = descr->nfdesc;
+ }
+ if(desc && desc->ptr_result_type)
+ {
+ func->builder->may_throw = 1;
}
value1 = jit_insn_convert(func, value1, result_type, overflow_check);
value2 = jit_insn_convert(func, value2, result_type, overflow_check);
(jit_function_t func, int oper, jit_value_t value1,
jit_type_t result_type)
{
+ /* Set the "may_throw" flag if the conversion may throw an exception */
+ if(convert_intrinsics[oper - 1].descr.ptr_result_type)
+ {
+ func->builder->may_throw = 1;
+ }
+
/* Bail out early if the conversion opcode is supported by the back end */
if(_jit_opcode_is_supported(oper))
{