summaryrefslogtreecommitdiffstats
path: root/tests/tcg/multiarch/float_convd.c
diff options
context:
space:
mode:
authorRichard Henderson2022-04-20 20:13:08 +0200
committerRichard Henderson2022-04-20 20:13:08 +0200
commit2d20a57453f6a206938cbbf77bed0b378c806c1f (patch)
tree1f20990007541156f17de9d36951ce6de8ab19fc /tests/tcg/multiarch/float_convd.c
parentMerge tag 'pull-block-2022-04-20' of https://gitlab.com/hreitz/qemu into staging (diff)
parenttests/guest-debug: better handle gdb crashes (diff)
downloadqemu-2d20a57453f6a206938cbbf77bed0b378c806c1f.tar.gz
qemu-2d20a57453f6a206938cbbf77bed0b378c806c1f.tar.xz
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.c106
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;
+}