xref: /aosp_15_r20/external/executorch/kernels/optimized/vec/intrinsics.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker  * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker  *
5*523fa7a6SAndroid Build Coastguard Worker  * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker  * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker  */
8*523fa7a6SAndroid Build Coastguard Worker 
9*523fa7a6SAndroid Build Coastguard Worker #pragma once
10*523fa7a6SAndroid Build Coastguard Worker #if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
11*523fa7a6SAndroid Build Coastguard Worker /* GCC or clang-compatible compiler, targeting x86/x86-64 */
12*523fa7a6SAndroid Build Coastguard Worker #include <x86intrin.h>
13*523fa7a6SAndroid Build Coastguard Worker #elif defined(__clang__) && (defined(__ARM_NEON__) || defined(__aarch64__))
14*523fa7a6SAndroid Build Coastguard Worker /* Clang-compatible compiler, targeting arm neon */
15*523fa7a6SAndroid Build Coastguard Worker #include <arm_neon.h>
16*523fa7a6SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
17*523fa7a6SAndroid Build Coastguard Worker /* Microsoft C/C++-compatible compiler */
18*523fa7a6SAndroid Build Coastguard Worker #include <intrin.h>
19*523fa7a6SAndroid Build Coastguard Worker #if _MSC_VER <= 1900
20*523fa7a6SAndroid Build Coastguard Worker #define _mm256_extract_epi64(X, Y) (_mm_extract_epi64(_mm256_extractf128_si256(X, Y >> 1), Y % 2))
21*523fa7a6SAndroid Build Coastguard Worker #define _mm256_extract_epi32(X, Y) (_mm_extract_epi32(_mm256_extractf128_si256(X, Y >> 2), Y % 4))
22*523fa7a6SAndroid Build Coastguard Worker #define _mm256_extract_epi16(X, Y) (_mm_extract_epi16(_mm256_extractf128_si256(X, Y >> 3), Y % 8))
23*523fa7a6SAndroid Build Coastguard Worker #define _mm256_extract_epi8(X, Y) (_mm_extract_epi8(_mm256_extractf128_si256(X, Y >> 4), Y % 16))
24*523fa7a6SAndroid Build Coastguard Worker #endif
25*523fa7a6SAndroid Build Coastguard Worker #elif defined(__GNUC__) && (defined(__ARM_NEON__) || defined(__aarch64__))
26*523fa7a6SAndroid Build Coastguard Worker /* GCC-compatible compiler, targeting ARM with NEON */
27*523fa7a6SAndroid Build Coastguard Worker #include <arm_neon.h>
28*523fa7a6SAndroid Build Coastguard Worker #if defined (MISSING_ARM_VLD1)
29*523fa7a6SAndroid Build Coastguard Worker #include <executorch/kernels/optimized/vec/vec256/missing_vld1_neon.h>
30*523fa7a6SAndroid Build Coastguard Worker #elif defined (MISSING_ARM_VST1)
31*523fa7a6SAndroid Build Coastguard Worker #include <executorch/kernels/optimized/vec/vec256/missing_vst1_neon.h>
32*523fa7a6SAndroid Build Coastguard Worker #endif
33*523fa7a6SAndroid Build Coastguard Worker #elif defined(__GNUC__) && defined(__IWMMXT__)
34*523fa7a6SAndroid Build Coastguard Worker /* GCC-compatible compiler, targeting ARM with WMMX */
35*523fa7a6SAndroid Build Coastguard Worker #include <mmintrin.h>
36*523fa7a6SAndroid Build Coastguard Worker #elif defined(__s390x__)
37*523fa7a6SAndroid Build Coastguard Worker // targets Z/architecture
38*523fa7a6SAndroid Build Coastguard Worker // we will include vecintrin later
39*523fa7a6SAndroid Build Coastguard Worker #elif (defined(__GNUC__) || defined(__xlC__)) &&                               \
40*523fa7a6SAndroid Build Coastguard Worker         (defined(__VEC__) || defined(__ALTIVEC__))
41*523fa7a6SAndroid Build Coastguard Worker /* XLC or GCC-compatible compiler, targeting PowerPC with VMX/VSX */
42*523fa7a6SAndroid Build Coastguard Worker #include <altivec.h>
43*523fa7a6SAndroid Build Coastguard Worker /* We need to undef those tokens defined by <altivec.h> to avoid conflicts
44*523fa7a6SAndroid Build Coastguard Worker    with the C++ types. => Can still use __bool/__vector */
45*523fa7a6SAndroid Build Coastguard Worker #undef bool
46*523fa7a6SAndroid Build Coastguard Worker #undef vector
47*523fa7a6SAndroid Build Coastguard Worker #undef pixel
48*523fa7a6SAndroid Build Coastguard Worker #elif defined(__GNUC__) && defined(__SPE__)
49*523fa7a6SAndroid Build Coastguard Worker /* GCC-compatible compiler, targeting PowerPC with SPE */
50*523fa7a6SAndroid Build Coastguard Worker #include <spe.h>
51*523fa7a6SAndroid Build Coastguard Worker #endif
52