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