blob: 8bbda1c9402944c21b158a9c9e8074bc05bfe2ef [file] [log] [blame]
Gael Guennebaudf52d1192008-09-03 00:32:56 +00001// This file is part of Eigen, a lightweight C++ template library
Benoit Jacob6347b1d2009-05-22 20:25:33 +02002// for linear algebra.
Gael Guennebaudf52d1192008-09-03 00:32:56 +00003//
Gael Guennebaud28e64b02010-06-24 23:21:58 +02004// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
Gael Guennebaudf52d1192008-09-03 00:32:56 +00005//
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/.
Gael Guennebaudf52d1192008-09-03 00:32:56 +00009
10#include "main.h"
11
Benoit Jacob95bda5e2009-05-03 13:50:56 +000012#if EIGEN_ALIGN
Benoit Jacob93a089a2009-02-04 16:53:03 +000013#define ALIGNMENT 16
14#else
15#define ALIGNMENT 1
16#endif
17
Benoit Jacobfd831d52009-01-09 14:56:44 +000018void check_handmade_aligned_malloc()
19{
20 for(int i = 1; i < 1000; i++)
21 {
Benoit Jacob47160402010-10-25 10:15:22 -040022 char *p = (char*)internal::handmade_aligned_malloc(i);
Benoit Jacob93a089a2009-02-04 16:53:03 +000023 VERIFY(size_t(p)%ALIGNMENT==0);
Benoit Jacobfd831d52009-01-09 14:56:44 +000024 // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
25 for(int j = 0; j < i; j++) p[j]=0;
Benoit Jacob47160402010-10-25 10:15:22 -040026 internal::handmade_aligned_free(p);
Benoit Jacobfd831d52009-01-09 14:56:44 +000027 }
28}
29
30void check_aligned_malloc()
31{
32 for(int i = 1; i < 1000; i++)
33 {
Benoit Jacob47160402010-10-25 10:15:22 -040034 char *p = (char*)internal::aligned_malloc(i);
Benoit Jacob93a089a2009-02-04 16:53:03 +000035 VERIFY(size_t(p)%ALIGNMENT==0);
Benoit Jacobfd831d52009-01-09 14:56:44 +000036 // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
37 for(int j = 0; j < i; j++) p[j]=0;
Benoit Jacob47160402010-10-25 10:15:22 -040038 internal::aligned_free(p);
Benoit Jacobfd831d52009-01-09 14:56:44 +000039 }
40}
41
42void check_aligned_new()
43{
44 for(int i = 1; i < 1000; i++)
45 {
Benoit Jacob47160402010-10-25 10:15:22 -040046 float *p = internal::aligned_new<float>(i);
Benoit Jacob93a089a2009-02-04 16:53:03 +000047 VERIFY(size_t(p)%ALIGNMENT==0);
Benoit Jacobfd831d52009-01-09 14:56:44 +000048 // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
49 for(int j = 0; j < i; j++) p[j]=0;
Benoit Jacob47160402010-10-25 10:15:22 -040050 internal::aligned_delete(p,i);
Benoit Jacobfd831d52009-01-09 14:56:44 +000051 }
52}
53
54void check_aligned_stack_alloc()
55{
56 for(int i = 1; i < 1000; i++)
57 {
Gael Guennebaudbbb4b352011-03-19 08:51:38 +010058 ei_declare_aligned_stack_constructed_variable(float,p,i,0);
Benoit Jacob93a089a2009-02-04 16:53:03 +000059 VERIFY(size_t(p)%ALIGNMENT==0);
Benoit Jacobfd831d52009-01-09 14:56:44 +000060 // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
61 for(int j = 0; j < i; j++) p[j]=0;
Benoit Jacobfd831d52009-01-09 14:56:44 +000062 }
63}
64
65
Gael Guennebaudf52d1192008-09-03 00:32:56 +000066// test compilation with both a struct and a class...
Benoit Jacob1d52bd42009-01-08 15:20:21 +000067struct MyStruct
Gael Guennebaudf52d1192008-09-03 00:32:56 +000068{
Benoit Jacobeb7dcbb2009-01-08 15:37:13 +000069 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Gael Guennebaudf52d1192008-09-03 00:32:56 +000070 char dummychar;
71 Vector4f avec;
72};
73
Benoit Jacob1d52bd42009-01-08 15:20:21 +000074class MyClassA
Gael Guennebaudf52d1192008-09-03 00:32:56 +000075{
76 public:
Benoit Jacobeb7dcbb2009-01-08 15:37:13 +000077 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Gael Guennebaudf52d1192008-09-03 00:32:56 +000078 char dummychar;
79 Vector4f avec;
80};
81
82template<typename T> void check_dynaligned()
83{
84 T* obj = new T;
Gael Guennebaudb74c0a42013-01-24 11:42:04 +010085 VERIFY(T::NeedsToAlign==1);
Benoit Jacob93a089a2009-02-04 16:53:03 +000086 VERIFY(size_t(obj)%ALIGNMENT==0);
Gael Guennebaudf52d1192008-09-03 00:32:56 +000087 delete obj;
88}
89
90void test_dynalloc()
91{
Benoit Jacobfd831d52009-01-09 14:56:44 +000092 // low level dynamic memory allocation
93 CALL_SUBTEST(check_handmade_aligned_malloc());
94 CALL_SUBTEST(check_aligned_malloc());
95 CALL_SUBTEST(check_aligned_new());
96 CALL_SUBTEST(check_aligned_stack_alloc());
Gael Guennebaudf52d1192008-09-03 00:32:56 +000097
Gael Guennebaudf52d1192008-09-03 00:32:56 +000098 for (int i=0; i<g_repeat*100; ++i)
99 {
Benoit Jacob2840ac72009-10-28 18:19:29 -0400100 CALL_SUBTEST(check_dynaligned<Vector4f>() );
101 CALL_SUBTEST(check_dynaligned<Vector2d>() );
102 CALL_SUBTEST(check_dynaligned<Matrix4f>() );
103 CALL_SUBTEST(check_dynaligned<Vector4d>() );
104 CALL_SUBTEST(check_dynaligned<Vector4i>() );
Gael Guennebaudf52d1192008-09-03 00:32:56 +0000105 }
106
107 // check static allocation, who knows ?
Gael Guennebaud23594862011-03-15 09:53:23 +0100108 #if EIGEN_ALIGN_STATICALLY
Gael Guennebaudf52d1192008-09-03 00:32:56 +0000109 {
Benoit Jacob93a089a2009-02-04 16:53:03 +0000110 MyStruct foo0; VERIFY(size_t(foo0.avec.data())%ALIGNMENT==0);
111 MyClassA fooA; VERIFY(size_t(fooA.avec.data())%ALIGNMENT==0);
Gael Guennebaudf52d1192008-09-03 00:32:56 +0000112 }
Gael Guennebaud23594862011-03-15 09:53:23 +0100113
Gael Guennebaudf52d1192008-09-03 00:32:56 +0000114 // dynamic allocation, single object
115 for (int i=0; i<g_repeat*100; ++i)
116 {
Benoit Jacob93a089a2009-02-04 16:53:03 +0000117 MyStruct *foo0 = new MyStruct(); VERIFY(size_t(foo0->avec.data())%ALIGNMENT==0);
118 MyClassA *fooA = new MyClassA(); VERIFY(size_t(fooA->avec.data())%ALIGNMENT==0);
Gael Guennebaudf52d1192008-09-03 00:32:56 +0000119 delete foo0;
120 delete fooA;
Gael Guennebaudf52d1192008-09-03 00:32:56 +0000121 }
122
123 // dynamic allocation, array
124 const int N = 10;
125 for (int i=0; i<g_repeat*100; ++i)
126 {
Benoit Jacob93a089a2009-02-04 16:53:03 +0000127 MyStruct *foo0 = new MyStruct[N]; VERIFY(size_t(foo0->avec.data())%ALIGNMENT==0);
128 MyClassA *fooA = new MyClassA[N]; VERIFY(size_t(fooA->avec.data())%ALIGNMENT==0);
Gael Guennebaudf52d1192008-09-03 00:32:56 +0000129 delete[] foo0;
130 delete[] fooA;
Gael Guennebaudf52d1192008-09-03 00:32:56 +0000131 }
Gael Guennebaud23594862011-03-15 09:53:23 +0100132 #endif
Gael Guennebaudf52d1192008-09-03 00:32:56 +0000133
Gael Guennebaudf52d1192008-09-03 00:32:56 +0000134}