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