(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
dfp/
pr39902.c
       1  /* Check that optimizations like (x * 1) to x, or (x * -1) to -x,
       2     do not apply to decimal float computations where trailing zeroes
       3     are significant.  */
       4  
       5  #include "dfp-dbg.h"
       6  
       7  #define COMPARE32(A,B) \
       8    A.i == B.i
       9  
      10  #define COMPARE64(A,B) \
      11    A.i[0] == B.i[0] && A.i[1] == B.i[1]
      12  
      13  #define COMPARE128(A,B) \
      14    A.i[0] == B.i[0] && A.i[1] == B.i[1] && A.i[2] == B.i[2] && A.i[3] == B.i[3]
      15  
      16  typedef union {
      17    _Decimal32 d;
      18    unsigned int i;
      19  } u32;
      20  
      21  typedef union {
      22    _Decimal64 d;
      23    unsigned int i[2];
      24  } u64;
      25  
      26  typedef union {
      27    _Decimal128 d;
      28    unsigned int i[4];
      29  } u128;
      30  
      31  volatile u32 p32_1;
      32  volatile u32 p32_1_0;
      33  volatile u32 p32_2_0;
      34  volatile u32 m32_1;
      35  volatile u32 m32_1_0;
      36  volatile u32 m32_2_0;
      37  volatile u32 a32;
      38  
      39  volatile u64 p64_1;
      40  volatile u64 p64_1_0;
      41  volatile u64 p64_2_0;
      42  volatile u64 m64_1;
      43  volatile u64 m64_1_0;
      44  volatile u64 m64_2_0;
      45  volatile u64 a64;
      46  
      47  volatile u128 p128_1;
      48  volatile u128 p128_1_0;
      49  volatile u128 p128_2_0;
      50  volatile u128 m128_1;
      51  volatile u128 m128_1_0;
      52  volatile u128 m128_2_0;
      53  volatile u128 a128;
      54  
      55  void
      56  init32 (void)
      57  {
      58    p32_1.d = 1.DF;
      59    p32_1_0.d = 1.0DF;
      60    p32_2_0.d = 2.0DF;
      61    m32_1.d = -1.DF;
      62    m32_1_0.d = -1.0DF;
      63    m32_2_0.d = -2.0DF;
      64  }
      65  
      66  void
      67  init64 (void)
      68  {
      69    p64_1.d = 1.DD;
      70    p64_1_0.d = 1.0DD;
      71    p64_2_0.d = 2.0DD;
      72    m64_1.d = -1.DD;
      73    m64_1_0.d = -1.0DD;
      74    m64_2_0.d = -2.0DD;
      75  }
      76  
      77  void
      78  init128 (void)
      79  {
      80    p128_1.d = 1.DL;
      81    p128_1_0.d = 1.0DL;
      82    p128_2_0.d = 2.0DL;
      83    m128_1.d = -1.DL;
      84    m128_1_0.d = -1.0DL;
      85    m128_2_0.d = -2.0DL;
      86  }
      87  
      88  void
      89  doit32 (void)
      90  {
      91    /* Multiplying by a value with no trailing zero should not change the
      92       quantum exponent.  */
      93  
      94    a32.d = p32_2_0.d * p32_1.d;
      95    if (! (COMPARE32 (a32, p32_2_0)))
      96      FAILURE
      97  
      98    a32.d = p32_2_0.d * 1.DF;
      99    if (! (COMPARE32 (a32, p32_2_0)))
     100      FAILURE
     101  
     102    a32.d = p32_2_0.d * m32_1.d;
     103    if (! (COMPARE32 (a32, m32_2_0)))
     104      FAILURE
     105  
     106    a32.d = p32_2_0.d * -1.DF;
     107    if (! (COMPARE32 (a32, m32_2_0)))
     108      FAILURE
     109  
     110    /* Multiplying by a value with a trailing zero should change the
     111       quantum exponent.  */
     112  
     113    a32.d = p32_2_0.d * p32_1_0.d;
     114    if (COMPARE32 (a32, p32_2_0))
     115      FAILURE
     116  
     117    a32.d = p32_2_0.d * 1.0DF;
     118    if (COMPARE32 (a32, p32_2_0))
     119      FAILURE
     120  
     121    a32.d = p32_2_0.d * m32_1_0.d;
     122    if (COMPARE32 (a32, m32_2_0))
     123      FAILURE
     124  
     125    a32.d = p32_2_0.d * -1.0DF;
     126    if (COMPARE32 (a32, m32_2_0))
     127      FAILURE
     128  }
     129  
     130  void
     131  doit64 (void)
     132  {
     133    /* Multiplying by a value with no trailing zero should not change the
     134       quantum exponent.  */
     135  
     136    a64.d = p64_2_0.d * p64_1.d;
     137    if (! (COMPARE64 (a64, p64_2_0)))
     138      FAILURE
     139  
     140    a64.d = p64_2_0.d * 1.DD;
     141    if (! (COMPARE64 (a64, p64_2_0)))
     142      FAILURE
     143  
     144    a64.d = p64_2_0.d * m64_1.d;
     145    if (! (COMPARE64 (a64, m64_2_0)))
     146      FAILURE
     147  
     148    a64.d = p64_2_0.d * -1.DD;
     149    if (! (COMPARE64 (a64, m64_2_0)))
     150      FAILURE
     151  
     152    /* Multiplying by a value with a trailing zero should change the
     153       quantum exponent.  */
     154  
     155    a64.d = p64_2_0.d * p64_1_0.d;
     156    if (COMPARE64 (a64, p64_2_0))
     157      FAILURE
     158  
     159    a64.d = p64_2_0.d * 1.0DD;
     160    if (COMPARE64 (a64, p64_2_0))
     161      FAILURE
     162  
     163    a64.d = p64_2_0.d * m64_1_0.d;
     164    if (COMPARE64 (a64, m64_2_0))
     165      FAILURE
     166  
     167    a64.d = p64_2_0.d * -1.0DD;
     168    if (COMPARE64 (a64, m64_2_0))
     169      FAILURE
     170  }
     171  
     172  void
     173  doit128 (void)
     174  {
     175    /* Multiplying by a value with no trailing zero should not change the
     176       quantum exponent.  */
     177  
     178    a128.d = p128_2_0.d * p128_1_0.d;
     179    if (COMPARE128 (a128, p128_2_0))
     180      FAILURE
     181  
     182    a128.d = p128_2_0.d * 1.0DL;
     183    if (COMPARE128 (a128, p128_2_0))
     184      FAILURE
     185  
     186    a128.d = p128_2_0.d * m128_1_0.d;
     187    if (COMPARE128 (a128, m128_2_0))
     188      FAILURE
     189  
     190    a128.d = p128_2_0.d * -1.0DL;
     191    if (COMPARE128 (a128, m128_2_0))
     192      FAILURE
     193  
     194    /* Multiplying by a value with a trailing zero should change the
     195       quantum exponent.  */
     196  
     197    a128.d = p128_2_0.d * p128_1.d;
     198    if (! (COMPARE128 (a128, p128_2_0)))
     199      FAILURE
     200  
     201    a128.d = p128_2_0.d * 1.DL;
     202    if (! (COMPARE128 (a128, p128_2_0)))
     203      FAILURE
     204  
     205    a128.d = p128_2_0.d * m128_1.d;
     206    if (! (COMPARE128 (a128, m128_2_0)))
     207      FAILURE
     208  
     209    a128.d = p128_2_0.d * -1.DL;
     210    if (! (COMPARE128 (a128, m128_2_0)))
     211      FAILURE
     212  }
     213  
     214  int
     215  main (void)
     216  {
     217    init32 ();
     218    init64 ();
     219    init128 ();
     220  
     221    doit32 ();
     222    doit64 ();
     223    doit128 ();
     224  
     225    FINISH
     226  }