From: mquinson Date: Wed, 3 Mar 2004 19:19:17 +0000 (+0000) Subject: Document black magic about aligned_size for scalars. Thanks Oli on IRC X-Git-Tag: v3.3~5288 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/60e0b2dbcf46973c8698b2ac532f5b6c4fa0cded Document black magic about aligned_size for scalars. Thanks Oli on IRC git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@58 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/gras/DataDesc/ddt_create.c b/src/gras/DataDesc/ddt_create.c index 71508a76c4..63b3473e1d 100644 --- a/src/gras/DataDesc/ddt_create.c +++ b/src/gras/DataDesc/ddt_create.c @@ -47,15 +47,21 @@ gras_ddt_new_scalar(const char *name, res->size = size>0 ? size : 0; - if (size>0) { /* Black magic from Oli FIXME: documentation ;)*/ + if (size>0) { long int sz = size; long int mask = sz; - + + /* just in case you wonder, x>>1 == x/2 on all architecture when x>=0 */ + + /* make sure mask have all the bits under the biggest one of size set to 1 + Example: size=000100101 => mask=0000111111 */ while ((sz >>= 1)) { mask |= sz; } - if (size & (mask >> 1)) { + if (size & (mask >> 1)) { /* if size have bits to one beside its biggest */ + /* size is not a power of 2 */ + /* alignment= next power of 2 after size */ res->alignment = (size & ~(mask >> 1)) << 1; gras_assert0(res->alignment != 0, "scalar type too large"); @@ -65,8 +71,9 @@ gras_ddt_new_scalar(const char *name, "scalar type too large"); } else { - res->alignment = size & ~(mask >> 1);; - res->aligned_size = aligned(size, res->alignment); + /* size is a power of 2, life is great */ + res->alignment = size; + res->aligned_size = size; } } else {