blob: 6083a34dc4dddbd90305c8df021f56c28cefb707 [file] [log] [blame]
#include <stdio.h>
#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__)
#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 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__
int main()
{
return 0; // Skip this test (Should not assume vector4 type on le32 triple)
}
#endif