* gcc.target/i386/pr70021.c: Add -mtune=skylake.
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / iamcu / test_bitfields.c
blob0b1c29333dc78db463a9da6de72b061c09bb8e07
1 /* This is a small test to see if bitfields are working. It is only a
2 few structs and a union and a test to see if they have the correct
3 size, if values can be read and written and a couple of argument
4 passing tests. No alignment testing is done. */
6 #include "defines.h"
7 #include "macros.h"
10 /* These five bitfields are taken from the System V ABI, Intel 386
11 architecture supplement. */
13 /* Word aligned, sizeof is 4. */
14 struct RightToLeft
16 int j:5;
17 int k:6;
18 int m:7;
21 /* Word aligned, sizeof is 12. */
22 struct BoundaryAlignment
24 short s:9;
25 int j:9;
26 char c;
27 short t:9;
28 short u:9;
29 char d;
32 /* Halfword aligned, sizeof is 2. */
33 struct StorageUnitSharing
35 char c;
36 short s:8;
39 /* Halfword aligned, sizeof is 2. */
40 union Allocation
42 char c;
43 short s:8;
46 /* Byte aligned, sizeof is 9. */
47 struct Unnamed
49 char c;
50 int :0;
51 char d;
52 short :9;
53 char e;
54 char :0;
57 /* Extra struct testing bitfields in larger types.
58 Doubleword aligned, sizeof is 8. */
59 struct LargerTypes
61 long long l:33;
62 int i:31;
66 void
67 passing1 (struct RightToLeft str, int j, int k, int m)
69 assert (str.j == j);
70 assert (str.k == k);
71 assert (str.m == m);
74 void
75 passing2 (struct BoundaryAlignment str, short s, int j, char c, short t,
76 short u, char d)
78 assert (str.s == s);
79 assert (str.j == j);
80 assert (str.c == c);
81 assert (str.t == t);
82 assert (str.u == u);
83 assert (str.d == d);
86 void
87 passing3 (struct StorageUnitSharing str, char c, short s)
89 assert (str.c == c);
90 assert (str.s == s);
93 void
94 passing4 (struct Unnamed str, char c, char d, char e)
96 assert (str.c == c);
97 assert (str.d == d);
98 assert (str.e == e);
101 void
102 passing5 (struct LargerTypes str, long long l, int i)
104 assert (str.l == l);
105 assert (str.i == i);
109 void
110 passingU (union Allocation u, char c)
112 assert (u.c == c);
113 assert (u.s == c);
118 main (void)
120 struct RightToLeft str1;
121 struct BoundaryAlignment str2;
122 struct StorageUnitSharing str3;
123 struct Unnamed str4;
124 struct LargerTypes str5;
125 union Allocation u;
127 /* Check sizeof's. */
128 check_size(str1, 4);
129 check_size(str2, 12);
130 check_size(str3, 2);
131 check_size(str4, 9);
132 check_size(str5, 8);
133 check_size(u, 2);
135 /* Check alignof's. */
136 check_align_lv(str1, 4);
137 check_align_lv(str2, 4);
138 check_align_lv(str3, 2);
139 check_align_lv(str4, 1);
140 check_align_lv(str5, 4);
141 check_align_lv(u, 2);
143 /* Check passing. */
144 str1.j = str2.s = str3.c = str4.c = str5.l = 4;
145 str1.k = str2.j = str3.s = str4.d = str5.i = 5;
146 str1.m = str2.c = str4.e = 6;
147 str2.t = 7;
148 str2.u = 8;
149 str2.d = 9;
150 passing1 (str1, 4, 5, 6);
151 passing2 (str2, 4, 5, 6, 7, 8, 9);
152 passing3 (str3, 4, 5);
153 passing4 (str4, 4, 5, 6);
154 passing5 (str5, 4, 5);
156 u.c = 5;
157 passingU (u, 5);
158 u.s = 6;
159 passingU (u, 6);
161 return 0;