static inline void mult_row_column(uint8_t *out, const uint8_t *in) { out[0] = multe(in[0]) ^ multb(in[1]) ^ multd(in[2]) ^ mult9(in[3]); out[1] = mult9(in[0]) ^ multe(in[1]) ^ multb(in[2]) ^ multd(in[3]); out[2] = multd(in[0]) ^ mult9(in[1]) ^ multe(in[2]) ^ multb(in[3]); out[3] = multb(in[0]) ^ multd(in[1]) ^ mult9(in[2]) ^ multe(in[3]); }
ULONG fmul64(ULONG ahi,ULONG alo,ULONG bhi,ULONG blo, ULONG *desthi,ULONG *destlo,ULONG rnd,ULONG prec) { ULONG g,r,s,flag; FPLONG a,b,res; /* Reserved operand check */ flag = reserved(ahi,alo,bhi,blo,0); if (flag != 0 ) return(flag); flag = (flag<<FLAGWIDTH) | reserved(ahi,alo,bhi,blo,1); if (flag != 0 ) return(flag); if (flag) { *desthi = 0; *destlo = 0; return(flag); } /* Extract fields */ a.sign = BFEXTU(ahi,31,1); b.sign = BFEXTU(bhi,31,1); a.exp = BFEXTU(ahi,20,11); b.exp = BFEXTU(bhi,20,11); a.manthi = BFEXTU(ahi,0,20); b.manthi = BFEXTU(bhi,0,20); a.mantlo = alo; b.mantlo = blo; /* Insert Hidden Bits */ if (a.exp != 0) a.manthi |= 0x00100000; if (b.exp != 0) b.manthi |= 0x00100000; /* Perform Multiplication */ multd(a.sign,a.exp,a.manthi,a.mantlo,b.sign,b.exp,b.manthi,b.mantlo, &res.sign,&res.exp,&res.manthi,&res.mantlo,&s); /* Round */ if (prec != SINGLE) { g = (res.mantlo>>1)&1; r = res.mantlo&1; res.mantlo >>= 2; res.mantlo |= res.manthi<<30; res.manthi >>= 2; flag |= roundd(res.exp,&res.sign,&res.manthi,&res.mantlo,g,r,s,rnd); }