26 static inline long long log2(
long long n)
28 unsigned long long v = (
unsigned long long) n;
32 r = (v > 0xFFFFFFFFULL) << 5; v >>= r;
33 s = (v > 0xFFFFULL ) << 4; v >>= s; r |= s;
34 s = (v > 0xFFULL ) << 3; v >>= s; r |= s;
35 s = (v > 0xFULL ) << 2; v >>= s; r |= s;
36 s = (v > 0x3ULL ) << 1; v >>= s; r |= s;
38 return (
long long) (r | (v >> 1));
43 static inline long long scm_page_count(
long long d)
45 return (1LL << (2 * d + 3)) - 2;
50 static inline long long scm_page_level(
long long i)
52 return (log2(i + 2) - 1) / 2;
57 static inline long long scm_page_root(
long long i)
59 long long n = 1LL << (2 * scm_page_level(i));
60 return (i - 2 * (n - 1)) / n;
65 static inline long long scm_page_tile(
long long i)
67 long long n = 1LL << (2 * scm_page_level(i));
68 return (i - 2 * (n - 1)) % n;
73 static inline long long scm_page_row(
long long i)
75 return scm_page_tile(i) / (1LL << scm_page_level(i));
80 static inline long long scm_page_col(
long long i)
82 return scm_page_tile(i) % (1LL << scm_page_level(i));
87 static inline long long scm_page_index(
long long a,
long long l,
88 long long r,
long long c)
90 return scm_page_count(l - 1) + (a << (2 * l)) + (r << l) + c;
95 static inline long long scm_page_parent(
long long i)
97 return scm_page_index(scm_page_root(i), scm_page_level(i) - 1,
99 scm_page_col (i) / 2);
104 static inline long long scm_page_child(
long long i,
long long k)
106 return scm_page_index(scm_page_root(i), scm_page_level(i) + 1,
107 scm_page_row (i) * 2 + k / 2,
108 scm_page_col (i) * 2 + k % 2);
113 static inline long long scm_page_order(
long long i)
115 return 2 * (scm_page_row(i) % 2)
116 + (scm_page_col(i) % 2);
121 void scm_locate(
long long *,
double *,
double *,
const double *);
122 void scm_vector(
long long,
double,
double,
double *);
124 long long scm_page_north(
long long);
125 long long scm_page_south(
long long);
126 long long scm_page_west (
long long);
127 long long scm_page_east (
long long);
129 void scm_page_corners(
long long,
double *);
130 void scm_page_center (
long long,
double *);