1*dfc6aa5cSAndroid Build Coastguard Worker /*
2*dfc6aa5cSAndroid Build Coastguard Worker * jsimd_i386.c
3*dfc6aa5cSAndroid Build Coastguard Worker *
4*dfc6aa5cSAndroid Build Coastguard Worker * Copyright 2009 Pierre Ossman <[email protected]> for Cendio AB
5*dfc6aa5cSAndroid Build Coastguard Worker * Copyright (C) 2009-2011, 2013-2014, 2016, 2018, 2022-2023, D. R. Commander.
6*dfc6aa5cSAndroid Build Coastguard Worker * Copyright (C) 2015-2016, 2018, 2022, Matthieu Darbois.
7*dfc6aa5cSAndroid Build Coastguard Worker *
8*dfc6aa5cSAndroid Build Coastguard Worker * Based on the x86 SIMD extension for IJG JPEG library,
9*dfc6aa5cSAndroid Build Coastguard Worker * Copyright (C) 1999-2006, MIYASAKA Masaru.
10*dfc6aa5cSAndroid Build Coastguard Worker * For conditions of distribution and use, see copyright notice in jsimdext.inc
11*dfc6aa5cSAndroid Build Coastguard Worker *
12*dfc6aa5cSAndroid Build Coastguard Worker * This file contains the interface between the "normal" portions
13*dfc6aa5cSAndroid Build Coastguard Worker * of the library and the SIMD implementations when running on a
14*dfc6aa5cSAndroid Build Coastguard Worker * 32-bit x86 architecture.
15*dfc6aa5cSAndroid Build Coastguard Worker */
16*dfc6aa5cSAndroid Build Coastguard Worker
17*dfc6aa5cSAndroid Build Coastguard Worker #define JPEG_INTERNALS
18*dfc6aa5cSAndroid Build Coastguard Worker #include "../../jinclude.h"
19*dfc6aa5cSAndroid Build Coastguard Worker #include "../../jpeglib.h"
20*dfc6aa5cSAndroid Build Coastguard Worker #include "../../jsimd.h"
21*dfc6aa5cSAndroid Build Coastguard Worker #include "../../jdct.h"
22*dfc6aa5cSAndroid Build Coastguard Worker #include "../../jsimddct.h"
23*dfc6aa5cSAndroid Build Coastguard Worker #include "../jsimd.h"
24*dfc6aa5cSAndroid Build Coastguard Worker
25*dfc6aa5cSAndroid Build Coastguard Worker /*
26*dfc6aa5cSAndroid Build Coastguard Worker * In the PIC cases, we have no guarantee that constants will keep
27*dfc6aa5cSAndroid Build Coastguard Worker * their alignment. This macro allows us to verify it at runtime.
28*dfc6aa5cSAndroid Build Coastguard Worker */
29*dfc6aa5cSAndroid Build Coastguard Worker #define IS_ALIGNED(ptr, order) (((unsigned)ptr & ((1 << order) - 1)) == 0)
30*dfc6aa5cSAndroid Build Coastguard Worker
31*dfc6aa5cSAndroid Build Coastguard Worker #define IS_ALIGNED_SSE(ptr) (IS_ALIGNED(ptr, 4)) /* 16 byte alignment */
32*dfc6aa5cSAndroid Build Coastguard Worker #define IS_ALIGNED_AVX(ptr) (IS_ALIGNED(ptr, 5)) /* 32 byte alignment */
33*dfc6aa5cSAndroid Build Coastguard Worker
34*dfc6aa5cSAndroid Build Coastguard Worker static THREAD_LOCAL unsigned int simd_support = (unsigned int)(~0);
35*dfc6aa5cSAndroid Build Coastguard Worker static THREAD_LOCAL unsigned int simd_huffman = 1;
36*dfc6aa5cSAndroid Build Coastguard Worker
37*dfc6aa5cSAndroid Build Coastguard Worker /*
38*dfc6aa5cSAndroid Build Coastguard Worker * Check what SIMD accelerations are supported.
39*dfc6aa5cSAndroid Build Coastguard Worker */
40*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
init_simd(void)41*dfc6aa5cSAndroid Build Coastguard Worker init_simd(void)
42*dfc6aa5cSAndroid Build Coastguard Worker {
43*dfc6aa5cSAndroid Build Coastguard Worker #ifndef NO_GETENV
44*dfc6aa5cSAndroid Build Coastguard Worker char env[2] = { 0 };
45*dfc6aa5cSAndroid Build Coastguard Worker #endif
46*dfc6aa5cSAndroid Build Coastguard Worker
47*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support != ~0U)
48*dfc6aa5cSAndroid Build Coastguard Worker return;
49*dfc6aa5cSAndroid Build Coastguard Worker
50*dfc6aa5cSAndroid Build Coastguard Worker simd_support = jpeg_simd_cpu_support();
51*dfc6aa5cSAndroid Build Coastguard Worker
52*dfc6aa5cSAndroid Build Coastguard Worker #ifndef NO_GETENV
53*dfc6aa5cSAndroid Build Coastguard Worker /* Force different settings through environment variables */
54*dfc6aa5cSAndroid Build Coastguard Worker if (!GETENV_S(env, 2, "JSIMD_FORCEMMX") && !strcmp(env, "1"))
55*dfc6aa5cSAndroid Build Coastguard Worker simd_support &= JSIMD_MMX;
56*dfc6aa5cSAndroid Build Coastguard Worker if (!GETENV_S(env, 2, "JSIMD_FORCE3DNOW") && !strcmp(env, "1"))
57*dfc6aa5cSAndroid Build Coastguard Worker simd_support &= JSIMD_3DNOW | JSIMD_MMX;
58*dfc6aa5cSAndroid Build Coastguard Worker if (!GETENV_S(env, 2, "JSIMD_FORCESSE") && !strcmp(env, "1"))
59*dfc6aa5cSAndroid Build Coastguard Worker simd_support &= JSIMD_SSE | JSIMD_MMX;
60*dfc6aa5cSAndroid Build Coastguard Worker if (!GETENV_S(env, 2, "JSIMD_FORCESSE2") && !strcmp(env, "1"))
61*dfc6aa5cSAndroid Build Coastguard Worker simd_support &= JSIMD_SSE2;
62*dfc6aa5cSAndroid Build Coastguard Worker if (!GETENV_S(env, 2, "JSIMD_FORCEAVX2") && !strcmp(env, "1"))
63*dfc6aa5cSAndroid Build Coastguard Worker simd_support &= JSIMD_AVX2;
64*dfc6aa5cSAndroid Build Coastguard Worker if (!GETENV_S(env, 2, "JSIMD_FORCENONE") && !strcmp(env, "1"))
65*dfc6aa5cSAndroid Build Coastguard Worker simd_support = 0;
66*dfc6aa5cSAndroid Build Coastguard Worker if (!GETENV_S(env, 2, "JSIMD_NOHUFFENC") && !strcmp(env, "1"))
67*dfc6aa5cSAndroid Build Coastguard Worker simd_huffman = 0;
68*dfc6aa5cSAndroid Build Coastguard Worker #endif
69*dfc6aa5cSAndroid Build Coastguard Worker }
70*dfc6aa5cSAndroid Build Coastguard Worker
71*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_rgb_ycc(void)72*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_rgb_ycc(void)
73*dfc6aa5cSAndroid Build Coastguard Worker {
74*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
75*dfc6aa5cSAndroid Build Coastguard Worker
76*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
77*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
78*dfc6aa5cSAndroid Build Coastguard Worker return 0;
79*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
80*dfc6aa5cSAndroid Build Coastguard Worker return 0;
81*dfc6aa5cSAndroid Build Coastguard Worker if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
82*dfc6aa5cSAndroid Build Coastguard Worker return 0;
83*dfc6aa5cSAndroid Build Coastguard Worker
84*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_AVX2) &&
85*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_AVX(jconst_rgb_ycc_convert_avx2))
86*dfc6aa5cSAndroid Build Coastguard Worker return 1;
87*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) &&
88*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_SSE(jconst_rgb_ycc_convert_sse2))
89*dfc6aa5cSAndroid Build Coastguard Worker return 1;
90*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
91*dfc6aa5cSAndroid Build Coastguard Worker return 1;
92*dfc6aa5cSAndroid Build Coastguard Worker
93*dfc6aa5cSAndroid Build Coastguard Worker return 0;
94*dfc6aa5cSAndroid Build Coastguard Worker }
95*dfc6aa5cSAndroid Build Coastguard Worker
96*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_rgb_gray(void)97*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_rgb_gray(void)
98*dfc6aa5cSAndroid Build Coastguard Worker {
99*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
100*dfc6aa5cSAndroid Build Coastguard Worker
101*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
102*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
103*dfc6aa5cSAndroid Build Coastguard Worker return 0;
104*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
105*dfc6aa5cSAndroid Build Coastguard Worker return 0;
106*dfc6aa5cSAndroid Build Coastguard Worker if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
107*dfc6aa5cSAndroid Build Coastguard Worker return 0;
108*dfc6aa5cSAndroid Build Coastguard Worker
109*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_AVX2) &&
110*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_AVX(jconst_rgb_gray_convert_avx2))
111*dfc6aa5cSAndroid Build Coastguard Worker return 1;
112*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) &&
113*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_SSE(jconst_rgb_gray_convert_sse2))
114*dfc6aa5cSAndroid Build Coastguard Worker return 1;
115*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
116*dfc6aa5cSAndroid Build Coastguard Worker return 1;
117*dfc6aa5cSAndroid Build Coastguard Worker
118*dfc6aa5cSAndroid Build Coastguard Worker return 0;
119*dfc6aa5cSAndroid Build Coastguard Worker }
120*dfc6aa5cSAndroid Build Coastguard Worker
121*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_ycc_rgb(void)122*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_ycc_rgb(void)
123*dfc6aa5cSAndroid Build Coastguard Worker {
124*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
125*dfc6aa5cSAndroid Build Coastguard Worker
126*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
127*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
128*dfc6aa5cSAndroid Build Coastguard Worker return 0;
129*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
130*dfc6aa5cSAndroid Build Coastguard Worker return 0;
131*dfc6aa5cSAndroid Build Coastguard Worker if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
132*dfc6aa5cSAndroid Build Coastguard Worker return 0;
133*dfc6aa5cSAndroid Build Coastguard Worker
134*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_AVX2) &&
135*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_AVX(jconst_ycc_rgb_convert_avx2))
136*dfc6aa5cSAndroid Build Coastguard Worker return 1;
137*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) &&
138*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_SSE(jconst_ycc_rgb_convert_sse2))
139*dfc6aa5cSAndroid Build Coastguard Worker return 1;
140*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
141*dfc6aa5cSAndroid Build Coastguard Worker return 1;
142*dfc6aa5cSAndroid Build Coastguard Worker
143*dfc6aa5cSAndroid Build Coastguard Worker return 0;
144*dfc6aa5cSAndroid Build Coastguard Worker }
145*dfc6aa5cSAndroid Build Coastguard Worker
146*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_ycc_rgb565(void)147*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_ycc_rgb565(void)
148*dfc6aa5cSAndroid Build Coastguard Worker {
149*dfc6aa5cSAndroid Build Coastguard Worker return 0;
150*dfc6aa5cSAndroid Build Coastguard Worker }
151*dfc6aa5cSAndroid Build Coastguard Worker
152*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_rgb_ycc_convert(j_compress_ptr cinfo,JSAMPARRAY input_buf,JSAMPIMAGE output_buf,JDIMENSION output_row,int num_rows)153*dfc6aa5cSAndroid Build Coastguard Worker jsimd_rgb_ycc_convert(j_compress_ptr cinfo, JSAMPARRAY input_buf,
154*dfc6aa5cSAndroid Build Coastguard Worker JSAMPIMAGE output_buf, JDIMENSION output_row,
155*dfc6aa5cSAndroid Build Coastguard Worker int num_rows)
156*dfc6aa5cSAndroid Build Coastguard Worker {
157*dfc6aa5cSAndroid Build Coastguard Worker void (*avx2fct) (JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
158*dfc6aa5cSAndroid Build Coastguard Worker void (*sse2fct) (JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
159*dfc6aa5cSAndroid Build Coastguard Worker void (*mmxfct) (JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
160*dfc6aa5cSAndroid Build Coastguard Worker
161*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
162*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
163*dfc6aa5cSAndroid Build Coastguard Worker
164*dfc6aa5cSAndroid Build Coastguard Worker switch (cinfo->in_color_space) {
165*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGB:
166*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extrgb_ycc_convert_avx2;
167*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extrgb_ycc_convert_sse2;
168*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extrgb_ycc_convert_mmx;
169*dfc6aa5cSAndroid Build Coastguard Worker break;
170*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGBX:
171*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGBA:
172*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extrgbx_ycc_convert_avx2;
173*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extrgbx_ycc_convert_sse2;
174*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extrgbx_ycc_convert_mmx;
175*dfc6aa5cSAndroid Build Coastguard Worker break;
176*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGR:
177*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extbgr_ycc_convert_avx2;
178*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extbgr_ycc_convert_sse2;
179*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extbgr_ycc_convert_mmx;
180*dfc6aa5cSAndroid Build Coastguard Worker break;
181*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGRX:
182*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGRA:
183*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extbgrx_ycc_convert_avx2;
184*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extbgrx_ycc_convert_sse2;
185*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extbgrx_ycc_convert_mmx;
186*dfc6aa5cSAndroid Build Coastguard Worker break;
187*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_XBGR:
188*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_ABGR:
189*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extxbgr_ycc_convert_avx2;
190*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extxbgr_ycc_convert_sse2;
191*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extxbgr_ycc_convert_mmx;
192*dfc6aa5cSAndroid Build Coastguard Worker break;
193*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_XRGB:
194*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_ARGB:
195*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extxrgb_ycc_convert_avx2;
196*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extxrgb_ycc_convert_sse2;
197*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extxrgb_ycc_convert_mmx;
198*dfc6aa5cSAndroid Build Coastguard Worker break;
199*dfc6aa5cSAndroid Build Coastguard Worker default:
200*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_rgb_ycc_convert_avx2;
201*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_rgb_ycc_convert_sse2;
202*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_rgb_ycc_convert_mmx;
203*dfc6aa5cSAndroid Build Coastguard Worker break;
204*dfc6aa5cSAndroid Build Coastguard Worker }
205*dfc6aa5cSAndroid Build Coastguard Worker
206*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
207*dfc6aa5cSAndroid Build Coastguard Worker avx2fct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
208*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
209*dfc6aa5cSAndroid Build Coastguard Worker sse2fct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
210*dfc6aa5cSAndroid Build Coastguard Worker else
211*dfc6aa5cSAndroid Build Coastguard Worker mmxfct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
212*dfc6aa5cSAndroid Build Coastguard Worker }
213*dfc6aa5cSAndroid Build Coastguard Worker
214*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_rgb_gray_convert(j_compress_ptr cinfo,JSAMPARRAY input_buf,JSAMPIMAGE output_buf,JDIMENSION output_row,int num_rows)215*dfc6aa5cSAndroid Build Coastguard Worker jsimd_rgb_gray_convert(j_compress_ptr cinfo, JSAMPARRAY input_buf,
216*dfc6aa5cSAndroid Build Coastguard Worker JSAMPIMAGE output_buf, JDIMENSION output_row,
217*dfc6aa5cSAndroid Build Coastguard Worker int num_rows)
218*dfc6aa5cSAndroid Build Coastguard Worker {
219*dfc6aa5cSAndroid Build Coastguard Worker void (*avx2fct) (JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
220*dfc6aa5cSAndroid Build Coastguard Worker void (*sse2fct) (JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
221*dfc6aa5cSAndroid Build Coastguard Worker void (*mmxfct) (JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
222*dfc6aa5cSAndroid Build Coastguard Worker
223*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
224*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
225*dfc6aa5cSAndroid Build Coastguard Worker
226*dfc6aa5cSAndroid Build Coastguard Worker switch (cinfo->in_color_space) {
227*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGB:
228*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extrgb_gray_convert_avx2;
229*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extrgb_gray_convert_sse2;
230*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extrgb_gray_convert_mmx;
231*dfc6aa5cSAndroid Build Coastguard Worker break;
232*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGBX:
233*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGBA:
234*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extrgbx_gray_convert_avx2;
235*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extrgbx_gray_convert_sse2;
236*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extrgbx_gray_convert_mmx;
237*dfc6aa5cSAndroid Build Coastguard Worker break;
238*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGR:
239*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extbgr_gray_convert_avx2;
240*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extbgr_gray_convert_sse2;
241*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extbgr_gray_convert_mmx;
242*dfc6aa5cSAndroid Build Coastguard Worker break;
243*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGRX:
244*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGRA:
245*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extbgrx_gray_convert_avx2;
246*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extbgrx_gray_convert_sse2;
247*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extbgrx_gray_convert_mmx;
248*dfc6aa5cSAndroid Build Coastguard Worker break;
249*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_XBGR:
250*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_ABGR:
251*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extxbgr_gray_convert_avx2;
252*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extxbgr_gray_convert_sse2;
253*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extxbgr_gray_convert_mmx;
254*dfc6aa5cSAndroid Build Coastguard Worker break;
255*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_XRGB:
256*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_ARGB:
257*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_extxrgb_gray_convert_avx2;
258*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_extxrgb_gray_convert_sse2;
259*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_extxrgb_gray_convert_mmx;
260*dfc6aa5cSAndroid Build Coastguard Worker break;
261*dfc6aa5cSAndroid Build Coastguard Worker default:
262*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_rgb_gray_convert_avx2;
263*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_rgb_gray_convert_sse2;
264*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_rgb_gray_convert_mmx;
265*dfc6aa5cSAndroid Build Coastguard Worker break;
266*dfc6aa5cSAndroid Build Coastguard Worker }
267*dfc6aa5cSAndroid Build Coastguard Worker
268*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
269*dfc6aa5cSAndroid Build Coastguard Worker avx2fct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
270*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
271*dfc6aa5cSAndroid Build Coastguard Worker sse2fct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
272*dfc6aa5cSAndroid Build Coastguard Worker else
273*dfc6aa5cSAndroid Build Coastguard Worker mmxfct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
274*dfc6aa5cSAndroid Build Coastguard Worker }
275*dfc6aa5cSAndroid Build Coastguard Worker
276*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_ycc_rgb_convert(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION input_row,JSAMPARRAY output_buf,int num_rows)277*dfc6aa5cSAndroid Build Coastguard Worker jsimd_ycc_rgb_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
278*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION input_row, JSAMPARRAY output_buf,
279*dfc6aa5cSAndroid Build Coastguard Worker int num_rows)
280*dfc6aa5cSAndroid Build Coastguard Worker {
281*dfc6aa5cSAndroid Build Coastguard Worker void (*avx2fct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int);
282*dfc6aa5cSAndroid Build Coastguard Worker void (*sse2fct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int);
283*dfc6aa5cSAndroid Build Coastguard Worker void (*mmxfct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int);
284*dfc6aa5cSAndroid Build Coastguard Worker
285*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
286*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
287*dfc6aa5cSAndroid Build Coastguard Worker
288*dfc6aa5cSAndroid Build Coastguard Worker switch (cinfo->out_color_space) {
289*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGB:
290*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_ycc_extrgb_convert_avx2;
291*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_ycc_extrgb_convert_sse2;
292*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_ycc_extrgb_convert_mmx;
293*dfc6aa5cSAndroid Build Coastguard Worker break;
294*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGBX:
295*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGBA:
296*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_ycc_extrgbx_convert_avx2;
297*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_ycc_extrgbx_convert_sse2;
298*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_ycc_extrgbx_convert_mmx;
299*dfc6aa5cSAndroid Build Coastguard Worker break;
300*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGR:
301*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_ycc_extbgr_convert_avx2;
302*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_ycc_extbgr_convert_sse2;
303*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_ycc_extbgr_convert_mmx;
304*dfc6aa5cSAndroid Build Coastguard Worker break;
305*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGRX:
306*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGRA:
307*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_ycc_extbgrx_convert_avx2;
308*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_ycc_extbgrx_convert_sse2;
309*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_ycc_extbgrx_convert_mmx;
310*dfc6aa5cSAndroid Build Coastguard Worker break;
311*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_XBGR:
312*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_ABGR:
313*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_ycc_extxbgr_convert_avx2;
314*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_ycc_extxbgr_convert_sse2;
315*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_ycc_extxbgr_convert_mmx;
316*dfc6aa5cSAndroid Build Coastguard Worker break;
317*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_XRGB:
318*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_ARGB:
319*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_ycc_extxrgb_convert_avx2;
320*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_ycc_extxrgb_convert_sse2;
321*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_ycc_extxrgb_convert_mmx;
322*dfc6aa5cSAndroid Build Coastguard Worker break;
323*dfc6aa5cSAndroid Build Coastguard Worker default:
324*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_ycc_rgb_convert_avx2;
325*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_ycc_rgb_convert_sse2;
326*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_ycc_rgb_convert_mmx;
327*dfc6aa5cSAndroid Build Coastguard Worker break;
328*dfc6aa5cSAndroid Build Coastguard Worker }
329*dfc6aa5cSAndroid Build Coastguard Worker
330*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
331*dfc6aa5cSAndroid Build Coastguard Worker avx2fct(cinfo->output_width, input_buf, input_row, output_buf, num_rows);
332*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
333*dfc6aa5cSAndroid Build Coastguard Worker sse2fct(cinfo->output_width, input_buf, input_row, output_buf, num_rows);
334*dfc6aa5cSAndroid Build Coastguard Worker else
335*dfc6aa5cSAndroid Build Coastguard Worker mmxfct(cinfo->output_width, input_buf, input_row, output_buf, num_rows);
336*dfc6aa5cSAndroid Build Coastguard Worker }
337*dfc6aa5cSAndroid Build Coastguard Worker
338*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_ycc_rgb565_convert(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION input_row,JSAMPARRAY output_buf,int num_rows)339*dfc6aa5cSAndroid Build Coastguard Worker jsimd_ycc_rgb565_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
340*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION input_row, JSAMPARRAY output_buf,
341*dfc6aa5cSAndroid Build Coastguard Worker int num_rows)
342*dfc6aa5cSAndroid Build Coastguard Worker {
343*dfc6aa5cSAndroid Build Coastguard Worker }
344*dfc6aa5cSAndroid Build Coastguard Worker
345*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_h2v2_downsample(void)346*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_h2v2_downsample(void)
347*dfc6aa5cSAndroid Build Coastguard Worker {
348*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
349*dfc6aa5cSAndroid Build Coastguard Worker
350*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
351*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
352*dfc6aa5cSAndroid Build Coastguard Worker return 0;
353*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
354*dfc6aa5cSAndroid Build Coastguard Worker return 0;
355*dfc6aa5cSAndroid Build Coastguard Worker
356*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
357*dfc6aa5cSAndroid Build Coastguard Worker return 1;
358*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
359*dfc6aa5cSAndroid Build Coastguard Worker return 1;
360*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
361*dfc6aa5cSAndroid Build Coastguard Worker return 1;
362*dfc6aa5cSAndroid Build Coastguard Worker
363*dfc6aa5cSAndroid Build Coastguard Worker return 0;
364*dfc6aa5cSAndroid Build Coastguard Worker }
365*dfc6aa5cSAndroid Build Coastguard Worker
366*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_h2v1_downsample(void)367*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_h2v1_downsample(void)
368*dfc6aa5cSAndroid Build Coastguard Worker {
369*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
370*dfc6aa5cSAndroid Build Coastguard Worker
371*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
372*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
373*dfc6aa5cSAndroid Build Coastguard Worker return 0;
374*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
375*dfc6aa5cSAndroid Build Coastguard Worker return 0;
376*dfc6aa5cSAndroid Build Coastguard Worker
377*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
378*dfc6aa5cSAndroid Build Coastguard Worker return 1;
379*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
380*dfc6aa5cSAndroid Build Coastguard Worker return 1;
381*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
382*dfc6aa5cSAndroid Build Coastguard Worker return 1;
383*dfc6aa5cSAndroid Build Coastguard Worker
384*dfc6aa5cSAndroid Build Coastguard Worker return 0;
385*dfc6aa5cSAndroid Build Coastguard Worker }
386*dfc6aa5cSAndroid Build Coastguard Worker
387*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_h2v2_downsample(j_compress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY output_data)388*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
389*dfc6aa5cSAndroid Build Coastguard Worker JSAMPARRAY input_data, JSAMPARRAY output_data)
390*dfc6aa5cSAndroid Build Coastguard Worker {
391*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
392*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
393*dfc6aa5cSAndroid Build Coastguard Worker
394*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
395*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_downsample_avx2(cinfo->image_width, cinfo->max_v_samp_factor,
396*dfc6aa5cSAndroid Build Coastguard Worker compptr->v_samp_factor,
397*dfc6aa5cSAndroid Build Coastguard Worker compptr->width_in_blocks, input_data,
398*dfc6aa5cSAndroid Build Coastguard Worker output_data);
399*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
400*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_downsample_sse2(cinfo->image_width, cinfo->max_v_samp_factor,
401*dfc6aa5cSAndroid Build Coastguard Worker compptr->v_samp_factor,
402*dfc6aa5cSAndroid Build Coastguard Worker compptr->width_in_blocks, input_data,
403*dfc6aa5cSAndroid Build Coastguard Worker output_data);
404*dfc6aa5cSAndroid Build Coastguard Worker else
405*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_downsample_mmx(cinfo->image_width, cinfo->max_v_samp_factor,
406*dfc6aa5cSAndroid Build Coastguard Worker compptr->v_samp_factor, compptr->width_in_blocks,
407*dfc6aa5cSAndroid Build Coastguard Worker input_data, output_data);
408*dfc6aa5cSAndroid Build Coastguard Worker }
409*dfc6aa5cSAndroid Build Coastguard Worker
410*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_h2v1_downsample(j_compress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY output_data)411*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
412*dfc6aa5cSAndroid Build Coastguard Worker JSAMPARRAY input_data, JSAMPARRAY output_data)
413*dfc6aa5cSAndroid Build Coastguard Worker {
414*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
415*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
416*dfc6aa5cSAndroid Build Coastguard Worker
417*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
418*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_downsample_avx2(cinfo->image_width, cinfo->max_v_samp_factor,
419*dfc6aa5cSAndroid Build Coastguard Worker compptr->v_samp_factor,
420*dfc6aa5cSAndroid Build Coastguard Worker compptr->width_in_blocks, input_data,
421*dfc6aa5cSAndroid Build Coastguard Worker output_data);
422*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
423*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_downsample_sse2(cinfo->image_width, cinfo->max_v_samp_factor,
424*dfc6aa5cSAndroid Build Coastguard Worker compptr->v_samp_factor,
425*dfc6aa5cSAndroid Build Coastguard Worker compptr->width_in_blocks, input_data,
426*dfc6aa5cSAndroid Build Coastguard Worker output_data);
427*dfc6aa5cSAndroid Build Coastguard Worker else
428*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_downsample_mmx(cinfo->image_width, cinfo->max_v_samp_factor,
429*dfc6aa5cSAndroid Build Coastguard Worker compptr->v_samp_factor, compptr->width_in_blocks,
430*dfc6aa5cSAndroid Build Coastguard Worker input_data, output_data);
431*dfc6aa5cSAndroid Build Coastguard Worker }
432*dfc6aa5cSAndroid Build Coastguard Worker
433*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_h2v2_upsample(void)434*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_h2v2_upsample(void)
435*dfc6aa5cSAndroid Build Coastguard Worker {
436*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
437*dfc6aa5cSAndroid Build Coastguard Worker
438*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
439*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
440*dfc6aa5cSAndroid Build Coastguard Worker return 0;
441*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
442*dfc6aa5cSAndroid Build Coastguard Worker return 0;
443*dfc6aa5cSAndroid Build Coastguard Worker
444*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
445*dfc6aa5cSAndroid Build Coastguard Worker return 1;
446*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
447*dfc6aa5cSAndroid Build Coastguard Worker return 1;
448*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
449*dfc6aa5cSAndroid Build Coastguard Worker return 1;
450*dfc6aa5cSAndroid Build Coastguard Worker
451*dfc6aa5cSAndroid Build Coastguard Worker return 0;
452*dfc6aa5cSAndroid Build Coastguard Worker }
453*dfc6aa5cSAndroid Build Coastguard Worker
454*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_h2v1_upsample(void)455*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_h2v1_upsample(void)
456*dfc6aa5cSAndroid Build Coastguard Worker {
457*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
458*dfc6aa5cSAndroid Build Coastguard Worker
459*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
460*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
461*dfc6aa5cSAndroid Build Coastguard Worker return 0;
462*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
463*dfc6aa5cSAndroid Build Coastguard Worker return 0;
464*dfc6aa5cSAndroid Build Coastguard Worker
465*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
466*dfc6aa5cSAndroid Build Coastguard Worker return 1;
467*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
468*dfc6aa5cSAndroid Build Coastguard Worker return 1;
469*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
470*dfc6aa5cSAndroid Build Coastguard Worker return 1;
471*dfc6aa5cSAndroid Build Coastguard Worker
472*dfc6aa5cSAndroid Build Coastguard Worker return 0;
473*dfc6aa5cSAndroid Build Coastguard Worker }
474*dfc6aa5cSAndroid Build Coastguard Worker
475*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_h2v2_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)476*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
477*dfc6aa5cSAndroid Build Coastguard Worker JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
478*dfc6aa5cSAndroid Build Coastguard Worker {
479*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
480*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
481*dfc6aa5cSAndroid Build Coastguard Worker
482*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
483*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_upsample_avx2(cinfo->max_v_samp_factor, cinfo->output_width,
484*dfc6aa5cSAndroid Build Coastguard Worker input_data, output_data_ptr);
485*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
486*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_upsample_sse2(cinfo->max_v_samp_factor, cinfo->output_width,
487*dfc6aa5cSAndroid Build Coastguard Worker input_data, output_data_ptr);
488*dfc6aa5cSAndroid Build Coastguard Worker else
489*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_upsample_mmx(cinfo->max_v_samp_factor, cinfo->output_width,
490*dfc6aa5cSAndroid Build Coastguard Worker input_data, output_data_ptr);
491*dfc6aa5cSAndroid Build Coastguard Worker }
492*dfc6aa5cSAndroid Build Coastguard Worker
493*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_h2v1_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)494*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
495*dfc6aa5cSAndroid Build Coastguard Worker JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
496*dfc6aa5cSAndroid Build Coastguard Worker {
497*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
498*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
499*dfc6aa5cSAndroid Build Coastguard Worker
500*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
501*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_upsample_avx2(cinfo->max_v_samp_factor, cinfo->output_width,
502*dfc6aa5cSAndroid Build Coastguard Worker input_data, output_data_ptr);
503*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
504*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_upsample_sse2(cinfo->max_v_samp_factor, cinfo->output_width,
505*dfc6aa5cSAndroid Build Coastguard Worker input_data, output_data_ptr);
506*dfc6aa5cSAndroid Build Coastguard Worker else
507*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_upsample_mmx(cinfo->max_v_samp_factor, cinfo->output_width,
508*dfc6aa5cSAndroid Build Coastguard Worker input_data, output_data_ptr);
509*dfc6aa5cSAndroid Build Coastguard Worker }
510*dfc6aa5cSAndroid Build Coastguard Worker
511*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_h2v2_fancy_upsample(void)512*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_h2v2_fancy_upsample(void)
513*dfc6aa5cSAndroid Build Coastguard Worker {
514*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
515*dfc6aa5cSAndroid Build Coastguard Worker
516*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
517*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
518*dfc6aa5cSAndroid Build Coastguard Worker return 0;
519*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
520*dfc6aa5cSAndroid Build Coastguard Worker return 0;
521*dfc6aa5cSAndroid Build Coastguard Worker
522*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_AVX2) &&
523*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_AVX(jconst_fancy_upsample_avx2))
524*dfc6aa5cSAndroid Build Coastguard Worker return 1;
525*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) &&
526*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_SSE(jconst_fancy_upsample_sse2))
527*dfc6aa5cSAndroid Build Coastguard Worker return 1;
528*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
529*dfc6aa5cSAndroid Build Coastguard Worker return 1;
530*dfc6aa5cSAndroid Build Coastguard Worker
531*dfc6aa5cSAndroid Build Coastguard Worker return 0;
532*dfc6aa5cSAndroid Build Coastguard Worker }
533*dfc6aa5cSAndroid Build Coastguard Worker
534*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_h2v1_fancy_upsample(void)535*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_h2v1_fancy_upsample(void)
536*dfc6aa5cSAndroid Build Coastguard Worker {
537*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
538*dfc6aa5cSAndroid Build Coastguard Worker
539*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
540*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
541*dfc6aa5cSAndroid Build Coastguard Worker return 0;
542*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
543*dfc6aa5cSAndroid Build Coastguard Worker return 0;
544*dfc6aa5cSAndroid Build Coastguard Worker
545*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_AVX2) &&
546*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_AVX(jconst_fancy_upsample_avx2))
547*dfc6aa5cSAndroid Build Coastguard Worker return 1;
548*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) &&
549*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_SSE(jconst_fancy_upsample_sse2))
550*dfc6aa5cSAndroid Build Coastguard Worker return 1;
551*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
552*dfc6aa5cSAndroid Build Coastguard Worker return 1;
553*dfc6aa5cSAndroid Build Coastguard Worker
554*dfc6aa5cSAndroid Build Coastguard Worker return 0;
555*dfc6aa5cSAndroid Build Coastguard Worker }
556*dfc6aa5cSAndroid Build Coastguard Worker
557*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)558*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
559*dfc6aa5cSAndroid Build Coastguard Worker JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
560*dfc6aa5cSAndroid Build Coastguard Worker {
561*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
562*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
563*dfc6aa5cSAndroid Build Coastguard Worker
564*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
565*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_fancy_upsample_avx2(cinfo->max_v_samp_factor,
566*dfc6aa5cSAndroid Build Coastguard Worker compptr->downsampled_width, input_data,
567*dfc6aa5cSAndroid Build Coastguard Worker output_data_ptr);
568*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
569*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_fancy_upsample_sse2(cinfo->max_v_samp_factor,
570*dfc6aa5cSAndroid Build Coastguard Worker compptr->downsampled_width, input_data,
571*dfc6aa5cSAndroid Build Coastguard Worker output_data_ptr);
572*dfc6aa5cSAndroid Build Coastguard Worker else
573*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_fancy_upsample_mmx(cinfo->max_v_samp_factor,
574*dfc6aa5cSAndroid Build Coastguard Worker compptr->downsampled_width, input_data,
575*dfc6aa5cSAndroid Build Coastguard Worker output_data_ptr);
576*dfc6aa5cSAndroid Build Coastguard Worker }
577*dfc6aa5cSAndroid Build Coastguard Worker
578*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_h2v1_fancy_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)579*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
580*dfc6aa5cSAndroid Build Coastguard Worker JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
581*dfc6aa5cSAndroid Build Coastguard Worker {
582*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
583*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
584*dfc6aa5cSAndroid Build Coastguard Worker
585*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
586*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_fancy_upsample_avx2(cinfo->max_v_samp_factor,
587*dfc6aa5cSAndroid Build Coastguard Worker compptr->downsampled_width, input_data,
588*dfc6aa5cSAndroid Build Coastguard Worker output_data_ptr);
589*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
590*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_fancy_upsample_sse2(cinfo->max_v_samp_factor,
591*dfc6aa5cSAndroid Build Coastguard Worker compptr->downsampled_width, input_data,
592*dfc6aa5cSAndroid Build Coastguard Worker output_data_ptr);
593*dfc6aa5cSAndroid Build Coastguard Worker else
594*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_fancy_upsample_mmx(cinfo->max_v_samp_factor,
595*dfc6aa5cSAndroid Build Coastguard Worker compptr->downsampled_width, input_data,
596*dfc6aa5cSAndroid Build Coastguard Worker output_data_ptr);
597*dfc6aa5cSAndroid Build Coastguard Worker }
598*dfc6aa5cSAndroid Build Coastguard Worker
599*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_h2v2_merged_upsample(void)600*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_h2v2_merged_upsample(void)
601*dfc6aa5cSAndroid Build Coastguard Worker {
602*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
603*dfc6aa5cSAndroid Build Coastguard Worker
604*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
605*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
606*dfc6aa5cSAndroid Build Coastguard Worker return 0;
607*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
608*dfc6aa5cSAndroid Build Coastguard Worker return 0;
609*dfc6aa5cSAndroid Build Coastguard Worker
610*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_AVX2) &&
611*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_AVX(jconst_merged_upsample_avx2))
612*dfc6aa5cSAndroid Build Coastguard Worker return 1;
613*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) &&
614*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_SSE(jconst_merged_upsample_sse2))
615*dfc6aa5cSAndroid Build Coastguard Worker return 1;
616*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
617*dfc6aa5cSAndroid Build Coastguard Worker return 1;
618*dfc6aa5cSAndroid Build Coastguard Worker
619*dfc6aa5cSAndroid Build Coastguard Worker return 0;
620*dfc6aa5cSAndroid Build Coastguard Worker }
621*dfc6aa5cSAndroid Build Coastguard Worker
622*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_h2v1_merged_upsample(void)623*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_h2v1_merged_upsample(void)
624*dfc6aa5cSAndroid Build Coastguard Worker {
625*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
626*dfc6aa5cSAndroid Build Coastguard Worker
627*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
628*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
629*dfc6aa5cSAndroid Build Coastguard Worker return 0;
630*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
631*dfc6aa5cSAndroid Build Coastguard Worker return 0;
632*dfc6aa5cSAndroid Build Coastguard Worker
633*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_AVX2) &&
634*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_AVX(jconst_merged_upsample_avx2))
635*dfc6aa5cSAndroid Build Coastguard Worker return 1;
636*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) &&
637*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_SSE(jconst_merged_upsample_sse2))
638*dfc6aa5cSAndroid Build Coastguard Worker return 1;
639*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
640*dfc6aa5cSAndroid Build Coastguard Worker return 1;
641*dfc6aa5cSAndroid Build Coastguard Worker
642*dfc6aa5cSAndroid Build Coastguard Worker return 0;
643*dfc6aa5cSAndroid Build Coastguard Worker }
644*dfc6aa5cSAndroid Build Coastguard Worker
645*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_h2v2_merged_upsample(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION in_row_group_ctr,JSAMPARRAY output_buf)646*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v2_merged_upsample(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
647*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf)
648*dfc6aa5cSAndroid Build Coastguard Worker {
649*dfc6aa5cSAndroid Build Coastguard Worker void (*avx2fct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
650*dfc6aa5cSAndroid Build Coastguard Worker void (*sse2fct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
651*dfc6aa5cSAndroid Build Coastguard Worker void (*mmxfct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
652*dfc6aa5cSAndroid Build Coastguard Worker
653*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
654*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
655*dfc6aa5cSAndroid Build Coastguard Worker
656*dfc6aa5cSAndroid Build Coastguard Worker switch (cinfo->out_color_space) {
657*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGB:
658*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v2_extrgb_merged_upsample_avx2;
659*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v2_extrgb_merged_upsample_sse2;
660*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v2_extrgb_merged_upsample_mmx;
661*dfc6aa5cSAndroid Build Coastguard Worker break;
662*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGBX:
663*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGBA:
664*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v2_extrgbx_merged_upsample_avx2;
665*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v2_extrgbx_merged_upsample_sse2;
666*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v2_extrgbx_merged_upsample_mmx;
667*dfc6aa5cSAndroid Build Coastguard Worker break;
668*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGR:
669*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v2_extbgr_merged_upsample_avx2;
670*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v2_extbgr_merged_upsample_sse2;
671*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v2_extbgr_merged_upsample_mmx;
672*dfc6aa5cSAndroid Build Coastguard Worker break;
673*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGRX:
674*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGRA:
675*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v2_extbgrx_merged_upsample_avx2;
676*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v2_extbgrx_merged_upsample_sse2;
677*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v2_extbgrx_merged_upsample_mmx;
678*dfc6aa5cSAndroid Build Coastguard Worker break;
679*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_XBGR:
680*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_ABGR:
681*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v2_extxbgr_merged_upsample_avx2;
682*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v2_extxbgr_merged_upsample_sse2;
683*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v2_extxbgr_merged_upsample_mmx;
684*dfc6aa5cSAndroid Build Coastguard Worker break;
685*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_XRGB:
686*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_ARGB:
687*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v2_extxrgb_merged_upsample_avx2;
688*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v2_extxrgb_merged_upsample_sse2;
689*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v2_extxrgb_merged_upsample_mmx;
690*dfc6aa5cSAndroid Build Coastguard Worker break;
691*dfc6aa5cSAndroid Build Coastguard Worker default:
692*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v2_merged_upsample_avx2;
693*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v2_merged_upsample_sse2;
694*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v2_merged_upsample_mmx;
695*dfc6aa5cSAndroid Build Coastguard Worker break;
696*dfc6aa5cSAndroid Build Coastguard Worker }
697*dfc6aa5cSAndroid Build Coastguard Worker
698*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
699*dfc6aa5cSAndroid Build Coastguard Worker avx2fct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
700*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
701*dfc6aa5cSAndroid Build Coastguard Worker sse2fct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
702*dfc6aa5cSAndroid Build Coastguard Worker else
703*dfc6aa5cSAndroid Build Coastguard Worker mmxfct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
704*dfc6aa5cSAndroid Build Coastguard Worker }
705*dfc6aa5cSAndroid Build Coastguard Worker
706*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_h2v1_merged_upsample(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION in_row_group_ctr,JSAMPARRAY output_buf)707*dfc6aa5cSAndroid Build Coastguard Worker jsimd_h2v1_merged_upsample(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
708*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf)
709*dfc6aa5cSAndroid Build Coastguard Worker {
710*dfc6aa5cSAndroid Build Coastguard Worker void (*avx2fct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
711*dfc6aa5cSAndroid Build Coastguard Worker void (*sse2fct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
712*dfc6aa5cSAndroid Build Coastguard Worker void (*mmxfct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
713*dfc6aa5cSAndroid Build Coastguard Worker
714*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
715*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
716*dfc6aa5cSAndroid Build Coastguard Worker
717*dfc6aa5cSAndroid Build Coastguard Worker switch (cinfo->out_color_space) {
718*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGB:
719*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v1_extrgb_merged_upsample_avx2;
720*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v1_extrgb_merged_upsample_sse2;
721*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v1_extrgb_merged_upsample_mmx;
722*dfc6aa5cSAndroid Build Coastguard Worker break;
723*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGBX:
724*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_RGBA:
725*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v1_extrgbx_merged_upsample_avx2;
726*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v1_extrgbx_merged_upsample_sse2;
727*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v1_extrgbx_merged_upsample_mmx;
728*dfc6aa5cSAndroid Build Coastguard Worker break;
729*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGR:
730*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v1_extbgr_merged_upsample_avx2;
731*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v1_extbgr_merged_upsample_sse2;
732*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v1_extbgr_merged_upsample_mmx;
733*dfc6aa5cSAndroid Build Coastguard Worker break;
734*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGRX:
735*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_BGRA:
736*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v1_extbgrx_merged_upsample_avx2;
737*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v1_extbgrx_merged_upsample_sse2;
738*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v1_extbgrx_merged_upsample_mmx;
739*dfc6aa5cSAndroid Build Coastguard Worker break;
740*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_XBGR:
741*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_ABGR:
742*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v1_extxbgr_merged_upsample_avx2;
743*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v1_extxbgr_merged_upsample_sse2;
744*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v1_extxbgr_merged_upsample_mmx;
745*dfc6aa5cSAndroid Build Coastguard Worker break;
746*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_XRGB:
747*dfc6aa5cSAndroid Build Coastguard Worker case JCS_EXT_ARGB:
748*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v1_extxrgb_merged_upsample_avx2;
749*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v1_extxrgb_merged_upsample_sse2;
750*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v1_extxrgb_merged_upsample_mmx;
751*dfc6aa5cSAndroid Build Coastguard Worker break;
752*dfc6aa5cSAndroid Build Coastguard Worker default:
753*dfc6aa5cSAndroid Build Coastguard Worker avx2fct = jsimd_h2v1_merged_upsample_avx2;
754*dfc6aa5cSAndroid Build Coastguard Worker sse2fct = jsimd_h2v1_merged_upsample_sse2;
755*dfc6aa5cSAndroid Build Coastguard Worker mmxfct = jsimd_h2v1_merged_upsample_mmx;
756*dfc6aa5cSAndroid Build Coastguard Worker break;
757*dfc6aa5cSAndroid Build Coastguard Worker }
758*dfc6aa5cSAndroid Build Coastguard Worker
759*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
760*dfc6aa5cSAndroid Build Coastguard Worker avx2fct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
761*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
762*dfc6aa5cSAndroid Build Coastguard Worker sse2fct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
763*dfc6aa5cSAndroid Build Coastguard Worker else
764*dfc6aa5cSAndroid Build Coastguard Worker mmxfct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
765*dfc6aa5cSAndroid Build Coastguard Worker }
766*dfc6aa5cSAndroid Build Coastguard Worker
767*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_convsamp(void)768*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_convsamp(void)
769*dfc6aa5cSAndroid Build Coastguard Worker {
770*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
771*dfc6aa5cSAndroid Build Coastguard Worker
772*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
773*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
774*dfc6aa5cSAndroid Build Coastguard Worker return 0;
775*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
776*dfc6aa5cSAndroid Build Coastguard Worker return 0;
777*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
778*dfc6aa5cSAndroid Build Coastguard Worker return 0;
779*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(DCTELEM) != 2)
780*dfc6aa5cSAndroid Build Coastguard Worker return 0;
781*dfc6aa5cSAndroid Build Coastguard Worker
782*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
783*dfc6aa5cSAndroid Build Coastguard Worker return 1;
784*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
785*dfc6aa5cSAndroid Build Coastguard Worker return 1;
786*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
787*dfc6aa5cSAndroid Build Coastguard Worker return 1;
788*dfc6aa5cSAndroid Build Coastguard Worker
789*dfc6aa5cSAndroid Build Coastguard Worker return 0;
790*dfc6aa5cSAndroid Build Coastguard Worker }
791*dfc6aa5cSAndroid Build Coastguard Worker
792*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_convsamp_float(void)793*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_convsamp_float(void)
794*dfc6aa5cSAndroid Build Coastguard Worker {
795*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
796*dfc6aa5cSAndroid Build Coastguard Worker
797*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
798*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
799*dfc6aa5cSAndroid Build Coastguard Worker return 0;
800*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
801*dfc6aa5cSAndroid Build Coastguard Worker return 0;
802*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
803*dfc6aa5cSAndroid Build Coastguard Worker return 0;
804*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(FAST_FLOAT) != 4)
805*dfc6aa5cSAndroid Build Coastguard Worker return 0;
806*dfc6aa5cSAndroid Build Coastguard Worker
807*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
808*dfc6aa5cSAndroid Build Coastguard Worker return 1;
809*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE)
810*dfc6aa5cSAndroid Build Coastguard Worker return 1;
811*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_3DNOW)
812*dfc6aa5cSAndroid Build Coastguard Worker return 1;
813*dfc6aa5cSAndroid Build Coastguard Worker
814*dfc6aa5cSAndroid Build Coastguard Worker return 0;
815*dfc6aa5cSAndroid Build Coastguard Worker }
816*dfc6aa5cSAndroid Build Coastguard Worker
817*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_convsamp(JSAMPARRAY sample_data,JDIMENSION start_col,DCTELEM * workspace)818*dfc6aa5cSAndroid Build Coastguard Worker jsimd_convsamp(JSAMPARRAY sample_data, JDIMENSION start_col,
819*dfc6aa5cSAndroid Build Coastguard Worker DCTELEM *workspace)
820*dfc6aa5cSAndroid Build Coastguard Worker {
821*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
822*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
823*dfc6aa5cSAndroid Build Coastguard Worker
824*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
825*dfc6aa5cSAndroid Build Coastguard Worker jsimd_convsamp_avx2(sample_data, start_col, workspace);
826*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
827*dfc6aa5cSAndroid Build Coastguard Worker jsimd_convsamp_sse2(sample_data, start_col, workspace);
828*dfc6aa5cSAndroid Build Coastguard Worker else
829*dfc6aa5cSAndroid Build Coastguard Worker jsimd_convsamp_mmx(sample_data, start_col, workspace);
830*dfc6aa5cSAndroid Build Coastguard Worker }
831*dfc6aa5cSAndroid Build Coastguard Worker
832*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_convsamp_float(JSAMPARRAY sample_data,JDIMENSION start_col,FAST_FLOAT * workspace)833*dfc6aa5cSAndroid Build Coastguard Worker jsimd_convsamp_float(JSAMPARRAY sample_data, JDIMENSION start_col,
834*dfc6aa5cSAndroid Build Coastguard Worker FAST_FLOAT *workspace)
835*dfc6aa5cSAndroid Build Coastguard Worker {
836*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
837*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
838*dfc6aa5cSAndroid Build Coastguard Worker
839*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
840*dfc6aa5cSAndroid Build Coastguard Worker jsimd_convsamp_float_sse2(sample_data, start_col, workspace);
841*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE)
842*dfc6aa5cSAndroid Build Coastguard Worker jsimd_convsamp_float_sse(sample_data, start_col, workspace);
843*dfc6aa5cSAndroid Build Coastguard Worker else
844*dfc6aa5cSAndroid Build Coastguard Worker jsimd_convsamp_float_3dnow(sample_data, start_col, workspace);
845*dfc6aa5cSAndroid Build Coastguard Worker }
846*dfc6aa5cSAndroid Build Coastguard Worker
847*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_fdct_islow(void)848*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_fdct_islow(void)
849*dfc6aa5cSAndroid Build Coastguard Worker {
850*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
851*dfc6aa5cSAndroid Build Coastguard Worker
852*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
853*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
854*dfc6aa5cSAndroid Build Coastguard Worker return 0;
855*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(DCTELEM) != 2)
856*dfc6aa5cSAndroid Build Coastguard Worker return 0;
857*dfc6aa5cSAndroid Build Coastguard Worker
858*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_AVX2) && IS_ALIGNED_AVX(jconst_fdct_islow_avx2))
859*dfc6aa5cSAndroid Build Coastguard Worker return 1;
860*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_fdct_islow_sse2))
861*dfc6aa5cSAndroid Build Coastguard Worker return 1;
862*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
863*dfc6aa5cSAndroid Build Coastguard Worker return 1;
864*dfc6aa5cSAndroid Build Coastguard Worker
865*dfc6aa5cSAndroid Build Coastguard Worker return 0;
866*dfc6aa5cSAndroid Build Coastguard Worker }
867*dfc6aa5cSAndroid Build Coastguard Worker
868*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_fdct_ifast(void)869*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_fdct_ifast(void)
870*dfc6aa5cSAndroid Build Coastguard Worker {
871*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
872*dfc6aa5cSAndroid Build Coastguard Worker
873*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
874*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
875*dfc6aa5cSAndroid Build Coastguard Worker return 0;
876*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(DCTELEM) != 2)
877*dfc6aa5cSAndroid Build Coastguard Worker return 0;
878*dfc6aa5cSAndroid Build Coastguard Worker
879*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_fdct_ifast_sse2))
880*dfc6aa5cSAndroid Build Coastguard Worker return 1;
881*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
882*dfc6aa5cSAndroid Build Coastguard Worker return 1;
883*dfc6aa5cSAndroid Build Coastguard Worker
884*dfc6aa5cSAndroid Build Coastguard Worker return 0;
885*dfc6aa5cSAndroid Build Coastguard Worker }
886*dfc6aa5cSAndroid Build Coastguard Worker
887*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_fdct_float(void)888*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_fdct_float(void)
889*dfc6aa5cSAndroid Build Coastguard Worker {
890*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
891*dfc6aa5cSAndroid Build Coastguard Worker
892*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
893*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
894*dfc6aa5cSAndroid Build Coastguard Worker return 0;
895*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(FAST_FLOAT) != 4)
896*dfc6aa5cSAndroid Build Coastguard Worker return 0;
897*dfc6aa5cSAndroid Build Coastguard Worker
898*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE) && IS_ALIGNED_SSE(jconst_fdct_float_sse))
899*dfc6aa5cSAndroid Build Coastguard Worker return 1;
900*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_3DNOW)
901*dfc6aa5cSAndroid Build Coastguard Worker return 1;
902*dfc6aa5cSAndroid Build Coastguard Worker
903*dfc6aa5cSAndroid Build Coastguard Worker return 0;
904*dfc6aa5cSAndroid Build Coastguard Worker }
905*dfc6aa5cSAndroid Build Coastguard Worker
906*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_fdct_islow(DCTELEM * data)907*dfc6aa5cSAndroid Build Coastguard Worker jsimd_fdct_islow(DCTELEM *data)
908*dfc6aa5cSAndroid Build Coastguard Worker {
909*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
910*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
911*dfc6aa5cSAndroid Build Coastguard Worker
912*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
913*dfc6aa5cSAndroid Build Coastguard Worker jsimd_fdct_islow_avx2(data);
914*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
915*dfc6aa5cSAndroid Build Coastguard Worker jsimd_fdct_islow_sse2(data);
916*dfc6aa5cSAndroid Build Coastguard Worker else
917*dfc6aa5cSAndroid Build Coastguard Worker jsimd_fdct_islow_mmx(data);
918*dfc6aa5cSAndroid Build Coastguard Worker }
919*dfc6aa5cSAndroid Build Coastguard Worker
920*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_fdct_ifast(DCTELEM * data)921*dfc6aa5cSAndroid Build Coastguard Worker jsimd_fdct_ifast(DCTELEM *data)
922*dfc6aa5cSAndroid Build Coastguard Worker {
923*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
924*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
925*dfc6aa5cSAndroid Build Coastguard Worker
926*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_fdct_islow_sse2))
927*dfc6aa5cSAndroid Build Coastguard Worker jsimd_fdct_ifast_sse2(data);
928*dfc6aa5cSAndroid Build Coastguard Worker else
929*dfc6aa5cSAndroid Build Coastguard Worker jsimd_fdct_ifast_mmx(data);
930*dfc6aa5cSAndroid Build Coastguard Worker }
931*dfc6aa5cSAndroid Build Coastguard Worker
932*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_fdct_float(FAST_FLOAT * data)933*dfc6aa5cSAndroid Build Coastguard Worker jsimd_fdct_float(FAST_FLOAT *data)
934*dfc6aa5cSAndroid Build Coastguard Worker {
935*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
936*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
937*dfc6aa5cSAndroid Build Coastguard Worker
938*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE) && IS_ALIGNED_SSE(jconst_fdct_float_sse))
939*dfc6aa5cSAndroid Build Coastguard Worker jsimd_fdct_float_sse(data);
940*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_3DNOW)
941*dfc6aa5cSAndroid Build Coastguard Worker jsimd_fdct_float_3dnow(data);
942*dfc6aa5cSAndroid Build Coastguard Worker }
943*dfc6aa5cSAndroid Build Coastguard Worker
944*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_quantize(void)945*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_quantize(void)
946*dfc6aa5cSAndroid Build Coastguard Worker {
947*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
948*dfc6aa5cSAndroid Build Coastguard Worker
949*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
950*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
951*dfc6aa5cSAndroid Build Coastguard Worker return 0;
952*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JCOEF) != 2)
953*dfc6aa5cSAndroid Build Coastguard Worker return 0;
954*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(DCTELEM) != 2)
955*dfc6aa5cSAndroid Build Coastguard Worker return 0;
956*dfc6aa5cSAndroid Build Coastguard Worker
957*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
958*dfc6aa5cSAndroid Build Coastguard Worker return 1;
959*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
960*dfc6aa5cSAndroid Build Coastguard Worker return 1;
961*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
962*dfc6aa5cSAndroid Build Coastguard Worker return 1;
963*dfc6aa5cSAndroid Build Coastguard Worker
964*dfc6aa5cSAndroid Build Coastguard Worker return 0;
965*dfc6aa5cSAndroid Build Coastguard Worker }
966*dfc6aa5cSAndroid Build Coastguard Worker
967*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_quantize_float(void)968*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_quantize_float(void)
969*dfc6aa5cSAndroid Build Coastguard Worker {
970*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
971*dfc6aa5cSAndroid Build Coastguard Worker
972*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
973*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
974*dfc6aa5cSAndroid Build Coastguard Worker return 0;
975*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JCOEF) != 2)
976*dfc6aa5cSAndroid Build Coastguard Worker return 0;
977*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(FAST_FLOAT) != 4)
978*dfc6aa5cSAndroid Build Coastguard Worker return 0;
979*dfc6aa5cSAndroid Build Coastguard Worker
980*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
981*dfc6aa5cSAndroid Build Coastguard Worker return 1;
982*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE)
983*dfc6aa5cSAndroid Build Coastguard Worker return 1;
984*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_3DNOW)
985*dfc6aa5cSAndroid Build Coastguard Worker return 1;
986*dfc6aa5cSAndroid Build Coastguard Worker
987*dfc6aa5cSAndroid Build Coastguard Worker return 0;
988*dfc6aa5cSAndroid Build Coastguard Worker }
989*dfc6aa5cSAndroid Build Coastguard Worker
990*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_quantize(JCOEFPTR coef_block,DCTELEM * divisors,DCTELEM * workspace)991*dfc6aa5cSAndroid Build Coastguard Worker jsimd_quantize(JCOEFPTR coef_block, DCTELEM *divisors, DCTELEM *workspace)
992*dfc6aa5cSAndroid Build Coastguard Worker {
993*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
994*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
995*dfc6aa5cSAndroid Build Coastguard Worker
996*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
997*dfc6aa5cSAndroid Build Coastguard Worker jsimd_quantize_avx2(coef_block, divisors, workspace);
998*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
999*dfc6aa5cSAndroid Build Coastguard Worker jsimd_quantize_sse2(coef_block, divisors, workspace);
1000*dfc6aa5cSAndroid Build Coastguard Worker else
1001*dfc6aa5cSAndroid Build Coastguard Worker jsimd_quantize_mmx(coef_block, divisors, workspace);
1002*dfc6aa5cSAndroid Build Coastguard Worker }
1003*dfc6aa5cSAndroid Build Coastguard Worker
1004*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_quantize_float(JCOEFPTR coef_block,FAST_FLOAT * divisors,FAST_FLOAT * workspace)1005*dfc6aa5cSAndroid Build Coastguard Worker jsimd_quantize_float(JCOEFPTR coef_block, FAST_FLOAT *divisors,
1006*dfc6aa5cSAndroid Build Coastguard Worker FAST_FLOAT *workspace)
1007*dfc6aa5cSAndroid Build Coastguard Worker {
1008*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
1009*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1010*dfc6aa5cSAndroid Build Coastguard Worker
1011*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
1012*dfc6aa5cSAndroid Build Coastguard Worker jsimd_quantize_float_sse2(coef_block, divisors, workspace);
1013*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE)
1014*dfc6aa5cSAndroid Build Coastguard Worker jsimd_quantize_float_sse(coef_block, divisors, workspace);
1015*dfc6aa5cSAndroid Build Coastguard Worker else
1016*dfc6aa5cSAndroid Build Coastguard Worker jsimd_quantize_float_3dnow(coef_block, divisors, workspace);
1017*dfc6aa5cSAndroid Build Coastguard Worker }
1018*dfc6aa5cSAndroid Build Coastguard Worker
1019*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_idct_2x2(void)1020*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_idct_2x2(void)
1021*dfc6aa5cSAndroid Build Coastguard Worker {
1022*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1023*dfc6aa5cSAndroid Build Coastguard Worker
1024*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
1025*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
1026*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1027*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JCOEF) != 2)
1028*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1029*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
1030*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1031*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
1032*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1033*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(ISLOW_MULT_TYPE) != 2)
1034*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1035*dfc6aa5cSAndroid Build Coastguard Worker
1036*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_idct_red_sse2))
1037*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1038*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
1039*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1040*dfc6aa5cSAndroid Build Coastguard Worker
1041*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1042*dfc6aa5cSAndroid Build Coastguard Worker }
1043*dfc6aa5cSAndroid Build Coastguard Worker
1044*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_idct_4x4(void)1045*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_idct_4x4(void)
1046*dfc6aa5cSAndroid Build Coastguard Worker {
1047*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1048*dfc6aa5cSAndroid Build Coastguard Worker
1049*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
1050*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
1051*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1052*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JCOEF) != 2)
1053*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1054*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
1055*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1056*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
1057*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1058*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(ISLOW_MULT_TYPE) != 2)
1059*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1060*dfc6aa5cSAndroid Build Coastguard Worker
1061*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_idct_red_sse2))
1062*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1063*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
1064*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1065*dfc6aa5cSAndroid Build Coastguard Worker
1066*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1067*dfc6aa5cSAndroid Build Coastguard Worker }
1068*dfc6aa5cSAndroid Build Coastguard Worker
1069*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_idct_2x2(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)1070*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_2x2(j_decompress_ptr cinfo, jpeg_component_info *compptr,
1071*dfc6aa5cSAndroid Build Coastguard Worker JCOEFPTR coef_block, JSAMPARRAY output_buf,
1072*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION output_col)
1073*dfc6aa5cSAndroid Build Coastguard Worker {
1074*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
1075*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1076*dfc6aa5cSAndroid Build Coastguard Worker
1077*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_idct_red_sse2))
1078*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_2x2_sse2(compptr->dct_table, coef_block, output_buf,
1079*dfc6aa5cSAndroid Build Coastguard Worker output_col);
1080*dfc6aa5cSAndroid Build Coastguard Worker else
1081*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_2x2_mmx(compptr->dct_table, coef_block, output_buf, output_col);
1082*dfc6aa5cSAndroid Build Coastguard Worker }
1083*dfc6aa5cSAndroid Build Coastguard Worker
1084*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_idct_4x4(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)1085*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_4x4(j_decompress_ptr cinfo, jpeg_component_info *compptr,
1086*dfc6aa5cSAndroid Build Coastguard Worker JCOEFPTR coef_block, JSAMPARRAY output_buf,
1087*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION output_col)
1088*dfc6aa5cSAndroid Build Coastguard Worker {
1089*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
1090*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1091*dfc6aa5cSAndroid Build Coastguard Worker
1092*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_idct_red_sse2))
1093*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_4x4_sse2(compptr->dct_table, coef_block, output_buf,
1094*dfc6aa5cSAndroid Build Coastguard Worker output_col);
1095*dfc6aa5cSAndroid Build Coastguard Worker else
1096*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_4x4_mmx(compptr->dct_table, coef_block, output_buf, output_col);
1097*dfc6aa5cSAndroid Build Coastguard Worker }
1098*dfc6aa5cSAndroid Build Coastguard Worker
1099*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_idct_islow(void)1100*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_idct_islow(void)
1101*dfc6aa5cSAndroid Build Coastguard Worker {
1102*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1103*dfc6aa5cSAndroid Build Coastguard Worker
1104*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
1105*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
1106*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1107*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JCOEF) != 2)
1108*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1109*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
1110*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1111*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
1112*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1113*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(ISLOW_MULT_TYPE) != 2)
1114*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1115*dfc6aa5cSAndroid Build Coastguard Worker
1116*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_AVX2) && IS_ALIGNED_AVX(jconst_idct_islow_avx2))
1117*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1118*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_idct_islow_sse2))
1119*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1120*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
1121*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1122*dfc6aa5cSAndroid Build Coastguard Worker
1123*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1124*dfc6aa5cSAndroid Build Coastguard Worker }
1125*dfc6aa5cSAndroid Build Coastguard Worker
1126*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_idct_ifast(void)1127*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_idct_ifast(void)
1128*dfc6aa5cSAndroid Build Coastguard Worker {
1129*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1130*dfc6aa5cSAndroid Build Coastguard Worker
1131*dfc6aa5cSAndroid Build Coastguard Worker /* The code is optimised for these values only */
1132*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
1133*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1134*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JCOEF) != 2)
1135*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1136*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
1137*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1138*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
1139*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1140*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(IFAST_MULT_TYPE) != 2)
1141*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1142*dfc6aa5cSAndroid Build Coastguard Worker if (IFAST_SCALE_BITS != 2)
1143*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1144*dfc6aa5cSAndroid Build Coastguard Worker
1145*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_idct_ifast_sse2))
1146*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1147*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_MMX)
1148*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1149*dfc6aa5cSAndroid Build Coastguard Worker
1150*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1151*dfc6aa5cSAndroid Build Coastguard Worker }
1152*dfc6aa5cSAndroid Build Coastguard Worker
1153*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_idct_float(void)1154*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_idct_float(void)
1155*dfc6aa5cSAndroid Build Coastguard Worker {
1156*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1157*dfc6aa5cSAndroid Build Coastguard Worker
1158*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
1159*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1160*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JCOEF) != 2)
1161*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1162*dfc6aa5cSAndroid Build Coastguard Worker if (BITS_IN_JSAMPLE != 8)
1163*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1164*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JDIMENSION) != 4)
1165*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1166*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(FAST_FLOAT) != 4)
1167*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1168*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(FLOAT_MULT_TYPE) != 4)
1169*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1170*dfc6aa5cSAndroid Build Coastguard Worker
1171*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_idct_float_sse2))
1172*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1173*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE) && IS_ALIGNED_SSE(jconst_idct_float_sse))
1174*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1175*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_3DNOW)
1176*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1177*dfc6aa5cSAndroid Build Coastguard Worker
1178*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1179*dfc6aa5cSAndroid Build Coastguard Worker }
1180*dfc6aa5cSAndroid Build Coastguard Worker
1181*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_idct_islow(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)1182*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_islow(j_decompress_ptr cinfo, jpeg_component_info *compptr,
1183*dfc6aa5cSAndroid Build Coastguard Worker JCOEFPTR coef_block, JSAMPARRAY output_buf,
1184*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION output_col)
1185*dfc6aa5cSAndroid Build Coastguard Worker {
1186*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
1187*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1188*dfc6aa5cSAndroid Build Coastguard Worker
1189*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_AVX2)
1190*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_islow_avx2(compptr->dct_table, coef_block, output_buf,
1191*dfc6aa5cSAndroid Build Coastguard Worker output_col);
1192*dfc6aa5cSAndroid Build Coastguard Worker else if (simd_support & JSIMD_SSE2)
1193*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_islow_sse2(compptr->dct_table, coef_block, output_buf,
1194*dfc6aa5cSAndroid Build Coastguard Worker output_col);
1195*dfc6aa5cSAndroid Build Coastguard Worker else
1196*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_islow_mmx(compptr->dct_table, coef_block, output_buf,
1197*dfc6aa5cSAndroid Build Coastguard Worker output_col);
1198*dfc6aa5cSAndroid Build Coastguard Worker }
1199*dfc6aa5cSAndroid Build Coastguard Worker
1200*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_idct_ifast(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)1201*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_ifast(j_decompress_ptr cinfo, jpeg_component_info *compptr,
1202*dfc6aa5cSAndroid Build Coastguard Worker JCOEFPTR coef_block, JSAMPARRAY output_buf,
1203*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION output_col)
1204*dfc6aa5cSAndroid Build Coastguard Worker {
1205*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
1206*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1207*dfc6aa5cSAndroid Build Coastguard Worker
1208*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_idct_ifast_sse2))
1209*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_ifast_sse2(compptr->dct_table, coef_block, output_buf,
1210*dfc6aa5cSAndroid Build Coastguard Worker output_col);
1211*dfc6aa5cSAndroid Build Coastguard Worker else
1212*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_ifast_mmx(compptr->dct_table, coef_block, output_buf,
1213*dfc6aa5cSAndroid Build Coastguard Worker output_col);
1214*dfc6aa5cSAndroid Build Coastguard Worker }
1215*dfc6aa5cSAndroid Build Coastguard Worker
1216*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_idct_float(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)1217*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_float(j_decompress_ptr cinfo, jpeg_component_info *compptr,
1218*dfc6aa5cSAndroid Build Coastguard Worker JCOEFPTR coef_block, JSAMPARRAY output_buf,
1219*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION output_col)
1220*dfc6aa5cSAndroid Build Coastguard Worker {
1221*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support == ~0U)
1222*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1223*dfc6aa5cSAndroid Build Coastguard Worker
1224*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && IS_ALIGNED_SSE(jconst_idct_float_sse2))
1225*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_float_sse2(compptr->dct_table, coef_block, output_buf,
1226*dfc6aa5cSAndroid Build Coastguard Worker output_col);
1227*dfc6aa5cSAndroid Build Coastguard Worker else if ((simd_support & JSIMD_SSE) && IS_ALIGNED_SSE(jconst_idct_float_sse))
1228*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_float_sse(compptr->dct_table, coef_block, output_buf,
1229*dfc6aa5cSAndroid Build Coastguard Worker output_col);
1230*dfc6aa5cSAndroid Build Coastguard Worker else
1231*dfc6aa5cSAndroid Build Coastguard Worker jsimd_idct_float_3dnow(compptr->dct_table, coef_block, output_buf,
1232*dfc6aa5cSAndroid Build Coastguard Worker output_col);
1233*dfc6aa5cSAndroid Build Coastguard Worker }
1234*dfc6aa5cSAndroid Build Coastguard Worker
1235*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_huff_encode_one_block(void)1236*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_huff_encode_one_block(void)
1237*dfc6aa5cSAndroid Build Coastguard Worker {
1238*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1239*dfc6aa5cSAndroid Build Coastguard Worker
1240*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
1241*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1242*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JCOEF) != 2)
1243*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1244*dfc6aa5cSAndroid Build Coastguard Worker
1245*dfc6aa5cSAndroid Build Coastguard Worker if ((simd_support & JSIMD_SSE2) && simd_huffman &&
1246*dfc6aa5cSAndroid Build Coastguard Worker IS_ALIGNED_SSE(jconst_huff_encode_one_block))
1247*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1248*dfc6aa5cSAndroid Build Coastguard Worker
1249*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1250*dfc6aa5cSAndroid Build Coastguard Worker }
1251*dfc6aa5cSAndroid Build Coastguard Worker
1252*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(JOCTET *)
jsimd_huff_encode_one_block(void * state,JOCTET * buffer,JCOEFPTR block,int last_dc_val,c_derived_tbl * dctbl,c_derived_tbl * actbl)1253*dfc6aa5cSAndroid Build Coastguard Worker jsimd_huff_encode_one_block(void *state, JOCTET *buffer, JCOEFPTR block,
1254*dfc6aa5cSAndroid Build Coastguard Worker int last_dc_val, c_derived_tbl *dctbl,
1255*dfc6aa5cSAndroid Build Coastguard Worker c_derived_tbl *actbl)
1256*dfc6aa5cSAndroid Build Coastguard Worker {
1257*dfc6aa5cSAndroid Build Coastguard Worker return jsimd_huff_encode_one_block_sse2(state, buffer, block, last_dc_val,
1258*dfc6aa5cSAndroid Build Coastguard Worker dctbl, actbl);
1259*dfc6aa5cSAndroid Build Coastguard Worker }
1260*dfc6aa5cSAndroid Build Coastguard Worker
1261*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_encode_mcu_AC_first_prepare(void)1262*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_encode_mcu_AC_first_prepare(void)
1263*dfc6aa5cSAndroid Build Coastguard Worker {
1264*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1265*dfc6aa5cSAndroid Build Coastguard Worker
1266*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
1267*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1268*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JCOEF) != 2)
1269*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1270*dfc6aa5cSAndroid Build Coastguard Worker if (SIZEOF_SIZE_T != 4)
1271*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1272*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
1273*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1274*dfc6aa5cSAndroid Build Coastguard Worker
1275*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1276*dfc6aa5cSAndroid Build Coastguard Worker }
1277*dfc6aa5cSAndroid Build Coastguard Worker
1278*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jsimd_encode_mcu_AC_first_prepare(const JCOEF * block,const int * jpeg_natural_order_start,int Sl,int Al,UJCOEF * values,size_t * zerobits)1279*dfc6aa5cSAndroid Build Coastguard Worker jsimd_encode_mcu_AC_first_prepare(const JCOEF *block,
1280*dfc6aa5cSAndroid Build Coastguard Worker const int *jpeg_natural_order_start, int Sl,
1281*dfc6aa5cSAndroid Build Coastguard Worker int Al, UJCOEF *values, size_t *zerobits)
1282*dfc6aa5cSAndroid Build Coastguard Worker {
1283*dfc6aa5cSAndroid Build Coastguard Worker jsimd_encode_mcu_AC_first_prepare_sse2(block, jpeg_natural_order_start,
1284*dfc6aa5cSAndroid Build Coastguard Worker Sl, Al, values, zerobits);
1285*dfc6aa5cSAndroid Build Coastguard Worker }
1286*dfc6aa5cSAndroid Build Coastguard Worker
1287*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_can_encode_mcu_AC_refine_prepare(void)1288*dfc6aa5cSAndroid Build Coastguard Worker jsimd_can_encode_mcu_AC_refine_prepare(void)
1289*dfc6aa5cSAndroid Build Coastguard Worker {
1290*dfc6aa5cSAndroid Build Coastguard Worker init_simd();
1291*dfc6aa5cSAndroid Build Coastguard Worker
1292*dfc6aa5cSAndroid Build Coastguard Worker if (DCTSIZE != 8)
1293*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1294*dfc6aa5cSAndroid Build Coastguard Worker if (sizeof(JCOEF) != 2)
1295*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1296*dfc6aa5cSAndroid Build Coastguard Worker if (SIZEOF_SIZE_T != 4)
1297*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1298*dfc6aa5cSAndroid Build Coastguard Worker if (simd_support & JSIMD_SSE2)
1299*dfc6aa5cSAndroid Build Coastguard Worker return 1;
1300*dfc6aa5cSAndroid Build Coastguard Worker
1301*dfc6aa5cSAndroid Build Coastguard Worker return 0;
1302*dfc6aa5cSAndroid Build Coastguard Worker }
1303*dfc6aa5cSAndroid Build Coastguard Worker
1304*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(int)
jsimd_encode_mcu_AC_refine_prepare(const JCOEF * block,const int * jpeg_natural_order_start,int Sl,int Al,UJCOEF * absvalues,size_t * bits)1305*dfc6aa5cSAndroid Build Coastguard Worker jsimd_encode_mcu_AC_refine_prepare(const JCOEF *block,
1306*dfc6aa5cSAndroid Build Coastguard Worker const int *jpeg_natural_order_start, int Sl,
1307*dfc6aa5cSAndroid Build Coastguard Worker int Al, UJCOEF *absvalues, size_t *bits)
1308*dfc6aa5cSAndroid Build Coastguard Worker {
1309*dfc6aa5cSAndroid Build Coastguard Worker return jsimd_encode_mcu_AC_refine_prepare_sse2(block,
1310*dfc6aa5cSAndroid Build Coastguard Worker jpeg_natural_order_start,
1311*dfc6aa5cSAndroid Build Coastguard Worker Sl, Al, absvalues, bits);
1312*dfc6aa5cSAndroid Build Coastguard Worker }
1313