pixman-arm.c revision 1176bdada62cabc6ec4b0308a930e83b679d5d36
1e3365aa452673f7ea3244bb6638551f13ab7570dNick Lewycky/*
23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * Copyright © 2000 SuSE, Inc.
33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * Copyright © 2007 Red Hat, Inc.
43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar *
53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * Permission to use, copy, modify, distribute, and sell this software and its
63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * documentation for any purpose is hereby granted without fee, provided that
73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * the above copyright notice appear in all copies and that both that
83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * copyright notice and this permission notice appear in supporting
93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * documentation, and that the name of SuSE not be used in advertising or
102100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes * publicity pertaining to distribution of the software without specific,
112100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes * written prior permission.  SuSE makes no representations about the
122100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes * suitability of this software for any purpose.  It is provided "as is"
132100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes * without express or implied warranty.
143ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar *
153ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
1653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
171b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
181b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
191b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
204ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar */
22f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#ifdef HAVE_CONFIG_H
2327e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar#include <config.h>
240648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#endif
251b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar
26f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "pixman-private.h"
27f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
280648262df75d97b464c2be0ed867da3615659785Daniel Dunbartypedef enum
29ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor{
30ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor    ARM_V7		= (1 << 0),
31a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar    ARM_V6		= (1 << 1),
327f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner    ARM_VFP		= (1 << 2),
331368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar    ARM_NEON		= (1 << 3),
344d7b14734f2285695dcec347f8718b512093390aTed Kremenek    ARM_IWMMXT		= (1 << 4)
35548f6c8e8010b181cb151df92f0a989363cb993eDavid Blaikie} arm_cpu_features_t;
368f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar
370648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#if defined(USE_ARM_SIMD) || defined(USE_ARM_NEON) || defined(USE_ARM_IWMMXT)
38256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer
3903013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#if defined(_MSC_VER)
4003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer
41ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar/* Needed for EXCEPTION_ILLEGAL_INSTRUCTION */
42f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include <windows.h>
43f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
44ba1021388e6839b76c8968b931189361c7286674Daniel Dunbarextern int pixman_msvc_try_arm_neon_op ();
45ba1021388e6839b76c8968b931189361c7286674Daniel Dunbarextern int pixman_msvc_try_arm_simd_op ();
461b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar
4792b369928b8e9ad156fb6eec2bf9f21d657bd69bChris Lattnerstatic arm_cpu_features_t
481b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbardetect_cpu_features (void)
495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner{
509606a57b6f2c43bf438a958fdffea1de60f6b2b7Sebastian Pop    arm_cpu_features_t features = 0;
515f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
5210a82cde7c317c5dd41dc3faf17f503c52ce2a3dBob Wilson    __try
53d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie    {
547e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky	pixman_msvc_try_arm_simd_op ();
557e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky	features |= ARM_V6;
56abac441b7d114d5980864093ee0643bf68f1a8f2Chad Rosier    }
57abac441b7d114d5980864093ee0643bf68f1a8f2Chad Rosier    __except (GetExceptionCode () == EXCEPTION_ILLEGAL_INSTRUCTION)
5843302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar    {
59dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar    }
6091e6076b9bf5e09dc6b202d17a5647b724e6f6e6Chandler Carruth
61c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    __try
62c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    {
63951c5705771a57eca0bca07aae5d4738619dd6c6Joerg Sonnenberger	pixman_msvc_try_arm_neon_op ();
64c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar	features |= ARM_NEON;
652b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    }
662b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    __except (GetExceptionCode () == EXCEPTION_ILLEGAL_INSTRUCTION)
672b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    {
68f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    }
69f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar
70f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    return features;
71f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar}
72f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar
73f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar#elif defined(__APPLE__) && defined(TARGET_OS_IPHONE) /* iOS */
74f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar
75f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar#include "TargetConditionals.h"
76f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar
77f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbarstatic arm_cpu_features_t
78f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbardetect_cpu_features (void)
79225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar{
80d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer    arm_cpu_features_t features = 0;
81d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer
820bbad519aa068206f1e158d5073f72a39fbe83c5Daniel Dunbar    features |= ARM_V6;
83225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar
845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    /* Detection of ARM NEON on iOS is fairly simple because iOS binaries
85d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer     * contain separate executable images for each processor architecture.
86d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer     * So all we have to do is detect the armv7 architecture build. The
87d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer     * operating system automatically runs the armv7 binary for armv7 devices
88d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer     * and the armv6 binary for armv6 devices.
89d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer     */
90225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar#if defined(__ARM_NEON__)
913ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar    features |= ARM_NEON;
923ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#endif
933ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
941b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar    return features;
957e4534d9c14febcdea30c057bb2a36e245776865Daniel Dunbar}
963ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
973ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#elif defined(__ANDROID__) || defined(ANDROID) /* Android */
982d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris Lattner
998f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar#include <cpu-features.h>
100847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
1017f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattnerstatic arm_cpu_features_t
102847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbardetect_cpu_features (void)
103847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar{
104847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    arm_cpu_features_t features = 0;
105847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    AndroidCpuFamily cpu_family;
106847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    uint64_t cpu_features;
107847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
108847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    cpu_family = android_getCpuFamily();
109847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    cpu_features = android_getCpuFeatures();
110847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
111847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    if (cpu_family == ANDROID_CPU_FAMILY_ARM)
112847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    {
113b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar	if (cpu_features & ANDROID_CPU_ARM_FEATURE_ARMv7)
114b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar	    features |= ARM_V7;
115b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar
116b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar	if (cpu_features & ANDROID_CPU_ARM_FEATURE_VFPv3)
1170648262df75d97b464c2be0ed867da3615659785Daniel Dunbar	    features |= ARM_VFP;
1180648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
1190648262df75d97b464c2be0ed867da3615659785Daniel Dunbar	if (cpu_features & ANDROID_CPU_ARM_FEATURE_NEON)
1200648262df75d97b464c2be0ed867da3615659785Daniel Dunbar	    features |= ARM_NEON;
1210648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    }
1221fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1231fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    return features;
1241fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier}
1251fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1261fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#elif defined (__linux__) /* linux ELF */
1271fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1281fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#include <unistd.h>
12959f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher#include <sys/types.h>
1301fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#include <sys/stat.h>
1311fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#include <sys/mman.h>
1321fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#include <fcntl.h>
1331fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#include <string.h>
1341fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#include <elf.h>
13559f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher
1361fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic arm_cpu_features_t
1371fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierdetect_cpu_features (void)
1381fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier{
1391fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    arm_cpu_features_t features = 0;
1401fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    Elf32_auxv_t aux;
1411fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    int fd;
1421fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1431fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    fd = open ("/proc/self/auxv", O_RDONLY);
1441fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    if (fd >= 0)
1451fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    {
1461fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier	while (read (fd, &aux, sizeof(Elf32_auxv_t)) == sizeof(Elf32_auxv_t))
1471fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier	{
1481fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier	    if (aux.a_type == AT_HWCAP)
1491fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier	    {
1501fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier		uint32_t hwcap = aux.a_un.a_val;
1511fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1521fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier		/* hardcode these values to avoid depending on specific
1531fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier		 * versions of the hwcap header, e.g. HWCAP_NEON
1541fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier		 */
1551fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier		if ((hwcap & 64) != 0)
1561fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier		    features |= ARM_VFP;
1571fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier		if ((hwcap & 512) != 0)
1581fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier		    features |= ARM_IWMMXT;
159279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar		/* this flag is only present on kernel 2.6.29 */
160279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar		if ((hwcap & 4096) != 0)
161279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar		    features |= ARM_NEON;
162e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar	    }
163279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar	    else if (aux.a_type == AT_PLATFORM)
164f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar	    {
165f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar		const char *plat = (const char*) aux.a_un.a_val;
166f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
167f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar		if (strncmp (plat, "v7l", 3) == 0)
168f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar		    features |= (ARM_V7 | ARM_V6);
169f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar		else if (strncmp (plat, "v6l", 3) == 0)
170eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar		    features |= ARM_V6;
171eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar	    }
172eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar	}
173eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar	close (fd);
174eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    }
175eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar
176f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    return features;
177f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar}
178f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
179f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar#else /* Unknown */
180f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
1815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic arm_cpu_features_t
182f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbardetect_cpu_features (void)
183f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar{
184f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    return 0;
185f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar}
186f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
187f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar#endif /* Linux elf */
188eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar
189eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbarstatic pixman_bool_t
190eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbarhave_feature (arm_cpu_features_t feature)
191eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar{
192eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    static pixman_bool_t initialized;
1935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    static arm_cpu_features_t features;
1945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
195212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar    if (!initialized)
1965f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    {
197212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar	features = detect_cpu_features();
198212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar	initialized = TRUE;
199212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar    }
200eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar
201eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    return (features & feature) == feature;
202eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar}
203eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar
204eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar#endif /* USE_ARM_SIMD || USE_ARM_NEON || USE_ARM_IWMMXT */
2057433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
2067433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senpixman_implementation_t *
2075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner_pixman_arm_get_implementations (pixman_implementation_t *imp)
208e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar{
2097433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen#ifdef USE_ARM_SIMD
2107433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    if (!_pixman_disabled ("arm-simd") && have_feature (ARM_V6))
211e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar	imp = _pixman_implementation_create_arm_simd (imp);
212e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar#endif
213e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
214e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar#ifdef USE_ARM_IWMMXT
2157433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    if (!_pixman_disabled ("arm-iwmmxt") && have_feature (ARM_IWMMXT))
2167433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen	imp = _pixman_implementation_create_mmx (imp);
2177433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen#endif
2187433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
2197433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen#ifdef USE_ARM_NEON
2207433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    if (!_pixman_disabled ("arm-neon") && have_feature (ARM_NEON))
2217433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen	imp = _pixman_implementation_create_arm_neon (imp);
222e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar#endif
223e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
224279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar    return imp;
225f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar}
226279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar