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 */
8int 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"
21typedef __m128 float32x4_t;
22#elif defined(__mips__)  // mipsel64- defines __mips__ too
23#define SP  "sp"
24typedef float float32x4_t __attribute__ ((__vector_size__ (16)));
25#else
26#error unknown arch for type float32x4_t
27#endif
28
29class 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
39inline Vector4::Vector4(float a, float b, float c, float d)
40{
41    m_floatVector = Set(a, b, c, d);
42}
43
44inline 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
51Vector4 initVector4(float a, float b, float c, float d)
52{
53    return Vector4(a, b, c, d);
54}
55#else
56void initVector4(Vector4 *v, float a, float b, float c, float d)
57{
58    v->Set(a, b, c, d);
59}
60#endif
61
62float f;
63Vector4 v;
64
65int 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