| Chris@42 | 1 /* | 
| Chris@42 | 2  * Copyright (c) 2003, 2007-14 Matteo Frigo | 
| Chris@42 | 3  * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology | 
| Chris@42 | 4  * | 
| Chris@42 | 5  * This program is free software; you can redistribute it and/or modify | 
| Chris@42 | 6  * it under the terms of the GNU General Public License as published by | 
| Chris@42 | 7  * the Free Software Foundation; either version 2 of the License, or | 
| Chris@42 | 8  * (at your option) any later version. | 
| Chris@42 | 9  * | 
| Chris@42 | 10  * This program is distributed in the hope that it will be useful, | 
| Chris@42 | 11  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| Chris@42 | 12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| Chris@42 | 13  * GNU General Public License for more details. | 
| Chris@42 | 14  * | 
| Chris@42 | 15  * You should have received a copy of the GNU General Public License | 
| Chris@42 | 16  * along with this program; if not, write to the Free Software | 
| Chris@42 | 17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA | 
| Chris@42 | 18  * | 
| Chris@42 | 19  */ | 
| Chris@42 | 20 | 
| Chris@42 | 21 /* out of place 2D copy routines */ | 
| Chris@42 | 22 #include "ifftw.h" | 
| Chris@42 | 23 | 
| Chris@42 | 24 void X(tile2d)(INT n0l, INT n0u, INT n1l, INT n1u, INT tilesz, | 
| Chris@42 | 25 	       void (*f)(INT n0l, INT n0u, INT n1l, INT n1u, void *args), | 
| Chris@42 | 26 	       void *args) | 
| Chris@42 | 27 { | 
| Chris@42 | 28      INT d0, d1; | 
| Chris@42 | 29 | 
| Chris@42 | 30      A(tilesz > 0); /* infinite loops otherwise */ | 
| Chris@42 | 31 | 
| Chris@42 | 32  tail: | 
| Chris@42 | 33      d0 = n0u - n0l; | 
| Chris@42 | 34      d1 = n1u - n1l; | 
| Chris@42 | 35 | 
| Chris@42 | 36      if (d0 >= d1 && d0 > tilesz) { | 
| Chris@42 | 37 	  INT n0m = (n0u + n0l) / 2; | 
| Chris@42 | 38 	  X(tile2d)(n0l, n0m, n1l, n1u, tilesz, f, args); | 
| Chris@42 | 39 	  n0l = n0m; goto tail; | 
| Chris@42 | 40      } else if (/* d1 >= d0 && */ d1 > tilesz) { | 
| Chris@42 | 41 	  INT n1m = (n1u + n1l) / 2; | 
| Chris@42 | 42 	  X(tile2d)(n0l, n0u, n1l, n1m, tilesz, f, args); | 
| Chris@42 | 43 	  n1l = n1m; goto tail; | 
| Chris@42 | 44      } else { | 
| Chris@42 | 45 	  f(n0l, n0u, n1l, n1u, args); | 
| Chris@42 | 46      } | 
| Chris@42 | 47 } | 
| Chris@42 | 48 | 
| Chris@42 | 49 INT X(compute_tilesz)(INT vl, int how_many_tiles_in_cache) | 
| Chris@42 | 50 { | 
| Chris@42 | 51      return X(isqrt)(CACHESIZE / | 
| Chris@42 | 52 		     (((INT)sizeof(R)) * vl * (INT)how_many_tiles_in_cache)); | 
| Chris@42 | 53 } |