Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(779)

Side by Side Diff: crosstest/vectors.h

Issue 407543003: Factor out common vector crosstesting code. (Closed) Base URL: https://gerrit.chromium.org/gerrit/p/native_client/pnacl-subzero.git@master
Patch Set: Add missing include guard #endif comment Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « crosstest/test_vector_ops_main.cpp ('k') | crosstest/vectors.def » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « crosstest/test_vector_ops_main.cpp ('k') | crosstest/vectors.def » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698