diff options
| author | Richard Henderson <richard.henderson@linaro.org> | 2022-04-20 11:13:08 -0700 |
|---|---|---|
| committer | Richard Henderson <richard.henderson@linaro.org> | 2022-04-20 11:13:08 -0700 |
| commit | 2d20a57453f6a206938cbbf77bed0b378c806c1f (patch) | |
| tree | 1f20990007541156f17de9d36951ce6de8ab19fc /tests/tcg/multiarch/float_convd.c | |
| parent | 40a4b96eb08b3a3e83895f46b2394748dac7a641 (diff) | |
| parent | caccf599181e2ea5f236345de9d9957a4c23e5ec (diff) | |
| download | focaccia-qemu-2d20a57453f6a206938cbbf77bed0b378c806c1f.tar.gz focaccia-qemu-2d20a57453f6a206938cbbf77bed0b378c806c1f.zip | |
Merge tag 'pull-fixes-for-7.1-200422-1' of https://github.com/stsquad/qemu into staging
Testing, docs and gdbstub updates: - make -M virt test exercise -cpu max - document how binfmt_misc docker works - clean-up the devel TOC generation - clean-up check-tcg cross-compile behaviour - fix byte swap error in xmm gdbstub access - add float_convd test with reference files - more reference files for float_convs - more cleanly handle gdb crashing during check-tcg # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCgAdFiEEZoWumedRZ7yvyN81+9DbCVqeKkQFAmJgIgsACgkQ+9DbCVqe # KkRs3Qf/WnL4YV3l8jO/wEVbls/57aLPk+ak1GuvXJ+iM9gH8Qz6WZxIJIEhhHlu # ZEixCewahTn8POMMRo4JAr0bRgtfBuh717GerXObiHcS3OuLsGM8rYP2Z1xqKL3L # 4pR8VqhyUq/Jyl/6MPN5OZB0AdEPIdI5MuflckCeDcFaowpthLjwHao07hG/FU0s # wQYS7aYTZT33V2Xm6xlePEEMq8YMPCJj00HF3Ljg4eUOmb+C+csFXMQtotsBJRCg # mC/T2U0IFbrQUkkWJqVmRCPwKraQGDMn6POk298siRWE0kV4BmH8mnmN+/Jxhqgl # QfFhQrsBxmPPG5TfQhEmlHfQ5EARLQ== # =8q12 # -----END PGP SIGNATURE----- # gpg: Signature made Wed 20 Apr 2022 08:08:59 AM PDT # gpg: using RSA key 6685AE99E75167BCAFC8DF35FBD0DB095A9E2A44 # gpg: Good signature from "Alex Bennée (Master Work Key) <alex.bennee@linaro.org>" [undefined] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 6685 AE99 E751 67BC AFC8 DF35 FBD0 DB09 5A9E 2A44 * tag 'pull-fixes-for-7.1-200422-1' of https://github.com/stsquad/qemu: (25 commits) tests/guest-debug: better handle gdb crashes target/i386: fix byte swap issue with XMM register access tests/tcg: add missing reference files for float_convs tests/tcg: add float_convd test tests/tcg: remove duplicate sha512-sse case tests/tcg: fix non-static build tests/docker: remove SKIP_DOCKER_BUILD tests/tcg: isolate from QEMU's config-host.mak tests/tcg: invoke Makefile.target directly from QEMU's makefile tests/tcg: list test targets in Makefile.prereqs tests/tcg: prepare Makefile.prereqs at configure time tests/tcg: remove CONFIG_USER_ONLY from config-target.mak tests/tcg: remove CONFIG_LINUX_USER from config-target.mak tests/tcg: add compiler test variables when using containers tests/docker: do not duplicate rules for hexagon-cross tests/docker: simplify docker-TEST@IMAGE targets tests/docker: remove unnecessary filtering of $(DOCKER_IMAGES) tests/docker: inline variable definitions or move close to use tests/docker: remove unnecessary default definitions tests/docker: remove dead variable ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'tests/tcg/multiarch/float_convd.c')
| -rw-r--r-- | tests/tcg/multiarch/float_convd.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/tests/tcg/multiarch/float_convd.c b/tests/tcg/multiarch/float_convd.c new file mode 100644 index 0000000000..0a1f0f93dc --- /dev/null +++ b/tests/tcg/multiarch/float_convd.c @@ -0,0 +1,106 @@ +/* + * Floating Point Convert Doubles to Various + * + * Copyright (c) 2019 Linaro + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <float.h> +#include <fenv.h> + + +#include "float_helpers.h" + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +typedef struct { + int flag; + char *desc; +} float_mapping; + +float_mapping round_flags[] = { + { FE_TONEAREST, "to nearest" }, +#ifdef FE_UPWARD + { FE_UPWARD, "upwards" }, +#endif +#ifdef FE_DOWNWARD + { FE_DOWNWARD, "downwards" }, +#endif +#ifdef FE_TOWARDZERO + { FE_TOWARDZERO, "to zero" } +#endif +}; + +static void print_input(double input) +{ + char *in_fmt = fmt_f64(input); + printf("from double: %s\n", in_fmt); + free(in_fmt); +} + +static void convert_double_to_single(double input) +{ + float output; + char *out_fmt, *flag_fmt; + + feclearexcept(FE_ALL_EXCEPT); + + output = input; + + flag_fmt = fmt_flags(); + out_fmt = fmt_f32(output); + printf(" to single: %s (%s)\n", out_fmt, flag_fmt); + free(out_fmt); + free(flag_fmt); +} + +#define xstr(a) str(a) +#define str(a) #a + +#define CONVERT_DOUBLE_TO_INT(TYPE, FMT) \ + static void convert_double_to_ ## TYPE(double input) \ + { \ + TYPE ## _t output; \ + char *flag_fmt; \ + const char to[] = "to " xstr(TYPE); \ + feclearexcept(FE_ALL_EXCEPT); \ + output = input; \ + flag_fmt = fmt_flags(); \ + printf("%11s: %" FMT " (%s)\n", to, output, flag_fmt); \ + free(flag_fmt); \ + } + +CONVERT_DOUBLE_TO_INT( int32, PRId32) +CONVERT_DOUBLE_TO_INT(uint32, PRId32) +CONVERT_DOUBLE_TO_INT( int64, PRId64) +CONVERT_DOUBLE_TO_INT(uint64, PRId64) + +int main(int argc, char *argv[argc]) +{ + int i, j, nums; + + nums = get_num_f64(); + + for (i = 0; i < ARRAY_SIZE(round_flags); ++i) { + if (fesetround(round_flags[i].flag) != 0) { + printf("### Rounding %s skipped\n", round_flags[i].desc); + continue; + } + printf("### Rounding %s\n", round_flags[i].desc); + for (j = 0; j < nums; j++) { + double input = get_f64(j); + print_input(input); + convert_double_to_single(input); + convert_double_to_int32(input); + convert_double_to_int64(input); + convert_double_to_uint32(input); + convert_double_to_uint64(input); + } + } + + return 0; +} |