code: def mpi_mul(s, t, prec=0):
      sa, sb = s
      ta, tb = t
      sas = mpf_sign(sa)
      sbs = mpf_sign(sb)
      tas = mpf_sign(ta)
      tbs = mpf_sign(tb)
      if sas == sbs == 0:
          # Should maybe be undefined
          if ta == fninf or tb == finf:
              return fninf, finf
          return fzero, fzero
      if tas == tbs == 0:
          # Should maybe be undefined
          if sa == fninf or sb == finf:
              return fninf, finf
          return fzero, fzero
      if sas >= 0:
          # positive * positive
          if tas >= 0:
              a = mpf_mul(sa, ta, prec, round_floor)
              b = mpf_mul(sb, tb, prec, round_ceiling)
              if a == fnan:
                  a = fzero
              if b == fnan:
                  b = finf
          # positive * negative
          elif tbs <= 0:
              a = mpf_mul(sb, ta, prec, round_floor)
              b = mpf_mul(sa, tb, prec, round_ceiling)
              if a == fnan:
                  a = fninf
              if b == fnan:
                  b = fzero
          # positive * both signs
          else:
              a = mpf_mul(sb, ta, prec, round_floor)
              b = mpf_mul(sb, tb, prec, round_ceiling)
              if a == fnan:
                  a = fninf
              if b == fnan:
                  b = finf
      elif sbs <= 0:
          # negative * positive
          if tas >= 0:
              a = mpf_mul(sa, tb, prec, round_floor)
              b = mpf_mul(sb, ta, prec, round_ceiling)
              if a == fnan:
                  a = fninf
              if b == fnan:
                  b = fzero
          # negative * negative
          elif tbs <= 0:
              a = mpf_mul(sb, tb, prec, round_floor)
              b = mpf_mul(sa, ta, prec, round_ceiling)
              if a == fnan:
                  a = fzero
              if b == fnan:
                  b = finf
          # negative * both signs
          else:
              a = mpf_mul(sa, tb, prec, round_floor)
              b = mpf_mul(sa, ta, prec, round_ceiling)
              if a == fnan:
                  a = fninf
              if b == fnan:
                  b = finf
      else:
          # General case: perform all cross-multiplications and compare
          # Since the multiplications can be done exactly, we need only
          # do 4 (instead of 8: two for each rounding mode)
          cases = [
              mpf_mul(sa, ta),
              mpf_mul(sa, tb),
              mpf_mul(sb, ta),
              mpf_mul(sb, tb),
          ]
          if fnan in cases:
              a, b = (fninf, finf)
          else:
              a, b = mpf_min_max(cases)
              a = mpf_pos(a, prec, round_floor)
              b = mpf_pos(b, prec, round_ceiling)
      return a, b
  
imports: from .backend import xrange
  from .libmpf import ComplexResult, round_down, round_up, round_floor, round_ceiling, round_nearest, prec_to_dps, repr_dps, dps_to_prec, bitcount, from_float, fnan, finf, fninf, fzero, fhalf, fone, fnone, mpf_sign, mpf_lt, mpf_le, mpf_gt, mpf_ge, mpf_eq, mpf_cmp, mpf_min_max, mpf_floor, from_int, to_int, to_str, from_str, mpf_abs, mpf_neg, mpf_pos, mpf_add, mpf_sub, mpf_mul, mpf_mul_int, mpf_div, mpf_shift, mpf_pow_int, from_man_exp, MPZ_ONE
  from .libelefun import mpf_log, mpf_exp, mpf_sqrt, mpf_atan, mpf_atan2, mpf_pi, mod_pi2, mpf_cos_sin
  from .gammazeta import mpf_gamma, mpf_rgamma, mpf_loggamma, mpc_loggamma
label_desc: Use image node_id 17 for calling a global function with example usage: mpi_mul(s, t, prec) and returns: a,  b, fzero,  fzero, fzero,  fzero, fninf,  finf, fninf,  finf