C++程序  |  76行  |  1.37 KB

#include <stdio.h>

#if defined(__arm__)
#include <arm_neon.h>
#define SP  "sp"
#elif defined(__i386__)
#include <xmmintrin.h>
#define SP  "esp"
typedef __m128 float32x4_t;
#elif defined(__mips__)
#define SP  "sp"
typedef float float32x4_t __attribute__ ((__vector_size__ (16)));
#elif !defined(__le32__)
#error unknown arch for type float32x4_t
#endif

#ifndef __le32__
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 int sp __asm(SP);
    printf("sp = %x\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__

int main()
{
    return 0; // Skip this test (Should not assume vector4 type on le32 triple)
}

#endif