Home | History | Annotate | Download | only in jni
      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