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
