Skip to content

Commit

Permalink
Save 1200 bytes of object code. Do not pass structs by value whenever
Browse files Browse the repository at this point in the history
practical, because the calling protocol generates clumsy code.
matteo-frigo committed Sep 21, 2002
1 parent 8dbaef7 commit 2008afb
Showing 41 changed files with 384 additions and 378 deletions.
12 changes: 6 additions & 6 deletions dft/buffered.c
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@
*
*/

/* $Id: buffered.c,v 1.30 2002-09-18 21:16:16 athena Exp $ */
/* $Id: buffered.c,v 1.31 2002-09-21 21:47:35 athena Exp $ */

#include "dft.h"

@@ -169,8 +169,8 @@ static int applicable0(const problem *p_, const S *ego, const planner *plnr)
* If the problem is in place, the input/output strides must
* be the same or the whole thing must fit in the buffer.
*/
return ((X(tensor_inplace_strides)(p->sz) &&
X(tensor_inplace_strides)(p->vecsz))
return ((X(tensor_inplace_strides)(&p->sz) &&
X(tensor_inplace_strides)(&p->vecsz))
|| (compute_nbuf(d[0].n, p->vecsz.dims[0].n, ego)
== p->vecsz.dims[0].n));
}
@@ -217,8 +217,8 @@ static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr)
if (!applicable(p_, ego, plnr))
goto nada;

n = X(tensor_sz)(p->sz);
vl = X(tensor_sz)(p->vecsz);
n = X(tensor_sz)(&p->sz);
vl = X(tensor_sz)(&p->vecsz);

nbuf = compute_nbuf(n, vl, ego);
A(nbuf > 0);
@@ -282,7 +282,7 @@ static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr)
/* plan the leftover transforms (cldrest): */
cldp =
X(mkproblem_dft_d)(
X(tensor_copy)(p->sz),
X(tensor_copy)(&p->sz),
X(mktensor_1d)(vl % nbuf, ivs, ovs),
p->ri, p->ii, p->ro, p->io);
cldrest = MKPLAN(plnr, cldp);
10 changes: 5 additions & 5 deletions dft/ct.c
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@
*
*/

/* $Id: ct.c,v 1.23 2002-09-16 02:30:26 stevenj Exp $ */
/* $Id: ct.c,v 1.24 2002-09-21 21:47:35 athena Exp $ */

/* generic Cooley-Tukey routines */
#include "dft.h"
@@ -152,8 +152,8 @@ problem *X(dft_mkcld_dit)(const solver_ct *ego, const problem_dft *p)
uint m = d[0].n / e->radix;

tensor radix = X(mktensor_1d)(e->radix, d[0].is, m * d[0].os);
tensor cld_vec = X(tensor_append)(radix, p->vecsz);
X(tensor_destroy)(radix);
tensor cld_vec = X(tensor_append)(&radix, &p->vecsz);
X(tensor_destroy)(&radix);

return X(mkproblem_dft_d)(X(mktensor_1d)(m, e->radix * d[0].is, d[0].os),
cld_vec, p->ri, p->ii, p->ro, p->io);
@@ -166,8 +166,8 @@ problem *X(dft_mkcld_dif)(const solver_ct *ego, const problem_dft *p)
uint m = d[0].n / e->radix;

tensor radix = X(mktensor_1d)(e->radix, m * d[0].is, d[0].os);
tensor cld_vec = X(tensor_append)(radix, p->vecsz);
X(tensor_destroy)(radix);
tensor cld_vec = X(tensor_append)(&radix, &p->vecsz);
X(tensor_destroy)(&radix);

return X(mkproblem_dft_d)(X(mktensor_1d)(m, d[0].is, e->radix * d[0].os),
cld_vec, p->ri, p->ii, p->ro, p->io);
6 changes: 3 additions & 3 deletions dft/direct.c
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@
*
*/

/* $Id: direct.c,v 1.25 2002-09-18 21:16:16 athena Exp $ */
/* $Id: direct.c,v 1.26 2002-09-21 21:47:35 athena Exp $ */

/* direct DFT solver, if we have a codelet */

@@ -98,8 +98,8 @@ static int applicable(const solver *ego_, const problem *p_,
|| p->vecsz.rnk == 0

/* can operate in-place as long as strides are the same */
|| (X(tensor_inplace_strides)(p->sz) &&
X(tensor_inplace_strides)(p->vecsz))
|| (X(tensor_inplace_strides)(&p->sz) &&
X(tensor_inplace_strides)(&p->vecsz))
)
);
}
24 changes: 12 additions & 12 deletions dft/indirect.c
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@
*
*/

/* $Id: indirect.c,v 1.25 2002-09-18 21:16:16 athena Exp $ */
/* $Id: indirect.c,v 1.26 2002-09-21 21:47:35 athena Exp $ */


/* solvers/plans for vectors of small DFT's that cannot be done
@@ -67,8 +67,8 @@ static void apply_before(plan *ego_, R *ri, R *ii, R *ro, R *io)
static problem *mkcld_before(const problem_dft *p)
{
tensor v, s;
v = X(tensor_copy_inplace)(p->vecsz, INPLACE_OS);
s = X(tensor_copy_inplace)(p->sz, INPLACE_OS);
v = X(tensor_copy_inplace)(&p->vecsz, INPLACE_OS);
s = X(tensor_copy_inplace)(&p->sz, INPLACE_OS);
return X(mkproblem_dft_d)(s, v, p->ro, p->io, p->ro, p->io);
}

@@ -97,8 +97,8 @@ static void apply_after(plan *ego_, R *ri, R *ii, R *ro, R *io)
static problem *mkcld_after(const problem_dft *p)
{
tensor v, s;
v = X(tensor_copy_inplace)(p->vecsz, INPLACE_IS);
s = X(tensor_copy_inplace)(p->sz, INPLACE_IS);
v = X(tensor_copy_inplace)(&p->vecsz, INPLACE_IS);
s = X(tensor_copy_inplace)(&p->sz, INPLACE_IS);
return X(mkproblem_dft_d)(s, v, p->ri, p->ii, p->ri, p->ii);
}

@@ -147,21 +147,21 @@ static int applicable0(const solver *ego_, const problem *p_,
/* problem must be in-place & require some
rearrangement of the data */
|| (p->ri == p->ro
&& !(X(tensor_inplace_strides)(p->sz)
&& X(tensor_inplace_strides)(p->vecsz)))
&& !(X(tensor_inplace_strides)(&p->sz)
&& X(tensor_inplace_strides)(&p->vecsz)))

/* or problem must be out of place, transforming
from stride 1/2 to bigger stride, for apply_after */
|| (p->ri != p->ro && ego->adt->apply == apply_after
&& DESTROY_INPUTP(plnr)
&& X(tensor_min_istride)(p->sz) <= 2
&& X(tensor_min_ostride)(p->sz) > 2)
&& X(tensor_min_istride)(&p->sz) <= 2
&& X(tensor_min_ostride)(&p->sz) > 2)

/* or problem must be out of place, transforming
to stride 1/2 from bigger stride, for apply_before */
|| (p->ri != p->ro && ego->adt->apply == apply_before
&& X(tensor_min_ostride)(p->sz) <= 2
&& X(tensor_min_istride)(p->sz) > 2)
&& X(tensor_min_ostride)(&p->sz) <= 2
&& X(tensor_min_istride)(&p->sz) > 2)
)
);
}
@@ -198,7 +198,7 @@ static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr)
plnr->planner_flags |= NO_BUFFERING;

cldp = X(mkproblem_dft_d)(X(mktensor)(0),
X(tensor_append)(p->vecsz, p->sz),
X(tensor_append)(&p->vecsz, &p->sz),
p->ri, p->ii, p->ro, p->io);
cldcpy = MKPLAN(plnr, cldp);
X(problem_destroy)(cldp);
4 changes: 2 additions & 2 deletions dft/nop.c
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@
*
*/

/* $Id: nop.c,v 1.9 2002-09-18 21:16:16 athena Exp $ */
/* $Id: nop.c,v 1.10 2002-09-21 21:47:35 athena Exp $ */

/* plans for vrank -infty DFTs (nothing to do) */

@@ -47,7 +47,7 @@ static int applicable(const solver *ego_, const problem *p_)
&& p->sz.rnk == 0
&& FINITE_RNK(p->vecsz.rnk)
&& p->ro == p->ri
&& X(tensor_inplace_strides)(p->vecsz)
&& X(tensor_inplace_strides)(&p->vecsz)
);
}
return 0;
22 changes: 11 additions & 11 deletions dft/problem.c
Original file line number Diff line number Diff line change
@@ -18,16 +18,16 @@
*
*/

/* $Id: problem.c,v 1.20 2002-09-09 14:14:22 athena Exp $ */
/* $Id: problem.c,v 1.21 2002-09-21 21:47:35 athena Exp $ */

#include "dft.h"
#include <stddef.h>

static void destroy(problem *ego_)
{
problem_dft *ego = (problem_dft *) ego_;
X(tensor_destroy)(ego->vecsz);
X(tensor_destroy)(ego->sz);
X(tensor_destroy)(&ego->vecsz);
X(tensor_destroy)(&ego->sz);
X(free)(ego_);
}

@@ -40,8 +40,8 @@ static void hash(const problem *p_, md5 *m)
X(md5ptrdiff)(m, p->io - p->ro);
X(md5uint)(m, X(alignment_of)(p->ri));
X(md5uint)(m, X(alignment_of)(p->ro));
X(tensor_md5)(m, p->sz);
X(tensor_md5)(m, p->vecsz);
X(tensor_md5)(m, &p->sz);
X(tensor_md5)(m, &p->vecsz);
}

static void print(problem *ego_, printer *p)
@@ -59,9 +59,9 @@ static void print(problem *ego_, printer *p)
static void zero(const problem *ego_)
{
const problem_dft *ego = (const problem_dft *) ego_;
tensor sz = X(tensor_append)(ego->vecsz, ego->sz);
tensor sz = X(tensor_append)(&ego->vecsz, &ego->sz);
X(dft_zerotens)(sz, ego->ri, ego->ii);
X(tensor_destroy)(sz);
X(tensor_destroy)(&sz);
}

static const problem_adt padt =
@@ -86,8 +86,8 @@ problem *X(mkproblem_dft)(const tensor sz, const tensor vecsz,
/* both in place or both out of place */
CK((ri == ro) == (ii == io));

ego->sz = X(tensor_compress)(sz);
ego->vecsz = X(tensor_compress_contiguous)(vecsz);
ego->sz = X(tensor_compress)(&sz);
ego->vecsz = X(tensor_compress_contiguous)(&vecsz);
ego->ri = ri;
ego->ii = ii;
ego->ro = ro;
@@ -103,7 +103,7 @@ problem *X(mkproblem_dft_d)(tensor sz, tensor vecsz,
{
problem *p;
p = X(mkproblem_dft)(sz, vecsz, ri, ii, ro, io);
X(tensor_destroy)(vecsz);
X(tensor_destroy)(sz);
X(tensor_destroy)(&vecsz);
X(tensor_destroy)(&sz);
return p;
}
42 changes: 21 additions & 21 deletions dft/rank-geq2.c
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@
*
*/

/* $Id: rank-geq2.c,v 1.23 2002-09-18 21:16:16 athena Exp $ */
/* $Id: rank-geq2.c,v 1.24 2002-09-21 21:47:35 athena Exp $ */

/* plans for DFT of rank >= 2 (multidimensional) */

@@ -76,13 +76,13 @@ static void print(plan *ego_, printer *p)
s->spltrnk, ego->cld1, ego->cld2);
}

static int picksplit(const S *ego, const tensor sz, uint *rp)
static int picksplit(const S *ego, const tensor *sz, uint *rp)
{
A(sz.rnk > 1); /* cannot split rnk <= 1 */
if (!X(pickdim)(ego->spltrnk, ego->buddies, ego->nbuddies, sz, 1, rp))
return 0;
*rp += 1; /* convert from dim. index to rank */
if (*rp >= sz.rnk) /* split must reduce rank */
if (*rp >= sz->rnk) /* split must reduce rank */
return 0;
return 1;
}
@@ -94,7 +94,7 @@ static int applicable0(const solver *ego_, const problem *p_, uint *rp)
const S *ego = (const S *)ego_;
return (1
&& p->sz.rnk >= 2
&& picksplit(ego, p->sz, rp)
&& picksplit(ego, &p->sz, rp)
&& (0

/* can always operate out-of-place */
@@ -104,7 +104,7 @@ static int applicable0(const solver *ego_, const problem *p_, uint *rp)
strides are the same, provided that the child
plans work in-place. (This condition is
sufficient, but is it necessary?) */
|| X(tensor_inplace_strides)(p->sz)
|| X(tensor_inplace_strides)(&p->sz)
)
);
}
@@ -129,7 +129,7 @@ static int applicable(const solver *ego_, const problem *p_,
vrank-geq1 plan). */
if (NO_UGLYP(plnr))
if (p->vecsz.rnk > 0 &&
X(tensor_min_stride)(p->vecsz) > X(tensor_max_index)(p->sz))
X(tensor_min_stride)(&p->vecsz) > X(tensor_max_index)(&p->sz))
return 0;

return 1;
@@ -153,20 +153,20 @@ static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr)
return (plan *) 0;

p = (const problem_dft *) p_;
X(tensor_split)(p->sz, &sz1, spltrnk, &sz2);
vecszi = X(tensor_copy_inplace)(p->vecsz, INPLACE_OS);
sz2i = X(tensor_copy_inplace)(sz2, INPLACE_OS);
X(tensor_split)(&p->sz, &sz1, spltrnk, &sz2);
vecszi = X(tensor_copy_inplace)(&p->vecsz, INPLACE_OS);
sz2i = X(tensor_copy_inplace)(&sz2, INPLACE_OS);

cldp = X(mkproblem_dft_d)(X(tensor_copy)(sz2),
X(tensor_append)(p->vecsz, sz1),
cldp = X(mkproblem_dft_d)(X(tensor_copy)(&sz2),
X(tensor_append)(&p->vecsz, &sz1),
p->ri, p->ii, p->ro, p->io);
cld1 = MKPLAN(plnr, cldp);
X(problem_destroy)(cldp);
if (!cld1)
goto nada;

cldp = X(mkproblem_dft_d)(X(tensor_copy_inplace)(sz1, INPLACE_OS),
X(tensor_append)(vecszi, sz2i),
cldp = X(mkproblem_dft_d)(X(tensor_copy_inplace)(&sz1, INPLACE_OS),
X(tensor_append)(&vecszi, &sz2i),
p->ro, p->io, p->ro, p->io);
cld2 = MKPLAN(plnr, cldp);
X(problem_destroy)(cldp);
@@ -181,10 +181,10 @@ static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr)
pln->solver = ego;
pln->super.super.ops = X(ops_add)(cld1->ops, cld2->ops);

X(tensor_destroy)(sz1);
X(tensor_destroy)(sz2);
X(tensor_destroy)(vecszi);
X(tensor_destroy)(sz2i);
X(tensor_destroy)(&sz1);
X(tensor_destroy)(&sz2);
X(tensor_destroy)(&vecszi);
X(tensor_destroy)(&sz2i);

return &(pln->super.super);

@@ -193,10 +193,10 @@ static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr)
X(plan_destroy)(cld2);
if (cld1)
X(plan_destroy)(cld1);
X(tensor_destroy)(sz2);
X(tensor_destroy)(sz1);
X(tensor_destroy)(vecszi);
X(tensor_destroy)(sz2i);
X(tensor_destroy)(&sz2);
X(tensor_destroy)(&sz1);
X(tensor_destroy)(&vecszi);
X(tensor_destroy)(&sz2i);
return (plan *) 0;
}

12 changes: 6 additions & 6 deletions dft/vrank-geq1.c
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@
*
*/

/* $Id: vrank-geq1.c,v 1.21 2002-09-18 21:16:16 athena Exp $ */
/* $Id: vrank-geq1.c,v 1.22 2002-09-21 21:47:35 athena Exp $ */


/* Plans for handling vector transform loops. These are *just* the
@@ -86,7 +86,7 @@ static void print(plan *ego_, printer *p)
ego->vl, s->vecloop_dim, ego->cld);
}

static int pickdim(const S *ego, tensor vecsz, int oop, uint *dp)
static int pickdim(const S *ego, const tensor *vecsz, int oop, uint *dp)
{
return X(pickdim)(ego->vecloop_dim, ego->buddies, ego->nbuddies,
vecsz, oop, dp);
@@ -101,7 +101,7 @@ static int applicable0(const solver *ego_, const problem *p_, uint *dp)
return (1
&& FINITE_RNK(p->vecsz.rnk)
&& p->vecsz.rnk > 0
&& pickdim(ego, p->vecsz, p->ri != p->ro, dp)
&& pickdim(ego, &p->vecsz, p->ri != p->ro, dp)
);
}

@@ -132,7 +132,7 @@ static int applicable(const solver *ego_, const problem *p_,
if (1
&& p->sz.rnk > 1
&& X(uimin)(X(iabs)(d->is), X(iabs)(d->os))
< X(tensor_max_index)(p->sz)
< X(tensor_max_index)(&p->sz)
)
return 0;
}
@@ -176,8 +176,8 @@ static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr)
X(alignment_of)(p->io + d->os))
plnr->problem_flags |= POSSIBLY_UNALIGNED;

cldp = X(mkproblem_dft_d)(X(tensor_copy)(p->sz),
X(tensor_copy_except)(p->vecsz, vdim),
cldp = X(mkproblem_dft_d)(X(tensor_copy)(&p->sz),
X(tensor_copy_except)(&p->vecsz, vdim),
p->ri, p->ii, p->ro, p->io);
cld = MKPLAN(plnr, cldp);
X(problem_destroy)(cldp);
Loading

0 comments on commit 2008afb

Please sign in to comment.