Commit c334a388 authored by Aurelien Jarno's avatar Aurelien Jarno
Browse files

target-i386: SSE4.2: use clz32/ctz32 instead of reinventing the wheel

parent 83f7dc28
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <math.h>
#include "cpu.h"
#include "helper.h"
#include "qemu/host-utils.h"

#if !defined(CONFIG_USER_ONLY)
#include "exec/softmmu_exec.h"
+2 −30
Original line number Diff line number Diff line
@@ -2064,34 +2064,6 @@ static inline unsigned pcmpxstrx(CPUX86State *env, Reg *d, Reg *s,
    return res;
}

static inline int rffs1(unsigned int val)
{
    int ret = 1, hi;

    for (hi = sizeof(val) * 4; hi; hi /= 2) {
        if (val >> hi) {
            val >>= hi;
            ret += hi;
        }
    }

    return ret;
}

static inline int ffs1(unsigned int val)
{
    int ret = 1, hi;

    for (hi = sizeof(val) * 4; hi; hi /= 2) {
        if (val << hi) {
            val <<= hi;
            ret += hi;
        }
    }

    return ret;
}

void glue(helper_pcmpestri, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
                                    uint32_t ctrl)
{
@@ -2100,7 +2072,7 @@ void glue(helper_pcmpestri, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
                                 pcmp_elen(env, R_EAX, ctrl));

    if (res) {
        env->regs[R_ECX] = (ctrl & (1 << 6)) ? rffs1(res) - 1 : 32 - ffs1(res);
        env->regs[R_ECX] = (ctrl & (1 << 6)) ? 31 - clz32(res) : ctz32(res);
    } else {
        env->regs[R_ECX] = 16 >> (ctrl & (1 << 0));
    }
@@ -2138,7 +2110,7 @@ void glue(helper_pcmpistri, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
                                 pcmp_ilen(d, ctrl));

    if (res) {
        env->regs[R_ECX] = (ctrl & (1 << 6)) ? rffs1(res) - 1 : 32 - ffs1(res);
        env->regs[R_ECX] = (ctrl & (1 << 6)) ? 31 - clz32(res) : ctz32(res);
    } else {
        env->regs[R_ECX] = 16 >> (ctrl & (1 << 0));
    }