From 5737a5e27f63e284a9e0402cdab7f86d9194457d Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Sat, 9 Mar 2024 05:19:39 -0600 Subject: platform/wavelet3d: implement floating-point min/max --- platform/wavelet3d/main.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'platform/wavelet3d/main.cpp') diff --git a/platform/wavelet3d/main.cpp b/platform/wavelet3d/main.cpp index 2555d1d..74435fd 100644 --- a/platform/wavelet3d/main.cpp +++ b/platform/wavelet3d/main.cpp @@ -41,7 +41,7 @@ int main(int argc, char **argv) { std::printf ( - "[%03d] %s %s %s\n", + "[%03d] <= %s %s %s\n", time, std::to_string(a).c_str(), op, std::to_string(b).c_str() ); @@ -64,6 +64,9 @@ int main(int argc, char **argv) top.mnorm_put_mul = 0; top.mnorm_zero_flags = 1; top.mnorm_zero_b = 1; + top.minmax_abs = 1; + top.minmax_swap = 0; + top.minmax_zero_min = 0; top.minmax_copy_flags = 0; top.shiftr_int_signed = 1; top.addsub_int_operand = 1; @@ -86,6 +89,9 @@ int main(int argc, char **argv) top.mnorm_put_mul = 0; top.mnorm_zero_flags = 1; top.mnorm_zero_b = 1; + top.minmax_abs = 1; + top.minmax_swap = 0; + top.minmax_zero_min = 0; top.minmax_copy_flags = 1; top.shiftr_int_signed = 0; top.addsub_int_operand = 0; @@ -109,6 +115,9 @@ int main(int argc, char **argv) top.mnorm_put_mul = 1; top.mnorm_zero_flags = 0; top.mnorm_zero_b = 1; + top.minmax_abs = 1; + top.minmax_swap = 0; + top.minmax_zero_min = 0; top.minmax_copy_flags = 1; top.shiftr_int_signed = 0; top.addsub_int_operand = 0; @@ -131,6 +140,9 @@ int main(int argc, char **argv) top.mnorm_put_mul = 0; top.mnorm_zero_flags = 0; top.mnorm_zero_b = 0; + top.minmax_abs = 1; + top.minmax_swap = 0; + top.minmax_zero_min = 0; top.minmax_copy_flags = 0; top.shiftr_int_signed = 0; top.addsub_int_operand = 0; @@ -144,6 +156,31 @@ int main(int argc, char **argv) send_op(a, "+", b); }; + auto min_max_fp = [&](float a, float b, bool min = false) + { + top.setup_mul_float = 0; + top.setup_unit_b = 1; + top.mnorm_put_hi = 0; + top.mnorm_put_lo = 1; + top.mnorm_put_mul = 0; + top.mnorm_zero_flags = 0; + top.mnorm_zero_b = 0; + top.minmax_abs = 0; + top.minmax_swap = min; + top.minmax_zero_min = 1; + top.minmax_copy_flags = 1; + top.shiftr_int_signed = 0; + top.addsub_int_operand = 0; + top.addsub_copy_flags = 1; + top.clz_force_nop = 1; + top.shiftl_copy_flags = 1; + top.round_copy_flags = 1; + top.round_enable = 0; + top.encode_enable = 0; + + send_op(a, min ? "min" : "max", b); + }; + top.rst_n = 0; top.in_valid = 0; cycle(); @@ -167,8 +204,10 @@ int main(int argc, char **argv) mul_int(a, b); mul_fp(a_flt, b_flt); add_fp(a_flt, b_flt); + min_max_fp(a_flt, b_flt); + min_max_fp(a_flt, b_flt, true); - while (time < 20) { + while (time < 50) { cycle(); if (!top.out_valid) @@ -180,7 +219,7 @@ int main(int argc, char **argv) std::printf ( - "[%03d] q=0x%08x, q_flt=%g, q_int=%d, q_uint=%u\n", + "[%03d] => q=0x%08x, q_flt=%g, q_int=%d, q_uint=%u\n", time, q_bits, q_flt, q_int, q_bits ); } -- cgit v1.2.3