2013-04-28 15 views
9

WIN32 üzerinde Visual C++ ile 4 veya daha fazla SSE parametresi olan işlevlerde uzun süredir devam eden bir sorun var, örn.Visual Studio parametre hizalama kısıtlamaları ve Windows x64 ABI

align.c(8) : error C2719: 'm3': formal parameter with __declspec(align('16')) won't be aligned 

fonksiyonu __inline bile hala gereksiz ABI kısıtlama empoze ++ sorun, Visual C bileşik için:

__m128i foo4(__m128i m0, __m128i m1, __m128i m2, __m128i m3) {} 

bir hata üretir.

Bunun 64 bit Windows'ta bir sorun olup olmadığını merak ediyorum. ABI kısıtlaması hala x64'de geçerli mi?

(Ben 64 bit Windows sistemine erişimi olmayan başka türlü kendimi denemek istiyorum ve kapsamlı bir Google arama kesin bir şey çıkmadı etmiştir.)

+1

[Agner Sis "arama kuralları" el (bölüm 7.2)] (http://www.agner.org/optimize/), Windows64 bütün __m128 parametre geçer işaretçi, yani 4 veya daha fazla __m128 parametresi orada bir sorun olmamalıdır. (Bunu kontrol edemiyorum çünkü bir Windows sistemine erişimim yok). –

cevap

7

istediğiniz kadar 128 bit geçebilir SSE intrinsik parametreleri x64 altında istediğiniz gibi. X64 ABI, bu tipler düşünülerek tasarlanmıştır. MSDN documentation kaynaktan

: göre

__m128 types, arrays and strings are never passed by immediate value but rather a pointer is passed to memory allocated by the caller. Structs/unions of size 8, 16, 32, or 64 bits and __m64 are passed as if they were integers of the same size. Structs/unions other than these sizes are passed as a pointer to memory allocated by the caller. For these aggregate types passed as a pointer (including __m128), the caller-allocated temporary memory will be 16-byte aligned.

+0

Teşekkürler - sadece Windows x64'i hedeflemeye başlama zamanı gibi geliyor - x64 yürütülebilir dosyaları oluşturmak ve çalıştırmak için gereken minimum Windows ve Visual Studio sürümünü biliyor musunuz? –

+1

VS2008 Sanırım. XP64 var ama bu oldukça fazla kullanılmamış. Vista 64 muhtemelen mantıklı min seviyesi. –

+0

Teşekkürler - bu büyük bir yardım. –

İlgili konular