home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.asm.x86      Ahh, the lost art of x86 assembly      4,675 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 3,801 of 4,675   
   wolfgang kern to James Harris   
   Re: Fast conversion to a boolean of 0 or   
   06 Mar 19 23:19:23   
   
   From: nowhere@nospicedham.never.at   
      
   On 06.03.2019 20:37, James Harris wrote:   
   > A small programming challenge if you are interested, just for fun.   
   >   
   > Say we want any value other than 0 in EAX to be reduced to 1 - e.g. so   
   > that if non-zero means true but we want true to be 1.   
   >   
   > Is there a faster solution than the naive   
   >   
   >      cmp eax, 0   
   >      je done   
   >      mov eax, 1   
   >    done:   
   >   
   > Naturally, the speed of that will depend on how predictable the input   
   > values are. Taking into account the usual suspect characteristics of x86   
   > CPUs is there a generally faster solution?   
   >   
   > I can think of three bit-twiddling ways but I'm not sure they would be   
   > faster than the above. In fact, I think they might be slower. In any   
   > case I'd be interested to see what others think. I suspect some of you   
   > may already have a preferred solution.   
   >   
   > So, any suggestions?   
      
   it will depend on CPU in use,   
   newer types fusion "TEST reg,any" with an immediate following "Jcc" so   
   this two act like one single instruction (but it's still a cc-branch):   
      
       test eax,-1  ;short with imm Sext byte 0xff -> 0xffffffff   
       jz done   
       mov eax,1   
      
   some CPUs are faster with CMOV because it can save on the branch.   
      
   my solution would be shorter (perhaps not faster):   
      
       or eax,eax   ;just two byte now   
       setnz AL     ;and I'd globally ignore the upper 24 bits   
       ;and eax,1    ;only needed if your TRUE must be _that_ BIG   
      
   I'm really happy for I never need more than one bit for TRUE/false ;)   
   __   
   wolfgang   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca