diff options
author | Richard Henderson <richard.henderson@linaro.org> | 2018-05-31 14:50:51 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2018-05-31 14:50:51 +0100 |
commit | 6c2be133a7478e443c99757b833d0f265c48e0a6 (patch) | |
tree | 189f5d1d33673312ba739adfa55f866eea2b1092 /include/exec | |
parent | 34ffacae085914fce54590ea84bae9c6ad95e2a4 (diff) | |
download | qemu-6c2be133a7478e443c99757b833d0f265c48e0a6.zip qemu-6c2be133a7478e443c99757b833d0f265c48e0a6.tar.gz qemu-6c2be133a7478e443c99757b833d0f265c48e0a6.tar.bz2 |
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>
Diffstat (limited to 'include/exec')
-rw-r--r-- | include/exec/helper-head.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/exec/helper-head.h b/include/exec/helper-head.h index 15b6a68..276dd5a 100644 --- a/include/exec/helper-head.h +++ b/include/exec/helper-head.h @@ -39,7 +39,7 @@ #define dh_ctype_int int #define dh_ctype_i64 uint64_t #define dh_ctype_s64 int64_t -#define dh_ctype_f16 float16 +#define dh_ctype_f16 uint32_t #define dh_ctype_f32 float32 #define dh_ctype_f64 float64 #define dh_ctype_ptr void * |