1 typedef __INT8_TYPE__  int_hr_t;
2 typedef __UINT8_TYPE__ int_uhr_t;
3 
4 typedef __INT16_TYPE__  int_hk_t;
5 typedef __UINT16_TYPE__ int_uhk_t;
6 typedef __INT16_TYPE__  int_r_t;
7 typedef __UINT16_TYPE__ int_ur_t;
8 
9 typedef __INT32_TYPE__  int_k_t;
10 typedef __UINT32_TYPE__ int_uk_t;
11 typedef __INT32_TYPE__  int_lr_t;
12 typedef __UINT32_TYPE__ int_ulr_t;
13 
14 typedef __INT64_TYPE__  int_lk_t;
15 typedef __UINT64_TYPE__ int_ulk_t;
16 typedef __INT64_TYPE__  int_llr_t;
17 typedef __UINT64_TYPE__ int_ullr_t;
18 typedef __INT64_TYPE__  int_llk_t;
19 typedef __UINT64_TYPE__ int_ullk_t;
20 
21 typedef __INT16_TYPE__  xint_hr_t;
22 typedef __UINT16_TYPE__ xint_uhr_t;
23 
24 typedef __INT32_TYPE__  xint_hk_t;
25 typedef __UINT32_TYPE__ xint_uhk_t;
26 typedef __INT32_TYPE__  xint_r_t;
27 typedef __UINT32_TYPE__ xint_ur_t;
28 
29 typedef __INT64_TYPE__  xint_k_t;
30 typedef __UINT64_TYPE__ xint_uk_t;
31 typedef __INT64_TYPE__  xint_lr_t;
32 typedef __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