(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
avr/
torture/
int24-mul.c
       1  /* { dg-do run } */
       2  /* { dg-options "-w" } */
       3  
       4  #include <stdlib.h>
       5  
       6  #ifndef __FLASH
       7  #define __flash /* empty */
       8  #endif
       9  
      10  const __flash __int24 vals[] =
      11    {
      12      0, 1, 2, 3, -1, -2, -3, 0xff, 0x100, 0x101,
      13      0xffL * 0xff, 0xfffL * 0xfff, 0x101010L, 0xaaaaaaL
      14    };
      15  
      16  void test_u (void)
      17  {
      18    unsigned int i;
      19    unsigned long la, lb, lc;
      20    __uint24 a, b, c;
      21  
      22    int S = sizeof (vals) / sizeof (*vals);
      23  
      24    for (i = 0; i < 500; i++)
      25      {
      26        if (i < S*S)
      27          {
      28            a = vals[i / S];
      29            b = vals[i % S];
      30          }
      31        else
      32          {
      33            if (i & 1)
      34              a += 0x7654321L;
      35            else
      36              b += 0x5fe453L;
      37          }
      38  
      39        c = a * b;
      40  
      41        la = a;
      42        lb = b;
      43        lc = 0xffffff & (la * lb);
      44        
      45        if (c != lc)
      46          abort();
      47      }
      48  }
      49  
      50  #define TEST_N_U(A1,A2,B)                       \
      51    do {                                          \
      52      if ((0xffffff & (A1*B)) != A2*B)            \
      53        abort();                                  \
      54    } while (0)
      55  
      56  void test_nu (void)
      57  {
      58    unsigned long la;
      59    unsigned int i;
      60    int S = sizeof (vals) / sizeof (*vals);
      61    __uint24 a;
      62    
      63    for (i = 0; i < 500; i++)
      64      {
      65        a = i < S
      66          ? vals[i % S]
      67          : a + 0x7654321;
      68  
      69        la = a;
      70  
      71        TEST_N_U (la, a, 2);
      72        TEST_N_U (la, a, 3);
      73        TEST_N_U (la, a, 4);
      74        TEST_N_U (la, a, 5);
      75        TEST_N_U (la, a, 15);
      76        TEST_N_U (la, a, 16);
      77        TEST_N_U (la, a, 128);
      78        TEST_N_U (la, a, 0x1000);
      79      }
      80  }
      81       
      82  int main (void)
      83  {
      84    test_u();
      85    test_nu();
      86    
      87    exit(0);
      88      
      89    return 0;
      90  }