| 725 | |
| 726 | template<af_op_t op> |
| 727 | static af_err reduce_all_promote(double *real_val, double *imag_val, |
| 728 | const af_array in, bool change_nan = false, |
| 729 | double nanval = 0) { |
| 730 | try { |
| 731 | const ArrayInfo &in_info = getInfo(in); |
| 732 | af_dtype type = in_info.getType(); |
| 733 | |
| 734 | ARG_ASSERT(0, real_val != nullptr); |
| 735 | *real_val = 0; |
| 736 | if (imag_val) { *imag_val = 0; } |
| 737 | |
| 738 | cfloat cfval; |
| 739 | cdouble cdval; |
| 740 | |
| 741 | switch (type) { |
| 742 | // clang-format off |
| 743 | case f32: *real_val = reduce_all<op, float, float>(in, change_nan, nanval); break; |
| 744 | case f64: *real_val = reduce_all<op, double, double>(in, change_nan, nanval); break; |
| 745 | case u32: *real_val = reduce_all<op, uint, uint>(in, change_nan, nanval); break; |
| 746 | case s32: *real_val = reduce_all<op, int, int>(in, change_nan, nanval); break; |
| 747 | case u64: *real_val = reduce_all<op, uintl, uintl>(in, change_nan, nanval); break; |
| 748 | case s64: *real_val = reduce_all<op, intl, intl>(in, change_nan, nanval); break; |
| 749 | case u16: *real_val = reduce_all<op, ushort, uint>(in, change_nan, nanval); break; |
| 750 | case s16: *real_val = reduce_all<op, short, int>(in, change_nan, nanval); break; |
| 751 | case u8: *real_val = reduce_all<op, uchar, uint>(in, change_nan, nanval); break; |
| 752 | case s8: *real_val = reduce_all<op, schar, int>(in, change_nan, nanval); break; |
| 753 | // clang-format on |
| 754 | case b8: { |
| 755 | if (op == af_mul_t) { |
| 756 | *real_val = reduce_all<af_and_t, char, char>(in, change_nan, |
| 757 | nanval); |
| 758 | } else { |
| 759 | *real_val = reduce_all<af_notzero_t, char, uint>( |
| 760 | in, change_nan, nanval); |
| 761 | } |
| 762 | } break; |
| 763 | case c32: |
| 764 | cfval = reduce_all<op, cfloat, cfloat, cfloat>(in); |
| 765 | ARG_ASSERT(1, imag_val != nullptr); |
| 766 | *real_val = real(cfval); |
| 767 | *imag_val = imag(cfval); |
| 768 | break; |
| 769 | |
| 770 | case c64: |
| 771 | cdval = reduce_all<op, cdouble, cdouble, cdouble>(in); |
| 772 | ARG_ASSERT(1, imag_val != nullptr); |
| 773 | *real_val = real(cdval); |
| 774 | *imag_val = imag(cdval); |
| 775 | break; |
| 776 | case f16: |
| 777 | *real_val = reduce_all<op, half, float>(in, change_nan, nanval); |
| 778 | break; |
| 779 | |
| 780 | default: TYPE_ERROR(1, type); |
| 781 | } |
| 782 | } |
| 783 | CATCHALL; |
| 784 | |