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
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20080117013511.GA30644@Krystal>
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

Powered by Openwall GNU/*/Linux Powered by OpenVZ