/*Copyright (c) 2012 The Broad Institute *Permission is hereby granted, free of charge, to any person *obtaining a copy of this software and associated documentation *files (the "Software"), to deal in the Software without *restriction, including without limitation the rights to use, *copy, modify, merge, publish, distribute, sublicense, and/or sell *copies of the Software, and to permit persons to whom the *Software is furnished to do so, subject to the following *conditions: *The above copyright notice and this permission notice shall be *included in all copies or substantial portions of the Software. *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES *OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT *HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, *WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef TEMPLATES_H_ #define TEMPLATES_H_ #include "headers.h" #define ALIGNED __attribute__((aligned(32))) #ifdef SIMD_ENGINE_AVX typedef union __attribute__((aligned(32))) { ALIGNED __m256 ALIGNED d; ALIGNED __m128i ALIGNED s[2]; ALIGNED float ALIGNED f[8]; ALIGNED __m256i ALIGNED i; } ALIGNED mix_F ALIGNED; #endif typedef union __attribute__((aligned(32))) { ALIGNED __m128 ALIGNED d; ALIGNED __m64 ALIGNED s[2]; ALIGNED float ALIGNED f[4]; ALIGNED __m128i ALIGNED i; } ALIGNED mix_F128 ALIGNED; typedef union ALIGNED { __m128i vec ; __m128 vecf ; uint32_t masks[4] ; } MaskVec_F ; typedef union ALIGNED { __m64 vec ; __m64 vecf ; uint32_t masks[2] ; } MaskVec_F128 ; typedef union ALIGNED { ALIGNED __m128i ALIGNED i; ALIGNED __m128 ALIGNED f; } ALIGNED IF_128f ALIGNED; typedef union ALIGNED { ALIGNED int ALIGNED i; ALIGNED float ALIGNED f; } ALIGNED IF_32 ALIGNED; #ifdef SIMD_ENGINE_AVX typedef union __attribute__((aligned(32))) { ALIGNED __m256d ALIGNED d; ALIGNED __m128i ALIGNED s[2]; ALIGNED double ALIGNED f[4]; ALIGNED __m256i ALIGNED i; } ALIGNED mix_D ALIGNED; #endif typedef union __attribute__((aligned(32))) { ALIGNED __m128d ALIGNED d; ALIGNED __m64 ALIGNED s[2]; ALIGNED double ALIGNED f[2]; ALIGNED __m128i ALIGNED i; } ALIGNED mix_D128 ALIGNED; typedef union ALIGNED { __m128i vec ; __m128d vecf ; uint64_t masks[2] ; } MaskVec_D ; typedef union ALIGNED { __m64 vec ; __m64 vecf ; uint64_t masks[1] ; } MaskVec_D128 ; typedef union ALIGNED { ALIGNED __m128i ALIGNED i; ALIGNED __m128d ALIGNED f; } ALIGNED IF_128d ALIGNED; typedef union ALIGNED { ALIGNED int64_t ALIGNED i; ALIGNED double ALIGNED f; } ALIGNED IF_64 ALIGNED; #include "common_data_structure.h" #endif