lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 16 Jan 2008 20:35:12 -0500 From: Mathieu Desnoyers <mathieu.desnoyers@...ymtl.ca> To: Richard Purdie <rpurdie@...ys.net>, Linus Torvalds <torvalds@...ux-foundation.org> Cc: john stultz <johnstul@...ibm.com>, Steven Rostedt <rostedt@...dmis.org>, LKML <linux-kernel@...r.kernel.org>, Ingo Molnar <mingo@...e.hu>, Andrew Morton <akpm@...ux-foundation.org>, Peter Zijlstra <a.p.zijlstra@...llo.nl>, Christoph Hellwig <hch@...radead.org>, Gregory Haskins <ghaskins@...ell.com>, Arnaldo Carvalho de Melo <acme@...stprotocols.net>, Thomas Gleixner <tglx@...utronix.de>, Tim Bird <tim.bird@...sony.com>, Sam Ravnborg <sam@...nborg.org>, "Frank Ch. Eigler" <fche@...hat.com>, Steven Rostedt <srostedt@...hat.com>, Paul Mackerras <paulus@...ba.org>, Daniel Walker <dwalker@...sta.com> Subject: Re: [RFC PATCH 16/22 -v2] add get_monotonic_cycles * Linus Torvalds (torvalds@...ux-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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists