1typedef __INT8_TYPE__  int_hr_t;
2typedef __UINT8_TYPE__ int_uhr_t;
3
4typedef __INT16_TYPE__  int_hk_t;
5typedef __UINT16_TYPE__ int_uhk_t;
6typedef __INT16_TYPE__  int_r_t;
7typedef __UINT16_TYPE__ int_ur_t;
8
9typedef __INT32_TYPE__  int_k_t;
10typedef __UINT32_TYPE__ int_uk_t;
11typedef __INT32_TYPE__  int_lr_t;
12typedef __UINT32_TYPE__ int_ulr_t;
13
14typedef __INT64_TYPE__  int_lk_t;
15typedef __UINT64_TYPE__ int_ulk_t;
16typedef __INT64_TYPE__  int_llr_t;
17typedef __UINT64_TYPE__ int_ullr_t;
18typedef __INT64_TYPE__  int_llk_t;
19typedef __UINT64_TYPE__ int_ullk_t;
20
21typedef __INT16_TYPE__  xint_hr_t;
22typedef __UINT16_TYPE__ xint_uhr_t;
23
24typedef __INT32_TYPE__  xint_hk_t;
25typedef __UINT32_TYPE__ xint_uhk_t;
26typedef __INT32_TYPE__  xint_r_t;
27typedef __UINT32_TYPE__ xint_ur_t;
28
29typedef __INT64_TYPE__  xint_k_t;
30typedef __UINT64_TYPE__ xint_uk_t;
31typedef __INT64_TYPE__  xint_lr_t;
32typedef __UINT64_TYPE__ xint_ulr_t;
33
34#define INThr_MAX __INT8_MAX__
35#define INThr_MIN (-__INT8_MAX__-1)
36#define INTuhr_MAX __UINT8_MAX__
37
38#define INTr_MAX __INT16_MAX__
39#define INTr_MIN (-__INT16_MAX__-1)
40#define INTur_MAX __UINT16_MAX__
41
42#define INThk_MAX __INT16_MAX__
43#define INThk_MIN (-__INT16_MAX__-1)
44#define INTuhk_MAX __UINT16_MAX__
45
46#define INTlr_MAX __INT32_MAX__
47#define INTlr_MIN (-__INT32_MAX__-1)
48#define INTulr_MAX __UINT32_MAX__
49
50#define INTk_MAX __INT32_MAX__
51#define INTk_MIN (-__INT32_MAX__-1)
52#define INTuk_MAX __UINT32_MAX__
53
54#define INTlk_MAX __INT64_MAX__
55#define INTlk_MIN (-__INT64_MAX__-1)
56#define INTulk_MAX __UINT64_MAX__
57
58#define INTllk_MAX __INT64_MAX__
59#define INTllk_MIN (-__INT64_MAX__-1)
60#define INTullk_MAX __UINT64_MAX__
61
62#define SS_FUN(NAME, OP, T, FX)                 \
63  T __attribute__((noinline,noclone))           \
64  NAME##_##FX (T fa, T fb)                      \
65  {                                             \
66    int_##FX##_t ia;                            \
67    int_##FX##_t ib;                            \
68    xint_##FX##_t ic;                           \
69    __builtin_memcpy (&ia, &fa, sizeof (ia));   \
70    __builtin_memcpy (&ib, &fb, sizeof (ib));   \
71    ic = (xint_##FX##_t) ia OP ib;              \
72    if (ic > INT##FX##_MAX)                     \
73      ic = INT##FX##_MAX;                       \
74    else if (ic < INT##FX##_MIN)                \
75      ic = INT##FX##_MIN;                       \
76    ia = (int_##FX##_t) ic;                     \
77    __builtin_memcpy (&fa, &ia, sizeof (ia));   \
78    return fa;                                  \
79  }
80
81#define US_FUN(NAME, OP, T, FX)                 \
82  T __attribute__((noinline,noclone))           \
83  NAME##_##FX (T fa, T fb)                      \
84  {                                             \
85    int_##FX##_t ia;                            \
86    int_##FX##_t ib;                            \
87    xint_##FX##_t ic;                           \
88    __builtin_memcpy (&ia, &fa, sizeof (ia));   \
89    __builtin_memcpy (&ib, &fb, sizeof (ib));   \
90    ic = (xint_##FX##_t) ia OP ib;              \
91    if (ic > INT##FX##_MAX)                     \
92      ic = INT##FX##_MAX;                       \
93    else if (ic < 0)                            \
94      ic = 0;                                   \
95    ia = (int_##FX##_t) ic;                     \
96    __builtin_memcpy (&fa, &ia, sizeof (ia));   \
97    return fa;                                  \
98  }
99
100#define SS_LFUN(NAME, OP, T, FX, CMP)           \
101  T __attribute__((noinline,noclone))           \
102  NAME##_##FX (T fa, T fb)                      \
103  {                                             \
104    int_##FX##_t ia;                            \
105    int_##FX##_t ib;                            \
106    int_##FX##_t ic;                            \
107    __builtin_memcpy (&ia, &fa, sizeof (ia));   \
108    __builtin_memcpy (&ib, &fb, sizeof (ib));   \
109    ic = (int_##FX##_t) ia OP ib;               \
110    if (ic < ia && ib CMP 0)                    \
111      ic = INT##FX##_MAX;                       \
112    else if (ic > ia && 0 CMP ib)               \
113      ic = INT##FX##_MIN;                       \
114    __builtin_memcpy (&fa, &ic, sizeof (ic));   \
115    return fa;                                  \
116  }
117
118#define US_LFUN(NAME, OP, T, FX, CMP)           \
119  T __attribute__((noinline,noclone))           \
120  NAME##_##FX (T fa, T fb)                      \
121  {                                             \
122    int_##FX##_t ia;                            \
123    int_##FX##_t ib;                            \
124    int_##FX##_t ic;                            \
125    __builtin_memcpy (&ia, &fa, sizeof (ia));   \
126    __builtin_memcpy (&ib, &fb, sizeof (ib));   \
127    ic = (int_##FX##_t) ia OP ib;               \
128    if (ia CMP ic && 1 CMP 0)                   \
129      ic = INT##FX##_MAX;                       \
130    if (ia CMP ic && 0 CMP 1)                   \
131      ic = 0;                                   \
132    __builtin_memcpy (&fa, &ic, sizeof (ic));   \
133    return fa;                                  \
134  }
135