(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
float128-longdouble-math.c
       1  /* { dg-require-effective-target ppc_float128_hw } */
       2  /* { dg-options "-mdejagnu-cpu=power9 -O2 -mlong-double-128 -Wno-psabi -mabi=ieeelongdouble" } */
       3  
       4  /* Test if switching long double to IEEE 128-bit maps all of the math built-in
       5     function names correctly.  We leave off the \M in matching the calls, so
       6     power10 will match using bl foo@notoc.  */
       7  
       8  #ifdef DO_FUNC
       9  #define BUILTIN1(FUNC, ARG1)             FUNC (ARG1)
      10  #define BUILTIN2(FUNC, ARG1, ARG2)       FUNC (ARG1, ARG2)
      11  #define BUILTIN3(FUNC, ARG1, ARG2, ARG3) FUNC (ARG1, ARG2, ARG3)
      12  
      13  #else
      14  #define BUILTIN1(FUNC, ARG1)             __builtin_ ## FUNC (ARG1)
      15  #define BUILTIN2(FUNC, ARG1, ARG2)       __builtin_ ## FUNC (ARG1, ARG2)
      16  #define BUILTIN3(FUNC, ARG1, ARG2, ARG3) __builtin_ ## FUNC (ARG1, ARG2, ARG3)
      17  #endif
      18  
      19  /* Built-in functions that returns a long double and take one long double
      20     argument.  */
      21  
      22  void
      23  return_ld_arg_ld (long double *p,
      24  		  long double *q)
      25  {
      26    /* { dg-final { scan-assembler {\mbl __acoshieee128} } }  */
      27    *p++ = BUILTIN1 (acoshl, *q++);
      28  
      29    /* { dg-final { scan-assembler {\mbl __acosieee128} } }  */
      30    *p++ = BUILTIN1 (acosl, *q++);
      31  
      32    /* { dg-final { scan-assembler {\mbl __asinhieee128} } }  */
      33    *p++ = BUILTIN1 (asinhl, *q++);
      34  
      35    /* { dg-final { scan-assembler {\mbl __asinieee128} } }  */
      36    *p++ = BUILTIN1 (asinl, *q++);
      37  
      38    /* { dg-final { scan-assembler {\mbl __atanhieee128} } }  */
      39    *p++ = BUILTIN1 (atanhl, *q++);
      40  
      41    /* { dg-final { scan-assembler {\mbl __atanieee128} } }  */
      42    *p++ = BUILTIN1 (atanl, *q++);
      43  
      44    /* { dg-final { scan-assembler {\mbl __cbrtieee128} } }  */
      45    *p++ = BUILTIN1 (cbrtl, *q++);
      46  
      47    /* inline code.  */
      48    /* { dg-final { scan-assembler {\mxsrqpi +[0-9]+,[0-9]+,[0-9]+,2} } }  */
      49    *p++ = BUILTIN1 (ceill, *q++);
      50  
      51    /* { dg-final { scan-assembler {\mbl __coshieee128} } }  */
      52    *p++ = BUILTIN1 (coshl, *q++);
      53  
      54    /* { dg-final { scan-assembler {\mbl __cosieee128} } }  */
      55    *p++ = BUILTIN1 (cosl, *q++);
      56  
      57    /* { dg-final { scan-assembler {\mbl __erfcieee128} } }  */
      58    *p++ = BUILTIN1 (erfcl, *q++);
      59  
      60    /* { dg-final { scan-assembler {\mbl __erfieee128} } }  */
      61    *p++ = BUILTIN1 (erfl, *q++);
      62  
      63    /* { dg-final { scan-assembler {\mbl __exp10ieee128} } }  */
      64    *p++ = BUILTIN1 (exp10l, *q++);
      65  
      66    /* { dg-final { scan-assembler {\mbl __exp2ieee128} } }  */
      67    *p++ = BUILTIN1 (exp2l, *q++);
      68  
      69    /* { dg-final { scan-assembler {\mbl __expieee128} } }  */
      70    *p++ = BUILTIN1 (expl, *q++);
      71  
      72    /* { dg-final { scan-assembler {\mbl __expm1ieee128} } }  */
      73    *p++ = BUILTIN1 (expm1l, *q++);
      74  
      75    /* inline code.  */
      76    /* { dg-final { scan-assembler {\mxsabsqp} } }  */
      77    *p++ = BUILTIN1 (fabsl, *q++);
      78  
      79    /* inline code.  */
      80    /* { dg-final { scan-assembler {\mxsrqpi +[0-9]+,[0-9]+,[0-9]+,3} } }  */
      81    *p++ = BUILTIN1 (floorl, *q++);
      82  
      83    /* { dg-final { scan-assembler {\mbl __lgammaieee128} } }  */
      84    *p++ = BUILTIN1 (gammal, *q++);
      85  
      86    /* { dg-final { scan-assembler {\mbl __j0ieee128} } }  */
      87    *p++ = BUILTIN1 (j0l, *q++);
      88  
      89    /* { dg-final { scan-assembler {\mbl __j1ieee128} } }  */
      90    *p++ = BUILTIN1 (j1l, *q++);
      91  
      92    /* { dg-final { scan-assembler {\mbl __log10ieee128} } }  */
      93    *p++ = BUILTIN1 (log10l, *q++);
      94  
      95    /* { dg-final { scan-assembler {\mbl __log1pieee128} } }  */
      96    *p++ = BUILTIN1 (log1pl, *q++);
      97  
      98    /* { dg-final { scan-assembler {\mbl __log2ieee128} } }  */
      99    *p++ = BUILTIN1 (log2l, *q++);
     100  
     101    /* { dg-final { scan-assembler {\mbl __logbieee128} } }  */
     102    *p++ = BUILTIN1 (logbl, *q++);
     103  
     104    /* { dg-final { scan-assembler {\mbl __logieee128} } }  */
     105    *p++ = BUILTIN1 (logl, *q++);
     106  
     107    /* { dg-final { scan-assembler {\mbl __nearbyintieee128} } }  */
     108    *p++ = BUILTIN1 (nearbyintl, *q++);
     109  
     110    /* { dg-final { scan-assembler {\mbl __exp10ieee128} } }  */
     111    *p++ = BUILTIN1 (pow10l, *q++);
     112  
     113    /* { dg-final { scan-assembler {\mbl __rintieee128} } }  */
     114    *p++ = BUILTIN1 (rintl, *q++);
     115  
     116    /* { dg-final { scan-assembler {\mbl __roundevenieee128} } }  */
     117    *p++ = BUILTIN1 (roundevenl, *q++);
     118  
     119    /* inline code.  */
     120    /* { dg-final { scan-assembler {\mxsrqpi +[0-9]+,[0-9]+,[0-9]+,0} } }  */
     121    *p++ = BUILTIN1 (roundl, *q++);
     122  
     123    /* { dg-final { scan-assembler {\mbl __significandieee128} } }  */
     124    *p++ = BUILTIN1 (significandl, *q++);
     125  
     126    /* { dg-final { scan-assembler {\mbl __sinhieee128} } }  */
     127    *p++ = BUILTIN1 (sinhl, *q++);
     128  
     129    /* { dg-final { scan-assembler {\mbl __sinieee128} } }  */
     130    *p++ = BUILTIN1 (sinl, *q++);
     131  
     132    /* { dg-final { scan-assembler {\mbl __sqrtieee128} } }  */
     133    *p++ = BUILTIN1 (sqrtl, *q++);
     134  
     135    /* { dg-final { scan-assembler {\mbl __tanhieee128} } }  */
     136    *p++ = BUILTIN1 (tanhl, *q++);
     137  
     138    /* { dg-final { scan-assembler {\mbl __tanieee128} } }  */
     139    *p++ = BUILTIN1 (tanl, *q++);
     140  
     141    /* { dg-final { scan-assembler {\mbl __tgammaieee128} } }  */
     142    *p++ = BUILTIN1 (tgammal, *q++);
     143  
     144    /* inline code.  */
     145    /* { dg-final { scan-assembler {\mxsrqpi +[0-9]+,[0-9]+,[0-9]+,1} } }  */
     146    *p++ = BUILTIN1 (truncl, *q++);
     147  
     148    /* { dg-final { scan-assembler {\mbl __y0ieee128} } }  */
     149    *p++ = BUILTIN1 (y0l, *q++);
     150  
     151    /* { dg-final { scan-assembler {\mbl __y1ieee128} } }  */
     152    *p   = BUILTIN1 (y1l, *q);
     153  
     154  }
     155  
     156  /* Built-in functions that returns a long double and take two long double
     157     arguments.  */
     158  
     159  void
     160  return_ld_arg_ld_ld (long double *p,
     161  		     long double *q,
     162  		     long double *r)
     163  {
     164    /* { dg-final { scan-assembler {\mbl __atan2ieee128} } }  */
     165    *p++ = BUILTIN2 (atan2l, *q++, *r++);
     166  
     167    /* inline code.  */
     168    /* { dg-final { scan-assembler {\mxscpsgnqp} } }  */
     169    *p++ = BUILTIN2 (copysignl, *q++, *r++);
     170  
     171    /* { dg-final { scan-assembler {\mbl __remainderieee128} } }  */
     172    *p++ = BUILTIN2 (dreml, *q++, *r++);
     173  
     174    /* { dg-final { scan-assembler {\mbl __fdimieee128} } }  */
     175    *p++ = BUILTIN2 (fdiml, *q++, *r++);
     176  
     177    /* { dg-final { scan-assembler {\mbl __fmaxieee128} } }  */
     178    *p++ = BUILTIN2 (fmaxl, *q++, *r++);
     179  
     180    /* { dg-final { scan-assembler {\mbl __fminieee128} } }  */
     181    *p++ = BUILTIN2 (fminl, *q++, *r++);
     182  
     183    /* { dg-final { scan-assembler {\mbl __fmodieee128} } }  */
     184    *p++ = BUILTIN2 (fmodl, *q++, *r++);
     185  
     186    /* { dg-final { scan-assembler {\mbl __hypotieee128} } }  */
     187    *p++ = BUILTIN2 (hypotl, *q++, *r++);
     188  
     189    /* { dg-final { scan-assembler {\mbl __nextafterieee128} } }  */
     190    *p++ = BUILTIN2 (nextafterl, *q++, *r++);
     191  
     192    /* { dg-final { scan-assembler {\mbl __nexttowardieee128} } }  */
     193    *p++ = BUILTIN2 (nexttowardl, *q++, *r++);
     194  
     195    /* { dg-final { scan-assembler {\mbl __powieee128} } }  */
     196    *p++ = BUILTIN2 (powl, *q++, *r++);
     197  
     198    /* { dg-final { scan-assembler {\mbl __scalbnieee128} } }  */
     199    *p   = BUILTIN2 (scalbl, *q, *r);
     200  }
     201  
     202  /* Built-in function that returns a long double and take three long double
     203     arguments.  */
     204  
     205  void
     206  return_ld_arg_ld_ld_ld (long double *p,
     207  			long double *q,
     208  			long double *r,
     209  			long double *s)
     210  {
     211    /* inline code.  */
     212    /* { dg-final { scan-assembler {\mxsmaddqp} } }  */
     213    *p = BUILTIN3 (fmal, *q, *r, *s);
     214  }
     215  
     216  /* Built-in functions that returns a long double and take one
     217     _Complex long double argument.  */
     218  
     219  void
     220  return_ld_arg_cld (long double *p,
     221  		   _Complex long double *q)
     222  {
     223    /* { dg-final { scan-assembler {\mbl __cabsieee128} } }  */
     224    *p++ = BUILTIN1 (cabsl, *q++);
     225  }
     226  
     227  /* Built-in functions that returns a _Complex long double and takes one
     228     _Complex long double argument.  */
     229  
     230  void
     231  return_cld_arg_cld (_Complex long double *p,
     232  		    _Complex long double *q)
     233  {
     234    /* { dg-final { scan-assembler {\mbl __cacoshieee128} } }  */
     235    *p++ = BUILTIN1 (cacoshl, *q++);
     236  
     237    /* { dg-final { scan-assembler {\mbl __cacosieee128} } }  */
     238    *p++ = BUILTIN1 (cacosl, *q++);
     239  
     240    /* { dg-final { scan-assembler {\mbl __casinhieee128} } }  */
     241    *p++ = BUILTIN1 (casinhl, *q++);
     242  
     243    /* { dg-final { scan-assembler {\mbl __casinieee128} } }  */
     244    *p++ = BUILTIN1 (casinl, *q++);
     245  
     246    /* { dg-final { scan-assembler {\mbl __catanhieee128} } }  */
     247    *p++ = BUILTIN1 (catanhl, *q++);
     248  
     249    /* { dg-final { scan-assembler {\mbl __catanieee128} } }  */
     250    *p++ = BUILTIN1 (catanl, *q++);
     251  
     252    /* { dg-final { scan-assembler {\mbl __ccoshieee128} } }  */
     253    *p++ = BUILTIN1 (ccoshl, *q++);
     254  
     255    /* { dg-final { scan-assembler {\mbl __ccosieee128} } }  */
     256    *p++ = BUILTIN1 (ccosl, *q++);
     257  
     258    /* { dg-final { scan-assembler {\mbl __cexpieee128} } }  */
     259    *p++ = BUILTIN1 (cexpl, *q++);
     260  
     261    /* { dg-final { scan-assembler {\mbl __clogieee128} } }  */
     262    *p++ = BUILTIN1 (clogl, *q++);
     263  
     264    /* { dg-final { scan-assembler {\mbl __clog10ieee128} } }  */
     265    *p++ = BUILTIN1 (clog10l, *q++);
     266  
     267    /* { dg-final { scan-assembler {\mbl __cprojieee128} } }  */
     268    *p++ = BUILTIN1 (cprojl, *q++);
     269  
     270    /* { dg-final { scan-assembler {\mbl __csinhieee128} } }  */
     271    *p++ = BUILTIN1 (csinhl, *q++);
     272  
     273    /* { dg-final { scan-assembler {\mbl __csinieee128} } }  */
     274    *p++ = BUILTIN1 (csinl, *q++);
     275  
     276    /* { dg-final { scan-assembler {\mbl __csqrtieee128} } }  */
     277    *p++ = BUILTIN1 (csqrtl, *q++);
     278  
     279    /* { dg-final { scan-assembler {\mbl __ctanhieee128} } }  */
     280    *p++ = BUILTIN1 (ctanhl, *q++);
     281  
     282    /* { dg-final { scan-assembler {\mbl __ctanieee128} } }  */
     283    *p   = BUILTIN1 (ctanl, *q);
     284  }
     285  
     286  /* Built-in functions that returns a _Complex long double and takes one
     287     long double argument.  */
     288  
     289  void
     290  return_cld_arg_ld (_Complex long double *p,
     291  		   long double *q)
     292  {
     293    /* { dg-final { scan-assembler {\mbl __sincosieee128} } }  */
     294    *p = BUILTIN1 (cexpil, *q);
     295  }
     296  
     297  /* Built-in function that returns a _Complex long double and takes two
     298     _Complex long double arguments.  */
     299  
     300  void
     301  return_cld_arg_cld_cld (_Complex long double *p,
     302  			_Complex long double *q,
     303  			_Complex long double *r)
     304  {
     305    /* { dg-final { scan-assembler {\mbl __cpowieee128} } }  */
     306    *p = BUILTIN2 (cpowl, *q, *r);
     307  }
     308  
     309  /* Built-in functions that returns a long double and takes a long double and a
     310     pointer to an int arguments.  */
     311  
     312  void
     313  return_ld_arg_ld_pi (long double *p,
     314  		     long double *q,
     315  		     int **r)
     316  {
     317    /* { dg-final { scan-assembler {\mbl __frexpieee128} } }  */
     318    *p++ = BUILTIN2 (frexpl, *q++, *r++);
     319  
     320    /* { dg-final { scan-assembler {\mbl __lgammaieee128_r} } }  */
     321    *p++ = BUILTIN2 (gammal_r, *q++, *r++);
     322  }
     323  
     324  /* Built-in functions that returns a long double and takes a long double and an
     325     int arguments.  */
     326  
     327  void
     328  return_ld_arg_ld_i (long double *p,
     329  		    long double *q,
     330  		    int *r)
     331  {
     332    /* { dg-final { scan-assembler {\mbl __ldexpieee128} } }  */
     333    *p++ = BUILTIN2 (ldexpl, *q++, *r++);
     334  
     335    /* { dg-final { scan-assembler {\mbl __powikf2} } }  */
     336    *p++ = BUILTIN2 (powil, *q++, *r++);
     337  
     338    /* { dg-final { scan-assembler {\mbl __scalbnieee128} } }  */
     339    *p   = BUILTIN2 (scalbnl, *q, *r);
     340  }
     341  
     342  /* Built-in function that returns a long double and takes a long double and a
     343     long arguments.  */
     344  
     345  void
     346  return_ld_arg_ld_l (long double *p,
     347  		    long double *q,
     348  		    long *r)
     349  {
     350    /* { dg-final { scan-assembler {\mbl __scalblnieee128} } }  */
     351    *p = BUILTIN2 (scalblnl, *q, *r);
     352  }
     353  
     354  /* Built-in functions that returns a long double and takes a long double and a
     355     long long arguments.  */
     356  
     357  void
     358  return_ld_arg_i_ld (long double *p,
     359  		    int *q,
     360  		    long double *r)
     361  {
     362    /* { dg-final { scan-assembler {\mbl __jnieee128} } }  */
     363    *p++ = BUILTIN2 (jnl, *q++, *r++);
     364  
     365    /* { dg-final { scan-assembler {\mbl __ynieee128} } }  */
     366    *p   = BUILTIN2 (ynl, *q, *r);
     367  }
     368  
     369  /* Built-in functions that returns a long double and takes a long double and a
     370     pointer to a long double arguments.  */
     371  
     372  void
     373  return_ld_arg_ld_pld (long double *p,
     374  		      long double *q,
     375  		      long double **r)
     376  {
     377    /* { dg-final { scan-assembler {\mbl __modfieee128} } }  */
     378    *p = BUILTIN2 (modfl, *q, *r);
     379  }
     380  
     381  /* Built-in function that returns a long double and takes two long double and a
     382     pointer to an int arguments.  */
     383  
     384  void
     385  return_ld_arg_ld_ld_pi (long double *p,
     386  			long double *q,
     387  			long double *r,
     388  			int **s)
     389  {
     390    /* { dg-final { scan-assembler {\mbl __remquoieee128} } }  */
     391    *p = BUILTIN3 (remquol, *q, *r, *s);
     392  }
     393  
     394  /* Built-in functions that return san int and takes one long double argument.  */
     395  
     396  void
     397  return_i_arg_ld (int *p,
     398  		 long double *q)
     399  {
     400    /* { dg-final { scan-assembler {\mbl __ceilieee128} } }  */
     401    *p++ = BUILTIN1 (iceill, *q++);
     402  
     403    /* { dg-final { scan-assembler {\mbl __floorieee128} } }  */
     404    *p++ = BUILTIN1 (ifloorl, *q++);
     405  
     406    /* { dg-final { scan-assembler {\mbl __ilogbieee128} } }  */
     407    *p++ = BUILTIN1 (ilogbl, *q++);
     408  
     409    /* { dg-final { scan-assembler {\mbl __lrintieee128} } }  */
     410    *p++ = BUILTIN1 (irintl, *q++);
     411  
     412    /* { dg-final { scan-assembler {\mbl __lroundieee128} } }  */
     413    *p++ = BUILTIN1 (iroundl, *q++);
     414  
     415    /* inline code.  */
     416    /* { dg-final { scan-assembler {\mxscvqpswz} } }  */
     417    *p++ = BUILTIN1 (signbitl, *q++);
     418  }
     419  
     420  /* Built-in function that returns a double and takes one double and one long
     421     double arguments.  */
     422  
     423  void
     424  return_d_arg_d_ld (double *p,
     425  		   double *q,
     426  		   long double *r)
     427  {
     428    /* { dg-final { scan-assembler {\mbl __nexttoward_to_ieee128} } }  */
     429    *p = BUILTIN2 (nexttoward, *q, *r);
     430  }
     431  
     432  /* Built-in function that returns a float and takes one float and one long
     433     double arguments.  */
     434  
     435  void
     436  return_f_arg_f_ld (float *p,
     437  		   float *q,
     438  		   long double *r)
     439  {
     440    /* { dg-final { scan-assembler {\mbl __nexttowardf_to_ieee128} } }  */
     441    *p = BUILTIN2 (nexttowardf, *q, *r);
     442  }