Home | History | Annotate | Download | only in simd
      1 /*
      2  * jsimd_x86_64.c
      3  *
      4  * Copyright 2009 Pierre Ossman <ossman (at) 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 
     32 GLOBAL(int)
     33 jsimd_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 
     49 GLOBAL(int)
     50 jsimd_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 
     66 GLOBAL(int)
     67 jsimd_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 
     83 GLOBAL(int)
     84 jsimd_can_ycc_rgb565 (void)
     85 {
     86   return 0;
     87 }
     88 
     89 GLOBAL(void)
     90 jsimd_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 
    127 GLOBAL(void)
    128 jsimd_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 
    165 GLOBAL(void)
    166 jsimd_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 
    203 GLOBAL(void)
    204 jsimd_ycc_rgb565_convert (j_decompress_ptr cinfo,
    205                           JSAMPIMAGE input_buf, JDIMENSION input_row,
    206                           JSAMPARRAY output_buf, int num_rows)
    207 {
    208 }
    209 
    210 GLOBAL(int)
    211 jsimd_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 
    222 GLOBAL(int)
    223 jsimd_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 
    234 GLOBAL(void)
    235 jsimd_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 
    243 GLOBAL(void)
    244 jsimd_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 
    252 GLOBAL(int)
    253 jsimd_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 
    264 GLOBAL(int)
    265 jsimd_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 
    276 GLOBAL(void)
    277 jsimd_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 
    286 GLOBAL(void)
    287 jsimd_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 
    296 GLOBAL(int)
    297 jsimd_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 
    311 GLOBAL(int)
    312 jsimd_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 
    326 GLOBAL(void)
    327 jsimd_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 
    337 GLOBAL(void)
    338 jsimd_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 
    348 GLOBAL(int)
    349 jsimd_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 
    363 GLOBAL(int)
    364 jsimd_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 
    378 GLOBAL(void)
    379 jsimd_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 
    417 GLOBAL(void)
    418 jsimd_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 
    456 GLOBAL(int)
    457 jsimd_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 
    472 GLOBAL(int)
    473 jsimd_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 
    488 GLOBAL(void)
    489 jsimd_convsamp (JSAMPARRAY sample_data, JDIMENSION start_col,
    490                 DCTELEM * workspace)
    491 {
    492   jsimd_convsamp_sse2(sample_data, start_col, workspace);
    493 }
    494 
    495 GLOBAL(void)
    496 jsimd_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 
    502 GLOBAL(int)
    503 jsimd_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 
    517 GLOBAL(int)
    518 jsimd_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 
    532 GLOBAL(int)
    533 jsimd_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 
    547 GLOBAL(void)
    548 jsimd_fdct_islow (DCTELEM * data)
    549 {
    550   jsimd_fdct_islow_sse2(data);
    551 }
    552 
    553 GLOBAL(void)
    554 jsimd_fdct_ifast (DCTELEM * data)
    555 {
    556   jsimd_fdct_ifast_sse2(data);
    557 }
    558 
    559 GLOBAL(void)
    560 jsimd_fdct_float (FAST_FLOAT * data)
    561 {
    562   jsimd_fdct_float_sse(data);
    563 }
    564 
    565 GLOBAL(int)
    566 jsimd_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 
    579 GLOBAL(int)
    580 jsimd_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 
    593 GLOBAL(void)
    594 jsimd_quantize (JCOEFPTR coef_block, DCTELEM * divisors,
    595                 DCTELEM * workspace)
    596 {
    597   jsimd_quantize_sse2(coef_block, divisors, workspace);
    598 }
    599 
    600 GLOBAL(void)
    601 jsimd_quantize_float (JCOEFPTR coef_block, FAST_FLOAT * divisors,
    602                       FAST_FLOAT * workspace)
    603 {
    604   jsimd_quantize_float_sse2(coef_block, divisors, workspace);
    605 }
    606 
    607 GLOBAL(int)
    608 jsimd_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 
    628 GLOBAL(int)
    629 jsimd_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 
    649 GLOBAL(void)
    650 jsimd_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 
    657 GLOBAL(void)
    658 jsimd_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 
    665 GLOBAL(int)
    666 jsimd_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 
    686 GLOBAL(int)
    687 jsimd_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 
    709 GLOBAL(int)
    710 jsimd_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 
    731 GLOBAL(void)
    732 jsimd_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 
    740 GLOBAL(void)
    741 jsimd_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 
    749 GLOBAL(void)
    750 jsimd_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