Aşağıdaki kod GCC'de clz/ctz yerleşik işlevlerini ve diğer sistemlerde de C sürümlerini çağırır. Açıkçası, C sürümleri, sistem x86 ve ARM gibi bir yerleşik clz/ctz komutuna sahipse, biraz yetersizdir.Bu GCC kodunun eşdeğerini almak için MSVC intrinsics nasıl kullanılır?
#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
hangi işlevleri hangi başlıklar burada MSVC için uygun bir ifdef eklemek vb dahil etmek gerekiyor, çağırmak gerekiyor? Zaten this page baktım, ama #pragma için ne (tamamen gerekli) ve derleme için MSVC sürümü gereksinimleri koyar ne kısıtlamaları tam olarak emin değilim. MSVC'yi gerçekten kullanmayan birisi olarak, bu içsellerin diğer mimarilerde C eşdeğerlerine sahip olup olmadıklarını veya #defining x86/x86_64 kodlarımda #fdef olup olmadığını da bilmiyorum. MSVC bunun için içsel bir derleyici varsa
Yukarıdaki bakınız sayfa .NET için veya yerel bir Windows çalıştırılabilir olarak program oluşturmak için çalışıyoruz, .NET çalışma zamanı parçası olan bir işleve karşılık gelir ? –
Bu yerel bir Windows yürütülebilir - soruyorum nedeni aslında bu günlerde C hakkında konuşmak Microsoft belge sayfaları bulmak oldukça zor buldum. –
Libcxx uygulaması https://github.com/llvm-mirror/libcxx/blob/9dcbb46826fd4d29b1485f25e8986d36019a6dca/include/support/win32/support.h#L106-L182 – KindDragon