1 /* SPDX-License-Identifier: MIT
2 *
3 * Permission is hereby granted, free of charge, to any person
4 * obtaining a copy of this software and associated documentation
5 * files (the "Software"), to deal in the Software without
6 * restriction, including without limitation the rights to use, copy,
7 * modify, merge, publish, distribute, sublicense, and/or sell copies
8 * of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be
12 * included in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
18 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 *
23 * Copyright:
24 * 2020 Evan Nemerson <evan@nemerson.com>
25 * 2020 Christopher Moore <moore@free.fr>
26 */
27
28 #if !defined(SIMDE_X86_AVX512_EXTRACT_H)
29 #define SIMDE_X86_AVX512_EXTRACT_H
30
31 #include "types.h"
32 #include "mov.h"
33
34 HEDLEY_DIAGNOSTIC_PUSH
35 SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
36 SIMDE_BEGIN_DECLS_
37
38 SIMDE_FUNCTION_ATTRIBUTES
39 simde__m128
simde_mm512_extractf32x4_ps(simde__m512 a,int imm8)40 simde_mm512_extractf32x4_ps (simde__m512 a, int imm8)
41 SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
42 simde__m512_private a_ = simde__m512_to_private(a);
43
44 /* GCC 6 generates an ICE */
45 #if defined(HEDLEY_GCC_VERSION) && !HEDLEY_GCC_VERSION_CHECK(7,0,0)
46 return a_.m128[imm8 & 3];
47 #else
48 simde__m128_private r_;
49 const size_t offset = HEDLEY_STATIC_CAST(size_t, imm8 & 3) * (sizeof(r_.f32) / sizeof(r_.f32[0]));
50
51 SIMDE_VECTORIZE
52 for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
53 r_.f32[i] = a_.f32[i + offset];
54 }
55
56 return simde__m128_from_private(r_);
57 #endif
58 }
59 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
60 #define simde_mm512_extractf32x4_ps(a, imm8) _mm512_extractf32x4_ps(a, imm8)
61 #endif
62 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
63 #undef _mm512_extractf32x4_ps
64 #define _mm512_extractf32x4_ps(a, imm8) simde_mm512_extractf32x4_ps(a, imm8)
65 #endif
66
67 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
68 #define simde_mm512_mask_extractf32x4_ps(src, k, a, imm8) _mm512_mask_extractf32x4_ps(src, k, a, imm8)
69 #else
70 #define simde_mm512_mask_extractf32x4_ps(src, k, a, imm8) simde_mm_mask_mov_ps(src, k, simde_mm512_extractf32x4_ps(a, imm8))
71 #endif
72 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
73 #undef _mm512_mask_extractf32x4_ps
74 #define _mm512_mask_extractf32x4_ps(src, k, a, imm8) simde_mm512_mask_extractf32x4_ps(src, k, a, imm8)
75 #endif
76
77 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
78 #define simde_mm512_maskz_extractf32x4_ps(k, a, imm8) _mm512_maskz_extractf32x4_ps(k, a, imm8)
79 #else
80 #define simde_mm512_maskz_extractf32x4_ps(k, a, imm8) simde_mm_maskz_mov_ps(k, simde_mm512_extractf32x4_ps(a, imm8))
81 #endif
82 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
83 #undef _mm512_maskz_extractf32x4_ps
84 #define _mm512_maskz_extractf32x4_ps(k, a, imm8) simde_mm512_maskz_extractf32x4_ps(k, a, imm8)
85 #endif
86
87 SIMDE_FUNCTION_ATTRIBUTES
88 simde__m256d
simde_mm512_extractf64x4_pd(simde__m512d a,int imm8)89 simde_mm512_extractf64x4_pd (simde__m512d a, int imm8)
90 SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
91 simde__m512d_private a_ = simde__m512d_to_private(a);
92
93 return a_.m256d[imm8 & 1];
94 }
95 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
96 #define simde_mm512_extractf64x4_pd(a, imm8) _mm512_extractf64x4_pd(a, imm8)
97 #endif
98 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
99 #undef _mm512_extractf64x4_pd
100 #define _mm512_extractf64x4_pd(a, imm8) simde_mm512_extractf64x4_pd(a, imm8)
101 #endif
102
103 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
104 #define simde_mm512_mask_extractf64x4_pd(src, k, a, imm8) _mm512_mask_extractf64x4_pd(src, k, a, imm8)
105 #else
106 #define simde_mm512_mask_extractf64x4_pd(src, k, a, imm8) simde_mm256_mask_mov_pd(src, k, simde_mm512_extractf64x4_pd(a, imm8))
107 #endif
108 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
109 #undef _mm512_mask_extractf64x4_pd
110 #define _mm512_mask_extractf64x4_pd(src, k, a, imm8) simde_mm512_mask_extractf64x4_pd(src, k, a, imm8)
111 #endif
112
113 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
114 #define simde_mm512_maskz_extractf64x4_pd(k, a, imm8) _mm512_maskz_extractf64x4_pd(k, a, imm8)
115 #else
116 #define simde_mm512_maskz_extractf64x4_pd(k, a, imm8) simde_mm256_maskz_mov_pd(k, simde_mm512_extractf64x4_pd(a, imm8))
117 #endif
118 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
119 #undef _mm512_maskz_extractf64x4_pd
120 #define _mm512_maskz_extractf64x4_pd(k, a, imm8) simde_mm512_maskz_extractf64x4_pd(k, a, imm8)
121 #endif
122
123 SIMDE_FUNCTION_ATTRIBUTES
124 simde__m128i
simde_mm512_extracti32x4_epi32(simde__m512i a,int imm8)125 simde_mm512_extracti32x4_epi32 (simde__m512i a, int imm8)
126 SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
127 simde__m512i_private a_ = simde__m512i_to_private(a);
128
129 return a_.m128i[imm8 & 3];
130 }
131 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
132 #define simde_mm512_extracti32x4_epi32(a, imm8) _mm512_extracti32x4_epi32(a, imm8)
133 #endif
134 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
135 #undef _mm512_extracti32x4_epi32
136 #define _mm512_extracti32x4_epi32(a, imm8) simde_mm512_extracti32x4_epi32(a, imm8)
137 #endif
138
139 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
140 #define simde_mm512_mask_extracti32x4_epi32(src, k, a, imm8) _mm512_mask_extracti32x4_epi32(src, k, a, imm8)
141 #else
142 #define simde_mm512_mask_extracti32x4_epi32(src, k, a, imm8) simde_mm_mask_mov_epi32(src, k, simde_mm512_extracti32x4_epi32(a, imm8))
143 #endif
144 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
145 #undef _mm512_mask_extracti32x4_epi32
146 #define _mm512_mask_extracti32x4_epi32(src, k, a, imm8) simde_mm512_mask_extracti32x4_epi32(src, k, a, imm8)
147 #endif
148
149 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
150 #define simde_mm512_maskz_extracti32x4_epi32(k, a, imm8) _mm512_maskz_extracti32x4_epi32(k, a, imm8)
151 #else
152 #define simde_mm512_maskz_extracti32x4_epi32(k, a, imm8) simde_mm_maskz_mov_epi32(k, simde_mm512_extracti32x4_epi32(a, imm8))
153 #endif
154 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
155 #undef _mm512_maskz_extracti32x4_epi32
156 #define _mm512_maskz_extracti32x4_epi32(k, a, imm8) simde_mm512_maskz_extracti32x4_epi32(k, a, imm8)
157 #endif
158
159 SIMDE_FUNCTION_ATTRIBUTES
160 simde__m256i
simde_mm512_extracti64x4_epi64(simde__m512i a,int imm8)161 simde_mm512_extracti64x4_epi64 (simde__m512i a, int imm8)
162 SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
163 simde__m512i_private a_ = simde__m512i_to_private(a);
164
165 return a_.m256i[imm8 & 1];
166 }
167 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
168 #define simde_mm512_extracti64x4_epi64(a, imm8) _mm512_extracti64x4_epi64(a, imm8)
169 #endif
170 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
171 #undef _mm512_extracti64x4_epi64
172 #define _mm512_extracti64x4_epi64(a, imm8) simde_mm512_extracti64x4_epi64(a, imm8)
173 #endif
174
175 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
176 #define simde_mm512_mask_extracti64x4_epi64(src, k, a, imm8) _mm512_mask_extracti64x4_epi64(src, k, a, imm8)
177 #else
178 #define simde_mm512_mask_extracti64x4_epi64(src, k, a, imm8) simde_mm256_mask_mov_epi64(src, k, simde_mm512_extracti64x4_epi64(a, imm8))
179 #endif
180 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
181 #undef _mm512_mask_extracti64x4_epi64
182 #define _mm512_mask_extracti64x4_epi64(src, k, a, imm8) simde_mm512_mask_extracti64x4_epi64(src, k, a, imm8)
183 #endif
184
185 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
186 #define simde_mm512_maskz_extracti64x4_epi64(k, a, imm8) _mm512_maskz_extracti64x4_epi64(k, a, imm8)
187 #else
188 #define simde_mm512_maskz_extracti64x4_epi64(k, a, imm8) simde_mm256_maskz_mov_epi64(k, simde_mm512_extracti64x4_epi64(a, imm8))
189 #endif
190 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
191 #undef _mm512_maskz_extracti64x4_epi64
192 #define _mm512_maskz_extracti64x4_epi64(k, a, imm8) simde_mm512_maskz_extracti64x4_epi64(k, a, imm8)
193 #endif
194
195 SIMDE_END_DECLS_
196 HEDLEY_DIAGNOSTIC_POP
197
198 #endif /* !defined(SIMDE_X86_AVX512_EXTRACT_H) */
199