RFC: small syscons and kbd patch

Nate Eldredge neldredge at math.ucsd.edu
Fri Dec 5 10:27:46 PST 2008


On Fri, 5 Dec 2008, Garrett Cooper wrote:

> On Fri, Dec 5, 2008 at 1:11 AM, Christoph Mallon
> <christoph.mallon at gmx.de> wrote:
>> Garrett Cooper schrieb:
>>>
>>> (I feel like I'm getting off on a bikeshed topic, but...)
>>>
>>> 1. What dialect of C was it defined in? Is it still used in the
>>> standard dialect (honestly, this is the first time I've ever seen it
>>> before, but then again I am a younger generation user)?
>>
>> Dialect? The ! operator is plain vanilla standard C. It takes a scalar
>> operand and returns 1, if it compares equal to 0, otherwise it returns 0.
>> !!, i.e. two consecutive ! operators, is one of the oldest tricks in the
>> book, right next to (a > b) - (a < b) for comparison functions and countless
>> other idioms.
>>
>>> 3. What's the real loss of going to `? :', beyond maybe 3 extra
>>> keystrokes if it's easier for folks who may not be as experienced to
>>> read?
>>
>> I'd like my bikeshed grass green, please.
>>
>>        Christoph
>
> If you really want to split hairs, ! only negates the logic value,
> whereas ~ actually negates the bits. So technically, you're not
> flipping 0 to make 1 and vice versa, but instead flipping 0 to make
> non-zero, etc. There is a clear distinction in hardware.
>
> The point was that !! isn't obvious at first glancing the C code. It's
> important for code to be readable as well as functional (that's why we
> have style(9)). Getting down to it I'd like to see what the compiler
> optimizes each as, because I can see dumb compilers saying `!!'
> translates to `not, bne => set, else set, continue', whereas `? :'
> could be translated to `bne, set, else set, continue'; I'm sure gcc
> has moved passed these really minute details.

Out of curiosity, I tried some various compilers, including gcc on i386, 
amd64, and sparc; Intel's C compiler on i386; tcc (tiny, non-optimizing C 
compiler) on i386; and Sun's compiler (old version) on sparc.

I compiled the following file:

int bangbang(int x) { return !!x; }
int ternary(int x) { return x ? 1 : 0; }

Intel's compiler generated different code for these two functions when 
optimization was turned off.  bangbang used a conditional set instruction, 
while ternary used conditional jumps.  With optimization on the two were 
identical.

All other compilers generated identical code for the two functions whether 
optimization was on or off.  (Of course, the generated code varied between 
compilers; tcc's in particular was decidedly non-optimized.)

I really don't think something as simple as this is worth worrying about 
in terms of code efficiency.  Even if they weren't identical, the 
difference is at most a couple of instructions and a pipeline flush, and 
if that's a serious problem you need to be using assembly anyway. 
Besides, it's not a piece of code that comes up all that often.

The only basis for arguing about it is style, and I think we've 
established that it's purely a matter of taste.  In particular, there 
isn't a clear favorite for which is easier to read.  IMHO, style(9) should 
remain agnostic and let the programmer decide.

However, if people really feel that consistency is necessary here, I 
propose the following: if the cents digit of the closing price of the Dow 
Jones Industrial Average on this coming Monday, December 8, 2008, is even, 
then style(9) shall be edited to indicate that `!!x' is preferred.  If 
odd, then style(9) shall prefer `x ? 1 : 0'.

:-)

-- 

Nate Eldredge
neldredge at math.ucsd.edu


More information about the freebsd-hackers mailing list