2 #define WordS_addCheckBody(size, x, y, doOverflow, doSuccess) \
5 if (y > WordS##size##_max - x) { \
8 } else if (y < WordS##size##_min - x) { \
13 #define WordS_addCheckBodyCX(size, c, x, doOverflow, doSuccess) \
14 WordS_addCheckBody(size, c, x, doOverflow, doSuccess)
16 #define WordU_addCheckBody(size, x, y, doOverflow, doSuccess) \
18 if (y > Word##size##_max - x) { \
23 #define WordU_addCheckBodyCX(size, c, x, doOverflow, doSuccess) \
24 WordU_addCheckBody(size, c, x, doOverflow, doSuccess)
26 #define WordS_mulCheckBody(size, x, y, doOverflow, doSuccess) \
28 if ((x == (WordS##size)0) || (y == (WordS##size)0)) { \
30 if (x > (WordS## size)0) { \
31 if (y > (WordS##size)0) { \
32 if (x > WordS##size##_quot (WordS##size##_max, y)) { \
35 } else /* (y < (WordS##size)0) */ { \
36 if (y < WordS##size##_quot (WordS##size##_min, x)) { \
40 } else /* (x < (WordS##size)0) */ { \
41 if (y > (WordS##size)0) { \
42 if (x < WordS##size##_quot (WordS##size##_min, y)) { \
45 } else /* (y < (WordS##size)0) */ { \
46 if (y < WordS##size##_quot (WordS##size##_max, x)) { \
53 // #undef WordS_mulCheckBody
54 #define WordU_mulCheckBody(size, x, y, doOverflow, doSuccess) \
56 if ((x == (WordU##size)0) || (y == (WordU##size)0)) { \
58 if (x > WordU##size##_quot (Word##size##_max, y)) { \
63 // #undef WordU_mulCheckBody
64 /* #define Word_mulCheckBody(small, large, x, y, doOverflow, doSuccess) \ */
66 /* Word##large tmp; \ */
67 /* Word##small res; \ */
68 /* tmp = ((Word##large)x) * ((Word##large)y); \ */
69 /* res = (Word##small)tmp; \ */
70 /* if (tmp != res) { \ */
75 /* #define WordS_mulCheckBody(small, large, x, y, doOverflow, doSuccess) \ */
76 /* Word_mulCheckBody(S##small, S##large, x, y, doOverflow, doSuccess) */
77 /* #define WordU_mulCheckBody(small, large, x, y, doOverflow, doSuccess) \ */
78 /* Word_mulCheckBody(U##small, U##large, x, y, doOverflow, doSuccess) */
80 #define WordS_negCheckBody(size, x, doOverflow, doSuccess) \
82 if (x == WordS##size##_min) { \
88 #define WordS_subCheckBodyCX(size, c, x, doOverflow, doSuccess) \
91 if (x < c - WordS##size##_max) { \
94 } else if (x > c - WordS##size##_min) { \
99 #define WordS_subCheckBodyXC(size, x, c, doOverflow, doSuccess) \
102 if (x > WordS##size##_max + c) { \
105 } else if (x < WordS##size##_min + c) { \
110 #define WordS_subCheckBody(size, x, y, doOverflow, doSuccess) \
111 WordS_subCheckBodyCX(size, x, y, doOverflow, doSuccess)
114 #define WordS_addCheckOverflows(size) \
115 MLTON_CODEGEN_STATIC_INLINE \
116 Bool WordS##size##_addCheckOverflows (WordS##size x, WordS##size y) { \
117 WordS_addCheckBody(size, x, y, return TRUE, return FALSE); \
120 #define WordU_addCheckOverflows(size) \
121 MLTON_CODEGEN_STATIC_INLINE \
122 Bool WordU##size##_addCheckOverflows (WordU##size x, WordU##size y) { \
123 WordU_addCheckBody(size, x, y, return TRUE, return FALSE); \
126 #define WordS_mulCheckOverflows(size) \
127 MLTON_CODEGEN_STATIC_INLINE \
128 Bool WordS##size##_mulCheckOverflows (WordS##size x, WordS##size y) { \
129 WordS_mulCheckBody(size, x, y, return TRUE, return FALSE); \
131 #define WordU_mulCheckOverflows(size) \
132 MLTON_CODEGEN_STATIC_INLINE \
133 Bool WordU##size##_mulCheckOverflows (WordU##size x, WordU##size y) { \
134 WordU_mulCheckBody(size, x, y, return TRUE, return FALSE); \
137 #define WordS_negCheckOverflows(size) \
138 MLTON_CODEGEN_STATIC_INLINE \
139 Bool WordS##size##_negCheckOverflows (WordS##size x) { \
140 WordS_negCheckBody(size, x, return TRUE, return FALSE); \
143 #define WordS_subCheckOverflows(size) \
144 MLTON_CODEGEN_STATIC_INLINE \
145 Bool WordS##size##_subCheckOverflows (WordS##size x, WordS##size y) { \
146 WordS_subCheckBody(size, x, y, return TRUE, return FALSE); \
150 WordS_addCheckOverflows(size) \
151 WordU_addCheckOverflows(size) \
152 WordS_mulCheckOverflows(size) \
153 WordU_mulCheckOverflows(size) \
154 WordS_negCheckOverflows(size) \
155 WordS_subCheckOverflows(size)
163 #undef WordS_subCheckOverflows
164 #undef WordS_negCheckOverflows
165 #undef WordU_mulCheckOverflows
166 #undef WordS_mulCheckOverflows
167 #undef WordU_addCheckOverflows
168 #undef WordS_addCheckOverflows