blob: 6f7b721675e5eb4996fb4f1e795b25d8ac60a3c8 [file] [log] [blame]
Benoit Jacob3958e7f2008-12-31 00:05:22 +00001// This file is part of Eigen, a lightweight C++ template library
Benoit Jacob6347b1d2009-05-22 20:25:33 +02002// for linear algebra.
Benoit Jacob3958e7f2008-12-31 00:05:22 +00003//
4// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
5//
Benoit Jacob69124cf2012-07-13 14:42:47 -04006// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
Benoit Jacob3958e7f2008-12-31 00:05:22 +00009
10#include "main.h"
11
Gael Guennebaud2606abe2014-04-18 21:14:40 +020012typedef Matrix<float,8,1> Vector8f;
13
Benoit Jacobd4157782009-10-05 10:11:11 -040014struct TestNew1
Benoit Jacob3958e7f2008-12-31 00:05:22 +000015{
16 MatrixXd m; // good: m will allocate its own array, taking care of alignment.
Benoit Jacobd4157782009-10-05 10:11:11 -040017 TestNew1() : m(20,20) {}
Benoit Jacob3958e7f2008-12-31 00:05:22 +000018};
19
Benoit Jacobd4157782009-10-05 10:11:11 -040020struct TestNew2
Benoit Jacob3958e7f2008-12-31 00:05:22 +000021{
Benoit Jacobd4157782009-10-05 10:11:11 -040022 Matrix3d m; // good: m's size isn't a multiple of 16 bytes, so m doesn't have to be 16-byte aligned,
23 // 8-byte alignment is good enough here, which we'll get automatically
Benoit Jacob3958e7f2008-12-31 00:05:22 +000024};
25
Benoit Jacobd4157782009-10-05 10:11:11 -040026struct TestNew3
Benoit Jacob3958e7f2008-12-31 00:05:22 +000027{
Benoit Jacobd4157782009-10-05 10:11:11 -040028 Vector2f m; // good: m's size isn't a multiple of 16 bytes, so m doesn't have to be 16-byte aligned
Benoit Jacob3958e7f2008-12-31 00:05:22 +000029};
30
Benoit Jacobd4157782009-10-05 10:11:11 -040031struct TestNew4
Benoit Jacob3958e7f2008-12-31 00:05:22 +000032{
Benoit Jacobeb7dcbb2009-01-08 15:37:13 +000033 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Benoit Jacob3958e7f2008-12-31 00:05:22 +000034 Vector2d m;
35 float f; // make the struct have sizeof%16!=0 to make it a little more tricky when we allow an array of 2 such objects
36};
37
Benoit Jacobd4157782009-10-05 10:11:11 -040038struct TestNew5
Benoit Jacob3958e7f2008-12-31 00:05:22 +000039{
Benoit Jacobeb7dcbb2009-01-08 15:37:13 +000040 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Benoit Jacobd4157782009-10-05 10:11:11 -040041 float f; // try the f at first -- the EIGEN_ALIGN16 attribute of m should make that still work
Benoit Jacob3958e7f2008-12-31 00:05:22 +000042 Matrix4f m;
43};
44
Benoit Jacobd4157782009-10-05 10:11:11 -040045struct TestNew6
Benoit Jacob15ca6652009-01-04 15:26:32 +000046{
Benoit Jacob2db43422009-01-06 18:07:16 +000047 Matrix<float,2,2,DontAlign> m; // good: no alignment requested
Benoit Jacob15ca6652009-01-04 15:26:32 +000048 float f;
49};
50
Benoit Jacob1c29d702009-01-06 03:16:50 +000051template<bool Align> struct Depends
52{
Benoit Jacobeb7dcbb2009-01-08 15:37:13 +000053 EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(Align)
Benoit Jacob1c29d702009-01-06 03:16:50 +000054 Vector2d m;
55 float f;
56};
57
Benoit Jacob3958e7f2008-12-31 00:05:22 +000058template<typename T>
59void check_unalignedassert_good()
60{
61 T *x, *y;
62 x = new T;
63 delete x;
64 y = new T[2];
65 delete[] y;
66}
67
Benoit Jacob2bd31d32010-03-06 09:05:15 -050068#if EIGEN_ALIGN_STATICALLY
Benoit Jacob3958e7f2008-12-31 00:05:22 +000069template<typename T>
Benoit Jacobd4157782009-10-05 10:11:11 -040070void construct_at_boundary(int boundary)
Benoit Jacob3958e7f2008-12-31 00:05:22 +000071{
Benoit Jacobd4157782009-10-05 10:11:11 -040072 char buf[sizeof(T)+256];
73 size_t _buf = reinterpret_cast<size_t>(buf);
Gael Guennebaud2606abe2014-04-18 21:14:40 +020074 _buf += (EIGEN_ALIGN_BYTES - (_buf % EIGEN_ALIGN_BYTES)); // make 16/32-byte aligned
Benoit Jacobd4157782009-10-05 10:11:11 -040075 _buf += boundary; // make exact boundary-aligned
76 T *x = ::new(reinterpret_cast<void*>(_buf)) T;
Benoit Jacob46a9cac2009-12-14 23:31:00 -050077 x[0].setZero(); // just in order to silence warnings
Benoit Jacob3958e7f2008-12-31 00:05:22 +000078 x->~T();
79}
Benoit Jacobf81479d2009-02-04 16:55:38 +000080#endif
Benoit Jacob3958e7f2008-12-31 00:05:22 +000081
82void unalignedassert()
83{
Gael Guennebaud1330f8b2015-03-13 21:15:50 +010084#if EIGEN_ALIGN_STATICALLY
Benoit Jacobbb1cc0d2009-10-05 10:55:42 -040085 construct_at_boundary<Vector2f>(4);
Benoit Jacobd4157782009-10-05 10:11:11 -040086 construct_at_boundary<Vector3f>(4);
87 construct_at_boundary<Vector4f>(16);
88 construct_at_boundary<Matrix2f>(16);
89 construct_at_boundary<Matrix3f>(4);
Gael Guennebaud2606abe2014-04-18 21:14:40 +020090 construct_at_boundary<Matrix4f>(EIGEN_ALIGN_BYTES);
Gael Guennebaud2049f742009-10-13 08:53:01 +020091
Benoit Jacobd4157782009-10-05 10:11:11 -040092 construct_at_boundary<Vector2d>(16);
Benoit Jacobbb1cc0d2009-10-05 10:55:42 -040093 construct_at_boundary<Vector3d>(4);
Gael Guennebaud2606abe2014-04-18 21:14:40 +020094 construct_at_boundary<Vector4d>(EIGEN_ALIGN_BYTES);
95 construct_at_boundary<Matrix2d>(EIGEN_ALIGN_BYTES);
Benoit Jacobbb1cc0d2009-10-05 10:55:42 -040096 construct_at_boundary<Matrix3d>(4);
Gael Guennebaud2606abe2014-04-18 21:14:40 +020097 construct_at_boundary<Matrix4d>(EIGEN_ALIGN_BYTES);
Gael Guennebaud2049f742009-10-13 08:53:01 +020098
Benoit Jacobbb1cc0d2009-10-05 10:55:42 -040099 construct_at_boundary<Vector2cf>(16);
100 construct_at_boundary<Vector3cf>(4);
Gael Guennebaud2606abe2014-04-18 21:14:40 +0200101 construct_at_boundary<Vector2cd>(EIGEN_ALIGN_BYTES);
Benoit Jacobbb1cc0d2009-10-05 10:55:42 -0400102 construct_at_boundary<Vector3cd>(16);
Gael Guennebaud1330f8b2015-03-13 21:15:50 +0100103#endif
Gael Guennebaud2049f742009-10-13 08:53:01 +0200104
Benoit Jacobd4157782009-10-05 10:11:11 -0400105 check_unalignedassert_good<TestNew1>();
106 check_unalignedassert_good<TestNew2>();
107 check_unalignedassert_good<TestNew3>();
Benoit Jacobf81479d2009-02-04 16:55:38 +0000108
Benoit Jacobd4157782009-10-05 10:11:11 -0400109 check_unalignedassert_good<TestNew4>();
110 check_unalignedassert_good<TestNew5>();
111 check_unalignedassert_good<TestNew6>();
Benoit Jacob1c29d702009-01-06 03:16:50 +0000112 check_unalignedassert_good<Depends<true> >();
Gael Guennebaud2049f742009-10-13 08:53:01 +0200113
Benoit Jacob2bd31d32010-03-06 09:05:15 -0500114#if EIGEN_ALIGN_STATICALLY
Gael Guennebaud1330f8b2015-03-13 21:15:50 +0100115 if(EIGEN_ALIGN_BYTES>=16)
Gael Guennebaud2606abe2014-04-18 21:14:40 +0200116 {
117 VERIFY_RAISES_ASSERT(construct_at_boundary<Vector4f>(8));
118 VERIFY_RAISES_ASSERT(construct_at_boundary<Vector2d>(8));
119 VERIFY_RAISES_ASSERT(construct_at_boundary<Vector2cf>(8));
Gael Guennebaud1330f8b2015-03-13 21:15:50 +0100120 VERIFY_RAISES_ASSERT(construct_at_boundary<Vector4i>(8));
Gael Guennebaud2606abe2014-04-18 21:14:40 +0200121 }
122 for(int b=8; b<EIGEN_ALIGN_BYTES; b+=8)
123 {
124 VERIFY_RAISES_ASSERT(construct_at_boundary<Vector8f>(b));
125 VERIFY_RAISES_ASSERT(construct_at_boundary<Matrix4f>(b));
126 VERIFY_RAISES_ASSERT(construct_at_boundary<Vector4d>(b));
127 VERIFY_RAISES_ASSERT(construct_at_boundary<Matrix2d>(b));
128 VERIFY_RAISES_ASSERT(construct_at_boundary<Matrix4d>(b));
129 VERIFY_RAISES_ASSERT(construct_at_boundary<Vector2cd>(b));
130 }
Benoit Jacobf81479d2009-02-04 16:55:38 +0000131#endif
Benoit Jacob3958e7f2008-12-31 00:05:22 +0000132}
133
134void test_unalignedassert()
135{
136 CALL_SUBTEST(unalignedassert());
137}