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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « crosstest/test_vector_ops_main.cpp ('k') | crosstest/vectors.def » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: crosstest/vectors.h
diff --git a/crosstest/vectors.h b/crosstest/vectors.h
new file mode 100644
index 0000000000000000000000000000000000000000..9924eb504f7237de018269f8e056c4f92c3ac5e2
--- /dev/null
+++ b/crosstest/vectors.h
@@ -0,0 +1,110 @@
+//===- subzero/crosstest/vectors.h - Common SIMD vector utilies -*- C++ -*-===//
+//
+// The Subzero Code Generator
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides declarations for PNaCl portable SIMD vector types. In
+// addition, this file provides utilies that may be useful for crosstesting
+// vector code.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef VECTORS_H
+#define VECTORS_H
+
+#include <stdint.h>
+#include <string>
+#include <sstream>
+
+#include "vectors.def"
+
+// PNaCl portable vector types
+// Types declared: v4si32, v4ui32, v8si16, v8ui16, v16si8, v16ui8, v4f32
+#define X(ty, eltty, castty) typedef eltty ty __attribute__((vector_size(16)));
+VECTOR_TYPE_TABLE
+#undef X
+
+// i1 vector types are not native C++ SIMD vector types. Instead, for
+// testing, they are expanded by the test code into native 128 bit
+// SIMD vector types with the appropriate number of elements.
+// Representing the types in Vectors<> requires a unique label for each
+// type which this declaration provides.
+// Types declared: v4i1, v8i1, v16i1
+#define X(ty, expandedty, numelements) class ty;
+I1_VECTOR_TYPE_TABLE
+#undef X
+
+namespace {
+
+template <typename T> struct Vectors;
+
+// Vectors<T> provides information about a vector type with label T:
+// * Vectors<T>::Ty is the C++ vector type
+// * Vectors<T>::ElementTy is the C++ element type
+// * Vectors<T>::CastTy is a type that is safe to cast elements to and from
+// and is used for getting the representation of elements in ostreams
+// * Vectors<T>::NumElements is the number of elements
+// * Vectors<T>::TypeName is a string that names the type
+
+#define DECLARE_VECTOR_TYPE(LABEL, TY, ELTTY, CASTTY, NUM_ELEMENTS) \
+ template <> struct Vectors<LABEL> { \
+ typedef TY Ty; \
+ typedef ELTTY ElementTy; \
+ typedef CASTTY CastTy; \
+ static const size_t NumElements; \
+ static const char *const TypeName; \
+ }; \
+ const size_t Vectors<LABEL>::NumElements = NUM_ELEMENTS; \
+ const char *const Vectors<LABEL>::TypeName = #LABEL;
+
+#define X(ty, eltty, castty) \
+ DECLARE_VECTOR_TYPE(ty, ty, eltty, castty, (sizeof(ty) / sizeof(eltty)))
+VECTOR_TYPE_TABLE
+#undef X
+
+#define X(ty, expandedty, numelements) \
+ DECLARE_VECTOR_TYPE(ty, expandedty, bool, int64_t, numelements)
+I1_VECTOR_TYPE_TABLE
+#undef X
+
+#undef DECLARE_VECTOR_TYPE
+
+// Return a string representation of the vector.
+template <typename T>
+std::string vectAsString(const typename Vectors<T>::Ty Vect) {
+ std::ostringstream OS;
+ for (size_t i = 0; i < Vectors<T>::NumElements; ++i) {
+ if (i > 0)
+ OS << " ";
+ OS << (typename Vectors<T>::CastTy)Vect[i];
+ }
+ return OS.str();
+}
+
+// In some crosstests, test vectors are deterministically constructed by
+// selecting elements from a pool of scalar values based on a
+// pseudorandom sequence. Testing all possible combinations of scalar
+// values from the value pool is often not tractable.
+//
+// TODO: Replace with a portable PRNG from C++11.
+class PRNG {
+public:
+ PRNG(uint32_t Seed = 1) : State(Seed) {}
+
+ uint32_t operator()() {
+ // Lewis, Goodman, and Miller (1969)
+ State = (16807 * State) % 2147483647;
+ return State;
+ }
+
+private:
+ uint32_t State;
+};
+
+} // end anonymous namespace
+
+#endif // VECTORS_H
« 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