OLD | NEW |
(Empty) | |
| 1 //===- subzero/crosstest/vectors.h - Common SIMD vector utilies -*- C++ -*-===// |
| 2 // |
| 3 // The Subzero Code Generator |
| 4 // |
| 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. |
| 7 // |
| 8 //===----------------------------------------------------------------------===// |
| 9 // |
| 10 // This file provides declarations for PNaCl portable SIMD vector types. In |
| 11 // addition, this file provides utilies that may be useful for crosstesting |
| 12 // vector code. |
| 13 // |
| 14 //===----------------------------------------------------------------------===// |
| 15 |
| 16 #ifndef VECTORS_H |
| 17 #define VECTORS_H |
| 18 |
| 19 #include <stdint.h> |
| 20 #include <string> |
| 21 #include <sstream> |
| 22 |
| 23 #include "vectors.def" |
| 24 |
| 25 // PNaCl portable vector types |
| 26 // Types declared: v4si32, v4ui32, v8si16, v8ui16, v16si8, v16ui8, v4f32 |
| 27 #define X(ty, eltty, castty) typedef eltty ty __attribute__((vector_size(16))); |
| 28 VECTOR_TYPE_TABLE |
| 29 #undef X |
| 30 |
| 31 // i1 vector types are not native C++ SIMD vector types. Instead, for |
| 32 // testing, they are expanded by the test code into native 128 bit |
| 33 // SIMD vector types with the appropriate number of elements. |
| 34 // Representing the types in Vectors<> requires a unique label for each |
| 35 // type which this declaration provides. |
| 36 // Types declared: v4i1, v8i1, v16i1 |
| 37 #define X(ty, expandedty, numelements) class ty; |
| 38 I1_VECTOR_TYPE_TABLE |
| 39 #undef X |
| 40 |
| 41 namespace { |
| 42 |
| 43 template <typename T> struct Vectors; |
| 44 |
| 45 // Vectors<T> provides information about a vector type with label T: |
| 46 // * Vectors<T>::Ty is the C++ vector type |
| 47 // * Vectors<T>::ElementTy is the C++ element type |
| 48 // * Vectors<T>::CastTy is a type that is safe to cast elements to and from |
| 49 // and is used for getting the representation of elements in ostreams |
| 50 // * Vectors<T>::NumElements is the number of elements |
| 51 // * Vectors<T>::TypeName is a string that names the type |
| 52 |
| 53 #define DECLARE_VECTOR_TYPE(LABEL, TY, ELTTY, CASTTY, NUM_ELEMENTS) \ |
| 54 template <> struct Vectors<LABEL> { \ |
| 55 typedef TY Ty; \ |
| 56 typedef ELTTY ElementTy; \ |
| 57 typedef CASTTY CastTy; \ |
| 58 static const size_t NumElements; \ |
| 59 static const char *const TypeName; \ |
| 60 }; \ |
| 61 const size_t Vectors<LABEL>::NumElements = NUM_ELEMENTS; \ |
| 62 const char *const Vectors<LABEL>::TypeName = #LABEL; |
| 63 |
| 64 #define X(ty, eltty, castty) \ |
| 65 DECLARE_VECTOR_TYPE(ty, ty, eltty, castty, (sizeof(ty) / sizeof(eltty))) |
| 66 VECTOR_TYPE_TABLE |
| 67 #undef X |
| 68 |
| 69 #define X(ty, expandedty, numelements) \ |
| 70 DECLARE_VECTOR_TYPE(ty, expandedty, bool, int64_t, numelements) |
| 71 I1_VECTOR_TYPE_TABLE |
| 72 #undef X |
| 73 |
| 74 #undef DECLARE_VECTOR_TYPE |
| 75 |
| 76 // Return a string representation of the vector. |
| 77 template <typename T> |
| 78 std::string vectAsString(const typename Vectors<T>::Ty Vect) { |
| 79 std::ostringstream OS; |
| 80 for (size_t i = 0; i < Vectors<T>::NumElements; ++i) { |
| 81 if (i > 0) |
| 82 OS << " "; |
| 83 OS << (typename Vectors<T>::CastTy)Vect[i]; |
| 84 } |
| 85 return OS.str(); |
| 86 } |
| 87 |
| 88 // In some crosstests, test vectors are deterministically constructed by |
| 89 // selecting elements from a pool of scalar values based on a |
| 90 // pseudorandom sequence. Testing all possible combinations of scalar |
| 91 // values from the value pool is often not tractable. |
| 92 // |
| 93 // TODO: Replace with a portable PRNG from C++11. |
| 94 class PRNG { |
| 95 public: |
| 96 PRNG(uint32_t Seed = 1) : State(Seed) {} |
| 97 |
| 98 uint32_t operator()() { |
| 99 // Lewis, Goodman, and Miller (1969) |
| 100 State = (16807 * State) % 2147483647; |
| 101 return State; |
| 102 } |
| 103 |
| 104 private: |
| 105 uint32_t State; |
| 106 }; |
| 107 |
| 108 } // end anonymous namespace |
| 109 |
| 110 #endif // VECTORS_H |
OLD | NEW |