xref: /aosp_15_r20/external/igt-gpu-tools/lib/igt_x86.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright (c) 2013 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*d83cc019SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*d83cc019SAndroid Build Coastguard Worker  * SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  *
23*d83cc019SAndroid Build Coastguard Worker  * Authors:
24*d83cc019SAndroid Build Coastguard Worker  *    Chris Wilson <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker  *
26*d83cc019SAndroid Build Coastguard Worker  */
27*d83cc019SAndroid Build Coastguard Worker 
28*d83cc019SAndroid Build Coastguard Worker #include "config.h"
29*d83cc019SAndroid Build Coastguard Worker 
30*d83cc019SAndroid Build Coastguard Worker #ifdef HAVE_CPUID_H
31*d83cc019SAndroid Build Coastguard Worker #include <cpuid.h>
32*d83cc019SAndroid Build Coastguard Worker #else
33*d83cc019SAndroid Build Coastguard Worker #define __get_cpuid_max(x, y) 0
34*d83cc019SAndroid Build Coastguard Worker #define __cpuid(level, a, b, c, d) a = b = c = d = 0
35*d83cc019SAndroid Build Coastguard Worker #define __cpuid_count(level, count, a, b, c, d) a = b = c = d = 0
36*d83cc019SAndroid Build Coastguard Worker #endif
37*d83cc019SAndroid Build Coastguard Worker 
38*d83cc019SAndroid Build Coastguard Worker #include "igt_x86.h"
39*d83cc019SAndroid Build Coastguard Worker #include "igt_aux.h"
40*d83cc019SAndroid Build Coastguard Worker 
41*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
42*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
43*d83cc019SAndroid Build Coastguard Worker #include <string.h>
44*d83cc019SAndroid Build Coastguard Worker 
45*d83cc019SAndroid Build Coastguard Worker /**
46*d83cc019SAndroid Build Coastguard Worker  * SECTION:igt_x86
47*d83cc019SAndroid Build Coastguard Worker  * @short_description: x86 helper library
48*d83cc019SAndroid Build Coastguard Worker  * @title: x86
49*d83cc019SAndroid Build Coastguard Worker  * @include: igt_x86.h
50*d83cc019SAndroid Build Coastguard Worker  */
51*d83cc019SAndroid Build Coastguard Worker 
52*d83cc019SAndroid Build Coastguard Worker #define BASIC_CPUID 0x0
53*d83cc019SAndroid Build Coastguard Worker #define EXTENDED_CPUID 0x80000000
54*d83cc019SAndroid Build Coastguard Worker 
55*d83cc019SAndroid Build Coastguard Worker #ifndef bit_MMX
56*d83cc019SAndroid Build Coastguard Worker #define bit_MMX		(1 << 23)
57*d83cc019SAndroid Build Coastguard Worker #endif
58*d83cc019SAndroid Build Coastguard Worker 
59*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSE
60*d83cc019SAndroid Build Coastguard Worker #define bit_SSE		(1 << 25)
61*d83cc019SAndroid Build Coastguard Worker #endif
62*d83cc019SAndroid Build Coastguard Worker 
63*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSE2
64*d83cc019SAndroid Build Coastguard Worker #define bit_SSE2	(1 << 26)
65*d83cc019SAndroid Build Coastguard Worker #endif
66*d83cc019SAndroid Build Coastguard Worker 
67*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSE3
68*d83cc019SAndroid Build Coastguard Worker #define bit_SSE3	(1 << 0)
69*d83cc019SAndroid Build Coastguard Worker #endif
70*d83cc019SAndroid Build Coastguard Worker 
71*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSSE3
72*d83cc019SAndroid Build Coastguard Worker #define bit_SSSE3	(1 << 9)
73*d83cc019SAndroid Build Coastguard Worker #endif
74*d83cc019SAndroid Build Coastguard Worker 
75*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSE4_1
76*d83cc019SAndroid Build Coastguard Worker #define bit_SSE4_1	(1 << 19)
77*d83cc019SAndroid Build Coastguard Worker #endif
78*d83cc019SAndroid Build Coastguard Worker 
79*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSE4_2
80*d83cc019SAndroid Build Coastguard Worker #define bit_SSE4_2	(1 << 20)
81*d83cc019SAndroid Build Coastguard Worker #endif
82*d83cc019SAndroid Build Coastguard Worker 
83*d83cc019SAndroid Build Coastguard Worker #ifndef bit_OSXSAVE
84*d83cc019SAndroid Build Coastguard Worker #define bit_OSXSAVE	(1 << 27)
85*d83cc019SAndroid Build Coastguard Worker #endif
86*d83cc019SAndroid Build Coastguard Worker 
87*d83cc019SAndroid Build Coastguard Worker #ifndef bit_AVX
88*d83cc019SAndroid Build Coastguard Worker #define bit_AVX		(1 << 28)
89*d83cc019SAndroid Build Coastguard Worker #endif
90*d83cc019SAndroid Build Coastguard Worker 
91*d83cc019SAndroid Build Coastguard Worker #ifndef bit_F16C
92*d83cc019SAndroid Build Coastguard Worker #define bit_F16C	(1 << 29)
93*d83cc019SAndroid Build Coastguard Worker #endif
94*d83cc019SAndroid Build Coastguard Worker 
95*d83cc019SAndroid Build Coastguard Worker #ifndef bit_AVX2
96*d83cc019SAndroid Build Coastguard Worker #define bit_AVX2	(1<<5)
97*d83cc019SAndroid Build Coastguard Worker #endif
98*d83cc019SAndroid Build Coastguard Worker 
99*d83cc019SAndroid Build Coastguard Worker #define xgetbv(index,eax,edx) \
100*d83cc019SAndroid Build Coastguard Worker 	__asm__ ("xgetbv" : "=a"(eax), "=d"(edx) : "c" (index))
101*d83cc019SAndroid Build Coastguard Worker 
102*d83cc019SAndroid Build Coastguard Worker #define has_YMM 0x1
103*d83cc019SAndroid Build Coastguard Worker 
104*d83cc019SAndroid Build Coastguard Worker #if defined(__x86_64__) || defined(__i386__)
igt_x86_features(void)105*d83cc019SAndroid Build Coastguard Worker unsigned igt_x86_features(void)
106*d83cc019SAndroid Build Coastguard Worker {
107*d83cc019SAndroid Build Coastguard Worker 	unsigned max = __get_cpuid_max(BASIC_CPUID, 0);
108*d83cc019SAndroid Build Coastguard Worker 	unsigned eax, ebx, ecx, edx;
109*d83cc019SAndroid Build Coastguard Worker 	unsigned features = 0;
110*d83cc019SAndroid Build Coastguard Worker 	unsigned extra = 0;
111*d83cc019SAndroid Build Coastguard Worker 
112*d83cc019SAndroid Build Coastguard Worker 	if (max >= 1) {
113*d83cc019SAndroid Build Coastguard Worker 		__cpuid(1, eax, ebx, ecx, edx);
114*d83cc019SAndroid Build Coastguard Worker 
115*d83cc019SAndroid Build Coastguard Worker 		if (ecx & bit_SSE3)
116*d83cc019SAndroid Build Coastguard Worker 			features |= SSE3;
117*d83cc019SAndroid Build Coastguard Worker 
118*d83cc019SAndroid Build Coastguard Worker 		if (ecx & bit_SSSE3)
119*d83cc019SAndroid Build Coastguard Worker 			features |= SSSE3;
120*d83cc019SAndroid Build Coastguard Worker 
121*d83cc019SAndroid Build Coastguard Worker 		if (ecx & bit_SSE4_1)
122*d83cc019SAndroid Build Coastguard Worker 			features |= SSE4_1;
123*d83cc019SAndroid Build Coastguard Worker 
124*d83cc019SAndroid Build Coastguard Worker 		if (ecx & bit_SSE4_2)
125*d83cc019SAndroid Build Coastguard Worker 			features |= SSE4_2;
126*d83cc019SAndroid Build Coastguard Worker 
127*d83cc019SAndroid Build Coastguard Worker 		if (ecx & bit_OSXSAVE) {
128*d83cc019SAndroid Build Coastguard Worker 			unsigned int bv_eax, bv_ecx;
129*d83cc019SAndroid Build Coastguard Worker 			xgetbv(0, bv_eax, bv_ecx);
130*d83cc019SAndroid Build Coastguard Worker 			if ((bv_eax & 6) == 6)
131*d83cc019SAndroid Build Coastguard Worker 				extra |= has_YMM;
132*d83cc019SAndroid Build Coastguard Worker 		}
133*d83cc019SAndroid Build Coastguard Worker 
134*d83cc019SAndroid Build Coastguard Worker 		if ((extra & has_YMM) && (ecx & bit_AVX))
135*d83cc019SAndroid Build Coastguard Worker 			features |= AVX;
136*d83cc019SAndroid Build Coastguard Worker 
137*d83cc019SAndroid Build Coastguard Worker 		if (edx & bit_MMX)
138*d83cc019SAndroid Build Coastguard Worker 			features |= MMX;
139*d83cc019SAndroid Build Coastguard Worker 
140*d83cc019SAndroid Build Coastguard Worker 		if (edx & bit_SSE)
141*d83cc019SAndroid Build Coastguard Worker 			features |= SSE;
142*d83cc019SAndroid Build Coastguard Worker 
143*d83cc019SAndroid Build Coastguard Worker 		if (edx & bit_SSE2)
144*d83cc019SAndroid Build Coastguard Worker 			features |= SSE2;
145*d83cc019SAndroid Build Coastguard Worker 
146*d83cc019SAndroid Build Coastguard Worker 		if (ecx & bit_F16C)
147*d83cc019SAndroid Build Coastguard Worker 			features |= F16C;
148*d83cc019SAndroid Build Coastguard Worker 	}
149*d83cc019SAndroid Build Coastguard Worker 
150*d83cc019SAndroid Build Coastguard Worker 	if (max >= 7) {
151*d83cc019SAndroid Build Coastguard Worker 		__cpuid_count(7, 0, eax, ebx, ecx, edx);
152*d83cc019SAndroid Build Coastguard Worker 
153*d83cc019SAndroid Build Coastguard Worker 		if ((extra & has_YMM) && (ebx & bit_AVX2))
154*d83cc019SAndroid Build Coastguard Worker 			features |= AVX2;
155*d83cc019SAndroid Build Coastguard Worker 	}
156*d83cc019SAndroid Build Coastguard Worker 
157*d83cc019SAndroid Build Coastguard Worker 	return features;
158*d83cc019SAndroid Build Coastguard Worker }
159*d83cc019SAndroid Build Coastguard Worker 
igt_x86_features_to_string(unsigned features,char * line)160*d83cc019SAndroid Build Coastguard Worker char *igt_x86_features_to_string(unsigned features, char *line)
161*d83cc019SAndroid Build Coastguard Worker {
162*d83cc019SAndroid Build Coastguard Worker 	char *ret = line;
163*d83cc019SAndroid Build Coastguard Worker 
164*d83cc019SAndroid Build Coastguard Worker #ifdef __x86_64__
165*d83cc019SAndroid Build Coastguard Worker 	line += sprintf(line, "x86-64");
166*d83cc019SAndroid Build Coastguard Worker #else
167*d83cc019SAndroid Build Coastguard Worker 	line += sprintf(line, "x86");
168*d83cc019SAndroid Build Coastguard Worker #endif
169*d83cc019SAndroid Build Coastguard Worker 
170*d83cc019SAndroid Build Coastguard Worker 	if (features & SSE2)
171*d83cc019SAndroid Build Coastguard Worker 		line += sprintf(line, ", sse2");
172*d83cc019SAndroid Build Coastguard Worker 	if (features & SSE3)
173*d83cc019SAndroid Build Coastguard Worker 		line += sprintf(line, ", sse3");
174*d83cc019SAndroid Build Coastguard Worker 	if (features & SSSE3)
175*d83cc019SAndroid Build Coastguard Worker 		line += sprintf(line, ", ssse3");
176*d83cc019SAndroid Build Coastguard Worker 	if (features & SSE4_1)
177*d83cc019SAndroid Build Coastguard Worker 		line += sprintf(line, ", sse4.1");
178*d83cc019SAndroid Build Coastguard Worker 	if (features & SSE4_2)
179*d83cc019SAndroid Build Coastguard Worker 		line += sprintf(line, ", sse4.2");
180*d83cc019SAndroid Build Coastguard Worker 	if (features & AVX)
181*d83cc019SAndroid Build Coastguard Worker 		line += sprintf(line, ", avx");
182*d83cc019SAndroid Build Coastguard Worker 	if (features & AVX2)
183*d83cc019SAndroid Build Coastguard Worker 		line += sprintf(line, ", avx2");
184*d83cc019SAndroid Build Coastguard Worker 	if (features & F16C)
185*d83cc019SAndroid Build Coastguard Worker 		line += sprintf(line, ", f16c");
186*d83cc019SAndroid Build Coastguard Worker 
187*d83cc019SAndroid Build Coastguard Worker 	(void)line;
188*d83cc019SAndroid Build Coastguard Worker 
189*d83cc019SAndroid Build Coastguard Worker 	return ret;
190*d83cc019SAndroid Build Coastguard Worker }
191*d83cc019SAndroid Build Coastguard Worker #endif
192*d83cc019SAndroid Build Coastguard Worker 
193*d83cc019SAndroid Build Coastguard Worker #if defined(__x86_64__) && !defined(__clang__)
194*d83cc019SAndroid Build Coastguard Worker #pragma GCC push_options
195*d83cc019SAndroid Build Coastguard Worker #pragma GCC target("sse4.1")
196*d83cc019SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wpointer-arith"
197*d83cc019SAndroid Build Coastguard Worker 
198*d83cc019SAndroid Build Coastguard Worker #include <smmintrin.h>
memcpy_from_wc_sse41(void * dst,const void * src,unsigned long len)199*d83cc019SAndroid Build Coastguard Worker static void memcpy_from_wc_sse41(void *dst, const void *src, unsigned long len)
200*d83cc019SAndroid Build Coastguard Worker {
201*d83cc019SAndroid Build Coastguard Worker 	char buf[16];
202*d83cc019SAndroid Build Coastguard Worker 
203*d83cc019SAndroid Build Coastguard Worker 	/* Flush the internal buffer of potential stale gfx data */
204*d83cc019SAndroid Build Coastguard Worker 	_mm_mfence();
205*d83cc019SAndroid Build Coastguard Worker 
206*d83cc019SAndroid Build Coastguard Worker 	if ((uintptr_t)src & 15) {
207*d83cc019SAndroid Build Coastguard Worker 		__m128i *S = (__m128i *)((uintptr_t)src & ~15);
208*d83cc019SAndroid Build Coastguard Worker 		unsigned long misalign = (uintptr_t)src & 15;
209*d83cc019SAndroid Build Coastguard Worker 		unsigned long copy = min(len, 16 - misalign);
210*d83cc019SAndroid Build Coastguard Worker 
211*d83cc019SAndroid Build Coastguard Worker 		_mm_storeu_si128((__m128i *)buf,
212*d83cc019SAndroid Build Coastguard Worker 				 _mm_stream_load_si128(S));
213*d83cc019SAndroid Build Coastguard Worker 
214*d83cc019SAndroid Build Coastguard Worker 		memcpy(dst, buf + misalign, copy);
215*d83cc019SAndroid Build Coastguard Worker 
216*d83cc019SAndroid Build Coastguard Worker 		dst += copy;
217*d83cc019SAndroid Build Coastguard Worker 		src += copy;
218*d83cc019SAndroid Build Coastguard Worker 		len -= copy;
219*d83cc019SAndroid Build Coastguard Worker 	}
220*d83cc019SAndroid Build Coastguard Worker 
221*d83cc019SAndroid Build Coastguard Worker 	/* We assume we are doing bulk transfers, so prefer aligned moves */
222*d83cc019SAndroid Build Coastguard Worker 	if (((uintptr_t)dst & 15) == 0) {
223*d83cc019SAndroid Build Coastguard Worker 		while (len >= 64) {
224*d83cc019SAndroid Build Coastguard Worker 			__m128i *S = (__m128i *)src;
225*d83cc019SAndroid Build Coastguard Worker 			__m128i *D = (__m128i *)dst;
226*d83cc019SAndroid Build Coastguard Worker 			__m128i tmp[4];
227*d83cc019SAndroid Build Coastguard Worker 
228*d83cc019SAndroid Build Coastguard Worker 			tmp[0] = _mm_stream_load_si128(S + 0);
229*d83cc019SAndroid Build Coastguard Worker 			tmp[1] = _mm_stream_load_si128(S + 1);
230*d83cc019SAndroid Build Coastguard Worker 			tmp[2] = _mm_stream_load_si128(S + 2);
231*d83cc019SAndroid Build Coastguard Worker 			tmp[3] = _mm_stream_load_si128(S + 3);
232*d83cc019SAndroid Build Coastguard Worker 
233*d83cc019SAndroid Build Coastguard Worker 			_mm_store_si128(D + 0, tmp[0]);
234*d83cc019SAndroid Build Coastguard Worker 			_mm_store_si128(D + 1, tmp[1]);
235*d83cc019SAndroid Build Coastguard Worker 			_mm_store_si128(D + 2, tmp[2]);
236*d83cc019SAndroid Build Coastguard Worker 			_mm_store_si128(D + 3, tmp[3]);
237*d83cc019SAndroid Build Coastguard Worker 
238*d83cc019SAndroid Build Coastguard Worker 			src += 64;
239*d83cc019SAndroid Build Coastguard Worker 			dst += 64;
240*d83cc019SAndroid Build Coastguard Worker 			len -= 64;
241*d83cc019SAndroid Build Coastguard Worker 		}
242*d83cc019SAndroid Build Coastguard Worker 	} else {
243*d83cc019SAndroid Build Coastguard Worker 		while (len >= 64) {
244*d83cc019SAndroid Build Coastguard Worker 			__m128i *S = (__m128i *)src;
245*d83cc019SAndroid Build Coastguard Worker 			__m128i *D = (__m128i *)dst;
246*d83cc019SAndroid Build Coastguard Worker 			__m128i tmp[4];
247*d83cc019SAndroid Build Coastguard Worker 
248*d83cc019SAndroid Build Coastguard Worker 			tmp[0] = _mm_stream_load_si128(S + 0);
249*d83cc019SAndroid Build Coastguard Worker 			tmp[1] = _mm_stream_load_si128(S + 1);
250*d83cc019SAndroid Build Coastguard Worker 			tmp[2] = _mm_stream_load_si128(S + 2);
251*d83cc019SAndroid Build Coastguard Worker 			tmp[3] = _mm_stream_load_si128(S + 3);
252*d83cc019SAndroid Build Coastguard Worker 
253*d83cc019SAndroid Build Coastguard Worker 			_mm_storeu_si128(D + 0, tmp[0]);
254*d83cc019SAndroid Build Coastguard Worker 			_mm_storeu_si128(D + 1, tmp[1]);
255*d83cc019SAndroid Build Coastguard Worker 			_mm_storeu_si128(D + 2, tmp[2]);
256*d83cc019SAndroid Build Coastguard Worker 			_mm_storeu_si128(D + 3, tmp[3]);
257*d83cc019SAndroid Build Coastguard Worker 
258*d83cc019SAndroid Build Coastguard Worker 			src += 64;
259*d83cc019SAndroid Build Coastguard Worker 			dst += 64;
260*d83cc019SAndroid Build Coastguard Worker 			len -= 64;
261*d83cc019SAndroid Build Coastguard Worker 		}
262*d83cc019SAndroid Build Coastguard Worker 	}
263*d83cc019SAndroid Build Coastguard Worker 
264*d83cc019SAndroid Build Coastguard Worker 	while (len >= 16) {
265*d83cc019SAndroid Build Coastguard Worker 		_mm_storeu_si128((__m128i *)dst,
266*d83cc019SAndroid Build Coastguard Worker 				 _mm_stream_load_si128((__m128i *)src));
267*d83cc019SAndroid Build Coastguard Worker 
268*d83cc019SAndroid Build Coastguard Worker 		src += 16;
269*d83cc019SAndroid Build Coastguard Worker 		dst += 16;
270*d83cc019SAndroid Build Coastguard Worker 		len -= 16;
271*d83cc019SAndroid Build Coastguard Worker 	}
272*d83cc019SAndroid Build Coastguard Worker 
273*d83cc019SAndroid Build Coastguard Worker 	if (len) {
274*d83cc019SAndroid Build Coastguard Worker 		_mm_storeu_si128((__m128i *)buf,
275*d83cc019SAndroid Build Coastguard Worker 				 _mm_stream_load_si128((__m128i *)src));
276*d83cc019SAndroid Build Coastguard Worker 		memcpy(dst, buf, len);
277*d83cc019SAndroid Build Coastguard Worker 	}
278*d83cc019SAndroid Build Coastguard Worker }
279*d83cc019SAndroid Build Coastguard Worker 
280*d83cc019SAndroid Build Coastguard Worker #pragma GCC pop_options
281*d83cc019SAndroid Build Coastguard Worker 
memcpy_from_wc(void * dst,const void * src,unsigned long len)282*d83cc019SAndroid Build Coastguard Worker static void memcpy_from_wc(void *dst, const void *src, unsigned long len)
283*d83cc019SAndroid Build Coastguard Worker {
284*d83cc019SAndroid Build Coastguard Worker 	memcpy(dst, src, len);
285*d83cc019SAndroid Build Coastguard Worker }
286*d83cc019SAndroid Build Coastguard Worker 
resolve_memcpy_from_wc(void)287*d83cc019SAndroid Build Coastguard Worker static void (*resolve_memcpy_from_wc(void))(void *, const void *, unsigned long)
288*d83cc019SAndroid Build Coastguard Worker {
289*d83cc019SAndroid Build Coastguard Worker 	if (igt_x86_features() & SSE4_1)
290*d83cc019SAndroid Build Coastguard Worker 		return memcpy_from_wc_sse41;
291*d83cc019SAndroid Build Coastguard Worker 
292*d83cc019SAndroid Build Coastguard Worker 	return memcpy_from_wc;
293*d83cc019SAndroid Build Coastguard Worker }
294*d83cc019SAndroid Build Coastguard Worker 
295*d83cc019SAndroid Build Coastguard Worker void igt_memcpy_from_wc(void *dst, const void *src, unsigned long len)
296*d83cc019SAndroid Build Coastguard Worker 	__attribute__((ifunc("resolve_memcpy_from_wc")));
297*d83cc019SAndroid Build Coastguard Worker 
298*d83cc019SAndroid Build Coastguard Worker #else
igt_memcpy_from_wc(void * dst,const void * src,unsigned long len)299*d83cc019SAndroid Build Coastguard Worker void igt_memcpy_from_wc(void *dst, const void *src, unsigned long len)
300*d83cc019SAndroid Build Coastguard Worker {
301*d83cc019SAndroid Build Coastguard Worker 	memcpy(dst, src, len);
302*d83cc019SAndroid Build Coastguard Worker }
303*d83cc019SAndroid Build Coastguard Worker #endif
304