anchor.diff:            p[5 + row] == 0 &&
             p[6 + row] == 0 &&
             p[7 + row] == 0) {
  -        int t = ((Jpeg.dctSqrt2 * p[0 + row] + 512) >> 10);
  +        int t = _shiftR((Jpeg.dctSqrt2 * p[0 + row] + 512), 10);
           p.fillRange(row, row + 8, t);
           continue;
         }
   
         // stage 4
  -      int v0 = ((Jpeg.dctSqrt2 * p[0 + row] + 128) >> 8);
  -      int v1 = ((Jpeg.dctSqrt2 * p[4 + row] + 128) >> 8);
  +      int v0 = _shiftR((Jpeg.dctSqrt2 * p[0 + row] + 128), 8);
  +      int v1 = _shiftR((Jpeg.dctSqrt2 * p[4 + row] + 128), 8);
         int v2 = p[2 + row];
         int v3 = p[6 + row];
  -      int v4 = ((Jpeg.dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8);
  -      int v7 = ((Jpeg.dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8);
  -      int v5 = (p[3 + row] << 4);
  -      int v6 = (p[5 + row] << 4);
  +      int v4 = _shiftR((Jpeg.dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128), 8);
  +      int v7 = _shiftR((Jpeg.dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128), 8);
  +      int v5 = _shiftL(p[3 + row], 4);
  +      int v6 = _shiftL(p[5 + row], 4);
   
         // stage 3
  -      int t = ((v0 - v1+ 1) >> 1);
  -      v0 = ((v0 + v1 + 1) >> 1);
  +      int t = _shiftR((v0 - v1+ 1), 1);
  +      v0 = _shiftR((v0 + v1 + 1), 1);
         v1 = t;
  -      t = ((v2 * Jpeg.dctSin6 + v3 * Jpeg.dctCos6 + 128) >> 8);
  -      v2 = ((v2 * Jpeg.dctCos6 - v3 * Jpeg.dctSin6 + 128) >> 8);
  +      t = _shiftR((v2 * Jpeg.dctSin6 + v3 * Jpeg.dctCos6 + 128), 8);
  +      v2 = _shiftR((v2 * Jpeg.dctCos6 - v3 * Jpeg.dctSin6 + 128), 8);
         v3 = t;
  -      t = ((v4 - v6 + 1) >> 1);
  -      v4 = ((v4 + v6 + 1) >> 1);
  +      t = _shiftR((v4 - v6 + 1), 1);
  +      v4 = _shiftR((v4 + v6 + 1), 1);
         v6 = t;
  -      t = ((v7 + v5 + 1) >> 1);
  -      v5 = ((v7 - v5 + 1) >> 1);
  +      t = _shiftR((v7 + v5 + 1), 1);
  +      v5 = _shiftR((v7 - v5 + 1), 1);
         v7 = t;
   
         // stage 2
  -      t = ((v0 - v3 + 1) >> 1);
  -      v0 = ((v0 + v3 + 1) >> 1);
  +      t = _shiftR((v0 - v3 + 1), 1);
  +      v0 = _shiftR((v0 + v3 + 1), 1);
         v3 = t;
  -      t = ((v1 - v2 + 1) >> 1);
  -      v1 = ((v1 + v2 + 1) >> 1);
  +      t = _shiftR((v1 - v2 + 1), 1);
  +      v1 = _shiftR((v1 + v2 + 1), 1);
         v2 = t;
  -      t = ((v4 * Jpeg.dctSin3 + v7 * Jpeg.dctCos3 + 2048) >> 12);
  -      v4 = ((v4 * Jpeg.dctCos3 - v7 * Jpeg.dctSin3 + 2048) >> 12);
  +      t = _shiftR((v4 * Jpeg.dctSin3 + v7 * Jpeg.dctCos3 + 2048), 12);
  +      v4 = _shiftR((v4 * Jpeg.dctCos3 - v7 * Jpeg.dctSin3 + 2048), 12);
         v7 = t;
  -      t = ((v5 * Jpeg.dctSin1 + v6 * Jpeg.dctCos1 + 2048) >> 12);
  -      v5 = ((v5 * Jpeg.dctCos1 - v6 * Jpeg.dctSin1 + 2048) >> 12);
  +      t = _shiftR((v5 * Jpeg.dctSin1 + v6 * Jpeg.dctCos1 + 2048), 12);
  +      v5 = _shiftR((v5 * Jpeg.dctCos1 - v6 * Jpeg.dctSin1 + 2048), 12);
         v6 = t;
   
         // stage 1
  
positive.code:       }
  
        // stage 4
        int v0 = ((Jpeg.dctSqrt2 * p[0 * 8 + col] + 2048) >> 12);
        int v1 = ((Jpeg.dctSqrt2 * p[4 * 8 + col] + 2048) >> 12);
        int v2 = p[2 * 8 + col];
        int v3 = p[6 * 8 + col];
        int v4 = ((Jpeg.dctSqrt1d2 * (p[1 * 8 + col] - p[7*8 + col]) + 2048) >> 12);
        int v7 = ((Jpeg.dctSqrt1d2 * (p[1 * 8 + col] + p[7*8 + col]) + 2048) >> 12);
        int v5 = p[3 * 8 + col];
        int v6 = p[5 * 8 + col];
  
        // stage 3
        int t = ((v0 - v1 + 1) >> 1);
        v0 = ((v0 + v1 + 1) >> 1);
        v1 = t;
        t = ((v2 * Jpeg.dctSin6 + v3 * Jpeg.dctCos6 + 2048) >> 12);
        v2 = ((v2 * Jpeg.dctCos6 - v3 * Jpeg.dctSin6 + 2048) >> 12);
        v3 = t;
        t = ((v4 - v6 + 1) >> 1);
        v4 = ((v4 + v6 + 1) >> 1);
        v6 = t;
        t = ((v7 + v5 + 1) >> 1);
        v5 = ((v7 - v5 + 1) >> 1);
        v7 = t;
  
        // stage 2
        t = ((v0 - v3 + 1) >> 1);
        v0 = ((v0 + v3 + 1) >> 1);
        v3 = t;
        t = ((v1 - v2 + 1) >> 1);
        v1 = ((v1 + v2 + 1) >> 1);
        v2 = t;
        t = ((v4 * Jpeg.dctSin3 + v7 * Jpeg.dctCos3 + 2048) >> 12);
        v4 = ((v4 * Jpeg.dctCos3 - v7 * Jpeg.dctSin3 + 2048) >> 12);
        v7 = t;
        t = ((v5 * Jpeg.dctSin1 + v6 * Jpeg.dctCos1 + 2048) >> 12);
        v5 = ((v5 * Jpeg.dctCos1 - v6 * Jpeg.dctSin1 + 2048) >> 12);
        v6 = t;
  
        // stage 1
  
negative.code:     int spectralEnd = block.readByte();
      int successiveApproximation = block.readByte();
  
      int Ah = _shiftR(successiveApproximation, 4) & 15;
      int Al = successiveApproximation & 15;
  
      new JpegScan(input, frame, components, resetInterval,
  