@@ -44,14 +44,12 @@ typedef uint_fast64_t u64_t;
44
44
#define u32 (x ) ((u32_t)(x))
45
45
#define u64 (x ) ((u64_t)(x))
46
46
47
- struct pair
47
+ struct digit_pair
48
48
{
49
49
char dd [2 ];
50
50
};
51
51
52
- #define cast_to_pair_ptr (b ) ((struct pair*)(void*)(b))
53
-
54
- static const struct pair * digits_dd = (struct pair * )(
52
+ static const struct digit_pair * digits_dd = (struct digit_pair * )(
55
53
"00" "01" "02" "03" "04" "05" "06" "07" "08" "09"
56
54
"10" "11" "12" "13" "14" "15" "16" "17" "18" "19"
57
55
"20" "21" "22" "23" "24" "25" "26" "27" "28" "29"
@@ -64,7 +62,7 @@ static const struct pair *digits_dd = (struct pair *)(
64
62
"90" "91" "92" "93" "94" "95" "96" "97" "98" "99"
65
63
);
66
64
67
- static const struct pair * digits_fd = (struct pair * )(
65
+ static const struct digit_pair * digits_fd = (struct digit_pair * )(
68
66
"0_" "1_" "2_" "3_" "4_" "5_" "6_" "7_" "8_" "9_"
69
67
"10" "11" "12" "13" "14" "15" "16" "17" "18" "19"
70
68
"20" "21" "22" "23" "24" "25" "26" "27" "28" "29"
@@ -81,57 +79,74 @@ static const u64_t mask24 = (u64(1) << 24) - 1;
81
79
static const u64_t mask32 = (u64 (1 ) << 32 ) - 1 ;
82
80
static const u64_t mask57 = (u64 (1 ) << 57 ) - 1 ;
83
81
82
+ #define COPY (buffer , digits ) memcpy(buffer, &(digits), sizeof(struct digit_pair))
83
+
84
84
static char *
85
85
to_text_from_ulong (char * b , u64_t n )
86
86
{
87
87
if (n < u32 (1e2 )) {
88
- * cast_to_pair_ptr ( b ) = digits_fd [n ];
88
+ COPY ( b , digits_fd [n ]) ;
89
89
return n < 10 ? b + 1 : b + 2 ;
90
90
}
91
91
92
92
if (n < u32 (1e6 )) {
93
93
if (n < u32 (1e4 )) {
94
94
u32_t f0 = u32 (10 * (1 << 24 ) / 1e3 + 1 ) * n ;
95
- * cast_to_pair_ptr (b ) = digits_fd [f0 >> 24 ];
95
+ COPY (b , digits_fd [f0 >> 24 ]);
96
+
96
97
b -= n < u32 (1e3 );
97
98
u32_t f2 = (f0 & mask24 ) * 100 ;
98
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 24 ];
99
+ COPY (b + 2 , digits_dd [f2 >> 24 ]);
100
+
99
101
return b + 4 ;
100
102
}
103
+
101
104
u64_t f0 = u64 (10 * (1ull << 32ull )/ 1e5 + 1 ) * n ;
102
- * cast_to_pair_ptr (b ) = digits_fd [f0 >> 32 ];
105
+ COPY (b , digits_fd [f0 >> 32 ]);
106
+
103
107
b -= n < u32 (1e5 );
104
108
u64_t f2 = (f0 & mask32 ) * 100 ;
105
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 32 ];
109
+ COPY (b + 2 , digits_dd [f2 >> 32 ]);
110
+
106
111
u64_t f4 = (f2 & mask32 ) * 100 ;
107
- * cast_to_pair_ptr (b + 4 ) = digits_dd [f4 >> 32 ];
112
+ COPY (b + 4 , digits_dd [f4 >> 32 ]) ;
108
113
return b + 6 ;
109
114
}
110
115
111
116
if (n < u64 (1ull << 32ull )) {
112
117
if (n < u32 (1e8 )) {
113
118
u64_t f0 = u64 (10 * (1ull << 48ull ) / 1e7 + 1 ) * n >> 16 ;
114
- * cast_to_pair_ptr (b ) = digits_fd [f0 >> 32 ];
119
+ COPY (b , digits_fd [f0 >> 32 ]);
120
+
115
121
b -= n < u32 (1e7 );
116
122
u64_t f2 = (f0 & mask32 ) * 100 ;
117
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 32 ];
123
+ COPY (b + 2 , digits_dd [f2 >> 32 ]);
124
+
118
125
u64_t f4 = (f2 & mask32 ) * 100 ;
119
- * cast_to_pair_ptr (b + 4 ) = digits_dd [f4 >> 32 ];
126
+ COPY (b + 4 , digits_dd [f4 >> 32 ]);
127
+
120
128
u64_t f6 = (f4 & mask32 ) * 100 ;
121
- * cast_to_pair_ptr (b + 6 ) = digits_dd [f6 >> 32 ];
129
+ COPY (b + 6 , digits_dd [f6 >> 32 ]);
130
+
122
131
return b + 8 ;
123
132
}
133
+
124
134
u64_t f0 = u64 (10 * (1ull << 57ull ) / 1e9 + 1 ) * n ;
125
- * cast_to_pair_ptr (b ) = digits_fd [f0 >> 57 ];
135
+ COPY (b , digits_fd [f0 >> 57 ]);
136
+
126
137
b -= n < u32 (1e9 );
127
138
u64_t f2 = (f0 & mask57 ) * 100 ;
128
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 57 ];
139
+ COPY (b + 2 , digits_dd [f2 >> 57 ]);
140
+
129
141
u64_t f4 = (f2 & mask57 ) * 100 ;
130
- * cast_to_pair_ptr (b + 4 ) = digits_dd [f4 >> 57 ];
142
+ COPY (b + 4 , digits_dd [f4 >> 57 ]);
143
+
131
144
u64_t f6 = (f4 & mask57 ) * 100 ;
132
- * cast_to_pair_ptr (b + 6 ) = digits_dd [f6 >> 57 ];
145
+ COPY (b + 6 , digits_dd [f6 >> 57 ]);
146
+
133
147
u64_t f8 = (f6 & mask57 ) * 100 ;
134
- * cast_to_pair_ptr (b + 8 ) = digits_dd [f8 >> 57 ];
148
+ COPY (b + 8 , digits_dd [f8 >> 57 ]);
149
+
135
150
return b + 10 ;
136
151
}
137
152
@@ -141,53 +156,64 @@ to_text_from_ulong(char *b, u64_t n)
141
156
142
157
if (u < u32 (1e2 )) {
143
158
// u can't be 1 digit (if u < 10 it would have been handled above as a 9 digit 32bit number)
144
- * cast_to_pair_ptr ( b ) = digits_dd [u ];
159
+ COPY ( b , digits_dd [u ]) ;
145
160
b += 2 ;
146
161
}
147
162
else if (u < u32 (1e6 )) {
148
163
if (u < u32 (1e4 )) {
149
164
u32_t f0 = u32 (10 * (1 << 24 ) / 1e3 + 1 ) * u ;
150
- * cast_to_pair_ptr (b ) = digits_fd [f0 >> 24 ];
165
+ COPY (b , digits_fd [f0 >> 24 ]);
166
+
151
167
b -= u < u32 (1e3 );
152
168
u32_t f2 = (f0 & mask24 ) * 100 ;
153
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 24 ];
169
+ COPY (b + 2 , digits_dd [f2 >> 24 ]) ;
154
170
b += 4 ;
155
171
}
156
172
else {
157
173
u64_t f0 = u64 (10 * (1ull << 32ull ) / 1e5 + 1 ) * u ;
158
- * cast_to_pair_ptr (b ) = digits_fd [f0 >> 32 ];
174
+ COPY (b , digits_fd [f0 >> 32 ]);
175
+
159
176
b -= u < u32 (1e5 );
160
177
u64_t f2 = (f0 & mask32 ) * 100 ;
161
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 32 ];
178
+ COPY (b + 2 , digits_dd [f2 >> 32 ]);
179
+
162
180
u64_t f4 = (f2 & mask32 ) * 100 ;
163
- * cast_to_pair_ptr (b + 4 ) = digits_dd [f4 >> 32 ];
181
+ COPY (b + 4 , digits_dd [f4 >> 32 ]) ;
164
182
b += 6 ;
165
183
}
166
184
}
167
185
else if (u < u32 (1e8 )) {
168
186
u64_t f0 = u64 (10 * (1ull << 48ull ) / 1e7 + 1 ) * u >> 16 ;
169
- * cast_to_pair_ptr (b ) = digits_fd [f0 >> 32 ];
187
+ COPY (b , digits_fd [f0 >> 32 ]);
188
+
170
189
b -= u < u32 (1e7 );
171
190
u64_t f2 = (f0 & mask32 ) * 100 ;
172
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 32 ];
191
+ COPY (b + 2 , digits_dd [f2 >> 32 ]);
192
+
173
193
u64_t f4 = (f2 & mask32 ) * 100 ;
174
- * cast_to_pair_ptr (b + 4 ) = digits_dd [f4 >> 32 ];
194
+ COPY (b + 4 , digits_dd [f4 >> 32 ]);
195
+
175
196
u64_t f6 = (f4 & mask32 ) * 100 ;
176
- * cast_to_pair_ptr (b + 6 ) = digits_dd [f6 >> 32 ];
197
+ COPY (b + 6 , digits_dd [f6 >> 32 ]);
198
+
177
199
b += 8 ;
178
200
}
179
201
else if (u < u64 (1ull << 32ull )) {
180
202
u64_t f0 = u64 (10 * (1ull << 57ull ) / 1e9 + 1 ) * u ;
181
- * cast_to_pair_ptr (b ) = digits_fd [f0 >> 57 ];
203
+ COPY (b , digits_fd [f0 >> 57 ]);
204
+
182
205
b -= u < u32 (1e9 );
183
206
u64_t f2 = (f0 & mask57 ) * 100 ;
184
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 57 ];
207
+ COPY (b + 2 , digits_dd [f2 >> 57 ]);
208
+
185
209
u64_t f4 = (f2 & mask57 ) * 100 ;
186
- * cast_to_pair_ptr (b + 4 ) = digits_dd [f4 >> 57 ];
210
+ COPY (b + 4 , digits_dd [f4 >> 57 ]);
211
+
187
212
u64_t f6 = (f4 & mask57 ) * 100 ;
188
- * cast_to_pair_ptr (b + 6 ) = digits_dd [f6 >> 57 ];
213
+ COPY (b + 6 , digits_dd [f6 >> 57 ]);
214
+
189
215
u64_t f8 = (f6 & mask57 ) * 100 ;
190
- * cast_to_pair_ptr (b + 8 ) = digits_dd [f8 >> 57 ];
216
+ COPY (b + 8 , digits_dd [f8 >> 57 ]) ;
191
217
b += 10 ;
192
218
}
193
219
else {
@@ -196,43 +222,53 @@ to_text_from_ulong(char *b, u64_t n)
196
222
197
223
// u is 2, 3, or 4 digits (if u < 10 it would have been handled above)
198
224
if (u < u32 (1e2 )) {
199
- * cast_to_pair_ptr ( b ) = digits_dd [u ];
225
+ COPY ( b , digits_dd [u ]) ;
200
226
b += 2 ;
201
227
}
202
228
else {
203
229
u32_t f0 = u32 (10 * (1 << 24 ) / 1e3 + 1 ) * u ;
204
- * cast_to_pair_ptr (b ) = digits_fd [f0 >> 24 ];
230
+ COPY (b , digits_fd [f0 >> 24 ]);
231
+
205
232
b -= u < u32 (1e3 );
206
233
u32_t f2 = (f0 & mask24 ) * 100 ;
207
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 24 ];
234
+ COPY (b + 2 , digits_dd [f2 >> 24 ]);
235
+
208
236
b += 4 ;
209
237
}
210
238
// do 8 digits
211
239
u64_t f0 = (u64 ((1ull << 48ull ) / 1e6 + 1 ) * y >> 16 ) + 1 ;
212
- * cast_to_pair_ptr (b ) = digits_dd [f0 >> 32 ];
240
+ COPY (b , digits_dd [f0 >> 32 ]);
241
+
213
242
u64_t f2 = (f0 & mask32 ) * 100 ;
214
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 32 ];
243
+ COPY (b + 2 , digits_dd [f2 >> 32 ]);
244
+
215
245
u64_t f4 = (f2 & mask32 ) * 100 ;
216
- * cast_to_pair_ptr (b + 4 ) = digits_dd [f4 >> 32 ];
246
+ COPY (b + 4 , digits_dd [f4 >> 32 ]);
247
+
217
248
u64_t f6 = (f4 & mask32 ) * 100 ;
218
- * cast_to_pair_ptr (b + 6 ) = digits_dd [f6 >> 32 ];
249
+ COPY (b + 6 , digits_dd [f6 >> 32 ]) ;
219
250
b += 8 ;
220
251
}
252
+
221
253
// do 8 digits
222
254
u64_t f0 = (u64 ((1ull << 48ull ) / 1e6 + 1 ) * z >> 16 ) + 1 ;
223
- * cast_to_pair_ptr (b ) = digits_dd [f0 >> 32 ];
255
+ COPY (b , digits_dd [f0 >> 32 ]);
256
+
224
257
u64_t f2 = (f0 & mask32 ) * 100 ;
225
- * cast_to_pair_ptr (b + 2 ) = digits_dd [f2 >> 32 ];
258
+ COPY (b + 2 , digits_dd [f2 >> 32 ]);
259
+
226
260
u64_t f4 = (f2 & mask32 ) * 100 ;
227
- * cast_to_pair_ptr (b + 4 ) = digits_dd [f4 >> 32 ];
261
+ COPY (b + 4 , digits_dd [f4 >> 32 ]);
262
+
228
263
u64_t f6 = (f4 & mask32 ) * 100 ;
229
- * cast_to_pair_ptr (b + 6 ) = digits_dd [f6 >> 32 ];
264
+ COPY (b + 6 , digits_dd [f6 >> 32 ]);
265
+
230
266
return b + 8 ;
231
267
}
232
268
233
269
#undef u32
234
270
#undef u64
235
- #undef cast_to_pair_ptr
271
+ #undef COPY
236
272
237
273
#pragma clang diagnostic pop
238
274
#pragma GCC diagnostic pop
0 commit comments