1
1
#include "atlas_misc.h"
4
int FAx=0, MAx=0, FAy=0, MAy=0;
12
struct FA_allocs *next;
15
struct FA_allocs *NewAlloc(size_t size, struct FA_allocs *next,
16
int align, int misalign)
18
* Allocates size allocation that is aligned to [align], but not aligned
19
* to [misalign]. Therefore, misalign > align. Align must minimally be sizeof
20
* while misalign may be 0 if we don't need to avoid a particular alignment.
27
const int malign = align >= misalign ? align : misalign;
29
n = size + align + malign;
33
cp = malloc(n + sizeof(struct FA_allocs));
35
ap = (struct FA_allocs *) (cp + n);
38
* Align to min alignment
40
ap->memA = align ? (void*) ((((size_t) cp)/align)*align + align) : cp;
42
* Misalign to misalign
46
if (((size_t)ap->memA)%misalign == 0)
47
ap->memA = ((char*)ap->memA) + align;
54
* no-align malloc free retaining system default behavior
56
void *NA_malloc(size_t size)
60
void *NA_calloc(size_t n, size_t size)
62
return(calloc(n, size));
64
void NA_free(void *ptr)
71
* malloc/free pair that aligns data to align, but not to misalign
73
void *FA_malloc(size_t size, int align, int misalign)
75
if ((!misalign && align <= 8) || !size)
79
allocQ = NewAlloc(size, allocQ, align, misalign);
83
void *FA_calloc(size_t n, size_t size, int align, int misalign)
91
cp = FA_malloc(tsize, align, misalign);
92
if (size == sizeof(int))
93
for (ip=(int*)cp,i=0; i < n; i++)
95
else if (size == sizeof(double))
96
for (dp=(double*)cp,i=0; i < n; i++)
99
for (i=0; i < tsize; i++)
104
void FA_free(void *ptr, int align, int misalign)
106
* Part of malloc/free pair that aligns data to FALIGN
109
struct FA_allocs *ap, *prev;
112
if ((!misalign && align <= 8))
116
for (ap=allocQ; ap && ap->memA != ptr; ap = ap->next) prev = ap;
119
fprintf(stderr, "Couldn't find mem=%ld\nmemQ=\n", ptr);
120
for (ap=allocQ; ap; ap = ap->next)
121
fprintf(stderr, " %ld, %ld\n", ap->memA, ap->mem);
125
allocQ = allocQ->next;
127
prev->next = ap->next;
4
133
#define dumb_seed(iseed_) srand(iseed_)
5
134
#ifndef RAND_MAX /* rather dangerous non-ansi workaround */
6
135
#define RAND_MAX ((unsigned long)(1<<30))
236
static TYPE *dupvec(int npad, int N, TYPE *X, int incX)
365
static TYPE *dupvec(int npad, int N, TYPE *X, int incX, int FA, int MA)
241
370
incX = Mabs(incX);
242
371
n = 1+(N-1)*incX + 2*npad;
243
y = malloc(ATL_sizeof*n);
372
y = FA_malloc(ATL_sizeof*n, FA, MA);
252
381
static TYPE *gen_dupvec(int N, TYPE padval, int npadX, TYPE *X, int incX,
382
int npadY, int incY, int FA, int MA)
256
385
TYPE *y, *yy, *xx=X+(npadX SHIFT);
258
y = getvec(npadY, padval, N, incY);
387
y = getvec(npadY, padval, N, incY, FA, MA);
259
388
yy = y + (npadY SHIFT);
260
389
if (incY < 1) yy -= ((N-1)SHIFT) * incY;
261
390
if (incX < 1) xx -= ((N-1)SHIFT) * incX;
275
404
TYPE *alpha = alpha0;
278
Yg = getvec(npad, padval, N, incY);
279
Yt = dupvec(npad, N, Yg, incY);
407
Yg = getvec(npad, padval, N, incY, FAy, MAy);
408
Yt = dupvec(npad, N, Yg, incY, FAy, MAy);
281
410
y = Yg + (npad SHIFT);
282
411
if (incY < 1) y -= ((N-1)SHIFT) * incY;
285
414
if (incY < 1) y -= ((N-1)SHIFT) * incY;
286
415
TEST_SET(N, alpha, Yt+(npad SHIFT), incY);
287
416
iret = CheckY(npad, padval, N, Yg, incY, Yt, incY);
417
FA_free(Yg, FAx, MAx);
418
FA_free(Yt, FAy, MAy);
292
421
int DoAllTests(int nN, int *Ns, int nX, int *Xs, int nY, int *Ys,