>> Hello.
>>
>>> +            case 13: /*QUOSi*/
>>> +                tcg_gen_div_i32(cpu_R[RRR_R], cpu_R[RRR_S], cpu_R[RRR_T]);
>>> +                break;
>>
>> I'm currently developing test suite for xtensa port and found that
>> with this implementation of QUOS (signed 32-bit division) guest that
>> divide 0x80000000 by -1 crashes qemu with 'floating point exception'
>> on x86_64 host.
>
> Yes. See tcg/README, which says:
> # Undefined behavior if division by zero or overflow.
>
> This is basically because the behaviour varies rather from architecture
> to architecture so (a) it would be a pain to implement consistent
> handling in the tcg backends and (b) all the front-ends would probably
> still need special case handling to give the results the guest arch
> requires. (What is xtensa's behaviour for div by zero and the overflow
> case ?)

div by zero -> exception, has a special case handler already;
overflow -> result == 0x80000000, no other side effects.

>> I guess that this is a known issue, at least target-arm has a special
>> case to handle this. Is there a better way to handle this issue, or
>> special-casing is the only option?
>
> I wouldn't do what target-arm does: it goes out to a helper function,
> probably because that code predates the addition of brcond to TCG.
> PPC and MIPS are probably better candidates to crib from, as they
> both do the special-case checks inline.

I meant generally specialcasing vs hw exceptions/whatever.
ARM just have it explicitly coded. For xtensa I'd do it inline too.

BTW, I see that target-microblaze has the same issue.

-- 
Thanks.
-- Max

Reply via email to