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 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h"
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if EIGEN_ALIGN
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define ALIGNMENT 16
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define ALIGNMENT 1
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid check_handmade_aligned_malloc()
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 1; i < 1000; i++)
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    char *p = (char*)internal::handmade_aligned_malloc(i);
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY(size_t(p)%ALIGNMENT==0);
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int j = 0; j < i; j++) p[j]=0;
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    internal::handmade_aligned_free(p);
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid check_aligned_malloc()
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 1; i < 1000; i++)
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    char *p = (char*)internal::aligned_malloc(i);
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY(size_t(p)%ALIGNMENT==0);
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int j = 0; j < i; j++) p[j]=0;
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    internal::aligned_free(p);
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid check_aligned_new()
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 1; i < 1000; i++)
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    float *p = internal::aligned_new<float>(i);
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY(size_t(p)%ALIGNMENT==0);
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int j = 0; j < i; j++) p[j]=0;
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    internal::aligned_delete(p,i);
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid check_aligned_stack_alloc()
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 1; i < 1000; i++)
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ei_declare_aligned_stack_constructed_variable(float,p,i,0);
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY(size_t(p)%ALIGNMENT==0);
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int j = 0; j < i; j++) p[j]=0;
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// test compilation with both a struct and a class...
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct MyStruct
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  char dummychar;
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Vector4f avec;
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass MyClassA
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    char dummychar;
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Vector4f avec;
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> void check_dynaligned()
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  T* obj = new T;
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(size_t(obj)%ALIGNMENT==0);
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  delete obj;
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_dynalloc()
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // low level dynamic memory allocation
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST(check_handmade_aligned_malloc());
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST(check_aligned_malloc());
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST(check_aligned_new());
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST(check_aligned_stack_alloc());
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for (int i=0; i<g_repeat*100; ++i)
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(check_dynaligned<Vector4f>() );
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(check_dynaligned<Vector2d>() );
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(check_dynaligned<Matrix4f>() );
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(check_dynaligned<Vector4d>() );
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(check_dynaligned<Vector4i>() );
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // check static allocation, who knows ?
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #if EIGEN_ALIGN_STATICALLY
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MyStruct foo0;  VERIFY(size_t(foo0.avec.data())%ALIGNMENT==0);
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MyClassA fooA;  VERIFY(size_t(fooA.avec.data())%ALIGNMENT==0);
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // dynamic allocation, single object
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for (int i=0; i<g_repeat*100; ++i)
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MyStruct *foo0 = new MyStruct();  VERIFY(size_t(foo0->avec.data())%ALIGNMENT==0);
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MyClassA *fooA = new MyClassA();  VERIFY(size_t(fooA->avec.data())%ALIGNMENT==0);
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    delete foo0;
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    delete fooA;
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // dynamic allocation, array
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const int N = 10;
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for (int i=0; i<g_repeat*100; ++i)
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MyStruct *foo0 = new MyStruct[N];  VERIFY(size_t(foo0->avec.data())%ALIGNMENT==0);
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MyClassA *fooA = new MyClassA[N];  VERIFY(size_t(fooA->avec.data())%ALIGNMENT==0);
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    delete[] foo0;
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    delete[] fooA;
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #endif
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
134