Пример #1
0
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]);
}
Пример #2
0
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);
   }