+/*----- Direct conversions ------------------------------------------------*/
+
+#define DIRECT_CONVERSIONS(_) \
+ _(flt, float, f32) \
+ _(dbl, double, f64)
+
+#define DEF_TEST1(ty, cty, fty, e) \
+ static void test_##ty##to##fty##e(const struct tvec_reg *in, \
+ struct tvec_reg *out, \
+ void *ctx) \
+ { \
+ tvec_allocbytes(&out[RZ_OUT].v, OUTSZ_##fty); \
+ out[RERR_OUT].v.u = fltfmt_##ty##to##fty##e(out[RZ_OUT].v.bytes.p, \
+ in[RX].v.f, \
+ in[RROUND].v.u); \
+ } \
+ \
+ static const struct tvec_test ty##to##fty##e##_test = \
+ { #ty "to" #fty #e, ty##to##fty##_regs, &ty##_env._env, \
+ test_##ty##to##fty##e };
+
+#define DEF_TEST(ty, cty, fty) \
+ static const struct tvec_regdef ty##to##fty##_regs[] = { \
+ { "round", &tvty_flags, RROUND, TVRF_OPT, { &fltrnd_flaginfo } }, \
+ { "x", &tvty_float, RX, 0, { &tvflt_##cty } }, \
+ { "z", &tvty_bytes, RZ_OUT, 0, { &fty##_range } }, \
+ { "err", &tvty_flags, RERR_OUT, TVRF_OPT, { &flterr_flaginfo } }, \
+ TVEC_ENDREGS \
+ }; \
+ \
+ DEF_TEST1(ty, cty, fty, l) \
+ DEF_TEST1(ty, cty, fty, b)
+
+DIRECT_CONVERSIONS(DEF_TEST)
+
+#undef DEF_TEST1
+#undef DEF_TEST
+
+#define DEF_TEST1(ty, cty, fty, e) \
+ static void test_##fty##e##to##ty(const struct tvec_reg *in, \
+ struct tvec_reg *out, \
+ void *ctx) \
+ { \
+ cty z; \
+ \
+ out[RERR_OUT].v.u = fltfmt_##fty##e##to##ty(&z, in[RX].v.bytes.p, \
+ in[RROUND].v.u); \
+ out[RZ_OUT].v.f = z; \
+ } \
+ \
+ static const struct tvec_test fty##e##to##ty##_test = \
+ { #fty #e "to" #ty, fty##to##ty##_regs, &ty##_env._env, \
+ test_##fty##e##to##ty };
+
+#define DEF_TEST(ty, cty, fty) \
+ static const struct tvec_regdef fty##to##ty##_regs[] = { \
+ { "round", &tvty_flags, RROUND, TVRF_OPT, { &fltrnd_flaginfo } }, \
+ { "x", &tvty_bytes, RX, 0, { &fty##_range } }, \
+ { "z", &tvty_float, RZ_OUT, 0, { &tvflt_##cty } }, \
+ { "err", &tvty_flags, RERR_OUT, TVRF_OPT, { &flterr_flaginfo } }, \
+ TVEC_ENDREGS \
+ }; \
+ \
+ DEF_TEST1(ty, cty, fty, l) \
+ DEF_TEST1(ty, cty, fty, b)
+
+DIRECT_CONVERSIONS(DEF_TEST)
+
+#undef DEF_TEST1
+#undef DEF_TEST
+
+#define DEF_DIRECT_CTOF_TESTS(ty, cty, fty) \
+ &ty##to##fty##l_test, &ty##to##fty##b_test,
+#define DEF_DIRECT_FTOC_TESTS(ty, cty, fty) \
+ &fty##l##to##ty##_test, &fty##b##to##ty##_test,
+#define DEF_DIRECT_TESTS(ty, cty, fty) \
+ DEF_DIRECT_CTOF_TESTS(ty, cty, fty) \
+ DEF_DIRECT_FTOC_TESTS(ty, cty, fty)
+#define DIRECT_TESTS DIRECT_CONVERSIONS(DEF_DIRECT_TESTS)
+