//===- subzero/crosstest/test_vector_ops.h - Test prototypes ----*- C++ -*-===// // // The Subzero Code Generator // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file declares the function prototypes for crosstesting insertelement // and extractelement operations. // //===----------------------------------------------------------------------===// #ifndef TEST_VECTOR_OPS_H #define TEST_VECTOR_OPS_H #include "vectors.h" // The VectorOps<> class acts like Vectors<> but also has insertelement, // Subzero_insertelement, extractelement, Subzero_extractelement, // shufflevector, Subzero_shufflevector, and shufflevector_count fields. template <typename T> struct VectorOps; #define FIELD(TYNAME, FIELDNAME) VectorOps<TYNAME>::FIELDNAME #define TY(TYNAME) FIELD(TYNAME, Ty) #define CASTTY(TYNAME) FIELD(TYNAME, CastTy) #define DECLARE_VECTOR_OPS(NAME) \ template <> struct VectorOps<NAME> : public Vectors<NAME> { \ static Ty (*insertelement)(Ty, CastTy, int32_t); \ static Ty (*shufflevector)(Ty, Ty, uint32_t); \ static CastTy (*extractelement)(Ty, int32_t); \ static Ty (*Subzero_insertelement)(Ty, CastTy, int32_t); \ static Ty (*Subzero_shufflevector)(Ty, Ty, uint32_t); \ static CastTy (*Subzero_extractelement)(Ty, int32_t); \ static uint32_t (*shufflevector_count)(); \ }; \ extern "C" { \ TY(NAME) insertelement_##NAME(TY(NAME), CASTTY(NAME), int32_t); \ TY(NAME) Subzero_insertelement_##NAME(TY(NAME), CASTTY(NAME), int32_t); \ CASTTY(NAME) extractelement_##NAME(TY(NAME), int32_t); \ CASTTY(NAME) Subzero_extractelement_##NAME(TY(NAME), int32_t); \ TY(NAME) shufflevector_##NAME(TY(NAME), TY(NAME), uint32_t); \ TY(NAME) Subzero_shufflevector_##NAME(TY(NAME), TY(NAME), uint32_t); \ uint32_t shufflevector_count_##NAME(); \ } \ TY(NAME) (*FIELD(NAME, insertelement))(TY(NAME), CASTTY(NAME), int32_t) = \ &insertelement_##NAME; \ TY(NAME) (*FIELD(NAME, Subzero_insertelement))( \ TY(NAME), CASTTY(NAME), int32_t) = &Subzero_insertelement_##NAME; \ CASTTY(NAME) (*FIELD(NAME, extractelement))(TY(NAME), int32_t) = \ &extractelement_##NAME; \ CASTTY(NAME) (*FIELD(NAME, Subzero_extractelement))(TY(NAME), int32_t) = \ &Subzero_extractelement_##NAME; \ TY(NAME) (*FIELD(NAME, shufflevector))(TY(NAME), TY(NAME), uint32_t) = \ &shufflevector_##NAME; \ TY(NAME) (*FIELD(NAME, Subzero_shufflevector))( \ TY(NAME), TY(NAME), uint32_t) = &Subzero_shufflevector_##NAME; \ uint32_t (*FIELD(NAME, shufflevector_count))() = &shufflevector_count_##NAME; #define X(ty, eltty, castty) DECLARE_VECTOR_OPS(ty) VECTOR_TYPE_TABLE #undef X #define X(ty, eltty, numelements) DECLARE_VECTOR_OPS(ty) I1_VECTOR_TYPE_TABLE #undef X #endif // TEST_VECTOR_OPS_H