Wie zu verwenden MSVC-Interna, um das äquivalent von diesem GCC-code?
Der folgende code ruft die builtin Funktionen für clz/ctz in GCC und, auf anderen Systemen, hat die C-Versionen. Natürlich, die C-Versionen sind ein wenig suboptimal, wenn das system verfügt über einen eingebauten clz/ctz Anleitung, wie 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 zählen, etc, fügen Sie eine richtige ifdef für MSVC hier? Hab ich schon angeschaut auf dieser Seite, aber ich bin mir nicht ganz sicher, was das #pragma ist (ist es nötig?) und welche Einschränkungen bringt es auf MSVC-version die Anforderungen für die Kompilierung. Als jemand, der nicht wirklich verwenden, MSVC, ich weiß auch nicht, ob diese Interna haben C-äquivalente auf anderen Architekturen, oder ob ich zu #ifdef x86/x86_64-auch wenn #zu definieren.
Es ist eine native ausführbare Datei für Windows-Teil der Grund, warum ich Frage ist, dass ich herausgefunden habe, dass es ziemlich schwierig zu finden in der Microsoft-Dokumentation Seiten, die eigentlich darüber reden C in diesen Tagen.
Libcxx Implementierung github.com/llvm-mirror/libcxx/blob/...
InformationsquelleAutor Dark Shikari | 2008-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Prellen von sh0dan code, die Umsetzung sollte korrigiert werden, wie diese :
Als Kommentare im code, die beide ctz und clz sind undefiniert, wenn der Wert 0 ist. In unserer Abstraktion, die wir behoben
__builtin_clz(value)
als(value?__builtin_clz(value):32)
aber es ist eine Wahl, die__builtin_clz()
im MSVC ist__lzcnt()
. Die hardware unterstützen muss, SSE4 obwohl. Mehr info.Meine hardware unterstützt SSE4, aber nicht BMI1, so __lzcnt() kompiliert, aber nicht, was ich erwarten würde, lieber arbeiten als BSR.
31 ^__builtin_clz
gleich_BitScanReverse
Ich denke
unsigned long
häufiger alsDWORD
, ist es nicht?InformationsquelleAutor crazyjul
Wenn MSVC hat ein compiler intrinsic für diese werde es hier:
Compiler-Interna auf der MSDN-Website
Ansonsten haben Sie schreiben mit __asm
InformationsquelleAutor Paul Betts
Getestet auf linux und windows (x86) :
InformationsquelleAutor Tanguy
Gibt es zwei Interna "_BitScanForward" und "_BitScanReverse", die für den gleichen Zweck für MSVC. Gehören . Die Funktionen sind:
Dort sind gleichwertig 64-bit-Versionen "_BitScanForward64" und "_BitScanReverse64".
Lesen Sie hier mehr:
x86-Interna auf der MSDN-Website
InformationsquelleAutor sh0dan