1/*
2 * jsimd_x86_64.c
3 *
4 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
5 * Copyright 2009-2011, 2014 D. R. Commander
6 *
7 * Based on the x86 SIMD extension for IJG JPEG library,
8 * Copyright (C) 1999-2006, MIYASAKA Masaru.
9 * For conditions of distribution and use, see copyright notice in jsimdext.inc
10 *
11 * This file contains the interface between the "normal" portions
12 * of the library and the SIMD implementations when running on a
13 * 64-bit x86 architecture.
14 */
15
16#define JPEG_INTERNALS
17#include "../jinclude.h"
18#include "../jpeglib.h"
19#include "../jsimd.h"
20#include "../jdct.h"
21#include "../jsimddct.h"
22#include "jsimd.h"
23
24/*
25 * In the PIC cases, we have no guarantee that constants will keep
26 * their alignment. This macro allows us to verify it at runtime.
27 */
28#define IS_ALIGNED(ptr, order) (((size_t)ptr & ((1 << order) - 1)) == 0)
29
30#define IS_ALIGNED_SSE(ptr) (IS_ALIGNED(ptr, 4)) /* 16 byte alignment */
31
32GLOBAL(int)
33jsimd_can_rgb_ycc (void)
34{
35  /* The code is optimised for these values only */
36  if (BITS_IN_JSAMPLE != 8)
37    return 0;
38  if (sizeof(JDIMENSION) != 4)
39    return 0;
40  if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
41    return 0;
42
43  if (!IS_ALIGNED_SSE(jconst_rgb_ycc_convert_sse2))
44    return 0;
45
46  return 1;
47}
48
49GLOBAL(int)
50jsimd_can_rgb_gray (void)
51{
52  /* The code is optimised for these values only */
53  if (BITS_IN_JSAMPLE != 8)
54    return 0;
55  if (sizeof(JDIMENSION) != 4)
56    return 0;
57  if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
58    return 0;
59
60  if (!IS_ALIGNED_SSE(jconst_rgb_gray_convert_sse2))
61    return 0;
62
63  return 1;
64}
65
66GLOBAL(int)
67jsimd_can_ycc_rgb (void)
68{
69  /* The code is optimised for these values only */
70  if (BITS_IN_JSAMPLE != 8)
71    return 0;
72  if (sizeof(JDIMENSION) != 4)
73    return 0;
74  if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
75    return 0;
76
77  if (!IS_ALIGNED_SSE(jconst_ycc_rgb_convert_sse2))
78    return 0;
79
80  return 1;
81}
82
83GLOBAL(int)
84jsimd_can_ycc_rgb565 (void)
85{
86  return 0;
87}
88
89GLOBAL(void)
90jsimd_rgb_ycc_convert (j_compress_ptr cinfo,
91                       JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
92                       JDIMENSION output_row, int num_rows)
93{
94  void (*sse2fct)(JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
95
96  switch(cinfo->in_color_space) {
97    case JCS_EXT_RGB:
98      sse2fct=jsimd_extrgb_ycc_convert_sse2;
99      break;
100    case JCS_EXT_RGBX:
101    case JCS_EXT_RGBA:
102      sse2fct=jsimd_extrgbx_ycc_convert_sse2;
103      break;
104    case JCS_EXT_BGR:
105      sse2fct=jsimd_extbgr_ycc_convert_sse2;
106      break;
107    case JCS_EXT_BGRX:
108    case JCS_EXT_BGRA:
109      sse2fct=jsimd_extbgrx_ycc_convert_sse2;
110      break;
111    case JCS_EXT_XBGR:
112    case JCS_EXT_ABGR:
113      sse2fct=jsimd_extxbgr_ycc_convert_sse2;
114      break;
115    case JCS_EXT_XRGB:
116    case JCS_EXT_ARGB:
117      sse2fct=jsimd_extxrgb_ycc_convert_sse2;
118      break;
119    default:
120      sse2fct=jsimd_rgb_ycc_convert_sse2;
121      break;
122  }
123
124  sse2fct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
125}
126
127GLOBAL(void)
128jsimd_rgb_gray_convert (j_compress_ptr cinfo,
129                        JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
130                        JDIMENSION output_row, int num_rows)
131{
132  void (*sse2fct)(JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
133
134  switch(cinfo->in_color_space) {
135    case JCS_EXT_RGB:
136      sse2fct=jsimd_extrgb_gray_convert_sse2;
137      break;
138    case JCS_EXT_RGBX:
139    case JCS_EXT_RGBA:
140      sse2fct=jsimd_extrgbx_gray_convert_sse2;
141      break;
142    case JCS_EXT_BGR:
143      sse2fct=jsimd_extbgr_gray_convert_sse2;
144      break;
145    case JCS_EXT_BGRX:
146    case JCS_EXT_BGRA:
147      sse2fct=jsimd_extbgrx_gray_convert_sse2;
148      break;
149    case JCS_EXT_XBGR:
150    case JCS_EXT_ABGR:
151      sse2fct=jsimd_extxbgr_gray_convert_sse2;
152      break;
153    case JCS_EXT_XRGB:
154    case JCS_EXT_ARGB:
155      sse2fct=jsimd_extxrgb_gray_convert_sse2;
156      break;
157    default:
158      sse2fct=jsimd_rgb_gray_convert_sse2;
159      break;
160  }
161
162  sse2fct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
163}
164
165GLOBAL(void)
166jsimd_ycc_rgb_convert (j_decompress_ptr cinfo,
167                       JSAMPIMAGE input_buf, JDIMENSION input_row,
168                       JSAMPARRAY output_buf, int num_rows)
169{
170  void (*sse2fct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int);
171
172  switch(cinfo->out_color_space) {
173    case JCS_EXT_RGB:
174      sse2fct=jsimd_ycc_extrgb_convert_sse2;
175      break;
176    case JCS_EXT_RGBX:
177    case JCS_EXT_RGBA:
178      sse2fct=jsimd_ycc_extrgbx_convert_sse2;
179      break;
180    case JCS_EXT_BGR:
181      sse2fct=jsimd_ycc_extbgr_convert_sse2;
182      break;
183    case JCS_EXT_BGRX:
184    case JCS_EXT_BGRA:
185      sse2fct=jsimd_ycc_extbgrx_convert_sse2;
186      break;
187    case JCS_EXT_XBGR:
188    case JCS_EXT_ABGR:
189      sse2fct=jsimd_ycc_extxbgr_convert_sse2;
190      break;
191    case JCS_EXT_XRGB:
192    case JCS_EXT_ARGB:
193      sse2fct=jsimd_ycc_extxrgb_convert_sse2;
194      break;
195    default:
196      sse2fct=jsimd_ycc_rgb_convert_sse2;
197      break;
198  }
199
200  sse2fct(cinfo->output_width, input_buf, input_row, output_buf, num_rows);
201}
202
203GLOBAL(void)
204jsimd_ycc_rgb565_convert (j_decompress_ptr cinfo,
205                          JSAMPIMAGE input_buf, JDIMENSION input_row,
206                          JSAMPARRAY output_buf, int num_rows)
207{
208}
209
210GLOBAL(int)
211jsimd_can_h2v2_downsample (void)
212{
213  /* The code is optimised for these values only */
214  if (BITS_IN_JSAMPLE != 8)
215    return 0;
216  if (sizeof(JDIMENSION) != 4)
217    return 0;
218
219  return 1;
220}
221
222GLOBAL(int)
223jsimd_can_h2v1_downsample (void)
224{
225  /* The code is optimised for these values only */
226  if (BITS_IN_JSAMPLE != 8)
227    return 0;
228  if (sizeof(JDIMENSION) != 4)
229    return 0;
230
231  return 1;
232}
233
234GLOBAL(void)
235jsimd_h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
236                       JSAMPARRAY input_data, JSAMPARRAY output_data)
237{
238  jsimd_h2v2_downsample_sse2(cinfo->image_width, cinfo->max_v_samp_factor,
239                             compptr->v_samp_factor, compptr->width_in_blocks,
240                             input_data, output_data);
241}
242
243GLOBAL(void)
244jsimd_h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
245                       JSAMPARRAY input_data, JSAMPARRAY output_data)
246{
247  jsimd_h2v1_downsample_sse2(cinfo->image_width, cinfo->max_v_samp_factor,
248                             compptr->v_samp_factor, compptr->width_in_blocks,
249                             input_data, output_data);
250}
251
252GLOBAL(int)
253jsimd_can_h2v2_upsample (void)
254{
255  /* The code is optimised for these values only */
256  if (BITS_IN_JSAMPLE != 8)
257    return 0;
258  if (sizeof(JDIMENSION) != 4)
259    return 0;
260
261  return 1;
262}
263
264GLOBAL(int)
265jsimd_can_h2v1_upsample (void)
266{
267  /* The code is optimised for these values only */
268  if (BITS_IN_JSAMPLE != 8)
269    return 0;
270  if (sizeof(JDIMENSION) != 4)
271    return 0;
272
273  return 1;
274}
275
276GLOBAL(void)
277jsimd_h2v2_upsample (j_decompress_ptr cinfo,
278                     jpeg_component_info * compptr,
279                     JSAMPARRAY input_data,
280                     JSAMPARRAY * output_data_ptr)
281{
282  jsimd_h2v2_upsample_sse2(cinfo->max_v_samp_factor, cinfo->output_width,
283                           input_data, output_data_ptr);
284}
285
286GLOBAL(void)
287jsimd_h2v1_upsample (j_decompress_ptr cinfo,
288                     jpeg_component_info * compptr,
289                     JSAMPARRAY input_data,
290                     JSAMPARRAY * output_data_ptr)
291{
292  jsimd_h2v1_upsample_sse2(cinfo->max_v_samp_factor, cinfo->output_width,
293                           input_data, output_data_ptr);
294}
295
296GLOBAL(int)
297jsimd_can_h2v2_fancy_upsample (void)
298{
299  /* The code is optimised for these values only */
300  if (BITS_IN_JSAMPLE != 8)
301    return 0;
302  if (sizeof(JDIMENSION) != 4)
303    return 0;
304
305  if (!IS_ALIGNED_SSE(jconst_fancy_upsample_sse2))
306    return 0;
307
308  return 1;
309}
310
311GLOBAL(int)
312jsimd_can_h2v1_fancy_upsample (void)
313{
314  /* The code is optimised for these values only */
315  if (BITS_IN_JSAMPLE != 8)
316    return 0;
317  if (sizeof(JDIMENSION) != 4)
318    return 0;
319
320  if (!IS_ALIGNED_SSE(jconst_fancy_upsample_sse2))
321    return 0;
322
323  return 1;
324}
325
326GLOBAL(void)
327jsimd_h2v2_fancy_upsample (j_decompress_ptr cinfo,
328                           jpeg_component_info * compptr,
329                           JSAMPARRAY input_data,
330                           JSAMPARRAY * output_data_ptr)
331{
332  jsimd_h2v2_fancy_upsample_sse2(cinfo->max_v_samp_factor,
333                                 compptr->downsampled_width, input_data,
334                                 output_data_ptr);
335}
336
337GLOBAL(void)
338jsimd_h2v1_fancy_upsample (j_decompress_ptr cinfo,
339                           jpeg_component_info * compptr,
340                           JSAMPARRAY input_data,
341                           JSAMPARRAY * output_data_ptr)
342{
343  jsimd_h2v1_fancy_upsample_sse2(cinfo->max_v_samp_factor,
344                                 compptr->downsampled_width, input_data,
345                                 output_data_ptr);
346}
347
348GLOBAL(int)
349jsimd_can_h2v2_merged_upsample (void)
350{
351  /* The code is optimised for these values only */
352  if (BITS_IN_JSAMPLE != 8)
353    return 0;
354  if (sizeof(JDIMENSION) != 4)
355    return 0;
356
357  if (!IS_ALIGNED_SSE(jconst_merged_upsample_sse2))
358    return 0;
359
360  return 1;
361}
362
363GLOBAL(int)
364jsimd_can_h2v1_merged_upsample (void)
365{
366  /* The code is optimised for these values only */
367  if (BITS_IN_JSAMPLE != 8)
368    return 0;
369  if (sizeof(JDIMENSION) != 4)
370    return 0;
371
372  if (!IS_ALIGNED_SSE(jconst_merged_upsample_sse2))
373    return 0;
374
375  return 1;
376}
377
378GLOBAL(void)
379jsimd_h2v2_merged_upsample (j_decompress_ptr cinfo,
380                            JSAMPIMAGE input_buf,
381                            JDIMENSION in_row_group_ctr,
382                            JSAMPARRAY output_buf)
383{
384  void (*sse2fct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
385
386  switch(cinfo->out_color_space) {
387    case JCS_EXT_RGB:
388      sse2fct=jsimd_h2v2_extrgb_merged_upsample_sse2;
389      break;
390    case JCS_EXT_RGBX:
391    case JCS_EXT_RGBA:
392      sse2fct=jsimd_h2v2_extrgbx_merged_upsample_sse2;
393      break;
394    case JCS_EXT_BGR:
395      sse2fct=jsimd_h2v2_extbgr_merged_upsample_sse2;
396      break;
397    case JCS_EXT_BGRX:
398    case JCS_EXT_BGRA:
399      sse2fct=jsimd_h2v2_extbgrx_merged_upsample_sse2;
400      break;
401    case JCS_EXT_XBGR:
402    case JCS_EXT_ABGR:
403      sse2fct=jsimd_h2v2_extxbgr_merged_upsample_sse2;
404      break;
405    case JCS_EXT_XRGB:
406    case JCS_EXT_ARGB:
407      sse2fct=jsimd_h2v2_extxrgb_merged_upsample_sse2;
408      break;
409    default:
410      sse2fct=jsimd_h2v2_merged_upsample_sse2;
411      break;
412  }
413
414  sse2fct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
415}
416
417GLOBAL(void)
418jsimd_h2v1_merged_upsample (j_decompress_ptr cinfo,
419                            JSAMPIMAGE input_buf,
420                            JDIMENSION in_row_group_ctr,
421                            JSAMPARRAY output_buf)
422{
423  void (*sse2fct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
424
425  switch(cinfo->out_color_space) {
426    case JCS_EXT_RGB:
427      sse2fct=jsimd_h2v1_extrgb_merged_upsample_sse2;
428      break;
429    case JCS_EXT_RGBX:
430    case JCS_EXT_RGBA:
431      sse2fct=jsimd_h2v1_extrgbx_merged_upsample_sse2;
432      break;
433    case JCS_EXT_BGR:
434      sse2fct=jsimd_h2v1_extbgr_merged_upsample_sse2;
435      break;
436    case JCS_EXT_BGRX:
437    case JCS_EXT_BGRA:
438      sse2fct=jsimd_h2v1_extbgrx_merged_upsample_sse2;
439      break;
440    case JCS_EXT_XBGR:
441    case JCS_EXT_ABGR:
442      sse2fct=jsimd_h2v1_extxbgr_merged_upsample_sse2;
443      break;
444    case JCS_EXT_XRGB:
445    case JCS_EXT_ARGB:
446      sse2fct=jsimd_h2v1_extxrgb_merged_upsample_sse2;
447      break;
448    default:
449      sse2fct=jsimd_h2v1_merged_upsample_sse2;
450      break;
451  }
452
453  sse2fct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
454}
455
456GLOBAL(int)
457jsimd_can_convsamp (void)
458{
459  /* The code is optimised for these values only */
460  if (DCTSIZE != 8)
461    return 0;
462  if (BITS_IN_JSAMPLE != 8)
463    return 0;
464  if (sizeof(JDIMENSION) != 4)
465    return 0;
466  if (sizeof(DCTELEM) != 2)
467    return 0;
468
469  return 1;
470}
471
472GLOBAL(int)
473jsimd_can_convsamp_float (void)
474{
475  /* The code is optimised for these values only */
476  if (DCTSIZE != 8)
477    return 0;
478  if (BITS_IN_JSAMPLE != 8)
479    return 0;
480  if (sizeof(JDIMENSION) != 4)
481    return 0;
482  if (sizeof(FAST_FLOAT) != 4)
483    return 0;
484
485  return 1;
486}
487
488GLOBAL(void)
489jsimd_convsamp (JSAMPARRAY sample_data, JDIMENSION start_col,
490                DCTELEM * workspace)
491{
492  jsimd_convsamp_sse2(sample_data, start_col, workspace);
493}
494
495GLOBAL(void)
496jsimd_convsamp_float (JSAMPARRAY sample_data, JDIMENSION start_col,
497                      FAST_FLOAT * workspace)
498{
499  jsimd_convsamp_float_sse2(sample_data, start_col, workspace);
500}
501
502GLOBAL(int)
503jsimd_can_fdct_islow (void)
504{
505  /* The code is optimised for these values only */
506  if (DCTSIZE != 8)
507    return 0;
508  if (sizeof(DCTELEM) != 2)
509    return 0;
510
511  if (!IS_ALIGNED_SSE(jconst_fdct_islow_sse2))
512    return 0;
513
514  return 1;
515}
516
517GLOBAL(int)
518jsimd_can_fdct_ifast (void)
519{
520  /* The code is optimised for these values only */
521  if (DCTSIZE != 8)
522    return 0;
523  if (sizeof(DCTELEM) != 2)
524    return 0;
525
526  if (!IS_ALIGNED_SSE(jconst_fdct_ifast_sse2))
527    return 0;
528
529  return 1;
530}
531
532GLOBAL(int)
533jsimd_can_fdct_float (void)
534{
535  /* The code is optimised for these values only */
536  if (DCTSIZE != 8)
537    return 0;
538  if (sizeof(FAST_FLOAT) != 4)
539    return 0;
540
541  if (!IS_ALIGNED_SSE(jconst_fdct_float_sse))
542    return 0;
543
544  return 1;
545}
546
547GLOBAL(void)
548jsimd_fdct_islow (DCTELEM * data)
549{
550  jsimd_fdct_islow_sse2(data);
551}
552
553GLOBAL(void)
554jsimd_fdct_ifast (DCTELEM * data)
555{
556  jsimd_fdct_ifast_sse2(data);
557}
558
559GLOBAL(void)
560jsimd_fdct_float (FAST_FLOAT * data)
561{
562  jsimd_fdct_float_sse(data);
563}
564
565GLOBAL(int)
566jsimd_can_quantize (void)
567{
568  /* The code is optimised for these values only */
569  if (DCTSIZE != 8)
570    return 0;
571  if (sizeof(JCOEF) != 2)
572    return 0;
573  if (sizeof(DCTELEM) != 2)
574    return 0;
575
576  return 1;
577}
578
579GLOBAL(int)
580jsimd_can_quantize_float (void)
581{
582  /* The code is optimised for these values only */
583  if (DCTSIZE != 8)
584    return 0;
585  if (sizeof(JCOEF) != 2)
586    return 0;
587  if (sizeof(FAST_FLOAT) != 4)
588    return 0;
589
590  return 1;
591}
592
593GLOBAL(void)
594jsimd_quantize (JCOEFPTR coef_block, DCTELEM * divisors,
595                DCTELEM * workspace)
596{
597  jsimd_quantize_sse2(coef_block, divisors, workspace);
598}
599
600GLOBAL(void)
601jsimd_quantize_float (JCOEFPTR coef_block, FAST_FLOAT * divisors,
602                      FAST_FLOAT * workspace)
603{
604  jsimd_quantize_float_sse2(coef_block, divisors, workspace);
605}
606
607GLOBAL(int)
608jsimd_can_idct_2x2 (void)
609{
610  /* The code is optimised for these values only */
611  if (DCTSIZE != 8)
612    return 0;
613  if (sizeof(JCOEF) != 2)
614    return 0;
615  if (BITS_IN_JSAMPLE != 8)
616    return 0;
617  if (sizeof(JDIMENSION) != 4)
618    return 0;
619  if (sizeof(ISLOW_MULT_TYPE) != 2)
620    return 0;
621
622  if (!IS_ALIGNED_SSE(jconst_idct_red_sse2))
623    return 0;
624
625  return 1;
626}
627
628GLOBAL(int)
629jsimd_can_idct_4x4 (void)
630{
631  /* The code is optimised for these values only */
632  if (DCTSIZE != 8)
633    return 0;
634  if (sizeof(JCOEF) != 2)
635    return 0;
636  if (BITS_IN_JSAMPLE != 8)
637    return 0;
638  if (sizeof(JDIMENSION) != 4)
639    return 0;
640  if (sizeof(ISLOW_MULT_TYPE) != 2)
641    return 0;
642
643  if (!IS_ALIGNED_SSE(jconst_idct_red_sse2))
644    return 0;
645
646  return 1;
647}
648
649GLOBAL(void)
650jsimd_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
651                JCOEFPTR coef_block, JSAMPARRAY output_buf,
652                JDIMENSION output_col)
653{
654  jsimd_idct_2x2_sse2(compptr->dct_table, coef_block, output_buf, output_col);
655}
656
657GLOBAL(void)
658jsimd_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
659                JCOEFPTR coef_block, JSAMPARRAY output_buf,
660                JDIMENSION output_col)
661{
662  jsimd_idct_4x4_sse2(compptr->dct_table, coef_block, output_buf, output_col);
663}
664
665GLOBAL(int)
666jsimd_can_idct_islow (void)
667{
668  /* The code is optimised for these values only */
669  if (DCTSIZE != 8)
670    return 0;
671  if (sizeof(JCOEF) != 2)
672    return 0;
673  if (BITS_IN_JSAMPLE != 8)
674    return 0;
675  if (sizeof(JDIMENSION) != 4)
676    return 0;
677  if (sizeof(ISLOW_MULT_TYPE) != 2)
678    return 0;
679
680  if (!IS_ALIGNED_SSE(jconst_idct_islow_sse2))
681    return 0;
682
683  return 1;
684}
685
686GLOBAL(int)
687jsimd_can_idct_ifast (void)
688{
689  /* The code is optimised for these values only */
690  if (DCTSIZE != 8)
691    return 0;
692  if (sizeof(JCOEF) != 2)
693    return 0;
694  if (BITS_IN_JSAMPLE != 8)
695    return 0;
696  if (sizeof(JDIMENSION) != 4)
697    return 0;
698  if (sizeof(IFAST_MULT_TYPE) != 2)
699    return 0;
700  if (IFAST_SCALE_BITS != 2)
701    return 0;
702
703  if (!IS_ALIGNED_SSE(jconst_idct_ifast_sse2))
704    return 0;
705
706  return 1;
707}
708
709GLOBAL(int)
710jsimd_can_idct_float (void)
711{
712  if (DCTSIZE != 8)
713    return 0;
714  if (sizeof(JCOEF) != 2)
715    return 0;
716  if (BITS_IN_JSAMPLE != 8)
717    return 0;
718  if (sizeof(JDIMENSION) != 4)
719    return 0;
720  if (sizeof(FAST_FLOAT) != 4)
721    return 0;
722  if (sizeof(FLOAT_MULT_TYPE) != 4)
723    return 0;
724
725  if (!IS_ALIGNED_SSE(jconst_idct_float_sse2))
726    return 0;
727
728  return 1;
729}
730
731GLOBAL(void)
732jsimd_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
733                  JCOEFPTR coef_block, JSAMPARRAY output_buf,
734                  JDIMENSION output_col)
735{
736  jsimd_idct_islow_sse2(compptr->dct_table, coef_block, output_buf,
737                        output_col);
738}
739
740GLOBAL(void)
741jsimd_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
742                  JCOEFPTR coef_block, JSAMPARRAY output_buf,
743                  JDIMENSION output_col)
744{
745  jsimd_idct_ifast_sse2(compptr->dct_table, coef_block, output_buf,
746                        output_col);
747}
748
749GLOBAL(void)
750jsimd_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
751                  JCOEFPTR coef_block, JSAMPARRAY output_buf,
752                  JDIMENSION output_col)
753{
754  jsimd_idct_float_sse2(compptr->dct_table, coef_block, output_buf,
755                        output_col);
756}
757
758