(root)/
glibc-2.38/
sysdeps/
ieee754/
soft-fp/
s_fmull.c
       1  /* Multiply long double (ldbl-128) values, narrowing the result to
       2     float, using soft-fp.
       3     Copyright (C) 2018-2023 Free Software Foundation, Inc.
       4     This file is part of the GNU C Library.
       5  
       6     The GNU C Library is free software; you can redistribute it and/or
       7     modify it under the terms of the GNU Lesser General Public
       8     License as published by the Free Software Foundation; either
       9     version 2.1 of the License, or (at your option) any later version.
      10  
      11     The GNU C Library is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14     Lesser General Public License for more details.
      15  
      16     You should have received a copy of the GNU Lesser General Public
      17     License along with the GNU C Library; if not, see
      18     <https://www.gnu.org/licenses/>.  */
      19  
      20  #define f32mulf64x __hide_f32mulf64x
      21  #define f32mulf128 __hide_f32mulf128
      22  #include <math.h>
      23  #undef f32mulf64x
      24  #undef f32mulf128
      25  
      26  #include <math-narrow.h>
      27  #include <soft-fp.h>
      28  #include <single.h>
      29  #include <quad.h>
      30  
      31  float
      32  __fmull (_Float128 x, _Float128 y)
      33  {
      34    FP_DECL_EX;
      35    FP_DECL_Q (X);
      36    FP_DECL_Q (Y);
      37    FP_DECL_Q (R);
      38    FP_DECL_S (RN);
      39    float ret;
      40  
      41    FP_INIT_ROUNDMODE;
      42    FP_UNPACK_Q (X, x);
      43    FP_UNPACK_Q (Y, y);
      44    FP_MUL_Q (R, X, Y);
      45  #if _FP_W_TYPE_SIZE < 64
      46    FP_TRUNC_COOKED (S, Q, 1, 4, RN, R);
      47  #else
      48    FP_TRUNC_COOKED (S, Q, 1, 2, RN, R);
      49  #endif
      50    FP_PACK_S (ret, RN);
      51    FP_HANDLE_EXCEPTIONS;
      52    CHECK_NARROW_MUL (ret, x, y);
      53    return ret;
      54  }
      55  libm_alias_float_ldouble (mul)