Revision 603fccce target-ppc/op_helper.h
b/target-ppc/op_helper.h | ||
---|---|---|
75 | 75 |
void do_subfe (void); |
76 | 76 |
void do_subfmeo (void); |
77 | 77 |
void do_subfzeo (void); |
78 |
void do_cntlzw (void); |
|
79 |
#if defined(TARGET_PPC64) |
|
80 |
void do_cntlzd (void); |
|
81 |
#endif |
|
78 | 82 |
void do_sraw (void); |
79 | 83 |
#if defined(TARGET_PPC64) |
80 | 84 |
void do_adde_64 (void); |
... | ... | |
285 | 289 |
void do_evfsctuiz (void); |
286 | 290 |
#endif /* defined(TARGET_PPCEMB) */ |
287 | 291 |
|
288 |
/* Inlined helpers: used in micro-operation as well as helpers */ |
|
289 |
/* Generic fixed-point helpers */ |
|
290 |
static always_inline int _do_cntlzw (uint32_t val) |
|
291 |
{ |
|
292 |
int cnt = 0; |
|
293 |
if (!(val & 0xFFFF0000UL)) { |
|
294 |
cnt += 16; |
|
295 |
val <<= 16; |
|
296 |
} |
|
297 |
if (!(val & 0xFF000000UL)) { |
|
298 |
cnt += 8; |
|
299 |
val <<= 8; |
|
300 |
} |
|
301 |
if (!(val & 0xF0000000UL)) { |
|
302 |
cnt += 4; |
|
303 |
val <<= 4; |
|
304 |
} |
|
305 |
if (!(val & 0xC0000000UL)) { |
|
306 |
cnt += 2; |
|
307 |
val <<= 2; |
|
308 |
} |
|
309 |
if (!(val & 0x80000000UL)) { |
|
310 |
cnt++; |
|
311 |
val <<= 1; |
|
312 |
} |
|
313 |
if (!(val & 0x80000000UL)) { |
|
314 |
cnt++; |
|
315 |
} |
|
316 |
return cnt; |
|
317 |
} |
|
318 |
|
|
319 |
static always_inline int _do_cntlzd (uint64_t val) |
|
320 |
{ |
|
321 |
int cnt = 0; |
|
322 |
#if HOST_LONG_BITS == 64 |
|
323 |
if (!(val & 0xFFFFFFFF00000000ULL)) { |
|
324 |
cnt += 32; |
|
325 |
val <<= 32; |
|
326 |
} |
|
327 |
if (!(val & 0xFFFF000000000000ULL)) { |
|
328 |
cnt += 16; |
|
329 |
val <<= 16; |
|
330 |
} |
|
331 |
if (!(val & 0xFF00000000000000ULL)) { |
|
332 |
cnt += 8; |
|
333 |
val <<= 8; |
|
334 |
} |
|
335 |
if (!(val & 0xF000000000000000ULL)) { |
|
336 |
cnt += 4; |
|
337 |
val <<= 4; |
|
338 |
} |
|
339 |
if (!(val & 0xC000000000000000ULL)) { |
|
340 |
cnt += 2; |
|
341 |
val <<= 2; |
|
342 |
} |
|
343 |
if (!(val & 0x8000000000000000ULL)) { |
|
344 |
cnt++; |
|
345 |
val <<= 1; |
|
346 |
} |
|
347 |
if (!(val & 0x8000000000000000ULL)) { |
|
348 |
cnt++; |
|
349 |
} |
|
350 |
#else |
|
351 |
/* Make it easier on 32 bits host machines */ |
|
352 |
if (!(val >> 32)) |
|
353 |
cnt = _do_cntlzw(val) + 32; |
|
354 |
else |
|
355 |
cnt = _do_cntlzw(val >> 32); |
|
356 |
#endif |
|
357 |
return cnt; |
|
358 |
} |
|
359 |
|
|
360 | 292 |
#if defined(TARGET_PPCEMB) |
361 | 293 |
/* SPE extension */ |
362 | 294 |
/* Single precision floating-point helpers */ |
Also available in: Unified diff