How about multiply a and b, followed by a branch on zero?

~ Gilles

Le 2019-07-28 à 20:51, Henry Rich a écrit :
> Many of the members of this Forum will remember the days of assembler
> language
>
>   ...and who could less than merry be
>   when writing out BXLE?
>
> AND, OR, XOR were our meat.  Those days are returning.
>
> You have two integer variables a and b and you want to do something if
> one or both of them are 0.  In C, you might write
>
>   if(a==0 || b==0)stmt;
>
> but that will generate the code
>
>   cmp a,0
>   bz stmt
>   cmp b,0
>   bnz notstmt
> stmt:
> ...
> notstmt:
>
> Here's the problem: your machine is very slow at branch instructions. 
> Each branch takes 30 times as long as a regular instruction.  (I am
> describing a state-of-the-art Intel CPU when it cannot predict the
> branches effectively, perhaps because the data is... unpredictable).
>
> Obviously, you want to use only one branch instruction.  You may use
> as many arithmetic and logic instructions as you like, but only one
> branch.  The usual condition codes, ZNCV, are available. How tight can
> you make the code?
>
> Example: suppose the problem were to execute stmt if one or both of a
> and b is NOT zero.  Then you would simply write
>
>   or a,b
>   bnz notstmt
> ...
>
> Checking for zero seems to be harder.
>
> No hurry.  I have pondered this problem for over a year, and just
> today I found a solution I consider acceptable.
>
> Henry Rich
>
>
>
>
>
>
>
> ---
> This email has been checked for viruses by AVG.
> https://www.avg.com
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to