Rebase.
[official-gcc.git] / gcc / testsuite / gcc.c-torture / execute / bswap-2.c
blob88132fe78592da0303d0a7beeb8feb5926064415
1 #ifdef __UINT32_TYPE__
2 typedef __UINT32_TYPE__ uint32_t;
3 #else
4 typedef __UINT32_TYPE__ unsigned;
5 #endif
7 struct bitfield {
8 unsigned char f0:7;
9 unsigned char :1;
10 unsigned char f1:7;
11 unsigned char :1;
12 unsigned char f2:7;
13 unsigned char :1;
14 unsigned char f3:7;
17 struct ok {
18 unsigned char f0;
19 unsigned char f1;
20 unsigned char f2;
21 unsigned char f3;
24 union bf_or_uint32 {
25 struct ok inval;
26 struct bitfield bfval;
29 __attribute__ ((noinline, noclone)) uint32_t
30 partial_read_le32 (union bf_or_uint32 in)
32 return in.bfval.f0 | (in.bfval.f1 << 8)
33 | (in.bfval.f2 << 16) | (in.bfval.f3 << 24);
36 __attribute__ ((noinline, noclone)) uint32_t
37 partial_read_be32 (union bf_or_uint32 in)
39 return in.bfval.f3 | (in.bfval.f2 << 8)
40 | (in.bfval.f1 << 16) | (in.bfval.f0 << 24);
43 __attribute__ ((noinline, noclone)) uint32_t
44 fake_read_le32 (char *x, char *y)
46 unsigned char c0, c1, c2, c3;
48 c0 = x[0];
49 c1 = x[1];
50 *y = 1;
51 c2 = x[2];
52 c3 = x[3];
53 return c0 | c1 << 8 | c2 << 16 | c3 << 24;
56 __attribute__ ((noinline, noclone)) uint32_t
57 fake_read_be32 (char *x, char *y)
59 unsigned char c0, c1, c2, c3;
61 c0 = x[0];
62 c1 = x[1];
63 *y = 1;
64 c2 = x[2];
65 c3 = x[3];
66 return c3 | c2 << 8 | c1 << 16 | c0 << 24;
69 __attribute__ ((noinline, noclone)) uint32_t
70 incorrect_read_le32 (char *x, char *y)
72 unsigned char c0, c1, c2, c3;
74 c0 = x[0];
75 c1 = x[1];
76 c2 = x[2];
77 c3 = x[3];
78 *y = 1;
79 return c0 | c1 << 8 | c2 << 16 | c3 << 24;
82 __attribute__ ((noinline, noclone)) uint32_t
83 incorrect_read_be32 (char *x, char *y)
85 unsigned char c0, c1, c2, c3;
87 c0 = x[0];
88 c1 = x[1];
89 c2 = x[2];
90 c3 = x[3];
91 *y = 1;
92 return c3 | c2 << 8 | c1 << 16 | c0 << 24;
95 int
96 main ()
98 union bf_or_uint32 bfin;
99 uint32_t out;
100 char cin[] = { 0x83, 0x85, 0x87, 0x89 };
102 if (sizeof (uint32_t) * __CHAR_BIT__ != 32)
103 return 0;
104 bfin.inval = (struct ok) { 0x83, 0x85, 0x87, 0x89 };
105 out = partial_read_le32 (bfin);
106 /* Test what bswap would do if its check are not strict enough instead of
107 what is the expected result as there is too many possible results with
108 bitfields. */
109 if (out == 0x89878583)
110 __builtin_abort ();
111 bfin.inval = (struct ok) { 0x83, 0x85, 0x87, 0x89 };
112 out = partial_read_be32 (bfin);
113 /* Test what bswap would do if its check are not strict enough instead of
114 what is the expected result as there is too many possible results with
115 bitfields. */
116 if (out == 0x83858789)
117 __builtin_abort ();
118 out = fake_read_le32 (cin, &cin[2]);
119 if (out != 0x89018583)
120 __builtin_abort ();
121 cin[2] = 0x87;
122 out = fake_read_be32 (cin, &cin[2]);
123 if (out != 0x83850189)
124 __builtin_abort ();
125 cin[2] = 0x87;
126 out = incorrect_read_le32 (cin, &cin[2]);
127 if (out != 0x89878583)
128 __builtin_abort ();
129 cin[2] = 0x87;
130 out = incorrect_read_be32 (cin, &cin[2]);
131 if (out != 0x83858789)
132 __builtin_abort ();
133 return 0;