If you have thought about this for a year then the following can't be the answer, but here it is:
There is either a popcnt instruction, or you can implement it with straight-line code without branching. Whence: if !(popcnt(a)&&popcnt(b)) stmt; On Sun, Jul 28, 2019 at 5:51 PM Henry Rich <[email protected]> wrote: > 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
