OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [gcc.c-torture/] [execute/] [builtin-bitops-1.c] - Blame information for rev 711

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 688 jeremybenn
#include <limits.h>
2
#include <assert.h>
3
 
4
#if __INT_MAX__ > 2147483647L
5
# if __INT_MAX__ >= 9223372036854775807L
6
#  define BITSIZEOF_INT 64
7
# else
8
#  define BITSIZEOF_INT 32
9
# endif
10
#else
11
# if __INT_MAX__ >= 2147483647L
12
#  define BITSIZEOF_INT 32
13
# else
14
#  define BITSIZEOF_INT 16
15
# endif
16
#endif
17
 
18
#if __LONG_MAX__ > 2147483647L
19
# if __LONG_MAX__ >= 9223372036854775807L
20
#  define BITSIZEOF_LONG 64
21
# else
22
#  define BITSIZEOF_LONG 32
23
# endif
24
#else
25
# define BITSIZEOF_LONG 32
26
#endif
27
 
28
#if __LONG_LONG_MAX__ > 2147483647L
29
# if __LONG_LONG_MAX__ >= 9223372036854775807L
30
#  define BITSIZEOF_LONG_LONG 64
31
# else
32
#  define BITSIZEOF_LONG_LONG 32
33
# endif
34
#else
35
# define BITSIZEOF_LONG_LONG 32
36
#endif
37
 
38
#define MAKE_FUNS(suffix, type)                                         \
39
int my_ffs##suffix(type x) {                                            \
40
    int i;                                                              \
41
    if (x == 0)                                                          \
42
         return 0;                                                       \
43
    for (i = 0; i < CHAR_BIT * sizeof (type); i++)                       \
44
        if (x & ((type) 1  << i))                                       \
45
            break;                                                      \
46
    return i + 1;                                                       \
47
}                                                                       \
48
                                                                        \
49
int my_ctz##suffix(type x) {                                            \
50
    int i;                                                              \
51
    for (i = 0; i < CHAR_BIT * sizeof (type); i++)                       \
52
        if (x & ((type) 1  << i))                                       \
53
            break;                                                      \
54
    return i;                                                           \
55
}                                                                       \
56
                                                                        \
57
int my_clz##suffix(type x) {                                            \
58
    int i;                                                              \
59
    for (i = 0; i < CHAR_BIT * sizeof (type); i++)                       \
60
        if (x & ((type) 1 << ((CHAR_BIT * sizeof (type)) - i - 1)))     \
61
            break;                                                      \
62
    return i;                                                           \
63
}                                                                       \
64
                                                                        \
65
int my_clrsb##suffix(type x) {                                          \
66
    int i;                                                              \
67
    int leading = (x >> CHAR_BIT * sizeof (type) - 1) & 1;              \
68
    for (i = 1; i < CHAR_BIT * sizeof (type); i++)                      \
69
        if (((x >> ((CHAR_BIT * sizeof (type)) - i - 1)) & 1)           \
70
            != leading)                                                 \
71
            break;                                                      \
72
    return i - 1;                                                       \
73
}                                                                       \
74
                                                                        \
75
int my_popcount##suffix(type x) {                                       \
76
    int i;                                                              \
77
    int count = 0;                                                       \
78
    for (i = 0; i < CHAR_BIT * sizeof (type); i++)                       \
79
        if (x & ((type) 1 << i))                                        \
80
            count++;                                                    \
81
    return count;                                                       \
82
}                                                                       \
83
                                                                        \
84
int my_parity##suffix(type x) {                                         \
85
    int i;                                                              \
86
    int count = 0;                                                       \
87
    for (i = 0; i < CHAR_BIT * sizeof (type); i++)                       \
88
        if (x & ((type) 1 << i))                                        \
89
            count++;                                                    \
90
    return count & 1;                                                   \
91
}
92
 
93
MAKE_FUNS (, unsigned);
94
MAKE_FUNS (l, unsigned long);
95
MAKE_FUNS (ll, unsigned long long);
96
 
97
extern void abort (void);
98
extern void exit (int);
99
 
100
#define NUMS16                                  \
101
  {                                             \
102
    0x0000U,                                    \
103
    0x0001U,                                    \
104
    0x8000U,                                    \
105
    0x0002U,                                    \
106
    0x4000U,                                    \
107
    0x0100U,                                    \
108
    0x0080U,                                    \
109
    0xa5a5U,                                    \
110
    0x5a5aU,                                    \
111
    0xcafeU,                                    \
112
    0xffffU                                     \
113
  }
114
 
115
#define NUMS32                                  \
116
  {                                             \
117
    0x00000000UL,                               \
118
    0x00000001UL,                               \
119
    0x80000000UL,                               \
120
    0x00000002UL,                               \
121
    0x40000000UL,                               \
122
    0x00010000UL,                               \
123
    0x00008000UL,                               \
124
    0xa5a5a5a5UL,                               \
125
    0x5a5a5a5aUL,                               \
126
    0xcafe0000UL,                               \
127
    0x00cafe00UL,                               \
128
    0x0000cafeUL,                               \
129
    0xffffffffUL                                \
130
  }
131
 
132
#define NUMS64                                  \
133
  {                                             \
134
    0x0000000000000000ULL,                      \
135
    0x0000000000000001ULL,                      \
136
    0x8000000000000000ULL,                      \
137
    0x0000000000000002ULL,                      \
138
    0x4000000000000000ULL,                      \
139
    0x0000000100000000ULL,                      \
140
    0x0000000080000000ULL,                      \
141
    0xa5a5a5a5a5a5a5a5ULL,                      \
142
    0x5a5a5a5a5a5a5a5aULL,                      \
143
    0xcafecafe00000000ULL,                      \
144
    0x0000cafecafe0000ULL,                      \
145
    0x00000000cafecafeULL,                      \
146
    0xffffffffffffffffULL                       \
147
  }
148
 
149
unsigned int ints[] =
150
#if BITSIZEOF_INT == 64
151
NUMS64;
152
#elif BITSIZEOF_INT == 32
153
NUMS32;
154
#else
155
NUMS16;
156
#endif
157
 
158
unsigned long longs[] =
159
#if BITSIZEOF_LONG == 64
160
NUMS64;
161
#else
162
NUMS32;
163
#endif
164
 
165
unsigned long long longlongs[] =
166
#if BITSIZEOF_LONG_LONG == 64
167
NUMS64;
168
#else
169
NUMS32;
170
#endif
171
 
172
#define N(table) (sizeof (table) / sizeof (table[0]))
173
 
174
int
175
main (void)
176
{
177
  int i;
178
 
179
  for (i = 0; i < N(ints); i++)
180
    {
181
      if (__builtin_ffs (ints[i]) != my_ffs (ints[i]))
182
        abort ();
183
      if (ints[i] != 0
184
          && __builtin_clz (ints[i]) != my_clz (ints[i]))
185
        abort ();
186
      if (ints[i] != 0
187
          && __builtin_ctz (ints[i]) != my_ctz (ints[i]))
188
        abort ();
189
      if (__builtin_clrsb (ints[i]) != my_clrsb (ints[i]))
190
        abort ();
191
      if (__builtin_popcount (ints[i]) != my_popcount (ints[i]))
192
        abort ();
193
      if (__builtin_parity (ints[i]) != my_parity (ints[i]))
194
        abort ();
195
    }
196
 
197
  for (i = 0; i < N(longs); i++)
198
    {
199
      if (__builtin_ffsl (longs[i]) != my_ffsl (longs[i]))
200
        abort ();
201
      if (longs[i] != 0
202
          && __builtin_clzl (longs[i]) != my_clzl (longs[i]))
203
        abort ();
204
      if (longs[i] != 0
205
          && __builtin_ctzl (longs[i]) != my_ctzl (longs[i]))
206
        abort ();
207
      if (__builtin_clrsbl (longs[i]) != my_clrsbl (longs[i]))
208
        abort ();
209
      if (__builtin_popcountl (longs[i]) != my_popcountl (longs[i]))
210
        abort ();
211
      if (__builtin_parityl (longs[i]) != my_parityl (longs[i]))
212
        abort ();
213
    }
214
 
215
  for (i = 0; i < N(longlongs); i++)
216
    {
217
      if (__builtin_ffsll (longlongs[i]) != my_ffsll (longlongs[i]))
218
        abort ();
219
      if (longlongs[i] != 0
220
          && __builtin_clzll (longlongs[i]) != my_clzll (longlongs[i]))
221
        abort ();
222
      if (longlongs[i] != 0
223
          && __builtin_ctzll (longlongs[i]) != my_ctzll (longlongs[i]))
224
        abort ();
225
      if (__builtin_clrsbll (longlongs[i]) != my_clrsbll (longlongs[i]))
226
        abort ();
227
      if (__builtin_popcountll (longlongs[i]) != my_popcountll (longlongs[i]))
228
        abort ();
229
      if (__builtin_parityll (longlongs[i]) != my_parityll (longlongs[i]))
230
        abort ();
231
    }
232
 
233
  /* Test constant folding.  */
234
 
235
#define TEST(x, suffix)                                                 \
236
  if (__builtin_ffs##suffix (x) != my_ffs##suffix (x))                  \
237
    abort ();                                                           \
238
  if (x != 0 && __builtin_clz##suffix (x) != my_clz##suffix (x)) \
239
    abort ();                                                           \
240
  if (x != 0 && __builtin_ctz##suffix (x) != my_ctz##suffix (x)) \
241
    abort ();                                                           \
242
  if (__builtin_clrsb##suffix (x) != my_clrsb##suffix (x))              \
243
    abort ();                                                           \
244
  if (__builtin_popcount##suffix (x) != my_popcount##suffix (x))        \
245
    abort ();                                                           \
246
  if (__builtin_parity##suffix (x) != my_parity##suffix (x))            \
247
    abort ();
248
 
249
#if BITSIZEOF_INT == 32
250
  TEST(0x00000000UL,);
251
  TEST(0x00000001UL,);
252
  TEST(0x80000000UL,);
253
  TEST(0x40000000UL,);
254
  TEST(0x00010000UL,);
255
  TEST(0x00008000UL,);
256
  TEST(0xa5a5a5a5UL,);
257
  TEST(0x5a5a5a5aUL,);
258
  TEST(0xcafe0000UL,);
259
  TEST(0x00cafe00UL,);
260
  TEST(0x0000cafeUL,);
261
  TEST(0xffffffffUL,);
262
#endif
263
 
264
#if BITSIZEOF_LONG_LONG == 64
265
  TEST(0x0000000000000000ULL, ll);
266
  TEST(0x0000000000000001ULL, ll);
267
  TEST(0x8000000000000000ULL, ll);
268
  TEST(0x0000000000000002ULL, ll);
269
  TEST(0x4000000000000000ULL, ll);
270
  TEST(0x0000000100000000ULL, ll);
271
  TEST(0x0000000080000000ULL, ll);
272
  TEST(0xa5a5a5a5a5a5a5a5ULL, ll);
273
  TEST(0x5a5a5a5a5a5a5a5aULL, ll);
274
  TEST(0xcafecafe00000000ULL, ll);
275
  TEST(0x0000cafecafe0000ULL, ll);
276
  TEST(0x00000000cafecafeULL, ll);
277
  TEST(0xffffffffffffffffULL, ll);
278
#endif
279
 
280
  exit (0);
281
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.