1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com> 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h" 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// using namespace Eigen; 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> T negate(const T& x) { return -x; } 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> bool isApproxAbs(const Scalar& a, const Scalar& b, const typename NumTraits<Scalar>::Real& refvalue) 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::isMuchSmallerThan(a-b, refvalue); 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> bool areApproxAbs(const Scalar* a, const Scalar* b, int size, const typename NumTraits<Scalar>::Real& refvalue) 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<size; ++i) 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (!isApproxAbs(a[i],b[i],refvalue)) 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "[" << Map<const Matrix<Scalar,1,Dynamic> >(a,size) << "]" << " != " << Map<const Matrix<Scalar,1,Dynamic> >(b,size) << "\n"; 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> bool areApprox(const Scalar* a, const Scalar* b, int size) 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<size; ++i) 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (a[i]!=b[i] && !internal::isApprox(a[i],b[i])) 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "[" << Map<const Matrix<Scalar,1,Dynamic> >(a,size) << "]" << " != " << Map<const Matrix<Scalar,1,Dynamic> >(b,size) << "\n"; 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define CHECK_CWISE2(REFOP, POP) { \ 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) \ 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[i] = REFOP(data1[i], data1[i+PacketSize]); \ 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(data2, POP(internal::pload<Packet>(data1), internal::pload<Packet>(data1+PacketSize))); \ 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, data2, PacketSize) && #POP); \ 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define CHECK_CWISE1(REFOP, POP) { \ 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) \ 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[i] = REFOP(data1[i]); \ 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(data2, POP(internal::pload<Packet>(data1))); \ 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, data2, PacketSize) && #POP); \ 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<bool Cond,typename Packet> 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct packet_helper 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T> 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet load(const T* from) const { return internal::pload<Packet>(from); } 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T> 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void store(T* to, const Packet& x) const { internal::pstore(to,x); } 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Packet> 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct packet_helper<false,Packet> 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T> 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline T load(const T* from) const { return *from; } 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T> 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void store(T* to, const T& x) const { *to = x; } 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define CHECK_CWISE1_IF(COND, REFOP, POP) if(COND) { \ 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath packet_helper<COND,Packet> h; \ 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) \ 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[i] = REFOP(data1[i]); \ 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath h.store(data2, POP(h.load(data1))); \ 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, data2, PacketSize) && #POP); \ 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define REF_ADD(a,b) ((a)+(b)) 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define REF_SUB(a,b) ((a)-(b)) 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define REF_MUL(a,b) ((a)*(b)) 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define REF_DIV(a,b) ((a)/(b)) 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> void packetmath() 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 1027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez using std::abs; 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::packet_traits<Scalar>::type Packet; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int PacketSize = internal::packet_traits<Scalar>::size; 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int size = PacketSize*4; 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Scalar data1[internal::packet_traits<Scalar>::size*4]; 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Scalar data2[internal::packet_traits<Scalar>::size*4]; 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Packet packets[PacketSize*2]; 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Scalar ref[internal::packet_traits<Scalar>::size*4]; 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RealScalar refvalue = 0; 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<size; ++i) 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath data1[i] = internal::random<Scalar>()/RealScalar(PacketSize); 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath data2[i] = internal::random<Scalar>()/RealScalar(PacketSize); 1177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refvalue = (std::max)(refvalue,abs(data1[i])); 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(data2, internal::pload<Packet>(data1)); 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(data1, data2, PacketSize) && "aligned load/store"); 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int offset=0; offset<PacketSize; ++offset) 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(data2, internal::ploadu<Packet>(data1+offset)); 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(data1+offset, data2, PacketSize) && "internal::ploadu"); 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int offset=0; offset<PacketSize; ++offset) 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstoreu(data2+offset, internal::pload<Packet>(data1)); 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(data1, data2+offset, PacketSize) && "internal::pstoreu"); 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int offset=0; offset<PacketSize; ++offset) 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath packets[0] = internal::pload<Packet>(data1); 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath packets[1] = internal::pload<Packet>(data1+PacketSize); 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (offset==0) internal::palign<0>(packets[0], packets[1]); 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (offset==1) internal::palign<1>(packets[0], packets[1]); 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (offset==2) internal::palign<2>(packets[0], packets[1]); 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (offset==3) internal::palign<3>(packets[0], packets[1]); 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(data2, packets[0]); 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[i] = data1[i+offset]; 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, data2, PacketSize) && "internal::palign"); 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_CWISE2(REF_ADD, internal::padd); 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_CWISE2(REF_SUB, internal::psub); 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_CWISE2(REF_MUL, internal::pmul); 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef EIGEN_VECTORIZE_ALTIVEC 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (!internal::is_same<Scalar,int>::value) 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_CWISE2(REF_DIV, internal::pdiv); 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_CWISE1(internal::negate, internal::pnegate); 1597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CHECK_CWISE1(numext::conj, internal::pconj); 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int offset=0;offset<3;++offset) 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[i] = data1[offset]; 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(data2, internal::pset1<Packet>(data1[offset])); 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, data2, PacketSize) && "internal::pset1"); 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(internal::isApprox(data1[0], internal::pfirst(internal::pload<Packet>(data1))) && "internal::pfirst"); 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(PacketSize>1) 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int offset=0;offset<4;++offset) 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i=0;i<PacketSize/2;++i) 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[2*i+0] = ref[2*i+1] = data1[offset+i]; 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(data2,internal::ploaddup<Packet>(data1+offset)); 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, data2, PacketSize) && "ploaddup"); 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[0] = 0; 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[0] += data1[i]; 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(isApproxAbs(ref[0], internal::predux(internal::pload<Packet>(data1)), refvalue) && "internal::predux"); 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[0] = 1; 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[0] *= data1[i]; 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(internal::isApprox(ref[0], internal::predux_mul(internal::pload<Packet>(data1))) && "internal::predux_mul"); 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int j=0; j<PacketSize; ++j) 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[j] = 0; 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[j] += data1[i+j*PacketSize]; 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath packets[j] = internal::pload<Packet>(data1+j*PacketSize); 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(data2, internal::preduxp(packets)); 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApproxAbs(ref, data2, PacketSize, refvalue) && "internal::preduxp"); 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[i] = data1[PacketSize-i-1]; 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(data2, internal::preverse(internal::pload<Packet>(data1))); 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, data2, PacketSize) && "internal::preverse"); 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> void packetmath_real() 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 2107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez using std::abs; 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::packet_traits<Scalar>::type Packet; 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int PacketSize = internal::packet_traits<Scalar>::size; 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int size = PacketSize*4; 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Scalar data1[internal::packet_traits<Scalar>::size*4]; 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Scalar data2[internal::packet_traits<Scalar>::size*4]; 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Scalar ref[internal::packet_traits<Scalar>::size*4]; 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<size; ++i) 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 2217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez data1[i] = internal::random<Scalar>(-1,1) * std::pow(Scalar(10), internal::random<Scalar>(-3,3)); 2227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez data2[i] = internal::random<Scalar>(-1,1) * std::pow(Scalar(10), internal::random<Scalar>(-3,3)); 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 2247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasSin, std::sin, internal::psin); 2257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasCos, std::cos, internal::pcos); 2267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasTan, std::tan, internal::ptan); 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<size; ++i) 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath data1[i] = internal::random<Scalar>(-1,1); 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath data2[i] = internal::random<Scalar>(-1,1); 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 2337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasASin, std::asin, internal::pasin); 2347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasACos, std::acos, internal::pacos); 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<size; ++i) 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath data1[i] = internal::random<Scalar>(-87,88); 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath data2[i] = internal::random<Scalar>(-87,88); 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 2417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasExp, std::exp, internal::pexp); 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<size; ++i) 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 2457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez data1[i] = internal::random<Scalar>(0,1) * std::pow(Scalar(10), internal::random<Scalar>(-6,6)); 2467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez data2[i] = internal::random<Scalar>(0,1) * std::pow(Scalar(10), internal::random<Scalar>(-6,6)); 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 2487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(internal::random<float>(0,1)<0.1) 2497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez data1[internal::random<int>(0, PacketSize)] = 0; 2507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasLog, std::log, internal::plog); 2517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasSqrt, std::sqrt, internal::psqrt); 2527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez} 2537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Scalar> void packetmath_notcomplex() 2557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ 2567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez using std::abs; 2577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef typename internal::packet_traits<Scalar>::type Packet; 2587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez const int PacketSize = internal::packet_traits<Scalar>::size; 2597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_ALIGN16 Scalar data1[internal::packet_traits<Scalar>::size*4]; 2617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_ALIGN16 Scalar data2[internal::packet_traits<Scalar>::size*4]; 2627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_ALIGN16 Scalar ref[internal::packet_traits<Scalar>::size*4]; 2637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Array<Scalar,Dynamic,1>::Map(data1, internal::packet_traits<Scalar>::size*4).setRandom(); 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[0] = data1[0]; 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[0] = (std::min)(ref[0],data1[i]); 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(internal::isApprox(ref[0], internal::predux_min(internal::pload<Packet>(data1))) && "internal::predux_min"); 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_CWISE2((std::min), internal::pmin); 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_CWISE2((std::max), internal::pmax); 2737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CHECK_CWISE1(abs, internal::pabs); 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[0] = data1[0]; 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[0] = (std::max)(ref[0],data1[i]); 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(internal::isApprox(ref[0], internal::predux_max(internal::pload<Packet>(data1))) && "internal::predux_max"); 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<PacketSize; ++i) 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[i] = data1[0]+Scalar(i); 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(data2, internal::plset(data1[0])); 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, data2, PacketSize) && "internal::plset"); 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar,bool ConjLhs,bool ConjRhs> void test_conj_helper(Scalar* data1, Scalar* data2, Scalar* ref, Scalar* pval) 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::packet_traits<Scalar>::type Packet; 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int PacketSize = internal::packet_traits<Scalar>::size; 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::conj_if<ConjLhs> cj0; 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::conj_if<ConjRhs> cj1; 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::conj_helper<Scalar,Scalar,ConjLhs,ConjRhs> cj; 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::conj_helper<Packet,Packet,ConjLhs,ConjRhs> pcj; 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i=0;i<PacketSize;++i) 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[i] = cj0(data1[i]) * cj1(data2[i]); 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(internal::isApprox(ref[i], cj.pmul(data1[i],data2[i])) && "conj_helper pmul"); 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(pval,pcj.pmul(internal::pload<Packet>(data1),internal::pload<Packet>(data2))); 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, pval, PacketSize) && "conj_helper pmul"); 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i=0;i<PacketSize;++i) 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar tmp = ref[i]; 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[i] += cj0(data1[i]) * cj1(data2[i]); 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(internal::isApprox(ref[i], cj.pmadd(data1[i],data2[i],tmp)) && "conj_helper pmadd"); 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(pval,pcj.pmadd(internal::pload<Packet>(data1),internal::pload<Packet>(data2),internal::pload<Packet>(pval))); 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, pval, PacketSize) && "conj_helper pmadd"); 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> void packetmath_complex() 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::packet_traits<Scalar>::type Packet; 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int PacketSize = internal::packet_traits<Scalar>::size; 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int size = PacketSize*4; 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Scalar data1[PacketSize*4]; 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Scalar data2[PacketSize*4]; 322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Scalar ref[PacketSize*4]; 323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_ALIGN16 Scalar pval[PacketSize*4]; 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<size; ++i) 326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath data1[i] = internal::random<Scalar>() * Scalar(1e2); 328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath data2[i] = internal::random<Scalar>() * Scalar(1e2); 329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath test_conj_helper<Scalar,false,false> (data1,data2,ref,pval); 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath test_conj_helper<Scalar,false,true> (data1,data2,ref,pval); 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath test_conj_helper<Scalar,true,false> (data1,data2,ref,pval); 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath test_conj_helper<Scalar,true,true> (data1,data2,ref,pval); 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i=0;i<PacketSize;++i) 338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ref[i] = Scalar(std::imag(data1[i]),std::real(data1[i])); 339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstore(pval,internal::pcplxflip(internal::pload<Packet>(data1))); 340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(areApprox(ref, pval, PacketSize) && "pcplxflip"); 341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_packetmath() 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0; i < g_repeat; i++) { 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1( packetmath<float>() ); 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_2( packetmath<double>() ); 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_3( packetmath<int>() ); 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1( packetmath<std::complex<float> >() ); 353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_2( packetmath<std::complex<double> >() ); 354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 3557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_1( packetmath_notcomplex<float>() ); 3567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_2( packetmath_notcomplex<double>() ); 3577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_3( packetmath_notcomplex<int>() ); 3587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1( packetmath_real<float>() ); 360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_2( packetmath_real<double>() ); 361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1( packetmath_complex<std::complex<float> >() ); 363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_2( packetmath_complex<std::complex<double> >() ); 364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 366