1/*
2 * jsimd_powerpc.c
3 *
4 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
5 * Copyright (C) 2009-2011, 2014-2016, D. R. Commander.
6 * Copyright (C) 2015, Matthieu Darbois.
7 *
8 * Based on the x86 SIMD extension for IJG JPEG library,
9 * Copyright (C) 1999-2006, MIYASAKA Masaru.
10 * For conditions of distribution and use, see copyright notice in jsimdext.inc
11 *
12 * This file contains the interface between the "normal" portions
13 * of the library and the SIMD implementations when running on a
14 * PowerPC architecture.
15 */
16
17#define JPEG_INTERNALS
18#include "../jinclude.h"
19#include "../jpeglib.h"
20#include "../jsimd.h"
21#include "../jdct.h"
22#include "../jsimddct.h"
23#include "jsimd.h"
24
25#include <stdio.h>
26#include <string.h>
27#include <ctype.h>
28
29static unsigned int simd_support = ~0;
30
31#if defined(__linux__) || defined(ANDROID) || defined(__ANDROID__)
32
33#define SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT (1024 * 1024)
34
35LOCAL(int)
36check_feature (char *buffer, char *feature)
37{
38  char *p;
39  if (*feature == 0)
40    return 0;
41  if (strncmp(buffer, "cpu", 3) != 0)
42    return 0;
43  buffer += 3;
44  while (isspace(*buffer))
45    buffer++;
46
47  /* Check if 'feature' is present in the buffer as a separate word */
48  while ((p = strstr(buffer, feature))) {
49    if (p > buffer && !isspace(*(p - 1))) {
50      buffer++;
51      continue;
52    }
53    p += strlen(feature);
54    if (*p != 0 && !isspace(*p)) {
55      buffer++;
56      continue;
57    }
58    return 1;
59  }
60  return 0;
61}
62
63LOCAL(int)
64parse_proc_cpuinfo (int bufsize)
65{
66  char *buffer = (char *)malloc(bufsize);
67  FILE *fd;
68  simd_support = 0;
69
70  if (!buffer)
71    return 0;
72
73  fd = fopen("/proc/cpuinfo", "r");
74  if (fd) {
75    while (fgets(buffer, bufsize, fd)) {
76      if (!strchr(buffer, '\n') && !feof(fd)) {
77        /* "impossible" happened - insufficient size of the buffer! */
78        fclose(fd);
79        free(buffer);
80        return 0;
81      }
82      if (check_feature(buffer, "altivec"))
83        simd_support |= JSIMD_ALTIVEC;
84    }
85    fclose(fd);
86  }
87  free(buffer);
88  return 1;
89}
90
91#endif
92
93/*
94 * Check what SIMD accelerations are supported.
95 *
96 * FIXME: This code is racy under a multi-threaded environment.
97 */
98LOCAL(void)
99init_simd (void)
100{
101  char *env = NULL;
102#if !defined(__ALTIVEC__) && (defined(__linux__) || defined(ANDROID) || defined(__ANDROID__))
103  int bufsize = 1024; /* an initial guess for the line buffer size limit */
104#endif
105
106  if (simd_support != ~0U)
107    return;
108
109  simd_support = 0;
110
111#if defined(__ALTIVEC__) || defined(__APPLE__)
112  simd_support |= JSIMD_ALTIVEC;
113#elif defined(__linux__) || defined(ANDROID) || defined(__ANDROID__)
114  while (!parse_proc_cpuinfo(bufsize)) {
115    bufsize *= 2;
116    if (bufsize > SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT)
117      break;
118  }
119#endif
120
121  /* Force different settings through environment variables */
122  env = getenv("JSIMD_FORCEALTIVEC");
123  if ((env != NULL) && (strcmp(env, "1") == 0))
124    simd_support = JSIMD_ALTIVEC;
125  env = getenv("JSIMD_FORCENONE");
126  if ((env != NULL) && (strcmp(env, "1") == 0))
127    simd_support = 0;
128}
129
130GLOBAL(int)
131jsimd_can_rgb_ycc (void)
132{
133  init_simd();
134
135  /* The code is optimised for these values only */
136  if (BITS_IN_JSAMPLE != 8)
137    return 0;
138  if (sizeof(JDIMENSION) != 4)
139    return 0;
140  if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
141    return 0;
142
143  if (simd_support & JSIMD_ALTIVEC)
144    return 1;
145
146  return 0;
147}
148
149GLOBAL(int)
150jsimd_can_rgb_gray (void)
151{
152  init_simd();
153
154  /* The code is optimised for these values only */
155  if (BITS_IN_JSAMPLE != 8)
156    return 0;
157  if (sizeof(JDIMENSION) != 4)
158    return 0;
159  if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
160    return 0;
161
162  if (simd_support & JSIMD_ALTIVEC)
163    return 1;
164
165  return 0;
166}
167
168GLOBAL(int)
169jsimd_can_ycc_rgb (void)
170{
171  init_simd();
172
173  /* The code is optimised for these values only */
174  if (BITS_IN_JSAMPLE != 8)
175    return 0;
176  if (sizeof(JDIMENSION) != 4)
177    return 0;
178  if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
179    return 0;
180
181  if (simd_support & JSIMD_ALTIVEC)
182    return 1;
183
184  return 0;
185}
186
187GLOBAL(int)
188jsimd_can_ycc_rgb565 (void)
189{
190  return 0;
191}
192
193GLOBAL(void)
194jsimd_rgb_ycc_convert (j_compress_ptr cinfo,
195                       JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
196                       JDIMENSION output_row, int num_rows)
197{
198  void (*altivecfct)(JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
199
200  switch(cinfo->in_color_space) {
201    case JCS_EXT_RGB:
202      altivecfct=jsimd_extrgb_ycc_convert_altivec;
203      break;
204    case JCS_EXT_RGBX:
205    case JCS_EXT_RGBA:
206      altivecfct=jsimd_extrgbx_ycc_convert_altivec;
207      break;
208    case JCS_EXT_BGR:
209      altivecfct=jsimd_extbgr_ycc_convert_altivec;
210      break;
211    case JCS_EXT_BGRX:
212    case JCS_EXT_BGRA:
213      altivecfct=jsimd_extbgrx_ycc_convert_altivec;
214      break;
215    case JCS_EXT_XBGR:
216    case JCS_EXT_ABGR:
217      altivecfct=jsimd_extxbgr_ycc_convert_altivec;
218      break;
219    case JCS_EXT_XRGB:
220    case JCS_EXT_ARGB:
221      altivecfct=jsimd_extxrgb_ycc_convert_altivec;
222      break;
223    default:
224      altivecfct=jsimd_rgb_ycc_convert_altivec;
225      break;
226  }
227
228  altivecfct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
229}
230
231GLOBAL(void)
232jsimd_rgb_gray_convert (j_compress_ptr cinfo,
233                        JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
234                        JDIMENSION output_row, int num_rows)
235{
236  void (*altivecfct)(JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
237
238  switch(cinfo->in_color_space) {
239    case JCS_EXT_RGB:
240      altivecfct=jsimd_extrgb_gray_convert_altivec;
241      break;
242    case JCS_EXT_RGBX:
243    case JCS_EXT_RGBA:
244      altivecfct=jsimd_extrgbx_gray_convert_altivec;
245      break;
246    case JCS_EXT_BGR:
247      altivecfct=jsimd_extbgr_gray_convert_altivec;
248      break;
249    case JCS_EXT_BGRX:
250    case JCS_EXT_BGRA:
251      altivecfct=jsimd_extbgrx_gray_convert_altivec;
252      break;
253    case JCS_EXT_XBGR:
254    case JCS_EXT_ABGR:
255      altivecfct=jsimd_extxbgr_gray_convert_altivec;
256      break;
257    case JCS_EXT_XRGB:
258    case JCS_EXT_ARGB:
259      altivecfct=jsimd_extxrgb_gray_convert_altivec;
260      break;
261    default:
262      altivecfct=jsimd_rgb_gray_convert_altivec;
263      break;
264  }
265
266  altivecfct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
267}
268
269GLOBAL(void)
270jsimd_ycc_rgb_convert (j_decompress_ptr cinfo,
271                       JSAMPIMAGE input_buf, JDIMENSION input_row,
272                       JSAMPARRAY output_buf, int num_rows)
273{
274  void (*altivecfct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int);
275
276  switch(cinfo->out_color_space) {
277    case JCS_EXT_RGB:
278      altivecfct=jsimd_ycc_extrgb_convert_altivec;
279      break;
280    case JCS_EXT_RGBX:
281    case JCS_EXT_RGBA:
282      altivecfct=jsimd_ycc_extrgbx_convert_altivec;
283      break;
284    case JCS_EXT_BGR:
285      altivecfct=jsimd_ycc_extbgr_convert_altivec;
286      break;
287    case JCS_EXT_BGRX:
288    case JCS_EXT_BGRA:
289      altivecfct=jsimd_ycc_extbgrx_convert_altivec;
290      break;
291    case JCS_EXT_XBGR:
292    case JCS_EXT_ABGR:
293      altivecfct=jsimd_ycc_extxbgr_convert_altivec;
294      break;
295    case JCS_EXT_XRGB:
296    case JCS_EXT_ARGB:
297      altivecfct=jsimd_ycc_extxrgb_convert_altivec;
298      break;
299    default:
300      altivecfct=jsimd_ycc_rgb_convert_altivec;
301      break;
302  }
303
304  altivecfct(cinfo->output_width, input_buf, input_row, output_buf, num_rows);
305}
306
307GLOBAL(void)
308jsimd_ycc_rgb565_convert (j_decompress_ptr cinfo,
309                          JSAMPIMAGE input_buf, JDIMENSION input_row,
310                          JSAMPARRAY output_buf, int num_rows)
311{
312}
313
314GLOBAL(int)
315jsimd_can_h2v2_downsample (void)
316{
317  init_simd();
318
319  /* The code is optimised for these values only */
320  if (BITS_IN_JSAMPLE != 8)
321    return 0;
322  if (sizeof(JDIMENSION) != 4)
323    return 0;
324
325  if (simd_support & JSIMD_ALTIVEC)
326    return 1;
327
328  return 0;
329}
330
331GLOBAL(int)
332jsimd_can_h2v1_downsample (void)
333{
334  init_simd();
335
336  /* The code is optimised for these values only */
337  if (BITS_IN_JSAMPLE != 8)
338    return 0;
339  if (sizeof(JDIMENSION) != 4)
340    return 0;
341
342  if (simd_support & JSIMD_ALTIVEC)
343    return 1;
344
345  return 0;
346}
347
348GLOBAL(void)
349jsimd_h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,
350                       JSAMPARRAY input_data, JSAMPARRAY output_data)
351{
352  jsimd_h2v2_downsample_altivec(cinfo->image_width, cinfo->max_v_samp_factor,
353                                compptr->v_samp_factor,
354                                compptr->width_in_blocks,
355                                input_data, output_data);
356}
357
358GLOBAL(void)
359jsimd_h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,
360                       JSAMPARRAY input_data, JSAMPARRAY output_data)
361{
362  jsimd_h2v1_downsample_altivec(cinfo->image_width, cinfo->max_v_samp_factor,
363                                compptr->v_samp_factor,
364                                compptr->width_in_blocks,
365                                input_data, output_data);
366}
367
368GLOBAL(int)
369jsimd_can_h2v2_upsample (void)
370{
371  init_simd();
372
373  /* The code is optimised for these values only */
374  if (BITS_IN_JSAMPLE != 8)
375    return 0;
376  if (sizeof(JDIMENSION) != 4)
377    return 0;
378
379  if (simd_support & JSIMD_ALTIVEC)
380    return 1;
381
382  return 0;
383}
384
385GLOBAL(int)
386jsimd_can_h2v1_upsample (void)
387{
388  init_simd();
389
390  /* The code is optimised for these values only */
391  if (BITS_IN_JSAMPLE != 8)
392    return 0;
393  if (sizeof(JDIMENSION) != 4)
394    return 0;
395
396  if (simd_support & JSIMD_ALTIVEC)
397    return 1;
398
399  return 0;
400}
401
402GLOBAL(void)
403jsimd_h2v2_upsample (j_decompress_ptr cinfo,
404                     jpeg_component_info *compptr,
405                     JSAMPARRAY input_data,
406                     JSAMPARRAY *output_data_ptr)
407{
408  jsimd_h2v2_upsample_altivec(cinfo->max_v_samp_factor, cinfo->output_width,
409                              input_data, output_data_ptr);
410}
411
412GLOBAL(void)
413jsimd_h2v1_upsample (j_decompress_ptr cinfo,
414                     jpeg_component_info *compptr,
415                     JSAMPARRAY input_data,
416                     JSAMPARRAY *output_data_ptr)
417{
418  jsimd_h2v1_upsample_altivec(cinfo->max_v_samp_factor, cinfo->output_width,
419                              input_data, output_data_ptr);
420}
421
422GLOBAL(int)
423jsimd_can_h2v2_fancy_upsample (void)
424{
425  init_simd();
426
427  /* The code is optimised for these values only */
428  if (BITS_IN_JSAMPLE != 8)
429    return 0;
430  if (sizeof(JDIMENSION) != 4)
431    return 0;
432
433  if (simd_support & JSIMD_ALTIVEC)
434    return 1;
435
436  return 0;
437}
438
439GLOBAL(int)
440jsimd_can_h2v1_fancy_upsample (void)
441{
442  init_simd();
443
444  /* The code is optimised for these values only */
445  if (BITS_IN_JSAMPLE != 8)
446    return 0;
447  if (sizeof(JDIMENSION) != 4)
448    return 0;
449
450  if (simd_support & JSIMD_ALTIVEC)
451    return 1;
452
453  return 0;
454}
455
456GLOBAL(void)
457jsimd_h2v2_fancy_upsample (j_decompress_ptr cinfo,
458                           jpeg_component_info *compptr,
459                           JSAMPARRAY input_data,
460                           JSAMPARRAY *output_data_ptr)
461{
462  jsimd_h2v2_fancy_upsample_altivec(cinfo->max_v_samp_factor,
463                                    compptr->downsampled_width, input_data,
464                                    output_data_ptr);
465}
466
467GLOBAL(void)
468jsimd_h2v1_fancy_upsample (j_decompress_ptr cinfo,
469                           jpeg_component_info *compptr,
470                           JSAMPARRAY input_data,
471                           JSAMPARRAY *output_data_ptr)
472{
473  jsimd_h2v1_fancy_upsample_altivec(cinfo->max_v_samp_factor,
474                                    compptr->downsampled_width, input_data,
475                                    output_data_ptr);
476}
477
478GLOBAL(int)
479jsimd_can_h2v2_merged_upsample (void)
480{
481  init_simd();
482
483  /* The code is optimised for these values only */
484  if (BITS_IN_JSAMPLE != 8)
485    return 0;
486  if (sizeof(JDIMENSION) != 4)
487    return 0;
488
489  if (simd_support & JSIMD_ALTIVEC)
490    return 1;
491
492  return 0;
493}
494
495GLOBAL(int)
496jsimd_can_h2v1_merged_upsample (void)
497{
498  init_simd();
499
500  /* The code is optimised for these values only */
501  if (BITS_IN_JSAMPLE != 8)
502    return 0;
503  if (sizeof(JDIMENSION) != 4)
504    return 0;
505
506  if (simd_support & JSIMD_ALTIVEC)
507    return 1;
508
509  return 0;
510}
511
512GLOBAL(void)
513jsimd_h2v2_merged_upsample (j_decompress_ptr cinfo,
514                            JSAMPIMAGE input_buf,
515                            JDIMENSION in_row_group_ctr,
516                            JSAMPARRAY output_buf)
517{
518  void (*altivecfct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
519
520  switch(cinfo->out_color_space) {
521    case JCS_EXT_RGB:
522      altivecfct=jsimd_h2v2_extrgb_merged_upsample_altivec;
523      break;
524    case JCS_EXT_RGBX:
525    case JCS_EXT_RGBA:
526      altivecfct=jsimd_h2v2_extrgbx_merged_upsample_altivec;
527      break;
528    case JCS_EXT_BGR:
529      altivecfct=jsimd_h2v2_extbgr_merged_upsample_altivec;
530      break;
531    case JCS_EXT_BGRX:
532    case JCS_EXT_BGRA:
533      altivecfct=jsimd_h2v2_extbgrx_merged_upsample_altivec;
534      break;
535    case JCS_EXT_XBGR:
536    case JCS_EXT_ABGR:
537      altivecfct=jsimd_h2v2_extxbgr_merged_upsample_altivec;
538      break;
539    case JCS_EXT_XRGB:
540    case JCS_EXT_ARGB:
541      altivecfct=jsimd_h2v2_extxrgb_merged_upsample_altivec;
542      break;
543    default:
544      altivecfct=jsimd_h2v2_merged_upsample_altivec;
545      break;
546  }
547
548  altivecfct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
549}
550
551GLOBAL(void)
552jsimd_h2v1_merged_upsample (j_decompress_ptr cinfo,
553                            JSAMPIMAGE input_buf,
554                            JDIMENSION in_row_group_ctr,
555                            JSAMPARRAY output_buf)
556{
557  void (*altivecfct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
558
559  switch(cinfo->out_color_space) {
560    case JCS_EXT_RGB:
561      altivecfct=jsimd_h2v1_extrgb_merged_upsample_altivec;
562      break;
563    case JCS_EXT_RGBX:
564    case JCS_EXT_RGBA:
565      altivecfct=jsimd_h2v1_extrgbx_merged_upsample_altivec;
566      break;
567    case JCS_EXT_BGR:
568      altivecfct=jsimd_h2v1_extbgr_merged_upsample_altivec;
569      break;
570    case JCS_EXT_BGRX:
571    case JCS_EXT_BGRA:
572      altivecfct=jsimd_h2v1_extbgrx_merged_upsample_altivec;
573      break;
574    case JCS_EXT_XBGR:
575    case JCS_EXT_ABGR:
576      altivecfct=jsimd_h2v1_extxbgr_merged_upsample_altivec;
577      break;
578    case JCS_EXT_XRGB:
579    case JCS_EXT_ARGB:
580      altivecfct=jsimd_h2v1_extxrgb_merged_upsample_altivec;
581      break;
582    default:
583      altivecfct=jsimd_h2v1_merged_upsample_altivec;
584      break;
585  }
586
587  altivecfct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
588}
589
590GLOBAL(int)
591jsimd_can_convsamp (void)
592{
593  init_simd();
594
595  /* The code is optimised for these values only */
596  if (DCTSIZE != 8)
597    return 0;
598  if (BITS_IN_JSAMPLE != 8)
599    return 0;
600  if (sizeof(JDIMENSION) != 4)
601    return 0;
602  if (sizeof(DCTELEM) != 2)
603    return 0;
604
605  if (simd_support & JSIMD_ALTIVEC)
606    return 1;
607
608  return 0;
609}
610
611GLOBAL(int)
612jsimd_can_convsamp_float (void)
613{
614  return 0;
615}
616
617GLOBAL(void)
618jsimd_convsamp (JSAMPARRAY sample_data, JDIMENSION start_col,
619                DCTELEM *workspace)
620{
621  jsimd_convsamp_altivec(sample_data, start_col, workspace);
622}
623
624GLOBAL(void)
625jsimd_convsamp_float (JSAMPARRAY sample_data, JDIMENSION start_col,
626                      FAST_FLOAT *workspace)
627{
628}
629
630GLOBAL(int)
631jsimd_can_fdct_islow (void)
632{
633  init_simd();
634
635  /* The code is optimised for these values only */
636  if (DCTSIZE != 8)
637    return 0;
638  if (sizeof(DCTELEM) != 2)
639    return 0;
640
641  if (simd_support & JSIMD_ALTIVEC)
642    return 1;
643
644  return 0;
645}
646
647GLOBAL(int)
648jsimd_can_fdct_ifast (void)
649{
650  init_simd();
651
652  /* The code is optimised for these values only */
653  if (DCTSIZE != 8)
654    return 0;
655  if (sizeof(DCTELEM) != 2)
656    return 0;
657
658  if (simd_support & JSIMD_ALTIVEC)
659    return 1;
660
661  return 0;
662}
663
664GLOBAL(int)
665jsimd_can_fdct_float (void)
666{
667  return 0;
668}
669
670GLOBAL(void)
671jsimd_fdct_islow (DCTELEM *data)
672{
673  jsimd_fdct_islow_altivec(data);
674}
675
676GLOBAL(void)
677jsimd_fdct_ifast (DCTELEM *data)
678{
679  jsimd_fdct_ifast_altivec(data);
680}
681
682GLOBAL(void)
683jsimd_fdct_float (FAST_FLOAT *data)
684{
685}
686
687GLOBAL(int)
688jsimd_can_quantize (void)
689{
690  init_simd();
691
692  /* The code is optimised for these values only */
693  if (DCTSIZE != 8)
694    return 0;
695  if (sizeof(JCOEF) != 2)
696    return 0;
697  if (sizeof(DCTELEM) != 2)
698    return 0;
699
700  if (simd_support & JSIMD_ALTIVEC)
701    return 1;
702
703  return 0;
704}
705
706GLOBAL(int)
707jsimd_can_quantize_float (void)
708{
709  return 0;
710}
711
712GLOBAL(void)
713jsimd_quantize (JCOEFPTR coef_block, DCTELEM *divisors,
714                DCTELEM *workspace)
715{
716  jsimd_quantize_altivec(coef_block, divisors, workspace);
717}
718
719GLOBAL(void)
720jsimd_quantize_float (JCOEFPTR coef_block, FAST_FLOAT *divisors,
721                      FAST_FLOAT *workspace)
722{
723}
724
725GLOBAL(int)
726jsimd_can_idct_2x2 (void)
727{
728  return 0;
729}
730
731GLOBAL(int)
732jsimd_can_idct_4x4 (void)
733{
734  return 0;
735}
736
737GLOBAL(void)
738jsimd_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info *compptr,
739                JCOEFPTR coef_block, JSAMPARRAY output_buf,
740                JDIMENSION output_col)
741{
742}
743
744GLOBAL(void)
745jsimd_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info *compptr,
746                JCOEFPTR coef_block, JSAMPARRAY output_buf,
747                JDIMENSION output_col)
748{
749}
750
751GLOBAL(int)
752jsimd_can_idct_islow (void)
753{
754  init_simd();
755
756  /* The code is optimised for these values only */
757  if (DCTSIZE != 8)
758    return 0;
759  if (sizeof(JCOEF) != 2)
760    return 0;
761
762  if (simd_support & JSIMD_ALTIVEC)
763    return 1;
764
765  return 0;
766}
767
768GLOBAL(int)
769jsimd_can_idct_ifast (void)
770{
771  init_simd();
772
773  /* The code is optimised for these values only */
774  if (DCTSIZE != 8)
775    return 0;
776  if (sizeof(JCOEF) != 2)
777    return 0;
778
779  if (simd_support & JSIMD_ALTIVEC)
780    return 1;
781
782  return 0;
783}
784
785GLOBAL(int)
786jsimd_can_idct_float (void)
787{
788  return 0;
789}
790
791GLOBAL(void)
792jsimd_idct_islow (j_decompress_ptr cinfo, jpeg_component_info *compptr,
793                  JCOEFPTR coef_block, JSAMPARRAY output_buf,
794                  JDIMENSION output_col)
795{
796  jsimd_idct_islow_altivec(compptr->dct_table, coef_block, output_buf,
797                           output_col);
798}
799
800GLOBAL(void)
801jsimd_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info *compptr,
802                  JCOEFPTR coef_block, JSAMPARRAY output_buf,
803                  JDIMENSION output_col)
804{
805  jsimd_idct_ifast_altivec(compptr->dct_table, coef_block, output_buf,
806                           output_col);
807}
808
809GLOBAL(void)
810jsimd_idct_float (j_decompress_ptr cinfo, jpeg_component_info *compptr,
811                  JCOEFPTR coef_block, JSAMPARRAY output_buf,
812                  JDIMENSION output_col)
813{
814}
815
816GLOBAL(int)
817jsimd_can_huff_encode_one_block (void)
818{
819  return 0;
820}
821
822GLOBAL(JOCTET*)
823jsimd_huff_encode_one_block (void *state, JOCTET *buffer, JCOEFPTR block,
824                             int last_dc_val, c_derived_tbl *dctbl,
825                             c_derived_tbl *actbl)
826{
827  return NULL;
828}
829