Home | History | Annotate | Download | only in crosstest
      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 // The driver and the test program may be compiled by different
     24 // versions of clang, with different standard libraries that have
     25 // different definitions of int8_t.  Specifically, int8_t may be
     26 // typedef'd as either 'char' or 'signed char', which mangle to
     27 // different strings.  Avoid int8_t and use an explicit myint8_t.
     28 typedef signed char myint8_t;
     29 
     30 #include "vectors.def"
     31 
     32 // PNaCl portable vector types
     33 // Types declared: v4si32, v4ui32, v8si16, v8ui16, v16si8, v16ui8, v4f32
     34 #define X(ty, eltty, castty) typedef eltty ty __attribute__((vector_size(16)));
     35 VECTOR_TYPE_TABLE
     36 #undef X
     37 
     38 // i1 vector types are not native C++ SIMD vector types. Instead, for
     39 // testing, they are expanded by the test code into native 128 bit
     40 // SIMD vector types with the appropriate number of elements.
     41 // Representing the types in Vectors<> requires a unique label for each
     42 // type which this declaration provides.
     43 // Types declared: v4i1, v8i1, v16i1
     44 #define X(ty, expandedty, numelements) class ty;
     45 I1_VECTOR_TYPE_TABLE
     46 #undef X
     47 
     48 namespace {
     49 
     50 template <typename T> struct Vectors;
     51 
     52 // Vectors<T> provides information about a vector type with label T:
     53 // * Vectors<T>::Ty is the C++ vector type
     54 // * Vectors<T>::ElementTy is the C++ element type
     55 // * Vectors<T>::CastTy is a type that is safe to cast elements to and from
     56 //       and is used for getting the representation of elements in ostreams
     57 // * Vectors<T>::NumElements is the number of elements
     58 // * Vectors<T>::TypeName is a string that names the type
     59 
     60 #define DECLARE_VECTOR_TYPE(LABEL, TY, ELTTY, CASTTY, NUM_ELEMENTS)            \
     61   template <> struct Vectors<LABEL> {                                          \
     62     typedef TY Ty;                                                             \
     63     typedef ELTTY ElementTy;                                                   \
     64     typedef CASTTY CastTy;                                                     \
     65     static const size_t NumElements;                                           \
     66     static const char *const TypeName;                                         \
     67   };                                                                           \
     68   const size_t Vectors<LABEL>::NumElements = NUM_ELEMENTS;                     \
     69   const char *const Vectors<LABEL>::TypeName = #LABEL;
     70 
     71 #define X(ty, eltty, castty)                                                   \
     72   DECLARE_VECTOR_TYPE(ty, ty, eltty, castty, (sizeof(ty) / sizeof(eltty)))
     73 VECTOR_TYPE_TABLE
     74 #undef X
     75 
     76 #define X(ty, expandedty, numelements)                                         \
     77   DECLARE_VECTOR_TYPE(ty, expandedty, bool, int64_t, numelements)
     78 I1_VECTOR_TYPE_TABLE
     79 #undef X
     80 
     81 #undef DECLARE_VECTOR_TYPE
     82 
     83 // Return a string representation of the vector.
     84 template <typename T>
     85 std::string vectAsString(const typename Vectors<T>::Ty Vect) {
     86   std::ostringstream OS;
     87   for (size_t i = 0; i < Vectors<T>::NumElements; ++i) {
     88     if (i > 0)
     89       OS << " ";
     90     OS << (typename Vectors<T>::CastTy)Vect[i];
     91   }
     92   return OS.str();
     93 }
     94 
     95 // In some crosstests, test vectors are deterministically constructed by
     96 // selecting elements from a pool of scalar values based on a
     97 // pseudorandom sequence.  Testing all possible combinations of scalar
     98 // values from the value pool is often not tractable.
     99 //
    100 // TODO: Replace with a portable PRNG from C++11.
    101 class PRNG {
    102 public:
    103   explicit PRNG(uint32_t Seed = 1) : State(Seed) {}
    104 
    105   uint32_t operator()() {
    106     // Lewis, Goodman, and Miller (1969)
    107     State = (16807 * State) % 2147483647;
    108     return State;
    109   }
    110 
    111 private:
    112   uint32_t State;
    113 };
    114 
    115 } // end anonymous namespace
    116 
    117 #endif // VECTORS_H
    118