1/* This file tests shifts in various integral modes.  */
2
3#include <limits.h>
4
5#define CAT(A, B) A ## B
6
7#define REPEAT_8	\
8REPEAT_FN ( 0)		\
9REPEAT_FN ( 1)		\
10REPEAT_FN ( 2)		\
11REPEAT_FN ( 3)		\
12REPEAT_FN ( 4)		\
13REPEAT_FN ( 5)		\
14REPEAT_FN ( 6)		\
15REPEAT_FN ( 7)
16
17#define REPEAT_16	\
18REPEAT_8		\
19REPEAT_FN ( 8)		\
20REPEAT_FN ( 9)		\
21REPEAT_FN (10)		\
22REPEAT_FN (11)		\
23REPEAT_FN (12)		\
24REPEAT_FN (13)		\
25REPEAT_FN (14)		\
26REPEAT_FN (15)
27
28#define REPEAT_32	\
29REPEAT_16		\
30REPEAT_FN (16)		\
31REPEAT_FN (17)		\
32REPEAT_FN (18)		\
33REPEAT_FN (19)		\
34REPEAT_FN (20)		\
35REPEAT_FN (21)		\
36REPEAT_FN (22)		\
37REPEAT_FN (23)		\
38REPEAT_FN (24)		\
39REPEAT_FN (25)		\
40REPEAT_FN (26)		\
41REPEAT_FN (27)		\
42REPEAT_FN (28)		\
43REPEAT_FN (29)		\
44REPEAT_FN (30)		\
45REPEAT_FN (31)
46
47/* Define 8-bit shifts.  */
48#if CHAR_BIT == 8
49typedef unsigned int u8 __attribute__((mode(QI)));
50typedef signed int s8 __attribute__((mode(QI)));
51
52#define REPEAT_FN(COUNT) \
53u8 CAT (ashift_qi_, COUNT) (u8 n) { return n << COUNT; }
54REPEAT_8
55#undef REPEAT_FN
56
57#define REPEAT_FN(COUNT) \
58u8 CAT (lshiftrt_qi_, COUNT) (u8 n) { return n >> COUNT; }
59REPEAT_8
60#undef REPEAT_FN
61
62#define REPEAT_FN(COUNT) \
63s8 CAT (ashiftrt_qi_, COUNT) (s8 n) { return n >> COUNT; }
64REPEAT_8
65#undef REPEAT_FN
66#endif /* CHAR_BIT == 8 */
67
68/* Define 16-bit shifts.  */
69#if CHAR_BIT == 8 || CHAR_BIT == 16
70#if CHAR_BIT == 8
71typedef unsigned int u16 __attribute__((mode(HI)));
72typedef signed int s16 __attribute__((mode(HI)));
73#elif CHAR_BIT == 16
74typedef unsigned int u16 __attribute__((mode(QI)));
75typedef signed int s16 __attribute__((mode(QI)));
76#endif
77
78#define REPEAT_FN(COUNT) \
79u16 CAT (ashift_hi_, COUNT) (u16 n) { return n << COUNT; }
80REPEAT_16
81#undef REPEAT_FN
82
83#define REPEAT_FN(COUNT) \
84u16 CAT (lshiftrt_hi_, COUNT) (u16 n) { return n >> COUNT; }
85REPEAT_16
86#undef REPEAT_FN
87
88#define REPEAT_FN(COUNT) \
89s16 CAT (ashiftrt_hi_, COUNT) (s16 n) { return n >> COUNT; }
90REPEAT_16
91#undef REPEAT_FN
92#endif /* CHAR_BIT == 8 || CHAR_BIT == 16 */
93
94/* Define 32-bit shifts.  */
95#if CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32
96#if CHAR_BIT == 8
97typedef unsigned int u32 __attribute__((mode(SI)));
98typedef signed int s32 __attribute__((mode(SI)));
99#elif CHAR_BIT == 16
100typedef unsigned int u32 __attribute__((mode(HI)));
101typedef signed int s32 __attribute__((mode(HI)));
102#elif CHAR_BIT == 32
103typedef unsigned int u32 __attribute__((mode(QI)));
104typedef signed int s32 __attribute__((mode(QI)));
105#endif
106
107#define REPEAT_FN(COUNT) \
108u32 CAT (ashift_si_, COUNT) (u32 n) { return n << COUNT; }
109REPEAT_32
110#undef REPEAT_FN
111
112#define REPEAT_FN(COUNT) \
113u32 CAT (lshiftrt_si_, COUNT) (u32 n) { return n >> COUNT; }
114REPEAT_32
115#undef REPEAT_FN
116
117#define REPEAT_FN(COUNT) \
118s32 CAT (ashiftrt_si_, COUNT) (s32 n) { return n >> COUNT; }
119REPEAT_32
120#undef REPEAT_FN
121#endif /* CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32 */
122
123extern void abort (void);
124extern void exit (int);
125
126int
127main ()
128{
129  /* Test 8-bit shifts.  */
130#if CHAR_BIT == 8
131# define REPEAT_FN(COUNT) \
132  if (CAT (ashift_qi_, COUNT) (0xff) != (u8) ((u8)0xff << COUNT)) abort ();
133  REPEAT_8;
134# undef REPEAT_FN
135
136# define REPEAT_FN(COUNT) \
137  if (CAT (lshiftrt_qi_, COUNT) (0xff) != (u8) ((u8)0xff >> COUNT)) abort ();
138  REPEAT_8;
139# undef REPEAT_FN
140
141# define REPEAT_FN(COUNT) \
142  if (CAT (ashiftrt_qi_, COUNT) (-1) != -1) abort ();
143  REPEAT_8;
144# undef REPEAT_FN
145
146# define REPEAT_FN(COUNT) \
147  if (CAT (ashiftrt_qi_, COUNT) (0) != 0) abort ();
148  REPEAT_8;
149# undef REPEAT_FN
150#endif /* CHAR_BIT == 8 */
151
152  /* Test 16-bit shifts.  */
153#if CHAR_BIT == 8 || CHAR_BIT == 16
154# define REPEAT_FN(COUNT)			\
155  if (CAT (ashift_hi_, COUNT) (0xffff)		\
156      != (u16) ((u16) 0xffff << COUNT)) abort ();
157  REPEAT_16;
158# undef REPEAT_FN
159
160# define REPEAT_FN(COUNT)			\
161  if (CAT (lshiftrt_hi_, COUNT) (0xffff)	\
162      != (u16) ((u16) 0xffff >> COUNT)) abort ();
163  REPEAT_16;
164# undef REPEAT_FN
165
166# define REPEAT_FN(COUNT) \
167  if (CAT (ashiftrt_hi_, COUNT) (-1) != -1) abort ();
168  REPEAT_16;
169# undef REPEAT_FN
170
171# define REPEAT_FN(COUNT) \
172  if (CAT (ashiftrt_hi_, COUNT) (0) != 0) abort ();
173  REPEAT_16;
174# undef REPEAT_FN
175#endif /* CHAR_BIT == 8 || CHAR_BIT == 16 */
176
177  /* Test 32-bit shifts.  */
178#if CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32
179# define REPEAT_FN(COUNT)				\
180  if (CAT (ashift_si_, COUNT) (0xffffffff)		\
181      != (u32) ((u32) 0xffffffff << COUNT)) abort ();
182  REPEAT_32;
183# undef REPEAT_FN
184
185# define REPEAT_FN(COUNT)				\
186  if (CAT (lshiftrt_si_, COUNT) (0xffffffff)		\
187      != (u32) ((u32) 0xffffffff >> COUNT)) abort ();
188  REPEAT_32;
189# undef REPEAT_FN
190
191# define REPEAT_FN(COUNT) \
192  if (CAT (ashiftrt_si_, COUNT) (-1) != -1) abort ();
193  REPEAT_32;
194# undef REPEAT_FN
195
196# define REPEAT_FN(COUNT) \
197  if (CAT (ashiftrt_si_, COUNT) (0) != 0) abort ();
198  REPEAT_32;
199# undef REPEAT_FN
200#endif /* CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32 */
201
202  exit (0);
203}
204