diff options
| author | Alejandro Soto <alejandro@34project.org> | 2024-03-09 05:19:39 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2024-03-09 05:19:39 -0600 |
| commit | 5737a5e27f63e284a9e0402cdab7f86d9194457d (patch) | |
| tree | 99e615c1c86deb052371d46555f15e5a0fe1ffbe /platform/wavelet3d/main.cpp | |
| parent | 0a9d2b7209ffeac4aaa55ed8bc5d333d2519db6e (diff) | |
platform/wavelet3d: implement floating-point min/max
Diffstat (limited to '')
| -rw-r--r-- | platform/wavelet3d/main.cpp | 45 |
1 files changed, 42 insertions, 3 deletions
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 ); } |
