On Wed, Mar 30, 2005 at 04:07:39AM +0200, M?ns Rullg?rd wrote:

| Michael Tokarev <[EMAIL PROTECTED]> writes:
| 
| > M?ns Rullg?rd wrote:
| >> "Ronald S. Bultje" <[EMAIL PROTECTED]> writes:
| >>
| >>>--- linux-2.6.5/drivers/media/video/zr36050.c.old  16 Sep 2004 22:53:27 
-0000      1.2
| >>>+++ linux-2.6.5/drivers/media/video/zr36050.c      29 Mar 2005 20:30:23 
-0000
| >>>@@ -419,7 +419,7 @@
| >>>   dri_data[2] = 0x00;
| >>>   dri_data[3] = 0x04;
| >>>   dri_data[4] = ptr->dri >> 8;
| >>>-  dri_data[5] = ptr->dri * 0xff;
| >>>+  dri_data[5] = ptr->dri & 0xff;
| >> Hey, that's a nice obfuscation of a simple negation.
| >
| > It's not a negation.  This statement always assigns zero to
| > dri_data[5] if dri_data is char[].
| 
| Sure about that?
| 
| __u16 i;
| char c;
| i = 1; c = i * 255; /* c = 255 = -1 */
| i = 2; c = i * 255; /* c = 510 & 0xff = 254 = -2 */
| ...
| 
| Looks like negation to me.

Sure it's negation because 255 _is_ 256 - 1.  Basic finite math.

( x * 256 )                 mod 256 == 0
( ( x * 256 ) - ( x * 1 ) ) mod 256 == - ( x * 1 )
( x * ( 256 - 1 ) )         mod 256 == - ( x * 1 )
( x * 255 )                 mod 256 == - ( x * 1 )
( x * 255 )                 mod 256 == - x

Now what I am interested in is if gcc optimized it to a faster negation
or subtraction instruction.

-- 
-----------------------------------------------------------------------------
| Phil Howard KA9WGN       | http://linuxhomepage.com/      http://ham.org/ |
| (first name) at ipal.net | http://phil.ipal.org/   http://ka9wgn.ham.org/ |
-----------------------------------------------------------------------------
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to