Richard Henderson <richard.hender...@linaro.org> writes:

> The dh_alias redirect is intended to handle TCG types as distinguished
> from C types.  TCG does not distinguish signed int from unsigned int,
> because they are the same size.  However, we need to retain this
> distinction for dh_typecode, lest we fail to extend abi types properly
> for the host call parameters.
>
> This bug was detected when running the 'arm' emulator on an s390
> system. The s390 uses TCG_TARGET_EXTEND_ARGS which triggers code
> in tcg_gen_callN to extend 32 bit values to 64 bits; the incorrect
> sign data in the typemask for each argument caused the values to be
> extended as unsigned values.
>
> This simple program exhibits the problem:
>
>       static volatile int num = -9;
>       static volatile int den = -5;
>
>       int
>       main(void)
>       {
>               int quo = num / den;
>               printf("num %d den %d quo %d\n", num, den, quo);
>               exit(0);
>       }
>
> When run on the broken qemu, this results in:
>
>       num -9 den -5 quo 0
>
> The correct result is:
>
>       num -9 den -5 quo 1
>

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/876

Reviewed-by: Alex Bennée <alex.ben...@linaro.org>

-- 
Alex Bennée

Reply via email to