/* This file is part of the Vc library. Copyright (C) 2011-2012 Matthias Kretz Vc is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Vc is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Vc. If not, see . */ #ifndef VC_AVX_HELPERIMPL_H #define VC_AVX_HELPERIMPL_H #include "macros.h" namespace ROOT { namespace Vc { namespace Internal { template<> struct HelperImpl { typedef AVX::Vector float_v; typedef AVX::Vector sfloat_v; typedef AVX::Vector double_v; typedef AVX::Vector int_v; typedef AVX::Vector uint_v; typedef AVX::Vector short_v; typedef AVX::Vector ushort_v; template static void deinterleave(float_v &, float_v &, const float *, A); template static void deinterleave(float_v &, float_v &, const short *, A); template static void deinterleave(float_v &, float_v &, const unsigned short *, A); template static void deinterleave(sfloat_v &, sfloat_v &, const MemT *, A); template static void deinterleave(double_v &, double_v &, const double *, A); template static void deinterleave(int_v &, int_v &, const int *, A); template static void deinterleave(int_v &, int_v &, const short *, A); template static void deinterleave(uint_v &, uint_v &, const unsigned int *, A); template static void deinterleave(uint_v &, uint_v &, const unsigned short *, A); template static void deinterleave(short_v &, short_v &, const short *, A); template static void deinterleave(ushort_v &, ushort_v &, const unsigned short *, A); template static Vc_ALWAYS_INLINE_L void deinterleave(V &VC_RESTRICT a, V &VC_RESTRICT b, V &VC_RESTRICT c, const M *VC_RESTRICT memory, A align) Vc_ALWAYS_INLINE_R; template static Vc_ALWAYS_INLINE_L void deinterleave(V &VC_RESTRICT a, V &VC_RESTRICT b, V &VC_RESTRICT c, V &VC_RESTRICT d, const M *VC_RESTRICT memory, A align) Vc_ALWAYS_INLINE_R; template static Vc_ALWAYS_INLINE_L void deinterleave(V &VC_RESTRICT a, V &VC_RESTRICT b, V &VC_RESTRICT c, V &VC_RESTRICT d, V &VC_RESTRICT e, const M *VC_RESTRICT memory, A align) Vc_ALWAYS_INLINE_R; template static Vc_ALWAYS_INLINE_L void deinterleave(V &VC_RESTRICT a, V &VC_RESTRICT b, V &VC_RESTRICT c, V &VC_RESTRICT d, V &VC_RESTRICT e, V &VC_RESTRICT f, const M *VC_RESTRICT memory, A align) Vc_ALWAYS_INLINE_R; template static Vc_ALWAYS_INLINE_L void deinterleave(V &VC_RESTRICT a, V &VC_RESTRICT b, V &VC_RESTRICT c, V &VC_RESTRICT d, V &VC_RESTRICT e, V &VC_RESTRICT f, V &VC_RESTRICT g, V &VC_RESTRICT h, const M *VC_RESTRICT memory, A align) Vc_ALWAYS_INLINE_R; static Vc_ALWAYS_INLINE_L void prefetchForOneRead(const void *addr) Vc_ALWAYS_INLINE_R; static Vc_ALWAYS_INLINE_L void prefetchForModify(const void *addr) Vc_ALWAYS_INLINE_R; static Vc_ALWAYS_INLINE_L void prefetchClose(const void *addr) Vc_ALWAYS_INLINE_R; static Vc_ALWAYS_INLINE_L void prefetchMid(const void *addr) Vc_ALWAYS_INLINE_R; static Vc_ALWAYS_INLINE_L void prefetchFar(const void *addr) Vc_ALWAYS_INLINE_R; template static Vc_ALWAYS_INLINE_L void *malloc(size_t n) Vc_ALWAYS_INLINE_R; static Vc_ALWAYS_INLINE_L void free(void *p) Vc_ALWAYS_INLINE_R; }; } // namespace Internal } // namespace Vc } // namespace ROOT #include "deinterleave.tcc" #include "prefetches.tcc" #include "helperimpl.tcc" #include "undomacros.h" #endif // VC_AVX_HELPERIMPL_H