Index: libjpeg6b-6b/jdcolor.c =================================================================== --- libjpeg6b-6b.orig/jdcolor.c 2006-08-08 20:44:25.677065367 -0700 +++ libjpeg6b-6b/jdcolor.c 2006-08-08 20:46:42.067842752 -0700 @@ -118,20 +118,22 @@ METHODDEF(void) ycc_rgb_convert (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) + JSAMPIMAGE __restrict input_buf, JDIMENSION input_row, + JSAMPARRAY __restrict output_buf, int num_rows) { my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; register int y, cb, cr; - register JSAMPROW outptr; - register JSAMPROW inptr0, inptr1, inptr2; + register JSAMPROW __restrict outptr; + register JSAMPROW __restrict inptr0; + register JSAMPROW __restrict inptr1; + register JSAMPROW __restrict inptr2; register JDIMENSION col; JDIMENSION num_cols = cinfo->output_width; /* copy these pointers into registers if possible */ - register int * Crrtab = cconvert->Cr_r_tab; - register int * Cbbtab = cconvert->Cb_b_tab; - register INT32 * Crgtab = cconvert->Cr_g_tab; - register INT32 * Cbgtab = cconvert->Cb_g_tab; + register int * __restrict Crrtab = cconvert->Cr_r_tab; + register int * __restrict Cbbtab = cconvert->Cb_b_tab; + register INT32 * __restrict Crgtab = cconvert->Cr_g_tab; + register INT32 * __restrict Cbgtab = cconvert->Cb_g_tab; SHIFT_TEMPS while (--num_rows >= 0) { @@ -140,18 +142,30 @@ inptr2 = input_buf[2][input_row]; input_row++; outptr = *output_buf++; - for (col = 0; col < num_cols; col++) { - y = GETJSAMPLE(inptr0[col]); - cb = GETJSAMPLE(inptr1[col]); - cr = GETJSAMPLE(inptr2[col]); - /* Range-limiting is essential due to noise introduced by DCT losses. */ - outptr[RGB_RED] = jsample_range_limit(y + Crrtab[cr]); - outptr[RGB_GREEN] = jsample_range_limit(y + - ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], - SCALEBITS))); - outptr[RGB_BLUE] = jsample_range_limit(y + Cbbtab[cb]); - outptr += RGB_PIXELSIZE; + col = 0; + while (col < num_cols - 3) { +#define XX do {\ + y = GETJSAMPLE(inptr0[col]); \ + cb = GETJSAMPLE(inptr1[col]); \ + cr = GETJSAMPLE(inptr2[col]); \ + /* Range-limiting is essential due to noise introduced by DCT losses. */ \ + outptr[RGB_RED] = jsample_range_limit(y + Crrtab[cr]); \ + outptr[RGB_GREEN] = jsample_range_limit(y + \ + ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], \ + SCALEBITS))); \ + outptr[RGB_BLUE] = jsample_range_limit(y + Cbbtab[cb]); \ + outptr += RGB_PIXELSIZE; \ + ++col; \ + } while(0) + XX; + XX; + XX; + XX; + } + while (col < num_cols) { + XX; } +#undef XX } }