| //===- 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 |