1/* @title: Min, Max, Clamping, and Absolute Value */
2#pragma once
3#include <compiler/core.h>
4#include <compiler/intrinsic.h>
5#include <enforce.h>
6#include <stdbool.h>
7
8#define abs(N) \
9 ({ \
10 __auto_type __abs_n = (N); \
11 ct_typecheck_signed_as(__abs_n, N); \
12 typeof(__abs_n) __abs_result = __abs_n; \
13 if (__abs_n < 0) { \
14 bool __abs_overflow = \
15 ci_sub_overflow((typeof(__abs_n)) 0, __abs_n, &__abs_result); \
16 (void) enforce(!__abs_overflow, OVERFLOW); \
17 } \
18 __abs_result; \
19 })
20
21#define CLAMP(val_, min_, max_) \
22 ({ \
23 __auto_type __cl_val = (val_); \
24 __auto_type __cl_lo = (min_); \
25 __auto_type __cl_hi = (max_); \
26 typedef ct_common_type_2(__cl_val, __cl_lo) __cl_t1; \
27 typedef ct_common_type_2((__cl_t1) 0, __cl_hi) __cl_t; \
28 ct_typecheck_widenable_to((__cl_t) 0, val_); \
29 ct_typecheck_widenable_to((__cl_t) 0, min_); \
30 ct_typecheck_widenable_to((__cl_t) 0, max_); \
31 __cl_t __cl_v = (__cl_t) __cl_val; \
32 __cl_t __cl_l = (__cl_t) __cl_lo; \
33 __cl_t __cl_h = (__cl_t) __cl_hi; \
34 (void) enforce(__cl_l <= __cl_h); \
35 if (__cl_v > __cl_h) \
36 __cl_v = __cl_h; \
37 if (__cl_v < __cl_l) \
38 __cl_v = __cl_l; \
39 (__cl_t) __cl_v; \
40 })
41
42#define _MIN_1(a) (a)
43
44#define _MIN_2(a, b) \
45 ({ \
46 __auto_type __mm_1 = (a); \
47 __auto_type __mm_2 = (b); \
48 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
49 typedef __mm_t2 __mm_t; \
50 ct_typecheck_widenable_to((__mm_t) 0, a); \
51 ct_typecheck_widenable_to((__mm_t) 0, b); \
52 __mm_t __mm_r = (__mm_t) __mm_1; \
53 __mm_t __mm_c2 = (__mm_t) __mm_2; \
54 __mm_r = __mm_c2 < __mm_r ? __mm_c2 : __mm_r; \
55 (__mm_t) __mm_r; \
56 })
57
58#define _MIN_3(a, b, c) \
59 ({ \
60 __auto_type __mm_1 = (a); \
61 __auto_type __mm_2 = (b); \
62 __auto_type __mm_3 = (c); \
63 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
64 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
65 typedef __mm_t3 __mm_t; \
66 ct_typecheck_widenable_to((__mm_t) 0, a); \
67 ct_typecheck_widenable_to((__mm_t) 0, b); \
68 ct_typecheck_widenable_to((__mm_t) 0, c); \
69 __mm_t __mm_r = (__mm_t) __mm_1; \
70 __mm_t __mm_c2 = (__mm_t) __mm_2; \
71 __mm_r = __mm_c2 < __mm_r ? __mm_c2 : __mm_r; \
72 __mm_t __mm_c3 = (__mm_t) __mm_3; \
73 __mm_r = __mm_c3 < __mm_r ? __mm_c3 : __mm_r; \
74 (__mm_t) __mm_r; \
75 })
76
77#define _MIN_4(a, b, c, d) \
78 ({ \
79 __auto_type __mm_1 = (a); \
80 __auto_type __mm_2 = (b); \
81 __auto_type __mm_3 = (c); \
82 __auto_type __mm_4 = (d); \
83 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
84 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
85 typedef ct_common_type_2((__mm_t3) 0, __mm_4) __mm_t4; \
86 typedef __mm_t4 __mm_t; \
87 ct_typecheck_widenable_to((__mm_t) 0, a); \
88 ct_typecheck_widenable_to((__mm_t) 0, b); \
89 ct_typecheck_widenable_to((__mm_t) 0, c); \
90 ct_typecheck_widenable_to((__mm_t) 0, d); \
91 __mm_t __mm_r = (__mm_t) __mm_1; \
92 __mm_t __mm_c2 = (__mm_t) __mm_2; \
93 __mm_r = __mm_c2 < __mm_r ? __mm_c2 : __mm_r; \
94 __mm_t __mm_c3 = (__mm_t) __mm_3; \
95 __mm_r = __mm_c3 < __mm_r ? __mm_c3 : __mm_r; \
96 __mm_t __mm_c4 = (__mm_t) __mm_4; \
97 __mm_r = __mm_c4 < __mm_r ? __mm_c4 : __mm_r; \
98 (__mm_t) __mm_r; \
99 })
100
101#define _MIN_5(a, b, c, d, e) \
102 ({ \
103 __auto_type __mm_1 = (a); \
104 __auto_type __mm_2 = (b); \
105 __auto_type __mm_3 = (c); \
106 __auto_type __mm_4 = (d); \
107 __auto_type __mm_5 = (e); \
108 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
109 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
110 typedef ct_common_type_2((__mm_t3) 0, __mm_4) __mm_t4; \
111 typedef ct_common_type_2((__mm_t4) 0, __mm_5) __mm_t5; \
112 typedef __mm_t5 __mm_t; \
113 ct_typecheck_widenable_to((__mm_t) 0, a); \
114 ct_typecheck_widenable_to((__mm_t) 0, b); \
115 ct_typecheck_widenable_to((__mm_t) 0, c); \
116 ct_typecheck_widenable_to((__mm_t) 0, d); \
117 ct_typecheck_widenable_to((__mm_t) 0, e); \
118 __mm_t __mm_r = (__mm_t) __mm_1; \
119 __mm_t __mm_c2 = (__mm_t) __mm_2; \
120 __mm_r = __mm_c2 < __mm_r ? __mm_c2 : __mm_r; \
121 __mm_t __mm_c3 = (__mm_t) __mm_3; \
122 __mm_r = __mm_c3 < __mm_r ? __mm_c3 : __mm_r; \
123 __mm_t __mm_c4 = (__mm_t) __mm_4; \
124 __mm_r = __mm_c4 < __mm_r ? __mm_c4 : __mm_r; \
125 __mm_t __mm_c5 = (__mm_t) __mm_5; \
126 __mm_r = __mm_c5 < __mm_r ? __mm_c5 : __mm_r; \
127 (__mm_t) __mm_r; \
128 })
129
130#define _MIN_6(a, b, c, d, e, f) \
131 ({ \
132 __auto_type __mm_1 = (a); \
133 __auto_type __mm_2 = (b); \
134 __auto_type __mm_3 = (c); \
135 __auto_type __mm_4 = (d); \
136 __auto_type __mm_5 = (e); \
137 __auto_type __mm_6 = (f); \
138 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
139 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
140 typedef ct_common_type_2((__mm_t3) 0, __mm_4) __mm_t4; \
141 typedef ct_common_type_2((__mm_t4) 0, __mm_5) __mm_t5; \
142 typedef ct_common_type_2((__mm_t5) 0, __mm_6) __mm_t6; \
143 typedef __mm_t6 __mm_t; \
144 ct_typecheck_widenable_to((__mm_t) 0, a); \
145 ct_typecheck_widenable_to((__mm_t) 0, b); \
146 ct_typecheck_widenable_to((__mm_t) 0, c); \
147 ct_typecheck_widenable_to((__mm_t) 0, d); \
148 ct_typecheck_widenable_to((__mm_t) 0, e); \
149 ct_typecheck_widenable_to((__mm_t) 0, f); \
150 __mm_t __mm_r = (__mm_t) __mm_1; \
151 __mm_t __mm_c2 = (__mm_t) __mm_2; \
152 __mm_r = __mm_c2 < __mm_r ? __mm_c2 : __mm_r; \
153 __mm_t __mm_c3 = (__mm_t) __mm_3; \
154 __mm_r = __mm_c3 < __mm_r ? __mm_c3 : __mm_r; \
155 __mm_t __mm_c4 = (__mm_t) __mm_4; \
156 __mm_r = __mm_c4 < __mm_r ? __mm_c4 : __mm_r; \
157 __mm_t __mm_c5 = (__mm_t) __mm_5; \
158 __mm_r = __mm_c5 < __mm_r ? __mm_c5 : __mm_r; \
159 __mm_t __mm_c6 = (__mm_t) __mm_6; \
160 __mm_r = __mm_c6 < __mm_r ? __mm_c6 : __mm_r; \
161 (__mm_t) __mm_r; \
162 })
163
164#define _MIN_7(a, b, c, d, e, f, g) \
165 ({ \
166 __auto_type __mm_1 = (a); \
167 __auto_type __mm_2 = (b); \
168 __auto_type __mm_3 = (c); \
169 __auto_type __mm_4 = (d); \
170 __auto_type __mm_5 = (e); \
171 __auto_type __mm_6 = (f); \
172 __auto_type __mm_7 = (g); \
173 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
174 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
175 typedef ct_common_type_2((__mm_t3) 0, __mm_4) __mm_t4; \
176 typedef ct_common_type_2((__mm_t4) 0, __mm_5) __mm_t5; \
177 typedef ct_common_type_2((__mm_t5) 0, __mm_6) __mm_t6; \
178 typedef ct_common_type_2((__mm_t6) 0, __mm_7) __mm_t7; \
179 typedef __mm_t7 __mm_t; \
180 ct_typecheck_widenable_to((__mm_t) 0, a); \
181 ct_typecheck_widenable_to((__mm_t) 0, b); \
182 ct_typecheck_widenable_to((__mm_t) 0, c); \
183 ct_typecheck_widenable_to((__mm_t) 0, d); \
184 ct_typecheck_widenable_to((__mm_t) 0, e); \
185 ct_typecheck_widenable_to((__mm_t) 0, f); \
186 ct_typecheck_widenable_to((__mm_t) 0, g); \
187 __mm_t __mm_r = (__mm_t) __mm_1; \
188 __mm_t __mm_c2 = (__mm_t) __mm_2; \
189 __mm_r = __mm_c2 < __mm_r ? __mm_c2 : __mm_r; \
190 __mm_t __mm_c3 = (__mm_t) __mm_3; \
191 __mm_r = __mm_c3 < __mm_r ? __mm_c3 : __mm_r; \
192 __mm_t __mm_c4 = (__mm_t) __mm_4; \
193 __mm_r = __mm_c4 < __mm_r ? __mm_c4 : __mm_r; \
194 __mm_t __mm_c5 = (__mm_t) __mm_5; \
195 __mm_r = __mm_c5 < __mm_r ? __mm_c5 : __mm_r; \
196 __mm_t __mm_c6 = (__mm_t) __mm_6; \
197 __mm_r = __mm_c6 < __mm_r ? __mm_c6 : __mm_r; \
198 __mm_t __mm_c7 = (__mm_t) __mm_7; \
199 __mm_r = __mm_c7 < __mm_r ? __mm_c7 : __mm_r; \
200 (__mm_t) __mm_r; \
201 })
202
203#define _MIN_8(a, b, c, d, e, f, g, h) \
204 ({ \
205 __auto_type __mm_1 = (a); \
206 __auto_type __mm_2 = (b); \
207 __auto_type __mm_3 = (c); \
208 __auto_type __mm_4 = (d); \
209 __auto_type __mm_5 = (e); \
210 __auto_type __mm_6 = (f); \
211 __auto_type __mm_7 = (g); \
212 __auto_type __mm_8 = (h); \
213 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
214 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
215 typedef ct_common_type_2((__mm_t3) 0, __mm_4) __mm_t4; \
216 typedef ct_common_type_2((__mm_t4) 0, __mm_5) __mm_t5; \
217 typedef ct_common_type_2((__mm_t5) 0, __mm_6) __mm_t6; \
218 typedef ct_common_type_2((__mm_t6) 0, __mm_7) __mm_t7; \
219 typedef ct_common_type_2((__mm_t7) 0, __mm_8) __mm_t8; \
220 typedef __mm_t8 __mm_t; \
221 ct_typecheck_widenable_to((__mm_t) 0, a); \
222 ct_typecheck_widenable_to((__mm_t) 0, b); \
223 ct_typecheck_widenable_to((__mm_t) 0, c); \
224 ct_typecheck_widenable_to((__mm_t) 0, d); \
225 ct_typecheck_widenable_to((__mm_t) 0, e); \
226 ct_typecheck_widenable_to((__mm_t) 0, f); \
227 ct_typecheck_widenable_to((__mm_t) 0, g); \
228 ct_typecheck_widenable_to((__mm_t) 0, h); \
229 __mm_t __mm_r = (__mm_t) __mm_1; \
230 __mm_t __mm_c2 = (__mm_t) __mm_2; \
231 __mm_r = __mm_c2 < __mm_r ? __mm_c2 : __mm_r; \
232 __mm_t __mm_c3 = (__mm_t) __mm_3; \
233 __mm_r = __mm_c3 < __mm_r ? __mm_c3 : __mm_r; \
234 __mm_t __mm_c4 = (__mm_t) __mm_4; \
235 __mm_r = __mm_c4 < __mm_r ? __mm_c4 : __mm_r; \
236 __mm_t __mm_c5 = (__mm_t) __mm_5; \
237 __mm_r = __mm_c5 < __mm_r ? __mm_c5 : __mm_r; \
238 __mm_t __mm_c6 = (__mm_t) __mm_6; \
239 __mm_r = __mm_c6 < __mm_r ? __mm_c6 : __mm_r; \
240 __mm_t __mm_c7 = (__mm_t) __mm_7; \
241 __mm_r = __mm_c7 < __mm_r ? __mm_c7 : __mm_r; \
242 __mm_t __mm_c8 = (__mm_t) __mm_8; \
243 __mm_r = __mm_c8 < __mm_r ? __mm_c8 : __mm_r; \
244 (__mm_t) __mm_r; \
245 })
246
247#define MIN(...) PP_CALL(_MIN, __VA_ARGS__)
248
249#define _MAX_1(a) (a)
250
251#define _MAX_2(a, b) \
252 ({ \
253 __auto_type __mm_1 = (a); \
254 __auto_type __mm_2 = (b); \
255 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
256 typedef __mm_t2 __mm_t; \
257 ct_typecheck_widenable_to((__mm_t) 0, a); \
258 ct_typecheck_widenable_to((__mm_t) 0, b); \
259 __mm_t __mm_r = (__mm_t) __mm_1; \
260 __mm_t __mm_c2 = (__mm_t) __mm_2; \
261 __mm_r = __mm_c2 > __mm_r ? __mm_c2 : __mm_r; \
262 (__mm_t) __mm_r; \
263 })
264
265#define _MAX_3(a, b, c) \
266 ({ \
267 __auto_type __mm_1 = (a); \
268 __auto_type __mm_2 = (b); \
269 __auto_type __mm_3 = (c); \
270 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
271 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
272 typedef __mm_t3 __mm_t; \
273 ct_typecheck_widenable_to((__mm_t) 0, a); \
274 ct_typecheck_widenable_to((__mm_t) 0, b); \
275 ct_typecheck_widenable_to((__mm_t) 0, c); \
276 __mm_t __mm_r = (__mm_t) __mm_1; \
277 __mm_t __mm_c2 = (__mm_t) __mm_2; \
278 __mm_r = __mm_c2 > __mm_r ? __mm_c2 : __mm_r; \
279 __mm_t __mm_c3 = (__mm_t) __mm_3; \
280 __mm_r = __mm_c3 > __mm_r ? __mm_c3 : __mm_r; \
281 (__mm_t) __mm_r; \
282 })
283
284#define _MAX_4(a, b, c, d) \
285 ({ \
286 __auto_type __mm_1 = (a); \
287 __auto_type __mm_2 = (b); \
288 __auto_type __mm_3 = (c); \
289 __auto_type __mm_4 = (d); \
290 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
291 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
292 typedef ct_common_type_2((__mm_t3) 0, __mm_4) __mm_t4; \
293 typedef __mm_t4 __mm_t; \
294 ct_typecheck_widenable_to((__mm_t) 0, a); \
295 ct_typecheck_widenable_to((__mm_t) 0, b); \
296 ct_typecheck_widenable_to((__mm_t) 0, c); \
297 ct_typecheck_widenable_to((__mm_t) 0, d); \
298 __mm_t __mm_r = (__mm_t) __mm_1; \
299 __mm_t __mm_c2 = (__mm_t) __mm_2; \
300 __mm_r = __mm_c2 > __mm_r ? __mm_c2 : __mm_r; \
301 __mm_t __mm_c3 = (__mm_t) __mm_3; \
302 __mm_r = __mm_c3 > __mm_r ? __mm_c3 : __mm_r; \
303 __mm_t __mm_c4 = (__mm_t) __mm_4; \
304 __mm_r = __mm_c4 > __mm_r ? __mm_c4 : __mm_r; \
305 (__mm_t) __mm_r; \
306 })
307
308#define _MAX_5(a, b, c, d, e) \
309 ({ \
310 __auto_type __mm_1 = (a); \
311 __auto_type __mm_2 = (b); \
312 __auto_type __mm_3 = (c); \
313 __auto_type __mm_4 = (d); \
314 __auto_type __mm_5 = (e); \
315 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
316 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
317 typedef ct_common_type_2((__mm_t3) 0, __mm_4) __mm_t4; \
318 typedef ct_common_type_2((__mm_t4) 0, __mm_5) __mm_t5; \
319 typedef __mm_t5 __mm_t; \
320 ct_typecheck_widenable_to((__mm_t) 0, a); \
321 ct_typecheck_widenable_to((__mm_t) 0, b); \
322 ct_typecheck_widenable_to((__mm_t) 0, c); \
323 ct_typecheck_widenable_to((__mm_t) 0, d); \
324 ct_typecheck_widenable_to((__mm_t) 0, e); \
325 __mm_t __mm_r = (__mm_t) __mm_1; \
326 __mm_t __mm_c2 = (__mm_t) __mm_2; \
327 __mm_r = __mm_c2 > __mm_r ? __mm_c2 : __mm_r; \
328 __mm_t __mm_c3 = (__mm_t) __mm_3; \
329 __mm_r = __mm_c3 > __mm_r ? __mm_c3 : __mm_r; \
330 __mm_t __mm_c4 = (__mm_t) __mm_4; \
331 __mm_r = __mm_c4 > __mm_r ? __mm_c4 : __mm_r; \
332 __mm_t __mm_c5 = (__mm_t) __mm_5; \
333 __mm_r = __mm_c5 > __mm_r ? __mm_c5 : __mm_r; \
334 (__mm_t) __mm_r; \
335 })
336
337#define _MAX_6(a, b, c, d, e, f) \
338 ({ \
339 __auto_type __mm_1 = (a); \
340 __auto_type __mm_2 = (b); \
341 __auto_type __mm_3 = (c); \
342 __auto_type __mm_4 = (d); \
343 __auto_type __mm_5 = (e); \
344 __auto_type __mm_6 = (f); \
345 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
346 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
347 typedef ct_common_type_2((__mm_t3) 0, __mm_4) __mm_t4; \
348 typedef ct_common_type_2((__mm_t4) 0, __mm_5) __mm_t5; \
349 typedef ct_common_type_2((__mm_t5) 0, __mm_6) __mm_t6; \
350 typedef __mm_t6 __mm_t; \
351 ct_typecheck_widenable_to((__mm_t) 0, a); \
352 ct_typecheck_widenable_to((__mm_t) 0, b); \
353 ct_typecheck_widenable_to((__mm_t) 0, c); \
354 ct_typecheck_widenable_to((__mm_t) 0, d); \
355 ct_typecheck_widenable_to((__mm_t) 0, e); \
356 ct_typecheck_widenable_to((__mm_t) 0, f); \
357 __mm_t __mm_r = (__mm_t) __mm_1; \
358 __mm_t __mm_c2 = (__mm_t) __mm_2; \
359 __mm_r = __mm_c2 > __mm_r ? __mm_c2 : __mm_r; \
360 __mm_t __mm_c3 = (__mm_t) __mm_3; \
361 __mm_r = __mm_c3 > __mm_r ? __mm_c3 : __mm_r; \
362 __mm_t __mm_c4 = (__mm_t) __mm_4; \
363 __mm_r = __mm_c4 > __mm_r ? __mm_c4 : __mm_r; \
364 __mm_t __mm_c5 = (__mm_t) __mm_5; \
365 __mm_r = __mm_c5 > __mm_r ? __mm_c5 : __mm_r; \
366 __mm_t __mm_c6 = (__mm_t) __mm_6; \
367 __mm_r = __mm_c6 > __mm_r ? __mm_c6 : __mm_r; \
368 (__mm_t) __mm_r; \
369 })
370
371#define _MAX_7(a, b, c, d, e, f, g) \
372 ({ \
373 __auto_type __mm_1 = (a); \
374 __auto_type __mm_2 = (b); \
375 __auto_type __mm_3 = (c); \
376 __auto_type __mm_4 = (d); \
377 __auto_type __mm_5 = (e); \
378 __auto_type __mm_6 = (f); \
379 __auto_type __mm_7 = (g); \
380 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
381 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
382 typedef ct_common_type_2((__mm_t3) 0, __mm_4) __mm_t4; \
383 typedef ct_common_type_2((__mm_t4) 0, __mm_5) __mm_t5; \
384 typedef ct_common_type_2((__mm_t5) 0, __mm_6) __mm_t6; \
385 typedef ct_common_type_2((__mm_t6) 0, __mm_7) __mm_t7; \
386 typedef __mm_t7 __mm_t; \
387 ct_typecheck_widenable_to((__mm_t) 0, a); \
388 ct_typecheck_widenable_to((__mm_t) 0, b); \
389 ct_typecheck_widenable_to((__mm_t) 0, c); \
390 ct_typecheck_widenable_to((__mm_t) 0, d); \
391 ct_typecheck_widenable_to((__mm_t) 0, e); \
392 ct_typecheck_widenable_to((__mm_t) 0, f); \
393 ct_typecheck_widenable_to((__mm_t) 0, g); \
394 __mm_t __mm_r = (__mm_t) __mm_1; \
395 __mm_t __mm_c2 = (__mm_t) __mm_2; \
396 __mm_r = __mm_c2 > __mm_r ? __mm_c2 : __mm_r; \
397 __mm_t __mm_c3 = (__mm_t) __mm_3; \
398 __mm_r = __mm_c3 > __mm_r ? __mm_c3 : __mm_r; \
399 __mm_t __mm_c4 = (__mm_t) __mm_4; \
400 __mm_r = __mm_c4 > __mm_r ? __mm_c4 : __mm_r; \
401 __mm_t __mm_c5 = (__mm_t) __mm_5; \
402 __mm_r = __mm_c5 > __mm_r ? __mm_c5 : __mm_r; \
403 __mm_t __mm_c6 = (__mm_t) __mm_6; \
404 __mm_r = __mm_c6 > __mm_r ? __mm_c6 : __mm_r; \
405 __mm_t __mm_c7 = (__mm_t) __mm_7; \
406 __mm_r = __mm_c7 > __mm_r ? __mm_c7 : __mm_r; \
407 (__mm_t) __mm_r; \
408 })
409
410#define _MAX_8(a, b, c, d, e, f, g, h) \
411 ({ \
412 __auto_type __mm_1 = (a); \
413 __auto_type __mm_2 = (b); \
414 __auto_type __mm_3 = (c); \
415 __auto_type __mm_4 = (d); \
416 __auto_type __mm_5 = (e); \
417 __auto_type __mm_6 = (f); \
418 __auto_type __mm_7 = (g); \
419 __auto_type __mm_8 = (h); \
420 typedef ct_common_type_2(__mm_1, __mm_2) __mm_t2; \
421 typedef ct_common_type_2((__mm_t2) 0, __mm_3) __mm_t3; \
422 typedef ct_common_type_2((__mm_t3) 0, __mm_4) __mm_t4; \
423 typedef ct_common_type_2((__mm_t4) 0, __mm_5) __mm_t5; \
424 typedef ct_common_type_2((__mm_t5) 0, __mm_6) __mm_t6; \
425 typedef ct_common_type_2((__mm_t6) 0, __mm_7) __mm_t7; \
426 typedef ct_common_type_2((__mm_t7) 0, __mm_8) __mm_t8; \
427 typedef __mm_t8 __mm_t; \
428 ct_typecheck_widenable_to((__mm_t) 0, a); \
429 ct_typecheck_widenable_to((__mm_t) 0, b); \
430 ct_typecheck_widenable_to((__mm_t) 0, c); \
431 ct_typecheck_widenable_to((__mm_t) 0, d); \
432 ct_typecheck_widenable_to((__mm_t) 0, e); \
433 ct_typecheck_widenable_to((__mm_t) 0, f); \
434 ct_typecheck_widenable_to((__mm_t) 0, g); \
435 ct_typecheck_widenable_to((__mm_t) 0, h); \
436 __mm_t __mm_r = (__mm_t) __mm_1; \
437 __mm_t __mm_c2 = (__mm_t) __mm_2; \
438 __mm_r = __mm_c2 > __mm_r ? __mm_c2 : __mm_r; \
439 __mm_t __mm_c3 = (__mm_t) __mm_3; \
440 __mm_r = __mm_c3 > __mm_r ? __mm_c3 : __mm_r; \
441 __mm_t __mm_c4 = (__mm_t) __mm_4; \
442 __mm_r = __mm_c4 > __mm_r ? __mm_c4 : __mm_r; \
443 __mm_t __mm_c5 = (__mm_t) __mm_5; \
444 __mm_r = __mm_c5 > __mm_r ? __mm_c5 : __mm_r; \
445 __mm_t __mm_c6 = (__mm_t) __mm_6; \
446 __mm_r = __mm_c6 > __mm_r ? __mm_c6 : __mm_r; \
447 __mm_t __mm_c7 = (__mm_t) __mm_7; \
448 __mm_r = __mm_c7 > __mm_r ? __mm_c7 : __mm_r; \
449 __mm_t __mm_c8 = (__mm_t) __mm_8; \
450 __mm_r = __mm_c8 > __mm_r ? __mm_c8 : __mm_r; \
451 (__mm_t) __mm_r; \
452 })
453
454#define MAX(...) PP_CALL(_MAX, __VA_ARGS__)
455