#include <stdio.h> #if defined(__clang__) && defined(__aarch64__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ <= 4)) /* Disable test for clang3.4/aarch64 because it cause the following error: ..../lib/clang/3.4/include/arm_neon.h:65:24: error: 'neon_vector_type' attribute is not supported for this target */ int main() { return 0; } #else #if defined(__arm__) || defined(__aarch64__) #include <arm_neon.h> #define SP "sp" #elif defined(__i386__) || defined(__x86_64__) #include <xmmintrin.h> #define SP "esp" typedef __m128 float32x4_t; #elif defined(__mips__) // mipsel64- defines __mips__ too #define SP "sp" typedef float float32x4_t __attribute__ ((__vector_size__ (16))); #elif !defined(__le32__) && !defined(__le64__) #error unknown arch for type float32x4_t #endif #if !defined(__le32__) && !defined(__le64__) class Vector4 { public: inline Vector4(float a, float b, float c, float d); inline Vector4() {} inline float32x4_t Set(float a, float b, float c, float d); private: float32x4_t m_floatVector; } __attribute__((aligned(16))); inline Vector4::Vector4(float a, float b, float c, float d) { m_floatVector = Set(a, b, c, d); } inline float32x4_t Vector4::Set(float a, float b, float c, float d) { float32x4_t value = { a, b, c, d }; return value; } #if 1 Vector4 initVector4(float a, float b, float c, float d) { return Vector4(a, b, c, d); } #else void initVector4(Vector4 *v, float a, float b, float c, float d) { v->Set(a, b, c, d); } #endif float f; Vector4 v; int main() { register void *sp __asm(SP); printf("sp = %p\n", sp); #if 1 v = initVector4(f, f, f, f); #else Vector4 v4; initVector4(&v4, f, f, f, f); v = v4; #endif return 0; } #else // __le32__ || __le64__ int main() { return 0; // Skip this test (Should not assume vector4 type on le32 triple) } #endif #endif