1  /* { dg-require-effective-target ppc_float128_hw } */
       2  /* { dg-require-effective-target power10_ok } */
       3  /* { dg-options "-mdejagnu-cpu=power10 -O2" } */
       4  
       5  /* Test whether the LXVKQ instruction is generated to load special IEEE 128-bit
       6     constants.  */
       7  
       8  _Float128
       9  return_0 (void)
      10  {
      11    return 0.0f128;			/* XXSPLTIB 34,0.  */
      12  }
      13  
      14  _Float128
      15  return_1 (void)
      16  {
      17    return 1.0f128;			/* LXVKQ 34,1.  */
      18  }
      19  
      20  _Float128
      21  return_2 (void)
      22  {
      23    return 2.0f128;			/* LXVKQ 34,2.  */
      24  }
      25  
      26  _Float128
      27  return_3 (void)
      28  {
      29    return 3.0f128;			/* LXVKQ 34,3.  */
      30  }
      31  
      32  _Float128
      33  return_4 (void)
      34  {
      35    return 4.0f128;			/* LXVKQ 34,4.  */
      36  }
      37  
      38  _Float128
      39  return_5 (void)
      40  {
      41    return 5.0f128;			/* LXVKQ 34,5.  */
      42  }
      43  
      44  _Float128
      45  return_6 (void)
      46  {
      47    return 6.0f128;			/* LXVKQ 34,6.  */
      48  }
      49  
      50  _Float128
      51  return_7 (void)
      52  {
      53    return 7.0f128;			/* LXVKQ 34,7.  */
      54  }
      55  
      56  _Float128
      57  return_m0 (void)
      58  {
      59    return -0.0f128;			/* LXVKQ 34,16.  */
      60  }
      61  
      62  _Float128
      63  return_m1 (void)
      64  {
      65    return -1.0f128;			/* LXVKQ 34,17.  */
      66  }
      67  
      68  _Float128
      69  return_m2 (void)
      70  {
      71    return -2.0f128;			/* LXVKQ 34,18.  */
      72  }
      73  
      74  _Float128
      75  return_m3 (void)
      76  {
      77    return -3.0f128;			/* LXVKQ 34,19.  */
      78  }
      79  
      80  _Float128
      81  return_m4 (void)
      82  {
      83    return -4.0f128;			/* LXVKQ 34,20.  */
      84  }
      85  
      86  _Float128
      87  return_m5 (void)
      88  {
      89    return -5.0f128;			/* LXVKQ 34,21.  */
      90  }
      91  
      92  _Float128
      93  return_m6 (void)
      94  {
      95    return -6.0f128;			/* LXVKQ 34,22.  */
      96  }
      97  
      98  _Float128
      99  return_m7 (void)
     100  {
     101    return -7.0f128;			/* LXVKQ 34,23.  */
     102  }
     103  
     104  _Float128
     105  return_inf (void)
     106  {
     107    return __builtin_inff128 ();		/* LXVKQ 34,8.  */
     108  }
     109  
     110  _Float128
     111  return_minf (void)
     112  {
     113    return - __builtin_inff128 ();	/* LXVKQ 34,24.  */
     114  }
     115  
     116  _Float128
     117  return_nan (void)
     118  {
     119    return __builtin_nanf128 ("");	/* LXVKQ 34,9.  */
     120  }
     121  
     122  /* Note, the following NaNs should not generate a LXVKQ instruction.  */
     123  _Float128
     124  return_mnan (void)
     125  {
     126    return - __builtin_nanf128 ("");	/* PLXV 34,... */
     127  }
     128  
     129  _Float128
     130  return_nan2 (void)
     131  {
     132    return __builtin_nanf128 ("1");	/* PLXV 34,... */
     133  }
     134  
     135  _Float128
     136  return_nans (void)
     137  {
     138    return __builtin_nansf128 ("");	/* PLXV 34,... */
     139  }
     140  
     141  vector long long
     142  return_longlong_neg_0 (void)
     143  {
     144    /* This vector is the same pattern as -0.0F128.  */
     145  #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
     146  #define FIRST	0x8000000000000000
     147  #define SECOND	0x0000000000000000
     148  
     149  #else
     150  #define FIRST	0x0000000000000000
     151  #define SECOND	0x8000000000000000
     152  #endif
     153  
     154    return (vector long long) { FIRST, SECOND };	/* LXVKQ 34,16.  */
     155  }
     156  
     157  /* { dg-final { scan-assembler-times {\mlxvkq\M}    19 } } */
     158  /* { dg-final { scan-assembler-times {\mplxv\M}      3 } } */
     159  /* { dg-final { scan-assembler-times {\mxxspltib\M}  1 } } */
     160