Yes, there's a gcc warning flag that suggests you put brackets around such expressions (I can't remember which flag, though).
> One more thing: > the code > if(k & 0xffff!=0) statement; > id equivalent to > if(k & 1) statement; > cause in comparison operation '!=' will be performed first, then '&'. > Therefore, the compiler checks only most bottom nibble of 'k'. > ~d > > > > On Mon, 5 Aug 2002 11:34:55 +0300 > "Oleg Skidan" <[email protected]> wrote: > > > Hello, All ! > > During use of mspgcc (build 2002-07-25) I noticed a very > > strange things: > > > > Consider the following fragment of code: > > > > int b(long long k) > > { > > if(k & 0xffff!=0)return 1; > > } > > > > The compiler emits: > > > > .global b > > .type b,@function > > /*********************** > > * Function `b' > > ***********************/ > > b: > > /* prologue: frame size = 0; addenum 0; alloca:0, varargs:0 , fpr:0*/ > > .L__FrameSize_b=0x0 > > .L__FrameOffset_b=0x0 > > /* prologue end (size=0) */ > > and #llo(2), r12 ;<<<<<<<<???????????? > > and #llo(0), r13 > > and #llo(52), r14 ;<<<<<<<<???????????? > > and #llo(0), r15 > > tst r12 > > jeq .L2 > > mov #llo(1), r15 > > ret > > .L2: > > mov #llo(0), r15 > > .L1: > > /* epilogue: frame size=0 */ > > ret > > /* epilogue end (size=1) */ > > /* function b size 20 (19) */ > > .Lfe1: > > .size b,.Lfe1-b > > /********* End of function ******/ > > > > Now lets make a minor changes: > > > > int b(long long k) > > { > > if(k & 0xffff)return 1; > > return 0; > > } > > > > The compiler emits: > > > > .global b > > .type b,@function > > /*********************** > > * Function `b' > > ***********************/ > > b: > > /* prologue: frame size = 0; addenum 0; alloca:0, varargs:0 , fpr:0*/ > > .L__FrameSize_b=0x0 > > .L__FrameOffset_b=0x2 > > push r11 > > /* prologue end (size=1) */ > > and #llo(19744), r12 ;<<<<<???? > > and #llo(137), r13 > > and #llo(46), r14 > > and #llo(8192), r15 > > mov r12, r11 > > bis r13, r11 > > bis r14, r11 > > bis r15, r11 > > tst r11 > > jeq .L2 > > mov #llo(1), r15 > > jmp .L1 > > .L2: > > mov #llo(0), r15 > > .L1: > > /* epilogue: frame size=0 */ > > pop r11 > > ret > > /* epilogue end (size=2) */ > > > > I think we have a BUG :-(. > > The code is good and correct if argument type is long instead of long long. > > > > All the best, Oleg. > > > > > /******************************************************************** > ("`-''-/").___..--''"`-._ (\ Dimmy the Wild UA1ACZ > `6_ 6 ) `-. ( ).`-.__.`) Enterprise Information Sys > (_Y_.)' ._ ) `._ `. ``-..-' Nevsky prospekt, 20 / 44 > _..`--'_..-_/ /--'_.' ,' Saint Petersburg, Russia > (il),-'' (li),' ((!.-' +7 (812) 3468202, 5585314 > ********************************************************************/ > > > ------------------------------------------------------- > This sf.net email is sponsored by:ThinkGeek > Welcome to geek heaven. > http://thinkgeek.com/sf > _______________________________________________ > Mspgcc-users mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/mspgcc-users > >
