/* Copyright (C) 2002 Free Software Foundation.
|
/* Copyright (C) 2002 Free Software Foundation.
|
|
|
Test that (A & C1) op C2 optimizations behave correctly where C1 is
|
Test that (A & C1) op C2 optimizations behave correctly where C1 is
|
a constant power of 2, op is == or !=, and C2 is C1 or zero.
|
a constant power of 2, op is == or !=, and C2 is C1 or zero.
|
|
|
Written by Roger Sayle, 5th May 2002. */
|
Written by Roger Sayle, 5th May 2002. */
|
|
|
#include <limits.h>
|
#include <limits.h>
|
|
|
extern void abort (void);
|
extern void abort (void);
|
|
|
void test1 (signed char c, int set);
|
void test1 (signed char c, int set);
|
void test2 (unsigned char c, int set);
|
void test2 (unsigned char c, int set);
|
void test3 (short s, int set);
|
void test3 (short s, int set);
|
void test4 (unsigned short s, int set);
|
void test4 (unsigned short s, int set);
|
void test5 (int i, int set);
|
void test5 (int i, int set);
|
void test6 (unsigned int i, int set);
|
void test6 (unsigned int i, int set);
|
void test7 (long long l, int set);
|
void test7 (long long l, int set);
|
void test8 (unsigned long long l, int set);
|
void test8 (unsigned long long l, int set);
|
|
|
#ifndef LONG_LONG_MAX
|
#ifndef LONG_LONG_MAX
|
#define LONG_LONG_MAX __LONG_LONG_MAX__
|
#define LONG_LONG_MAX __LONG_LONG_MAX__
|
#endif
|
#endif
|
#ifndef LONG_LONG_MIN
|
#ifndef LONG_LONG_MIN
|
#define LONG_LONG_MIN (-LONG_LONG_MAX-1)
|
#define LONG_LONG_MIN (-LONG_LONG_MAX-1)
|
#endif
|
#endif
|
#ifndef ULONG_LONG_MAX
|
#ifndef ULONG_LONG_MAX
|
#define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1)
|
#define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1)
|
#endif
|
#endif
|
|
|
|
|
void
|
void
|
test1 (signed char c, int set)
|
test1 (signed char c, int set)
|
{
|
{
|
if ((c & (SCHAR_MAX+1)) == 0)
|
if ((c & (SCHAR_MAX+1)) == 0)
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
|
|
if ((c & (SCHAR_MAX+1)) != 0)
|
if ((c & (SCHAR_MAX+1)) != 0)
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((c & (SCHAR_MAX+1)) == (SCHAR_MAX+1))
|
if ((c & (SCHAR_MAX+1)) == (SCHAR_MAX+1))
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((c & (SCHAR_MAX+1)) != (SCHAR_MAX+1))
|
if ((c & (SCHAR_MAX+1)) != (SCHAR_MAX+1))
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
|
|
void
|
void
|
test2 (unsigned char c, int set)
|
test2 (unsigned char c, int set)
|
{
|
{
|
if ((c & (SCHAR_MAX+1)) == 0)
|
if ((c & (SCHAR_MAX+1)) == 0)
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
|
|
if ((c & (SCHAR_MAX+1)) != 0)
|
if ((c & (SCHAR_MAX+1)) != 0)
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((c & (SCHAR_MAX+1)) == (SCHAR_MAX+1))
|
if ((c & (SCHAR_MAX+1)) == (SCHAR_MAX+1))
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((c & (SCHAR_MAX+1)) != (SCHAR_MAX+1))
|
if ((c & (SCHAR_MAX+1)) != (SCHAR_MAX+1))
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
|
|
void
|
void
|
test3 (short s, int set)
|
test3 (short s, int set)
|
{
|
{
|
if ((s & (SHRT_MAX+1)) == 0)
|
if ((s & (SHRT_MAX+1)) == 0)
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
|
|
if ((s & (SHRT_MAX+1)) != 0)
|
if ((s & (SHRT_MAX+1)) != 0)
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((s & (SHRT_MAX+1)) == (SHRT_MAX+1))
|
if ((s & (SHRT_MAX+1)) == (SHRT_MAX+1))
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((s & (SHRT_MAX+1)) != (SHRT_MAX+1))
|
if ((s & (SHRT_MAX+1)) != (SHRT_MAX+1))
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
|
|
void
|
void
|
test4 (unsigned short s, int set)
|
test4 (unsigned short s, int set)
|
{
|
{
|
if ((s & (SHRT_MAX+1)) == 0)
|
if ((s & (SHRT_MAX+1)) == 0)
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
|
|
if ((s & (SHRT_MAX+1)) != 0)
|
if ((s & (SHRT_MAX+1)) != 0)
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((s & (SHRT_MAX+1)) == (SHRT_MAX+1))
|
if ((s & (SHRT_MAX+1)) == (SHRT_MAX+1))
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((s & (SHRT_MAX+1)) != (SHRT_MAX+1))
|
if ((s & (SHRT_MAX+1)) != (SHRT_MAX+1))
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
|
|
void
|
void
|
test5 (int i, int set)
|
test5 (int i, int set)
|
{
|
{
|
if ((i & (INT_MAX+1U)) == 0)
|
if ((i & (INT_MAX+1U)) == 0)
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
|
|
if ((i & (INT_MAX+1U)) != 0)
|
if ((i & (INT_MAX+1U)) != 0)
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((i & (INT_MAX+1U)) == (INT_MAX+1U))
|
if ((i & (INT_MAX+1U)) == (INT_MAX+1U))
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((i & (INT_MAX+1U)) != (INT_MAX+1U))
|
if ((i & (INT_MAX+1U)) != (INT_MAX+1U))
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
|
|
void
|
void
|
test6 (unsigned int i, int set)
|
test6 (unsigned int i, int set)
|
{
|
{
|
if ((i & (INT_MAX+1U)) == 0)
|
if ((i & (INT_MAX+1U)) == 0)
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
|
|
if ((i & (INT_MAX+1U)) != 0)
|
if ((i & (INT_MAX+1U)) != 0)
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((i & (INT_MAX+1U)) == (INT_MAX+1U))
|
if ((i & (INT_MAX+1U)) == (INT_MAX+1U))
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((i & (INT_MAX+1U)) != (INT_MAX+1U))
|
if ((i & (INT_MAX+1U)) != (INT_MAX+1U))
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
|
|
void
|
void
|
test7 (long long l, int set)
|
test7 (long long l, int set)
|
{
|
{
|
if ((l & (LONG_LONG_MAX+1ULL)) == 0)
|
if ((l & (LONG_LONG_MAX+1ULL)) == 0)
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
|
|
if ((l & (LONG_LONG_MAX+1ULL)) != 0)
|
if ((l & (LONG_LONG_MAX+1ULL)) != 0)
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((l & (LONG_LONG_MAX+1ULL)) == (LONG_LONG_MAX+1ULL))
|
if ((l & (LONG_LONG_MAX+1ULL)) == (LONG_LONG_MAX+1ULL))
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((l & (LONG_LONG_MAX+1ULL)) != (LONG_LONG_MAX+1ULL))
|
if ((l & (LONG_LONG_MAX+1ULL)) != (LONG_LONG_MAX+1ULL))
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
|
|
void
|
void
|
test8 (unsigned long long l, int set)
|
test8 (unsigned long long l, int set)
|
{
|
{
|
if ((l & (LONG_LONG_MAX+1ULL)) == 0)
|
if ((l & (LONG_LONG_MAX+1ULL)) == 0)
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
|
|
if ((l & (LONG_LONG_MAX+1ULL)) != 0)
|
if ((l & (LONG_LONG_MAX+1ULL)) != 0)
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((l & (LONG_LONG_MAX+1ULL)) == (LONG_LONG_MAX+1ULL))
|
if ((l & (LONG_LONG_MAX+1ULL)) == (LONG_LONG_MAX+1ULL))
|
{
|
{
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
else
|
else
|
if (set) abort ();
|
if (set) abort ();
|
|
|
if ((l & (LONG_LONG_MAX+1ULL)) != (LONG_LONG_MAX+1ULL))
|
if ((l & (LONG_LONG_MAX+1ULL)) != (LONG_LONG_MAX+1ULL))
|
{
|
{
|
if (set) abort ();
|
if (set) abort ();
|
}
|
}
|
else
|
else
|
if (!set) abort ();
|
if (!set) abort ();
|
}
|
}
|
|
|
int
|
int
|
main ()
|
main ()
|
{
|
{
|
test1 (0, 0);
|
test1 (0, 0);
|
test1 (SCHAR_MAX, 0);
|
test1 (SCHAR_MAX, 0);
|
test1 (SCHAR_MIN, 1);
|
test1 (SCHAR_MIN, 1);
|
test1 (UCHAR_MAX, 1);
|
test1 (UCHAR_MAX, 1);
|
|
|
test2 (0, 0);
|
test2 (0, 0);
|
test2 (SCHAR_MAX, 0);
|
test2 (SCHAR_MAX, 0);
|
test2 (SCHAR_MIN, 1);
|
test2 (SCHAR_MIN, 1);
|
test2 (UCHAR_MAX, 1);
|
test2 (UCHAR_MAX, 1);
|
|
|
test3 (0, 0);
|
test3 (0, 0);
|
test3 (SHRT_MAX, 0);
|
test3 (SHRT_MAX, 0);
|
test3 (SHRT_MIN, 1);
|
test3 (SHRT_MIN, 1);
|
test3 (USHRT_MAX, 1);
|
test3 (USHRT_MAX, 1);
|
|
|
test4 (0, 0);
|
test4 (0, 0);
|
test4 (SHRT_MAX, 0);
|
test4 (SHRT_MAX, 0);
|
test4 (SHRT_MIN, 1);
|
test4 (SHRT_MIN, 1);
|
test4 (USHRT_MAX, 1);
|
test4 (USHRT_MAX, 1);
|
|
|
test5 (0, 0);
|
test5 (0, 0);
|
test5 (INT_MAX, 0);
|
test5 (INT_MAX, 0);
|
test5 (INT_MIN, 1);
|
test5 (INT_MIN, 1);
|
test5 (UINT_MAX, 1);
|
test5 (UINT_MAX, 1);
|
|
|
test6 (0, 0);
|
test6 (0, 0);
|
test6 (INT_MAX, 0);
|
test6 (INT_MAX, 0);
|
test6 (INT_MIN, 1);
|
test6 (INT_MIN, 1);
|
test6 (UINT_MAX, 1);
|
test6 (UINT_MAX, 1);
|
|
|
test7 (0, 0);
|
test7 (0, 0);
|
test7 (LONG_LONG_MAX, 0);
|
test7 (LONG_LONG_MAX, 0);
|
test7 (LONG_LONG_MIN, 1);
|
test7 (LONG_LONG_MIN, 1);
|
test7 (ULONG_LONG_MAX, 1);
|
test7 (ULONG_LONG_MAX, 1);
|
|
|
test8 (0, 0);
|
test8 (0, 0);
|
test8 (LONG_LONG_MAX, 0);
|
test8 (LONG_LONG_MAX, 0);
|
test8 (LONG_LONG_MIN, 1);
|
test8 (LONG_LONG_MIN, 1);
|
test8 (ULONG_LONG_MAX, 1);
|
test8 (ULONG_LONG_MAX, 1);
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|
|
|