tcg: Fix helper function vs host abi for float16
commit6c2be133a7478e443c99757b833d0f265c48e0a6
authorRichard Henderson <richard.henderson@linaro.org>
Thu, 31 May 2018 13:50:51 +0000 (31 14:50 +0100)
committerPeter Maydell <peter.maydell@linaro.org>
Thu, 31 May 2018 13:50:51 +0000 (31 14:50 +0100)
tree189f5d1d33673312ba739adfa55f866eea2b1092
parent34ffacae085914fce54590ea84bae9c6ad95e2a4
tcg: Fix helper function vs host abi for float16

Depending on the host abi, float16, aka uint16_t, values are
passed and returned either zero-extended in the host register
or with garbage at the top of the host register.

The tcg code generator has so far been assuming garbage, as that
matches the x86 abi, but this is incorrect for other host abis.
Further, target/arm has so far been assuming zero-extended results,
so that it may store the 16-bit value into a 32-bit slot with the
high 16-bits already clear.

Rectify both problems by mapping "f16" in the helper definition
to uint32_t instead of (a typedef for) uint16_t.  This forces
the host compiler to assume garbage in the upper 16 bits on input
and to zero-extend the result on output.

Cc: qemu-stable@nongnu.org
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
Message-id: 20180522175629.24932-1-richard.henderson@linaro.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
include/exec/helper-head.h
target/arm/helper-a64.c
target/arm/helper.c