| Index: runtime/platform/globals.h
|
| diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
|
| index f06f04c75c40a3f347c74ac67f1e56933b633625..2d566bbb62f88c1984674c3a325696ffce02b5c7 100644
|
| --- a/runtime/platform/globals.h
|
| +++ b/runtime/platform/globals.h
|
| @@ -72,6 +72,45 @@
|
| #error Automatic target os detection failed.
|
| #endif
|
|
|
| +struct simd128_value_t {
|
| + float storage[4];
|
| + simd128_value_t& readFrom(const float* v) {
|
| + storage[0] = v[0];
|
| + storage[1] = v[1];
|
| + storage[2] = v[2];
|
| + storage[3] = v[3];
|
| + return *this;
|
| + }
|
| + simd128_value_t& readFrom(const uint32_t* v) {
|
| + const float* vv = reinterpret_cast<const float*>(v);
|
| + storage[0] = vv[0];
|
| + storage[1] = vv[1];
|
| + storage[2] = vv[2];
|
| + storage[3] = vv[3];
|
| + return *this;
|
| + }
|
| + simd128_value_t& readFrom(const simd128_value_t* v) {
|
| + *this = *v;
|
| + return *this;
|
| + }
|
| + void writeTo(float* v) {
|
| + v[0] = storage[0];
|
| + v[1] = storage[1];
|
| + v[2] = storage[2];
|
| + v[3] = storage[3];
|
| + }
|
| + void writeTo(uint32_t* v) {
|
| + float* vv = reinterpret_cast<float*>(v);
|
| + vv[0] = storage[0];
|
| + vv[1] = storage[1];
|
| + vv[2] = storage[2];
|
| + vv[3] = storage[3];
|
| + }
|
| + void writeTo(simd128_value_t* v) {
|
| + *v = *this;
|
| + }
|
| +};
|
| +
|
| // Processor architecture detection. For more info on what's defined, see:
|
| // http://msdn.microsoft.com/en-us/library/b0084kay.aspx
|
| // http://www.agner.org/optimize/calling_conventions.pdf
|
| @@ -79,47 +118,23 @@
|
| #if defined(_M_X64) || defined(__x86_64__)
|
| #define HOST_ARCH_X64 1
|
| #define ARCH_IS_64_BIT 1
|
| -#include <xmmintrin.h> // NOLINT
|
| #define kFpuRegisterSize 16
|
| -typedef __m128 fpu_register_t;
|
| -typedef __m128 simd_value_t;
|
| -// Unaligned load.
|
| -#define simd_value_safe_load(addr) \
|
| - _mm_loadu_ps(reinterpret_cast<const float*>(addr))
|
| -// Unaligned store.
|
| -#define simd_value_safe_store(addr, value) \
|
| - _mm_storeu_ps(reinterpret_cast<float*>(addr), value)
|
| +typedef simd128_value_t fpu_register_t;
|
| #elif defined(_M_IX86) || defined(__i386__)
|
| #define HOST_ARCH_IA32 1
|
| #define ARCH_IS_32_BIT 1
|
| -#include <xmmintrin.h> // NOLINT
|
| #define kFpuRegisterSize 16
|
| -typedef __m128 fpu_register_t;
|
| -typedef __m128 simd_value_t;
|
| -// Unaligned load.
|
| -#define simd_value_safe_load(addr) \
|
| - _mm_loadu_ps(reinterpret_cast<const float*>(addr))
|
| -// Unaligned store.
|
| -#define simd_value_safe_store(addr, value) \
|
| - _mm_storeu_ps(reinterpret_cast<float*>(addr), value)
|
| +typedef simd128_value_t fpu_register_t;
|
| #elif defined(__ARMEL__)
|
| #define HOST_ARCH_ARM 1
|
| #define ARCH_IS_32_BIT 1
|
| #define kFpuRegisterSize 8
|
| typedef double fpu_register_t;
|
| -// TODO(johnmccutchan): ARM simd type.
|
| -typedef struct {
|
| - uint32_t data_[4];
|
| -} simd_value_t;
|
| #elif defined(__MIPSEL__)
|
| #define HOST_ARCH_MIPS 1
|
| #define ARCH_IS_32_BIT 1
|
| #define kFpuRegisterSize 8
|
| typedef double fpu_register_t;
|
| -// TODO(johnmccutchan): MIPS simd type.
|
| -typedef struct {
|
| - uint32_t data_[4];
|
| -} simd_value_t;
|
| #else
|
| #error Architecture was not detected as supported by Dart.
|
| #endif
|
| @@ -215,7 +230,7 @@ typedef uintptr_t uword;
|
| const int kWordSize = sizeof(word);
|
| const int kDoubleSize = sizeof(double); // NOLINT
|
| const int kFloatSize = sizeof(float); // NOLINT
|
| -const int kSimd128Size = 16;
|
| +const int kSimd128Size = sizeof(simd128_value_t); // NOLINT
|
| #ifdef ARCH_IS_32_BIT
|
| const int kWordSizeLog2 = 2;
|
| const uword kUwordMax = kMaxUint32;
|
|
|