Re: [RFC PATCH 16/22 -v2] add get_monotonic_cycles

Mathieu Desnoyers
2008-01-17T01:40:30Z

* Linus Torvalds (torvalds@linux-foundation.org) wrote:
>
>
> On Wed, 16 Jan 2008, Mathieu Desnoyers wrote:
> >
> > > + int num = !cs->base_num;
> > > + cycle_t offset = (now - cs->base[!num].cycle_base_last);
> >
> > !0 is not necessarily 1.
>
> Incorrect.
>

Hrm, *digging in my mailbox*, ah, here it is :

http://listserv.shafik.org/pipermail/ltt-dev/2006-June/001548.html

Richard Purdie reviewed my code back in 2006 and made this modification.
Maybe will he have something to add.

> !0 _is_ necessarily 1. It's how all C logical operators work. If you find
> a compiler that turns !x into anything but 0/1, you found a compiler for
> another language than C.
>
> It's true that any non-zero value counts as "true", but the that does not
> mean that a logical operator can return any non-zero value for true. As a
> return value of the logical operations in C, true is *always* 1.
>
> So !, ||, &&, when used as values, will *always* return either 0 or 1 (but
> when used as part of a conditional, the compiler will often optimize out
> unnecessary stuff, so the CPU may not actually ever see a 0/1 value, if
> the value itself was never used, only branched upon).
>
> So doing "!cs->base_num" to turn 0->1 and 1->0 is perfectly fine.
>
> That's not to say it's necessarily the *best* way.
>
> If you *know* that you started with 0/1 in the first place, the best way
> to flip it tends to be to do (1-x) (or possibly (x^1)).
>
> And if you can't guarantee that, !x is probably better than x ? 0 : 1,
> but you might also decide to use ((x+1)&1) for example.
>
> And obviously, the compiler may sometimes surprise you, and if *it* also
> knows it's always 0/1 (for something like the source being a single-bit
> bitfield for example), it may end up doing something else than you coded
> that is equivalent. And the particular choice of operation the compiler
> chooses may well depend on the code _around_ that sequence.
>
> (One reason to potentially prefer (1-x) over (x^1) is that it's often
> easier to combine a subtraction with other operations, while an xor seldom
> combines with anything around it)
>

Ok, I'll adopt (1-x) then. Thanks!

Mathieu

> Linus

--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68