1 #include <stdio.h> 2 3 #if defined(__clang__) && defined(__aarch64__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ <= 4)) 4 /* Disable test for clang3.4/aarch64 because it cause the following error: 5 ..../lib/clang/3.4/include/arm_neon.h:65:24: error: 'neon_vector_type' attribute is not 6 supported for this target 7 */ 8 int main() 9 { 10 return 0; 11 } 12 13 #else 14 15 #if defined(__arm__) || defined(__aarch64__) 16 #include <arm_neon.h> 17 #define SP "sp" 18 #elif defined(__i386__) || defined(__x86_64__) 19 #include <xmmintrin.h> 20 #define SP "esp" 21 typedef __m128 float32x4_t; 22 #elif defined(__mips__) // mipsel64- defines __mips__ too 23 #define SP "sp" 24 typedef float float32x4_t __attribute__ ((__vector_size__ (16))); 25 #else 26 #error unknown arch for type float32x4_t 27 #endif 28 29 class Vector4 30 { 31 public: 32 inline Vector4(float a, float b, float c, float d); 33 inline Vector4() {} 34 inline float32x4_t Set(float a, float b, float c, float d); 35 private: 36 float32x4_t m_floatVector; 37 } __attribute__((aligned(16))); 38 39 inline Vector4::Vector4(float a, float b, float c, float d) 40 { 41 m_floatVector = Set(a, b, c, d); 42 } 43 44 inline float32x4_t Vector4::Set(float a, float b, float c, float d) 45 { 46 float32x4_t value = { a, b, c, d }; 47 return value; 48 } 49 50 #if 1 51 Vector4 initVector4(float a, float b, float c, float d) 52 { 53 return Vector4(a, b, c, d); 54 } 55 #else 56 void initVector4(Vector4 *v, float a, float b, float c, float d) 57 { 58 v->Set(a, b, c, d); 59 } 60 #endif 61 62 float f; 63 Vector4 v; 64 65 int main() 66 { 67 register void *sp __asm(SP); 68 printf("sp = %p\n", sp); 69 #if 1 70 v = initVector4(f, f, f, f); 71 #else 72 Vector4 v4; 73 initVector4(&v4, f, f, f, f); 74 v = v4; 75 #endif 76 return 0; 77 } 78 79 #endif 80