• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * jsimd_arm.c
3  *
4  * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
5  * Copyright 2009-2011, 2013-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  * 32-bit ARM 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 #include <stdio.h>
25 #include <string.h>
26 #include <ctype.h>
27 
28 static unsigned int simd_support = ~0;
29 
30 #if defined(__linux__) || defined(ANDROID) || defined(__ANDROID__)
31 
32 #define SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT (1024 * 1024)
33 
34 LOCAL(int)
check_feature(char * buffer,char * feature)35 check_feature (char *buffer, char *feature)
36 {
37   char *p;
38   if (*feature == 0)
39     return 0;
40   if (strncmp(buffer, "Features", 8) != 0)
41     return 0;
42   buffer += 8;
43   while (isspace(*buffer))
44     buffer++;
45 
46   /* Check if 'feature' is present in the buffer as a separate word */
47   while ((p = strstr(buffer, feature))) {
48     if (p > buffer && !isspace(*(p - 1))) {
49       buffer++;
50       continue;
51     }
52     p += strlen(feature);
53     if (*p != 0 && !isspace(*p)) {
54       buffer++;
55       continue;
56     }
57     return 1;
58   }
59   return 0;
60 }
61 
62 LOCAL(int)
parse_proc_cpuinfo(int bufsize)63 parse_proc_cpuinfo (int bufsize)
64 {
65   char *buffer = (char *)malloc(bufsize);
66   FILE *fd;
67   simd_support = 0;
68 
69   if (!buffer)
70     return 0;
71 
72   fd = fopen("/proc/cpuinfo", "r");
73   if (fd) {
74     while (fgets(buffer, bufsize, fd)) {
75       if (!strchr(buffer, '\n') && !feof(fd)) {
76         /* "impossible" happened - insufficient size of the buffer! */
77         fclose(fd);
78         free(buffer);
79         return 0;
80       }
81       if (check_feature(buffer, "neon"))
82         simd_support |= JSIMD_ARM_NEON;
83     }
84     fclose(fd);
85   }
86   free(buffer);
87   return 1;
88 }
89 
90 #endif
91 
92 /*
93  * Check what SIMD accelerations are supported.
94  *
95  * FIXME: This code is racy under a multi-threaded environment.
96  */
97 LOCAL(void)
init_simd(void)98 init_simd (void)
99 {
100   char *env = NULL;
101 #if !defined(__ARM_NEON__) && defined(__linux__) || defined(ANDROID) || defined(__ANDROID__)
102   int bufsize = 1024; /* an initial guess for the line buffer size limit */
103 #endif
104 
105   if (simd_support != ~0U)
106     return;
107 
108   simd_support = 0;
109 
110 #if defined(__ARM_NEON__)
111   simd_support |= JSIMD_ARM_NEON;
112 #elif defined(__linux__) || defined(ANDROID) || defined(__ANDROID__)
113   /* We still have a chance to use NEON regardless of globally used
114    * -mcpu/-mfpu options passed to gcc by performing runtime detection via
115    * /proc/cpuinfo parsing on linux/android */
116   while (!parse_proc_cpuinfo(bufsize)) {
117     bufsize *= 2;
118     if (bufsize > SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT)
119       break;
120   }
121 #endif
122 
123   /* Force different settings through environment variables */
124   env = getenv("JSIMD_FORCENEON");
125   if ((env != NULL) && (strcmp(env, "1") == 0))
126     simd_support &= JSIMD_ARM_NEON;
127   env = getenv("JSIMD_FORCENONE");
128   if ((env != NULL) && (strcmp(env, "1") == 0))
129     simd_support = 0;
130 }
131 
132 GLOBAL(int)
jsimd_can_rgb_ycc(void)133 jsimd_can_rgb_ycc (void)
134 {
135   init_simd();
136 
137   /* The code is optimised for these values only */
138   if (BITS_IN_JSAMPLE != 8)
139     return 0;
140   if (sizeof(JDIMENSION) != 4)
141     return 0;
142   if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
143     return 0;
144 
145   if (simd_support & JSIMD_ARM_NEON)
146     return 1;
147 
148   return 0;
149 }
150 
151 GLOBAL(int)
jsimd_can_rgb_gray(void)152 jsimd_can_rgb_gray (void)
153 {
154   init_simd();
155 
156   return 0;
157 }
158 
159 GLOBAL(int)
jsimd_can_ycc_rgb(void)160 jsimd_can_ycc_rgb (void)
161 {
162   init_simd();
163 
164   /* The code is optimised for these values only */
165   if (BITS_IN_JSAMPLE != 8)
166     return 0;
167   if (sizeof(JDIMENSION) != 4)
168     return 0;
169   if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
170     return 0;
171 
172   if (simd_support & JSIMD_ARM_NEON)
173     return 1;
174 
175   return 0;
176 }
177 
178 GLOBAL(int)
jsimd_can_ycc_rgb565(void)179 jsimd_can_ycc_rgb565 (void)
180 {
181   init_simd();
182 
183   /* The code is optimised for these values only */
184   if (BITS_IN_JSAMPLE != 8)
185     return 0;
186   if (sizeof(JDIMENSION) != 4)
187     return 0;
188 
189   if (simd_support & JSIMD_ARM_NEON)
190     return 1;
191 
192   return 0;
193 }
194 
195 GLOBAL(void)
jsimd_rgb_ycc_convert(j_compress_ptr cinfo,JSAMPARRAY input_buf,JSAMPIMAGE output_buf,JDIMENSION output_row,int num_rows)196 jsimd_rgb_ycc_convert (j_compress_ptr cinfo,
197                        JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
198                        JDIMENSION output_row, int num_rows)
199 {
200   void (*neonfct)(JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
201 
202   switch(cinfo->in_color_space) {
203     case JCS_EXT_RGB:
204       neonfct=jsimd_extrgb_ycc_convert_neon;
205       break;
206     case JCS_EXT_RGBX:
207     case JCS_EXT_RGBA:
208       neonfct=jsimd_extrgbx_ycc_convert_neon;
209       break;
210     case JCS_EXT_BGR:
211       neonfct=jsimd_extbgr_ycc_convert_neon;
212       break;
213     case JCS_EXT_BGRX:
214     case JCS_EXT_BGRA:
215       neonfct=jsimd_extbgrx_ycc_convert_neon;
216       break;
217     case JCS_EXT_XBGR:
218     case JCS_EXT_ABGR:
219       neonfct=jsimd_extxbgr_ycc_convert_neon;
220       break;
221     case JCS_EXT_XRGB:
222     case JCS_EXT_ARGB:
223       neonfct=jsimd_extxrgb_ycc_convert_neon;
224       break;
225     default:
226       neonfct=jsimd_extrgb_ycc_convert_neon;
227       break;
228   }
229 
230   if (simd_support & JSIMD_ARM_NEON)
231     neonfct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
232 }
233 
234 GLOBAL(void)
jsimd_rgb_gray_convert(j_compress_ptr cinfo,JSAMPARRAY input_buf,JSAMPIMAGE output_buf,JDIMENSION output_row,int num_rows)235 jsimd_rgb_gray_convert (j_compress_ptr cinfo,
236                         JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
237                         JDIMENSION output_row, int num_rows)
238 {
239 }
240 
241 GLOBAL(void)
jsimd_ycc_rgb_convert(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION input_row,JSAMPARRAY output_buf,int num_rows)242 jsimd_ycc_rgb_convert (j_decompress_ptr cinfo,
243                        JSAMPIMAGE input_buf, JDIMENSION input_row,
244                        JSAMPARRAY output_buf, int num_rows)
245 {
246   void (*neonfct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int);
247 
248   switch(cinfo->out_color_space) {
249     case JCS_EXT_RGB:
250       neonfct=jsimd_ycc_extrgb_convert_neon;
251       break;
252     case JCS_EXT_RGBX:
253     case JCS_EXT_RGBA:
254       neonfct=jsimd_ycc_extrgbx_convert_neon;
255       break;
256     case JCS_EXT_BGR:
257       neonfct=jsimd_ycc_extbgr_convert_neon;
258       break;
259     case JCS_EXT_BGRX:
260     case JCS_EXT_BGRA:
261       neonfct=jsimd_ycc_extbgrx_convert_neon;
262       break;
263     case JCS_EXT_XBGR:
264     case JCS_EXT_ABGR:
265       neonfct=jsimd_ycc_extxbgr_convert_neon;
266       break;
267     case JCS_EXT_XRGB:
268     case JCS_EXT_ARGB:
269       neonfct=jsimd_ycc_extxrgb_convert_neon;
270       break;
271     default:
272       neonfct=jsimd_ycc_extrgb_convert_neon;
273       break;
274   }
275 
276   if (simd_support & JSIMD_ARM_NEON)
277     neonfct(cinfo->output_width, input_buf, input_row, output_buf, num_rows);
278 }
279 
280 GLOBAL(void)
jsimd_ycc_rgb565_convert(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION input_row,JSAMPARRAY output_buf,int num_rows)281 jsimd_ycc_rgb565_convert (j_decompress_ptr cinfo,
282                           JSAMPIMAGE input_buf, JDIMENSION input_row,
283                           JSAMPARRAY output_buf, int num_rows)
284 {
285   if (simd_support & JSIMD_ARM_NEON)
286     jsimd_ycc_rgb565_convert_neon(cinfo->output_width, input_buf, input_row,
287                                   output_buf, num_rows);
288 }
289 
290 GLOBAL(int)
jsimd_can_h2v2_downsample(void)291 jsimd_can_h2v2_downsample (void)
292 {
293   init_simd();
294 
295   return 0;
296 }
297 
298 GLOBAL(int)
jsimd_can_h2v1_downsample(void)299 jsimd_can_h2v1_downsample (void)
300 {
301   init_simd();
302 
303   return 0;
304 }
305 
306 GLOBAL(void)
jsimd_h2v2_downsample(j_compress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY output_data)307 jsimd_h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
308                        JSAMPARRAY input_data, JSAMPARRAY output_data)
309 {
310 }
311 
312 GLOBAL(void)
jsimd_h2v1_downsample(j_compress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY output_data)313 jsimd_h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
314                        JSAMPARRAY input_data, JSAMPARRAY output_data)
315 {
316 }
317 
318 GLOBAL(int)
jsimd_can_h2v2_upsample(void)319 jsimd_can_h2v2_upsample (void)
320 {
321   init_simd();
322 
323   return 0;
324 }
325 
326 GLOBAL(int)
jsimd_can_h2v1_upsample(void)327 jsimd_can_h2v1_upsample (void)
328 {
329   init_simd();
330 
331   return 0;
332 }
333 
334 GLOBAL(void)
jsimd_h2v2_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)335 jsimd_h2v2_upsample (j_decompress_ptr cinfo,
336                      jpeg_component_info * compptr,
337                      JSAMPARRAY input_data,
338                      JSAMPARRAY * output_data_ptr)
339 {
340 }
341 
342 GLOBAL(void)
jsimd_h2v1_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)343 jsimd_h2v1_upsample (j_decompress_ptr cinfo,
344                      jpeg_component_info * compptr,
345                      JSAMPARRAY input_data,
346                      JSAMPARRAY * output_data_ptr)
347 {
348 }
349 
350 GLOBAL(int)
jsimd_can_h2v2_fancy_upsample(void)351 jsimd_can_h2v2_fancy_upsample (void)
352 {
353   init_simd();
354 
355   return 0;
356 }
357 
358 GLOBAL(int)
jsimd_can_h2v1_fancy_upsample(void)359 jsimd_can_h2v1_fancy_upsample (void)
360 {
361   init_simd();
362 
363   /* The code is optimised for these values only */
364   if (BITS_IN_JSAMPLE != 8)
365     return 0;
366   if (sizeof(JDIMENSION) != 4)
367     return 0;
368 
369   if (simd_support & JSIMD_ARM_NEON)
370     return 1;
371 
372   return 0;
373 }
374 
375 GLOBAL(void)
jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)376 jsimd_h2v2_fancy_upsample (j_decompress_ptr cinfo,
377                            jpeg_component_info * compptr,
378                            JSAMPARRAY input_data,
379                            JSAMPARRAY * output_data_ptr)
380 {
381 }
382 
383 GLOBAL(void)
jsimd_h2v1_fancy_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)384 jsimd_h2v1_fancy_upsample (j_decompress_ptr cinfo,
385                            jpeg_component_info * compptr,
386                            JSAMPARRAY input_data,
387                            JSAMPARRAY * output_data_ptr)
388 {
389   if (simd_support & JSIMD_ARM_NEON)
390     jsimd_h2v1_fancy_upsample_neon(cinfo->max_v_samp_factor,
391                                    compptr->downsampled_width, input_data,
392                                    output_data_ptr);
393 }
394 
395 GLOBAL(int)
jsimd_can_h2v2_merged_upsample(void)396 jsimd_can_h2v2_merged_upsample (void)
397 {
398   init_simd();
399 
400   return 0;
401 }
402 
403 GLOBAL(int)
jsimd_can_h2v1_merged_upsample(void)404 jsimd_can_h2v1_merged_upsample (void)
405 {
406   init_simd();
407 
408   return 0;
409 }
410 
411 GLOBAL(void)
jsimd_h2v2_merged_upsample(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION in_row_group_ctr,JSAMPARRAY output_buf)412 jsimd_h2v2_merged_upsample (j_decompress_ptr cinfo,
413                             JSAMPIMAGE input_buf,
414                             JDIMENSION in_row_group_ctr,
415                             JSAMPARRAY output_buf)
416 {
417 }
418 
419 GLOBAL(void)
jsimd_h2v1_merged_upsample(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION in_row_group_ctr,JSAMPARRAY output_buf)420 jsimd_h2v1_merged_upsample (j_decompress_ptr cinfo,
421                             JSAMPIMAGE input_buf,
422                             JDIMENSION in_row_group_ctr,
423                             JSAMPARRAY output_buf)
424 {
425 }
426 
427 GLOBAL(int)
jsimd_can_convsamp(void)428 jsimd_can_convsamp (void)
429 {
430   init_simd();
431 
432   /* The code is optimised for these values only */
433   if (DCTSIZE != 8)
434     return 0;
435   if (BITS_IN_JSAMPLE != 8)
436     return 0;
437   if (sizeof(JDIMENSION) != 4)
438     return 0;
439   if (sizeof(DCTELEM) != 2)
440     return 0;
441 
442   if (simd_support & JSIMD_ARM_NEON)
443     return 1;
444 
445   return 0;
446 }
447 
448 GLOBAL(int)
jsimd_can_convsamp_float(void)449 jsimd_can_convsamp_float (void)
450 {
451   init_simd();
452 
453   return 0;
454 }
455 
456 GLOBAL(void)
jsimd_convsamp(JSAMPARRAY sample_data,JDIMENSION start_col,DCTELEM * workspace)457 jsimd_convsamp (JSAMPARRAY sample_data, JDIMENSION start_col,
458                 DCTELEM * workspace)
459 {
460   if (simd_support & JSIMD_ARM_NEON)
461     jsimd_convsamp_neon(sample_data, start_col, workspace);
462 }
463 
464 GLOBAL(void)
jsimd_convsamp_float(JSAMPARRAY sample_data,JDIMENSION start_col,FAST_FLOAT * workspace)465 jsimd_convsamp_float (JSAMPARRAY sample_data, JDIMENSION start_col,
466                       FAST_FLOAT * workspace)
467 {
468 }
469 
470 GLOBAL(int)
jsimd_can_fdct_islow(void)471 jsimd_can_fdct_islow (void)
472 {
473   init_simd();
474 
475   return 0;
476 }
477 
478 GLOBAL(int)
jsimd_can_fdct_ifast(void)479 jsimd_can_fdct_ifast (void)
480 {
481   init_simd();
482 
483   /* The code is optimised for these values only */
484   if (DCTSIZE != 8)
485     return 0;
486   if (sizeof(DCTELEM) != 2)
487     return 0;
488 
489   if (simd_support & JSIMD_ARM_NEON)
490     return 1;
491 
492   return 0;
493 }
494 
495 GLOBAL(int)
jsimd_can_fdct_float(void)496 jsimd_can_fdct_float (void)
497 {
498   init_simd();
499 
500   return 0;
501 }
502 
503 GLOBAL(void)
jsimd_fdct_islow(DCTELEM * data)504 jsimd_fdct_islow (DCTELEM * data)
505 {
506 }
507 
508 GLOBAL(void)
jsimd_fdct_ifast(DCTELEM * data)509 jsimd_fdct_ifast (DCTELEM * data)
510 {
511   if (simd_support & JSIMD_ARM_NEON)
512     jsimd_fdct_ifast_neon(data);
513 }
514 
515 GLOBAL(void)
jsimd_fdct_float(FAST_FLOAT * data)516 jsimd_fdct_float (FAST_FLOAT * data)
517 {
518 }
519 
520 GLOBAL(int)
jsimd_can_quantize(void)521 jsimd_can_quantize (void)
522 {
523   init_simd();
524 
525   /* The code is optimised for these values only */
526   if (DCTSIZE != 8)
527     return 0;
528   if (sizeof(JCOEF) != 2)
529     return 0;
530   if (sizeof(DCTELEM) != 2)
531     return 0;
532 
533   if (simd_support & JSIMD_ARM_NEON)
534     return 1;
535 
536   return 0;
537 }
538 
539 GLOBAL(int)
jsimd_can_quantize_float(void)540 jsimd_can_quantize_float (void)
541 {
542   init_simd();
543 
544   return 0;
545 }
546 
547 GLOBAL(void)
jsimd_quantize(JCOEFPTR coef_block,DCTELEM * divisors,DCTELEM * workspace)548 jsimd_quantize (JCOEFPTR coef_block, DCTELEM * divisors,
549                 DCTELEM * workspace)
550 {
551   if (simd_support & JSIMD_ARM_NEON)
552     jsimd_quantize_neon(coef_block, divisors, workspace);
553 }
554 
555 GLOBAL(void)
jsimd_quantize_float(JCOEFPTR coef_block,FAST_FLOAT * divisors,FAST_FLOAT * workspace)556 jsimd_quantize_float (JCOEFPTR coef_block, FAST_FLOAT * divisors,
557                       FAST_FLOAT * workspace)
558 {
559 }
560 
561 GLOBAL(int)
jsimd_can_idct_2x2(void)562 jsimd_can_idct_2x2 (void)
563 {
564   init_simd();
565 
566   /* The code is optimised for these values only */
567   if (DCTSIZE != 8)
568     return 0;
569   if (sizeof(JCOEF) != 2)
570     return 0;
571   if (BITS_IN_JSAMPLE != 8)
572     return 0;
573   if (sizeof(JDIMENSION) != 4)
574     return 0;
575   if (sizeof(ISLOW_MULT_TYPE) != 2)
576     return 0;
577 
578   if (simd_support & JSIMD_ARM_NEON)
579     return 1;
580 
581   return 0;
582 }
583 
584 GLOBAL(int)
jsimd_can_idct_4x4(void)585 jsimd_can_idct_4x4 (void)
586 {
587   init_simd();
588 
589   /* The code is optimised for these values only */
590   if (DCTSIZE != 8)
591     return 0;
592   if (sizeof(JCOEF) != 2)
593     return 0;
594   if (BITS_IN_JSAMPLE != 8)
595     return 0;
596   if (sizeof(JDIMENSION) != 4)
597     return 0;
598   if (sizeof(ISLOW_MULT_TYPE) != 2)
599     return 0;
600 
601   if (simd_support & JSIMD_ARM_NEON)
602     return 1;
603 
604   return 0;
605 }
606 
607 GLOBAL(void)
jsimd_idct_2x2(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)608 jsimd_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
609                 JCOEFPTR coef_block, JSAMPARRAY output_buf,
610                 JDIMENSION output_col)
611 {
612   if (simd_support & JSIMD_ARM_NEON)
613     jsimd_idct_2x2_neon(compptr->dct_table, coef_block, output_buf,
614                         output_col);
615 }
616 
617 GLOBAL(void)
jsimd_idct_4x4(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)618 jsimd_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
619                 JCOEFPTR coef_block, JSAMPARRAY output_buf,
620                 JDIMENSION output_col)
621 {
622   if (simd_support & JSIMD_ARM_NEON)
623     jsimd_idct_4x4_neon(compptr->dct_table, coef_block, output_buf,
624                         output_col);
625 }
626 
627 GLOBAL(int)
jsimd_can_idct_islow(void)628 jsimd_can_idct_islow (void)
629 {
630   init_simd();
631 
632   /* The code is optimised for these values only */
633   if (DCTSIZE != 8)
634     return 0;
635   if (sizeof(JCOEF) != 2)
636     return 0;
637   if (BITS_IN_JSAMPLE != 8)
638     return 0;
639   if (sizeof(JDIMENSION) != 4)
640     return 0;
641   if (sizeof(ISLOW_MULT_TYPE) != 2)
642     return 0;
643 
644   if (simd_support & JSIMD_ARM_NEON)
645     return 1;
646 
647   return 0;
648 }
649 
650 GLOBAL(int)
jsimd_can_idct_ifast(void)651 jsimd_can_idct_ifast (void)
652 {
653   init_simd();
654 
655   /* The code is optimised for these values only */
656   if (DCTSIZE != 8)
657     return 0;
658   if (sizeof(JCOEF) != 2)
659     return 0;
660   if (BITS_IN_JSAMPLE != 8)
661     return 0;
662   if (sizeof(JDIMENSION) != 4)
663     return 0;
664   if (sizeof(IFAST_MULT_TYPE) != 2)
665     return 0;
666   if (IFAST_SCALE_BITS != 2)
667     return 0;
668 
669   if (simd_support & JSIMD_ARM_NEON)
670     return 1;
671 
672   return 0;
673 }
674 
675 GLOBAL(int)
jsimd_can_idct_float(void)676 jsimd_can_idct_float (void)
677 {
678   init_simd();
679 
680   return 0;
681 }
682 
683 GLOBAL(void)
jsimd_idct_islow(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)684 jsimd_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
685                   JCOEFPTR coef_block, JSAMPARRAY output_buf,
686                   JDIMENSION output_col)
687 {
688   if (simd_support & JSIMD_ARM_NEON)
689     jsimd_idct_islow_neon(compptr->dct_table, coef_block, output_buf,
690                           output_col);
691 }
692 
693 GLOBAL(void)
jsimd_idct_ifast(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)694 jsimd_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
695                   JCOEFPTR coef_block, JSAMPARRAY output_buf,
696                   JDIMENSION output_col)
697 {
698   if (simd_support & JSIMD_ARM_NEON)
699     jsimd_idct_ifast_neon(compptr->dct_table, coef_block, output_buf,
700                           output_col);
701 }
702 
703 GLOBAL(void)
jsimd_idct_float(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)704 jsimd_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
705                   JCOEFPTR coef_block, JSAMPARRAY output_buf,
706                   JDIMENSION output_col)
707 {
708 }
709