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