Revision 603fccce target-alpha/op_helper.c
b/target-alpha/op_helper.c | ||
---|---|---|
19 | 19 |
*/ |
20 | 20 |
|
21 | 21 |
#include "exec.h" |
22 |
#include "host-utils.h" |
|
22 | 23 |
#include "softfloat.h" |
23 | 24 |
|
24 | 25 |
#include "op_helper.h" |
... | ... | |
211 | 212 |
|
212 | 213 |
void helper_ctpop (void) |
213 | 214 |
{ |
214 |
int n; |
|
215 |
|
|
216 |
for (n = 0; T0 != 0; n++) |
|
217 |
T0 = T0 ^ (T0 - 1); |
|
218 |
T0 = n; |
|
215 |
T0 = ctpop64(T0); |
|
219 | 216 |
} |
220 | 217 |
|
221 | 218 |
void helper_ctlz (void) |
222 | 219 |
{ |
223 |
uint32_t op32; |
|
224 |
int n; |
|
225 |
|
|
226 |
n = 0; |
|
227 |
if (!(T0 & 0xFFFFFFFF00000000ULL)) { |
|
228 |
n += 32; |
|
229 |
T0 <<= 32; |
|
230 |
} |
|
231 |
/* Make it easier for 32 bits hosts */ |
|
232 |
op32 = T0 >> 32; |
|
233 |
if (!(op32 & 0xFFFF0000UL)) { |
|
234 |
n += 16; |
|
235 |
op32 <<= 16; |
|
236 |
} |
|
237 |
if (!(op32 & 0xFF000000UL)) { |
|
238 |
n += 8; |
|
239 |
op32 <<= 8; |
|
240 |
} |
|
241 |
if (!(op32 & 0xF0000000UL)) { |
|
242 |
n += 4; |
|
243 |
op32 <<= 4; |
|
244 |
} |
|
245 |
if (!(op32 & 0xC0000000UL)) { |
|
246 |
n += 2; |
|
247 |
op32 <<= 2; |
|
248 |
} |
|
249 |
if (!(op32 & 0x80000000UL)) { |
|
250 |
n++; |
|
251 |
op32 <<= 1; |
|
252 |
} |
|
253 |
if (!(op32 & 0x80000000UL)) { |
|
254 |
n++; |
|
255 |
} |
|
256 |
T0 = n; |
|
220 |
T0 = clz64(T0); |
|
257 | 221 |
} |
258 | 222 |
|
259 | 223 |
void helper_cttz (void) |
260 | 224 |
{ |
261 |
uint32_t op32; |
|
262 |
int n; |
|
263 |
|
|
264 |
n = 0; |
|
265 |
if (!(T0 & 0x00000000FFFFFFFFULL)) { |
|
266 |
n += 32; |
|
267 |
T0 >>= 32; |
|
268 |
} |
|
269 |
/* Make it easier for 32 bits hosts */ |
|
270 |
op32 = T0; |
|
271 |
if (!(op32 & 0x0000FFFFUL)) { |
|
272 |
n += 16; |
|
273 |
op32 >>= 16; |
|
274 |
} |
|
275 |
if (!(op32 & 0x000000FFUL)) { |
|
276 |
n += 8; |
|
277 |
op32 >>= 8; |
|
278 |
} |
|
279 |
if (!(op32 & 0x0000000FUL)) { |
|
280 |
n += 4; |
|
281 |
op32 >>= 4; |
|
282 |
} |
|
283 |
if (!(op32 & 0x00000003UL)) { |
|
284 |
n += 2; |
|
285 |
op32 >>= 2; |
|
286 |
} |
|
287 |
if (!(op32 & 0x00000001UL)) { |
|
288 |
n++; |
|
289 |
op32 >>= 1; |
|
290 |
} |
|
291 |
if (!(op32 & 0x00000001UL)) { |
|
292 |
n++; |
|
293 |
} |
|
294 |
T0 = n; |
|
225 |
T0 = ctz64(T0); |
|
295 | 226 |
} |
296 | 227 |
|
297 | 228 |
static always_inline uint64_t byte_zap (uint64_t op, uint8_t mskb) |
Also available in: Unified diff