/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* real and int are pretty much similar, so we use a template function with
* additional function pointers for the actual load/store calls.
*/
-template <typename T, typename TSimd, int simdWidth> void
-loadStoreTester(TSimd gmx_simdcall loadFn(const T* mem), void gmx_simdcall storeFn(T* mem, TSimd),
- const int loadOffset, const int storeOffset)
+template<typename T, typename TSimd, int simdWidth>
+void loadStoreTester(TSimd gmx_simdcall loadFn(const T* mem),
+ void gmx_simdcall storeFn(T* mem, TSimd),
+ const int loadOffset,
+ const int storeOffset)
{
/* We need simdWidth storage in the first place, another simdWidth elements
* so we can create (deliberately) offset un-aligned pointers, and finally
* simdWidth elements at the beginning and end
* to test we are not polluting memory there either. Sum=4*simdWidth.
*/
- alignas(GMX_SIMD_ALIGNMENT) T src[simdWidth*4];
- alignas(GMX_SIMD_ALIGNMENT) T dst[simdWidth*4];
+ alignas(GMX_SIMD_ALIGNMENT) T src[simdWidth * 4];
+ alignas(GMX_SIMD_ALIGNMENT) T dst[simdWidth * 4];
// Make sure we have memory to check both before and after the test pointers
- T * pCopySrc = src + simdWidth + loadOffset;
- T * pCopyDst = dst + simdWidth + storeOffset;
- int i;
+ T* pCopySrc = src + simdWidth + loadOffset;
+ T* pCopyDst = dst + simdWidth + storeOffset;
+ int i;
- for (i = 0; i < simdWidth*4; i++)
+ for (i = 0; i < simdWidth * 4; i++)
{
- src[i] = 1+i;
- dst[i] = -1-i;
+ src[i] = 1 + i;
+ dst[i] = -1 - i;
}
storeFn(pCopyDst, loadFn(pCopySrc));
for (i = 0; i < simdWidth; i++)
{
- EXPECT_EQ(pCopySrc[i], pCopyDst[i]) << "SIMD load or store not moving data correctly for element " << i;
+ EXPECT_EQ(pCopySrc[i], pCopyDst[i])
+ << "SIMD load or store not moving data correctly for element " << i;
}
- for (i = 0; i < simdWidth*4; i++)
+ for (i = 0; i < simdWidth * 4; i++)
{
- EXPECT_EQ(src[i], (T)(1+i)) << "Side effect on source memory, i = " << i;
- if (dst+i < pCopyDst || dst+i >= pCopyDst+simdWidth)
+ EXPECT_EQ(src[i], (T)(1 + i)) << "Side effect on source memory, i = " << i;
+ if (dst + i < pCopyDst || dst + i >= pCopyDst + simdWidth)
{
- EXPECT_EQ(dst[i], (T)(-1-i)) << "Side effect on destination memory, i = " << i;
+ EXPECT_EQ(dst[i], (T)(-1 - i)) << "Side effect on destination memory, i = " << i;
}
}
}
* \tparam TSimd Corresponding SIMD type
* \param m Memory address to load from
*/
-template <typename T, typename TSimd> TSimd gmx_simdcall
-loadWrapper(const T * m) { return load<TSimd>(m); }
+template<typename T, typename TSimd>
+TSimd gmx_simdcall loadWrapper(const T* m)
+{
+ return load<TSimd>(m);
+}
/*! \brief Wrapper to handle proxy objects returned by some loadU functions.
*
* \tparam TSimd Corresponding SIMD type
* \param m Memory address to load from
*/
-template <typename T, typename TSimd> TSimd gmx_simdcall
-loadUWrapper(const T * m) { return loadU<TSimd>(m); }
+template<typename T, typename TSimd>
+TSimd gmx_simdcall loadUWrapper(const T* m)
+{
+ return loadU<TSimd>(m);
+}
-#if GMX_SIMD_HAVE_REAL
+# if GMX_SIMD_HAVE_REAL
TEST(SimdBootstrapTest, loadStore)
{
loadStoreTester<real, SimdReal, GMX_SIMD_REAL_WIDTH>(loadWrapper, store, 0, 0);
}
-# if GMX_SIMD_HAVE_LOADU
+# if GMX_SIMD_HAVE_LOADU
TEST(SimdBootstrapTest, loadU)
{
for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
loadStoreTester<real, SimdReal, GMX_SIMD_REAL_WIDTH>(loadUWrapper, store, i, 0);
}
}
-# endif // GMX_SIMD_HAVE_LOADU
+# endif // GMX_SIMD_HAVE_LOADU
-# if GMX_SIMD_HAVE_STOREU
+# if GMX_SIMD_HAVE_STOREU
TEST(SimdBootstrapTest, storeU)
{
for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
loadStoreTester<real, SimdReal, GMX_SIMD_REAL_WIDTH>(loadWrapper, storeU, 0, i);
}
}
-# endif // GMX_SIMD_HAVE_STOREU
+# endif // GMX_SIMD_HAVE_STOREU
// Tests for SimdInt32 load & store operations
TEST(SimdBootstrapTest, loadStoreI)
loadStoreTester<int, SimdInt32, GMX_SIMD_REAL_WIDTH>(loadWrapper, store, 0, 0);
}
-# if GMX_SIMD_HAVE_LOADU
+# if GMX_SIMD_HAVE_LOADU
TEST(SimdBootstrapTest, loadUI)
{
for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
loadStoreTester<int, SimdInt32, GMX_SIMD_REAL_WIDTH>(loadUWrapper, store, i, 0);
}
}
-# endif // GMX_SIMD_HAVE_LOADU
+# endif // GMX_SIMD_HAVE_LOADU
-# if GMX_SIMD_HAVE_STOREU
+# if GMX_SIMD_HAVE_STOREU
TEST(SimdBootstrapTest, storeUI)
{
for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
loadStoreTester<int, SimdInt32, GMX_SIMD_REAL_WIDTH>(loadWrapper, storeU, 0, i);
}
}
-# endif // GMX_SIMD_HAVE_STOREU
-#endif // GMX_SIMD_HAVE_REAL
+# endif // GMX_SIMD_HAVE_STOREU
+# endif // GMX_SIMD_HAVE_REAL
-#if GMX_SIMD4_HAVE_REAL
+# if GMX_SIMD4_HAVE_REAL
TEST(SimdBootstrapTest, simd4LoadStore)
{
loadStoreTester<real, Simd4Real, GMX_SIMD4_WIDTH>(load4, store4, 0, 0);
}
-# if GMX_SIMD_HAVE_LOADU
+# if GMX_SIMD_HAVE_LOADU
TEST(SimdBootstrapTest, simd4LoadU)
{
for (int i = 0; i < GMX_SIMD4_WIDTH; i++)
loadStoreTester<real, Simd4Real, GMX_SIMD4_WIDTH>(load4U, store4, i, 0);
}
}
-# endif // GMX_SIMD_HAVE_LOADU
+# endif // GMX_SIMD_HAVE_LOADU
-# if GMX_SIMD_HAVE_STOREU
+# if GMX_SIMD_HAVE_STOREU
TEST(SimdBootstrapTest, simd4StoreU)
{
for (int i = 0; i < GMX_SIMD4_WIDTH; i++)
loadStoreTester<real, Simd4Real, GMX_SIMD4_WIDTH>(load4, store4U, 0, i);
}
}
-# endif // GMX_SIMD_HAVE_STOREU
-#endif // GMX_SIMD4_HAVE_REAL
+# endif // GMX_SIMD_HAVE_STOREU
+# endif // GMX_SIMD4_HAVE_REAL
/*! \} */
/*! \endcond */
-} // namespace
+} // namespace
-} // namespace test
+} // namespace test
-} // namespace gmx
+} // namespace gmx
#endif // GMX_SIMD