Wie verwende ich MSVC Intrinsics, um das Äquivalent dieses GCC-Codes zu erhalten?

Der folgende Code ruft die integrierten Funktionen für clz / ctz in GCC auf und verfügt auf anderen Systemen über C-Versionen. Offensichtlich sind die C-Versionen etwas suboptimal, wenn das System über einen eingebauten Befehl clz / ctz verfügt, wie z. B. x86 und ARM.

#ifdef __GNUC__
#define clz(x) __builtin_clz(x)
#define ctz(x) __builtin_ctz(x)
#else
static uint32_t ALWAYS_INLINE popcnt( uint32_t x )
{
    x -= ((x >> 1) & 0x55555555);
    x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
    x = (((x >> 4) + x) & 0x0f0f0f0f);
    x += (x >> 8);
    x += (x >> 16);
    return x & 0x0000003f;
}
static uint32_t ALWAYS_INLINE clz( uint32_t x )
{
    x |= (x >> 1);
    x |= (x >> 2);
    x |= (x >> 4);
    x |= (x >> 8);
    x |= (x >> 16);
    return 32 - popcnt(x);
}
static uint32_t ALWAYS_INLINE ctz( uint32_t x )
{
    return popcnt((x & -x) - 1);
}

#endif

Welche Funktionen muss ich aufrufen, welche Header muss ich einbeziehen, usw., um hier eine richtige ifdef für MSVC hinzuzufügen? Ich habe mir schon @ angeschadiese Seit, aber ich bin nicht ganz sicher, wofür das # Pragma gedacht ist (ist es erforderlich?) und welche Einschränkungen es für die Kompilierung der MSVC-Versionsanforderungen auferlegt. Als jemand, der MSVC nicht wirklich verwendet, weiß ich auch nicht, ob diese Intrinsics C-Äquivalente auf anderen Architekturen haben oder ob ich auch x86 / x86_64 #ifdef muss, wenn ich sie #definiere.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage